REST API

Endpoints, pagination, and error handling

REST API Reference

The Declined REST API is available at https://dev.declined.io/api. All endpoints accept and return JSON unless noted. List endpoints support cursor pagination via limit and starting_after query parameters.

Endpoints

MethodPathDescription
POST/v1/eventsIngest billing and recovery events
GET/v1/customersList customers with recovery context
GET/v1/recoveriesList recovery attempts
POST/v1/recoveries/:id/mark-recoveredMark a recovery attempt as successfully recovered
GET/v1/sequencesList dunning sequences
GET/v1/webhooksList outbound webhook endpoints
GET/v1/incentivesList incentive offers
GET/v1/analyticsRecovery analytics summary

HTTP status codes

CodeMeaning
200Success (including idempotent event replays)
201Resource created
400Invalid request body or query parameters
401Missing or invalid API key
403Authenticated but not allowed for this resource
404Resource not found in this workspace
409Conflict (e.g. duplicate non-idempotent create)
429Rate limited — retry with backoff
500Unexpected server error
0 / networkThe request never reached Declined (DNS, CORS, offline, or aborted). Retry from Sandbox after checking connectivity.

Pagination

json
{
  "data": [ ... ],
  "has_more": true,
  "next_cursor": "ra_abc123"
}

Idempotency

POST /v1/events requires a stable event_id per logical occurrence. Duplicate submissions return HTTP 200:

json
{
  "status": "duplicate",
  "event_id": "evt_unique_001",
  "inbound_event_id": "ie_existing"
}

Marking recoveries

See the dedicated Recoveries guide for POST /v1/recoveries/:id/mark-recovered and the payment_recovered event type.

Rate limits

Event ingestion is optimized for high throughput. If you exceed workspace limits, responses include 429 with a Retry-After header. Implement exponential backoff with jitter on retries.