Contacts_export
const url = 'http://localhost:3000/api/contacts/export';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:3000/api/contacts/export \ --header 'Authorization: Bearer <token>'Export everything held about one contact as a streamed JSON download: the
contact, its custom fields, tags, visitors, all events, its opt-outs
(unsubscribes, suppressions, confirmations) and delivery metadata. Rendered
message bodies are not included. Identify the contact by exactly one of
id or email.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”A primary key, written as a decimal string so JavaScript never rounds it. The format makes the Go servers parse it into an int64: a malformed id is refused as a 400 before a handler runs. The pattern says the same in the contract, so a client (or a fuzzer) can tell a malformed id from a valid one without trying it. Eighteen digits is the most a key reaches, so every id the schema admits fits an int64.
The contact’s id
The contact’s email address
Responses
Section titled “Responses”Attachment download of everything held about one contact (subject access, GDPR Art. 15/20): the ContactExportDocument JSON, streamed
Everything held about one contact (subject access, GDPR Art. 15/20). The download is this document streamed member by member; rendered message bodies are never part of it.
object
The contact
object
Unique identifier
Canonical subject identifier
Email address
Phone number
Given name
Family name
IANA time zone identifier
Typed custom field values keyed by the field’s machine key
object
Creation timestamp
Last update timestamp
Tags the contact carries
A tag the contact carries
object
Unique identifier
The label
Creation timestamp
Visitors bound to the contact
An anonymous device (visitor) bound to the contact
object
Unique identifier
The visitor id the tracker assigned
When the visitor was last seen
Creation timestamp
Opt-outs for the contact’s addresses
An opt-out of a channel destination
object
Unique identifier
Channel the opt-out applies to
Address the opt-out applies to
The sending source (kind of mail) opted out of
Creation timestamp
Suppressions for the contact’s addresses
A suppression of a channel destination
object
Unique identifier
Channel the suppression applies to
Address the suppression applies to
Why the destination is suppressed
Creation timestamp
Confirmations for the contact’s addresses
A recorded confirmation of a channel destination
object
Unique identifier
Channel the confirmation applies to
Address the confirmation applies to
How the confirmation was obtained
Creation timestamp
All events of the contact and its visitors
An event tracked for the contact or its visitors
object
Unique identifier
Source identifier
Visitor id the event was tracked under
Canonical subject identifier
Email address associated with the event
Phone number associated with the event
Event action
Event properties
object
Event occurrence timestamp
Creation timestamp
Delivery metadata of messages sent to the contact’s addresses
Delivery metadata of one outbound message; the rendered message is not included
object
Unique identifier
What kind of send produced the message
Channel the message was sent over
Address the message was sent to
Sending source
Sending domain
The provider’s message id
Delivery status
Why delivery failed or was skipped
When the send was claimed
When the message was sent
Broadcast that produced the message
Automation that produced the message
Step of the automation that produced the message
Template the message was rendered from
Creation timestamp
The contact’s recipient rows in broadcasts
The contact’s engagement with one broadcast (how its send ended is in outboundMessages)
object
Unique identifier
The broadcast
When the contact opened it
When the contact clicked it
When the contact unsubscribed from it
Creation timestamp
Example generated
{ "contact": { "id": "example", "subjectId": "example", "email": "example", "phone": "example", "firstName": "example", "lastName": "example", "timeZone": "example", "customFields": { "additionalProperty": "example" }, "createdAt": "2026-04-15T12:00:00Z", "updatedAt": "2026-04-15T12:00:00Z" }, "tags": [ { "id": "example", "name": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "visitors": [ { "id": "example", "visitorId": "example", "lastSeenAt": "2026-04-15T12:00:00Z", "createdAt": "2026-04-15T12:00:00Z" } ], "unsubscribes": [ { "id": "example", "channel": "example", "destination": "example", "sendingSource": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "suppressions": [ { "id": "example", "channel": "example", "destination": "example", "reason": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "confirmations": [ { "id": "example", "channel": "example", "destination": "example", "provenance": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "events": [ { "id": "example", "sourceId": "example", "visitorId": "example", "subjectId": "example", "email": "example", "phone": "example", "action": "example", "properties": { "additionalProperty": "example" }, "occurredAt": "2026-04-15T12:00:00Z", "createdAt": "2026-04-15T12:00:00Z" } ], "outboundMessages": [ { "id": "example", "kind": "example", "channel": "example", "destination": "example", "sendingSource": "example", "sendingDomain": "example", "providerMessageId": "example", "status": "example", "reason": "example", "claimedAt": "2026-04-15T12:00:00Z", "sentAt": "2026-04-15T12:00:00Z", "broadcastId": "example", "automationId": "example", "automationStep": 1, "templateId": "example", "createdAt": "2026-04-15T12:00:00Z" } ], "broadcastRecipients": [ { "id": "example", "broadcastId": "example", "openedAt": "2026-04-15T12:00:00Z", "clickedAt": "2026-04-15T12:00:00Z", "unsubscribedAt": "2026-04-15T12:00:00Z", "createdAt": "2026-04-15T12:00:00Z" } ]}Headers
Section titled “Headers”RFC 7807 bad request response
RFC 7807 Problem Details
object
Why the request was refused, when the client should act on it
A URI reference that identifies the problem type
A short, human-readable summary of the problem type
HTTP status code
A human-readable explanation specific to this occurrence
A URI reference that identifies the specific occurrence
Validation errors grouped by field
object
Form-level validation error
Field validation errors
object
Seconds to wait before retrying; set on a 429 so a client that only sees the body can show the wait
Why a 500 happened, sent only by a development server (SPHERICON_ENV=development)
object
The error that failed the request, or the panic value
The goroutine stack of a panic; absent for an error a handler returned
The request id the server log carries for this request
The HTTP method of the failed request
The path of the failed request
Example
{ "code": "second_factor_required"}RFC 7807 unauthorized response
RFC 7807 Problem Details
object
Why the request was refused, when the client should act on it
A URI reference that identifies the problem type
A short, human-readable summary of the problem type
HTTP status code
A human-readable explanation specific to this occurrence
A URI reference that identifies the specific occurrence
Validation errors grouped by field
object
Form-level validation error
Field validation errors
object
Seconds to wait before retrying; set on a 429 so a client that only sees the body can show the wait
Why a 500 happened, sent only by a development server (SPHERICON_ENV=development)
object
The error that failed the request, or the panic value
The goroutine stack of a panic; absent for an error a handler returned
The request id the server log carries for this request
The HTTP method of the failed request
The path of the failed request
Example
{ "code": "second_factor_required"}RFC 7807 not found response
RFC 7807 Problem Details
object
Why the request was refused, when the client should act on it
A URI reference that identifies the problem type
A short, human-readable summary of the problem type
HTTP status code
A human-readable explanation specific to this occurrence
A URI reference that identifies the specific occurrence
Validation errors grouped by field
object
Form-level validation error
Field validation errors
object
Seconds to wait before retrying; set on a 429 so a client that only sees the body can show the wait
Why a 500 happened, sent only by a development server (SPHERICON_ENV=development)
object
The error that failed the request, or the panic value
The goroutine stack of a panic; absent for an error a handler returned
The request id the server log carries for this request
The HTTP method of the failed request
The path of the failed request
Example
{ "code": "second_factor_required"}RFC 7807 too many requests response: a rate limit was exceeded (ADR 0025)
RFC 7807 Problem Details
object
Why the request was refused, when the client should act on it
A URI reference that identifies the problem type
A short, human-readable summary of the problem type
HTTP status code
A human-readable explanation specific to this occurrence
A URI reference that identifies the specific occurrence
Validation errors grouped by field
object
Form-level validation error
Field validation errors
object
Seconds to wait before retrying; set on a 429 so a client that only sees the body can show the wait
Why a 500 happened, sent only by a development server (SPHERICON_ENV=development)
object
The error that failed the request, or the panic value
The goroutine stack of a panic; absent for an error a handler returned
The request id the server log carries for this request
The HTTP method of the failed request
The path of the failed request
Example
{ "code": "second_factor_required"}Headers
Section titled “Headers”Seconds to wait before retrying
The request budget of the window that was exceeded
Requests left in the current window
Unix time at which the window resets