---
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 social account (e.g. Meta ad
accounts, TikTok advertiser IDs, Google Ads customer IDs).

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

## Other responses

- `401` — Unauthorized
- `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.

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/f81ca70ea6b9/schema)
