Saltar al contenido principal
Firma ofrece funciones completas de marca blanca que te permiten crear una experiencia de firma electrónica totalmente personalizada. Desde logotipos y temas de color personalizados hasta interfaces incrustadas, puedes asegurarte de que tus clientes interactúen con tu marca durante todo el proceso de firma.

Descripción general

La marca blanca en Firma involucra varios componentes:
  1. Marca personalizada - Sube logotipos, define temas de color y oculta la marca de Firma por completo
  2. Términos personalizados para firmantes - Exige a los firmantes que acepten tus propios términos de servicio
  3. Etiquetas de los botones de firma - Personaliza el texto de los botones de firma por idioma
  4. Dominios de correo personalizados - Envía correos de solicitudes de firma desde tu propio dominio
  5. Dirección de remitente de correo personalizada - Controla la dirección “de” en todos los correos salientes
  6. Plantillas de correo personalizadas - Personaliza el contenido y la marca de los correos de notificación de firma
  7. Desactivar los correos de Firma - Desactiva los correos automáticos por solicitud de firma y envía los tuyos propios
  8. Experiencias incrustadas - Incrusta los editores de firma y de plantillas directamente en tu aplicación
Todos los ejemplos de la API usan tu clave API directamente en el encabezado Authorization. No uses el prefijo Bearer.

Marca personalizada

Personaliza logotipos, colores y la visibilidad de la marca tanto a nivel de empresa como de espacio de trabajo. La configuración del espacio de trabajo tiene prioridad sobre la de la empresa, lo que te permite crear experiencias de marca distintas para cada uno de tus clientes.

Logotipo de la empresa

Sube un logotipo para toda tu cuenta de Firma. Este logotipo aparece en los correos de firma y en la experiencia de firma.
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/logo \
  -H "Authorization: YOUR_API_KEY" \
  -F "file=@/path/to/logo.png"
Requisitos:
  • Formato: solo PNG o JPEG
  • Tamaño máximo: 2 MB
Para eliminar el logotipo de la empresa:
curl -X DELETE https://api.firma.dev/functions/v1/signing-request-api/company/logo \
  -H "Authorization: YOUR_API_KEY"

Logotipo del espacio de trabajo

Sobrescribe el logotipo de la empresa para un espacio de trabajo específico:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/workspaces/{workspace_id}/logo \
  -H "Authorization: YOUR_API_KEY" \
  -F "file=@/path/to/workspace-logo.png"
Para eliminar el logotipo de un espacio de trabajo (recurre al logotipo de la empresa):
curl -X DELETE https://api.firma.dev/functions/v1/signing-request-api/workspaces/{workspace_id}/logo \
  -H "Authorization: YOUR_API_KEY"

Temas de color

Personaliza la paleta de colores de la experiencia de firma usando valores de color hexadecimales. Los colores se pueden definir tanto a nivel de empresa como de espacio de trabajo.
Configuración de colorDescripciónValor predeterminado de Firma
color_primaryColor de acento principal (botones, enlaces)#c285ff
color_primary_fgColor de texto en elementos primarios#ffffff
color_backgroundFondo de la página#1c1c21
color_foregroundColor de texto principal#ffffff
color_cardFondo de tarjeta/panel#22222a
color_borderColor de borde#3b3b3b
color_accentColor de acento secundario#c285ff
color_accent_fgColor de texto en elementos de acento#ffffff
color_canvasFondo del lienzo/visor de documentos#1c1c21
color_mutedÁreas de fondo atenuadas/sutiles#22222a
color_muted_fgColor de texto en áreas atenuadas#a1a1aa
Definir colores a nivel de empresa:
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "color_primary": "#0066cc",
    "color_primary_fg": "#ffffff",
    "color_background": "#f5f5f5",
    "color_foreground": "#1a1a1a",
    "color_card": "#ffffff",
    "color_border": "#e0e0e0"
  }'
Definir colores a nivel de espacio de trabajo (sobrescribe los colores de la empresa para este espacio de trabajo):
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "color_primary": "#ff6600",
    "color_primary_fg": "#ffffff"
  }'
Los colores deben ser valores hexadecimales de 6 dígitos (por ejemplo, #0066cc). Define un color como null para eliminarlo y recurrir al siguiente nivel de la jerarquía.

Ocultar la marca de Firma

Elimina toda la marca de Firma de la experiencia de firma habilitando show_custom_branding_only a nivel de empresa:
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "show_custom_branding_only": true
  }'

Configuraciones de visualización adicionales

Ajusta la experiencia de firma con estas configuraciones, disponibles tanto a nivel de empresa como de espacio de trabajo:
ConfiguraciónDescripciónValor predeterminado
show_signature_frameMuestra el marco/borde de dibujo de la firmatrue
show_partial_watermarkMuestra una marca de agua en documentos parcialmente firmadosfalse
show_qr_codeIncluye un código QR que enlaza a la página de firma en los correosfalse
require_otp_verificationExige verificación OTP por correo antes de firmarfalse
require_terms_acceptanceExige a los firmantes aceptar los términos antes de firmartrue
disable_guided_navigationDesactiva la navegación guiada paso a paso por los camposfalse
allow_presigning_downloadPermite a los firmantes descargar el documento antes de firmarfalse
A nivel de espacio de trabajo, define estos valores como null para heredar la configuración a nivel de empresa.

Jerarquía de configuración

La configuración de marca sigue una jerarquía en cascada:
  1. Configuración del espacio de trabajo (máxima prioridad)
  2. Configuración de la empresa
  3. Valor predeterminado de Firma (mínima prioridad)
Esto te permite definir valores predeterminados a nivel de toda la empresa y sobrescribirlos por espacio de trabajo. A nivel de espacio de trabajo, definir un valor como null significa “heredar de la empresa”. Consulta la Referencia de la API de configuración de espacio de trabajo para ver la lista completa de configuraciones disponibles.

Términos personalizados para firmantes

Exige a los firmantes que acepten tus propios términos de servicio o acuerdo legal antes de firmar. Los términos se configuran por idioma y siguen la misma cascada empresa/espacio de trabajo que otras configuraciones.

Cómo funciona

Cuando require_terms_acceptance está habilitado (el valor predeterminado), los firmantes ven una casilla de aceptación de términos antes de poder firmar. Puedes personalizar el texto de la declaración y, opcionalmente, enlazar a un documento de términos completo. Los términos se almacenan por idioma para que los firmantes vean los términos en el idioma de su espacio de trabajo, recurriendo a la siguiente cascada:
  1. Términos del espacio de trabajo para el idioma del firmante (máxima prioridad)
  2. Términos de la empresa para el idioma del firmante
  3. Términos predeterminados de Firma (mínima prioridad)

Definir términos a nivel de empresa

curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/signer-terms/en \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "statement_text": "I agree to the <a href=\"https://acme.com/terms\">Terms of Service</a> and acknowledge that my electronic signature is legally binding.",
    "terms_url": "https://acme.com/terms"
  }'

Definir términos a nivel de espacio de trabajo

curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/signer-terms/en \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "statement_text": "I agree to the <a href=\"https://acmecorp.com/signing-terms\">Signing Terms</a>.",
    "terms_url": "https://acmecorp.com/signing-terms"
  }'
Campos:
  • statement_text (obligatorio): texto HTML que se muestra junto a la casilla de aceptación. Se permiten etiquetas HTML básicas (<a>, <b>, <i>, <br>).
  • terms_url (opcional): URL al documento de términos completo.

Listar términos

Recupera todos los términos configurados para una empresa o espacio de trabajo:
# Términos de la empresa
curl https://api.firma.dev/functions/v1/signing-request-api/company/signer-terms \
  -H "Authorization: YOUR_API_KEY"

# Términos del espacio de trabajo
curl https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/signer-terms \
  -H "Authorization: YOUR_API_KEY"

Eliminar términos

Elimina los términos personalizados para un idioma específico para recurrir al siguiente nivel de la cascada:
# Eliminar términos de la empresa en inglés
curl -X DELETE https://api.firma.dev/functions/v1/signing-request-api/company/signer-terms/en \
  -H "Authorization: YOUR_API_KEY"

# Eliminar términos del espacio de trabajo en inglés
curl -X DELETE https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/signer-terms/en \
  -H "Authorization: YOUR_API_KEY"

Desactivar la aceptación de términos

Para desactivar por completo el requisito de aceptación de términos:
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "require_terms_acceptance": false
  }'
Idiomas admitidos: en, es, it, pt, fr, de, el, ru, pl. Consulta la Referencia de la API de términos para firmantes para la documentación completa de los endpoints.

Etiquetas personalizadas de los botones de firma

Personaliza el texto de los botones de firma por espacio de trabajo y por idioma. Esto te permite ajustar las etiquetas de los botones a la terminología o localización de tu producto.

Definir anulaciones de etiquetas de botones

Las etiquetas de los botones se definen como un objeto JSONB en la configuración del espacio de trabajo, organizado por idioma y luego por clave de botón:
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "signing_button_label_overrides": {
      "en": {
        "sign": "Approve and Sign",
        "next": "Continue",
        "finish": "Complete Signing"
      },
      "es": {
        "sign": "Aprobar y Firmar",
        "next": "Continuar",
        "finish": "Completar Firma"
      }
    }
  }'

Eliminar anulaciones de etiquetas de botones

Define el valor como null para volver a las etiquetas de botones predeterminadas de Firma:
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "signing_button_label_overrides": null
  }'
Validación:
  • Cada etiqueta debe ser una cadena de texto, máximo 500 caracteres
  • Las claves de idioma deben ser códigos de idioma válidos (máximo 10 caracteres)
  • Las etiquetas HTML y los caracteres de control se eliminan automáticamente
Las anulaciones de etiquetas de botones son una configuración solo a nivel de espacio de trabajo. No existe una anulación a nivel de empresa.

Dominios de correo personalizados

De forma predeterminada, los correos de solicitud de firma se envían desde el dominio de Firma. Con dominios de correo personalizados, los correos parecen provenir directamente de tu empresa o de las empresas de tus clientes.

Dominios de correo a nivel de cuenta (empresa)

Configura un dominio de correo personalizado para toda tu cuenta de Firma. Todos los espacios de trabajo usarán este dominio de forma predeterminada, a menos que se sobrescriba.

Paso 1: Agrega tu dominio

Usa la API para agregar un dominio de correo personalizado:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/domains \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "acme.com"
  }'
Respuesta (201 Created):
{
  "domain": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "domain": "acme.com",
    "verification_status": 0,
    "domain_status": 0,
    "is_primary": false,
    "verification_token": "firma-verify=abc123xyz",
    "date_created": "2024-01-15T10:30:00Z"
  },
  "verification_instructions": {
    "record_type": "TXT",
    "record_name": "_firma-verification.acme.com",
    "record_value": "firma-verify=abc123xyz",
    "next_step": "Add this TXT record to your DNS, then call POST /company/domains/{id}/verify-ownership"
  }
}

Paso 2: Agrega el registro TXT de verificación

Agrega el registro TXT de verificación a tu DNS:
TipoNombreValor
TXT_firma-verification.acme.comfirma-verify=abc123xyz
La propagación del DNS normalmente tarda unos minutos, pero puede tardar hasta 48 horas.

Paso 3: Verifica la propiedad del dominio

Una vez agregado el registro TXT, verifica la propiedad:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/domains/{domain_id}/verify-ownership \
  -H "Authorization: YOUR_API_KEY"
Respuesta:
{
  "message": "Domain ownership verified",
  "domain": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "domain": "acme.com",
    "verification_status": 1,
    "domain_status": 0
  },
  "next_step": "Call POST /company/domains/{id}/finalize to complete domain setup and receive DNS records for email sending"
}

Paso 4: Finaliza la configuración del dominio

Una vez verificada la propiedad, finaliza el dominio para recibir los registros DNS de envío de correo:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/domains/{domain_id}/finalize \
  -H "Authorization: YOUR_API_KEY"
Respuesta:
{
  "message": "Domain finalized. Add the following DNS records to enable email sending.",
  "domain": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "domain": "acme.com",
    "verification_status": 2,
    "domain_status": 0
  },
  "dns_records": [
    { "type": "TXT", "name": "@", "value": "v=spf1 include:amazonses.com ~all", "ttl": "Auto", "status": "pending" },
    { "type": "CNAME", "name": "resend._domainkey", "value": "resend._domainkey.amazonses.com", "ttl": "Auto", "status": "pending" },
    { "type": "TXT", "name": "_dmarc", "value": "v=DMARC1; p=none;", "ttl": "Auto", "status": "pending" }
  ],
  "next_step": "Add these DNS records, then call POST /company/domains/{id}/verify-dns to complete verification"
}

Paso 5: Agrega los registros DNS

Agrega los tres registros DNS a tu dominio:
TipoNombreValor
TXT@v=spf1 include:amazonses.com ~all
CNAMEresend._domainkeyresend._domainkey.amazonses.com
TXT_dmarcv=DMARC1; p=none;

Paso 6: Verifica los registros DNS

Una vez agregados los registros DNS, verifícalos:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/domains/{domain_id}/verify-dns \
  -H "Authorization: YOUR_API_KEY"
Respuesta (todo verificado):
{
  "verified": true,
  "message": "Domain is fully verified and ready to send emails",
  "domain": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "domain": "acme.com",
    "verification_status": 2,
    "domain_status": 1,
    "is_primary": true
  },
  "dns_records": [
    { "type": "TXT", "name": "@", "value": "v=spf1 include:amazonses.com ~all", "status": "verified" },
    { "type": "CNAME", "name": "resend._domainkey", "value": "resend._domainkey.amazonses.com", "status": "verified" },
    { "type": "TXT", "name": "_dmarc", "value": "v=DMARC1; p=none;", "status": "verified" }
  ]
}

Paso 7: Definir como dominio principal (opcional)

Si tienes varios dominios, define uno como predeterminado:
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/company/domains/{domain_id}/set-primary \
  -H "Authorization: YOUR_API_KEY"

Dominios de correo a nivel de espacio de trabajo

Para aplicaciones SaaS multiempresa, puedes configurar dominios de correo distintos por espacio de trabajo. Los dominios del espacio de trabajo sobrescriben el dominio a nivel de empresa. El flujo es idéntico al de los dominios de empresa, pero usa endpoints con alcance de espacio de trabajo:
AcciónEndpoint
Listar dominiosGET /workspace/{workspace_id}/domains
Agregar dominioPOST /workspace/{workspace_id}/domains
Obtener dominioGET /workspace/{workspace_id}/domains/{id}
Eliminar dominioDELETE /workspace/{workspace_id}/domains/{id}
Verificar propiedadPOST /workspace/{workspace_id}/domains/{id}/verify-ownership
Finalizar configuraciónPOST /workspace/{workspace_id}/domains/{id}/finalize
Verificar DNSPOST /workspace/{workspace_id}/domains/{id}/verify-dns
Definir como principalPOST /workspace/{workspace_id}/domains/{id}/set-primary
Ejemplo: agregar un dominio de espacio de trabajo
curl -X POST https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/domains \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "sign.acmecorp.com"
  }'
Consulta la Referencia de la API de dominios de correo para la documentación completa de los endpoints.

Dirección de remitente de correo personalizada

Controla la dirección “de” en todos los correos salientes combinando un dominio personalizado con una parte local personalizada.

Cómo se resuelven las direcciones de correo

Cuando Firma envía un correo, la dirección del remitente se construye a partir de tres componentes:
{sender_name} <{local_part}@{domain}>
Cada componente se resuelve mediante una cadena de respaldo: Resolución del dominio:
  1. Dominio verificado del espacio de trabajo (se prefiere el principal)
  2. Dominio verificado de la empresa
  3. updates.firma.dev (predeterminado)
Resolución de la parte local (solo aplica cuando se usa un dominio personalizado):
  1. Configuración email_local_part del espacio de trabajo
  2. Configuración email_local_part de la empresa
  3. support (predeterminado)
El nombre del remitente es el nombre del usuario que envió la solicitud de firma. Por ejemplo, si defines email_local_part como noreply y tu dominio verificado es sign.acmecorp.com, los correos se enviarán desde:
Jane Smith <noreply@sign.acmecorp.com>

Configurar la parte local del correo

Nivel de empresa (predeterminado para todos los espacios de trabajo):
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email_local_part": "noreply"
  }'
Nivel de espacio de trabajo (sobrescribe la configuración de la empresa):
curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/settings \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email_local_part": "signing"
  }'
Reglas de validación:
  • De 1 a 64 caracteres, letras minúsculas, números, puntos, guiones bajos y guiones
  • Debe comenzar y terminar con una letra o número
  • Sin puntos consecutivos
  • No se permiten valores reservados (postmaster, abuse, mailer-daemon)
Define el valor como null a nivel de espacio de trabajo para heredar de la configuración de la empresa.

Plantillas de correo personalizadas

Personaliza los correos de notificación que Firma envía en tu nombre para que coincidan con la voz y el estilo de tu marca. Puedes definir plantillas tanto a nivel de empresa como de espacio de trabajo, con las plantillas del espacio de trabajo sobrescribiendo las predeterminadas de la empresa.

Tipos de correo personalizables

Tipo de correoCuándo se envía
signing_inviteCuando se envía una solicitud de firma a un destinatario
next_signerCuando le toca el turno al siguiente firmante en un orden de firma
resend_notificationCuando el remitente reenvía manualmente una invitación de firma
reminder_defaultCuando se envía un recordatorio automático para una firma pendiente
signing_expiredCuando una solicitud de firma expira
signing_cancelledCuando se cancela una solicitud de firma
signing_declinedCuando un firmante rechaza (enviado a los demás firmantes)
signing_declined_adminCuando un firmante rechaza (enviado al remitente, incluye el motivo del rechazo)
signing_completedCuando todos los firmantes han completado la firma
signer_identity_changedCuando un firmante cambia su nombre durante la firma

Marcadores de posición disponibles

Las plantillas admiten cuerpos HTML con marcadores de posición dinámicos usando la sintaxis {{placeholder}}. Marcadores de posición del firmante:
Marcador de posiciónDescripción
{{signer_first_name}}Nombre del firmante
{{signer_last_name}}Apellido del firmante
{{signer_name}}Nombre completo del firmante
{{signer_email}}Dirección de correo del firmante
{{signer_title}}Cargo del firmante
{{signer_company}}Nombre de la empresa del firmante
Marcadores de posición del documento:
Marcador de posiciónDescripción
{{signing_request_name}}Nombre de la solicitud de firma
{{signing_link}}URL para que el firmante firme
{{expiration_date}}Cuándo expira la solicitud de firma
{{download_link}}Enlace para descargar el documento firmado
{{decliner_name}}Nombre del firmante que rechazó
{{decline_reason}}Motivo proporcionado al rechazar
{{signing_qr_code}}Imagen de código QR que enlaza a la página de firma
Marcadores de posición del equipo:
Marcador de posiciónDescripción
{{team_name}}Nombre del espacio de trabajo/equipo
{{team_email}}Correo de contacto del espacio de trabajo
{{company_name}}Nombre de la empresa
{{company_logo}}Imagen del logotipo de la empresa
También puedes recuperar esta lista mediante programación:
curl https://api.firma.dev/functions/v1/signing-request-api/email-templates/placeholders \
  -H "Authorization: YOUR_API_KEY"

Ver plantillas predeterminadas

Recupera las plantillas predeterminadas integradas de Firma para cualquier idioma admitido para usarlas como punto de partida:
curl https://api.firma.dev/functions/v1/signing-request-api/email-templates/defaults/en \
  -H "Authorization: YOUR_API_KEY"
Idiomas admitidos: en, es, it, pt, fr, de, el, ru, pl.

Definir una plantilla de correo a nivel de espacio de trabajo

curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/email-templates/signing_invite \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Action required: Please sign {{signing_request_name}}",
    "body": "<p>Hi {{signer_name}},</p><p>Please review and sign {{signing_request_name}}.</p><p><a href=\"{{signing_link}}\">Sign now</a></p><p>- The {{team_name}} Team</p>"
  }'
Validación:
  • subject: obligatorio, máximo 500 caracteres
  • body: obligatorio, máximo 50,000 caracteres

Definir una plantilla de correo a nivel de empresa

curl -X PUT https://api.firma.dev/functions/v1/signing-request-api/company/email-templates/signing_invite \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "{{company_name}}: Please sign {{signing_request_name}}",
    "body": "<p>Hi {{signer_name}},</p><p>You have a document to sign.</p><p><a href=\"{{signing_link}}\">Sign now</a></p>"
  }'

Eliminar una plantilla personalizada

Elimina una plantilla personalizada para volver al siguiente nivel de la jerarquía:
curl -X DELETE https://api.firma.dev/functions/v1/signing-request-api/workspace/{workspace_id}/email-templates/signing_invite \
  -H "Authorization: YOUR_API_KEY"

Jerarquía de plantillas

Las plantillas de correo siguen una jerarquía en cascada:
  1. Plantilla del espacio de trabajo (máxima prioridad)
  2. Plantilla de la empresa
  3. Predeterminada integrada para el idioma del espacio de trabajo (mínima prioridad)
Esto te permite definir una plantilla de marca a nivel de toda la empresa y sobrescribirla para espacios de trabajo específicos cuando sea necesario. Eliminar una plantilla en cualquier nivel hace que se recurra al siguiente nivel.
Se devuelve una advertencia si el cuerpo de una plantilla no contiene el marcador de posición {{signing_link}}, ya que los destinatarios necesitan un enlace para acceder al flujo de firma.
Consulta la Referencia de la API de plantillas de correo para la documentación completa de los endpoints.

Desactivar los correos de Firma

Para tener control total sobre las comunicaciones con los clientes, puedes desactivar los correos automáticos de Firma por solicitud de firma. Esto te permite:
  • Enviar enlaces de solicitudes de firma a través de tu propio sistema de correo
  • Integrarte con tus flujos de notificación existentes
  • Personalizar el momento de envío de los correos y las secuencias de seguimiento
  • Usar tu propia infraestructura de entrega de correo

Configuración de correo en las solicitudes de firma

Cada solicitud de firma tiene configuraciones que controlan qué correos se envían:
ConfiguraciónDescripciónValor predeterminado
send_signing_emailEnvía correos de notificación de solicitud de firma a los firmantestrue
send_finish_emailEnvía un correo de finalización cuando todos los firmantes terminantrue
send_expiration_emailEnvía una notificación de expiración cuando la solicitud expiratrue
send_cancellation_emailEnvía una notificación de cancelación cuando se cancela la solicitudtrue

Crear una solicitud de firma con los correos desactivados

curl -X POST https://api.firma.dev/functions/v1/signing-request-api/signing-requests \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "workspace_123",
    "template_id": "template_456",
    "settings": {
      "send_signing_email": false,
      "send_finish_email": false,
      "send_expiration_email": false,
      "send_cancellation_email": false
    },
    "recipients": [
      {
        "first_name": "Jane",
        "last_name": "Smith",
        "email": "jane@example.com",
        "designation": "Signer",
        "order": 1
      }
    ]
  }'

Obtener URLs de firma para distribución manual

Cuando los correos están desactivados, recupera las URLs de firma desde la API y envíalas a través de tus propios canales:
// Create signing request with emails disabled
const response = await fetch(
  'https://api.firma.dev/functions/v1/signing-request-api/signing-requests',
  {
    method: 'POST',
    headers: {
      'Authorization': API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      workspace_id: workspaceId,
      template_id: templateId,
      settings: {
        send_signing_email: false,
        send_finish_email: false
      },
      recipients: [
        { first_name: 'Jane', last_name: 'Smith', email: 'jane@example.com', designation: 'Signer', order: 1 }
      ]
    })
  }
)
const signingRequest = await response.json()

// Get signing URLs for each recipient
const usersResponse = await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/signing-requests/${signingRequest.id}/users`,
  {
    headers: { 'Authorization': API_KEY }
  }
)
const { results: users } = await usersResponse.json()

// Send emails through your own system
for (const user of users) {
  const signingUrl = `https://app.firma.dev/signing/${user.id}`
  await yourEmailService.send({
    to: user.email,
    subject: 'Please sign your document',
    body: `Click here to sign: ${signingUrl}`
  })
}

Experiencias incrustadas

La función de marca blanca más potente es incrustar las interfaces de Firma directamente en tu aplicación. Esto elimina toda la marca de Firma y crea una experiencia fluida dentro de tu producto.

Firma incrustada

Incrusta el flujo de firma para que los destinatarios firmen documentos sin salir de tu aplicación:
<iframe 
  src="https://app.firma.dev/signing/{signing_request_user_id}" 
  style="width:100%;height:900px;border:0;" 
  allow="camera;microphone;clipboard-write"
  title="Sign Document"
></iframe>
Guía de firma incrustada - Detalles completos de implementación

Editor de plantillas incrustado

Permite a los usuarios crear y editar plantillas dentro de tu aplicación usando autenticación JWT:
// Generate JWT token from your backend
const token = await generateTemplateToken(templateId)

// Embed the template editor
const editorUrl = `https://app.firma.dev/template-editor?token=${token}`
<iframe 
  src="https://app.firma.dev/template-editor?token={jwt_token}"
  style="width:100%;height:900px;border:0;"
  title="Edit Template"
></iframe>
Guía del editor de plantillas incrustado - Autenticación JWT e implementación completa

Editor de solicitudes de firma incrustado

Ofrece una interfaz para configurar los destinatarios y las opciones de las solicitudes de firma:
<iframe 
  src="https://app.firma.dev/signing-request-editor?token={jwt_token}"
  style="width:100%;height:700px;border:0;"
  title="Configure Signing Request"
></iframe>
Guía del editor de solicitudes de firma incrustado - Guía de implementación completa

Configuración completa de marca blanca

Aquí tienes un ejemplo completo de cómo configurar un espacio de trabajo totalmente personalizado para un cliente:

1. Crear el espacio de trabajo

const workspace = await fetch('https://api.firma.dev/functions/v1/signing-request-api/workspaces', {
  method: 'POST',
  headers: {
    'Authorization': API_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Acme Corporation'
  })
}).then(r => r.json())

console.log('Created workspace:', workspace.id)

2. Subir un logotipo

const logoForm = new FormData()
logoForm.append('file', logoFile)

await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspaces/${workspace.id}/logo`,
  {
    method: 'POST',
    headers: { 'Authorization': API_KEY },
    body: logoForm
  }
)

3. Configurar la marca

await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/settings`,
  {
    method: 'PUT',
    headers: {
      'Authorization': API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      color_primary: '#0066cc',
      color_primary_fg: '#ffffff',
      color_background: '#f8f9fa',
      color_foreground: '#212529',
      color_card: '#ffffff',
      color_border: '#dee2e6',
      email_local_part: 'noreply'
    })
  }
)

4. Ocultar la marca de Firma (a nivel de empresa)

await fetch(
  'https://api.firma.dev/functions/v1/signing-request-api/company/settings',
  {
    method: 'PUT',
    headers: {
      'Authorization': API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      show_custom_branding_only: true
    })
  }
)

5. Configurar un dominio de correo personalizado (opcional)

// Add domain
const domainResponse = await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/domains`,
  {
    method: 'POST',
    headers: {
      'Authorization': API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ domain: 'sign.acmecorp.com' })
  }
).then(r => r.json())

const domainId = domainResponse.domain.id

// User adds TXT record to DNS...
// Verify ownership
await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/domains/${domainId}/verify-ownership`,
  { method: 'POST', headers: { 'Authorization': API_KEY } }
)

// Finalize (returns SPF, DKIM, DMARC records)
const finalizeResponse = await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/domains/${domainId}/finalize`,
  { method: 'POST', headers: { 'Authorization': API_KEY } }
).then(r => r.json())

console.log('Add these DNS records:', finalizeResponse.dns_records)

// User adds DNS records...
// Verify DNS
await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/domains/${domainId}/verify-dns`,
  { method: 'POST', headers: { 'Authorization': API_KEY } }
)

// Set as primary
await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/domains/${domainId}/set-primary`,
  { method: 'POST', headers: { 'Authorization': API_KEY } }
)

6. Personalizar plantillas de correo (opcional)

await fetch(
  `https://api.firma.dev/functions/v1/signing-request-api/workspace/${workspace.id}/email-templates/signing_invite`,
  {
    method: 'PUT',
    headers: {
      'Authorization': API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      subject: '{{company_name}}: Please sign {{signing_request_name}}',
      body: '<p>Hi {{signer_name}},</p><p>You have a document to review and sign.</p><p><a href="{{signing_link}}">Sign now</a></p><p>- The {{team_name}} Team</p>'
    })
  }
)

7. Incrustar las experiencias

function AcmeSigningApp({ signingRequestUserId }) {
  return (
    <div className="acme-signing-portal">
      {/* Your branded header */}
      <header className="acme-header">
        <img src="/acme-logo.png" alt="Acme Corp" />
      </header>
      
      {/* Embedded Firma signing */}
      <iframe
        src={`https://app.firma.dev/signing/${signingRequestUserId}`}
        style={{ width: '100%', height: '800px', border: 'none' }}
        allow="camera;microphone;clipboard-write"
      />
      
      {/* Your branded footer */}
      <footer className="acme-footer">
        &copy; 2026 Acme Corporation
      </footer>
    </div>
  )
}

Prácticas recomendadas

Marca

  • Usa una paleta de colores consistente en logotipos, plantillas de correo y experiencias incrustadas
  • Sube los logotipos en formato PNG con fondo transparente para obtener mejores resultados
  • Habilita show_custom_branding_only para eliminar por completo la marca de Firma
  • Define la marca a nivel de empresa como base y luego sobrescríbela por espacio de trabajo cuando sea necesario
  • Prueba el flujo de firma completo desde la perspectiva de tus clientes

Configuración de dominio de correo

  • Usa un subdominio (por ejemplo, sign.yourcompany.com) en lugar de tu dominio principal
  • Configura todos los registros DNS (SPF, DKIM, DMARC) para una entregabilidad óptima
  • Monitorea las tasas de rebote de correo y ajusta según sea necesario
  • Prueba la entrega de correo antes de pasar a producción con clientes

Plantillas de correo

  • Usa el endpoint de valores predeterminados para ver las plantillas integradas de Firma como punto de partida
  • Incluye siempre {{signing_link}} en las plantillas de invitación y recordatorio
  • Define una plantilla a nivel de empresa como base de marca y luego sobrescríbela por espacio de trabajo cuando sea necesario
  • Usa {{company_logo}} en las plantillas para incluir el logotipo del espacio de trabajo o de la empresa

Seguridad

  • Genera siempre los tokens JWT en tu backend
  • Nunca expongas claves API en código del lado del cliente
  • Usa tiempos de expiración de token cortos (recomendado: 1 a 4 horas)
  • Valida los orígenes de postMessage al manejar eventos de iframe

Solución de problemas

Falló la verificación de propiedad del dominio

Posibles causas:
  • Los registros DNS no se han propagado (espera hasta 48 horas)
  • Nombre o valor de registro TXT incorrecto
  • Registro TXT agregado a la zona equivocada
Solución: Verifica que tu configuración de DNS coincida con las verification_instructions devueltas al agregar el dominio

Los registros DNS no se verifican

Posibles causas:
  • Los registros aún no se han propagado
  • Valores de registro incorrectos
  • Faltan registros
Solución: Llama a GET /company/domains/{id} o verify-dns para ver qué registros específicos están pendientes

El iframe de firma no carga

Posibles causas:
  • ID de usuario de solicitud de firma inválido
  • Solicitud de firma expirada o cancelada
  • La política de seguridad de contenido está bloqueando el iframe
Solución: Verifica el estado de la solicitud de firma y revisa la consola del navegador en busca de errores de CSP

El token JWT expiró

Posibles causas:
  • TTL del token demasiado corto para el caso de uso
  • Desfase de reloj entre servidores
Solución: Genera tokens con una expiración adecuada y considera renovar los tokens de forma proactiva

Los colores no se aplican

Posibles causas:
  • Formato hexadecimal inválido (debe ser de 6 dígitos, por ejemplo, #0066cc, no de 3 dígitos #06c)
  • La configuración se aplicó a nivel de empresa, pero el espacio de trabajo tiene su propia anulación
Solución: Revisa primero la configuración del espacio de trabajo y luego la de la empresa. Usa null a nivel de espacio de trabajo para eliminar una anulación.

Guías relacionadas