---
title: Introduction
description: What the AdCrunch REST API does, when to use it instead of MCP, and how to make your first request with an API key.
---

The AdCrunch REST API gives your own code the access that an AI agent has over MCP, and four operations more: it reads the mutation history, it lists the Personas of a Brand, and it renames and deletes an Asset. An **advertiser** is an ad account that your organization connects to AdCrunch. The API reads the campaigns and the performance of your advertisers. It changes what runs on them. It stores the context that your agents read. It stores the images and videos that your ads use.

## Four APIs, one origin

The four APIs answer at one origin, `https://api.adcrunch.dev`. The first segment of a path names the API.

| API | Path | What it does |
| --- | --- | --- |
| Observe | `/observe` | Reads campaigns, ad groups, ads, creatives, asset groups, and their Insights. |
| Mutations | `/mutations` | Changes what runs on an advertiser: a status, a budget, or a new object. It records each change. |
| Context | `/context` | Stores Skills, Brands, Personas, Documents, and Campaign Plans. |
| Assets | `/assets` | Stores your images and videos, and places them in the library of an advertiser. |

One credential works on the four APIs. See [Authentication](/api/authentication).

Not every provider supports every operation. [What each provider supports](/connect/providers) is the one table for each provider.

## HTTP or MCP?

The two surfaces run the same code. They use the same words, and they obey the same permissions. Choose by who calls.

- **MCP** is for an AI agent in a conversation: Claude, ChatGPT, or Cursor. A person signs in through the browser, and the agent acts for that person. See [Connect to AI agents](/mcp).
- **The REST API** is for code that you write: a script, a scheduled job, or a backend service. No person is present to sign in, so the code sends an [API key](/account/api-keys).

## Your first request

Create an API key in the console, under **Settings → API keys**. Then list the campaigns of each of your advertisers:

```bash
curl https://api.adcrunch.dev/observe/campaigns \
  -H "Authorization: Bearer $ADCRUNCH_API_KEY"
```

The answer is one page of campaigns, from all your advertisers and all your providers:

```json
{
  "data": [
    {
      "provider": "meta",
      "advertiserId": "acc_1203456789012345",
      "type": "campaign",
      "id": "120210000000000",
      "name": "Spring sale",
      "status": "ACTIVE",
      "currency": "EUR",
      "budget": 50
    }
  ],
  "pagination": { "limit": 500, "offset": 0, "total": 1 },
  "source": "store"
}
```

This row is shorter than a real row. [List campaigns](/api/campaigns/list-campaigns) shows each field.

## What the API does not do

No field or permission turns these limits off.

- **A create never starts spend.** Each campaign, ad set, and ad that the API creates starts paused.
- **The API deletes nothing at a provider.** It archives an object instead.
- **The API acts only on your organization.** The credential names the organization. No parameter can name a different one.

[Make a change](/api/make-a-change) explains the first two limits.

## Read the API as OpenAPI

The whole API is one OpenAPI 3 document at `https://api.adcrunch.dev/openapi.json`. Give it to a code generator or to an API client. Each API also publishes its own document:

- `https://api.adcrunch.dev/openapi/observe.json`
- `https://api.adcrunch.dev/openapi/mutations.json`
- `https://api.adcrunch.dev/openapi/context.json`
- `https://api.adcrunch.dev/openapi/assets.json`

## Pricing

The [pricing page](https://adcrunch.dev/pricing/) states what each plan includes.

## Next

**[Authentication](/api/authentication)**

Send a key, and learn which permission each API needs.

**[Errors](/api/errors)**

Read a failure, and branch on its code.

**[Conventions](/api/conventions)**

Ids, money, time, casing, and pagination.

**[Make a change](/api/make-a-change)**

Pause a campaign, and follow the change until it ends.
