Skip to main content
Webhooks let you subscribe to Nuvion events and receive HTTP POST notifications when those events occur. Each webhook is scoped to the authenticated entity and can subscribe to specific event types or all events.

The Webhook object

id
string
Unique webhook identifier.
entity_id
string
The ID of the entity this webhook belongs to. Derived from the API key used to create it — not set directly.
url
string
The HTTPS endpoint Nuvion delivers events to. Must use the https protocol.
expires_in
number
Duration in seconds until the webhook expires. After expiry, no further events are delivered and the webhook status becomes inactive.
enabled_events
object
The set of events this webhook is subscribed to.
secret
string
Write-only. When set, Nuvion signs each delivery using an HMAC derived from this secret. The raw value is never returned after creation — store it securely before leaving the page. See Verifying signatures for how to validate incoming requests.
description
string
Optional short description to identify the webhook in the dashboard.
tags
string[]
Optional list of tags for organizing webhooks.
status
string
Webhook status. One of active or inactive. Defaults to active at creation.
stats
object
Read-only delivery statistics for this webhook.
Example
{
  "id": "wh_01HXYZ9900ABCD",
  "entity_id": "ent_01HXYZ1234ABCD",
  "url": "https://webhooks.example.com/nuvion",
  "expires_in": 31536000,
  "enabled_events": {
    "inflows": {
      "created": true,
      "completed": true,
      "failed": true,
      "cancelled": false,
      "refunded": false
    },
    "outflows": {
      "created": true,
      "completed": true,
      "failed": true,
      "cancelled": false,
      "refunded": false
    }
  },
  "description": "Production payment notifications",
  "tags": ["payments", "production"],
  "status": "active",
  "stats": {
    "total_webhooks_sent": 1482,
    "total_webhooks_successful": 1479,
    "total_webhooks_failed": 3,
    "last_webhook_event": 1744056000000
  }
}

Create a webhook

Registers a new webhook endpoint for the authenticated entity. POST /entity-webhooks
curl -X POST https://api.nuvion.dev/entity-webhooks \
  -H "Authorization: Bearer nv_test_abc123" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://webhooks.example.com/nuvion",
    "expires_in": 31536000,
    "enabled_events": {
      "inflows": {
        "created": true,
        "completed": true,
        "failed": true
      }
    }
  }'

Request parameters

url
string
required
The HTTPS endpoint Nuvion will POST events to. Must begin with https://. Invalid URLs or non-HTTPS URLs are rejected.
expires_in
number
required
Duration in seconds until the webhook expires. After expiry, deliveries stop and the webhook status becomes inactive.
enabled_events
object
required
The events to subscribe to. Set all: true to subscribe to every event type, or configure individual event groups. At least one event must be enabled.See the Webhook object for the full structure of this field.
secret
string
Signing secret used to generate an HMAC signature on each delivery. The value is stored as a SHA-512 hash and cannot be retrieved after creation. Store it before leaving the page.
description
string
Short description to identify the webhook.
tags
string[]
List of tags for organizing webhooks.
status
string
Initial status of the webhook. One of active or inactive. Defaults to active.

Response

Returns 201 Created with the new webhook object.
Response
{
  "status": "success",
  "message": "Webhook created successfully",
  "data": {
    "id": "wh_01HXYZ9900ABCD",
    "entity_id": "ent_01HXYZ1234ABCD",
    "url": "https://webhooks.example.com/nuvion",
    "expires_in": 31536000,
    "enabled_events": {
      "inflows": {
        "created": true,
        "completed": true,
        "failed": true,
        "cancelled": false,
        "refunded": false
      }
    },
    "description": "Production payment notifications",
    "tags": ["payments", "production"],
    "status": "active",
    "stats": {
      "total_webhooks_sent": 0,
      "total_webhooks_successful": 0,
      "total_webhooks_failed": 0,
      "last_webhook_event": null
    }
  }
}
The secret field is not returned in this response or any subsequent response. Copy and store it immediately after creating the webhook.

Update a webhook

Updates an existing webhook. Only the fields you include are changed; omitted fields retain their current values. PATCH /entity-webhooks/:webhookId
curl -X PATCH https://api.nuvion.dev/entity-webhooks/wh_01HXYZ9900ABCD \
  -H "Authorization: Bearer nv_test_abc123" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled_events": {
      "all": true
    },
    "status": "active"
  }'

Request parameters

webhookId
string
required
The ID of the webhook to update.
url
string
New HTTPS delivery URL. Must begin with https://.
expires_in
number
New expiry duration in seconds, measured from the time of this update.
enabled_events
object
Replaces the entire enabled_events configuration. Set all: true to subscribe to every event type.
secret
string
Replaces the signing secret. The new value is stored as a SHA-512 hash and cannot be retrieved after this call.
description
string
Updated description.
tags
string[]
Replaces the tags list.
status
string
Set to active or inactive. Setting to inactive pauses all deliveries without deleting the webhook.

Response

Returns 200 OK with the updated webhook object.
Response
{
  "status": "success",
  "message": "Webhook edited successfully",
  "data": {
    "id": "wh_01HXYZ9900ABCD",
    "entity_id": "ent_01HXYZ1234ABCD",
    "url": "https://webhooks.example.com/nuvion",
    "expires_in": 31536000,
    "enabled_events": {
      "all": true
    },
    "description": "Production payment notifications",
    "tags": ["payments", "production"],
    "status": "active",
    "stats": {
      "total_webhooks_sent": 1482,
      "total_webhooks_successful": 1479,
      "total_webhooks_failed": 3,
      "last_webhook_event": 1744056000000
    }
  }
}

Get a webhook

Retrieves a single webhook by ID. GET /entity-webhooks/:webhookId
curl https://api.nuvion.dev/entity-webhooks/wh_01HXYZ9900ABCD \
  -H "Authorization: Bearer nv_test_abc123"

Request parameters

webhookId
string
required
The ID of the webhook to retrieve.

Response

Returns 200 OK with the webhook object.
Response
{
  "status": "success",
  "message": "Webhook fetched successfully",
  "data": {
    "id": "wh_01HXYZ9900ABCD",
    "entity_id": "ent_01HXYZ1234ABCD",
    "url": "https://webhooks.example.com/nuvion",
    "expires_in": 31536000,
    "enabled_events": {
      "inflows": {
        "created": true,
        "completed": true,
        "failed": true,
        "cancelled": false,
        "refunded": false
      },
      "outflows": {
        "created": true,
        "completed": true,
        "failed": true,
        "cancelled": false,
        "refunded": false
      }
    },
    "description": "Production payment notifications",
    "tags": ["payments", "production"],
    "status": "active",
    "stats": {
      "total_webhooks_sent": 1482,
      "total_webhooks_successful": 1479,
      "total_webhooks_failed": 3,
      "last_webhook_event": 1744056000000
    }
  }
}

List webhooks

Returns a paginated list of all webhooks for the authenticated entity. GET /entity-webhooks
curl "https://api.nuvion.dev/entity-webhooks?limit=20" \
  -H "Authorization: Bearer nv_test_abc123"

Request parameters

limit
integer
Number of results per page. Between 1 and 100. Defaults to 20.
cursor
string
ULID pagination cursor from a previous response. Omit for the first page.

Response

Returns 200 OK with a paginated list of webhook objects.
Response
{
  "status": "success",
  "message": "Webhooks fetched successfully",
  "data": [
    {
      "id": "wh_01HXYZ9900ABCD",
      "entity_id": "ent_01HXYZ1234ABCD",
      "url": "https://webhooks.example.com/nuvion",
      "expires_in": 31536000,
      "enabled_events": {
        "all": true
      },
      "description": "Production payment notifications",
      "tags": ["payments", "production"],
      "status": "active",
      "stats": {
        "total_webhooks_sent": 1482,
        "total_webhooks_successful": 1479,
        "total_webhooks_failed": 3,
        "last_webhook_event": 1744056000000
      }
    }
  ],
  "meta": {
    "pagination": {
      "limit": 20,
      "total_count": 3,
      "has_next": false,
      "has_previous": false,
      "next_cursor": null,
      "previous_cursor": null
    },
    "filters_applied": {
      "sort": {
        "field": "created",
        "order": "desc"
      }
    }
  }
}

Delete a webhook

Permanently deletes a webhook. Nuvion stops delivering events to the endpoint immediately. DELETE /entity-webhooks/:webhookId
curl -X DELETE https://api.nuvion.dev/entity-webhooks/wh_01HXYZ9900ABCD \
  -H "Authorization: Bearer nv_test_abc123"

Request parameters

webhookId
string
required
The ID of the webhook to delete.

Response

Returns 200 OK confirming deletion.
Response
{
  "status": "success",
  "message": "Webhook deleted successfully",
  "data": {
    "id": "wh_01HXYZ9900ABCD"
  }
}
Deletion is irreversible. All delivery history is retained in logs, but the webhook configuration and endpoint registration are permanently removed.

The Webhook Log object

Each delivery attempt is recorded as a log entry. Logs are immutable and retained regardless of delivery outcome.
id
string
Unique log entry identifier.
entity_id
string
The ID of the entity this log belongs to.
entity_webhook_id
string
The ID of the webhook that triggered this delivery.
url
string
The URL this delivery was sent to at the time of the attempt.
request
object
The full HTTP request sent to the webhook endpoint, including headers and body. Any signing secrets or authentication tokens in headers are obfuscated.
query
object
URL query parameters included in the delivery request, if any.
response
object
The HTTP response received from the webhook endpoint, including status code, headers, and body.
duration
object
Timestamps for the delivery lifecycle.

List webhook logs

Returns a paginated list of delivery log entries for the authenticated entity. GET /webhook-logs
curl "https://api.nuvion.dev/webhook-logs?limit=20" \
  -H "Authorization: Bearer nv_test_abc123"

Request parameters

limit
integer
Number of results per page. Between 1 and 100. Defaults to 20.
cursor
string
ULID pagination cursor from a previous response. Omit for the first page.

Response

Returns 200 OK with a paginated list of log objects.
Response
{
  "status": "success",
  "message": "Webhooks fetched successfully",
  "data": [
    {
      "id": "whl_01HXYZ0011EFGH",
      "entity_id": "ent_01HXYZ1234ABCD",
      "entity_webhook_id": "wh_01HXYZ9900ABCD",
      "url": "https://webhooks.example.com/nuvion",
      "request": {
        "method": "POST",
        "headers": {
          "Content-Type": "application/json",
          "X-Nuvion-Signature": "sha512=••••••••"
        },
        "body": {
          "event": "inflows.completed",
          "data": {
            "id": "inf_01HXYZ5566IJKL"
          }
        }
      },
      "query": {},
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "received": true
        }
      },
      "duration": {
        "request_received": 1744056000000,
        "response_sent": 1744056000312
      }
    }
  ]
}
Signing secrets and authentication tokens in request headers are obfuscated in log entries and cannot be recovered from logs.

Send a test event

Sends a simulated event to an existing webhook endpoint. Use this to verify your endpoint is reachable and handling payloads correctly without waiting for a real event. POST /webhook-tests
curl -X POST https://api.nuvion.dev/webhook-tests \
  -H "Authorization: Bearer nv_test_abc123" \
  -H "Content-Type: application/json" \
  -d '{
    "entity_webhook_id": "wh_01HXYZ9900ABCD",
    "event_group": "inflows",
    "event_name": "completed"
  }'

Request parameters

entity_webhook_id
string
required
The ID of the webhook to send the test event to.
event_group
string
required
The event group to simulate. One of accounts, account_details, inflows, outflows, entities, funding_sessions, or payment_intent.
event_name
string
required
The specific event to simulate within the group. One of created, updated, deleted, completed, failed, cancelled, or refunded.Not all combinations of event_group and event_name are valid — for example, funding_sessions.created does not exist. Refer to the enabled_events structure for supported combinations.

Response

Returns 201 Created confirming the test was dispatched.
Response
{
  "status": "success",
  "message": "Test Webhook sent successfully",
  "data": {}
}
Test events appear in webhook logs the same as live events. Check the logs to inspect the full request and response if your endpoint didn’t receive the payload as expected.