---
title: "A company's ATS vendor switches"
method: GET
path: "/v1/companies/{company_id}/ats-migrations"
---

# A company's ATS vendor switches

`GET /v1/companies/{company_id}/ats-migrations`

## Request

- Base URL: `https://api.reqbeat.com`
- URL: `https://api.reqbeat.com/v1/companies/{company_id}/ats-migrations`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

A company's ATS-vendor switches -- ledger-backed, with a
provenance-wrapped `occurred_at`. No LinkedIn exclusion needed: ATS
platform accounts have no LinkedIn dimension.

Requires the `read` scope.

## Path parameters

- `company_id` integer, required: The plane's company id -- returned as `company_id` by /v1/reqs/search and by every company motion response.

## Headers

- `Idempotency-Key` string, nullable

## Response `200`

Successful Response

- AtsMigrationsResponse
  - `migrations` MigrationEventOut[], required
    - `from_vendor` string, required
    - `to_vendor` string, required
    - `occurred_at` ProvenanceOut, required
      - `value` unknown, required
      - `source_board` string, nullable: The board this value was read from. Null when the value is computed across many boards rather than read from one -- every hiring-pulse scalar is, so it is always null there; the boards behind the pulse are listed once in its `source_boards`.
      - `observed_at` string, date-time, nullable: When this value was observed. For a value computed across the company's whole ledger (every hiring-pulse scalar) this is the time it was computed -- the request time, equal to the pulse's `as_of` -- not when any posting behind it was last seen.
  - `as_of` string, date-time, required

## Other responses

- `401`: No API key was sent.
- `402`: The key is over its plan's rolling call quota, or the account is past its spend cap. `upgrade_url` and `purchase_url` are the ways out.
- `403`: The presented key is invalid or revoked, or (see `x-required-scope` on this operation) it does not carry the scope this operation requires.
- `422`: Validation Error
- `429`: Too many calls in the current 60-second window. The limit is per API key, set by the key's plan, and shared by every metered REST route and MCP tool; the shared demo key is limited per IP address instead. Wait `Retry-After` seconds and retry. The `RateLimit-*` headers are absent when `reason` is `key_throttled`.

---

[API](https://skmtc.dev/reqbeat/apis/reqbeat-api.md) · [All operations](https://skmtc.dev/reqbeat/apis/reqbeat-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reqbeat/apis/reqbeat-api/revisions/4758e5957e8c?raw)
