@assinafy/piece-assinafy 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+
5
+ - New Event (Instant) registers a webhook endpoint of its own for each flow (1 per workspace, or up to 3 on paid plans) and deletes it when the flow is turned off. **Replace Existing Webhook** reuses the oldest endpoint when none is free.
6
+ - On API key connections, webhook deliveries are signed (Standard Webhooks) and deliveries with a missing or invalid signature, or a timestamp more than five minutes off, are ignored. The `webhook-id` header is the deduplication key.
7
+ - Workspaces with a single webhook address keep using it.
8
+ - Create Signer and the signer resolution of Request Signatures and Create Document from Template send the CPF/CNPJ in the create request.
9
+ - CPF/CNPJ validation accepts alphanumeric CNPJs.
10
+ - Digital certificate verification is labelled with its cost of 0.5 credit per signer (0.95 with a WhatsApp invitation).
11
+ - `npm run lint` checks formatting with Prettier, and the publishing workflow runs it.
12
+
3
13
  ## 0.1.3
4
14
 
5
15
  - HTTPS requests preserve Node.js certificate verification.
package/README.md CHANGED
@@ -282,7 +282,7 @@ Returns a list of signers:
282
282
 
283
283
  Saves a new signer in the workspace. **Request Signatures** creates missing signers on its own, so use this only to register people ahead of time. It fails when a signer with the same email already exists.
284
284
 
285
- - Endpoint: `POST /v1/accounts/{accountId}/signers`, then `PUT /v1/accounts/{accountId}/signers/{signerId}` when a CPF/CNPJ is given (the create endpoint does not accept it)
285
+ - Endpoint: `POST /v1/accounts/{accountId}/signers`
286
286
  - Inputs: **Full Name** (required), **Email**, **WhatsApp Number**, **CPF or CNPJ**
287
287
 
288
288
  Returns the signer shape shown in [Find Signers](#find-signers).
@@ -307,17 +307,20 @@ Every document, signer and template input in the actions above is a dropdown, se
307
307
  | Trigger | When it fires | Delivery |
308
308
  |---|---|---|
309
309
  | Document Signed | Every signer has signed and the signed PDF is ready, for signings completed after the flow was turned on | Checked every few minutes. Any number of flows can use it. |
310
- | New Event (Instant) | The selected Assinafy events happen: document signed by all, signer signed, signer declined, document cancelled, and more | Instant, through the workspace webhook |
310
+ | New Event (Instant) | The selected Assinafy events happen: document signed by all, signer signed, signer declined, document cancelled, and more | Instant, through a webhook endpoint registered for the flow |
311
311
 
312
- **New Event (Instant)** uses the workspace webhook (`GET/PUT /v1/accounts/{accountId}/webhooks/subscriptions`), and Assinafy delivers each workspace's events to a single address:
312
+ **New Event (Instant)** registers its own webhook endpoint (`/v1/accounts/{accountId}/webhooks/endpoints`):
313
313
 
314
- - Use it in only one active flow per workspace; add a Router step to handle several event types.
315
- - If the workspace already delivers events to another system, the flow does not start unless **Replace Existing Webhook** is turned on.
316
- - Turning the flow off stops the webhook, but only while it still points at that flow.
317
- - **Delivery Notice Email** receives Assinafy's notices about failed deliveries. It is required only when the workspace has no address yet.
314
+ - An Assinafy workspace has 1 webhook endpoint, or up to 3 on paid plans. Each active flow using this trigger takes one endpoint, named `Activepieces`; add a Router step to handle several event types in one flow.
315
+ - When every endpoint is taken, the flow does not start unless **Replace Existing Webhook** is turned on. That setting reuses the workspace's oldest endpoint, which then stops delivering to its current system.
316
+ - Turning the flow off deletes its endpoint, which frees the slot. An endpoint that no longer points at the flow is left alone.
317
+ - **Delivery Notice Email** receives Assinafy's notices about failed deliveries. When it is empty, the address of the flow's endpoint or of the oldest endpoint is used.
318
+ - On an API key connection the endpoint is created with signing on. Every delivery then carries a [Standard Webhooks](https://www.standardwebhooks.com) signature (`webhook-id`, `webhook-timestamp`, `webhook-signature`), and the flow ignores deliveries whose HMAC-SHA256 signature does not match the endpoint secret or whose timestamp is more than five minutes off. The flow reads the secret when it is turned on; after rotating the secret in Assinafy, turn the flow off and on again.
319
+ - Assinafy does not give OAuth applications the signing secret, so on an Assinafy Account connection the endpoint is created without signing.
320
+ - Each flow also registers its address with a random token, and requests without it are ignored. The token stays the same when the flow is republished or turned off and on, so deliveries already on their way still count.
318
321
  - For document events, the flow receives the current state of the document, read from the API when the event arrives. If it cannot be read (for example after the document was deleted), the copy sent with the event is used.
319
- - Assinafy retries a failed delivery once. Activepieces drops a repeated event that arrives within 30 seconds; for later repeats, `event_id` identifies the event.
320
- - Each flow registers its webhook address with a random secret, and requests without it are ignored. The secret stays the same when the flow is republished or turned off and on, so deliveries already on their way still count. Assinafy does not sign its webhook requests, so keep the address private.
322
+ - Assinafy retries a failed delivery once with the same `webhook-id`, which the flow uses as the deduplication key.
323
+ - Where the workspace supports only a single webhook address (the endpoints path answers `404`), the flow uses `/v1/accounts/{accountId}/webhooks/subscriptions` instead. It then refuses to take over an address that delivers to another system unless **Replace Existing Webhook** is on, and turning the flow off deactivates the address while it still points at the flow.
321
324
 
322
325
  The document is signed as soon as the last signer signs, but the signed PDF is available only after certification finishes. **Document Signed** fires after certification; **Download Document** also waits up to a minute while certification is still running.
323
326
 
@@ -330,9 +333,9 @@ The document is signed as soon as the last signer signs, but the signed PDF is a
330
333
  - A signer is matched by email, or by name and WhatsApp number when there is no email, so give the full name of a signer who has only a WhatsApp number. WhatsApp numbers match regardless of formatting, and a number without the country code matches the saved international number.
331
334
  - If nobody matches, a signer is created, which requires a full name.
332
335
  - A missing WhatsApp number is added to an existing signer. A WhatsApp number that differs from the saved one stops the step with an error instead of using the saved value.
333
- - A CPF/CNPJ is saved only when the signer is created. Assinafy does not show saved CPFs, so the step never changes the CPF of an existing signer; use **Update Signer** for that.
336
+ - A CPF/CNPJ is saved only when the signer is created; the step never changes the CPF/CNPJ of an existing signer. Use **Update Signer** for that.
334
337
  - Change saved details with **Update Signer**; changing a channel invalidates invitations that were already sent.
335
- - Every signer and copy recipient row is checked, and every one of them is looked up, before any signer is created or changed: a contact for the chosen channel, a valid CPF or CNPJ (including its check digits), no repeated email or WhatsApp number, no person reached twice through different details, and the signing order rules below.
338
+ - Every signer and copy recipient row is checked, and every one of them is looked up, before any signer is created or changed: a contact for the chosen channel, a valid CPF or CNPJ (including its check digits; CNPJs may be alphanumeric), no repeated email or WhatsApp number, no person reached twice through different details, and the signing order rules below.
336
339
 
337
340
  ## Verification and costs
338
341
 
@@ -342,8 +345,8 @@ Signers prove their identity while signing with one of four methods; A1 and A3 I
342
345
  |---|---|---|
343
346
  | Email code (default) | Email | Free |
344
347
  | WhatsApp code | WhatsApp | 0.45 credit (paid plans) |
345
- | ICP-Brasil digital certificate (A1 or A3) | Email | 2 credits |
346
- | ICP-Brasil digital certificate (A1 or A3) | WhatsApp | 2.45 credits |
348
+ | ICP-Brasil digital certificate (A1 or A3) | Email | 0.5 credit |
349
+ | ICP-Brasil digital certificate (A1 or A3) | WhatsApp | 0.95 credit (0.5 for the certificate signature plus 0.45 for the WhatsApp invitation) |
347
350
 
348
351
  When **Verification** is empty, it is email, or WhatsApp when the signer has only a WhatsApp number. Digital certificate signing needs the Digital Certificate feature on the Assinafy plan, the signer's CPF or CNPJ saved in Assinafy (given in the step when the signer is new, or set with **Update Signer**), and the signer alone in their signing order step. Every signature request also uses one document from the plan, or one credit when the allowance is used up.
349
352
 
@@ -533,6 +536,7 @@ Create Signer and Update Signer return:
533
536
  "full_name": "Maria Silva",
534
537
  "email": "maria@example.com",
535
538
  "whatsapp_phone_number": null,
539
+ "government_id": "39053344705",
536
540
  "has_accepted_terms": false
537
541
  }
538
542
  }
@@ -550,7 +554,7 @@ Their complete **signer output**, and each entry returned by Find Signers, is:
550
554
  }
551
555
  ```
552
556
 
553
- CPF/CNPJ is write-only in these responses. Find Signers returns an array of signer outputs, or `[]`.
557
+ The signer output leaves out the CPF/CNPJ. Find Signers returns an array of signer outputs, or `[]`.
554
558
 
555
559
  ### Action inputs and HTTP requests
556
560
 
@@ -861,19 +865,12 @@ HTTP: `POST /accounts/{accountId}/signers`:
861
865
  {
862
866
  "full_name": "Maria Silva",
863
867
  "email": "maria@example.com",
864
- "whatsapp_phone_number": "+5548999990000"
865
- }
866
- ```
867
-
868
- When government_id is supplied, HTTP then sends `PUT /accounts/{accountId}/signers/{createdSignerId}`:
869
-
870
- ```json
871
- {
868
+ "whatsapp_phone_number": "+5548999990000",
872
869
  "government_id": "390.533.447-05"
873
870
  }
874
871
  ```
875
872
 
876
- Both calls return the [signer payload](#signer-payload). The piece returns the final signer output. A failed follow-up update leaves the created signer in the workspace; use Update Signer to finish setting the CPF/CNPJ.
873
+ Empty inputs are left out. The call returns the [signer payload](#signer-payload), and the piece returns the signer output.
877
874
 
878
875
  #### Update Signer payload
879
876
 
@@ -950,16 +947,16 @@ Response body (example balances):
950
947
  "message": "",
951
948
  "data": {
952
949
  "documents": 1,
953
- "credits": 2,
950
+ "credits": 0.5,
954
951
  "needs_extra_document": false,
955
952
  "extra_document_cost": 0,
956
- "total_credits": 2,
953
+ "total_credits": 0.5,
957
954
  "breakdown": [
958
955
  {
959
956
  "code": "SignatureDigitalCertificate",
960
957
  "quantity": 1,
961
- "unit_cost": 2,
962
- "cost": 2,
958
+ "unit_cost": 0.5,
959
+ "cost": 0.5,
963
960
  "name": "Digital certificate signature"
964
961
  }
965
962
  ],
@@ -1007,7 +1004,60 @@ Each emitted item is the complete [document output](#document-payload), with sig
1007
1004
  }
1008
1005
  ```
1009
1006
 
1010
- Enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, then sends `PUT` to the same path:
1007
+ Enable lists `GET /accounts/{accountId}/webhooks/endpoints`. When no endpoint points at the flow, it sends `POST /accounts/{accountId}/webhooks/endpoints`; when one does, it sends `PUT /accounts/{accountId}/webhooks/endpoints/{endpointId}` with the same body:
1008
+
1009
+ ```json
1010
+ {
1011
+ "name": "Activepieces",
1012
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1013
+ "email": "ops@example.com",
1014
+ "events": [
1015
+ "document_ready",
1016
+ "signer_rejected_document"
1017
+ ],
1018
+ "is_active": true,
1019
+ "signing_enabled": true
1020
+ }
1021
+ ```
1022
+
1023
+ `signing_enabled` is `false` on an Assinafy Account connection. A `403` on create means every endpoint is taken; with **Replace Existing Webhook** on, the same body is sent with `PUT` to the oldest endpoint. The API returns the endpoint:
1024
+
1025
+ ```json
1026
+ {
1027
+ "status": 200,
1028
+ "message": "",
1029
+ "data": {
1030
+ "id": "65f1c2a9b3e4d5f60718293a4b5c6d7e",
1031
+ "name": "Activepieces",
1032
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1033
+ "email": "ops@example.com",
1034
+ "events": [
1035
+ "document_ready",
1036
+ "signer_rejected_document"
1037
+ ],
1038
+ "is_active": true,
1039
+ "signing_enabled": true,
1040
+ "created_at": "2026-10-01T12:00:00Z",
1041
+ "updated_at": "2026-10-01T12:00:00Z"
1042
+ }
1043
+ }
1044
+ ```
1045
+
1046
+ With signing on, enable then reads `GET /accounts/{accountId}/webhooks/endpoints/{endpointId}/secret` and keeps the secret in the flow store:
1047
+
1048
+ ```json
1049
+ {
1050
+ "status": 200,
1051
+ "message": "",
1052
+ "data": {
1053
+ "secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
1054
+ }
1055
+ }
1056
+ ```
1057
+
1058
+ Disable lists the endpoints and sends `DELETE /accounts/{accountId}/webhooks/endpoints/{endpointId}` for the endpoint that points at the flow (`data` is `[]`).
1059
+
1060
+ When the endpoints path answers `404`, enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, sends `PUT` to the same path and reads it back to verify the registration:
1011
1061
 
1012
1062
  ```json
1013
1063
  {
@@ -1016,12 +1066,20 @@ Enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, then sends `PUT
1016
1066
  "signer_rejected_document"
1017
1067
  ],
1018
1068
  "is_active": true,
1019
- "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-secret>",
1069
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1020
1070
  "email": "ops@example.com"
1021
1071
  }
1022
1072
  ```
1023
1073
 
1024
- The API returns the same fields under `data`, plus `updated_at`. The piece reads them back to verify registration. Disable reads the subscription and writes `is_active: false` while preserving its URL, events and email, only if the subscription still belongs to the flow. Example webhook POST delivered by Assinafy (the secret remains in the request query):
1074
+ Disable then reads the subscription and sends `PUT /accounts/{accountId}/webhooks/inactivate` only if it still points at the flow.
1075
+
1076
+ Example webhook POST delivered by Assinafy. The token stays in the request query, and a signed endpoint adds these headers:
1077
+
1078
+ ```http
1079
+ webhook-id: 9f86d081884c7d659a2feaa0c55ad015
1080
+ webhook-timestamp: 1788273130
1081
+ webhook-signature: v1,<base64 HMAC-SHA256 of "{webhook-id}.{webhook-timestamp}.{raw body}">
1082
+ ```
1025
1083
 
1026
1084
  ```json
1027
1085
  {
@@ -1066,7 +1124,7 @@ The output starts with these fields, plus **every** field from the complete [doc
1066
1124
  }
1067
1125
  ```
1068
1126
 
1069
- Payload keys become `detail_{key}`; nested values are JSON strings. For non-document events the document-prefixed scalars are null and `document_signers` is `[]`. Activepieces also receives a reserved deduplication key derived from `event_id`. Accepted event codes:
1127
+ Payload keys become `detail_{key}`; nested values are JSON strings. For non-document events the document-prefixed scalars are null and `document_signers` is `[]`. Activepieces also receives a reserved deduplication key: the `webhook-id` header, or `event_id` when the header is missing. Accepted event codes:
1070
1128
 
1071
1129
  `document_ready`, `signer_signed_document`, `signer_rejected_document`, `user_rejected_document`, `signer_viewed_document`, `signature_requested`, `assignment_created`, `document_uploaded`, `document_metadata_ready`, `document_prepared`, `document_processing_failed`, `signer_created`, `signer_email_verified`, `signer_whatsapp_verified`, `signer_data_confirmed`, `template_created`, `template_processed`, `template_processing_failed`.
1072
1130
 
@@ -1169,7 +1227,9 @@ Signer outputs: `id`, `full_name`, `email`, `whatsapp_phone_number`, `has_accept
1169
1227
  | `HTTP 401 … check the API key` | The key is wrong, was deleted, or belongs to the other environment. Create a new key or change **Environment**. |
1170
1228
  | `This API key can access N workspaces` | Set **Workspace ID** on the connection. |
1171
1229
  | `… is not available for this document yet` | The file does not exist yet, for example the signed PDF before everyone signs. |
1172
- | `This Assinafy workspace already sends its webhooks to …` | Another system receives the workspace events. Turn on **Replace Existing Webhook** only if that system no longer needs them, or use **Document Signed**. |
1230
+ | `Every webhook endpoint of this Assinafy workspace is already in use` | Delete an endpoint you no longer need under the workspace webhook settings in Assinafy, turn on **Replace Existing Webhook** to reuse the oldest one, or use **Document Signed**. |
1231
+ | `This Assinafy workspace already sends its webhooks to …` | The workspace has a single webhook address and another system receives its events. Turn on **Replace Existing Webhook** only if that system no longer needs them, or use **Document Signed**. |
1232
+ | New Event flow stopped receiving events after the signing secret was rotated | Turn the flow off and on again so it reads the new secret. |
1173
1233
  | `HTTP 403 … approved permissions` | The item belongs to another workspace or needs a different Assinafy role. On an OAuth connection, a missing permission also causes it: add the permission to the OAuth application and reconnect. Billing, members and credentials are never available to OAuth connections. |
1174
1234
  | `HTTP 401` on an OAuth connection that used to work | The access was revoked under **Connected apps** in Assinafy, the OAuth application was deleted or disabled, the app was approved again with different permissions, or the connection went 30 days without use. Reconnect. |
1175
1235
  | `… is saved in Assinafy with a different WhatsApp number` | Update the signer with **Update Signer**, or leave WhatsApp Number empty to use the saved number. |
@@ -1200,7 +1260,6 @@ Unit tests mock the HTTP client and block any real network request. One upload t
1200
1260
  - When two runs create the same new signer at the same moment, the run that loses reuses the signer the other one created.
1201
1261
  - Requests do not follow redirects automatically. A redirect is followed only for reads and downloads and only to an `https://` address, and the credentials are left out when it points outside the Assinafy address, for example to file storage.
1202
1262
  - Uploads use `form-data` with a filename, content type and multipart boundary handled by the Activepieces HTTP client.
1203
- - Assinafy's create-signer endpoint does not accept a CPF/CNPJ, so it is set with a follow-up update.
1204
1263
  - The piece requests 50 items per page. The API reference permits up to 100; list reads follow `X-Pagination-Page-Count` and stop at a short or repeated page.
1205
1264
  - The API reference documents no single-template endpoint, so the template form and action scan up to 500 templates.
1206
1265
  - **Document Signed** keeps its own state and keeps it when a flow is republished: the time it was turned on, the last completed check, the position of an unfinished backlog scan, and a ledger of documents it fired recently.
@@ -1223,11 +1282,13 @@ ASSINAFY_API_KEY=<sandbox key> npm run test:live
1223
1282
  | `ASSINAFY_ACCOUNT_ID` | Workspace to use when the key has several |
1224
1283
  | `ASSINAFY_LIVE_SEND=1` | Also sends an uploaded document and a ready one-signer template to `example.com` addresses (uses plan documents) |
1225
1284
  | `ASSINAFY_LIVE_REQUIRE_PAID_METHODS=1` | Requires all four cost estimates to succeed; otherwise explicit plan restrictions are checked |
1226
- | `ASSINAFY_LIVE_WEBHOOK=1` | Also enables and disables the workspace webhook; fails instead of replacing another destination |
1285
+ | `ASSINAFY_LIVE_WEBHOOK=1` | Also turns the New Event trigger on and off: a signed webhook endpoint where the workspace supports endpoints, otherwise the single webhook address, which it restores afterwards; fails instead of replacing another destination |
1227
1286
  | `ASSINAFY_LIVE_WEBHOOK_EMAIL` | Delivery notice address for the webhook check (defaults to an `example.com` address) |
1228
1287
 
1229
1288
  The suite also checks all four verification/notification cost requests, reads signing activities and downloads the available final PDF/ZIP artifacts from an existing signed document. The template sending check requires a ready template with one signer role and no editor fields. These API checks do not complete an OTP or A1/A3 signing session; that requires a recipient-controlled inbox/phone or a compatible certificate.
1230
1289
 
1290
+ The sandbox limits bursts of requests with HTTP 429; the suite waits for the time the response names and sends the request again.
1291
+
1231
1292
  ### Production OAuth tests
1232
1293
 
1233
1294
  After authorizing a temporary confidential app using the registered HTTPS callback and PKCE, store its token response outside the repository in a file readable only by you:
package/README.pt-BR.md CHANGED
@@ -282,7 +282,7 @@ Retorna uma lista de signatários:
282
282
 
283
283
  Salva um novo signatário no espaço de trabalho. **Request Signatures** cria os signatários ausentes por conta própria, então use esta ação apenas para cadastrar pessoas com antecedência. Ela falha quando já existe um signatário com o mesmo e-mail.
284
284
 
285
- - Endpoint: `POST /v1/accounts/{accountId}/signers` e depois `PUT /v1/accounts/{accountId}/signers/{signerId}` quando um CPF/CNPJ é informado (o endpoint de criação não o aceita)
285
+ - Endpoint: `POST /v1/accounts/{accountId}/signers`
286
286
  - Entradas: **Full Name** (obrigatório), **Email**, **WhatsApp Number**, **CPF or CNPJ**
287
287
 
288
288
  Retorna o formato de signatário mostrado em [Find Signers](#find-signers).
@@ -307,17 +307,20 @@ Toda entrada de documento, signatário e modelo nas ações acima é uma lista s
307
307
  | Gatilho | Quando dispara | Entrega |
308
308
  |---|---|---|
309
309
  | Document Signed | Todos os signatários assinaram e o PDF assinado está pronto, para assinaturas concluídas depois que o fluxo foi ativado | Verificado a cada poucos minutos. Qualquer número de fluxos pode usá-lo. |
310
- | New Event (Instant) | Os eventos da Assinafy escolhidos acontecem: documento assinado por todos, signatário assinou, signatário recusou, documento cancelado e outros | Instantânea, pelo webhook do espaço de trabalho |
310
+ | New Event (Instant) | Os eventos da Assinafy escolhidos acontecem: documento assinado por todos, signatário assinou, signatário recusou, documento cancelado e outros | Instantânea, por um endpoint de webhook registrado para o fluxo |
311
311
 
312
- **New Event (Instant)** usa o webhook do espaço de trabalho (`GET/PUT /v1/accounts/{accountId}/webhooks/subscriptions`), e a Assinafy entrega os eventos de cada espaço de trabalho para um único endereço:
312
+ **New Event (Instant)** registra o próprio endpoint de webhook (`/v1/accounts/{accountId}/webhooks/endpoints`):
313
313
 
314
- - Use-o em apenas um fluxo ativo por espaço de trabalho; adicione uma etapa Router para tratar vários tipos de evento.
315
- - Se o espaço de trabalho já entrega eventos para outro sistema, o fluxo não é iniciado a menos que **Replace Existing Webhook** esteja ativado.
316
- - Desativar o fluxo interrompe o webhook, mas apenas enquanto ele ainda aponta para esse fluxo.
317
- - **Delivery Notice Email** recebe os avisos da Assinafy sobre falhas de entrega. É obrigatório apenas quando o espaço de trabalho ainda não tem um endereço.
314
+ - Um espaço de trabalho da Assinafy tem 1 endpoint de webhook, ou até 3 nos planos pagos. Cada fluxo ativo que usa este gatilho ocupa um endpoint, chamado `Activepieces`; adicione uma etapa Router para tratar vários tipos de evento em um único fluxo.
315
+ - Quando todos os endpoints estão ocupados, o fluxo não é iniciado a menos que **Replace Existing Webhook** esteja ativado. Essa opção reutiliza o endpoint mais antigo do espaço de trabalho, que deixa de entregar para o sistema atual dele.
316
+ - Desativar o fluxo exclui o endpoint dele, o que libera a vaga. Um endpoint que não aponta mais para o fluxo não é alterado.
317
+ - **Delivery Notice Email** recebe os avisos da Assinafy sobre falhas de entrega. Quando fica em branco, é usado o endereço do endpoint do fluxo ou do endpoint mais antigo.
318
+ - Em uma conexão por chave de API, o endpoint é criado com assinatura ativada. Toda entrega traz então uma assinatura [Standard Webhooks](https://www.standardwebhooks.com) (`webhook-id`, `webhook-timestamp`, `webhook-signature`), e o fluxo ignora entregas cuja assinatura HMAC-SHA256 não corresponde ao segredo do endpoint ou cujo horário difere em mais de cinco minutos. O fluxo lê o segredo quando é ativado; depois de trocar o segredo na Assinafy, desative e ative o fluxo de novo.
319
+ - A Assinafy não fornece o segredo de assinatura a aplicações OAuth, então em uma conexão Assinafy Account o endpoint é criado sem assinatura.
320
+ - Cada fluxo também registra seu endereço com um token aleatório, e requisições sem ele são ignoradas. O token continua o mesmo quando o fluxo é republicado ou desativado e ativado de novo, então entregas já a caminho ainda valem.
318
321
  - Em eventos de documento, o fluxo recebe o estado atual do documento, lido da API quando o evento chega. Se ele não puder ser lido (por exemplo, depois que o documento foi excluído), é usada a cópia enviada com o evento.
319
- - A Assinafy tenta novamente uma entrega falha uma única vez. O Activepieces descarta um evento repetido que chega em até 30 segundos; para repetições posteriores, `event_id` identifica o evento.
320
- - Cada fluxo registra seu endereço de webhook com um segredo aleatório, e requisições sem ele são ignoradas. O segredo continua o mesmo quando o fluxo é republicado ou desativado e ativado de novo, então entregas já a caminho ainda valem. A Assinafy não assina suas requisições de webhook, então mantenha o endereço em sigilo.
322
+ - A Assinafy tenta novamente uma entrega falha uma única vez com o mesmo `webhook-id`, que o fluxo usa como chave de deduplicação.
323
+ - Quando o espaço de trabalho aceita apenas um endereço de webhook (o caminho de endpoints responde `404`), o fluxo usa `/v1/accounts/{accountId}/webhooks/subscriptions`. Nesse caso, ele se recusa a assumir um endereço que entrega para outro sistema a menos que **Replace Existing Webhook** esteja ativado, e desativar o fluxo inativa o endereço enquanto ele ainda aponta para o fluxo.
321
324
 
322
325
  O documento fica assinado assim que o último signatário assina, mas o PDF assinado só fica disponível depois que a certificação termina. **Document Signed** dispara depois da certificação; **Download Document** também aguarda até um minuto enquanto a certificação ainda está em andamento.
323
326
 
@@ -330,9 +333,9 @@ O documento fica assinado assim que o último signatário assina, mas o PDF assi
330
333
  - O signatário é identificado pelo e-mail, ou pelo nome e número de WhatsApp quando não há e-mail, então informe o nome completo de um signatário que tem apenas número de WhatsApp. Números de WhatsApp correspondem independentemente da formatação, e um número sem o código do país corresponde ao número internacional cadastrado.
331
334
  - Se ninguém corresponder, um signatário é criado, o que exige o nome completo.
332
335
  - Um número de WhatsApp ausente é adicionado a um signatário existente. Um número de WhatsApp diferente do cadastrado interrompe a etapa com um erro, em vez de usar o valor cadastrado.
333
- - O CPF/CNPJ só é salvo quando o signatário é criado. A Assinafy não mostra CPFs cadastrados, então a etapa nunca altera o CPF de um signatário existente; para isso, use **Update Signer**.
336
+ - O CPF/CNPJ só é salvo quando o signatário é criado; a etapa nunca altera o CPF/CNPJ de um signatário existente. Para isso, use **Update Signer**.
334
337
  - Altere dados cadastrados com **Update Signer**; alterar um canal invalida convites já enviados.
335
- - Toda linha de signatário e destinatário de cópia é verificada, e todos eles são consultados, antes de criar ou alterar qualquer signatário: um contato para o canal escolhido, um CPF ou CNPJ válido (incluindo os dígitos verificadores), nenhum e-mail ou número de WhatsApp repetido, nenhuma pessoa alcançada duas vezes por dados diferentes e as regras de ordem de assinatura abaixo.
338
+ - Toda linha de signatário e destinatário de cópia é verificada, e todos eles são consultados, antes de criar ou alterar qualquer signatário: um contato para o canal escolhido, um CPF ou CNPJ válido (incluindo os dígitos verificadores; CNPJs podem ser alfanuméricos), nenhum e-mail ou número de WhatsApp repetido, nenhuma pessoa alcançada duas vezes por dados diferentes e as regras de ordem de assinatura abaixo.
336
339
 
337
340
  ## Verificação e custos
338
341
 
@@ -342,8 +345,8 @@ Os signatários comprovam a identidade durante a assinatura com um de quatro mé
342
345
  |---|---|---|
343
346
  | Código por e-mail (padrão) | E-mail | Gratuito |
344
347
  | Código por WhatsApp | WhatsApp | 0,45 crédito (planos pagos) |
345
- | Certificado digital ICP-Brasil (A1 ou A3) | E-mail | 2 créditos |
346
- | Certificado digital ICP-Brasil (A1 ou A3) | WhatsApp | 2,45 créditos |
348
+ | Certificado digital ICP-Brasil (A1 ou A3) | E-mail | 0,5 crédito |
349
+ | Certificado digital ICP-Brasil (A1 ou A3) | WhatsApp | 0,95 crédito (0,5 pela assinatura com certificado mais 0,45 pelo convite por WhatsApp) |
347
350
 
348
351
  Quando **Verification** fica em branco, é usado o e-mail, ou o WhatsApp quando o signatário tem apenas número de WhatsApp. A assinatura com certificado digital exige o recurso Certificado Digital no plano da Assinafy, o CPF ou CNPJ do signatário cadastrado na Assinafy (informado na etapa quando o signatário é novo, ou definido com **Update Signer**) e o signatário sozinho na sua etapa da ordem de assinatura. Toda solicitação de assinatura também usa um documento do plano, ou um crédito quando a franquia acaba.
349
352
 
@@ -537,6 +540,7 @@ Create Signer and Update Signer return:
537
540
  "full_name": "Maria Silva",
538
541
  "email": "maria@example.com",
539
542
  "whatsapp_phone_number": null,
543
+ "government_id": "39053344705",
540
544
  "has_accepted_terms": false
541
545
  }
542
546
  }
@@ -554,7 +558,7 @@ Their complete **signer output**, and each entry returned by Find Signers, is:
554
558
  }
555
559
  ```
556
560
 
557
- CPF/CNPJ is write-only in these responses. Find Signers returns an array of signer outputs, or `[]`.
561
+ The signer output leaves out the CPF/CNPJ. Find Signers returns an array of signer outputs, or `[]`.
558
562
 
559
563
  ### Action inputs and HTTP requests
560
564
 
@@ -865,19 +869,12 @@ HTTP: `POST /accounts/{accountId}/signers`:
865
869
  {
866
870
  "full_name": "Maria Silva",
867
871
  "email": "maria@example.com",
868
- "whatsapp_phone_number": "+5548999990000"
869
- }
870
- ```
871
-
872
- When government_id is supplied, HTTP then sends `PUT /accounts/{accountId}/signers/{createdSignerId}`:
873
-
874
- ```json
875
- {
872
+ "whatsapp_phone_number": "+5548999990000",
876
873
  "government_id": "390.533.447-05"
877
874
  }
878
875
  ```
879
876
 
880
- Both calls return the [signer payload](#signer-payload). The piece returns the final signer output. A failed follow-up update leaves the created signer in the workspace; use Update Signer to finish setting the CPF/CNPJ.
877
+ Empty inputs are left out. The call returns the [signer payload](#signer-payload), and the piece returns the signer output.
881
878
 
882
879
  #### Update Signer payload
883
880
 
@@ -954,16 +951,16 @@ Response body (example balances):
954
951
  "message": "",
955
952
  "data": {
956
953
  "documents": 1,
957
- "credits": 2,
954
+ "credits": 0.5,
958
955
  "needs_extra_document": false,
959
956
  "extra_document_cost": 0,
960
- "total_credits": 2,
957
+ "total_credits": 0.5,
961
958
  "breakdown": [
962
959
  {
963
960
  "code": "SignatureDigitalCertificate",
964
961
  "quantity": 1,
965
- "unit_cost": 2,
966
- "cost": 2,
962
+ "unit_cost": 0.5,
963
+ "cost": 0.5,
967
964
  "name": "Digital certificate signature"
968
965
  }
969
966
  ],
@@ -1011,7 +1008,60 @@ Each emitted item is the complete [document output](#document-payload), with sig
1011
1008
  }
1012
1009
  ```
1013
1010
 
1014
- Enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, then sends `PUT` to the same path:
1011
+ Enable lists `GET /accounts/{accountId}/webhooks/endpoints`. When no endpoint points at the flow, it sends `POST /accounts/{accountId}/webhooks/endpoints`; when one does, it sends `PUT /accounts/{accountId}/webhooks/endpoints/{endpointId}` with the same body:
1012
+
1013
+ ```json
1014
+ {
1015
+ "name": "Activepieces",
1016
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1017
+ "email": "ops@example.com",
1018
+ "events": [
1019
+ "document_ready",
1020
+ "signer_rejected_document"
1021
+ ],
1022
+ "is_active": true,
1023
+ "signing_enabled": true
1024
+ }
1025
+ ```
1026
+
1027
+ `signing_enabled` is `false` on an Assinafy Account connection. A `403` on create means every endpoint is taken; with **Replace Existing Webhook** on, the same body is sent with `PUT` to the oldest endpoint. The API returns the endpoint:
1028
+
1029
+ ```json
1030
+ {
1031
+ "status": 200,
1032
+ "message": "",
1033
+ "data": {
1034
+ "id": "65f1c2a9b3e4d5f60718293a4b5c6d7e",
1035
+ "name": "Activepieces",
1036
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1037
+ "email": "ops@example.com",
1038
+ "events": [
1039
+ "document_ready",
1040
+ "signer_rejected_document"
1041
+ ],
1042
+ "is_active": true,
1043
+ "signing_enabled": true,
1044
+ "created_at": "2026-10-01T12:00:00Z",
1045
+ "updated_at": "2026-10-01T12:00:00Z"
1046
+ }
1047
+ }
1048
+ ```
1049
+
1050
+ With signing on, enable then reads `GET /accounts/{accountId}/webhooks/endpoints/{endpointId}/secret` and keeps the secret in the flow store:
1051
+
1052
+ ```json
1053
+ {
1054
+ "status": 200,
1055
+ "message": "",
1056
+ "data": {
1057
+ "secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
1058
+ }
1059
+ }
1060
+ ```
1061
+
1062
+ Disable lists the endpoints and sends `DELETE /accounts/{accountId}/webhooks/endpoints/{endpointId}` for the endpoint that points at the flow (`data` is `[]`).
1063
+
1064
+ When the endpoints path answers `404`, enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, sends `PUT` to the same path and reads it back to verify the registration:
1015
1065
 
1016
1066
  ```json
1017
1067
  {
@@ -1020,12 +1070,20 @@ Enable reads `GET /accounts/{accountId}/webhooks/subscriptions`, then sends `PUT
1020
1070
  "signer_rejected_document"
1021
1071
  ],
1022
1072
  "is_active": true,
1023
- "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-secret>",
1073
+ "url": "https://automations.example.com/webhooks/example-flow?assinafy_token=<random-token>",
1024
1074
  "email": "ops@example.com"
1025
1075
  }
1026
1076
  ```
1027
1077
 
1028
- The API returns the same fields under `data`, plus `updated_at`. The piece reads them back to verify registration. Disable reads the subscription and writes `is_active: false` while preserving its URL, events and email, only if the subscription still belongs to the flow. Example webhook POST delivered by Assinafy (the secret remains in the request query):
1078
+ Disable then reads the subscription and sends `PUT /accounts/{accountId}/webhooks/inactivate` only if it still points at the flow.
1079
+
1080
+ Example webhook POST delivered by Assinafy. The token stays in the request query, and a signed endpoint adds these headers:
1081
+
1082
+ ```http
1083
+ webhook-id: 9f86d081884c7d659a2feaa0c55ad015
1084
+ webhook-timestamp: 1788273130
1085
+ webhook-signature: v1,<base64 HMAC-SHA256 of "{webhook-id}.{webhook-timestamp}.{raw body}">
1086
+ ```
1029
1087
 
1030
1088
  ```json
1031
1089
  {
@@ -1070,7 +1128,7 @@ The output starts with these fields, plus **every** field from the complete [doc
1070
1128
  }
1071
1129
  ```
1072
1130
 
1073
- Payload keys become `detail_{key}`; nested values are JSON strings. For non-document events the document-prefixed scalars are null and `document_signers` is `[]`. Activepieces also receives a reserved deduplication key derived from `event_id`. Accepted event codes:
1131
+ Payload keys become `detail_{key}`; nested values are JSON strings. For non-document events the document-prefixed scalars are null and `document_signers` is `[]`. Activepieces also receives a reserved deduplication key: the `webhook-id` header, or `event_id` when the header is missing. Accepted event codes:
1074
1132
 
1075
1133
  `document_ready`, `signer_signed_document`, `signer_rejected_document`, `user_rejected_document`, `signer_viewed_document`, `signature_requested`, `assignment_created`, `document_uploaded`, `document_metadata_ready`, `document_prepared`, `document_processing_failed`, `signer_created`, `signer_email_verified`, `signer_whatsapp_verified`, `signer_data_confirmed`, `template_created`, `template_processed`, `template_processing_failed`.
1076
1134
 
@@ -1173,7 +1231,9 @@ Saídas de **New Event (Instant)**:
1173
1231
  | `HTTP 401 … check the API key` | A chave está errada, foi excluída ou pertence ao outro ambiente. Crie uma nova chave ou altere **Environment**. |
1174
1232
  | `This API key can access N workspaces` | Preencha **Workspace ID** na conexão. |
1175
1233
  | `… is not available for this document yet` | O arquivo ainda não existe, por exemplo o PDF assinado antes de todos assinarem. |
1176
- | `This Assinafy workspace already sends its webhooks to …` | Outro sistema recebe os eventos do espaço de trabalho. Ative **Replace Existing Webhook** apenas se esse sistema não precisar mais deles, ou use **Document Signed**. |
1234
+ | `Every webhook endpoint of this Assinafy workspace is already in use` | Exclua um endpoint de que você não precisa mais nas configurações de webhook do espaço de trabalho na Assinafy, ative **Replace Existing Webhook** para reutilizar o mais antigo, ou use **Document Signed**. |
1235
+ | `This Assinafy workspace already sends its webhooks to …` | O espaço de trabalho tem um único endereço de webhook e outro sistema recebe os eventos dele. Ative **Replace Existing Webhook** apenas se esse sistema não precisar mais deles, ou use **Document Signed**. |
1236
+ | O fluxo New Event parou de receber eventos depois que o segredo de assinatura foi trocado | Desative e ative o fluxo de novo para que ele leia o novo segredo. |
1177
1237
  | `HTTP 403 … approved permissions` | O item pertence a outro espaço de trabalho ou exige outro papel na Assinafy. Em uma conexão OAuth, uma permissão ausente também causa isso: adicione a permissão à aplicação OAuth e conecte novamente. Cobrança, membros e credenciais nunca estão disponíveis para conexões OAuth. |
1178
1238
  | `HTTP 401` em uma conexão OAuth que funcionava | O acesso foi revogado em **Connected apps** na Assinafy, a aplicação OAuth foi excluída ou desativada, o aplicativo foi aprovado de novo com permissões diferentes, ou a conexão ficou 30 dias sem uso. Conecte novamente. |
1179
1239
  | `… is saved in Assinafy with a different WhatsApp number` | Atualize o signatário com **Update Signer** ou deixe **WhatsApp Number** em branco para usar o número cadastrado. |
@@ -1204,7 +1264,6 @@ Os testes unitários simulam o cliente HTTP e bloqueiam qualquer acesso real à
1204
1264
  - Quando duas execuções criam o mesmo novo signatário ao mesmo tempo, a execução que perde reutiliza o signatário criado pela outra.
1205
1265
  - As requisições não seguem redirecionamentos automaticamente. Um redirecionamento só é seguido em leituras e downloads e apenas para um endereço `https://`, e as credenciais ficam de fora quando ele aponta para fora do endereço da Assinafy, por exemplo para o armazenamento de arquivos.
1206
1266
  - O envio usa `form-data` com nome de arquivo, tipo de conteúdo e boundary multipart definidos pelo cliente HTTP do Activepieces.
1207
- - O endpoint de criação de signatário da Assinafy não aceita CPF/CNPJ, então ele é definido com uma atualização em seguida.
1208
1267
  - A peça solicita 50 itens por página. A referência da API permite até 100; as leituras seguem `X-Pagination-Page-Count` e param em uma página incompleta ou repetida.
1209
1268
  - A referência da API não documenta um endpoint de modelo único, então o formulário e a ação de modelo percorrem até 500 modelos.
1210
1269
  - **Document Signed** mantém seu próprio estado e o preserva quando o fluxo é republicado: o momento em que foi ativado, a última verificação concluída, a posição de uma varredura de acúmulo em andamento e um registro dos documentos disparados recentemente.
@@ -1227,11 +1286,13 @@ ASSINAFY_API_KEY=<chave do sandbox> npm run test:live
1227
1286
  | `ASSINAFY_ACCOUNT_ID` | Espaço de trabalho a usar quando a chave tem vários |
1228
1287
  | `ASSINAFY_LIVE_SEND=1` | Também envia um documento e gera outro de um modelo pronto para endereços `example.com` (usa documentos do plano) |
1229
1288
  | `ASSINAFY_LIVE_REQUIRE_PAID_METHODS=1` | Exige sucesso nas quatro estimativas; sem essa variável, restrições explícitas do plano são verificadas |
1230
- | `ASSINAFY_LIVE_WEBHOOK=1` | Também ativa e desativa o webhook do espaço de trabalho; falha em vez de substituir outro destino |
1289
+ | `ASSINAFY_LIVE_WEBHOOK=1` | Também ativa e desativa o gatilho New Event: um endpoint de webhook assinado quando o espaço de trabalho aceita endpoints, ou então o endereço único de webhook, que é restaurado depois; falha em vez de substituir outro destino |
1231
1290
  | `ASSINAFY_LIVE_WEBHOOK_EMAIL` | Endereço de avisos de entrega para o teste do webhook (padrão: um endereço `example.com`) |
1232
1291
 
1233
1292
  O conjunto também verifica as quatro combinações de verificação/notificação, o histórico de assinatura e os arquivos finais PDF/ZIP disponíveis em um documento já assinado. O teste de modelo exige um modelo pronto com um papel de signatário e nenhum campo de editor. A conclusão de assinaturas por OTP ou A1/A3 exige acesso à caixa de e-mail/telefone do destinatário ou a um certificado compatível.
1234
1293
 
1294
+ O sandbox limita rajadas de requisições com HTTP 429; o conjunto aguarda o tempo indicado na resposta e envia a requisição novamente.
1295
+
1235
1296
  ### Testes OAuth em produção
1236
1297
 
1237
1298
  Autorize uma aplicação confidencial temporária com callback HTTPS e PKCE; salve a resposta de tokens em um arquivo privado fora do repositório:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assinafy/piece-assinafy",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Activepieces piece for Assinafy electronic signatures.",
5
5
  "license": "MIT",
6
6
  "author": "Assinafy",
package/src/i18n/pt.json CHANGED
@@ -127,10 +127,10 @@
127
127
  "Events": "Eventos",
128
128
  "Delivery Notice Email": "E-mail para Avisos de Entrega",
129
129
  "Replace Existing Webhook": "Substituir Webhook Existente",
130
- "Assinafy sends each workspace's events to **one** webhook address. Turning this flow on points that address at Activepieces, and turning it off stops delivery again.\n\n- Use this trigger in only one active flow per Assinafy workspace; add a Router step to handle several event types.\n- If the workspace already delivers events elsewhere, this flow will not start unless **Replace Existing Webhook** is on.\n- Need several independent flows? Use the **Document Signed** trigger, which checks Assinafy every few minu": "A Assinafy envia os eventos de cada espaço de trabalho para **um único** endereço de webhook. Ativar este fluxo aponta esse endereço para o Activepieces, e desativá-lo interrompe a entrega.\n\n- Use este gatilho em apenas um fluxo ativo por espaço de trabalho da Assinafy; adicione uma etapa Router para tratar vários tipos de evento.\n- Se o espaço de trabalho já entrega eventos para outro destino, este fluxo não será iniciado a menos que **Substituir Webhook Existente** esteja ativado.\n- Precisa de vários fluxos independentes? Use o gatilho **Documento Assinado**, que consulta a Assinafy a cada poucos minutos.",
130
+ "Turning this flow on registers a webhook endpoint for it in Assinafy, and turning it off removes that endpoint.\n\n- An Assinafy workspace has **1** webhook endpoint, or up to **3** on paid plans. When every endpoint is taken, this flow will not start unless **Replace Existing Webhook** is on, which reuses the oldest endpoint.\n- With an API key connection, Assinafy signs every delivery and the flow rejects deliveries whose signature does not match.\n- Where a workspace supports only its single webhook address,": "Ativar este fluxo registra um endpoint de webhook para ele na Assinafy, e desativá-lo remove esse endpoint.\n\n- Um workspace da Assinafy tem **1** endpoint de webhook, ou até **3** nos planos pagos. Quando todos os endpoints estão em uso, este fluxo não inicia a menos que **Substituir Webhook Existente** esteja ativado, o que reutiliza o endpoint mais antigo.\n- Com uma conexão por chave de API, a Assinafy assina cada entrega e o fluxo rejeita entregas cuja assinatura não confere.\n- Quando um workspace suporta apenas seu endereço de webhook único, o fluxo usa esse endereço, e **Substituir Webhook Existente** permite assumi-lo de outro sistema.\n- Precisa de mais fluxos independentes do que endpoints? Use o gatilho **Documento Assinado**, que consulta a Assinafy a cada poucos minutos.",
131
131
  "Which events start the flow. \"Document signed by all signers\" is the usual choice.": "Quais eventos iniciam o fluxo. \"Documento assinado por todos os signatários\" é a escolha mais comum.",
132
132
  "Assinafy emails this address about webhook delivery problems. Leave empty to keep the address already set in Assinafy.": "A Assinafy envia para este e-mail avisos sobre problemas na entrega do webhook. Deixe em branco para manter o endereço já configurado na Assinafy.",
133
- "Allow this flow to take over a webhook address that currently delivers to another system.": "Permite que este fluxo assuma o endereço de webhook que hoje entrega eventos para outro sistema.",
133
+ "When no webhook endpoint is free, allow this flow to take over the oldest one, which then stops delivering to its current system.": "Quando nenhum endpoint de webhook estiver livre, permite que este fluxo assuma o mais antigo, que deixa de entregar ao sistema atual.",
134
134
  "Document signed by all signers": "Documento assinado por todos os signatários",
135
135
  "Signer signed the document": "Signatário assinou o documento",
136
136
  "Signer declined the document": "Signatário recusou o documento",
@@ -127,10 +127,10 @@
127
127
  "Events": "Events",
128
128
  "Delivery Notice Email": "Delivery Notice Email",
129
129
  "Replace Existing Webhook": "Replace Existing Webhook",
130
- "Assinafy sends each workspace's events to **one** webhook address. Turning this flow on points that address at Activepieces, and turning it off stops delivery again.\n\n- Use this trigger in only one active flow per Assinafy workspace; add a Router step to handle several event types.\n- If the workspace already delivers events elsewhere, this flow will not start unless **Replace Existing Webhook** is on.\n- Need several independent flows? Use the **Document Signed** trigger, which checks Assinafy every few minu": "Assinafy sends each workspace's events to **one** webhook address. Turning this flow on points that address at Activepieces, and turning it off stops delivery again.\n\n- Use this trigger in only one active flow per Assinafy workspace; add a Router step to handle several event types.\n- If the workspace already delivers events elsewhere, this flow will not start unless **Replace Existing Webhook** is on.\n- Need several independent flows? Use the **Document Signed** trigger, which checks Assinafy every few minutes instead.",
130
+ "Turning this flow on registers a webhook endpoint for it in Assinafy, and turning it off removes that endpoint.\n\n- An Assinafy workspace has **1** webhook endpoint, or up to **3** on paid plans. When every endpoint is taken, this flow will not start unless **Replace Existing Webhook** is on, which reuses the oldest endpoint.\n- With an API key connection, Assinafy signs every delivery and the flow rejects deliveries whose signature does not match.\n- Where a workspace supports only its single webhook address,": "Turning this flow on registers a webhook endpoint for it in Assinafy, and turning it off removes that endpoint.\n\n- An Assinafy workspace has **1** webhook endpoint, or up to **3** on paid plans. When every endpoint is taken, this flow will not start unless **Replace Existing Webhook** is on, which reuses the oldest endpoint.\n- With an API key connection, Assinafy signs every delivery and the flow rejects deliveries whose signature does not match.\n- Where a workspace supports only its single webhook address, the flow uses that address, and **Replace Existing Webhook** allows taking it over from another system.\n- Need more independent flows than endpoints? Use the **Document Signed** trigger, which checks Assinafy every few minutes instead.",
131
131
  "Which events start the flow. \"Document signed by all signers\" is the usual choice.": "Which events start the flow. \"Document signed by all signers\" is the usual choice.",
132
132
  "Assinafy emails this address about webhook delivery problems. Leave empty to keep the address already set in Assinafy.": "Assinafy emails this address about webhook delivery problems. Leave empty to keep the address already set in Assinafy.",
133
- "Allow this flow to take over a webhook address that currently delivers to another system.": "Allow this flow to take over a webhook address that currently delivers to another system.",
133
+ "When no webhook endpoint is free, allow this flow to take over the oldest one, which then stops delivering to its current system.": "When no webhook endpoint is free, allow this flow to take over the oldest one, which then stops delivering to its current system.",
134
134
  "Document signed by all signers": "Document signed by all signers",
135
135
  "Signer signed the document": "Signer signed the document",
136
136
  "Signer declined the document": "Signer declined the document",