---
search:
  tags:
    - Campaigns
    - GET
seo:
  description: >-
    Available on: Meta TikTok Google Ads Reference for the GET
    /observe/campaigns endpoint in the AdCrunch API.
sidebar:
  label: 'Stored read: List campaigns'
  badge: GET
title: 'Stored read: List campaigns'
type: openapi-operation
---
**Available on:** [![Meta](/providers/meta.svg)](https://docs.adcrunch.dev/connect/providers) [![TikTok](/providers/tiktok.svg)](https://docs.adcrunch.dev/connect/providers) [![Google Ads](/providers/gads.svg)](https://docs.adcrunch.dev/connect/providers)

Lists the campaigns of every ad account your organization connects, across the providers, newest first.

A campaign is a `campaign` at every provider, so this reads them all in one call. Send `provider` to read one platform.

## Paging

`limit` counts rows of the answer itself, not rows of each advertiser, so a `limit` of 10 answers at most 10 rows however many advertisers you own. When the answer holds `nextCursor`, more rows exist: send it back as `cursor` to get the next page. The row that AdCrunch stored last comes first, so a campaign that arrives while you page does not move a page you already read.

## Where a campaign comes from

This is a **stored read**: it answers what AdCrunch holds, which its ingestion refreshes. A campaign a person changed in the provider’s own interface a moment ago may not be here yet — name one advertiser in the path, `/observe/{advertiserId}/campaigns`, to read the provider itself.

## Budget and objective

Every row carries its `budget`, in **whole units** of its `currency` — the unit of `spend` on an Insight — with `budgetType` and `budgetLevel`. `budgetLevel` says whether the budget lives on the campaign or on its ad groups; when it is `ad_group`, read `/observe/ad-groups` for the amounts. `objective` is the provider’s own word, and it is null on a Google Ads campaign, which has none.

A row carries the fields AdCrunch normalizes. For the provider’s own payload, read one campaign by id.

`GET /observe/campaigns`
