Adicionar assinante
Inclui um novo assinante em uma operação em andamento, sem precisar cancelar e recriar a operação.
Adiciona um assinante a uma operação em andamento. O novo membro aceita as mesmas opções de um assinante criado junto com a operação: posição na ordem de assinatura, canal de notificação, dupla autenticação, posicionamento visual da assinatura (coordenadas ou tags no PDF), anexos e antifraude.
Este endpoint adiciona apenas assinantes — observadores só podem ser definidos na criação da operação.
A operação precisa estar em andamento. Operações concluídas, canceladas ou
expiradas retornam 409 Conflict. E em operações sequenciais, não dá pra
adicionar alguém em uma posição que já foi notificada — veja
ordem de assinatura abaixo.
Quando usar
- Entrou uma testemunha, avalista ou aprovador depois da operação criada
- Substituir um assinante (adicione o novo e remova o antigo)
- Encaixar alguém numa posição específica da ordem de assinatura
Endpoint
Authorization
ApiKey Token de integracao. Envie no header X-Api-Key.
In: header
Path Parameters
int64Header Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
curl -X POST "https://example.com/api/v2/operation/0/members" \ -H "Content-Type: application/json" \ -d '{}'null{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}O {operationId} na URL é o ID da operação — o campo id retornado em
Criar operação.
Body — exemplo mínimo
{
"name": "Claudio Nogueira",
"email": "[email protected]",
"role": "Testemunha",
"signatureType": "UserChoice",
"notificationChannel": "Email",
"signatures": [
{
"documentId": "114488ce-8fc6-42c2-9b13-d4233a3ce089",
"printSignature": true,
"positions": [
{ "page": 1, "coordenateX": "4.93%", "coordenateY": "26.46%" }
]
}
]
}Campos básicos
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Sim | Nome do assinante. |
email | string | Sim | Email do assinante. |
phone | string | Condicional | Formato internacional (5511...). Obrigatório se notificationChannel for SMS/WhatsApp, ou se doubleAuthentication=true com authenticationChannel SMS/WhatsApp. |
role | string | Não | Rótulo exibido (Comprador, Testemunha...). |
cpf | string | Condicional | Obrigatório para signatureType Certificate/CloudCertificate. |
signatureType | enum | Não | Click, Draw, Text, UserChoice, Certificate, CloudCertificate. Veja tipos de assinatura. |
Notificação e autenticação
| Campo | Tipo | Descrição |
|---|---|---|
notificationChannel | enum | Email (padrão), SMS, WhatsApp, None. Com None, ninguém é notificado — a resposta traz o link de assinatura (accessUri) para você entregar pelo seu canal. |
doubleAuthentication | bool | Exige código adicional antes de assinar. |
authenticationChannel | enum | Canal do código de dupla autenticação (Email, SMS, WhatsApp). Obrigatório quando doubleAuthentication=true. |
geoRequired | bool | Exige geolocalização no momento da assinatura. |
Posição na ordem de assinatura
Relevante quando a operação é sequencial (order=true na criação) — ou quando
você quer converter uma operação paralela em sequencial:
| Campo | Tipo | Descrição |
|---|---|---|
orderPosition | int | Posição desejada (≥ 1). Se omitido, o membro entra no fim da fila. |
insertMode | enum | Shift (padrão): o membro assume a posição e desloca os demais. Group: o membro se junta a quem já está na posição (assinam em paralelo). |
pendingMembersOrder[] | array | Converte uma operação paralela em sequencial: envie orderPosition + a nova ordem dos membros pendentes ({ "memberId": 99201, "order": 2 }). A lista precisa cobrir todos os membros que ainda não foram notificados — faltando algum, a chamada retorna 400. Membros já notificados ficam na posição 1. |
Em operações sequenciais, não é possível adicionar alguém em uma posição que já
foi notificada — o link daquela rodada já foi enviado. A chamada retorna 400;
use uma posição futura ou omita orderPosition.
Posicionamento da assinatura
| Campo | Tipo | Descrição |
|---|---|---|
signatures[] | array | Posição visual por documento: documentId, printSignature, positions[] (page, coordenateX, coordenateY em %), initialsPages[]. |
rubrics[] | array | Rubricas, no mesmo formato de signatures[]. |
hasSignatureTag + signPositionTag | bool + string | Posiciona a assinatura por tag no PDF em vez de coordenadas. |
hasRubricTag + rubricTag | bool + string | Idem, para a rubrica. |
Tag e coordenadas são mutuamente exclusivas para o mesmo elemento — enviar as
duas juntas retorna 400.
Antifraude e anexos
| Campo | Tipo | Descrição |
|---|---|---|
antifraudFeatures | string[] | SelfieSimples, CpfSerpro, Liveness, FacialCpfSerpro ou Disabled. Veja Biometria e antifraude. |
antifraudOverrideReason | string | Justificativa quando a feature enviada difere da política padrão da conta. |
attachments[] | array | Anexos solicitados ao membro — name, description, required, fileType[], filesAllowed, inputAttachment[] (CameraSideFront, CameraSideBack, UploadFile). Máximo de 15. |
Exemplo
curl -X POST "https://api.forsign.digital/api/v2/operation/4821/members" \
-H "X-Api-Key: $FORSIGN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Claudio Nogueira",
"email": "[email protected]",
"signatureType": "UserChoice",
"notificationChannel": "Email",
"signatures": [
{
"documentId": "114488ce-8fc6-42c2-9b13-d4233a3ce089",
"printSignature": true,
"positions": [{ "page": 1, "coordenateX": "4.93%", "coordenateY": "26.46%" }]
}
]
}'await fetch(`https://api.forsign.digital/api/v2/operation/${operationId}/members`, {
method: 'POST',
headers: {
'X-Api-Key': apiKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Claudio Nogueira',
email: '[email protected]',
signatureType: 'UserChoice',
notificationChannel: 'Email',
signatures: [
{
documentId: '114488ce-8fc6-42c2-9b13-d4233a3ce089',
printSignature: true,
positions: [{ page: 1, coordenateX: '4.93%', coordenateY: '26.46%' }],
},
],
}),
});var resp = await http.PostAsJsonAsync(
$"/api/v2/operation/{operationId}/members",
new
{
name = "Claudio Nogueira",
email = "[email protected]",
signatureType = "UserChoice",
notificationChannel = "Email",
signatures = new[]
{
new
{
documentId = "114488ce-8fc6-42c2-9b13-d4233a3ce089",
printSignature = true,
positions = new[] { new { page = 1, coordenateX = "4.93%", coordenateY = "26.46%" } },
},
},
});
resp.EnsureSuccessStatusCode();Respostas de sucesso
201 Created — quando notificationChannel é Email, SMS ou WhatsApp.
Corpo vazio; o membro foi criado e a notificação segue o fluxo da operação.
200 OK — quando notificationChannel é None. O corpo traz o link de
assinatura para você distribuir:
{
"data": {
"accessUri": "https://fsign.app/aBc123"
}
}Comportamento e gotchas
- Duplicidade: já existir um membro com o mesmo email e nome na operação
retorna
400(a comparação ignora maiúsculas/minúsculas). - Notificação respeita a ordem: em operação paralela, o novo membro é notificado imediatamente. Em operação sequencial, ele só é notificado quando chega a vez da posição dele (a menos que entre justamente na posição ativa).
- Colisão de posição: coordenadas (ou tag) sobre uma posição já ocupada por
outra assinatura/rubrica no mesmo documento retornam
400. - Tag precisa existir no PDF — tag não encontrada no documento retorna
400. - Certificado digital tem regras próprias: exige
cpf; não aceita rubricas nem formulário; no máximo 1 posição por documento; e sempre entra no fim da ordem (assina por último), independentemente doorderPositionenviado. Adicionar um membro de certificado a uma operação paralela converte a operação para sequencial automaticamente. - Certificado assina por último — nos dois sentidos: depois que um membro de
certificado já assinou, não dá mais para adicionar assinantes comuns (
400). E um assinante comum não pode ficar em posição igual ou posterior à de um certificado — em particular,insertMode=Groupnuma posição ocupada por um certificado retorna400(useShift, que desloca o certificado para frente). - Antifraude consome crédito:
Liveness,CpfSerproeFacialCpfSerprodebitam crédito no momento da adição (SelfieSimpleseDisablednão consomem). Sem crédito, a chamada retorna400e o membro não é criado. O override por membro (antifraudFeaturesdiferente da política da conta) precisa estar habilitado nas configurações de antifraude da conta — enviar a mesma feature da política padrão não conta como override e é sempre aceito. - Página inexistente:
positions[].pagemaior que o total de páginas do documento retorna400. - Auditoria: a adição fica registrada na trilha de auditoria da operação.
Erros comuns
| Status | Causa | Como resolver |
|---|---|---|
400 | Campo obrigatório ausente (name, email, phone p/ SMS/WhatsApp, authenticationChannel c/ dupla autenticação) | Confira as regras condicionais nas tabelas acima. |
400 | Membro com mesmo email e nome já existe | Verifique se o membro já não está na operação. |
400 | documentId não pertence à operação | Use os IDs dos documentos retornados na criação. |
400 | Posição já ocupada, tag inexistente, ou tag + coordenadas juntas | Ajuste o posicionamento. |
400 | orderPosition inválida ou já notificada | Use posição ≥ 1 ainda não notificada, ou omita para entrar no fim. |
400 | pendingMembersOrder não cobre todos os membros pendentes | Inclua todos os membros ainda não notificados na lista. |
400 | Assinante comum em posição igual/posterior a um certificado, ou Group em posição de certificado | Use Shift ou uma posição anterior à do certificado. |
400 | Crédito de antifraude insuficiente ou override não permitido | Verifique o plano e as configurações de antifraude da conta. |
401 | API key ausente ou inválida | Confira o header X-Api-Key. |
404 | Operação não encontrada | Confira o operationId. |
409 | Operação não está em andamento | Operações concluídas/canceladas/expiradas não aceitam novos membros. |