SignDocs Brasil is the official WordPress plugin for legally-binding electronic signatures in Brazil. Embed signing flows on any page with a shortcode or Gutenberg block, send multi-signer envelopes (sequential or parallel), verify signed evidence directly from the WordPress admin, and track everything through an audit log with CSV export.
Built on top of the official SignDocs Brasil PHP SDK (signdocs-brasil/signdocs-brasil-php), the plugin leverages OAuth token caching shared across PHP-FPM workers, deterministic idempotency, webhook secret rotation with a grace window, and observability via RateLimit-* / Deprecation / Sunset response headers.
The plugin targets the Brazilian market (compliance with MP 2.200-2/2001, ICP-Brasil, NT65/ITI for INSS payroll loans), but works for any signing workflow worldwide. The signing UI itself is hosted on sign.signdocs.com.br, isolated from your WordPress install, so a compromised WordPress site cannot forge signatures.
.p7s or combined PDF download when completeclient_credentials (simple) or Private Key JWT ES256 (for regulated customers who cannot store shared secrets at rest)RateLimit-* headers captured for the dashboard widget; deprecation warnings (RFC 8594 Deprecation / Sunset) surface as admin notices[signdocs] and Gutenberg block to embed the signing button on any post or pagesigndocs_envelope for multi-signer workflows with a signer repeaterphp://output, safe for multi-GB exports)STEP.PURPOSE_DISCLOSURE_SENT, TRANSACTION.DEADLINE_APPROACHING)signdocs_manage, signdocs_send, signdocs_verify, signdocs_view_logs) automatically granted to administrator / editor / authorwp signdocs health | send | status | webhook-test | log-tail) for shell automationwp_optionsX-SignDocs-Webhook-IdWpTransientTokenCache implements the SDK’s TokenCacheInterface) — a single token reused by every PHP-FPM workersign.signdocs.com.br (signing never happens inside your WordPress site — this isolates your install from any compromise).p7m evidence package becomes available for download and verificationAdd to any page or post:
[signdocs document_id="123" policy="CLICK_ONLY" button_text="Sign Contract"]
With name / email / CPF form:
[signdocs document_id="123" show_form="true" policy="CLICK_PLUS_OTP"]
Available attributes:
document_id (required) — ID of the PDF attachment in the media librarypolicy — one of: CLICK_ONLY, CLICK_PLUS_OTP, BIOMETRIC, BIOMETRIC_PLUS_OTP, DIGITAL_CERTIFICATE, BIOMETRIC_SERPRO, BIOMETRIC_SERPRO_AUTO_FALLBACKlocale — language: pt-BR, en, esmode — embed mode: redirect (default), popup, overlaybutton_text — button label (default: “Sign Document”)show_form — "true" to display name / email / CPF / CNPJ inputsreturn_url — URL to redirect to after signingclass — additional CSS class for the buttonFor contracts with more than one signer (for example, landlord + tenant + guarantor), use the Envelopes menu:
.p7s for non-PDF documents) becomes available for downloadThe webhook events STEP.STARTED, STEP.COMPLETED, and STEP.FAILED are recorded per signer in each envelope’s log.
The customer’s CPF or CNPJ must be present in the order. The plugin reads the standard
_billing_cpf/_billing_cnpjorder meta keys used by the Brazilian Market on WooCommerce extension. If neither is present, the plugin adds an order note explaining the requirement and skips session creation.
The Signatures > Verify page (requires the signdocs_verify capability):
evidence_id (single signature) or envelope_id (multi-signer)GET /v1/verify/{id} or GET /v1/verify/envelope/{id} and renders:
.p7m), signed PDF, consolidated .p7s (envelopes), combined PDF (envelopes)The Signatures > Audit Log page (requires the signdocs_view_logs capability):
{prefix}signdocs_logadmin-post.php (chunked streaming, safe for multi-GB exports)signdocs_prune_logs cronFor shell-based operations (useful for automation, CI/CD, and troubleshooting):
wp signdocs health
— check connectivity to the API in the configured environment
wp signdocs send --document=42 --email=alice@example.com --cpf=12345678901 --policy=CLICK_PLUS_OTP
— create a signing session from a WordPress attachment and print the session ID and URL
wp signdocs status <sessionId>
— look up the status of a session by ID
wp signdocs webhook-test <webhookId>
— send a test delivery to a registered webhook
wp signdocs log-tail --level=warning --limit=20
— show the last N entries of the audit log filtered by level
/wp-json/signdocs/v1/webhook endpoint accepts both secrets — in-flight deliveries are not rejectedsigndocs_expire_prev_secret cron removes the old secretAvailable hooks:
Session lifecycle:
signdocs_session_created — Session created (via the API, not necessarily via WordPress)signdocs_signing_completed — Signing completed successfullysigndocs_signing_cancelled — Signing cancelled by the integrator or the signersigndocs_signing_expired — Session expired without completionsigndocs_signing_failed — Signing failed (unrecoverable error)signdocs_transaction_fallback — Fallback was triggered (e.g., SERPRO unavailable)Per-step (for envelopes and custom flows):
signdocs_step_started — Step started (OTP sent, biometric capture, etc.)signdocs_step_completed — Step completedsigndocs_step_failed — Step failedsigndocs_purpose_disclosure_sent — (NT65) Purpose disclosure notification delivered to the beneficiarysigndocs_deadline_approaching — (NT65) ≤2 business days left before the INSS submission deadlineTenant / API:
signdocs_quota_warning — Tenant usage crossed a threshold (80 / 90 / 100%)signdocs_api_deprecation_notice — API signaled a deprecated endpointWooCommerce:
signdocs_wc_signing_completed — A WooCommerce order signing completedEach action receives $post_id (of the signdocs_signing or signdocs_envelope CPT) and $payload (the raw webhook array) as arguments, except signdocs_quota_warning and signdocs_api_deprecation_notice which receive only the payload.
Capabilities:
signdocs_manage — Configure credentials, webhook, branding; manage other users’ envelopessigndocs_send — Create sessions and envelopessigndocs_verify — Use the Verify page and inspect evidencesigndocs_view_logs — Access the audit log and export CSVUse current_user_can('signdocs_send') instead of manage_options / edit_posts when adding custom functionality.
PHP SDK:
The configured SDK client (with encrypted credentials and shared token cache) is available via:
$client = Signdocs_Client_Factory::get(); // SignDocsBrasil\Api\SignDocsBrasilClient or null
See the PHP SDK documentation for the full surface (transactions, envelopes, verification, users, documentGroups, webhooks, etc.).
This plugin connects to the SignDocs Brasil platform — operated by the same company that publishes the plugin — to create, deliver, and verify electronic signatures. The plugin cannot function without sending data to these endpoints, because the signing itself happens on the SignDocs servers (the WordPress site only orchestrates the request and stores the result reference).
Used to create signing sessions, register webhooks, verify signed evidence, and manage multi-signer envelopes. The plugin authenticates with the API credentials you enter in the WordPress admin (OAuth2 client_credentials, or alternatively Private Key JWT when configured).
CLICK_ONLY, BIOMETRIC), the language preference, an optional return URL, and metadata fields identifying the WordPress site URL and source surface (shortcode, AJAX, WP-CLI, WooCommerce, envelope).wp signdocs send from the WP-CLI, on WooCommerce order completion when the product is configured for signing, and on every envelope creation / new-signer add.GET /v1/signing-sessions/{id}), evidence verification (GET /v1/verify/{evidenceId}), envelope status. These send only the relevant identifier you provide (session ID, evidence ID, envelope ID).POST {baseUrl}/oauth2/token). The plugin sends your Client ID and either Client Secret or a signed JWT assertion (when Private Key JWT mode is configured) to that endpoint at first call and again when the cached token expires (typically once per hour per environment); the access token is cached in a WordPress transient and reused across all subsequent API calls. No signer data is sent to the token endpoint.api-hml.signdocs.com.br (HML / sandbox) by default, and api.signdocs.com.br only when the administrator explicitly switches the environment to “Production” in the settings page.A JavaScript file (signdocs-brasil.js) loaded from the SignDocs CDN that opens the signing popup, redirect, or overlay when the signer clicks the embedded “Sign Document” button rendered by the shortcode or Gutenberg block.
[signdocs] shortcode or the SignDocs Gutenberg block (the script is enqueued conditionally — pages without the block do not load it).signdocs_environment option as the API.After the signer clicks “Sign Document”, they are taken to the secure signing page on sign.signdocs.com.br — not to a page hosted by your WordPress site. The signing flow (OTP, biometric capture, digital-certificate selection, click-only confirmation) executes entirely on this domain. This isolation is intentional: even if your WordPress site were compromised, an attacker could not forge signatures because the authentication factors are collected on a separate origin under SignDocs Brasil’s control.