Skip to main content

Webhook Events

faktoora sends HTTP POST requests to your registered endpoint when document events occur. The action value identifies the event and is the same value used to subscribe.

ActionTrigger
invoiceCreateOutgoing invoice created
invoiceSentOutgoing invoice sent via email
invoiceOverdueInvoice marked overdue by the daily cron
invoiceIncomingCreateIncoming invoice created or validated
invoiceIncomingSentIncoming invoice forwarded via email
offerCreateQuotation (offer) created
offerSentOffer sent via email
letterCreateLetter document created
letterSentLetter sent via email
reminderCreateReminder (dunning notice) created
reminderSentReminder sent via email
orderConfirmationCreateOrder confirmation created
orderConfirmationSentOrder confirmation sent via email
customerCreateCustomer created
productCreateProduct created
validationJobCompletedE-invoice validation job finished

Managing Webhooks

Register, update, and delete webhook subscriptions via the /webhooks management API.

All webhook management endpoints require apiKeyAuth.

EndpointMethodDescription
GET /webhooksGETList all registered webhook subscriptions.
POST /webhooksPOSTRegister a new webhook subscription.
PATCH /webhooks/{id}PATCHUpdate an existing webhook subscription. {id} is a UUID.
DELETE /webhooks/{id}DELETERemove a webhook subscription. Returns { "succeed": true }.

The action field accepts any value from the event table above.

Target URL requirements

The target URL must resolve to a publicly reachable address. The API performs a DNS-resolution check at registration time and rejects targets that resolve to:

  • Loopback addresses (e.g. http://localhost/..., http://127.0.0.1/...)
  • RFC 1918 private ranges (e.g. http://192.168.x.x/..., http://10.x.x.x/..., http://172.16-31.x.x/...)
  • Unresolvable / reserved TLDs (.invalid, .local, etc.)
  • Other blocked / internal IPs

A rejected target returns:

{ "code": "BAD_REQUEST", "statusCode": 400, "message": "URL resolves to blocked/internal IP" }

If you host your endpoint behind internal DNS, expose it via a public proxy before subscribing.

Example: Register a webhook
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"action": "invoiceCreate",
"target": "https://your-endpoint.example.com/hook"
}' \
https://api.faktoora.com/api/v1/webhooks

Response (200 OK)

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"action": "invoiceCreate",
"target": "https://your-endpoint.example.com/hook",
"createdAt": "2026-05-26T13:55:02.970Z",
"updatedAt": "2026-05-26T13:55:02.970Z"
}

The id field is a UUID. Use it in PATCH and DELETE requests.

Example: Update a webhook
curl -X PATCH \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"action": "invoiceCreate",
"target": "https://new-endpoint.example.com/hook"
}' \
https://api.faktoora.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000
Example: Delete a webhook
curl -X DELETE \
-H "X-API-KEY: your-api-token" \
https://api.faktoora.com/api/v1/webhooks/550e8400-e29b-41d4-a716-446655440000

Response (200 OK)

{ "succeed": true }

Event Details

invoiceCreate

{
"faktooraId": "<string>",
"action": "invoiceCreate",
"payload": {
"faktooraId": "<string>",
"amount": "<number>",
"outstandingBalance": "<number>",
"currency": "<string>",
"invoiceNumber": "<string>",
"invoiceTypeCode": "<number>",
"status": "<string>",
"format": "<string>",
"issueDate": "<string>",
"dueDate": "<string>",
"deliveryDate": "<string>",
"orderNumber": "<string>",
"shippingOrderNumber": "<string>",
"contractNumber": "<string>",
"assignmentNumber": "<string>",
"orderReferenceId": "<string>",
"buyerReferenceId": "<string>",
"mandateReference": "<string>",
"projectName": "<string>",
"totalCosts": "<number>",
"createdAt": "<string>",
"detailsPage": "<string>"
}
}

invoiceOverdue

{
"trigger": {
"outputFields": {
"invoice": { /* full invoice object */ },
"detailsPage": "<string>"
}
}
}

invoiceSent

{
"action": "invoiceSent",
"faktooraId": "<string>",
"payload": {
"id": "<invoiceId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

invoiceIncomingCreate

{
"action": "invoiceIncomingCreate",
"payload": {
"id": "<invoiceIncomingId>",
"importId": "<string>",
"amount": "<number>",
"taxAmount": "<number>",
"outstandingBalance": "<number>",
"invoiceCurrencyCode": "<string>",
"invoiceNumber": "<string>",
"issueDate": "<string>",
"dueDate": "<string>",
"paymentDate": "<string>",
"sellerName": "<string>",
"type": "<string>",
"inputType": "<string>",
"buyerReference": "<string>",
"isValid": "<boolean>",
"createdAt": "<string>",
"detailsPage": "<string>"
}
}

invoiceIncomingSent

{
"action": "invoiceIncomingSent",
"payload": {
"id": "<invoiceIncomingId>",
"detailsPage": "<string>"
}
}

offerCreate

{
"action": "offerCreate",
"faktooraId": "<string>",
"payload": {
"id": "<offerId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

offerSent

{
"action": "offerSent",
"faktooraId": "<string>",
"payload": {
"id": "<offerId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

letterCreate

{
"action": "letterCreate",
"faktooraId": "<string>",
"payload": {
"id": "<letterId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

letterSent

{
"action": "letterSent",
"faktooraId": "<string>",
"payload": {
"id": "<letterId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

reminderCreate

{
"action": "reminderCreate",
"faktooraId": "<string>",
"payload": {
"id": "<reminderId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

reminderSent

{
"action": "reminderSent",
"faktooraId": "<string>",
"payload": {
"id": "<reminderId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

orderConfirmationCreate

{
"action": "orderConfirmationCreate",
"faktooraId": "<string>",
"payload": {
"id": "<orderConfirmationId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

orderConfirmationSent

{
"action": "orderConfirmationSent",
"faktooraId": "<string>",
"payload": {
"id": "<orderConfirmationId>",
"faktooraId": "<string>",
"detailsPage": "<string>"
}
}

customerCreate

{
"action": "customerCreate",
"faktooraId": "<string>",
"payload": {
"id": "<customerId>",
"faktooraId": "<string>"
}
}

productCreate

{
"action": "productCreate",
"payload": {
"id": "<productId>"
}
}

Event Flow Diagram

A high-level sequence for outgoing invoice events: