# Get a dataset version changelog

> GET /v1/datasets/{dataset}/versions/{version}. What changed in one immutable weekly build: records added, retired and re-verified, companies dissolved, job changes confirmed, suppressions applied, coverage by field and the input snapshots.

Source: https://emailmovers.com/mydatahub/docs/reference/rest/get-dataset-version

`GET /v1/datasets/{dataset}/versions/{version}`

What changed in one immutable weekly build: records added, retired and re-verified, companies dissolved, job changes confirmed, suppressions applied, coverage by field and the input snapshots.

| Property | Value |
| --- | --- |
| Endpoint | `GET https://mydatahub.emailmovers.com/v1/datasets/{dataset}/versions/{version}` |
| Operation id | `getDatasetVersion` |
| Cost | Free (0 credits) |
| Access | No account, key or token needed. |
| Tag | Catalogue |

> **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 page describes the contract the API is tested against.

## Request

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `dataset` | path | enum: `uk_contacts`, `ie_contacts`, `global_contacts` | yes | The dataset an audience draws from. uk_contacts is live; ie_contacts and global_contacts are listed but not yet served. |
| `version` | path | string | yes | The immutable weekly build a count is bound to, such as 2026-W39. The last 52 stay queryable. |
| `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

```bash
curl "https://mydatahub.emailmovers.com/v1/datasets/uk_contacts/versions/2026-W39"
```

## Responses

### 200: The version's changelog.

Headers: `RateLimit`, `RateLimit-Policy`.

| Member | Type | Always present | Description |
| --- | --- | --- | --- |
| `dataset` | enum: `uk_contacts`, `ie_contacts`, `global_contacts` | yes | The dataset an audience draws from. uk_contacts is live; ie_contacts and global_contacts are listed but not yet served. |
| `version` | string | yes | The immutable weekly build a count is bound to, such as 2026-W39. The last 52 stay queryable. |
| `built_at` | string (date-time) | yes |  |
| `checksum` | string | yes | SHA-256 over the version's files. |
| `row_counts` | object | yes |  |
| `row_counts.companies` | integer (0 or more) | yes |  |
| `row_counts.sites` | integer (0 or more) | yes |  |
| `row_counts.contacts` | integer (0 or more) | yes |  |
| `row_counts.emails` | integer (0 or more) | yes |  |
| `row_counts.phones` | integer (0 or more) | yes |  |
| `changes` | object | yes |  |
| `changes.records_added` | integer (0 or more) | yes |  |
| `changes.records_retired` | integer (0 or more) | yes |  |
| `changes.records_reverified` | integer (0 or more) | yes |  |
| `changes.companies_dissolved` | integer (0 or more) | yes |  |
| `changes.job_changes_confirmed` | integer (0 or more) | yes |  |
| `changes.suppressions_applied` | integer (0 or more) | yes |  |
| `coverage_pct` | map of number (0 to 100) | yes | Share of contacts holding each field, such as named_email. |
| `input_snapshots` | array of object | yes |  |
| `input_snapshots[].source` | string | yes |  |
| `input_snapshots[].as_of` | string (date) | yes |  |

#### Example response

```json
{
  "dataset": "uk_contacts",
  "version": "2026-W39",
  "built_at": "2026-09-21T04:00:00Z",
  "checksum": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
  "row_counts": {
    "companies": 5689369,
    "sites": 3232415,
    "contacts": 9028587,
    "emails": 1660190,
    "phones": 1210000
  },
  "changes": {
    "records_added": 4120,
    "records_retired": 1870,
    "records_reverified": 118400,
    "companies_dissolved": 15130,
    "job_changes_confirmed": 210,
    "suppressions_applied": 96
  },
  "coverage_pct": {
    "named_email": 17.8,
    "email": 18.4
  },
  "input_snapshots": [
    {
      "source": "companies_house",
      "as_of": "2026-09-01"
    },
    {
      "source": "onspd",
      "as_of": "2026-08-01"
    }
  ]
}
```

## 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](https://emailmovers.com/mydatahub/docs/rate-limits.md).

| Status | Problem codes | When |
| --- | --- | --- |
| 400 | [`invalid-request`](https://emailmovers.com/mydatahub/docs/errors/invalid-request.md), [`idempotency-key-required`](https://emailmovers.com/mydatahub/docs/errors/idempotency-key-required.md), [`unsupported-version`](https://emailmovers.com/mydatahub/docs/errors/unsupported-version.md) | The request could not be read, or an Idempotency-Key is missing. |
| 404 | [`not-found`](https://emailmovers.com/mydatahub/docs/errors/not-found.md) | No such object for this organisation. |
| 429 | [`rate-limited`](https://emailmovers.com/mydatahub/docs/errors/rate-limited.md) | Too many requests. Wait for Retry-After. |
| Any other failure | [`internal-error`](https://emailmovers.com/mydatahub/docs/errors/internal-error.md), [`service-unavailable`](https://emailmovers.com/mydatahub/docs/errors/service-unavailable.md), [`tps-screen-expired`](https://emailmovers.com/mydatahub/docs/errors/tps-screen-expired.md) | 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. |
