Reference
Verify a compliance receipt
POST /v1/compliance/receipts/verify. Check a receipt's JWS against the published key without an account, and learn whether the order exists, until when its licence is in force and whether it was revoked.
POST /v1/compliance/receipts/verify
Check a receipt's JWS against the published key without an account, and learn whether the order exists, until when its licence is in force and whether it was revoked. One agent can prove to another that a list is licensed and screened. REST only.
| Property | Value |
|---|---|
| Endpoint | POST https://mydatahub.emailmovers.com/v1/compliance/receipts/verify |
| Operation id | verifyComplianceReceipt |
| Cost | Free (0 credits) |
| Access | No account, key or token needed. |
| Tag | Compliance |
Request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
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. |
Body
| Member | Type | Required | Description |
|---|---|---|---|
jws | string | yes | The compact JWS to check. |
Example request
curl -X POST "https://mydatahub.emailmovers.com/v1/compliance/receipts/verify" \
-H "Content-Type: application/json" \
--data '{
"jws": "eyJhbGciOiJFUzI1NiIsImtpZCI6InJjcHQtMjAyNi0wOSJ9.eyJyZWNlaXB0X2lkIjoicmNwdF8wMUpCNE5BMlE1VzhaQUs4UTJWN1hOM005UiJ9.MEUCIQDexampleSignatureOnly"
}'Responses
200: The verdict.
Headers: RateLimit, RateLimit-Policy.
| Member | Type | Always present | Description |
|---|---|---|---|
valid | boolean | yes | The signature checks out against the published key. |
order_exists | boolean | yes | |
licence_in_force_until | string (date) or null | yes | |
revoked | boolean | yes | |
receipt_id | string or null | yes | |
checked_at | string (date-time) | yes |
Example response
{
"valid": true,
"order_exists": true,
"licence_in_force_until": "2027-09-26",
"revoked": false,
"receipt_id": "rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R",
"checked_at": "2026-10-01T09:00:00Z"
}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. |
| 422 | validation-failed, quote-required, dataset-unavailable | The request is not valid. errors lists every problem with a JSON pointer and did_you_mean. |
| 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. |