Ga naar inhoud

Marketing en rapportage

De cijfers van de klant, de advertenties die ze bewegen, de container die ze meet, en het maandelijkse document dat ze uitlegt.

118 endpoints, verdeeld over 4 groepen. Een recht geschreven als module.resource.action:own heeft een bereik: :own dekt rijen die van jou zijn, :any die van iedereen, en :any voldoet aan een controle op :own.

EndpointRecht
GET /marketing/accountsmarketing.link.manage
GET /marketing/clientsmarketing.metrics.read
GET /marketing/companies/{company_id}/drilldownmarketing.metrics.read
GET /marketing/companies/{company_id}/metricsmarketing.metrics.read
GET /marketing/companies/{company_id}/settingsmarketing.metrics.read
PUT /marketing/companies/{company_id}/settingsmarketing.link.manage
GET /marketing/linksmarketing.metrics.read
POST /marketing/linksmarketing.link.manage
DELETE /marketing/links/{link_id}marketing.link.manage
GET /marketing/overviewmarketing.overview.read
GET /marketing/settingsmarketing.link.manage
PUT /marketing/settingsmarketing.link.manage
GET /marketing/summarymarketing.metrics.read
Parameters en schema’s per endpoint

Available Accounts — The accounts/properties/sites the caller’s connection can reach for source.

Recht: marketing.link.manage

Queryparameters:

NaamTypeBetekenis
sourceMarketingSource · verplicht
website_idstringRequired for a source whose credential is per website (rankmath); ignored by every other source.

Antwoord: 200 · AccountsResponse

Linked Clients — The clients that actually have a source linked, with which sources and how each is doing.

Recht: marketing.metrics.read

Queryparameters:

NaamTypeBetekenis
limitinteger(default 200)

Antwoord: 200 · MarketingClientList

GET /api/v1/marketing/companies/{company_id}/drilldown

Section titled “GET /api/v1/marketing/companies/{company_id}/drilldown”

Drilldown — A live tier-2 drill-down (top pages/queries/campaigns), Redis-cached ~1h.

Recht: marketing.metrics.read

Padparameters: company_id

Queryparameters:

NaamTypeBetekenis
link_idstring · verplicht
kindstring · verplicht
range_daysinteger(default 30)
periodstringThe span to report on: a trailing window (30d, 90d, 365d), a preset (month, last_month, quarter, last_quarter) or a named calendar period (2026-07, 2026-Q3). Wins over range_days; an unknown value falls back to 30d.

Antwoord: 200 · DrilldownResponse

GET /api/v1/marketing/companies/{company_id}/metrics

Section titled “GET /api/v1/marketing/companies/{company_id}/metrics”

Company Metrics

Recht: marketing.metrics.read

Padparameters: company_id

Queryparameters:

NaamTypeBetekenis
range_daysinteger(default 30)
periodstringThe span to report on: a trailing window (30d, 90d, 365d), a preset (month, last_month, quarter, last_quarter) or a named calendar period (2026-07, 2026-Q3). Wins over range_days; an unknown value falls back to 30d.

Antwoord: 200 · CompanyMarketing

GET /api/v1/marketing/companies/{company_id}/settings

Section titled “GET /api/v1/marketing/companies/{company_id}/settings”

Get Company Settings — This client’s marketing preferences, and what they resolve to.

Recht: marketing.metrics.read

Padparameters: company_id

Antwoord: 200 · CompanySettingsRead

PUT /api/v1/marketing/companies/{company_id}/settings

Section titled “PUT /api/v1/marketing/companies/{company_id}/settings”

Set Company Settings — Per-client marketing preferences: the curated tab layout (#192), the comparison this client’s dashboard measures against (#312) and the legacy key-events toggle (#134).

Recht: marketing.link.manage

Padparameters: company_id

Request body: CompanySettingsUpdate

Antwoord: 200 · CompanySettingsRead

List Links

Recht: marketing.metrics.read

Queryparameters:

NaamTypeBetekenis
company_idstring · verplicht

Antwoord: 200 · app__modules__marketing__schemas__LinkRead[]

Create Link

Recht: marketing.link.manage

Request body: app__modules__marketing__schemas__LinkCreate

Antwoord: 201 · app__modules__marketing__schemas__LinkRead

Unlink

Recht: marketing.link.manage

Padparameters: link_id

Antwoord: 204

Overview — The morning-coffee grid: one row per linked client, from stored data, server-sorted.

Recht: marketing.overview.read

Queryparameters:

NaamTypeBetekenis
range_daysinteger(default 30)
sortstringcompany_name | sessions | clicks | position | cost | conversions (- = desc)
periodstringThe span to report on: a trailing window (30d, 90d, 365d), a preset (month, last_month, quarter, last_quarter) or a named calendar period (2026-07, 2026-Q3). Wins over range_days; an unknown value falls back to 30d.

Antwoord: 200 · OverviewResponse

Get Settings — The org’s marketing settings — reports whether an Ads developer token is configured; the token itself is write-only and never returned (the Google client-secret pattern).

Recht: marketing.link.manage

Antwoord: 200 · MarketingSettingsRead

Save Settings — Store the encrypted Google Ads developer token (an empty value keeps the stored one).

Recht: marketing.link.manage

Request body: MarketingSettingsWrite

Antwoord: 200 · MarketingSettingsRead

Summary — The dashboard widget’s compact digest: top linked clients by their headline KPI, from stored data. Horizon-scoped like the per-company metrics read it summarizes — never wider than what the caller could fetch client-by-client.

Recht: marketing.metrics.read

Queryparameters:

NaamTypeBetekenis
range_daysinteger(default 30)
limitinteger(default 5)
periodstringThe span to report on: a trailing window (30d, 90d, 365d), a preset (month, last_month, quarter, last_quarter) or a named calendar period (2026-07, 2026-Q3). Wins over range_days; an unknown value falls back to 30d.

Antwoord: 200 · MarketingSummary

EndpointRecht
GET /google-ads/accountsgoogle_ads.account.read
POST /google-ads/accountsgoogle_ads.settings.manage
GET /google-ads/accounts/{account_id}google_ads.account.read
PATCH /google-ads/accounts/{account_id}google_ads.settings.manage
DELETE /google-ads/accounts/{account_id}google_ads.settings.manage
GET /google-ads/accounts/{account_id}/ad-groupsgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/ad-groupsgoogle_ads.campaign.write
PATCH /google-ads/accounts/{account_id}/ad-groups/{ad_group_id}google_ads.campaign.write
DELETE /google-ads/accounts/{account_id}/ad-groups/{ad_group_id}google_ads.campaign.write
DELETE /google-ads/accounts/{account_id}/ad-groups/{ad_group_id}/ads/{ad_id}google_ads.campaign.write
GET /google-ads/accounts/{account_id}/adsgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/adsgoogle_ads.campaign.write
PATCH /google-ads/accounts/{account_id}/adsgoogle_ads.campaign.write
POST /google-ads/accounts/{account_id}/budgetsgoogle_ads.budget.write
PATCH /google-ads/accounts/{account_id}/budgets/{budget_id}google_ads.budget.write
DELETE /google-ads/accounts/{account_id}/budgets/{budget_id}google_ads.budget.write
GET /google-ads/accounts/{account_id}/campaignsgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/campaignsgoogle_ads.campaign.write
PATCH /google-ads/accounts/{account_id}/campaigns/{campaign_id}google_ads.campaign.write
DELETE /google-ads/accounts/{account_id}/campaigns/{campaign_id}google_ads.campaign.write
GET /google-ads/accounts/{account_id}/changesgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/conversionsgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/decisionsgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/decisionsgoogle_ads.policy.manage
DELETE /google-ads/accounts/{account_id}/decisions/{decision_id}google_ads.policy.manage
GET /google-ads/accounts/{account_id}/devicesgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/geogoogle_ads.account.read
POST /google-ads/accounts/{account_id}/keyword-ideasgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/keywordsgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/keywordsgoogle_ads.keyword.write
PATCH /google-ads/accounts/{account_id}/keywordsgoogle_ads.keyword.write
POST /google-ads/accounts/{account_id}/keywords/removegoogle_ads.keyword.write
POST /google-ads/accounts/{account_id}/negative-listsgoogle_ads.negative.write
DELETE /google-ads/accounts/{account_id}/negative-lists/{shared_set_id}google_ads.negative.write
GET /google-ads/accounts/{account_id}/negativesgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/negativesgoogle_ads.negative.write
POST /google-ads/accounts/{account_id}/negatives/removegoogle_ads.negative.write
GET /google-ads/accounts/{account_id}/policygoogle_ads.policy.manage
PUT /google-ads/accounts/{account_id}/policygoogle_ads.policy.manage
DELETE /google-ads/accounts/{account_id}/policygoogle_ads.policy.manage
POST /google-ads/accounts/{account_id}/querygoogle_ads.query.run
GET /google-ads/accounts/{account_id}/recommendationsgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/search-termsgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/snapshotgoogle_ads.account.read
GET /google-ads/accounts/{account_id}/trendgoogle_ads.account.read
POST /google-ads/accounts/{account_id}/verifygoogle_ads.settings.manage
GET /google-ads/accounts/availablegoogle_ads.settings.manage
GET /google-ads/policygoogle_ads.policy.manage
PUT /google-ads/policygoogle_ads.policy.manage
DELETE /google-ads/policygoogle_ads.policy.manage
GET /google-ads/settingsgoogle_ads.settings.manage
PUT /google-ads/settingsgoogle_ads.settings.manage
Parameters en schema’s per endpoint

List Google Ads Accounts — Every linked Google Ads account this caller may see — start here.

Recht: google_ads.account.read

Queryparameters:

NaamTypeBetekenis
company_idstring
active_onlyboolean(default false)

Antwoord: 200 · GoogleAdsAccountRead[]

Link Google Ads Account — Link an Ads account to a client.

Recht: google_ads.settings.manage

Request body: GoogleAdsAccountCreate

Antwoord: 201 · GoogleAdsAccountRead

GET /api/v1/google-ads/accounts/{account_id}

Section titled “GET /api/v1/google-ads/accounts/{account_id}”

Get Google Ads Account

Recht: google_ads.account.read

Padparameters: account_id

Antwoord: 200 · GoogleAdsAccountRead

PATCH /api/v1/google-ads/accounts/{account_id}

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}”

Update Google Ads Account

Recht: google_ads.settings.manage

Padparameters: account_id

Request body: GoogleAdsAccountUpdate

Antwoord: 200 · GoogleAdsAccountRead

DELETE /api/v1/google-ads/accounts/{account_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}”

Unlink Google Ads Account — Deactivate the link. The row survives: history hangs off it, and a re-link must find the same account rather than collide with its own unique constraint.

Recht: google_ads.settings.manage

Padparameters: account_id

Antwoord: 204

GET /api/v1/google-ads/accounts/{account_id}/ad-groups

Section titled “GET /api/v1/google-ads/accounts/{account_id}/ad-groups”

Google Ads Ad Groups — Ad-group performance, most expensive first. One level below campaigns.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
include_removedboolean(default false)
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
statusstringOnly rows with this Google status: ENABLED, PAUSED or REMOVED. REMOVED implies include_removed, because a filter that always answers nothing is not a filter.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/ad-groups

Section titled “POST /api/v1/google-ads/accounts/{account_id}/ad-groups”

Create Google Ads Ad Group — Create an ad group inside an existing campaign. Paused, like everything created here.

Recht: google_ads.campaign.write

Padparameters: account_id

Request body: GoogleAdsAdGroupCreate

Antwoord: 201 · GoogleAdsMutationRead

PATCH /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}”

Update Google Ads Ad Group — Pause, resume, remove, rename or re-bid an ad group.

Recht: google_ads.campaign.write

Padparameters: account_id, ad_group_id

Request body: GoogleAdsAdGroupUpdate

Antwoord: 200 · GoogleAdsMutationRead

DELETE /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}”

Remove Google Ads Ad Group — Delete an ad group, with the keywords and ads inside it. Permanent at Google.

Recht: google_ads.campaign.write

Padparameters: account_id, ad_group_id

Queryparameters:

NaamTypeBetekenis
validate_onlybooleanCheck and change nothing. (default false)

Antwoord: 200 · GoogleAdsMutationRead

DELETE /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}/ads/{ad_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/ad-groups/{ad_group_id}/ads/{ad_id}”

Remove Google Ads Ad — Delete one ad. Permanent at Google — a replacement is a new ad with its own history.

Recht: google_ads.campaign.write

Padparameters: account_id, ad_group_id, ad_id

Queryparameters:

NaamTypeBetekenis
validate_onlybooleanCheck and change nothing. (default false)

Antwoord: 200 · GoogleAdsMutationRead

GET /api/v1/google-ads/accounts/{account_id}/ads

Section titled “GET /api/v1/google-ads/accounts/{account_id}/ads”

Google Ads Ads — Ads with their ad strength and policy approval status, most expensive first.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
statusstringOnly rows with this Google status: ENABLED, PAUSED or REMOVED. REMOVED implies include_removed, because a filter that always answers nothing is not a filter.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/ads

Section titled “POST /api/v1/google-ads/accounts/{account_id}/ads”

Create Google Ads Ad — Create a responsive search ad. It is paused until somebody reads it and enables it.

Recht: google_ads.campaign.write

Padparameters: account_id

Request body: GoogleAdsAdCreate

Antwoord: 201 · GoogleAdsMutationRead

PATCH /api/v1/google-ads/accounts/{account_id}/ads

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}/ads”

Update Google Ads Ad — Pause or resume one ad. status is ENABLED or PAUSED; to delete it, use DELETE.

Recht: google_ads.campaign.write

Padparameters: account_id

Request body: GoogleAdsAdUpdate

Antwoord: 200 · GoogleAdsMutationRead

POST /api/v1/google-ads/accounts/{account_id}/budgets

Section titled “POST /api/v1/google-ads/accounts/{account_id}/budgets”

Create Google Ads Budget — Create a daily budget, in the account’s own currency.

Recht: google_ads.budget.write

Padparameters: account_id

Request body: GoogleAdsBudgetCreate

Antwoord: 201 · GoogleAdsMutationRead

PATCH /api/v1/google-ads/accounts/{account_id}/budgets/{budget_id}

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}/budgets/{budget_id}”

Update Google Ads Budget — Change a daily budget — the one write where being wrong has already cost money.

Recht: google_ads.budget.write

Padparameters: account_id, budget_id

Request body: GoogleAdsBudgetUpdate

Antwoord: 200 · GoogleAdsMutationRead

DELETE /api/v1/google-ads/accounts/{account_id}/budgets/{budget_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/budgets/{budget_id}”

Remove Google Ads Budget — Delete a daily budget.

Recht: google_ads.budget.write

Padparameters: account_id, budget_id

Queryparameters:

NaamTypeBetekenis
validate_onlybooleanCheck and change nothing. (default false)

Antwoord: 200 · GoogleAdsMutationRead

GET /api/v1/google-ads/accounts/{account_id}/campaigns

Section titled “GET /api/v1/google-ads/accounts/{account_id}/campaigns”

Google Ads Campaigns — Campaign performance and settings, most expensive first.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]Filter by campaign name, case-insensitive substring match.
include_removedbooleanInclude removed campaigns. Off by default: a list where a third of the rows cannot be acted on is a worse answer to ‘what are we running’. Turn it on to ask what was spent on things since removed. (default false)
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
statusstringOnly rows with this Google status: ENABLED, PAUSED or REMOVED. REMOVED implies include_removed, because a filter that always answers nothing is not a filter.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/campaigns

Section titled “POST /api/v1/google-ads/accounts/{account_id}/campaigns”

Create Google Ads Campaign — Create a campaign. It is always paused and spends nothing until somebody enables it.

Recht: google_ads.campaign.write

Padparameters: account_id

Request body: GoogleAdsCampaignCreate

Antwoord: 201 · GoogleAdsMutationRead

PATCH /api/v1/google-ads/accounts/{account_id}/campaigns/{campaign_id}

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}/campaigns/{campaign_id}”

Update Google Ads Campaign — Pause, resume, remove or rename a campaign. status is ENABLED, PAUSED or REMOVED.

Recht: google_ads.campaign.write

Padparameters: account_id, campaign_id

Request body: GoogleAdsCampaignUpdate

Antwoord: 200 · GoogleAdsMutationRead

DELETE /api/v1/google-ads/accounts/{account_id}/campaigns/{campaign_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/campaigns/{campaign_id}”

Remove Google Ads Campaign — Delete a campaign. Permanent at Google — it can be recreated, never restored.

Recht: google_ads.campaign.write

Padparameters: account_id, campaign_id

Queryparameters:

NaamTypeBetekenis
validate_onlybooleanCheck and change nothing. (default false)

Antwoord: 200 · GoogleAdsMutationRead

GET /api/v1/google-ads/accounts/{account_id}/changes

Section titled “GET /api/v1/google-ads/accounts/{account_id}/changes”

Google Ads Changes — What was changed in the account, with each field’s old and new value.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/conversions

Section titled “GET /api/v1/google-ads/accounts/{account_id}/conversions”

Google Ads Conversion Health — What this account optimises toward, and what each conversion action actually recorded.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/decisions

Section titled “GET /api/v1/google-ads/accounts/{account_id}/decisions”

List Google Ads Decisions — What has already been decided about this account — check this before proposing a change.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
subject_typestring
decisionstring
include_withdrawnboolean(default false)
limitinteger(default 50)
offsetinteger(default 0)
countbooleanSet false to skip the total. (default true)

Antwoord: 200 · GoogleAdsDecisionPage

POST /api/v1/google-ads/accounts/{account_id}/decisions

Section titled “POST /api/v1/google-ads/accounts/{account_id}/decisions”

Record Google Ads Decision — Write down a judgement that changes nothing in Google.

Recht: google_ads.policy.manage

Padparameters: account_id

Request body: GoogleAdsDecisionCreate

Antwoord: 201 · GoogleAdsDecisionRead

DELETE /api/v1/google-ads/accounts/{account_id}/decisions/{decision_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/decisions/{decision_id}”

Withdraw Google Ads Decision — Unsay a decision. The row survives, marked withdrawn and by whom.

Recht: google_ads.policy.manage

Padparameters: account_id, decision_id

Antwoord: 200 · GoogleAdsDecisionRead

GET /api/v1/google-ads/accounts/{account_id}/devices

Section titled “GET /api/v1/google-ads/accounts/{account_id}/devices”

Google Ads Devices — Performance per device, per campaign, plus an account-wide rollup in extra.device_totals.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/geo

Section titled “GET /api/v1/google-ads/accounts/{account_id}/geo”

Google Ads Geo — Where the people who saw the ads physically were — not where the campaign targets.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/keyword-ideas

Section titled “POST /api/v1/google-ads/accounts/{account_id}/keyword-ideas”

Google Ads Keyword Ideas — Keyword ideas with search volume and competition, from seed terms or a landing page.

Recht: google_ads.account.read

Padparameters: account_id

Request body: GoogleAdsKeywordIdeaRequest

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/keywords

Section titled “GET /api/v1/google-ads/accounts/{account_id}/keywords”

Google Ads Keywords — Positive keywords with match type, bid and Quality Score, most expensive first.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
include_removedboolean(default false)
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
statusstringOnly rows with this Google status: ENABLED, PAUSED or REMOVED. REMOVED implies include_removed, because a filter that always answers nothing is not a filter.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/keywords

Section titled “POST /api/v1/google-ads/accounts/{account_id}/keywords”

Add Google Ads Keywords — Add positive keywords to one ad group. match_type is EXACT, PHRASE or BROAD.

Recht: google_ads.keyword.write

Padparameters: account_id

Request body: GoogleAdsKeywordsAdd

Antwoord: 201 · GoogleAdsMutationRead

PATCH /api/v1/google-ads/accounts/{account_id}/keywords

Section titled “PATCH /api/v1/google-ads/accounts/{account_id}/keywords”

Update Google Ads Keyword — Pause, resume, remove or re-bid one keyword.

Recht: google_ads.keyword.write

Padparameters: account_id

Request body: GoogleAdsKeywordUpdate

Antwoord: 200 · GoogleAdsMutationRead

POST /api/v1/google-ads/accounts/{account_id}/keywords/remove

Section titled “POST /api/v1/google-ads/accounts/{account_id}/keywords/remove”

Remove Google Ads Keywords — Remove keywords from an ad group, by criterion id.

Recht: google_ads.keyword.write

Padparameters: account_id

Request body: GoogleAdsKeywordsRemove

Antwoord: 200 · GoogleAdsMutationRead

POST /api/v1/google-ads/accounts/{account_id}/negative-lists

Section titled “POST /api/v1/google-ads/accounts/{account_id}/negative-lists”

Create Google Ads Negative List — Create a shared negative-keyword list and optionally attach it to campaigns.

Recht: google_ads.negative.write

Padparameters: account_id

Request body: GoogleAdsNegativeListCreate

Antwoord: 201 · GoogleAdsMutationRead

DELETE /api/v1/google-ads/accounts/{account_id}/negative-lists/{shared_set_id}

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/negative-lists/{shared_set_id}”

Remove Google Ads Negative List — Delete a shared negative-keyword list.

Recht: google_ads.negative.write

Padparameters: account_id, shared_set_id

Queryparameters:

NaamTypeBetekenis
validate_onlybooleanCheck and change nothing. (default false)

Antwoord: 200 · GoogleAdsMutationRead

GET /api/v1/google-ads/accounts/{account_id}/negatives

Section titled “GET /api/v1/google-ads/accounts/{account_id}/negatives”

Google Ads Negatives — Every negative keyword: ad-group level, campaign level, and shared negative lists.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

POST /api/v1/google-ads/accounts/{account_id}/negatives

Section titled “POST /api/v1/google-ads/accounts/{account_id}/negatives”

Add Google Ads Negatives — Exclude search terms — and record the ones you deliberately did not exclude.

Recht: google_ads.negative.write

Padparameters: account_id

Request body: GoogleAdsNegativesAdd

Antwoord: 201 · GoogleAdsMutationRead

POST /api/v1/google-ads/accounts/{account_id}/negatives/remove

Section titled “POST /api/v1/google-ads/accounts/{account_id}/negatives/remove”

Remove Google Ads Negatives — Take exclusions back off, by criterion id, at the level they were added.

Recht: google_ads.negative.write

Padparameters: account_id

Request body: GoogleAdsNegativesRemove

Antwoord: 200 · GoogleAdsMutationRead

GET /api/v1/google-ads/accounts/{account_id}/policy

Section titled “GET /api/v1/google-ads/accounts/{account_id}/policy”

Get Google Ads Policy — The rules that bind writes to this account — read this before proposing anything.

Recht: google_ads.policy.manage

Padparameters: account_id

Antwoord: 200 · GoogleAdsPolicyRead

PUT /api/v1/google-ads/accounts/{account_id}/policy

Section titled “PUT /api/v1/google-ads/accounts/{account_id}/policy”

Save Google Ads Policy — Set this account’s own rules.

Recht: google_ads.policy.manage

Padparameters: account_id

Request body: GoogleAdsPolicyWrite

Antwoord: 200 · GoogleAdsPolicyRead

DELETE /api/v1/google-ads/accounts/{account_id}/policy

Section titled “DELETE /api/v1/google-ads/accounts/{account_id}/policy”

Clear Google Ads Policy — Drop this account’s own rules, so it inherits the agency’s house policy again.

Recht: google_ads.policy.manage

Padparameters: account_id

Antwoord: 200 · GoogleAdsPolicyRead

POST /api/v1/google-ads/accounts/{account_id}/query

Section titled “POST /api/v1/google-ads/accounts/{account_id}/query”

Google Ads Query — Run a GAQL query against this account — the escape hatch for questions the other tools do not answer.

Recht: google_ads.query.run

Padparameters: account_id

Request body: GoogleAdsQueryRequest

Antwoord: 200 · GoogleAdsQueryRead

GET /api/v1/google-ads/accounts/{account_id}/recommendations

Section titled “GET /api/v1/google-ads/accounts/{account_id}/recommendations”

Google Ads Recommendations — Google’s own suggestions for this account, with the impact it projects for each.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/search-terms

Section titled “GET /api/v1/google-ads/accounts/{account_id}/search-terms”

Google Ads Search Terms — What people actually typed, most expensive first.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
campaignsstring[]
min_costnumberOnly terms that cost at least this, in account currency.
min_clicksinteger
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.
qstringFree text, matched case-insensitively against the row’s own readable fields — the campaign or ad-group name, the keyword, the search term, the place. Applied to the whole list before the page is taken, so page 2 of a search is page 2 of the search.
limitintegerHow many rows this page holds. Omit for the rest of the list, which is what a caller with no pager means. Never more than the read’s own ceiling.
offsetintegerWhere the page starts. total_rows is what it runs to. (default 0)

Antwoord: 200 · GoogleAdsReport

GET /api/v1/google-ads/accounts/{account_id}/snapshot

Section titled “GET /api/v1/google-ads/accounts/{account_id}/snapshot”

Google Ads Snapshot — Account totals plus every campaign for the period — start an analysis here.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.

Antwoord: 200 · GoogleAdsSnapshotRead

GET /api/v1/google-ads/accounts/{account_id}/trend

Section titled “GET /api/v1/google-ads/accounts/{account_id}/trend”

Google Ads Trend — A period against its comparison, with the change per metric already computed.

Recht: google_ads.account.read

Padparameters: account_id

Queryparameters:

NaamTypeBetekenis
comparestringWhat to compare against: ‘year’ (the same period a year earlier, the default) or ‘previous’ (the period immediately before).
periodstringA named span: 30d, 90d, month, last_month, quarter, last_quarter, 2026-07, 2026-Q3. Resolved in the account’s own timezone and always ending yesterday. Ignored when date_from and date_to are both given.
date_fromstringYYYY-MM-DD, inclusive.
date_tostringYYYY-MM-DD, inclusive.

Antwoord: 200 · GoogleAdsTrendRead

POST /api/v1/google-ads/accounts/{account_id}/verify

Section titled “POST /api/v1/google-ads/accounts/{account_id}/verify”

Verify Google Ads Account — Ask Google what it says about this account, and record the answer either way.

Recht: google_ads.settings.manage

Padparameters: account_id

Antwoord: 200 · GoogleAdsAccountRead

List Available Google Ads Accounts — Accounts the caller’s own Google grant can reach, manager hierarchies expanded.

Recht: google_ads.settings.manage

Antwoord: 200 · GoogleAdsPickerRead

Get Google Ads House Policy — The agency’s own standing Ads rules, applied to every account that does not override them.

Recht: google_ads.policy.manage

Antwoord: 200 · GoogleAdsPolicyRead

Save Google Ads House Policy — Set the agency’s standing rules. Fields you leave out are not touched.

Recht: google_ads.policy.manage

Request body: GoogleAdsPolicyWrite

Antwoord: 200 · GoogleAdsPolicyRead

Clear Google Ads House Policy — Drop the agency’s house rules, leaving only the built-in ceiling every account gets.

Recht: google_ads.policy.manage

Antwoord: 200 · GoogleAdsPolicyRead

Get Google Ads Settings — The org’s Ads configuration. The developer token is never part of the response.

Recht: google_ads.settings.manage

Antwoord: 200 · GoogleAdsSettingsRead

Save Google Ads Settings

Recht: google_ads.settings.manage

Request body: GoogleAdsSettingsWrite

Antwoord: 200 · GoogleAdsSettingsRead

EndpointRecht
GET /gtm/containersgoogle_tag_manager.container.read
POST /gtm/containersgoogle_tag_manager.settings.manage
GET /gtm/containers/{container_id}google_tag_manager.container.read
PATCH /gtm/containers/{container_id}google_tag_manager.settings.manage
DELETE /gtm/containers/{container_id}google_tag_manager.settings.manage
GET /gtm/containers/{container_id}/conversionsgoogle_tag_manager.container.read
POST /gtm/containers/{container_id}/conversionsgoogle_tag_manager.tag.write
GET /gtm/containers/{container_id}/snippetgoogle_tag_manager.container.read
GET /gtm/containers/{container_id}/statusgoogle_tag_manager.container.read
GET /gtm/containers/{container_id}/tagsgoogle_tag_manager.container.read
POST /gtm/containers/{container_id}/tagsgoogle_tag_manager.tag.write
PATCH /gtm/containers/{container_id}/tags/{tag_id}google_tag_manager.tag.write
DELETE /gtm/containers/{container_id}/tags/{tag_id}google_tag_manager.tag.write
GET /gtm/containers/{container_id}/triggersgoogle_tag_manager.container.read
POST /gtm/containers/{container_id}/triggersgoogle_tag_manager.tag.write
DELETE /gtm/containers/{container_id}/triggers/{trigger_id}google_tag_manager.tag.write
GET /gtm/containers/{container_id}/variablesgoogle_tag_manager.container.read
POST /gtm/containers/{container_id}/variablesgoogle_tag_manager.tag.write
DELETE /gtm/containers/{container_id}/variables/{variable_id}google_tag_manager.tag.write
POST /gtm/containers/{container_id}/verifygoogle_tag_manager.settings.manage
GET /gtm/containers/{container_id}/versionsgoogle_tag_manager.container.read
POST /gtm/containers/{container_id}/versionsgoogle_tag_manager.tag.write
POST /gtm/containers/{container_id}/versions/{version_id}/publishgoogle_tag_manager.version.publish
GET /gtm/containers/{container_id}/workspacesgoogle_tag_manager.container.read
GET /gtm/containers/availablegoogle_tag_manager.settings.manage
GET /gtm/settingsgoogle_tag_manager.settings.manage
PUT /gtm/settingsgoogle_tag_manager.settings.manage
Parameters en schema’s per endpoint

List Gtm Containers — Every linked Tag Manager container this caller may see — start here.

Recht: google_tag_manager.container.read

Queryparameters:

NaamTypeBetekenis
company_idstring
active_onlyboolean(default false)

Antwoord: 200 · GtmContainerRead[]

Link Gtm Container — Attach a container to this workspace, and say whose it is.

Recht: google_tag_manager.settings.manage

Request body: GtmContainerCreate

Antwoord: 201 · GtmContainerRead

Get Gtm Container

Recht: google_tag_manager.container.read

Padparameters: container_id

Antwoord: 200 · GtmContainerRead

PATCH /api/v1/gtm/containers/{container_id}

Section titled “PATCH /api/v1/gtm/containers/{container_id}”

Update Gtm Container

Recht: google_tag_manager.settings.manage

Padparameters: container_id

Request body: GtmContainerUpdate

Antwoord: 200 · GtmContainerRead

DELETE /api/v1/gtm/containers/{container_id}

Section titled “DELETE /api/v1/gtm/containers/{container_id}”

Unlink Gtm Container — Forget the container here. Nothing is removed from Tag Manager — an agency that stops working for a client does not thereby delete the tracking off their website.

Recht: google_tag_manager.settings.manage

Padparameters: container_id

Antwoord: 204

GET /api/v1/gtm/containers/{container_id}/conversions

Section titled “GET /api/v1/gtm/containers/{container_id}/conversions”

List Gtm Conversions — The conversions schakl set up in this container, and whether each is live yet.

Recht: google_tag_manager.container.read

Padparameters: container_id

Antwoord: 200 · GtmConversionRead[]

POST /api/v1/gtm/containers/{container_id}/conversions

Section titled “POST /api/v1/gtm/containers/{container_id}/conversions”

Create Gtm Conversion — Set up one conversion: the trigger, the tag, and the record that they belong together.

Recht: google_tag_manager.tag.write

Padparameters: container_id

Request body: GtmConversionCreate

Antwoord: 201 · GtmConversionRead

GET /api/v1/gtm/containers/{container_id}/snippet

Section titled “GET /api/v1/gtm/containers/{container_id}/snippet”

Gtm Container Snippet — The install snippet, for the developer who has to put it on the site.

Recht: google_tag_manager.container.read

Padparameters: container_id

Antwoord: 200 · GtmSnippetRead

GET /api/v1/gtm/containers/{container_id}/status

Section titled “GET /api/v1/gtm/containers/{container_id}/status”

Gtm Workspace Status — What is staged in a workspace and not live — the question before every publish.

Recht: google_tag_manager.container.read

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 200 · GtmWorkspaceStatusRead

GET /api/v1/gtm/containers/{container_id}/tags

Section titled “GET /api/v1/gtm/containers/{container_id}/tags”

List Gtm Tags — Every tag in a workspace — what is (or is about to be) measuring this client’s site.

Recht: google_tag_manager.container.read

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 200 · GtmTagRead[]

POST /api/v1/gtm/containers/{container_id}/tags

Section titled “POST /api/v1/gtm/containers/{container_id}/tags”

Create Gtm Tag — Create a tag from its own type and parameter array.

Recht: google_tag_manager.tag.write

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Request body: GtmTagWrite

Antwoord: 201 · GtmTagRead

PATCH /api/v1/gtm/containers/{container_id}/tags/{tag_id}

Section titled “PATCH /api/v1/gtm/containers/{container_id}/tags/{tag_id}”

Update Gtm Tag — Change one tag. Reads it first and writes back under its fingerprint, so an edit somebody made in Tag Manager meanwhile is a 409 rather than a silent overwrite of their work.

Recht: google_tag_manager.tag.write

Padparameters: container_id, tag_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Request body: GtmTagUpdate

Antwoord: 200 · GtmTagRead

DELETE /api/v1/gtm/containers/{container_id}/tags/{tag_id}

Section titled “DELETE /api/v1/gtm/containers/{container_id}/tags/{tag_id}”

Delete Gtm Tag

Recht: google_tag_manager.tag.write

Padparameters: container_id, tag_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 204

GET /api/v1/gtm/containers/{container_id}/triggers

Section titled “GET /api/v1/gtm/containers/{container_id}/triggers”

List Gtm Triggers

Recht: google_tag_manager.container.read

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 200 · GtmTriggerRead[]

POST /api/v1/gtm/containers/{container_id}/triggers

Section titled “POST /api/v1/gtm/containers/{container_id}/triggers”

Create Gtm Trigger — Create a trigger from six named kinds rather than from GTM’s own vocabulary.

Recht: google_tag_manager.tag.write

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Request body: GtmTriggerWrite

Antwoord: 201 · GtmTriggerRead

DELETE /api/v1/gtm/containers/{container_id}/triggers/{trigger_id}

Section titled “DELETE /api/v1/gtm/containers/{container_id}/triggers/{trigger_id}”

Delete Gtm Trigger

Recht: google_tag_manager.tag.write

Padparameters: container_id, trigger_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 204

GET /api/v1/gtm/containers/{container_id}/variables

Section titled “GET /api/v1/gtm/containers/{container_id}/variables”

List Gtm Variables

Recht: google_tag_manager.container.read

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 200 · GtmVariableRead[]

POST /api/v1/gtm/containers/{container_id}/variables

Section titled “POST /api/v1/gtm/containers/{container_id}/variables”

Create Gtm Variable — Create a user-defined variable — a dataLayer read (v), a constant (c), a lookup.

Recht: google_tag_manager.tag.write

Padparameters: container_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Request body: GtmVariableWrite

Antwoord: 201 · GtmVariableRead

DELETE /api/v1/gtm/containers/{container_id}/variables/{variable_id}

Section titled “DELETE /api/v1/gtm/containers/{container_id}/variables/{variable_id}”

Delete Gtm Variable

Recht: google_tag_manager.tag.write

Padparameters: container_id, variable_id

Queryparameters:

NaamTypeBetekenis
workspace_idstring

Antwoord: 204

POST /api/v1/gtm/containers/{container_id}/verify

Section titled “POST /api/v1/gtm/containers/{container_id}/verify”

Verify Gtm Container — Ask Google what it says about this container, and record the answer either way.

Recht: google_tag_manager.settings.manage

Padparameters: container_id

Antwoord: 200 · GtmContainerRead

GET /api/v1/gtm/containers/{container_id}/versions

Section titled “GET /api/v1/gtm/containers/{container_id}/versions”

List Gtm Versions — The container’s version history, newest first, with the live one marked.

Recht: google_tag_manager.container.read

Padparameters: container_id

Antwoord: 200 · GtmVersionRead[]

POST /api/v1/gtm/containers/{container_id}/versions

Section titled “POST /api/v1/gtm/containers/{container_id}/versions”

Create Gtm Version — Freeze what is staged into a version. Still live for nobody — publishing is separate.

Recht: google_tag_manager.tag.write

Padparameters: container_id

Request body: GtmVersionCreate

Antwoord: 201 · GtmVersionCreated

POST /api/v1/gtm/containers/{container_id}/versions/{version_id}/publish

Section titled “POST /api/v1/gtm/containers/{container_id}/versions/{version_id}/publish”

Publish Gtm Version — Make this version live on the client’s website, now, for every visitor.

Recht: google_tag_manager.version.publish

Padparameters: container_id, version_id

Antwoord: 200 · GtmPublishResult

GET /api/v1/gtm/containers/{container_id}/workspaces

Section titled “GET /api/v1/gtm/containers/{container_id}/workspaces”

List Gtm Workspaces — The container’s workspaces — its shared drafts. Usually one; sometimes one per person.

Recht: google_tag_manager.container.read

Padparameters: container_id

Antwoord: 200 · GtmWorkspaceRead[]

List Available Gtm Containers — Containers the caller’s own Google grant can reach, across every Tag Manager account.

Recht: google_tag_manager.settings.manage

Antwoord: 200 · GtmPickerRead

Get Gtm Settings — The org’s Tag Manager posture: the write kill switch and the workspace schakl writes in.

Recht: google_tag_manager.settings.manage

Antwoord: 200 · GtmSettingsRead

Save Gtm Settings

Recht: google_tag_manager.settings.manage

Request body: GtmSettingsWrite

Antwoord: 200 · GtmSettingsRead

EndpointRecht
GET /reporting/companies/{company_id}/profilereporting.profile.manage
PUT /reporting/companies/{company_id}/profilereporting.profile.manage
GET /reporting/reportsreporting.report.read
GET /reporting/reports/{report_id}reporting.report.read
DELETE /reporting/reports/{report_id}reporting.report.write
PUT /reporting/reports/{report_id}/narrativereporting.report.write
GET /reporting/reports/{report_id}/pdfreporting.report.read
GET /reporting/reports/{report_id}/previewreporting.report.read
POST /reporting/reports/{report_id}/publishreporting.report.send
POST /reporting/reports/{report_id}/rewritereporting.report.write
POST /reporting/reports/{report_id}/sendreporting.report.send
POST /reporting/reports/generatereporting.report.write
POST /reporting/reports/generate-batchreporting.report.write
GET /reporting/settingsreporting.profile.manage
PUT /reporting/settingsreporting.settings.manage
GET /reporting/templatesreporting.profile.manage
POST /reporting/templatesreporting.settings.manage
PUT /reporting/templates/{template_id}reporting.settings.manage
DELETE /reporting/templates/{template_id}reporting.settings.manage
GET /reporting/templates/designs/{design}/sourcereporting.settings.manage
POST /reporting/templates/previewreporting.settings.manage
GET /reporting/templates/sectionsreporting.settings.manage
GET /reporting/tonesreporting.profile.manage
POST /reporting/tonesreporting.settings.manage
PUT /reporting/tones/{tone_id}reporting.settings.manage
DELETE /reporting/tones/{tone_id}reporting.settings.manage
Parameters en schema’s per endpoint

GET /api/v1/reporting/companies/{company_id}/profile

Section titled “GET /api/v1/reporting/companies/{company_id}/profile”

Get Profile — The client’s reporting setup. A company that has never had one answers with the inherited defaults rather than a 404 — the form is the same either way.

Recht: reporting.profile.manage

Padparameters: company_id

Antwoord: 200 · ReportProfileRead

PUT /api/v1/reporting/companies/{company_id}/profile

Section titled “PUT /api/v1/reporting/companies/{company_id}/profile”

Save Profile

Recht: reporting.profile.manage

Padparameters: company_id

Request body: ReportProfileWrite

Antwoord: 200 · ReportProfileRead

List Reports

Recht: reporting.report.read

Queryparameters:

NaamTypeBetekenis
company_idstring
audienceReportAudience
limitinteger(default 50)
offsetinteger(default 0)
countboolean(default true)

Antwoord: 200 · ReportList

Get Report

Recht: reporting.report.read

Padparameters: report_id

Antwoord: 200 · ReportDetail

DELETE /api/v1/reporting/reports/{report_id}

Section titled “DELETE /api/v1/reporting/reports/{report_id}”

Delete Report

Recht: reporting.report.write

Padparameters: report_id

Antwoord: 204

PUT /api/v1/reporting/reports/{report_id}/narrative

Section titled “PUT /api/v1/reporting/reports/{report_id}/narrative”

Edit Narrative — Hand-edit the prose before it goes out — the point of review-before-send.

Recht: reporting.report.write

Padparameters: report_id

Request body: ReportNarrativeUpdate

Antwoord: 200 · ReportDetail

GET /api/v1/reporting/reports/{report_id}/pdf

Section titled “GET /api/v1/reporting/reports/{report_id}/pdf”

Report Pdf — The stored document. Loaded through the portal-aware repository, so a client can download exactly the reports they can open — and never the internal analysis.

Recht: reporting.report.read

Padparameters: report_id

Antwoord: 200

GET /api/v1/reporting/reports/{report_id}/preview

Section titled “GET /api/v1/reporting/reports/{report_id}/preview”

Preview Report — The document as HTML — the same artefact the PDF prints, so the two cannot drift.

Recht: reporting.report.read

Padparameters: report_id

Antwoord: 200

POST /api/v1/reporting/reports/{report_id}/publish

Section titled “POST /api/v1/reporting/reports/{report_id}/publish”

Publish Report

Recht: reporting.report.send

Padparameters: report_id

Queryparameters:

NaamTypeBetekenis
publishedboolean(default true)

Antwoord: 200 · ReportDetail

POST /api/v1/reporting/reports/{report_id}/rewrite

Section titled “POST /api/v1/reporting/reports/{report_id}/rewrite”

Rewrite Section

Recht: reporting.report.write

Padparameters: report_id

Request body: ReportRewriteRequest

Antwoord: 200 · ReportDetail

POST /api/v1/reporting/reports/{report_id}/send

Section titled “POST /api/v1/reporting/reports/{report_id}/send”

Send Report

Recht: reporting.report.send

Padparameters: report_id

Request body: ReportSendRequest

Antwoord: 200 · ReportDetail

Generate Report — Queue a run. Never generates inline — it calls several APIs and a model.

Recht: reporting.report.write

Request body: ReportRunRequest

Antwoord: 200 · ReportActionResult

POST /api/v1/reporting/reports/generate-batch

Section titled “POST /api/v1/reporting/reports/generate-batch”

Generate Batch

Recht: reporting.report.write

Request body: ReportRunBatchRequest

Antwoord: 200 · ReportRunBatchResult

Get Settings

Recht: reporting.profile.manage

Antwoord: 200 · ReportingSettingsRead

Save Settings

Recht: reporting.settings.manage

Request body: ReportingSettingsWrite

Antwoord: 200 · ReportingSettingsRead

List Templates

Recht: reporting.profile.manage

Queryparameters:

NaamTypeBetekenis
audienceReportAudience

Antwoord: 200 · ReportTemplateRead[]

Create Template

Recht: reporting.settings.manage

Request body: ReportTemplateWrite

Antwoord: 201 · ReportTemplateRead

PUT /api/v1/reporting/templates/{template_id}

Section titled “PUT /api/v1/reporting/templates/{template_id}”

Update Template

Recht: reporting.settings.manage

Padparameters: template_id

Request body: ReportTemplateWrite

Antwoord: 200 · ReportTemplateRead

DELETE /api/v1/reporting/templates/{template_id}

Section titled “DELETE /api/v1/reporting/templates/{template_id}”

Delete Template

Recht: reporting.settings.manage

Padparameters: template_id

Antwoord: 204

GET /api/v1/reporting/templates/designs/{design}/source

Section titled “GET /api/v1/reporting/templates/designs/{design}/source”

Template Source — A shipped design’s own HTML and CSS, to start a custom report template from.

Recht: reporting.settings.manage

Padparameters: design

Antwoord: 200 · ReportTemplateSource

Preview Template — Render an unsaved template — the editor’s live preview.

Recht: reporting.settings.manage

Request body: ReportTemplatePreviewRequest

Antwoord: 200

Section Catalog — What a template may order or switch off — the registry, made visible (§15’s “registry, not free text”, applied to design).

Recht: reporting.settings.manage

Antwoord: 200 · SectionCatalogEntry[]

List Tones — Readable by whoever assigns one to a client, editable only by an admin (the service re-checks) — a manager must be able to see what voice they are picking.

Recht: reporting.profile.manage

Antwoord: 200 · ReportToneRead[]

Create Tone

Recht: reporting.settings.manage

Request body: ReportToneWrite

Antwoord: 201 · ReportToneRead

Update Tone

Recht: reporting.settings.manage

Padparameters: tone_id

Request body: ReportToneWrite

Antwoord: 200 · ReportToneRead

Delete Tone

Recht: reporting.settings.manage

Padparameters: tone_id

Antwoord: 204