Reference
Get the compliance receipt
GET /v1/orders/{id}/receipt. The order's compliance receipt as an ES256 JWS with its decoded claims and a PDF twin: records delivered, suppression removals, counts by subscriber class, TPS status and Article 14 status, the licence and the file hash.
GET /v1/orders/{id}/receipt
The order's compliance receipt as an ES256 JWS with its decoded claims and a PDF twin: records delivered, suppression removals, counts by subscriber class, TPS status and Article 14 status, the licence and the file hash.
| Property | Value |
|---|---|
| Endpoint | GET https://mydatahub.emailmovers.com/v1/orders/{id}/receipt |
| Operation id | getComplianceReceipt |
| Cost | Free (0 credits) |
| Access | An API key or an OAuth 2.1 token with the scope orders:read. |
| MCP tool | get_compliance_receipt |
| Tag | Orders |
Request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | Format: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E. |
MyDataHub-Version | header | string | no | The dated API version, pinned per key when left out. Non-breaking changes ship as new dates; the path major changes only for breaking changes, with a 12 month deprecation window. |
Example request
curl "https://mydatahub.emailmovers.com/v1/orders/ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E/receipt" \
-H "Authorization: Bearer $MYDATAHUB_API_KEY"Responses
200: The receipt.
Headers: RateLimit, RateLimit-Policy.
| Member | Type | Always present | Description |
|---|---|---|---|
id | string | yes | Format: a compliance receipt id: rcpt_ followed by a 26 character ULID in upper case Crockford base32, such as rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R. |
order_id | string | yes | Format: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E. |
jws | string | yes | The receipt as a compact JWS signed with ES256. |
alg | ES256 | yes | |
kid | string | yes | The signing key id in jwks_url. |
jwks_url | string (uri) | yes | |
pdf_url | string (uri) | yes | The PDF twin at mydatahub.emailmovers.com/receipts/{id}. |
claims | ReceiptClaims | yes | The decoded payload of a compliance receipt. |
claims.receipt_id | string | yes | Format: a compliance receipt id: rcpt_ followed by a 26 character ULID in upper case Crockford base32, such as rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R. |
claims.order_id | string | yes | Format: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E. |
claims.issued_at | string (date-time) | yes | |
claims.dataset_version | string | yes | The immutable weekly build a count is bound to, such as 2026-W39. The last 52 stay queryable. |
claims.records_delivered | integer (0 or more) | yes | |
claims.removed_by_suppression | integer (0 or more) | yes | |
claims.counts | object | yes | |
claims.lawful_basis | enum: legitimate_interests_art6_1_f | yes | |
claims.lia_ref | string | yes | |
claims.licence | Licence | yes | Licence terms as data, on every quote, order, records page and receipt. Records stay usable, pushable and re-downloadable free until reuse_until. |
claims.residency_statement_version | string | yes | |
claims.sub_processor_list_version | string | yes | |
claims.verified_within_days | object | yes | Share of delivered emails verified within 30, 60 and 90 days. |
claims.content_sha256 | string | yes | SHA-256 of the delivered file, lower case hex. |
Example response
{
"id": "rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R",
"order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
"jws": "eyJhbGciOiJFUzI1NiIsImtpZCI6InJjcHQtMjAyNi0wOSJ9.eyJyZWNlaXB0X2lkIjoicmNwdF8wMUpCNE5BMlE1VzhaQUs4UTJWN1hOM005UiJ9.MEUCIQDexampleSignatureOnly",
"alg": "ES256",
"kid": "rcpt-2026-09",
"jwks_url": "https://mydatahub.emailmovers.com/.well-known/jwks.json",
"pdf_url": "https://mydatahub.emailmovers.com/receipts/rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R",
"claims": {
"receipt_id": "rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R",
"order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
"issued_at": "2026-09-26T10:16:04Z",
"dataset_version": "2026-W39",
"records_delivered": 5000,
"removed_by_suppression": 41,
"counts": {
"subscriber_class": {
"ltd": 4610,
"plc": 120,
"llp": 180,
"scottish_partnership": 0,
"public_body": 60,
"charity_incorporated": 30,
"sole_trader": 0,
"ordinary_partnership": 0,
"unknown": 0
},
"tps_ctps_status": {
"clear": 4380,
"tps_registered": 0,
"ctps_registered": 0,
"tps_or_ctps_registered": 0,
"not_screened": 620
},
"article14_status": {
"notified": 4990,
"publicly_notified_disproportionate_effort": 0,
"pending_within_window": 10
}
},
"lawful_basis": "legitimate_interests_art6_1_f",
"lia_ref": "EM-LIA-2026-03",
"licence": {
"type": "multi_use_12m",
"reuse_until": "2027-09-26",
"resale_prohibited": true,
"permitted_channels": ["email", "telephone", "post"],
"warranty_url": "https://emailmovers.com/trust/warranty",
"terms_version": "2026-09"
},
"residency_statement_version": "2026-10",
"sub_processor_list_version": "2026-10",
"verified_within_days": {
"within_30_days": 61.2,
"within_60_days": 79.5,
"within_90_days": 88.4
},
"content_sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b"
}
}Errors
Every error is a problem object with a code and a next_step. Every response carries the RateLimit and RateLimit-Policy headers; see Rate limits.
| Status | Problem codes | When |
|---|---|---|
| 400 | invalid-request, idempotency-key-required, unsupported-version | The request could not be read, or an Idempotency-Key is missing. |
| 401 | authentication-required, account-required | Sign in (OAuth) or send an API key (authentication-required), or create a free account for what the anonymous tier does not cover (account-required). |
| 403 | insufficient-scope, confirmation-required, business-details-required, licence-acceptance-required, dpa-acceptance-required, agent-budget-exceeded | The token lacks a scope (insufficient-scope, with required_scope and a WWW-Authenticate step-up challenge); no person confirmed the spend and no agent key covers it (confirmation-required, with an approval_url); an agent key's per-order cap or monthly budget does not cover it (agent-budget-exceeded); an account made by self-serve sign-up has not yet confirmed its business name and that it is a UK business, which its first order needs (business-details-required); the order needs the Data Licence and Sharing Agreement accepted at the version in force (licence-acceptance-required); or a suppression upload comes before the organisation has accepted the Article 28 data processing agreement in force (dpa-acceptance-required). Nothing is charged. |
| 404 | not-found | No such object for this organisation. |
| 409 | idempotency-key-reused, quote-expired, order-not-ready, order-not-cancellable | An Idempotency-Key reused with different parameters, an expired machine quote, or an object in the wrong state. |
| 429 | rate-limited | Too many requests. Wait for Retry-After. |
| Any other failure | internal-error, service-unavailable, tps-screen-expired | Something failed on our side (500 internal-error) or the service is briefly unavailable (503 service-unavailable, with Retry-After). Nothing was charged; retry with the same Idempotency-Key. A count, sample, quote or order with telephone in play is also refused with 503 tps-screen-expired, with no Retry-After, while the dataset version's TPS and CTPS screen is more than 28 days old. |