Send documents for legally valid e-signature in Brazil, track signers and download signed files.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Request signatures on a document. Use `method: virtual` to sign without input fields, or `method: collect` to place input fields on specific pages. DigitalCertificate signers require `method: virtual`; other methods fail with code `digital_certificate_requires_virtual`. For **virtual**, the document may be in `uploaded`, `metadata_processing` or `metadata_ready`; it is promoted to `pending_signature` automatically once metadata processing completes. For **collect**, the document must be in `metadata_ready` (fields reference specific pages). `step` controls signing order: signers sharing a step sign in parallel, and the next step is notified only after the previous step completes. If supplied, every signer must supply it and values must be contiguous starting at 1. Obtain signer IDs from assinafy_list_signers or assinafy_create_signer and page IDs from assinafy_get_document. This sends signing invitations. Check with assinafy_get_document that no assignment exists first; this can consume credits.
Document ID.
Required for `collect`: field placements per page.
Text included in the invitation email.
ISO 8601; default is no expiration. Must be at least one hour in the future.
Preview cost and balances without creating an assignment or notifying anyone.
Signer IDs that only receive a copy.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Request signatures on a document. Use `method: virtual` to sign without input fields, or `method: collect` to place input fields on specific pages. DigitalCertificate signers require `method: virtual`; other methods fail with code `digital_certificate_requires_virtual`. For **virtual**, the document may be in `uploaded`, `metadata_processing` or `metadata_ready`; it is promoted to `pending_signature` automatically once metadata processing completes. For **collect**, the document must be in `metadata_ready` (fields reference specific pages). `step` controls signing order: signers sharing a step sign in parallel, and the next step is notified only after the previous step completes. If supplied, every signer must supply it and values must be contiguous starting at 1. Obtain signer IDs from assinafy_list_signers or assinafy_create_signer and page IDs from assinafy_get_document. This sends signing invitations. Check with assinafy_get_document that no assignment exists first; this can consume credits.
| Argument | Type | Description |
|---|---|---|
| method* | string | |
| entries | array | Required for `collect`: field placements per page. |
| message | string | Text included in the invitation email. |
| signers* | array | |
| expires_at | string | ISO 8601; default is no expiration. Must be at least one hour in the future. |
| document_id* | string | Document ID. |
| estimate_only | boolean | Preview cost and balances without creating an assignment or notifying anyone. |
| copy_receivers | array | Signer IDs that only receive a copy. |
{
"type": "object",
"allOf": [
{
"if": {
"required": [
"method"
],
"properties": {
"method": {
"const": "collect"
}
}
},
"then": {
"required": [
"entries"
],
"properties": {
"entries": {
"minItems": 1
}
}
}
},
{
"if": {
"required": [
"estimate_only"
],
"properties": {
"estimate_only": {
"const": true
}
}
},
"else": {
"properties": {
"signers": {
"items": {
"required": [
"id"
]
}
}
}
}
}
],
"required": [
"method",
"signers",
"document_id"
],
"properties": {
"method": {
"enum": [
"virtual",
"collect"
],
"type": "string",
"default": "virtual"
},
"entries": {
"type": "array",
"items": {
"type": "object",
"required": [
"page_id",
"fields"
],
"properties": {
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"signer_id",
"field_id",
"display_settings"
],
"properties": {
"field_id": {
"type": "string"
},
"signer_id": {
"type": "string"
},
"display_settings": {
"type": "object",
"required": [
"left",
"top",
"width",
"height",
"fontSize"
],
"properties": {
"top": {
"type": "number",
"format": "float",
"minimum": 0,
"description": "Vertical distance from the page's top edge, in page-image pixels."
},
"left": {
"type": "number",
"format": "float",
"minimum": 0,
"description": "Horizontal distance from the page's left edge, in page-image pixels."
},
"width": {
"type": "number",
"format": "float",
"description": "Width of the placement rectangle, in page-image pixels.",
"exclusiveMinimum": 0
},
"height": {
"type": "number",
"format": "float",
"description": "Height of the placement rectangle, in page-image pixels.",
"exclusiveMinimum": 0
},
"fontSize": {
"type": "number",
"format": "float",
"description": "Font size in the 150-DPI page-image coordinate system.",
"exclusiveMinimum": 0
},
"fontFamily": {
"type": "string",
"description": "Font-family presentation metadata."
},
"backgroundColor": {
"type": "string",
"description": "CSS-compatible background-color presentation metadata."
}
},
"description": "A field placement rectangle on a document page. Geometry values are pixels in Assinafy's 150-DPI page image, measured from the upper-left corner. Clients must keep the rectangle within the selected page's width and height; the API does not clamp out-of-bounds values.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"minItems": 1
},
"page_id": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Required for `collect`: field placements per page."
},
"message": {
"type": "string",
"description": "Text included in the invitation email."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"step": {
"type": "integer",
"minimum": 1
},
"verification_method": {
"enum": [
"Email",
"Whatsapp",
"DigitalCertificate",
"IdDocumentFaceMatchBasic"
],
"type": "string",
"example": "Email",
"description": "How the signer's identity is verified before signing. `Email` (default) sends a one-time code to the signer's email; `Whatsapp` sends the code over WhatsApp — the verification itself is not billed, but it requires the WhatsApp notification channel, so the signer costs 0.45 credits (available only on paid subscriptions); `DigitalCertificate` has the signer sign with their own ICP-Brasil certificate (A1/A3) — it requires `method: virtual`, the Digital Certificate feature, a CPF or CNPJ in `government_id`, must be alone in its signing step, and is charged 0.5 credits per signer. A CPF requires that person's certificate (an e-CPF, or an e-CNPJ naming them as legal representative); a CNPJ requires an e-CNPJ for that company, from any of its representatives. `IdDocumentFaceMatchBasic` verifies the signer from a photo of their government ID, a photo of them holding it and a liveness check — it requires the ID Document + Face Match feature, the signer must have a valid CPF in `government_id`, and is charged a per-signer fee. Omit to default to `Email`."
},
"notification_methods": {
"type": "array",
"items": {
"enum": [
"Email",
"Whatsapp"
],
"type": "string"
},
"example": [
"Email"
],
"maxItems": 1,
"description": "How the signer is told a signature is being requested. **Exactly one method per signer** — the array shape is historical, and sending two returns `400`. The method must also be compatible with `verification_method`: `Email` verification takes `Email`, `Whatsapp` verification takes `Whatsapp`, and `DigitalCertificate` and `IdDocumentFaceMatchBasic` take either. WhatsApp incurs an additional cost and is available only on paid subscriptions. Omit it to have it inferred from `verification_method`, or `{\"Email\"}` when neither is sent. See **Verification & Notification Methods** for the full pairing table."
}
},
"additionalProperties": false
},
"minItems": 1
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "ISO 8601; default is no expiration. Must be at least one hour in the future."
},
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
},
"estimate_only": {
"type": "boolean",
"description": "Preview cost and balances without creating an assignment or notifying anyone."
},
"copy_receivers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Signer IDs that only receive a copy."
}
},
"additionalProperties": false
}Generate a document from a saved template and invite one signer per role, by signer ID or full name and email. Find roles with assinafy_list_templates and validate editor_fields values with assinafy_validate_fields first. DigitalCertificate signers require a virtual template without placed fields. This sends invitations and can consume credits.
| Argument | Type | Description |
|---|---|---|
| name | string | custom document name |
| tags | null | array | tag names, merged with the template's defaults |
| message | string | signing invitation message |
| signers* | null | array | one signer per template role, each by ID or by name and email |
| account_id | string | account ID; uses request routing if omitted |
| expires_at | string | assignment expiry in RFC 3339 format |
| template_id* | string | template ID |
| editor_fields | null | array | template editor field values |
| estimate_only |
Create a signer in the workspace. Search with assinafy_list_signers first to avoid duplicates. Sends no invitation.
| Argument | Type | Description |
|---|---|---|
| string | ||
| full_name* | string | |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
| government_id | string | Signer's CPF (11 digits) or CNPJ (14 characters; may be alphanumeric). Formatting is accepted and the value is normalized on save. Required before the signer can use a verification method that identifies them by CPF. |
| whatsapp_phone_number | string | E.164; normalized on save. |
{
"type": "object",
"required": [
"full_name"
],
"properties": {
"email": {
"type": "string",
"format": "email"
},
"full_name": {
"type": "string",
"minLength": 1
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
},
"government_id": {
"type": "string",
"description": "Signer's CPF (11 digits) or CNPJ (14 characters; may be alphanumeric). Formatting is accepted and the value is normalized on save. Required before the signer can use a verification method that identifies them by CPF."
},
"whatsapp_phone_number": {
"type": "string",
"description": "E.164; normalized on save."
}
},
"additionalProperties": false
}Delete a document only when the user's instruction explicitly authorizes deletion. Inspect its current state first; Assinafy enforces which documents may be deleted.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | unique document ID to delete |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"document_id": {
"type": "string",
"description": "unique document ID to delete"
}
},
"additionalProperties": false
}Download a document artifact as base64: original (default), certificated, certificate-page, pades or bundle. Download the signed PDF only when the document is certificated and the artifact is listed.
| Argument | Type | Description |
|---|---|---|
| artifact | string | original (default), certificated, certificate-page, pades, or bundle |
| document_id* | string | unique document ID |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"artifact": {
"type": "string",
"description": "original (default), certificated, certificate-page, pades, or bundle"
},
"document_id": {
"type": "string",
"description": "unique document ID"
}
},
"additionalProperties": false
}Download the rendered image of a specific document page. Use a page_id returned by assinafy_get_document. Returns base64.
| Argument | Type | Description |
|---|---|---|
| page_id* | string | The page ID. |
| document_id* | string | Document ID. |
{
"type": "object",
"required": [
"document_id",
"page_id"
],
"properties": {
"page_id": {
"type": "string",
"minLength": 1,
"description": "The page ID."
},
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
}
},
"additionalProperties": false
}Inspect one known document: status, assignment, signers with their progress, pages and available artifacts. Read it before retrying a send or following up. 100% signed does not mean certification is finished; the signed PDF is ready at status certificated.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | unique document ID |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"document_id": {
"type": "string",
"description": "unique document ID"
}
},
"additionalProperties": false
}Retrieve a single field definition.
| Argument | Type | Description |
|---|---|---|
| field_id* | string | The field ID. |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
{
"type": "object",
"required": [
"field_id"
],
"properties": {
"field_id": {
"type": "string",
"minLength": 1,
"description": "The field ID."
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
}
},
"additionalProperties": false
}Retrieve a signer's information.
| Argument | Type | Description |
|---|---|---|
| signer_id* | string | The signer ID. |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
{
"type": "object",
"required": [
"signer_id"
],
"properties": {
"signer_id": {
"type": "string",
"minLength": 1,
"description": "The signer ID."
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
}
},
"additionalProperties": false
}Get one saved template with its roles and field placements.
| Argument | Type | Description |
|---|---|---|
| account_id | string | account ID; uses default if omitted |
| template_id* | string | unique template ID |
{
"type": "object",
"required": [
"template_id"
],
"properties": {
"account_id": {
"type": "string",
"description": "account ID; uses default if omitted"
},
"template_id": {
"type": "string",
"description": "unique template ID"
}
},
"additionalProperties": false
}List the activities recorded for a document. Each entry carries an event-specific `payload` snapshot (keys vary per event) and the request `origin` (`ip`, `user-agent`). Use it to explain what happened to a document and when.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | Document ID. |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
}
},
"additionalProperties": false
}Search workspace documents by name or status, with pagination. Use it to find a document the user names before inspecting or following up on it.
| Argument | Type | Description |
|---|---|---|
| page | integer | page number (1-based) |
| sort | string | name or updated_at; prefix with - for descending |
| tags | string | comma-separated tag IDs; documents must have all listed tags |
| method | string | signature method filter: virtual or collect |
| search | string | partial match on document name or signer |
| status | string | document status filter |
| per_page | integer | number of results per page (max 100) |
| account_id | string | account ID; uses request routing if omitted |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"description": "page number (1-based)"
},
"sort": {
"type": "string",
"description": "name or updated_at; prefix with - for descending"
},
"tags": {
"type": "string",
"description": "comma-separated tag IDs; documents must have all listed tags"
},
"method": {
"type": "string",
"description": "signature method filter: virtual or collect"
},
"search": {
"type": "string",
"description": "partial match on document name or signer"
},
"status": {
"type": "string",
"description": "document status filter"
},
"per_page": {
"type": "integer",
"description": "number of results per page (max 100)"
},
"account_id": {
"type": "string",
"description": "account ID; uses request routing if omitted"
}
},
"additionalProperties": false
}List the field definitions of a workspace. When `include_standard` is enabled, records of type `signature`, `initial` and `signatureDate` are also returned. Match definitions to template placement field_id and ask about ambiguous names.
| Argument | Type | Description |
|---|---|---|
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
| include_inactive | boolean | Include inactive field definitions. |
| include_standard | boolean | Include standard field types (signature, initial, signatureDate). |
{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
},
"include_inactive": {
"type": "boolean",
"description": "Include inactive field definitions."
},
"include_standard": {
"type": "boolean",
"description": "Include standard field types (signature, initial, signatureDate)."
}
},
"additionalProperties": false
}List the signers of a workspace. Use it to resolve a recipient to a signer ID; ask the user about ambiguous matches before sending.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number. |
| search | string | Filter by full_name or email. |
| per_page | integer | Records per page (max 100). |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number."
},
"search": {
"type": "string",
"description": "Filter by full_name or email."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Records per page (max 100)."
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
}
},
"additionalProperties": false
}List saved templates with their signer roles, pages and field placements (field_id). Template authoring is done in Assinafy.
| Argument | Type | Description |
|---|---|---|
| page | integer | page number (1-based) |
| search | string | filter templates by name |
| per_page | integer | results per page |
| account_id | string | account ID; uses default if omitted |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"description": "page number (1-based)"
},
"search": {
"type": "string",
"description": "filter templates by name"
},
"per_page": {
"type": "integer",
"description": "results per page"
},
"account_id": {
"type": "string",
"description": "account ID; uses default if omitted"
}
},
"additionalProperties": false
}List all WhatsApp notification messages sent for an assignment. The response includes the rendered template text split into `header`, `body` and `buttons` — exactly what the signer would see. In sandbox/stage, WhatsApp messages are simulated (no real delivery) and button URLs include access/verification codes you can use to simulate the signing flow. Treat returned signing links and verification codes as sensitive; never use them to sign for another person. Use it to troubleshoot WhatsApp delivery for one assignment.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | Document ID. |
| assignment_id* | string | The assignment ID. |
{
"type": "object",
"required": [
"document_id",
"assignment_id"
],
"properties": {
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
},
"assignment_id": {
"type": "string",
"minLength": 1,
"description": "The assignment ID."
}
},
"additionalProperties": false
}Open a visual editor to place signature, initials, date and input fields on a metadata_ready document, then send it with method collect. Takes the assinafy_create_assignment arguments except method and entries. Sends nothing by itself: in apps-capable hosts the user places fields and presses Send; other clients get page sizes and field IDs as text to build entries.
| Argument | Type | Description |
|---|---|---|
| message | string | Text included in the invitation email. |
| signers* | array | |
| expires_at | string | ISO 8601; default is no expiration. Must be at least one hour in the future. |
| document_id* | string | Document ID. |
| copy_receivers | array | Signer IDs that only receive a copy. |
{
"type": "object",
"allOf": [
{
"if": {
"required": [
"method"
],
"properties": {
"method": {
"const": "collect"
}
}
},
"then": {
"required": [
"entries"
],
"properties": {
"entries": {
"minItems": 1
}
}
}
},
{
"if": {
"required": [
"estimate_only"
],
"properties": {
"estimate_only": {
"const": true
}
}
},
"else": {
"properties": {
"signers": {
"items": {
"required": [
"id"
]
}
}
}
}
}
],
"required": [
"signers",
"document_id"
],
"properties": {
"message": {
"type": "string",
"description": "Text included in the invitation email."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"step": {
"type": "integer",
"minimum": 1
},
"verification_method": {
"enum": [
"Email",
"Whatsapp",
"DigitalCertificate",
"IdDocumentFaceMatchBasic"
],
"type": "string",
"example": "Email",
"description": "How the signer's identity is verified before signing. `Email` (default) sends a one-time code to the signer's email; `Whatsapp` sends the code over WhatsApp — the verification itself is not billed, but it requires the WhatsApp notification channel, so the signer costs 0.45 credits (available only on paid subscriptions); `DigitalCertificate` has the signer sign with their own ICP-Brasil certificate (A1/A3) — it requires `method: virtual`, the Digital Certificate feature, a CPF or CNPJ in `government_id`, must be alone in its signing step, and is charged 0.5 credits per signer. A CPF requires that person's certificate (an e-CPF, or an e-CNPJ naming them as legal representative); a CNPJ requires an e-CNPJ for that company, from any of its representatives. `IdDocumentFaceMatchBasic` verifies the signer from a photo of their government ID, a photo of them holding it and a liveness check — it requires the ID Document + Face Match feature, the signer must have a valid CPF in `government_id`, and is charged a per-signer fee. Omit to default to `Email`."
},
"notification_methods": {
"type": "array",
"items": {
"enum": [
"Email",
"Whatsapp"
],
"type": "string"
},
"example": [
"Email"
],
"maxItems": 1,
"description": "How the signer is told a signature is being requested. **Exactly one method per signer** — the array shape is historical, and sending two returns `400`. The method must also be compatible with `verification_method`: `Email` verification takes `Email`, `Whatsapp` verification takes `Whatsapp`, and `DigitalCertificate` and `IdDocumentFaceMatchBasic` take either. WhatsApp incurs an additional cost and is available only on paid subscriptions. Omit it to have it inferred from `verification_method`, or `{\"Email\"}` when neither is sent. See **Verification & Notification Methods** for the full pairing table."
}
},
"additionalProperties": false
},
"minItems": 1
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "ISO 8601; default is no expiration. Must be at least one hour in the future."
},
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
},
"copy_receivers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Signer IDs that only receive a copy."
}
},
"additionalProperties": false
}Update a document's name. Only allowed before any assignment is created (i.e. while the document is in `uploaded` or `metadata_ready` status and has no signers yet); once the signature process has started or the document is certificated, the name is locked. The name is normalized: diacritics are removed and unsupported characters are replaced with dashes.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| document_id* | string | Document ID. |
{
"type": "object",
"required": [
"name",
"document_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1
},
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
}
},
"additionalProperties": false
}Send one reminder to a pending signer in the assignment's active step, after confirming with assinafy_get_document that they have not signed. May consume notification credits; never repeat a reminder only because progress is unchanged.
| Argument | Type | Description |
|---|---|---|
| signer_id* | string | unique signer ID to notify |
| document_id* | string | unique document ID |
| assignment_id* | string | unique assignment ID |
| estimate_only | boolean | preview the reminder cost and balances without notifying the signer |
{
"type": "object",
"required": [
"document_id",
"assignment_id",
"signer_id"
],
"properties": {
"signer_id": {
"type": "string",
"description": "unique signer ID to notify"
},
"document_id": {
"type": "string",
"description": "unique document ID"
},
"assignment_id": {
"type": "string",
"description": "unique assignment ID"
},
"estimate_only": {
"type": "boolean",
"description": "preview the reminder cost and balances without notifying the signer"
}
},
"additionalProperties": false
}Preview an assinafy_create_assignment call without sending anything: same arguments, checked against the document and signers. Use it when the user wants to review before sending. Apps-capable hosts render a card whose Send button performs the request; other clients get the summary as text, and the request is sent only after the user confirms.
| Argument | Type | Description |
|---|---|---|
| method* | string | |
| entries | array | Required for `collect`: field placements per page. |
| message | string | Text included in the invitation email. |
| signers* | array | |
| expires_at | string | ISO 8601; default is no expiration. Must be at least one hour in the future. |
| document_id* | string | Document ID. |
| copy_receivers | array | Signer IDs that only receive a copy. |
{
"type": "object",
"allOf": [
{
"if": {
"required": [
"method"
],
"properties": {
"method": {
"const": "collect"
}
}
},
"then": {
"required": [
"entries"
],
"properties": {
"entries": {
"minItems": 1
}
}
}
},
{
"if": {
"required": [
"estimate_only"
],
"properties": {
"estimate_only": {
"const": true
}
}
},
"else": {
"properties": {
"signers": {
"items": {
"required": [
"id"
]
}
}
}
}
}
],
"required": [
"method",
"signers",
"document_id"
],
"properties": {
"method": {
"enum": [
"virtual",
"collect"
],
"type": "string",
"default": "virtual"
},
"entries": {
"type": "array",
"items": {
"type": "object",
"required": [
"page_id",
"fields"
],
"properties": {
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"signer_id",
"field_id",
"display_settings"
],
"properties": {
"field_id": {
"type": "string"
},
"signer_id": {
"type": "string"
},
"display_settings": {
"type": "object",
"required": [
"left",
"top",
"width",
"height",
"fontSize"
],
"properties": {
"top": {
"type": "number",
"format": "float",
"minimum": 0,
"description": "Vertical distance from the page's top edge, in page-image pixels."
},
"left": {
"type": "number",
"format": "float",
"minimum": 0,
"description": "Horizontal distance from the page's left edge, in page-image pixels."
},
"width": {
"type": "number",
"format": "float",
"description": "Width of the placement rectangle, in page-image pixels.",
"exclusiveMinimum": 0
},
"height": {
"type": "number",
"format": "float",
"description": "Height of the placement rectangle, in page-image pixels.",
"exclusiveMinimum": 0
},
"fontSize": {
"type": "number",
"format": "float",
"description": "Font size in the 150-DPI page-image coordinate system.",
"exclusiveMinimum": 0
},
"fontFamily": {
"type": "string",
"description": "Font-family presentation metadata."
},
"backgroundColor": {
"type": "string",
"description": "CSS-compatible background-color presentation metadata."
}
},
"description": "A field placement rectangle on a document page. Geometry values are pixels in Assinafy's 150-DPI page image, measured from the upper-left corner. Clients must keep the rectangle within the selected page's width and height; the API does not clamp out-of-bounds values.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"minItems": 1
},
"page_id": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Required for `collect`: field placements per page."
},
"message": {
"type": "string",
"description": "Text included in the invitation email."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"step": {
"type": "integer",
"minimum": 1
},
"verification_method": {
"enum": [
"Email",
"Whatsapp",
"DigitalCertificate",
"IdDocumentFaceMatchBasic"
],
"type": "string",
"example": "Email",
"description": "How the signer's identity is verified before signing. `Email` (default) sends a one-time code to the signer's email; `Whatsapp` sends the code over WhatsApp — the verification itself is not billed, but it requires the WhatsApp notification channel, so the signer costs 0.45 credits (available only on paid subscriptions); `DigitalCertificate` has the signer sign with their own ICP-Brasil certificate (A1/A3) — it requires `method: virtual`, the Digital Certificate feature, a CPF or CNPJ in `government_id`, must be alone in its signing step, and is charged 0.5 credits per signer. A CPF requires that person's certificate (an e-CPF, or an e-CNPJ naming them as legal representative); a CNPJ requires an e-CNPJ for that company, from any of its representatives. `IdDocumentFaceMatchBasic` verifies the signer from a photo of their government ID, a photo of them holding it and a liveness check — it requires the ID Document + Face Match feature, the signer must have a valid CPF in `government_id`, and is charged a per-signer fee. Omit to default to `Email`."
},
"notification_methods": {
"type": "array",
"items": {
"enum": [
"Email",
"Whatsapp"
],
"type": "string"
},
"example": [
"Email"
],
"maxItems": 1,
"description": "How the signer is told a signature is being requested. **Exactly one method per signer** — the array shape is historical, and sending two returns `400`. The method must also be compatible with `verification_method`: `Email` verification takes `Email`, `Whatsapp` verification takes `Whatsapp`, and `DigitalCertificate` and `IdDocumentFaceMatchBasic` take either. WhatsApp incurs an additional cost and is available only on paid subscriptions. Omit it to have it inferred from `verification_method`, or `{\"Email\"}` when neither is sent. See **Verification & Notification Methods** for the full pairing table."
}
},
"additionalProperties": false
},
"minItems": 1
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "ISO 8601; default is no expiration. Must be at least one hour in the future."
},
"document_id": {
"type": "string",
"minLength": 1,
"description": "Document ID."
},
"copy_receivers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Signer IDs that only receive a copy."
}
},
"additionalProperties": false
}Upload a new PDF, wait for processing and invite signers by full name and email, using Email verification and notification. This sends invitations and uses plan allowance: use only recipients the user authorized. After a partial failure, inspect the retained document ID and continue with assinafy_create_assignment instead of uploading again.
| Argument | Type | Description |
|---|---|---|
| message | string | invitation message shown to signers |
| signers* | null | array | one or more signers to create or reuse and request signatures from |
| file_name* | string | PDF filename including the .pdf extension |
| poll_secs | integer | polling interval in seconds (default 2; cannot exceed max_wait_secs) |
| account_id | string | account ID; uses the request or server default if omitted |
| expires_at | string | assignment expiry timestamp in RFC 3339 format |
| file_base64* | string | base64-encoded PDF bytes (max 25 MB decoded) |
| estimate_only | boolean | upload and prepare the PDF, then return cost and document ID without creating contacts or sending invitations; reuse that ID to send |
Change when an existing signature request expires, using an RFC 3339 timestamp. Assinafy may refuse for requests that already expired.
| Argument | Type | Description |
|---|---|---|
| expires_at* | string | new expiry timestamp in RFC 3339 format |
| document_id* | string | unique document ID |
| assignment_id* | string | unique assignment ID |
{
"type": "object",
"required": [
"document_id",
"assignment_id",
"expires_at"
],
"properties": {
"expires_at": {
"type": "string",
"description": "new expiry timestamp in RFC 3339 format"
},
"document_id": {
"type": "string",
"description": "unique document ID"
},
"assignment_id": {
"type": "string",
"description": "unique assignment ID"
}
},
"additionalProperties": false
}Show a status card for one known document: its status, who has signed, who is still pending and when it expires. Apps-capable hosts render it with a reminder button; other clients get the same summary as text. Resolve the document with assinafy_list_documents first.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | unique document ID |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"document_id": {
"type": "string",
"description": "unique document ID"
}
},
"additionalProperties": false
}Update a signer's information. **Verification integrity:** `email` / `whatsapp_phone_number` cannot be changed while the signer has verified that channel on an in-flight (not yet certificated) document — the response is `400` naming the offending document(s). Already-certificated documents do not block updates. Changing a channel that has *unverified* in-flight requests rotates their access/verification codes (invalidating previously sent links/OTPs); use the resend endpoint to redeliver. `full_name` can always be updated.
| Argument | Type | Description |
|---|---|---|
| string | ||
| full_name | string | |
| signer_id* | string | The signer ID. |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
| government_id | string | Signer's CPF (11 digits) or CNPJ (14 characters; may be alphanumeric). Formatting is accepted and the value is normalized on save. Required before the signer can use a verification method that identifies them by CPF. |
| whatsapp_phone_number | string | E.164; normalized on save. |
{
"type": "object",
"anyOf": [
{
"required": [
"full_name"
]
},
{
"required": [
"email"
]
},
{
"required": [
"whatsapp_phone_number"
]
},
{
"required": [
"government_id"
]
}
],
"required": [
"signer_id"
],
"properties": {
"email": {
"type": "string",
"format": "email"
},
"full_name": {
"type": "string",
"minLength": 1
},
"signer_id": {
"type": "string",
"minLength": 1,
"description": "The signer ID."
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
},
"government_id": {
"type": "string",
"description": "Signer's CPF (11 digits) or CNPJ (14 characters; may be alphanumeric). Formatting is accepted and the value is normalized on save. Required before the signer can use a verification method that identifies them by CPF."
},
"whatsapp_phone_number": {
"type": "string",
"description": "E.164; normalized on save."
}
},
"additionalProperties": false
}Upload a PDF without sending invitations and return its document ID. Use it when the user wants to prepare a document now and send it later with assinafy_create_assignment. Never upload again when a document ID is already known.
| Argument | Type | Description |
|---|---|---|
| file_name* | string | PDF filename including .pdf |
| account_id | string | authorized workspace; discovered through OAuth when omitted |
| file_base64* | string | base64 PDF bytes, at most 25 MiB decoded |
{
"type": "object",
"required": [
"file_name",
"file_base64"
],
"properties": {
"file_name": {
"type": "string",
"description": "PDF filename including .pdf"
},
"account_id": {
"type": "string",
"description": "authorized workspace; discovered through OAuth when omitted"
},
"file_base64": {
"type": "string",
"description": "base64 PDF bytes, at most 25 MiB decoded"
}
},
"additionalProperties": false
}Validate one or more input values against existing field definitions without creating a document or requesting signatures. Supply field/value pairs in values; the server sends the documented JSON array. Check each result's success before requesting signatures.
| Argument | Type | Description |
|---|---|---|
| values* | array | Field/value pairs to validate; sent to Assinafy as the JSON request array. |
| account_id | string | Authorized workspace; discovered from OAuth when omitted. |
{
"type": "object",
"required": [
"values"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_id",
"value"
],
"properties": {
"value": {
"description": "The input value to validate."
},
"field_id": {
"type": "string",
"description": "The field definition ID."
}
},
"additionalProperties": false
},
"description": "Field/value pairs to validate; sent to Assinafy as the JSON request array."
},
"account_id": {
"type": "string",
"minLength": 1,
"description": "Authorized workspace; discovered from OAuth when omitted."
}
},
"additionalProperties": false
}Verify a signed document using its actual Assinafy SHA-1 signature hash. Public lookup; requires no workspace connection and sends no credential upstream.
| Argument | Type | Description |
|---|---|---|
| hash* | string | SHA-1 signature hash of the signed document |
{
"type": "object",
"required": [
"hash"
],
"properties": {
"hash": {
"type": "string",
"description": "SHA-1 signature hash of the signed document"
}
},
"additionalProperties": false
}| boolean |
| preview cost and balances for the given roles without creating contacts, documents or invitations; roles alone are sufficient |
{
"type": "object",
"required": [
"template_id",
"signers"
],
"properties": {
"name": {
"type": "string",
"description": "custom document name"
},
"tags": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "tag names, merged with the template's defaults"
},
"message": {
"type": "string",
"description": "signing invitation message"
},
"signers": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"role_id"
],
"properties": {
"id": {
"type": "string",
"description": "existing signer ID; use instead of full_name and email"
},
"step": {
"type": [
"null",
"integer"
],
"description": "signing order, contiguous from 1; all signers must set it if any does"
},
"email": {
"type": "string",
"description": "signer's email address, required when id is omitted; existing exact matches are reused"
},
"role_id": {
"type": "string",
"description": "template role ID"
},
"full_name": {
"type": "string",
"description": "signer's full name; required when id is omitted"
},
"verification_method": {
"type": "string",
"description": "Email (default), Whatsapp, DigitalCertificate (A1/A3, virtual templates without placed fields only), or IdDocumentFaceMatchBasic (ID photo and liveness)"
},
"notification_methods": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "at most one channel: Email or Whatsapp; inferred from verification_method when omitted"
}
},
"additionalProperties": false
},
"description": "one signer per template role, each by ID or by name and email"
},
"account_id": {
"type": "string",
"description": "account ID; uses request routing if omitted"
},
"expires_at": {
"type": "string",
"description": "assignment expiry in RFC 3339 format"
},
"template_id": {
"type": "string",
"description": "template ID"
},
"editor_fields": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"field_id",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "value to bake into the generated document"
},
"field_id": {
"type": "string",
"description": "template editor field ID"
}
},
"additionalProperties": false
},
"description": "template editor field values"
},
"estimate_only": {
"type": "boolean",
"description": "preview cost and balances for the given roles without creating contacts, documents or invitations; roles alone are sufficient"
}
},
"additionalProperties": false
}| max_wait_secs | integer | maximum seconds to wait for PDF processing (default 30; max 600) |
{
"type": "object",
"required": [
"file_name",
"file_base64",
"signers"
],
"properties": {
"message": {
"type": "string",
"description": "invitation message shown to signers"
},
"signers": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"full_name",
"email"
],
"properties": {
"email": {
"type": "string",
"description": "signer's email address; existing exact matches are reused"
},
"full_name": {
"type": "string",
"description": "signer's full name"
}
},
"additionalProperties": false
},
"description": "one or more signers to create or reuse and request signatures from"
},
"file_name": {
"type": "string",
"description": "PDF filename including the .pdf extension"
},
"poll_secs": {
"type": "integer",
"description": "polling interval in seconds (default 2; cannot exceed max_wait_secs)"
},
"account_id": {
"type": "string",
"description": "account ID; uses the request or server default if omitted"
},
"expires_at": {
"type": "string",
"description": "assignment expiry timestamp in RFC 3339 format"
},
"file_base64": {
"type": "string",
"description": "base64-encoded PDF bytes (max 25 MB decoded)"
},
"estimate_only": {
"type": "boolean",
"description": "upload and prepare the PDF, then return cost and document ID without creating contacts or sending invitations; reuse that ID to send"
},
"max_wait_secs": {
"type": "integer",
"description": "maximum seconds to wait for PDF processing (default 30; max 600)"
}
},
"additionalProperties": false
}