Skip to main content

Closure Core API (3.0.1)

Download OpenAPI specification:Download

Enterprise REST API for Closure integrations: distributors, lead organizations, and vendors.

Authentication

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:

  • Distributor routes: key issued to the distributor organization.
  • Leads route: key issued to the lead organization.
  • Vendors route: key issued to the vendor.

Invalid or missing keys where required yield 401 with a Problem Details body (application/problem+json).

Optional WAF and IP whitelisting

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.

Successful responses

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 limiting

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.

Excluded from this API

Public wizard endpoints, white-label integrations, onboarding helpers, homepage, and mail webhooks are not part of v3.

Health

Liveness and optional authenticated health probe

Health check

Returns service health. Authentication is optional.

  • Without X-Api-Key: returns { "healthy": true }.
  • With X-Api-Key: validates the key and returns healthy, entityType, and optional entityId / entityName.
header Parameters
X-Api-Key
string

When sent, must be valid for any supported entity type.

Responses

Response samples

Content type
application/json
Example
{
  • "healthy": true
}

Distributors — Heirs

Create and query heirs linked to the authenticated distributor

Create heir and deceased person

Creates a Heir and associated DeceasedPerson, linked to the authenticated distributor. Optionally associates the registration with a distributor employee via distributor_employee_id.

Authorizations:
DistributorApiKey
Request Body schema: application/json
required
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)

Responses

Request samples

Content type
application/json
{
  • "distributor_employee_id": 0,
  • "heir": {
    },
  • "deceased_person": {
    },
  • "selection": [
    ]
}

Response samples

Content type
application/json
{
  • "heir": {
    },
  • "deceased_person": {
    }
}

Query heir by email or ID

Query operation: returns the heir if they are within the authenticated distributor’s scope. Exactly one of email or id must be provided.

Authorizations:
DistributorApiKey
Request Body schema: application/json
required
= 1 properties
email
string <email>
id
integer <int64>

Responses

Request samples

Content type
application/json
{
  • "email": "user@example.com"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "prefixes": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "deceased_persons": [
    ]
}

Get heir by ID

Returns the heir only if within the authenticated distributor’s scope.

Authorizations:
DistributorApiKey
path Parameters
heirId
required
integer <int64>

Heir identifier

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "prefixes": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "deceased_persons": [
    ]
}

Request one-time sign-in URL

Issues a short-lived sign-in link for the heir. Default validity is 15 minutes unless overridden.

Authorizations:
DistributorApiKey
path Parameters
heirId
required
integer <int64>

Heir identifier

Request Body schema: application/json
optional
expires_in_minutes
integer [ 1 .. 1440 ]
Default: 15

Magic link validity window

Responses

Request samples

Content type
application/json
{
  • "expires_in_minutes": 15
}

Response samples

Content type
application/json
{}

Distributors — Service requests

Service requests for a deceased person under a distributor’s scope

List service requests for a deceased person

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.

Authorizations:
DistributorApiKey
path Parameters
deceasedPersonId
required
integer <int64>
query Parameters
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 - for descending order. Stable tie-breaker: ascending id when primary sort keys are equal.

status
string
Enum: "open" "in_progress" "completed" "cancelled"

When set, only service requests in this coarse state are returned. Semantics align with the status field on each ServiceRequest resource. Omit to return all statuses.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "meta": {
    }
}

Create service request

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.

Authorizations:
DistributorApiKey
path Parameters
deceasedPersonId
required
integer <int64>
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "closure_organization_id": 0,
  • "service_type": "terminate",
  • "contractor_id": 0,
  • "locale": "nl",
  • "target_personal_data": { }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "deceased_person_id": 0,
  • "closure_organization_id": 0,
  • "service_type": "terminate",
  • "status": "open",
  • "locale": "nl",
  • "created_at": "2019-08-24T14:15:22Z"
}

Distributors — Documents

Document uploads for a deceased person

Upload document for deceased person

Multipart upload. Allowed file types: PDF, PNG, JPEG, BMP, TIFF. Maximum size: 26 MiB for death_certificate, 30 MiB for other types.

Authorizations:
DistributorApiKey
path Parameters
deceasedPersonId
required
integer <int64>
Request Body schema: multipart/form-data
required
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)

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "document_type": "death_certificate",
  • "filename": "string",
  • "mime_type": "string",
  • "size_bytes": 0,
  • "uploaded_at": "2019-08-24T14:15:22Z"
}

Distributors — Employees

Employees belonging to the distributor organization

List distributor employees

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.

Authorizations:
DistributorApiKey
query Parameters
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 - for descending order. Stable tie-breaker: ascending id when primary sort keys are equal.

is_active
boolean

When true, only employees with is_active: true. When false, only employees with is_active: false. When omitted, employees are returned regardless of activity.

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "meta": {
    }
}

Create distributor employee

Authorizations:
DistributorApiKey
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "role": "string",
  • "is_active": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "role": "string",
  • "is_active": true
}

Get employee

Authorizations:
DistributorApiKey
path Parameters
employeeId
required
integer <int64>

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "role": "string",
  • "is_active": true
}

Partially update employee

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.

Authorizations:
DistributorApiKey
path Parameters
employeeId
required
integer <int64>
Request Body schema: application/json
required
first_name
string <= 255 characters
last_name
string <= 255 characters
email
string <email>
phone
string or null
role
string or null
is_active
boolean

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "role": "string",
  • "is_active": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "role": "string",
  • "is_active": true
}

Delete employee

Authorizations:
DistributorApiKey
path Parameters
employeeId
required
integer <int64>

Responses

Response samples

Content type
application/problem+json
{}

Leads

Lead intake for organizations

Create lead

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.

Authorizations:
OrganizationApiKey
Request Body schema: application/json
required
first_name
required
string <= 255 characters
last_name
required
string <= 255 characters
email
required
string <email> <= 255 characters

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first_name": "string",
  • "last_name": "string",
  • "email": "user@example.com",
  • "closure_organization_id": 0,
  • "created_at": "2019-08-24T14:15:22Z"
}

Vendors

Vendor-scoped end-user provisioning

Create vendor user

Creates a vendor user record scoped to the authenticated vendor.

Authorizations:
VendorApiKey
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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"
}

Response samples

Content type
application/json
{
  • "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"
}