Download OpenAPI specification:Download
Enterprise REST API for Closure integrations: distributors, lead organizations, and vendors.
Send X-Api-Key with every request except GET /api/v3/health when you only need anonymous liveness. The server resolves the key to exactly one API entity:
Invalid or missing keys where required yield 401 with a Problem Details body (application/problem+json).
In production, traffic may pass through a WAF (Web Application Firewall). Each API entity may optionally be configured with an IP allow list at the WAF layer. Requests from non-whitelisted addresses are blocked before they reach the application. IP rules are not expressed in this document; they are infrastructure configuration per entity.
On success, the API returns the resource body directly (JSON):
201 Created: body is the created resource (or a small composite object when multiple top-level resources are created together).200 OK: body is the resource, a collection, or a paginated list (see PaginatedEmployees, PaginatedServiceRequests).204 No Content: used where no response body is returned (e.g. successful delete).Errors only use RFC 7807 Problem Details (application/problem+json). Validation failures may include an errors map of field names to message arrays.
Rate limits apply per X-Api-Key (i.e. per API entity). Exact quotas (requests per minute/hour/day) may differ by entity type (distributor vs lead organization vs vendor) and by commercial tier; numeric values are published in integration guides and may change without a minor API version bump.
When a limit is exceeded, the API responds with 429 Too Many Requests and a Problem Details body. The server may send:
Retry-After: hint in seconds until the client may retry (optional; not guaranteed on every 429).X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset: optional standard hints (reset as Unix timestamp). Clients must not rely on these headers being present on every response.Any endpoint may return 429; treat it as retryable with backoff unless Retry-After is present.
Public wizard endpoints, white-label integrations, onboarding helpers, homepage, and mail webhooks are not part of v3.
Returns service health. Authentication is optional.
X-Api-Key: returns { "healthy": true }.X-Api-Key: validates the key and returns healthy, entityType, and optional entityId / entityName.| X-Api-Key | string When sent, must be valid for any supported entity type. |
{- "healthy": true
}Creates a Heir and associated DeceasedPerson, linked to the authenticated distributor.
Optionally associates the registration with a distributor employee via distributor_employee_id.
| distributor_employee_id | integer or null <int64> Optional distributor employee associated with this registration |
required | object |
required | object (DeceasedPersonInput) |
Array of objects Organization / product selection for onboarding (structure product-specific) |
{- "distributor_employee_id": 0,
- "heir": {
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "email": "user@example.com",
- "company_name": "string",
- "properties": { }
}, - "deceased_person": {
- "external_reference_id": "string",
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "gender": "string",
- "date_of_death": "2019-08-24",
- "locale": "nl",
- "maiden_name": "string",
- "nickname": "string",
- "phone": "string",
- "street": "string",
- "postal_code": "string",
- "house_number": "string",
- "house_number_addition": "string",
- "city": "string",
- "birth_date": "2019-08-24",
}, - "selection": [
- { }
]
}{- "heir": {
- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "email": "user@example.com"
}, - "deceased_person": {
- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "gender": "string",
- "date_of_death": "2019-08-24",
- "locale": "nl",
- "external_reference_id": "string"
}
}Query operation: returns the heir if they are within the authenticated distributor’s scope.
Exactly one of email or id must be provided.
string <email> | |
| id | integer <int64> |
{- "email": "user@example.com"
}{- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "email": "user@example.com",
- "deceased_persons": [
- {
- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "gender": "string",
- "date_of_death": "2019-08-24",
- "locale": "nl",
- "external_reference_id": "string"
}
]
}Returns the heir only if within the authenticated distributor’s scope.
| heirId required | integer <int64> Heir identifier |
{- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "email": "user@example.com",
- "deceased_persons": [
- {
- "id": 0,
- "first_name": "string",
- "prefixes": "string",
- "last_name": "string",
- "gender": "string",
- "date_of_death": "2019-08-24",
- "locale": "nl",
- "external_reference_id": "string"
}
]
}Issues a short-lived sign-in link for the heir. Default validity is 15 minutes unless overridden.
| heirId required | integer <int64> Heir identifier |
| expires_in_minutes | integer [ 1 .. 1440 ] Default: 15 Magic link validity window |
{- "expires_in_minutes": 15
}{- "expires_at": "2019-08-24T14:15:22Z"
}Paginated list. Sort is stable: when primary keys tie, results are ordered by ascending id.
Filter status (if provided) matches the service request’s coarse lifecycle state; omit to return all.
| deceasedPersonId required | integer <int64> |
| page | integer >= 1 Default: 1 1-based page index |
| page_size | integer [ 1 .. 100 ] Default: 20 Page size (maximum 100) |
| sort | string Default: "created_at" Enum: "created_at" "-created_at" "id" "-id" Sort field. Prefix with |
| status | string Enum: "open" "in_progress" "completed" "cancelled" When set, only service requests in this coarse state are returned.
Semantics align with the |
{- "items": [
- {
- "id": 0,
- "deceased_person_id": 0,
- "closure_organization_id": 0,
- "service_type": "terminate",
- "status": "open",
- "locale": "nl",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "page": 1,
- "page_size": 1,
- "total_count": 0,
- "total_pages": 0,
- "sort_applied": "string"
}
}Opens a new service request for the given deceased person within Closure.
The deceased person must be associated with a heir in the authenticated distributor’s scope.
When closure_organization_id is provided, the request is bound to that Closure service provider organization.
| deceasedPersonId required | integer <int64> |
| closure_organization_id | integer or null <int64> Identifier of the Closure service provider organization this request applies to. Send when the integration selects or targets a specific organization; omit only when product rules allow the platform to determine the organization from other context. |
| service_type required | string (ServiceType) Enum: "terminate" "take_over" "validate" "inform" "name_change" Category of work requested for the deceased person’s affairs |
| contractor_id | integer or null <int64> Optional contractor context when required by the product configuration |
| locale | string Default: "nl" |
object or null Optional structured personal data supplied for this request |
{- "closure_organization_id": 0,
- "service_type": "terminate",
- "contractor_id": 0,
- "locale": "nl",
- "target_personal_data": { }
}{- "id": 0,
- "deceased_person_id": 0,
- "closure_organization_id": 0,
- "service_type": "terminate",
- "status": "open",
- "locale": "nl",
- "created_at": "2019-08-24T14:15:22Z"
}Multipart upload. Allowed file types: PDF, PNG, JPEG, BMP, TIFF.
Maximum size: 26 MiB for death_certificate, 30 MiB for other types.
| deceasedPersonId required | integer <int64> |
| document_type required | string (DocumentType) Enum: "death_certificate" "identity_document" "bank_statement" "vlp_document" "vve_document" "ctr_document" |
| file required | string <binary> Document file (PDF or image) |
{- "id": 0,
- "document_type": "death_certificate",
- "filename": "string",
- "mime_type": "string",
- "size_bytes": 0,
- "uploaded_at": "2019-08-24T14:15:22Z"
}Paginated list. Sort is stable: when primary keys tie, results are ordered by ascending id.
is_active=true returns only active employees; is_active=false only inactive; omit for no filter on activity.
| page | integer >= 1 Default: 1 1-based page index |
| page_size | integer [ 1 .. 100 ] Default: 20 Page size (maximum 100) |
| sort | string Default: "created_at" Enum: "created_at" "-created_at" "email" "-email" "last_name" "-last_name" Sort field. Prefix with |
| is_active | boolean When |
{- "items": [
- {
- "id": 0,
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "phone": "string",
- "role": "string",
- "is_active": true
}
], - "meta": {
- "page": 1,
- "page_size": 1,
- "total_count": 0,
- "total_pages": 0,
- "sort_applied": "string"
}
}| first_name required | string <= 255 characters |
| last_name required | string <= 255 characters |
| email required | string <email> |
| phone | string or null |
| role | string or null |
| is_active | boolean Default: true |
{- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "phone": "string",
- "role": "string",
- "is_active": true
}{- "id": 0,
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "phone": "string",
- "role": "string",
- "is_active": true
}PATCH semantics: only fields present in the body are updated; omitted fields are left unchanged.
Send at least one property to change; an empty object may be rejected with 422.
| employeeId required | integer <int64> |
| first_name | string <= 255 characters |
| last_name | string <= 255 characters |
string <email> | |
| phone | string or null |
| role | string or null |
| is_active | boolean |
{- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "phone": "string",
- "role": "string",
- "is_active": true
}{- "id": 0,
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "phone": "string",
- "role": "string",
- "is_active": true
}Creates a lead for the organization identified by X-Api-Key. Sends invitation email per product rules.
Email must be unique among leads and must not already be in use by an existing heir account.
| first_name required | string <= 255 characters |
| last_name required | string <= 255 characters |
| email required | string <email> <= 255 characters |
{- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com"
}{- "id": 0,
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "closure_organization_id": 0,
- "created_at": "2019-08-24T14:15:22Z"
}Creates a vendor user record scoped to the authenticated vendor.
| vendor_ext_record_id required | string |
| email required | string <email> |
| first_name required | string |
| last_name required | string |
| street required | string |
| house_number required | string |
| postal_code required | string |
| city required | string |
| phone required | string |
{- "vendor_ext_record_id": "string",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "street": "string",
- "house_number": "string",
- "postal_code": "string",
- "city": "string",
- "phone": "string"
}{- "id": 0,
- "vendor_ext_record_id": "string",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "street": "string",
- "house_number": "string",
- "postal_code": "string",
- "city": "string",
- "country": "Netherlands"
}