# Get a compliance receipt

> get_compliance_receipt: Returns an order's signed compliance receipt: an ES256 JWS with its decoded claims and a PDF link, covering records delivered, suppression removals, subscriber classes, TPS screening, Article 14 status, the licence and the file hash.

Source: https://emailmovers.com/mydatahub/docs/reference/mcp/get_compliance_receipt

Returns an order's signed compliance receipt: an ES256 JWS with its decoded claims and a PDF link, covering records delivered, suppression removals, subscriber classes, TPS screening, Article 14 status, the licence and the file hash. Use it to prove to the user, a colleague or another agent that a list is licensed and screened; anyone can verify it with POST /v1/compliance/receipts/verify. Free; it needs orders:read. Lawful basis is UK GDPR Article 6(1)(f) legitimate interests; email audiences include corporate subscribers only by default (PECR), so sole traders and ordinary partnerships are left out unless the toggle is changed.

| Property | Value |
| --- | --- |
| Tool name | `get_compliance_receipt` |
| Position in tools/list | 22 of 22 |
| Cost | Free |
| Scope | `orders:read` |
| Annotations | readOnlyHint true, destructiveHint false, idempotentHint true, openWorldHint false |
| Kind | Read only; idempotent, not destructive, closed world |
| REST equivalent | [`GET /v1/orders/{id}/receipt`](https://emailmovers.com/mydatahub/docs/reference/rest/get-compliance-receipt.md) |

> **Not yet live.** MyDataHub v2 is built and tested locally and is not yet live. The v2 hosts open at launch, date to confirm. This is what `tools/list` returns from https://mydatahub.emailmovers.com/mcp once v2 launches.

## Input

The schema sets `additionalProperties` to false, so a member that is not listed is refused.

| Member | Type | Required | Description |
| --- | --- | --- | --- |
| `order_id` | string | yes | The order the receipt covers. |

## Example call

The `params` of a `tools/call` request:

```json
{
  "name": "get_compliance_receipt",
  "arguments": {
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E"
  }
}
```

## Output

The result carries `structuredContent` that matches this schema, and one line of text that leads with the number.

| 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. |

## Errors

A failed call returns `isError` true. The text content leads with the sentence a person acts on, then the whole problem as JSON, with `code`, `detail`, `next_step` and `did_you_mean`. A 401 and a step-up 403 are answered at HTTP level so the client can start authorisation. See [Errors](https://emailmovers.com/mydatahub/docs/errors.md).
