POST request to your URL when an event you subscribe to occurs.
Creating a subscription
Set up a subscription in Fintoro under Automatizácie → Fintoro API, or throughPOST /webhook-subscriptions with write permission. Choose a receiver URL and events. The API reference documents subscription management endpoints and parameters.
Securely store plainTextSecret from the 201 response to verify signatures. It is not returned in subscription details.
The URL must use HTTPS, resolve to a public IP address, and contain no credentials. It is validated when saving and before sending; an invalid URL ends delivery as failed.
Testing webhooks locally
We recommend a tunnel such as Cloudflare Tunnel or Expose. Set the tunnel’s public HTTPS URL in the subscription, including the receiver’s path, such as/webhooks/fintoro.
Request body
Illustrative event:id identifies the event, and resource.id identifies the record in Fintoro. occurredAt is the event’s creation time in UTC. Determine the company from your subscription configuration; the body does not include it.
Headers and signature
Compare signatures in constant time. Calculate the signature over the unchanged body, without reserializing JSON. The
webhook-id and webhook-timestamp headers are not signed.
Accepting and processing events
- Store the verified event in a durable queue or database inbox with atomic duplicate detection using
idfrom the body. - After storage, return
2xx, such as204 No Content. Acknowledge an already accepted event the same way, without adding it again. - Process the event outside the HTTP request. For example, for
invoices.updatedwith ID301, fetchGET /invoices/301.
2xx, your integration is responsible for retrying subsequent processing failures.
Redelivery
Fintoro retries a non-2xx response, timeout, or network error with the same event id.
After all attempts are exhausted, the delivery remains failed. Delivery failure does not automatically deactivate the subscription.
Changing a subscription
SettingisActive: false stops new deliveries. Already queued attempts may still run.
Changing the URL or events does not change the secret. Obtain a new one through POST /webhook-subscriptions/{id}/rotate-secret and update your receiver as well. Already queued requests may use the previous secret.
