signdocs-com-br · Schema

CreateSigningSessionRequest

Requisição para criar uma sessão de assinatura expressa.

CompanyDigitalSignatureBrazilAPIDocumentManagement

Properties

Name Type Description
purpose object
policy object
signer object
document object Documento inline (base64). Máximo 10 MB. Suporta PDF e outros formatos.
referenceImage object Imagem de referência biométrica para esta sessão, em base64 (JPEG). Máximo 5 MB. Define contra qual rosto a etapa `BIOMETRIC_MATCH` compara o liveness capturado: - **Com `referenceImage`**: a imagem e
action object
returnUrl string URL de retorno após conclusão. O `session_id` será adicionado como query parameter.
cancelUrl string URL de retorno em caso de cancelamento pelo signatário.
metadata object Metadados livres (chave-valor). Chaves até 256 chars, valores até 1024 chars. Quatro chaves são interpretadas pela API, todas como string e todas apenas em sandbox — é por elas que se testa a reprovaç
locale string Idioma da página de assinatura.
expiresInMinutes integer Tempo de expiração em minutos (5 a 1440). Padrão 60.
appearance object
owner object
deliverVia array Canais pelos quais a SignDocs entrega o link de assinatura a este signatário. Omita para manter o comportamento anterior: apenas o e-mail de convite, sujeito à regra de `owner`/`signer.email`. Os cana
View JSON Schema on GitHub

JSON Schema

signdocs-com-br-create-signing-session-request-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/signdocs-com-br/json-schema/signdocs-com-br-create-signing-session-request-schema.json",
  "title": "CreateSigningSessionRequest",
  "description": "Requisição para criar uma sessão de assinatura expressa.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/signdocs-com-br-openapi.yaml#/components/schemas/CreateSigningSessionRequest",
  "type": "object",
  "required": [
    "purpose",
    "policy",
    "signer"
  ],
  "properties": {
    "purpose": {
      "$ref": "#/$defs/TransactionPurpose"
    },
    "policy": {
      "$ref": "#/$defs/Policy"
    },
    "signer": {
      "$ref": "#/$defs/Signer"
    },
    "document": {
      "type": "object",
      "description": "Documento inline (base64). Máximo 10 MB. Suporta PDF e outros formatos.",
      "properties": {
        "content": {
          "type": "string",
          "format": "byte",
          "description": "Conteúdo do documento em base64."
        },
        "filename": {
          "type": "string",
          "description": "Nome do arquivo."
        }
      }
    },
    "referenceImage": {
      "type": "object",
      "description": "Imagem de referência biométrica para esta sessão, em base64 (JPEG). Máximo 5 MB.\n\nDefine contra qual rosto a etapa `BIOMETRIC_MATCH` compara o liveness capturado:\n\n- **Com `referenceImage`**: a imagem enviada aqui é usada e tem precedência sobre\n  qualquer enrollment existente. Vale apenas para esta transação — não cria nem\n  atualiza o enrollment de `signer.userExternalId`.\n- **Sem `referenceImage`** (caso comum): a comparação usa o enrollment cadastrado\n  para `signer.userExternalId` via `PUT /v1/users/{userExternalId}/enrollment`.\n- **Sem nenhum dos dois**: a etapa de comparação falha com 422.\n\nA imagem é retida por 90 dias, conforme a política de retenção de dados biométricos.\nA presença de um rosto **não** é verificada no momento da criação: uma imagem sem\nrosto detectável só falha mais tarde, na etapa de comparação.\n\nNão é aceito em `POST /v1/trust-sessions` (retorna 400).\n\nNa evidência, a comparação resultante registra\n`enrollmentRef.source: TRANSACTION_PROVIDED` e\n`enrollmentRef.capturedFrom: SESSION_CREATE`.\n",
      "required": [
        "content"
      ],
      "properties": {
        "content": {
          "type": "string",
          "format": "byte",
          "description": "Imagem JPEG codificada em base64."
        }
      }
    },
    "action": {
      "$ref": "#/$defs/ActionMetadata"
    },
    "returnUrl": {
      "type": "string",
      "format": "uri",
      "description": "URL de retorno após conclusão. O `session_id` será adicionado como query parameter."
    },
    "cancelUrl": {
      "type": "string",
      "format": "uri",
      "description": "URL de retorno em caso de cancelamento pelo signatário."
    },
    "metadata": {
      "type": "object",
      "description": "Metadados livres (chave-valor). Chaves até 256 chars, valores até 1024 chars.\n\nQuatro chaves são interpretadas pela API, todas como string e todas\napenas em sandbox — é por elas que se testa a reprovação **pela página\nhospedada**, onde quem emite a chamada é a própria página e o\nintegrador não tem outro ponto de injeção:\n\n| Chave | Efeito | Padrão |\n|---|---|---|\n| `sandboxSimilarity` | Similaridade simulada de `BIOMETRIC_MATCH` / `DOCUMENT_PHOTO_MATCH` | 99.5 |\n| `sandboxLivenessConfidence` | Confiança simulada de `BIOMETRIC_LIVENESS` | 99.5 |\n| `sandboxBrightness` | Brilho simulado da captura (dispara `DOCUMENT_QUALITY_LOW`) | 80 |\n| `sandboxSharpness` | Nitidez simulada da captura | 80 |\n\nFora do sandbox são ignoradas. Valores inválidos também são ignorados,\nmantendo o padrão: elas são fixadas na criação e não podem quebrar o\nsignatário no meio do fluxo.\n",
      "additionalProperties": {
        "type": "string"
      }
    },
    "locale": {
      "type": "string",
      "description": "Idioma da página de assinatura.",
      "enum": [
        "pt-BR",
        "en",
        "es"
      ],
      "default": "pt-BR"
    },
    "expiresInMinutes": {
      "type": "integer",
      "description": "Tempo de expiração em minutos (5 a 1440). Padrão 60.",
      "minimum": 5,
      "maximum": 1440,
      "default": 60
    },
    "appearance": {
      "$ref": "#/$defs/SigningSessionAppearance"
    },
    "owner": {
      "$ref": "#/$defs/Owner"
    },
    "deliverVia": {
      "type": "array",
      "description": "Canais pelos quais a SignDocs entrega o link de assinatura a este\nsignatário. Omita para manter o comportamento anterior: apenas o e-mail de\nconvite, sujeito à regra de `owner`/`signer.email`. Os canais escolhidos\nficam gravados: um `resend-invite` sem corpo reenvia por eles.\n\nWhatsApp e Telegram são habilitados **sob demanda**: o tenant pede ao time\ncomercial, e não é algo que se liga pelo painel. Pedir um canal que o tenant\nnão tem retorna **403** antes de qualquer gravação.\n\n`whatsapp` exige `signer.phone` em E.164. `whatsappInviteSent: true`\nsignifica que a Meta **aceitou** a mensagem, não que ela foi entregue ou\nlida; em qualquer outro caso o campo é omitido da resposta. Se a Meta\nreportar falha depois e o signatário tiver e-mail, a SignDocs reenvia o\nconvite por e-mail automaticamente, com um link novo, diferente do que veio\nnesta resposta; nenhum webhook, campo ou endpoint informa esse reenvio. Um\nnúmero que respondeu \"parar\", \"sair\" ou \"stop\" deixa de receber mensagens da\nSignDocs por WhatsApp.\n\n`telegram` exige `signer.cpf` e só alcança signatários que já registraram o\npróprio CPF no bot da SignDocs. `telegramInviteSent` vem na resposta sempre\nque o convite por Telegram é tentado nesta chamada, `false` quando não chegou.\n\nCada envio por WhatsApp ou Telegram consome a cota de mensagens do tenant.\nEsgotada a cota, a requisição é recusada com **429** antes de qualquer\ngravação; com o canal suspenso por kill switch, com **503**. Credenciais de\nsandbox também enviam mensagens reais por WhatsApp e consomem a cota de\nmensagens de sandbox.\n",
      "items": {
        "type": "string",
        "enum": [
          "email",
          "whatsapp",
          "telegram"
        ]
      }
    }
  },
  "$defs": {
    "ActionMetadata": {
      "type": "object",
      "description": "Metadados da ação autenticada (para `ACTION_AUTHENTICATION`).",
      "required": [
        "type",
        "description"
      ],
      "properties": {
        "type": {
          "type": "string",
          "description": "Tipo da ação."
        },
        "description": {
          "type": "string",
          "description": "Descrição da ação."
        },
        "reference": {
          "type": "string",
          "description": "Referência externa da ação."
        }
      }
    },
    "OtpChannel": {
      "type": "string",
      "description": "Canal de entrega do OTP, escolhido por signatário. Independente do canal\nusado para entregar o link de assinatura: um convite por WhatsApp pode ter\nOTP por e-mail, e um convite por e-mail pode ter OTP por WhatsApp.\n\n`sms` e `whatsapp` exigem `signer.phone` e o canal habilitado para o tenant\n(`sms.enabled` / `whatsapp.enabled`); caso contrário o passo de OTP falha com\n**422**. No WhatsApp, um número que pediu para não receber mensagens também\nfalha com 422, com uma mensagem que orienta a escolher outro canal.\n\n`telegram` exige `telegram.enabled` no tenant. O código chega pelo bot da\nSignDocs quando o signatário já registrou o próprio CPF nele; sem registro, é\nenviado por telefone (Telegram Gateway) se o tenant tiver essa opção\nhabilitada, e caso contrário o passo falha com **422** de imediato. Ao criar a\nsessão, `otpChannel: telegram` ainda exige `signer.email` quando a política\ntem OTP.\n\nUm OTP por WhatsApp ou pelo Telegram Gateway consome a cota de mensagens do\ntenant; esgotada, o envio é recusado com **429**.\n",
      "enum": [
        "email",
        "sms",
        "whatsapp",
        "telegram"
      ],
      "default": "email"
    },
    "Owner": {
      "type": "object",
      "description": "Identidade do solicitante da assinatura (quem cria a sessão/envelope), distinta\ndo signatário. Quando informado, a SignDocs:\n\n1. **Envia automaticamente um e-mail de convite** para `signer.email` no momento\n   da criação da sessão, se `signer.email` for diferente de `owner.email`\n   (case-insensitive). Em envelopes, cada signatário recebe seu próprio convite.\n2. **Notifica o solicitante por e-mail** quando cada signatário concluir a\n   assinatura, com o protocolo de evidência e link para o verificador.\n\nOmitir `owner` mantém o comportamento padrão: o integrador entrega a URL de\nassinatura por seus próprios canais e usa webhooks para acompanhar o status.\n",
      "properties": {
        "email": {
          "type": "string",
          "format": "email",
          "description": "E-mail do solicitante. Recebe notificações de conclusão."
        },
        "name": {
          "type": "string",
          "description": "Nome do solicitante (usado na saudação dos e-mails).",
          "maxLength": 1024
        }
      }
    },
    "Policy": {
      "type": "object",
      "description": "Política de verificação de identidade da transação.",
      "required": [
        "profile"
      ],
      "properties": {
        "profile": {
          "$ref": "#/$defs/PolicyProfile"
        },
        "customSteps": {
          "type": "array",
          "description": "Etapas customizadas (apenas quando `profile` = `CUSTOM`).",
          "items": {
            "$ref": "#/$defs/StepType"
          }
        },
        "minSimilarity": {
          "type": "number",
          "format": "double",
          "minimum": 0,
          "maximum": 100,
          "description": "Limiar mínimo de similaridade facial exigido desta transação, para as\netapas `BIOMETRIC_MATCH` e `DOCUMENT_PHOTO_MATCH`.\n\n**Só aperta, nunca afrouxa.** O valor precisa ser maior ou igual ao\nlimiar configurado para o tenant; um valor abaixo dele retorna 400\ninformando o mínimo vigente, em vez de ser ignorado em silêncio —\nafrouxar a verificação de identidade é decisão do tenant, não da\nrequisição. Documentos de maior risco podem assim exigir mais\nconfiança que o padrão da conta, sem reconfigurar o tenant.\n\nAceita tanto percentual (`95`) quanto fração (`0.95`).\n"
        },
        "minLivenessConfidence": {
          "type": "number",
          "format": "double",
          "minimum": 0,
          "maximum": 100,
          "description": "Limiar mínimo de confiança de vivacidade (`BIOMETRIC_LIVENESS`) exigido\ndesta transação. Mesmo enquadramento do `minSimilarity`: só aperta, e\num valor abaixo do mínimo do tenant retorna 400.\n\nQuando o tenant não define limiar de vivacidade próprio, qualquer valor\nválido é aceito.\n"
        }
      }
    },
    "PolicyProfile": {
      "type": "string",
      "description": "Perfis de política de verificação pré-definidos. Cada perfil resolve para uma\nlista ordenada de etapas (`StepType`):\n\n- `CLICK_ONLY`: CLICK_ACCEPT\n- `CLICK_PLUS_OTP`: CLICK_ACCEPT, OTP_CHALLENGE, OTP_VERIFY\n- `BIOMETRIC`: BIOMETRIC_LIVENESS, BIOMETRIC_MATCH\n- `BIOMETRIC_PLUS_OTP`: BIOMETRIC_LIVENESS, BIOMETRIC_MATCH, OTP_CHALLENGE, OTP_VERIFY\n- `DIGITAL_CERTIFICATE`: CLICK_ACCEPT, DIGITAL_SIGN_A1\n- `BIOMETRIC_SERPRO`: BIOMETRIC_LIVENESS, BIOMETRIC_MATCH, SERPRO_IDENTITY_CHECK\n- `BIOMETRIC_SERPRO_AUTO_FALLBACK`: as mesmas etapas de `BIOMETRIC_SERPRO`, mais uma\n  etapa DOCUMENT_PHOTO_MATCH criada em estado `DORMANT`. Se a base governamental\n  estiver indisponível, a etapa SERPRO passa a `SKIPPED` e a dormente é ativada,\n  sem derrubar a assinatura em andamento.\n- `BIOMETRIC_DOCUMENT_FALLBACK`: BIOMETRIC_LIVENESS, DOCUMENT_PHOTO_MATCH — para\n  signatários sem cadastro biométrico prévio, comparando a prova de vida com a foto\n  de um documento oficial.\n- `CUSTOM`: etapas definidas em `policy.customSteps`.\n\n`BIOMETRIC`, `BIOMETRIC_PLUS_OTP`, `BIOMETRIC_SERPRO`, `BIOMETRIC_SERPRO_AUTO_FALLBACK`\ne `BIOMETRIC_DOCUMENT_FALLBACK` exigem cota biométrica provisionada para o tenant.\n",
      "enum": [
        "CLICK_ONLY",
        "CLICK_PLUS_OTP",
        "BIOMETRIC",
        "BIOMETRIC_PLUS_OTP",
        "DIGITAL_CERTIFICATE",
        "BIOMETRIC_SERPRO",
        "BIOMETRIC_SERPRO_AUTO_FALLBACK",
        "BIOMETRIC_DOCUMENT_FALLBACK",
        "CUSTOM"
      ]
    },
    "Signer": {
      "type": "object",
      "description": "Dados do signatário.\nÉ obrigatório informar pelo menos um entre `cpf` e `cnpj`.\n",
      "required": [
        "name",
        "userExternalId"
      ],
      "anyOf": [
        {
          "required": [
            "cpf"
          ]
        },
        {
          "required": [
            "cnpj"
          ]
        }
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Nome completo do signatário."
        },
        "email": {
          "type": "string",
          "format": "email",
          "description": "E-mail do signatário (obrigatório para etapas OTP)."
        },
        "userExternalId": {
          "type": "string",
          "description": "Identificador externo do usuário no sistema do integrador."
        },
        "displayName": {
          "type": "string",
          "description": "Nome de exibição do signatário."
        },
        "cpf": {
          "type": "string",
          "description": "CPF do signatário (11 dígitos, sem pontuação). Obrigatório se `cnpj` não for informado.",
          "pattern": "^\\d{11}$"
        },
        "cnpj": {
          "type": "string",
          "description": "CNPJ do signatário (14 dígitos, sem pontuação). Obrigatório se `cpf` não for informado.",
          "pattern": "^\\d{14}$"
        },
        "phone": {
          "type": "string",
          "description": "Telefone do signatário em formato E.164. Obrigatório quando `otpChannel` é `sms` ou `whatsapp`, ou quando `deliverVia` inclui `whatsapp`.",
          "pattern": "^\\+[1-9]\\d{7,14}$"
        },
        "otpChannel": {
          "$ref": "#/$defs/OtpChannel"
        },
        "otpChannelSelectable": {
          "type": "boolean",
          "description": "Quando `true`, a tela de assinatura hospedada permite que o signatário escolha o canal (entre os de `availableOtpChannels`) que recebe o OTP no momento da assinatura e troque de canal durante o fluxo. Padrão `false` — integrações existentes mantêm um único canal fixo e o backend recusa um canal escolhido pelo signatário se este campo não estiver definido.",
          "default": false
        }
      }
    },
    "SigningSessionAppearance": {
      "type": "object",
      "description": "Configuração visual da página de assinatura hospedada.",
      "properties": {
        "brandColor": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "Cor primária da marca (hex)."
        },
        "logoUrl": {
          "type": "string",
          "format": "uri",
          "description": "URL HTTPS do logotipo da empresa."
        },
        "companyName": {
          "type": "string",
          "description": "Nome da empresa exibido na página."
        },
        "backgroundColor": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "Cor de fundo (hex)."
        },
        "textColor": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "Cor do texto (hex)."
        },
        "buttonTextColor": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$",
          "description": "Cor do texto dos botões (hex)."
        },
        "borderRadius": {
          "type": "string",
          "pattern": "^\\d+px$",
          "description": "Raio de borda dos elementos (formato \"Npx\")."
        },
        "headerStyle": {
          "type": "string",
          "description": "Estilo do cabeçalho da página.",
          "enum": [
            "full",
            "minimal",
            "none"
          ],
          "default": "full"
        },
        "fontFamily": {
          "type": "string",
          "description": "Família tipográfica.",
          "enum": [
            "system-ui",
            "Inter",
            "Roboto",
            "Open Sans",
            "Lato",
            "Montserrat",
            "Source Sans Pro",
            "Nunito",
            "Poppins",
            "Raleway",
            "Ubuntu"
          ],
          "default": "system-ui"
        }
      }
    },
    "StepType": {
      "type": "string",
      "description": "Tipos de etapa de verificação de identidade. Em `policy.customSteps` a ordem é\nvalidada na criação: BIOMETRIC_MATCH, SERPRO_IDENTITY_CHECK e DOCUMENT_PHOTO_MATCH\nexigem BIOMETRIC_LIVENESS antes de si, OTP_CHALLENGE e OTP_VERIFY vêm sempre em par\ne nessa ordem, e DIGITAL_SIGN_A1 tem de ser a última etapa.\n",
      "enum": [
        "CLICK_ACCEPT",
        "OTP_CHALLENGE",
        "OTP_VERIFY",
        "BIOMETRIC_LIVENESS",
        "BIOMETRIC_MATCH",
        "DOCUMENT_PHOTO_MATCH",
        "SERPRO_IDENTITY_CHECK",
        "DIGITAL_SIGN_A1",
        "PURPOSE_DISCLOSURE"
      ]
    },
    "TransactionPurpose": {
      "type": "string",
      "description": "Finalidade da transação.",
      "enum": [
        "DOCUMENT_SIGNATURE",
        "ACTION_AUTHENTICATION"
      ]
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/signdocs-com-br-create-signing-session-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.