---
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 both when this connection's token cannot see billing and when the account has no payment method; read `billingStatus` to tell the two apart.
    - `fundingSourceDetails` object — Meta only. Meta's `funding_source_details` object, forwarded unchanged. ABSENT under exactly the same conditions as `fundingSource`, never sent as null or as an empty object. Read `billingStatus` for what the absence means.
      - `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.
    - `billingStatus` 'ok' | 'missing' | 'unknown' — Meta only. Whether the ad account has a payment method, derived as follows: - `missing` when `accountStatus` is `3` (UNSETTLED) or `9` (IN_GRACE_PERIOD), when `disableReason` is `3` (RISK_PAYMENT), or when the connected person has the MANAGE task on the account (admin, who always sees billing) and Meta returns no funding source. Ad creation on such an account fails at the ad step with Meta code 100 / subcode 1359188: add a payment method in Meta's Billing & payments center. - `ok` when Meta returns a funding source. This is presence, not validity: Meta can still refuse the card or balance at ad creation. - `unknown` when the connected person is not an admin of the account, or the token cannot read the billing fields.
    - `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. Google Ads: writes and reports run on one developer token shared by every Google Ads account on Zernio. The token holds Standard access (no daily operations cap), so this only happens when Google throttles the token or your ad account. The envelope has `code: rate_limited`, `platform: google`, `details.quotaScope: DEVELOPER` (`ACCOUNT` when it is your own ad account's quota), `details.resetsAt` (ISO instant when Google accepts requests again) and `Retry-After` counting down to it. Retrying earlier cannot succeed.

## Changes

- **2026-09-25** `2c04683ce694` — 17 info
  - added the optional property `accounts/items/billingStatus` to the response with the `200` status
  - added the optional property `details/adAccountId` to the response with the `400` status
  - added the optional property `details/adAccountId` to the response with the `404` status
  - added the optional property `details/adAccountId` to the response with the `409` status
  - …13 more
- **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
- …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/b2325332041a?raw)
