Advertising
The campaign tree and its performance. Reading requires campaigns:read; creating, editing and archiving campaigns, ad groups, targets and product ads require campaigns:write.
Each level pairs a structure resource with a metrics one: /v1/campaigns lists what exists, /v1/campaign-metrics lists what it did over a date range.
/v1/portfolios groups campaigns under a shared budget cap. A campaign's portfolioId says which portfolio it belongs to, and setting it on a campaign (Sponsored Products, Brands or Display) moves the campaign in or out.
/v1/advertising-changes is the log of everything Epinium has changed on Amazon, whoever asked for it, including what Amazon rejected.
Servers
List the authenticated account's advertising campaigns
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Case-insensitive substring match over the campaign name. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""ENABLED""PAUSED""ARCHIVED""OTHER"Responses
200
Create a Sponsored Products campaign, paused by default
Created PAUSED unless you pass state: "ENABLED" explicitly: an enabled campaign starts spending as soon as Amazon accepts it. dailyBudget is checked against the marketplace minimum for the connection country and rejected with 400 below it. Requires the campaigns:write scope and an Idempotency-Key header. Sponsored Brands and Sponsored Display campaigns cannot be created here yet; they can be changed and archived like any other.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
GET /v1/campaigns/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Responses
200
Archive a campaign
Archiving is how Amazon removes an entity, and it CANNOT BE UNDONE: an archived campaign does not come back, and this is the only irreversible operation in this API. That is why it is its own verb instead of a state you could set by accident while changing a bid. Use state: "PAUSED" if you only want to stop it - that one is reversible. A campaign that does not exist, or belongs to another account, is a 404. One managed by the optimizer is refused. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
Change the state, budget, name or portfolio of a campaign
Send only the fields you want to change; anything you omit is left as it is. At least one field is required. A campaign that does not exist, or belongs to another account, is a 404 - never a 403, which would confirm it exists. A campaign managed by the optimizer is refused, because its next run would overwrite you. If Amazon rejects the change the response is still 200 with result: "failed" and the reason, so you can tell "Amazon said no" from "the call never happened". Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
Changes the workflow actually applied to this campaign
Only changes that were APPLIED, and only for real: a dry-run simulation never appears here, under any parameter. Aggregated to a net per entity — data carries one row per target whose bid was moved, with the bid from before the first change against the bid after the last one, so a target raised then capped back down reports direction: unchanged with change_count: 2. That is the reading a flat decision list hides, and it is usually the answer to whether the optimization is doing anything. Proposals are excluded: the optimizer computes a bid the economic ceiling can then cut, and only what reached Amazon is reported. Non-bid changes (harvested keywords, negatives, placement adjustments, blocked or quarantined targets) do not share the table because they have no previous bid — they are counted in other_changes. Monetary amounts are decimal strings. The window is capped at 90 days, which is the retention of the underlying records.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
"^\\d{4}-\\d{2}-\\d{2}$""^\\d{4}-\\d{2}-\\d{2}$"Page size, up to 500. Paginate with offset, not with a cursor: these rows are aggregated changes, not records with an id. Narrow the window with start_date / end_date instead of walking every page.
1001500009007199254740991"asc""desc""desc"Responses
200
Create a campaign with its ad group, targets and product ads
One call for the whole structure, in order: campaign, ad group, targets, product ads. There is NO rollback on Amazon — if a later step fails the earlier entities stay created, and the response tells you how far it got in stopped_at plus what went wrong in partial_errors. Read that instead of retrying: a retry would create a second campaign. Everything is created paused unless you ask otherwise. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
Update Epinium's own optimization settings for a campaign
Sets what the optimizer chases for this campaign: target ACOS or ROAS, bid floor and ceiling, monthly budget, harvesting overrides, and which workflows may touch it. None of this reaches Amazon - it is the configuration Epinium optimizes against, so no Idempotency-Key is required. Read the current values with GET /v1/campaigns/:id?expand[]=optimizationConfig. What puts a campaign under the optimizer is linkedWorkflowDefinitionIds: a workflow listed there processes it every night and moves real bids on Amazon - confirm it with the person first, exactly as you would turning a workflow on. A workflow that selects campaigns on its own can also pick it up, and workflowsOptOut: true is what declines that; the only setting that always keeps a workflow away is excludedWorkflowDefinitionIds, which wins over the other two. aiEnabled is NOT that switch: it records the account holder consent, travels to Amazon as the epinium:ai_enabled tag and makes the campaign eligible as a cross-harvest peer, so aiEnabled: false does NOT take a campaign out of the optimizer - remove it from linkedWorkflowDefinitionIds (plus workflowsOptOut: true if the workflow selects campaigns on its own) or add the workflow to excludedWorkflowDefinitionIds instead. optimizeDate and optimizingSince are read-only, stamped by the optimizer itself, and sending either is a 400. Requires campaigns:write.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
Same update for up to 1000 campaigns, one patch per row
NOT all-or-nothing: data carries one row per campaign you sent, in the order you sent them. A row that fails validation comes back failed with the reason and the others still apply, because each campaign is validated against its OWN stored state - a bid ceiling that is mandatory for one objective may be absent in another campaign. The warning about linkedWorkflowDefinitionIds applies to every row: enrolling a batch puts all of those campaigns under a workflow that moves real bids on Amazon every night, so confirm it with the person before doing it wholesale. aiEnabled is consent and an Amazon tag, not the enrolment switch, in the batch exactly as in the single. Requires campaigns:write.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Request Body
Responses
200
Change state, budget, name or portfolio on up to 1000 campaigns
Same fields as the single update, up to 1000 campaigns per call - the cap is the per-request limit Amazon itself declares. NOT all-or-nothing: data carries one row per campaign you sent, in the order you sent them, and applied is what actually reached Amazon. Only applied rows are billed. A campaign is applied only when EVERY field you asked for went through: if the state changes and the budget is rejected, that campaign is failed with the reason, because reporting it as applied is how an agent concludes the budget moved when it did not. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
200
campaign-metrics
Advertising performance per campaign, aggregated from the account's report history. Requires campaigns:read.
Operations
Advertising performance per campaign, from the account's report history
Aggregated from the report history over a required start_date/end_date window. Unlike the rest of the API, this resource paginates with limit/offset (an aggregated row has no id to use as a cursor) and has_more tells whether another page follows. Monetary amounts are decimal strings; ratios are fractions (0.1642 = 16.42%) and are null, never 0, when their denominator is zero. With group_by, rows are aggregated across entities (see the parameter) and total_count counts groups, or group-periods when granularity is not total.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-01""^\\d{4}-\\d{2}-\\d{2}$"Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-31""^\\d{4}-\\d{2}-\\d{2}$"total (default) aggregates the whole window into one row per entity or group. Any other value adds a date field with the START of each calendar period: the day, the Monday of the ISO week, or the first day of the month, quarter or year. Periods at the edges of the window are partial: 2026-01-15..2026-03-10 with monthly returns January (15th to 31st), February, and March (1st to 10th). daily has a shorter window cap than the rest.
"total""daily""weekly""monthly""quarterly""yearly""total""total"Page size. For a top-N, combine order_by with a small limit instead of raising it: limit/offset bound the response, not what ClickHouse scans.
100100110000009007199254740991"asc""desc""desc""desc"Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"Aggregate across entities instead of returning one row per entity. To get the account total, or a per-country or per-connection breakdown, use this INSTEAD of paging through the catalog and summing: one row per group (and per period when granularity is not total), and the credits scale with the groups returned, not with the number of products. account collapses everything and cannot be combined with other values; connection and country can be combined by repeating the param (group_by[]=connection&group_by[]=country). Rows are always split by currency (amounts are never converted) and, in advertising, by ad_product. In grouped rows the entity fields (product, asin, sku, campaign, ad_group, target...) are null, and so are the metrics that cannot be aggregated (rank, price, fulfillment_channel, vendor rates and sourcing_lead_time_days). Seller stock and days_of_coverage are null too unless country is one of the dimensions: FBA Pan-European stock is reported in full in every marketplace, so adding it up across countries would count the same units once per country. Combines with every filter.
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""SP""SB""SD""cost""sales""impressions""clicks""orders""units""acos""roas""ctr""cpc""conversion_rate"Responses
200
portfolios
The authenticated account's portfolios and the budget cap each one puts on its campaigns. Requires campaigns:read; writing requires campaigns:write.
List the authenticated account's portfolios and their budget caps
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Case-insensitive substring match over the portfolio name. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""ENABLED""PAUSED""ARCHIVED""OTHER"Responses
200
Create a portfolio, optionally with a budget cap
Creates a portfolio in the Amazon Ads account of connection. budget caps what ALL the campaigns in the portfolio can spend together: MONTHLY_RECURRING resets every month, DATE_RANGE applies between startDate and endDate, NO_CAP removes the cap. The currency is the marketplace one; you do not send it. If Amazon rejects the portfolio the response is still 201 with result: "failed", the reason in error and id: null. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
GET /v1/portfolios/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
Change the name, state or budget cap of a portfolio
Send only what you want to change; at least one field is required. budget is replaced whole: send the full cap you want, not just the amount. A portfolio that does not exist, or belongs to another account, is a 404. If Amazon rejects the change the response is still 200 with result: "failed" and the reason, and nothing is changed on our side. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
List the authenticated account's ad groups
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Case-insensitive substring match over the ad group name. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""ENABLED""PAUSED""ARCHIVED""OTHER"Responses
200
Create an ad group inside a Sponsored Products campaign
Created PAUSED unless you pass state: "ENABLED". defaultBid is clamped to the marketplace bid limits for the campaign country, so a bid outside them is adjusted rather than rejected. The campaign must already be published on Amazon; one that belongs to another account is a 404, never a 403. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
GET /v1/adgroups/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Responses
200
Archive a ad group
Archiving is how Amazon removes an entity, and it CANNOT BE UNDONE: an archived ad group does not come back, and this is the only irreversible operation in this API. That is why it is its own verb instead of a state you could set by accident while changing a bid. Use state: "PAUSED" if you only want to stop it - that one is reversible. An ad group that does not exist, or belongs to another account, is a 404. One managed by the optimizer is refused. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
Change the state, default bid or name of an ad group
Send only the fields you want to change; anything you omit is left as it is. At least one field is required. defaultBid is checked against the marketplace bid limits before it is sent, so an out-of-range bid comes back with the limits instead of a generic rejection from Amazon. An ad group that does not exist, or belongs to another account, is a 404 - never a 403, which would confirm it exists. One managed by the optimizer is refused, because its next run would overwrite you. If Amazon rejects the change the response is still 200 with result: "failed" and the reason. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
Change state, default bid or name on up to 1000 ad groups
Same fields as the single update, up to 1000 ad groups per call - the cap is the per-request limit Amazon itself declares. NOT all-or-nothing: data carries one row per ad group you sent, in the order you sent them, and applied is what actually reached Amazon. Only applied rows are billed. An ad group is applied only when EVERY field you asked for went through. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
200
Advertising performance per ad group, from the account's report history
Aggregated from the report history over a required start_date/end_date window. Like the rest of the metrics resources it paginates with limit/offset (an aggregated row has no id to use as a cursor) and has_more tells whether another page follows. Monetary amounts are decimal strings; ratios are fractions (0.1642 = 16.42%) and are null, never 0, when their denominator is zero. With group_by, rows are aggregated across entities (see the parameter) and total_count counts groups, or group-periods when granularity is not total.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-01""^\\d{4}-\\d{2}-\\d{2}$"Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-31""^\\d{4}-\\d{2}-\\d{2}$"total (default) aggregates the whole window into one row per entity or group. Any other value adds a date field with the START of each calendar period: the day, the Monday of the ISO week, or the first day of the month, quarter or year. Periods at the edges of the window are partial: 2026-01-15..2026-03-10 with monthly returns January (15th to 31st), February, and March (1st to 10th). daily has a shorter window cap than the rest.
"total""daily""weekly""monthly""quarterly""yearly""total""total"Page size. For a top-N, combine order_by with a small limit instead of raising it: limit/offset bound the response, not what ClickHouse scans.
100100110000009007199254740991"asc""desc""desc""desc"Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"Aggregate across entities instead of returning one row per entity. To get the account total, or a per-country or per-connection breakdown, use this INSTEAD of paging through the catalog and summing: one row per group (and per period when granularity is not total), and the credits scale with the groups returned, not with the number of products. account collapses everything and cannot be combined with other values; connection and country can be combined by repeating the param (group_by[]=connection&group_by[]=country). Rows are always split by currency (amounts are never converted) and, in advertising, by ad_product. In grouped rows the entity fields (product, asin, sku, campaign, ad_group, target...) are null, and so are the metrics that cannot be aggregated (rank, price, fulfillment_channel, vendor rates and sourcing_lead_time_days). Seller stock and days_of_coverage are null too unless country is one of the dimensions: FBA Pan-European stock is reported in full in every marketplace, so adding it up across countries would count the same units once per country. Combines with every filter.
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""SP""SB""SD""cost""sales""impressions""clicks""orders""units""acos""roas""ctr""cpc""conversion_rate"Responses
200
List the authenticated account's advertising targets
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Case-insensitive substring match over the target's expression (keyword, ASIN or category, chosen by targetType) and its matchType; with targetType set, only that type's field is searched. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""ENABLED""PAUSED""ARCHIVED""OTHER""AUTO""KEYWORD""PRODUCT_CATEGORY""PRODUCT""PRODUCT_CATEGORY_AUDIENCE""PRODUCT_AUDIENCE""AUDIENCE""THEME""CONTENT_CATEGORY""LOCATION""true""false"Responses
200
Create keyword, product or category targets in an ad group
Creates up to 1000 targets in one call — the cap is Amazon's own per-request limit. NOT all-or-nothing: the response counts what went in and lists every rejection in failure_details with its reason, so a partial result is actionable instead of a retry that duplicates what already worked. Amazon rules are enforced before sending (negative keyword length and word count, category id coercion) and the ad group capacity is checked against the Amazon limits. The response returns COUNTS, not ids: list the ad group targets to get them. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
GET /v1/targets/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Responses
200
Archive a target
Archiving is how Amazon removes an entity, and it CANNOT BE UNDONE: an archived target does not come back, and this is the only irreversible operation in this API. That is why it is its own verb instead of a state you could set by accident while changing a bid. Use state: "PAUSED" if you only want to stop it - that one is reversible. A target that does not exist, or belongs to another account, is a 404. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
Change the state or bid of a target
Send only the fields you want to change; anything you omit is left as it is. At least one field is required. Only state and bid: what defines a target - its keyword, its ASIN, its match type - is not editable on Amazon, so to change that you create another and archive this one. A negative target has no bid and asking for one is refused. bid is checked against the marketplace limits before it is sent. A target that does not exist, or belongs to another account, is a 404 - never a 403. If Amazon rejects the change the response is still 200 with result: "failed". Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
Change state or bid on up to 1000 targets
This is the bid sweep: up to 1000 targets in ONE call, each with its own bid - the cap is the per-request limit Amazon itself declares. Prefer it over calling the single update in a loop. NOT all-or-nothing: data carries one row per target you sent, in the order you sent them, and applied is what actually reached Amazon. Only applied rows are billed, so a partial result costs you only what worked. A target is applied only when EVERY field you asked for went through. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
200
Advertising performance per target, from the account's report history
Aggregated from the report history over a required start_date/end_date window, with the target type and keyword resolved from the catalog. This is one of the two heaviest resources, so its window is capped shorter: 93 days for granularity=total and 31 for daily. Paginates with limit/offset and has_more tells whether another page follows. Monetary amounts are decimal strings; ratios are fractions (0.1642 = 16.42%) and are null, never 0, when their denominator is zero. With group_by, rows are aggregated across entities (see the parameter) and total_count counts groups, or group-periods when granularity is not total.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-01""^\\d{4}-\\d{2}-\\d{2}$"Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-31""^\\d{4}-\\d{2}-\\d{2}$"total (default) aggregates the whole window into one row per entity or group. Any other value adds a date field with the START of each calendar period: the day, the Monday of the ISO week, or the first day of the month, quarter or year. Periods at the edges of the window are partial: 2026-01-15..2026-03-10 with monthly returns January (15th to 31st), February, and March (1st to 10th). daily has a shorter window cap than the rest.
"total""daily""weekly""monthly""quarterly""yearly""total""total"Page size. For a top-N, combine order_by with a small limit instead of raising it: limit/offset bound the response, not what ClickHouse scans.
100100110000009007199254740991"asc""desc""desc""desc"Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"Aggregate across entities instead of returning one row per entity. To get the account total, or a per-country or per-connection breakdown, use this INSTEAD of paging through the catalog and summing: one row per group (and per period when granularity is not total), and the credits scale with the groups returned, not with the number of products. account collapses everything and cannot be combined with other values; connection and country can be combined by repeating the param (group_by[]=connection&group_by[]=country). Rows are always split by currency (amounts are never converted) and, in advertising, by ad_product. In grouped rows the entity fields (product, asin, sku, campaign, ad_group, target...) are null, and so are the metrics that cannot be aggregated (rank, price, fulfillment_channel, vendor rates and sourcing_lead_time_days). Seller stock and days_of_coverage are null too unless country is one of the dimensions: FBA Pan-European stock is reported in full in every marketplace, so adding it up across countries would count the same units once per country. Combines with every filter.
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""SP""SB""SD""cost""sales""impressions""clicks""orders""units""acos""roas""ctr""cpc""conversion_rate"Responses
200
List the authenticated account's advertising product ads
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Case-insensitive substring match over the advertised ASIN and SKU. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""ENABLED""PAUSED""ARCHIVED""OTHER"Responses
200
Advertise catalog products in an ad group
Each entry links one catalog product to the ad group. Products are resolved against YOUR catalog: one that is not there, or that lacks the identifier the account needs (ASIN for Vendor, SKU for Seller), is reported in failure_details with that reason instead of failing the whole call. Created PAUSED unless asked otherwise. The response returns COUNTS, not ids: list the ad group product ads to get them. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
201
GET /v1/product-ads/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Responses
200
Archive a product ad
Archiving is how Amazon removes an entity, and it CANNOT BE UNDONE: an archived product ad does not come back, and this is the only irreversible operation in this API. That is why it is its own verb instead of a state you could set by accident while changing a bid. Use state: "PAUSED" if you only want to stop it - that one is reversible. A product ad that does not exist, or belongs to another account, is a 404. Requires the campaigns:write scope and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
Enable or pause a product ad
State is the only writable field: a product ad links one catalog product to an ad group and has no bid or name of its own. A product ad that does not exist, or belongs to another account, is a 404 - never a 403. If Amazon rejects the change the response is still 200 with result: "failed" and the reason. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Request Body
Responses
200
Enable or pause up to 1000 product ads
Up to 1000 product ads per call - the cap is the per-request limit Amazon itself declares. NOT all-or-nothing: data carries one row per product ad you sent, in the order you sent them, and applied is what actually reached Amazon. Only applied rows are billed. Requires campaigns:write and an Idempotency-Key header.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Header Parameters
Any string identifying this intent, up to 255 characters. Reuse the same value when retrying the same change: without it a network timeout turns one write into two.
1255Request Body
Responses
200
Advertising performance per product ad, from the account's report history
Aggregated from the report history over a required start_date/end_date window. Only Sponsored Products and Sponsored Display have product ads; Sponsored Brands does not, so ad_product accepts SP and SD only. Paginates with limit/offset and has_more tells whether another page follows. Monetary amounts are decimal strings; ratios are fractions (0.1642 = 16.42%) and are null, never 0, when their denominator is zero. With group_by, rows are aggregated across entities (see the parameter) and total_count counts groups, or group-periods when granularity is not total.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-01""^\\d{4}-\\d{2}-\\d{2}$"Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-31""^\\d{4}-\\d{2}-\\d{2}$"total (default) aggregates the whole window into one row per entity or group. Any other value adds a date field with the START of each calendar period: the day, the Monday of the ISO week, or the first day of the month, quarter or year. Periods at the edges of the window are partial: 2026-01-15..2026-03-10 with monthly returns January (15th to 31st), February, and March (1st to 10th). daily has a shorter window cap than the rest.
"total""daily""weekly""monthly""quarterly""yearly""total""total"Page size. For a top-N, combine order_by with a small limit instead of raising it: limit/offset bound the response, not what ClickHouse scans.
100100110000009007199254740991"asc""desc""desc""desc"Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"Aggregate across entities instead of returning one row per entity. To get the account total, or a per-country or per-connection breakdown, use this INSTEAD of paging through the catalog and summing: one row per group (and per period when granularity is not total), and the credits scale with the groups returned, not with the number of products. account collapses everything and cannot be combined with other values; connection and country can be combined by repeating the param (group_by[]=connection&group_by[]=country). Rows are always split by currency (amounts are never converted) and, in advertising, by ad_product. In grouped rows the entity fields (product, asin, sku, campaign, ad_group, target...) are null, and so are the metrics that cannot be aggregated (rank, price, fulfillment_channel, vendor rates and sourcing_lead_time_days). Seller stock and days_of_coverage are null too unless country is one of the dimensions: FBA Pan-European stock is reported in full in every marketplace, so adding it up across countries would count the same units once per country. Combines with every filter. cluster gives one row per product cluster (the clusters resource), with its id in cluster and its name in cluster_name. A product in several clusters counts in full in each of them, so the cluster rows do NOT add up to the account total, and products in no cluster are left out. It combines with connection and country, and with the cluster filter to choose which clusters come back.
Restrict the rows to the products of one or more product clusters (the clusters resource), by cluster id; repeat the param for several (cluster[]=a&cluster[]=b) and the result is their union, a product in two of them counting once. A cluster holds catalog products (one per connection and country), not ASINs: seller and vendor metrics keep exactly those products, so the same ASIN on another connection is left out unless its product is in the cluster too; product-ad metrics keep each product's ASIN in its country, across every advertising profile in scope. Combines with group_by (e.g. the monthly total of a product family) and with every other filter. An id that does not exist or belongs to another account contributes nothing, so the list comes back empty rather than failing. Rows that Amazon could not match to a catalog product are excluded by this filter: about 0.01% of seller sales, about 5% of vendor sales, and about 3% of product-ad spend (those rows carry no ASIN either).
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Amazon ASIN: 10 uppercase letters or digits, e.g. B08GPHNSCW.
"^[A-Z0-9]{10}$""SP""SD""cost""sales""impressions""clicks""orders""units""acos""roas""ctr""cpc""conversion_rate"Responses
200
List the authenticated account's advertising search terms
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Case-insensitive substring match over the shopper search term text. Use it to find a record by name when you do not have its id, instead of paging through the whole list. Regex metacharacters are matched literally.
1200Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Responses
200
GET /v1/search-terms/{id}
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Path Parameters
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"Query Parameters
Inline related records instead of returning just their ids. Repeat the param for several (expand[]=connection&expand[]=country) and nest with dot notation (connection.country), up to 4 levels.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Responses
200
Advertising performance per shopper search term, from the account's report history
Aggregated from the report history over a required start_date/end_date window, with the shopper query resolved from the catalog into query. Answers "which searches do I spend most on?": use order_by=cost with limit instead of paging. This is the heaviest resource in the API, so its window is capped shorter: 93 days for granularity=total and 31 for daily. Rows are grouped per search term AND target, because the same text can be matched by different targets. Only Sponsored Products and Sponsored Brands produce search terms, so ad_product accepts SP and SB only. Monetary amounts are decimal strings; ratios are fractions (0.1642 = 16.42%) and are null, never 0, when their denominator is zero. With group_by, rows are aggregated across entities (see the parameter) and total_count counts groups, or group-periods when granularity is not total.
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-01""^\\d{4}-\\d{2}-\\d{2}$"Both ends are included in the range. The window is capped, and the cap depends on the resource AND on granularity — daily allows a much shorter span than total, and target-metrics and search-term-metrics are stricter than the rest because limit/offset bound the response but not what ClickHouse scans. Going over returns a 400 naming the exact limit for your request.
"2026-07-31""^\\d{4}-\\d{2}-\\d{2}$"total (default) aggregates the whole window into one row per entity or group. Any other value adds a date field with the START of each calendar period: the day, the Monday of the ISO week, or the first day of the month, quarter or year. Periods at the edges of the window are partial: 2026-01-15..2026-03-10 with monthly returns January (15th to 31st), February, and March (1st to 10th). daily has a shorter window cap than the rest.
"total""daily""weekly""monthly""quarterly""yearly""total""total"Page size. For a top-N, combine order_by with a small limit instead of raising it: limit/offset bound the response, not what ClickHouse scans.
100100110000009007199254740991"asc""desc""desc""desc"Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"Aggregate across entities instead of returning one row per entity. To get the account total, or a per-country or per-connection breakdown, use this INSTEAD of paging through the catalog and summing: one row per group (and per period when granularity is not total), and the credits scale with the groups returned, not with the number of products. account collapses everything and cannot be combined with other values; connection and country can be combined by repeating the param (group_by[]=connection&group_by[]=country). Rows are always split by currency (amounts are never converted) and, in advertising, by ad_product. In grouped rows the entity fields (product, asin, sku, campaign, ad_group, target...) are null, and so are the metrics that cannot be aggregated (rank, price, fulfillment_channel, vendor rates and sourcing_lead_time_days). Seller stock and days_of_coverage are null too unless country is one of the dimensions: FBA Pan-European stock is reported in full in every marketplace, so adding it up across countries would count the same units once per country. Combines with every filter.
24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""SP""SB""cost""sales""impressions""clicks""orders""units""acos""roas""ctr""cpc""conversion_rate"Responses
200
advertising-changes
Every change Epinium pushed to Amazon for the authenticated account - from the app, a workflow, an internal job or this API - including the ones Amazon rejected. Requires campaigns:read.
Operations
List the changes Epinium pushed to Amazon for the authenticated account
Authorizations
Client API key (POST /api-keys). Send as Authorization: Bearer epk_live_....
Parameters
Query Parameters
Page size. The default is enough to explore; raise it only when you need to walk a whole collection.
20201100Cursor for the next page: the id of the last record you received. Returns the records after it.
Cursor for the previous page: the id of the first record you received. Returns the records before it.
Trim the response to the fields you need, comma-separated and keyed by ENTITY TYPE rather than by resource name: fields[campaign]=id,name. A key that matches no entity is ignored silently and the full object comes back.
Set to true to also receive total_count: how many records match every filter of this request, ignoring starting_after/ending_before/offset - the size of the whole result set, not of what is left. has_more is always returned regardless. It costs an extra count query, so ask for it once, on the first page, to decide whether the set is worth walking. On metrics resources it counts entities (or groups with group_by), and, with any granularity other than total, each of their periods that has data, not entities times periods: entity-days with granularity=daily. total_count comes back null when the count could not finish in time; the list is still returned, so treat it as unknown, never as zero.
"true""false"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$"24-character hexadecimal Mongo ObjectId.
"^[a-f0-9]{24}$""campaign""adgroup""target""productAd""portfolio""front""workflow""public-api""mcp""system""applied""failed""^\\d{4}-\\d{2}-\\d{2}$""^\\d{4}-\\d{2}-\\d{2}$"Responses
200