AdCrunch API
Every AdCrunch API, in one document. Each API also publishes its own, at /openapi/<name>.json.
One origin serves the four, and the first segment of a path names the API. /observe reads the campaigns, the ads and the Insights of the ad accounts your organization connects. /mutations changes what runs on them. /context holds the Skills, Brands, Personas, Documents and Campaign Plans an organization writes down for its agents. /assets holds your images and videos, and places them in the library of an ad account.
One credential works on the four — see the security scheme.
The guide explains what these operations share: authentication, the failure shape, and the conventions for ids, money, time and pagination. It also describes three flows that span several operations: a change, an upload, and an edit that does not overwrite.
Start at https://docs.adcrunch.dev/api/introduction.
https://api.pr-1099.adcrunch.devInsights
Aggregated metrics for any level: advertiser, campaign, ad group or ad. The metrics include spend, impressions, clicks, reach and conversions. Group the rows into days, weeks or months, and break them down by provider, by advertiser or by entity type. A date range is required.
Campaigns
The campaigns of your advertisers. Every provider calls a campaign campaign. This tag holds the live reads and the changes of one advertiser. For the stored list of every advertiser of your organization, see Stored reads. On Meta, you can also change the status, the name, the budget and the bidding of a campaign. You can also create a campaign or copy one. A change is asynchronous. The operation answers 202 and starts a Mutation. You poll the Mutation for its outcome.
- GETList an advertiser’s campaigns
/observe/{advertiserId}/campaigns - GETGet one campaign
/observe/{advertiserId}/campaigns/{id} - POSTCreate a campaign
/mutations/{advertiserId}/campaigns - PATCHUpdate a campaign’s status
/mutations/{advertiserId}/campaigns/{id}/status - PATCHUpdate a campaign’s budget
/mutations/{advertiserId}/campaigns/{id}/budget - PATCHUpdate a campaign’s bidding
/mutations/{advertiserId}/campaigns/{id}/bidding - PATCHUpdate a campaign’s name
/mutations/{advertiserId}/campaigns/{id}/name - POSTCopy a campaign
/mutations/{advertiserId}/campaigns/{id}/copies
Ad groups
The ad groups of your advertisers. The providers use different words for one concept. Meta calls it an ad set. TikTok and Google Ads call it an ad group. Each row keeps the word of its provider in type. A Performance Max campaign has no ad groups. Read its asset groups instead. This tag holds the live reads and the changes of one advertiser. For the stored list of every advertiser of your organization, see Stored reads. On Meta, you can also change the status, the name, the budget, the bidding and the schedule of an ad set. You can also create an ad set or copy one. A change is asynchronous. The operation answers 202 and starts a Mutation. You poll the Mutation for its outcome.
- GETList an advertiser’s ad groups
/observe/{advertiserId}/ad-groups - GETGet one ad group
/observe/{advertiserId}/ad-groups/{id} - POSTCreate an ad group
/mutations/{advertiserId}/ad-groups - PATCHUpdate an ad group’s status
/mutations/{advertiserId}/ad-groups/{id}/status - PATCHUpdate an ad group’s budget
/mutations/{advertiserId}/ad-groups/{id}/budget - PATCHUpdate an ad group’s schedule
/mutations/{advertiserId}/ad-groups/{id}/schedule - PATCHUpdate an ad group’s bidding
/mutations/{advertiserId}/ad-groups/{id}/bidding - PATCHUpdate an ad group’s name
/mutations/{advertiserId}/ad-groups/{id}/name - POSTCopy an ad group
/mutations/{advertiserId}/ad-groups/{id}/copies
Ads
The ads of your advertisers. Meta and TikTok call it an ad. Google Ads calls it an ad_group_ad. That is a link resource, and its id is the composite {adGroupId}~{adId}. Filter by adGroupId for the ads of one ad group. Filter by campaignId for every ad of a campaign. A Performance Max campaign has no ads. This tag holds the live reads and the changes of one advertiser. For the stored list of every advertiser of your organization, see Stored reads. On Meta, you can also change the status and the name of an ad. You can also create an ad. A change is asynchronous. The operation answers 202 and starts a Mutation. You poll the Mutation for its outcome.
- GETList an advertiser’s ads
/observe/{advertiserId}/ads - GETGet one ad
/observe/{advertiserId}/ads/{id} - POSTCreate an ad
/mutations/{advertiserId}/ads - PATCHUpdate an ad’s status
/mutations/{advertiserId}/ads/{id}/status - PATCHUpdate an ad’s name
/mutations/{advertiserId}/ads/{id}/name
Creatives
The creatives of your advertisers. A provider assembles a creative for an ad: the image or video, the headline, the body copy and the call to action. A Creative belongs to the account. Meta is the only provider that has one. TikTok puts its creative material in the Ad itself. Google Ads keeps its creative material on the ad_group_ad link resource. A Creative is not an Asset. An Asset is a source media file that your organization owns. This tag holds the live reads and the changes of one advertiser. For the stored list of every advertiser of your organization, see Stored reads. On Meta, you can also create a creative from an Asset that you registered to the advertiser. A change is asynchronous. The operation answers 202 and starts a Mutation. You poll the Mutation for its outcome.
- GETList an advertiser’s creatives
/observe/{advertiserId}/creatives - GETGet one creative
/observe/{advertiserId}/creatives/{id} - POSTCreate a creative
/mutations/{advertiserId}/creatives
Asset groups
The asset groups of your advertisers. Performance Max’s delivery container, and Google Ads only. A Performance Max campaign has no ad groups and no ads — the asset group holds what its automation assembles into placements. A child of a campaign and a sibling of an ad group.
- GETList an advertiser’s asset groups
/observe/{advertiserId}/asset-groups - GETGet one asset group
/observe/{advertiserId}/asset-groups/{id}
Stored reads
The stored lists of campaigns, ad groups, ads, creatives and asset groups. A stored read answers from what the AdCrunch ingestion stored. It reads every advertiser of your organization in one request. Send advertiserId to read one advertiser. A stored read does not call the provider. To ask the provider now, use the live read under the tag of the resource.
- GETList campaigns
/observe/campaigns - GETList ad groups
/observe/ad-groups - GETList ads
/observe/ads - GETList creatives
/observe/creatives - GETList asset groups
/observe/asset-groups
Mutations
Poll a Mutation that you started, and read the organization history. The route of each change sits under the tag of the object that it changes, beside the reads of that object. POST /mutations is deprecated.
Skills
Your organization’s ad-ops playbooks. List them, read one, or write one. The slug is the handle an agent uses. You can also import a Catalog Skill from the Skill Catalog, the playbooks that AdCrunch writes, and re-import it when AdCrunch publishes a later version.
- GETList the Skills
/context/skills - POSTCreate a Skill
/context/skills - GETGet a Skill by slug
/context/skills/{slug} - DELETEDelete a Skill
/context/skills/{slug} - PATCHUpdate a Skill
/context/skills/{slug} - POSTRe-import a Skill
/context/skills/{slug}/re-import - GETList the Skill Catalog
/context/skill-catalog - POSTImport a Catalog Skill
/context/skill-catalog/{catalogSlug}/import
Brands
Your organization’s brand context: identity, voice, guidelines and messaging, written as markdown. A list gives you the name, the description, the logo and which of the four sections carry prose. Read one Brand to get its narrative. The slug is the handle an agent uses.
- GETList the Brands
/context/brands - POSTCreate a Brand
/context/brands - GETGet a Brand by slug
/context/brands/{slug} - DELETEDelete a Brand
/context/brands/{slug} - PATCHUpdate a Brand
/context/brands/{slug} - GETList a Brand's advertisers
/context/brands/{slug}/advertisers - POSTAttach an advertiser
/context/brands/{slug}/advertisers - DELETEDetach an advertiser
/context/brands/{slug}/advertisers/{advertiserId}
Personas
The audiences a Brand speaks to, described as people. A Persona belongs to one Brand only, and you address it through that Brand. Its handle is thus the pair of slugs, and two Brands can each hold a loyalists. Two Brands that describe the same real person hold two Personas, and not one shared Persona.
- GETList a Brand's Personas
/context/brands/{slug}/personas - POSTCreate a Persona
/context/brands/{slug}/personas - GETGet a Persona
/context/brands/{slug}/personas/{personaSlug} - DELETEDelete a Persona
/context/brands/{slug}/personas/{personaSlug} - PATCHUpdate a Persona
/context/brands/{slug}/personas/{personaSlug}
Documents
Files attached to a Brand, such as a logo or a guidelines PDF. The bytes do not go through this API: reserve the upload, send the bytes to the URL you get back, then finalize. A Document is reference material that an agent reads. It never leaves AdCrunch, and this is what makes it different from an Asset.
- GETList a Brand's documents
/context/brands/{slug}/documents - POSTStart a document upload
/context/brands/{slug}/documents - POSTFinalize a document upload
/context/brands/{slug}/documents/{documentId}/finalize - GETGet a document
/context/brands/{slug}/documents/{documentId} - DELETEDelete a document
/context/brands/{slug}/documents/{documentId}
Campaign Plans
What your organization intends to run, before it buys: on which channels, for whom, for how much, and over what period. A Campaign Plan is not a provider campaign. It belongs to AdCrunch, and it comes before any provider. The campaigns that a Campaign Plan later produces are in the Observe API. Write each amount in whole units of the currency of that Campaign Plan.
- GETList the Campaign Plans
/context/campaign-plans - POSTCreate a Campaign Plan
/context/campaign-plans - GETGet a Campaign Plan
/context/campaign-plans/{slug} - DELETEDelete a Campaign Plan
/context/campaign-plans/{slug} - PATCHUpdate a Campaign Plan
/context/campaign-plans/{slug} - POSTApprove a Campaign Plan
/context/campaign-plans/{slug}/approve
Line Items
The rows of a Campaign Plan. One Line Item is one thing you buy. It is coarser than an ad set: it holds the envelope of an intent, and it can produce more than one provider object. Therefore it holds only what is the same for all of them. A Line Item has no handle of its own. Address it through its Campaign Plan.
- POSTAdd a Line Item
/context/campaign-plans/{slug}/line-items - DELETEDelete a Line Item
/context/campaign-plans/{slug}/line-items/{lineItemId} - PATCHUpdate a Line Item
/context/campaign-plans/{slug}/line-items/{lineItemId} - POSTValidate a Line Item
/context/campaign-plans/{slug}/line-items/{lineItemId}/validate - GETCheck a Line Item’s execution readiness
/context/campaign-plans/{slug}/line-items/{lineItemId}/readiness - POSTRecord what a Line Item spawned
/context/campaign-plans/{slug}/line-items/{lineItemId}/executions
Assets
An organization’s source media. Reserve an upload, transfer the bytes directly to storage, then finalize — which is where what actually landed is validated.
- GETList the organization Assets
/assets - POSTReserve an Asset and mint an upload URL
/assets/uploads - POSTFinalize an uploaded Asset
/assets/{id}/finalize - GETGet one Asset
/assets/{id} - DELETEDelete an Asset
/assets/{id} - PATCHRename an Asset
/assets/{id} - POSTRegister an Asset to an advertiser
/assets/{id}/registrations