---
title: "List ad accounts"
method: GET
path: "/v1/ads/accounts"
tags: ["Ad Accounts"]
---

# List ad accounts

`GET /v1/ads/accounts`

Returns the platform ad accounts available for the given account (e.g. Meta ad
accounts, TikTok advertiser IDs, Google Ads customer IDs).
Meta business-login accounts use their own system-user token. Fresh Meta discovery
includes businessId and businessName from the owning Business Manager when available;
cached entries gain these fields after the next discovery refresh.

For TikTok agencies: enumerates every advertiser under every Business Center the token
can read (paginated server-side), then chunks the lookup against TikTok's
`/advertiser/info/` endpoint (which has a per-call cap of ≤100 IDs). Solo advertisers
without a BC fall back to the OAuth-time `advertiser_ids` list. Cached for 1h on the
SocialAccount; lazy-refreshed on first call after expiry.

For Google Ads: responds `429` when Google's API quota is temporarily exhausted
(instead of an empty list). Retry after a delay.

## Query parameters

- `accountId` string, required
- `adAccountId` string
- `limit` integer

## Response `200`

Ad accounts

- object
  - `accounts` object[]
    - `id` string — Platform ad account ID (e.g. act_123)
    - `name` string
    - `currency` string
    - `businessId` string — Meta only. Owning Business Manager ID when available on the grant.
    - `businessName` string — Owning business name when supplied by the platform.
    - `status` string — LinkedIn only. LinkedIn's own ad account status. In practice always `ACTIVE`, because the LinkedIn query filters to active accounts. Meta, Google, TikTok and Pinterest report `accountStatus` instead; X reports `approvalStatus`.
    - `accountStatus` unknown
    - `approvalStatus` string — X only. X's own ad account approval status. Observed values are `ACCEPTED`, `PENDING` and `REJECTED`, but X does not publish the full vocabulary, so treat an unrecognised value as not usable. Other platforms report `accountStatus` or `status` instead.
    - `disableReason` integer — Meta only. Meta's `disable_reason` code, forwarded unchanged. Present when `accountStatus` is `2` (DISABLED) and Meta gives a reason, which is what separates a policy action from a payment problem. Meta does not publish a stable list of values for this field, so none are enumerated here: resolve the code against Meta's own ad account reference. Absent when Meta reports no reason, or when the connected token cannot read the field.
    - `timezoneName` string — IANA timezone of the ad account (Meta only). Drives daily-budget reset and Insights day boundaries.
    - `timezoneOffsetHoursUtc` number — Signed UTC offset in hours, reflecting current DST (Meta only).
    - `minimumDailyBudget` number — Meta only. Minimum daily budget for the account, in the account currency's major units. This is the impressions-billed minimum; other billing events have higher minimums. Absent when the connected token cannot read it.
    - `fundingSource` string — Meta only. Meta's `funding_source` ID for the ad account, forwarded unchanged. ABSENT when this connection's token cannot see billing on the account, which is not the same as the account having no payment method: never read the missing key as `no payment method configured`.
    - `fundingSourceDetails` object — Meta only. Meta's `funding_source_details` object, forwarded unchanged. ABSENT under exactly the same condition as `fundingSource`: this connection's token cannot see billing on the ad account. It is never sent as null or as an empty object, so treat the missing key as 'unknown', never as 'no payment method configured'.
      - `id` string — Meta's ID for the funding instrument. Matches `fundingSource`.
      - `displayString` string — Meta's own human-readable label for the funding instrument, e.g. 'Available Balance (EUR)' or a masked card. Meta composes this string; do not parse it.
      - `type` integer — Meta's raw numeric funding-source type, forwarded unchanged. Meta publishes no mapping from these numbers to payment-method kinds, so none is documented here and none should be inferred.
    - `selectable` boolean — Meta and X only. Whether the account can create/run ads now. Absent (treat as true) on other platforms.
    - `unusableReason` string, nullable — Meta and X only. Human-readable reason when selectable is false; null when selectable.
  - `cachedAt` string, date-time, nullable — Google only. When this list was fetched from Google. Null when it was never served from cache, or on other platforms.
  - `stale` boolean — Google only. True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read. Absent on other platforms.

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `404` — The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `409` — The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.
- `422` — Platform ads connection required (TikTok Ads, X Ads) or Instagram missing linked Facebook account
- `429` — The connected account's upstream platform quota is exhausted. Reddit rate-limits per connected Reddit user (1000 requests per 10-minute window), and that budget is shared by every operation using that account. Retry after the window resets rather than retrying immediately; repeated calls while exhausted do not succeed and keep the budget spent.

## Changes

- **2026-09-21** `339f59df69dd` — 2 info
  - added the optional property `accounts/items/fundingSource` to the response with the `200` status
  - added the optional property `accounts/items/fundingSourceDetails` to the response with the `200` status
- **2026-09-16** `3e6ddf2a99ea` — 4 info
  - added the optional property `details/budgetScope` to the response with the `400` status
  - added the optional property `details/budgetScope` to the response with the `404` status
  - added the optional property `details/budgetScope` to the response with the `409` status
  - added the optional property `details/budgetScope` to the response with the `429` status
- **2026-09-15** `0dba7d004d75` — 8 info
  - added the optional property `details/quotaExhausted` to the response with the `400` status
  - added the optional property `details/quotaExhausted` to the response with the `404` status
  - added the optional property `details/quotaExhausted` to the response with the `409` status
  - added the optional property `details/quotaExhausted` to the response with the `429` status
  - …4 more
- **2026-09-10** `e70ed06e7150` — 5 info
  - added the non-success response with the status `400`
  - added the non-success response with the status `404`
  - added the non-success response with the status `409`
  - added the optional property `accounts/items/businessId` to the response with the `200` status
  - …1 more
- …earlier changes not shown

[Full history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/accounts/get.md)

---

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