# Data (https://sellersheetai.com/docs/data) > The report tables SellerSheet keeps in sync for every connected store. SellerSheet syncs report tables — seller, Ads and noon — that your AI queries with `query_report_data`. ## How syncing works [#how-syncing-works] * **On a schedule, per table.** As soon as a store is connected, SellerSheet requests each report from Amazon (or noon) on that table's own cadence — shown on every table's page — and keeps the rows. Your agent never waits for Amazon to build a report: `query_report_data` answers from the stored rows in seconds and spends none of Amazon's rate limits. * **Active marketplaces only.** Only the marketplaces active on your plan sync. A store with no active marketplace is paused and refused rather than answered from stale rows — see [Store refs](/docs/mcp-api/store-refs#paused-stores). * **Live when it must be live.** For "right now" questions — one SKU's stock before a shipment, one order's status — your agent calls the live tool instead. See [Synced reports](/docs/mcp-api/workflows/reports). * **No buyer personal data.** No table holds a buyer's name, e-mail or street address — see [Data we never see](/docs/start/privacy). ## Find a table [#find-a-table] Search by table name, report type or column name. **How fresh is it?** says how often a table syncs, with its exact schedule under it. **Need it right now?** names the live tool your AI calls instead when the last sync is not recent enough — "—" where no live tool answers that table. # How to Use Amazon Marketing Cloud (AMC) with Your Own AI (https://sellersheetai.com/guides/analyze-amazon-marketing-cloud-with-ai) > Turn on Amazon Marketing Cloud for a store; your own AI answers new-to-brand and campaign-overlap questions and builds audiences your campaigns bid on. Turn on Amazon Marketing Cloud (AMC) for a store on **Settings → Stores & Marketplaces**, or ask your AI to do it. Your own AI, connected through [SellerSheet MCP](/guides/connect-sellersheet-mcp), can then answer questions Ads reports can't: new-to-brand buyers by campaign, how many ads a shopper sees before buying, which campaigns reach the same people. It can write and run any AMC query, read the AMC reports SellerSheet syncs every week or four weeks, and turn a group of shoppers into an audience your campaigns bid on. It can also save a query to run every day or week. AMC always answers with totals, never a person. ## What AMC answers that Ads reports cannot [#what-amc-answers-that-ads-reports-cannot] Amazon's Ads reports tell you what each campaign did: impressions, clicks, spend, orders. They count each campaign on its own, so they can't tell you what happened to one shopper across several ads and a purchase. **Amazon Marketing Cloud** can. It holds your own ad events and shopping events at shopper level, and answers questions in SQL across them. With it, your AI can answer: * **New to brand, by campaign:** how many of each campaign's buyers had never bought from your brand before. * **Ads before buying:** how many of your ads a shopper sees, and how buying climbs with it. * **Campaign overlap:** which pairs of campaigns reach the same shoppers, for example an Auto and a Manual campaign bidding on the same product. * **Time to conversion:** how long after the ad the purchase comes, so you know whether a 7-day window undercounts your ads. * **First vs last search term:** the term a buyer clicked first, and the one that got the credit in your Ads reports. Two things AMC never gives you. It answers **only with totals** over groups of shoppers; nothing identifies a person. And it **hides any group with too few shoppers**: that group's labels come back blank, while its numbers still count in the totals. A small advertiser sees more when it groups broadly, by campaign or by theme rather than by single keyword. Once AMC is on, your AI has three ways in: read the AMC reports SellerSheet syncs, ask AMC a question of your own, or build an audience your campaigns can use. The three ways in. 1, turn AMC on for a store and country, on the Stores page or by asking your AI. Then, depending on what you need: read the synced reports for a common question (weekly or every 4 weeks, no SQL), ask AMC anything (your AI writes the SQL, dry-runs it and reads back rows), or build an audience (rule-based or lookalike). The first two end in an answer with totals only and small groups hidden; the audience ends as a bid adjustment on a campaign once Amazon activates it, in 2–24 hours ## Before you start [#before-you-start] * **A SellerSheet account with the store connected and Ads authorized.** Both are on **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home); see [Stores & Marketplaces](/help/app/settings/stores). * **An MCP client connected,** such as Claude, ChatGPT or Cursor: see [How to Connect SellerSheet MCP](/guides/connect-sellersheet-mcp). * **Campaigns delivered in the last 28 days** in that country. Amazon offers AMC only to advertisers with recent campaigns. * **The AMC terms accepted, once per Ads region.** Sign in at [advertising.amazon.com/marketing-cloud](https://advertising.amazon.com/marketing-cloud) with the Amazon login that connected Ads to SellerSheet, and accept the terms. Do it once for each region you advertise in: North America, Europe (which includes the Middle East and India) and Far East. This is your own agreement with Amazon, so only you can accept it; SellerSheet never clicks it for you. * **The right access.** On the Stores page, the owner or an admin turns AMC on. Your AI needs **Ads write** access on the store for anything that creates, changes or deletes something: turning AMC on, a saved query or schedule, an audience, or an audience bid adjustment on a campaign. Running queries and reading results needs Ads read. A member gets these on the Stores page (**⋯ → Access**), and a restricted API key on **Settings → API & MCP**; see [Stay in control](/docs/mcp-api/control). If you already have a self-service AMC instance, made in the Ads console, by Ads Agent or by another tool, SellerSheet uses that same instance. Nothing new is created. AMC accounts an agency set up for you, and paid AMC accounts, are not supported. ## Step 1: turn AMC on, per store and Ads country [#step-1-turn-amc-on-per-store-and-ads-country] AMC is off until you turn it on, one store and one Ads country at a time. A store that advertises in the US and Canada gets one instance for each country you turn on. Amazon has no way to delete an AMC instance. It holds only your own advertising data, and turning it on changes nothing in your campaigns, but it stays in your Ads account. That is why the Stores page warns you first, and why your AI asks before it turns AMC on. ### On the Stores page [#on-the-stores-page] 1. Open **Settings → Stores & Marketplaces** in the SellerSheet app. 2. On the store's row, open **⋯** and choose **Turn on Marketing Cloud…**. It is greyed out while the store's Ads authorization is not **Authorized**, or when every marketplace with an Ads profile already has AMC on. 3. Pick the **Marketplace** and click **Turn on**. The Amazon stores card of Settings → Stores & Marketplaces with three made-up stores. myStore's Marketing Cloud column shows US · On and CA · Creating. On myOtherStore's row the ⋯ menu is open with Turn on Marketing Cloud… highlighted, and beside it the Turn on Amazon Marketing Cloud dialog: the warning that the instance cannot be deleted, Marketplace set to UK United Kingdom, and the Cancel and Turn on buttons The **Marketing Cloud** column then shows one chip per country: **On**, **Creating** or **Failed**. Amazon can take up to five minutes to build a new instance. While it says **Creating**, open the dialog again and click **Check again**. If the terms are not accepted yet, the dialog stays open with Amazon's own message and an **Open Amazon Marketing Cloud** link. Accept the terms there, come back, and click **Turn on** again. Every control on that page is described in [Stores & Marketplaces](/help/app/settings/stores#amc). ### Or ask your AI [#or-ask-your-ai] "Turn on Amazon Marketing Cloud for myStore-US." Your AI calls [`ads_amc_turn_on`](/docs/mcp-api/tools/ads_amc_turn_on) with the store and the Ads country, after asking you to confirm. Calling it again is safe: once AMC is on, it only reads. [`get_user_context`](/docs/mcp-api/tools/get_user_context) tells your AI, for each store and country, whether AMC is on, so it knows before it starts. ## Way 1: ask AMC anything [#way-1-ask-amc-anything] Ask your question in plain words. Your AI writes the AMC SQL, runs it on your instance and reads the answer back as rows. "Using AMC for myStore-US over the last 28 days: for each campaign, how many shoppers clicked an ad and then bought within 14 days, and how many of them were new to the brand? Group small campaigns together so AMC doesn't hide them." What your AI does behind that prompt: 1. **Checks what is already synced.** [`list_amc_templates`](/docs/mcp-api/tools/list_amc_templates) lists the AMC reports SellerSheet keeps (Way 2). When one answers the question, your AI reads it instead of running a new query. 2. **Reads the tables.** [`ads_list_data_sources`](/docs/mcp-api/tools/ads_list_data_sources) lists the tables your instance can query; [`ads_get_data_source`](/docs/mcp-api/tools/ads_get_data_source) gives a table's columns and which ones AMC keeps private. 3. **Checks the SQL with a dry run.** [`ads_create_workflow_execution`](/docs/mcp-api/tools/ads_create_workflow_execution) with `dry_run` validates the query in seconds without computing anything or using Amazon's AMC allowance. 4. **Runs it and waits.** The same tool runs the query over the time window your AI chose; [`ads_get_workflow_execution`](/docs/mcp-api/tools/ads_get_workflow_execution) reports its status. Most queries finish within two minutes. If AMC refuses the SQL, Amazon's reason comes back and your AI fixes the query by it. 5. **Reads the answer as rows.** [`ads_get_workflow_execution_download_urls`](/docs/mcp-api/tools/ads_get_workflow_execution_download_urls) returns the result as rows, never download links, with a count of the rows AMC hid. Your AI can also list the runs on your instance, including ones started in the AMC console or by a schedule, with [`ads_list_workflow_executions`](/docs/mcp-api/tools/ads_list_workflow_executions), and cancel one still running with [`ads_update_workflow_execution`](/docs/mcp-api/tools/ads_update_workflow_execution). Here is the dry run from step 3, as your AI sends it: * AMC runs up to 10 queries at a time on one instance. * A result over 20 MB is too big to read back. Ask for broader groups, or a shorter window. * A purchase can be credited to an ad up to 30 days after the ad ran, so per-ad numbers for the last few weeks can still grow. That is also why the four-weekly reports below wait 15 days. ## Way 2: read the synced AMC reports [#way-2-read-the-synced-amc-reports] The common questions don't need a new query each time. For every store and country whose AMC is on, SellerSheet runs a set of proven AMC queries on a schedule and keeps their rows next to your other synced reports. Your AI reads them like any other report, with no SQL and no waiting. | Report | The question it answers | How often | | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ----------------------------- | | [rpt_amc_ntb_by_campaign](/docs/data/rpt_amc_ntb_by_campaign) | How many of each campaign's purchases came from shoppers new to the brand? | Weekly | | [rpt_amc_hour_of_day](/docs/data/rpt_amc_hour_of_day) | At which hours of the day do clicks, spend and the purchases they lead to happen? | Weekly | | [rpt_amc_atc_by_search_term](/docs/data/rpt_amc_atc_by_search_term) | For each search term shoppers clicked, how many added to cart and how many ordered? | Weekly | | [rpt_amc_campaign_overlap](/docs/data/rpt_amc_campaign_overlap) | Which pairs of campaigns reach the same shoppers, and how much of each one's reach is shared? | Every 4 weeks | | [rpt_amc_impressions_per_shopper](/docs/data/rpt_amc_impressions_per_shopper) | How many ads does a shopper see, and how does buying climb with it? | Every 4 weeks | | [rpt_amc_ntb_gateway_asins](/docs/data/rpt_amc_ntb_gateway_asins) | Which advertised products bring shoppers to the brand for the first time? | Every 4 weeks | | [rpt_amc_keyword_halo](/docs/data/rpt_amc_keyword_halo) | Which keywords sell the brand's other products beyond the advertised one? | Every 4 weeks | | [rpt_amc_time_to_conversion](/docs/data/rpt_amc_time_to_conversion) | How long after the ad do purchases happen? | Every 4 weeks | | [rpt_amc_first_vs_attributed_term](/docs/data/rpt_amc_first_vs_attributed_term) | Which search term did buyers click first, and which last before buying? | Every 4 weeks | | [rpt_amc_path_to_conversion](/docs/data/rpt_amc_path_to_conversion) | How many different campaigns did buyers click before their first purchase? | Every 4 weeks, off by default | | [rpt_amc_cross_sell_next_purchase](/docs/data/rpt_amc_cross_sell_next_purchase) | After a shopper's first purchase of a brand product, which product do they buy next? | Every 4 weeks, off by default | * **Weekly** reports cover Monday to Sunday in the marketplace's own time zone. Amazon runs them each Monday. * **Every 4 weeks** reports cover 28 days and run 15 days after the period ends, once late purchases have been attributed. * The two reports **off by default** rarely show anything for a small Sponsored Products advertiser: most of their rows fall under AMC's privacy floor. * **When rows first appear:** sync starts from the newest finished period, with no history before it. Weekly reports fill after the next Monday run; a four-weekly report can take up to four weeks to show its first period. "From the synced AMC reports for myStore-US, which campaigns had the lowest new-to-brand share last week? And which campaign pairs share more than a third of their reach over the last 28 days?" Your AI reads [`list_amc_templates`](/docs/mcp-api/tools/list_amc_templates) for each report's question, its table and how to read its rows, then queries the table with [`query_report_data`](/docs/mcp-api/tools/query_report_data) ([`get_table_schema`](/docs/mcp-api/tools/get_table_schema) gives the columns). Because the rows sit beside your other reports, it can combine them in one answer, for example new-to-brand share next to the campaign's spend and sales. ### Three rules for reading the rows [#three-rules-for-reading-the-rows] * **One hidden row per period.** Each period has one row with `hidden` set to true. It adds up everything AMC suppressed under its privacy floor, so totals still match. It has no labels: include it in totals, leave it out of per-campaign or per-term answers. A count of distinct shoppers summed into it can count one shopper twice. * **`period_start` is the first day of the period,** in the marketplace's time zone, not a day of activity. `period_days` says whether the period is 7 or 28 days long. * **AMC purchases count only the advertised product.** The purchases in your Ads reports also count your brand's other products bought after the ad, so the AMC number is usually lower. It measures something different; it is not wrong. ## Way 3: build an audience for your campaigns [#way-3-build-an-audience-for-your-campaigns] An answer tells you who your shoppers are. An audience lets you act on it: AMC turns a group of shoppers into an audience in your Ads account, and a campaign can adjust its bids for the shoppers in it. There are two kinds: * **Rule-based:** the shoppers an AMC query selects, for example "shoppers who added a product to their cart in the last 30 days but didn't buy". * **Lookalike:** shoppers Amazon finds to be similar to a seed the query selects, for example everyone your ads reached. "For myStore-US, build an audience of the shoppers who added one of my products to their cart in the last 30 days but didn't buy. If that's too small, propose a lookalike instead. Show me the plan before you create anything." An audience from your question to a campaign. 1, you ask, and your AI proposes the SQL and the size. 2, it counts first: a rule-based audience needs 2,000 or more shoppers, a lookalike seed 500 to 500,000; a small store is usually below 2,000, so seed a lookalike with the shoppers your ads reached. You say yes, and nothing is created before. 3, it creates a rule-based or lookalike audience. 4, Amazon builds it, RUNNING then SUCCEEDED, in about 15 to 90 minutes; FAILED when too small or without a match, so change the window or SQL and run it again. 5, it is activated in your Ads account within 2–24 hours, under Custom-built › AMC. Then it becomes an audience bid adjustment on a campaign, up to 10 audiences. Once it succeeds it can't be edited, only deleted What your AI does behind that prompt: 1. **Counts first.** It counts the same shoppers with [`ads_create_workflow_execution`](/docs/mcp-api/tools/ads_create_workflow_execution), so it knows whether the audience can pass Amazon's minimum size (below). 2. **Proposes, then waits for your yes.** It shows you the audience it plans: who is in it, roughly how many, over which days. The audience tools are gated, so nothing is created before you agree. 3. **Creates it.** [`ads_create_query_based_audience`](/docs/mcp-api/tools/ads_create_query_based_audience) makes a rule-based audience; [`ads_create_lookalike_audience`](/docs/mcp-api/tools/ads_create_lookalike_audience) makes a lookalike, where you also choose how far from the seed it reaches, from `MOST_SIMILAR` to `MOST_BROAD`. 4. **Waits for Amazon.** [`ads_get_query_based_audience_by_audience_execution_id`](/docs/mcp-api/tools/ads_get_query_based_audience_by_audience_execution_id) follows the build: RUNNING, then SUCCEEDED or FAILED. A rule-based audience usually takes 15–20 minutes and a lookalike up to about 90; a long RUNNING is normal for one that succeeds. [`ads_get_all_query_based_audiences_by_instance_id`](/docs/mcp-api/tools/ads_get_all_query_based_audiences_by_instance_id) lists every audience on your instance, including ones made in the AMC console. 5. **Finds it in your Ads account.** Amazon activates a SUCCEEDED audience within 2–24 hours. It then appears in [`ads_list_targetable_entities`](/docs/mcp-api/tools/ads_list_targetable_entities), for Sponsored Products under **Audience Category › Custom-built › AMC**, with the audience ID a campaign takes. 6. **Adds it to a campaign.** With your go-ahead, your AI adds the audience to a campaign as an audience bid adjustment, with [`ads_update_campaign`](/docs/mcp-api/tools/ads_update_campaign). A campaign takes up to 10 audiences. * **A rule-based audience needs at least 2,000 shoppers;** aim for 2,500. Below that, Amazon builds it for 15–20 minutes and then it ends FAILED: "did not meet the minimum required size". A small store's buyers or ad clickers are usually far below the floor. * **A lookalike needs a seed of 500 to 500,000 shoppers, and a count above 500 is not enough.** Amazon keeps only the shoppers it can match, so a seed of a few hundred ad clickers can still end FAILED after about 20 minutes: "did not find a sufficient match for seed users". * **On a small store, seed the lookalike with reach:** the tens of thousands of shoppers your ads were shown to. At the closest setting, `MOST_SIMILAR`, Amazon aims for about 500,000 to 1 million similar shoppers in Europe and the Americas, and 200,000 to 300,000 in Asia. ### Changing or removing an audience [#changing-or-removing-an-audience] * **A SUCCEEDED audience can't be edited, only deleted,** with [`ads_delete_query_based_audience_by_audience_execution_id`](/docs/mcp-api/tools/ads_delete_query_based_audience_by_audience_execution_id). Take it out of every campaign first. Deleting can't be undone, so your AI asks you before it does. * **A FAILED audience can be fixed and run again** with [`ads_update_query_based_audience_by_audience_execution_id`](/docs/mcp-api/tools/ads_update_query_based_audience_by_audience_execution_id): a new time window, or new SQL. * **Amazon refreshes an audience on its own.** One that no campaign uses is refreshed less often and switched off after about 100 days. * **Every audience query is logged,** like every other AMC query SellerSheet runs. ## Save a query and run it on a schedule [#save-a-query-and-run-it-on-a-schedule] When a question is worth asking every week, your AI can save its query on your instance and have Amazon run it on a schedule. For the questions the synced reports already answer (Way 2), you don't need this. "Save the new-to-brand query we just ran for myStore-US and run it every Monday. Create the schedule paused, and show me the first run before you turn it on." 1. **Save the query.** Your AI checks the SQL with a dry run first, then saves it under a name with [`ads_create_workflow`](/docs/mcp-api/tools/ads_create_workflow). [`ads_list_workflows`](/docs/mcp-api/tools/ads_list_workflows) and [`ads_get_workflow`](/docs/mcp-api/tools/ads_get_workflow) read the saved queries. [`ads_update_workflow`](/docs/mcp-api/tools/ads_update_workflow) replaces one, and every schedule that runs it uses the new SQL from then on. [`ads_delete_workflow`](/docs/mcp-api/tools/ads_delete_workflow) removes one once no schedule runs it; its past runs stay. 2. **Schedule it,** Daily or Weekly, with [`ads_create_schedule`](/docs/mcp-api/tools/ads_create_schedule). A schedule can be created paused and turned on later with [`ads_update_schedule`](/docs/mcp-api/tools/ads_update_schedule), which also changes its period. [`ads_list_schedules`](/docs/mcp-api/tools/ads_list_schedules) and [`ads_get_schedule`](/docs/mcp-api/tools/ads_get_schedule) read them; [`ads_delete_schedule`](/docs/mcp-api/tools/ads_delete_schedule) removes one and keeps its saved query. 3. **Read each run in time.** Every run appears in [`ads_list_workflow_executions`](/docs/mcp-api/tools/ads_list_workflow_executions). Its result can be downloaded for about a day, so your AI reads it with [`ads_get_workflow_execution_download_urls`](/docs/mcp-api/tools/ads_get_workflow_execution_download_urls) before it expires. Saving, changing or deleting a query or a schedule changes your instance, so your AI asks you first. The saved queries and schedules behind the synced reports show up in the same lists, named `sellersheet_…`. The tools refuse to change, delete, re-schedule or cancel them. They are SellerSheet's, so leave them as they are; removing the store from SellerSheet deletes them. ## Browse what campaigns can target [#browse-what-campaigns-can-target] [`ads_list_targetable_entity_paths`](/docs/mcp-api/tools/ads_list_targetable_entity_paths) lists the taxonomy paths of what a sponsored-ads campaign can target, and [`ads_list_targetable_entities`](/docs/mcp-api/tools/ads_list_targetable_entities) lists what sits under one; for example, your AMC audiences under **Audience Category › Custom-built › AMC**. ## What you see in Amazon's own screens [#what-you-see-in-amazons-own-screens] SellerSheet works inside your own AMC instance, so its work shows in the AMC console: * **Its queries and runs.** The queries your AI runs, and the runs that fill the synced reports, appear in the instance's run list. * **Saved queries and schedules:** your own, and SellerSheet's, named `sellersheet_…`, which run the weekly reports. The tools never change SellerSheet's; leave them as they are in the console too. * **The audiences your AI creates,** listed in the instance, and once active in your Ads account under Custom-built › AMC. * **Amazon sees the queries,** as it sees every query run in AMC. Your AMC results are yours and confidential under Amazon's AMC terms. SellerSheet uses a store's results only for that store: never shared with another store, and never pooled into benchmarks. It keeps the synced rows for 13 months. ## What isn't available [#what-isnt-available] * **Amazon's AMC SQL generator**, which Amazon offers as a closed beta. Today your AI writes the SQL itself, checks it against your instance's own table descriptions and with a dry run, and fixes it from Amazon's reason when AMC refuses it. * **Managed-account features:** AMC's Clean Rooms collaborations, adding advertisers, and creating or deleting instances are not available on an instant instance. AMC Custom Models is offered by Amazon in North America only. ## Which way do you need? [#which-way-do-you-need] | What you need | Ask your AI to… | Tools behind it | | ------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | AMC on for a store and country | Turn on Amazon Marketing Cloud for the store | `ads_amc_turn_on` (or the Stores page) | | A common question: new to brand, overlap, hour of day, time to conversion | Answer from the synced AMC reports | `list_amc_templates`, `query_report_data` | | A question of your own | Write and run an AMC query | `ads_create_workflow_execution`, `ads_get_workflow_execution`, `ads_get_workflow_execution_download_urls` | | A run that's taking too long, or was started by mistake | Find it and cancel it | `ads_list_workflow_executions`, `ads_update_workflow_execution` | | Shoppers to bid on: cart abandoners, past buyers, or people like them | Build an audience and add it to a campaign | `ads_create_query_based_audience`, `ads_create_lookalike_audience`, `ads_list_targetable_entities`, `ads_update_campaign` | | The same question every day or week | Save the query and schedule it | `ads_create_workflow`, `ads_create_schedule`, `ads_list_workflow_executions` | ## FAQ [#faq] ### What does Amazon Marketing Cloud answer that Ads reports cannot? [#what-does-amazon-marketing-cloud-answer-that-ads-reports-cannot] Questions that follow the same shopper across ads and purchases: how many of a campaign's buyers were new to your brand, how many ads a shopper saw before buying, which campaigns reach the same people, how long after the ad the purchase came, and which search term a buyer clicked first versus last. Ads reports total each campaign on its own, so they cannot answer these. ### Does AMC show me individual shoppers? [#does-amc-show-me-individual-shoppers] No. AMC answers only with totals over groups of shoppers, and it hides any group with too few shoppers in it. Nothing in a result identifies a person. ### Can I turn AMC off or delete it? [#can-i-turn-amc-off-or-delete-it] Amazon cannot delete an AMC instance once it exists, which is why the Stores page warns you and your AI asks before turning it on. The instance only holds your own advertising data and changes nothing in your campaigns. If you remove the store from SellerSheet, SellerSheet deletes its saved queries and schedules from the instance; the instance itself stays in your Ads account. ### I already use AMC in the Ads console. Will SellerSheet create a second instance? [#i-already-use-amc-in-the-ads-console-will-sellersheet-create-a-second-instance] No. If you already have a self-service AMC instance, made in the Ads console, by Ads Agent or by another tool, turning AMC on in SellerSheet finds that instance and uses it. AMC accounts set up for you by an agency, or a paid AMC account, are not supported. ### Why do AMC purchases differ from my Ads reports? [#why-do-amc-purchases-differ-from-my-ads-reports] AMC counts purchases of the advertised product only. The purchases in Amazon's Ads reports also count your brand's other products bought after the ad. The two numbers measure different things, so AMC's is usually lower. ### Do I need to know SQL? [#do-i-need-to-know-sql] No. You ask in plain words. Your AI first checks whether a synced AMC report already answers the question; if not, it writes the SQL, checks it with a dry run and fixes it from Amazon's reason if AMC refuses it. ### Can my AI build audiences from AMC? [#can-my-ai-build-audiences-from-amc] Yes, but only after you say yes. It can create a rule-based audience, the shoppers an AMC query selects (at least 2,000 of them), or a lookalike audience, shoppers similar to a seed of 500 to 500,000. Once Amazon activates it in your Ads account, within 2–24 hours, your AI can add it to a campaign as an audience bid adjustment. On a small store, a lookalike seeded with the shoppers your ads reached is usually the one that works. # How to Use SellerSheet MCP to Manage Amazon Ads Budgets (https://sellersheetai.com/guides/automate-amazon-ads-budgets-in-google-sheets) > Let an AI agent watch your Amazon PPC budget usage, apply Amazon's budget recommendations, and set schedule- and performance-based budget rules for Prime Day and peak days — all from Google Sheets via SellerSheet MCP. Connect an AI client to [SellerSheet MCP](/guides/connect-sellersheet-mcp) and tell it what you want in plain language: "check today's budget usage for myStore-US", "set a Prime Day rule at Amazon's suggested percentage", or "raise budget 25% while ACOS is under 20%". The agent calls the Amazon Ads Budget APIs for you — live usage, official recommendations, and schedule- or performance-based budget rules that revert automatically — and writes every plan and result into your Google Sheet for review. ## Introduction [#introduction] Two budget problems eat more PPC revenue than any bad keyword. Campaigns run out of budget at lunchtime and sit dark all afternoon — and you only find out the next day. And shopping events arrive with no budget headroom because someone forgot to raise the caps the night before. Amazon's Ads API has an answer for both: the **Budget Usage** API for live intraday consumption, and **Budget Rules** — automatic, self-reverting daily-budget increases driven by a schedule, a shopping event, or a performance metric. SellerSheet exposes this whole family as MCP tools, so your AI agent (Claude, ChatGPT, or any MCP client) can run the entire workflow for you, with your Google Sheet as the audit trail: * `ads_campaigns_budget_usage` / `ads_portfolio_budget_usage` — live budget consumption for SP / SB / SD campaigns and portfolios. * `ads_create_budget_rules_for_campaigns` / `ads_update_budget_rules_for_campaigns` / `ads_create_associated_budget_rules_for_campaigns` — create, update (also pauses, via `ruleState: PAUSED`), and associate schedule- or performance-based rules (SP / SB / SD). * `ads_get_budget_rules_recommendation` — Amazon's upcoming shopping events with suggested increase percentages (SP / SB). * `ads_sp_get_budget_recommendations` / `ads_sb_get_budget_recommendations` / `ads_get_sd_budget_recommendations` — suggested budgets plus missed-impression/click/sales estimates. * `ads_get_budget_recommendation` — a starting daily budget for a campaign you haven't created yet. Everything in this guide follows Amazon's official budget-rules documentation and has been verified end-to-end against the live Amazon Ads API across all three ad products, then put through a dedicated hardening pass so that a request the AI gets wrong is refused outright rather than half-applied. Where Amazon limits a capability to certain products or marketplaces, we say so. ## Prerequisites [#prerequisites] * **A SellerSheet account** with your Amazon store connected and **Advertising authorized** — both under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). The Ads consent is separate from Seller Central. * **An MCP client connected** — follow [How to Connect SellerSheet MCP](/guides/connect-sellersheet-mcp) (Claude, ChatGPT, Cursor, and others). * **Ads write access** on the store for the API key your AI uses — reading usage and recommendations only needs read access, but creating or changing rules needs write. The store owner grants this per key under **Settings → API & MCP**. ## Workflow 1 — The morning budget check [#workflow-1--the-morning-budget-check] Your best campaign burned its whole budget by 1 PM and served nothing all afternoon. Yesterday's reports won't show it — they aggregate by day. By the time you notice in Seller Central, you've lost another afternoon of traffic. `ads_campaigns_budget_usage` / `ads_portfolio_budget_usage` return **live intraday consumption** — the one number daily reports can't give you. Ask your AI: "Check today's budget usage for all campaigns in myStore-US. Flag anything above 80%, and suggest adjustments based on the last 7 days of spend and sales." The agent queries your campaigns, calls the usage endpoint, and writes a table into your sheet: campaign, budget, **percent consumed**, and the timestamp Amazon last evaluated usage. Campaigns near 100% are your action list — either a manual raise or, better, a budget rule (Workflows 2–3) so it never happens again. ### What the usage data means [#what-the-usage-data-means] * **budgetUsagePercent:** spend as a percentage of the currently available budget (87.5 = 87.5% consumed). * **usageUpdatedTimestamp:** when Amazon last evaluated usage — the figure is fresh but not second-by-second. * **Coverage:** SP, SB, and SD campaigns, plus portfolios — up to 100 IDs per call (the agent chunks larger sets automatically). * **Portfolios:** only portfolios with a budget cap report a meaningful percentage. ## Workflow 2 — Schedule rules for Prime Day and peak days [#workflow-2--schedule-rules-for-prime-day-and-peak-days] Prime Day traffic tripled — and your campaigns went dark by 10 AM because the budgets were set for a normal Tuesday. Or you did remember to raise them, and then forgot to set them back, quietly overspending for a week. A **schedule-based budget rule** (`ruleType: SCHEDULE`) raises the daily budget by a percentage you choose, for a window you choose, and **reverts automatically** when the window ends. Three flavors, straight from Amazon's schedule-based rules guide: * **Custom date range** — "December 1–15, +50%". Works on SP, SB, and SD. * **Recommended shopping event** — Amazon lists upcoming events (Prime Day, Black Friday…) per campaign with a suggested increase percentage; the rule binds to the event, so if Amazon shifts the dates, the rule follows. Events are offered for SP and SB campaigns. * **Recurring days** — "every Friday–Sunday, +20%" (weekly recurrence on SB and SD; Sponsored Products rules run on daily recurrence). Amazon also supports intraday time windows on schedule rules in the US, CA, UK, IN, and JP marketplaces. "Which official shopping events are coming up for my main campaigns in myStore-US? Create an event budget rule for each at Amazon's suggested percentage, and associate them — write the plan to my sheet first so I can confirm." Behind that prompt the agent runs the exact three-step sequence Amazon's guide describes: fetch event recommendations (`ads_get_budget_rules_recommendation` returns each event's ID, dates, and suggested increase), create the rule with `ads_create_budget_rules_for_campaigns` using the event ID, then associate the rule to each campaign with `ads_create_associated_budget_rules_for_campaigns`. One rule can serve many campaigns, and each step's result lands in your sheet. Event recommendations exist for Sponsored Products and Sponsored Brands only (Amazon provides none for Sponsored Display), and the SB variant is marketplace-gated — available in the US, but not yet in some marketplaces (we've confirmed AE and AU return "unsupported marketplace"). An empty event list simply means no events are coming up — that's normal, not an error. ## Workflow 3 — Performance rules: let the data raise the budget [#workflow-3--performance-rules-let-the-data-raise-the-budget] A campaign is converting beautifully — ACOS 15%, well under target — and it's budget-capped. Every day you don't raise the budget is profitable traffic handed to a competitor. But you can't watch every campaign's metrics every day. A **performance-based rule** (`ruleType: PERFORMANCE`) raises the budget only while a metric beats your threshold: "while ACOS \< 20%, budget +25%". Amazon evaluates the metric over the trailing **7 days for sellers** (14 for vendors). If the condition stops holding, the increase stops — the decision to spend more stays tied to the data. "Create a performance rule for the bedding-series SP campaigns in myStore-US: raise budget 25% while ACOS is below 20%. Write it to the sheet for my confirmation first." ### Available metrics differ by ad product [#available-metrics-differ-by-ad-product] * **Sponsored Products / Display:** ACOS, CTR, CVR, ROAS. * **Sponsored Brands:** top-of-search impression share (IS), new-to-brand % (NTB), and ROAS — **not** ACOS/CTR/CVR. (IS is unavailable for campaigns with video creatives.) * **Operators:** greater/less than (or equal); `EQUAL_TO` exists on Sponsored Products only. * **Minimum budget:** Amazon requires a minimum daily budget for performance rules to activate, so there's enough traffic to compute the metrics. If several rules on one campaign are satisfied at once, Amazon applies **all of them additively** — a +40% performance rule plus a +100% Black Friday rule means +140% that day. A campaign can hold up to 250 rules. Before adding one, have your AI list the campaign's existing rules ("what budget rules are on this campaign?") so increases don't compound by accident. ## Workflow 4 — Right-size budgets with Amazon's own numbers [#workflow-4--right-size-budgets-with-amazons-own-numbers] "Is my daily budget enough?" For a new campaign you're guessing; for a running one you can't see the sales you *didn't* get because the budget ran out. Both answers exist — Amazon computes them — but they're buried in the API. Two kinds of read-only tool surface Amazon's estimates: * **Running campaigns** — `ads_sp_get_budget_recommendations` / `ads_sb_get_budget_recommendations` / `ads_get_sd_budget_recommendations` return a suggested daily budget per campaign plus the **missed impressions, clicks, and sales** Amazon estimates you're forfeiting at the current budget (up to 100 campaigns per call). * **New campaigns** — `ads_get_budget_recommendation` takes your ASINs, targeting type, and bids *before* the campaign exists and returns a starting daily budget that shouldn't throttle delivery in week one. Sponsored Products only. "For my Sponsored Brands campaigns in myStore-US: if I raised budgets, how many extra impressions and sales would I get? Put each campaign's suggested budget and missed-opportunity numbers in a table." Pair every recommendation with Workflow 1. A campaign that never gets near its cap doesn't need a raise no matter what the recommendation says — spend the headroom where usage runs hot. ## Workflow 5 — Verify what your rules actually did [#workflow-5--verify-what-your-rules-actually-did] You set the rules and… then what? Automation you can't audit is automation you'll eventually turn off. You need to see which rules fired, what budget was actually in force, and whether the extra budget converted. Amazon evaluates budget rules **at the start of each day in the marketplace's own timezone** (and re-evaluates immediately whenever a rule or the campaign's budget changes) — so "today" means the ad profile's day, not yours. Each rule carries a status you can read back: *Active*, *On Hold* (condition not currently met), *Paused*, *Budget threshold not met*, *Pending Start*, or *Expired*. Three ways to audit, in order of immediacy: * **List the rules on a campaign** — `ads_list_associated_budget_rules_for_campaigns` shows every associated rule with its status. This is Amazon's own recommended source of truth: because rules stack, the single "applicable rule" field elsewhere can be incomplete. * **Watch usage during the window** — re-run Workflow 1 while a rule is active to confirm the raised budget is being consumed (i.e., the increase is buying real traffic). * **Pull the audit columns in a report** — for Sponsored Products, the campaigns report (`ads_create_async_report`, report type `spCampaigns` grouped by campaign) includes `campaignRuleBasedBudgetAmount`, `campaignApplicableBudgetRuleId`, and `campaignApplicableBudgetRuleName` — the rule-based budget that was in force, day by day, next to spend and sales. "For myStore-US, list the budget rules on each of my SP campaigns with their status, then pull last week's campaign report with the rule-based budget columns and summarize which rules fired and what they cost." Older Amazon docs describe auditing rule-based budgets via the Snapshots API. Amazon deprecated Snapshots (shut off October 2024) — use the two working paths above instead: list the rules on the campaign, and pull the rule-based budget columns in the campaigns report. ## Which workflow do you need? [#which-workflow-do-you-need] | What you need | Ask your AI to… | Tool behind it | Ad products | | -------------------------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------ | | Know who's about to run out of budget today | Check today's budget usage | `ads_campaigns_budget_usage` / `ads_portfolio_budget_usage` | SP / SB / SD / portfolios | | Survive Prime Day / peak dates automatically | Set an event or date-range budget rule | `ads_create_budget_rules_for_campaigns` (+ event recs) | SP / SB / SD (events: SP / SB) | | Feed winners without watching dashboards | Set a performance rule on a metric threshold | `ads_create_budget_rules_for_campaigns` | SP / SB / SD | | Decide whether a raise is worth it | Get suggested budgets + missed-opportunity estimates | `ads_sp_get_budget_recommendations` / `ads_sb_get_budget_recommendations` / `ads_get_sd_budget_recommendations` | SP / SB / SD | | Pick a launch budget for a new campaign | Ask for the initial budget recommendation | `ads_get_budget_recommendation` | SP only | | Audit which rules fired and what they cost | List rules per campaign + pull the report audit columns | `ads_list_associated_budget_rules_for_campaigns` + `ads_create_async_report` | All (report columns: SP) | ## Good to know before you automate [#good-to-know-before-you-automate] * **Rules only ever increase, by percent, inside their window.** Your base budget is never permanently modified; outside the window everything is exactly as you set it. * **There is no delete.** Amazon's API has no rule-delete operation — pause a rule or disassociate it from the campaign; both stop it cold. * **Review before write.** A well-prompted agent writes the rule plan to your sheet and waits for your confirmation before creating anything — the prompts in this guide ask for exactly that. * **Rules are attached one campaign at a time.** Amazon's bulk-association shortcut isn't available to third-party tools (we tested it across three ad accounts and marketplaces), so the agent associates each campaign individually — same end result, nothing for you to do differently. * **New rules start as Pending Start — and stay there a while.** A rule created for a future window shows *Pending Start* until its window opens, and in our live testing it took a few hours past marketplace midnight to flip to *Active*. That's expected. Don't re-create a rule that hasn't turned Active yet on event morning — you'd end up with two, and their increases stack. * **A wrong request fails cleanly, not halfway.** If the AI sends a malformed budget request, it comes back rejected with the exact field and the allowed values — so the agent corrects itself and retries, instead of leaving a half-applied change on your account. ## FAQ [#faq] ### What are Amazon Ads budget rules? [#what-are-amazon-ads-budget-rules] Budget rules automatically increase a campaign's daily budget by a percentage you choose — either on a schedule (a date range or an Amazon shopping event like Prime Day) or when a performance metric such as ACOS or ROAS beats a threshold. When the window or condition ends, the budget reverts to normal on its own. They are supported for Sponsored Products, Sponsored Brands, and Sponsored Display. ### Can budget rules lower my budget? [#can-budget-rules-lower-my-budget] No. Budget rules only increase the daily budget, by a percentage, inside the window you define. Outside the window your original budget applies unchanged — nothing is permanently modified. ### Which metrics can performance-based rules use? [#which-metrics-can-performance-based-rules-use] Sponsored Products and Sponsored Display support ACOS, CTR, CVR, and ROAS. Sponsored Brands uses a different set: top-of-search impression share (IS), new-to-brand percentage (NTB), and ROAS. Metrics are computed over the previous 7 days for sellers (14 for vendors). ### What happens if several rules apply to one campaign at once? [#what-happens-if-several-rules-apply-to-one-campaign-at-once] Every rule whose condition is met applies, and their percentage increases are added together on top of the daily budget. A campaign can carry up to 250 rules, so it's worth listing a campaign's rules before adding another. ### How do I delete a budget rule? [#how-do-i-delete-a-budget-rule] Amazon's API has no delete operation for budget rules. Instead, pause the rule (set its state to `PAUSED`) or disassociate it from the campaign — either one stops it from affecting budgets. ### Do I need special permissions to manage budget rules with AI? [#do-i-need-special-permissions-to-manage-budget-rules-with-ai] Viewing budget usage, rules, and recommendations needs read access to the store's Ads data. Creating, updating, associating, or pausing rules requires **Ads write access**, which the store owner grants per API key under **Settings → API & MCP** in the SellerSheet app. ### What happens if the AI sends a bad budget request? [#what-happens-if-the-ai-sends-a-bad-budget-request] It is refused before anything changes on your account, with a message naming the exact field that was wrong and the values Amazon accepts. The agent reads that, corrects the request, and retries — so a mistake costs a round trip, not a half-applied budget change you have to unpick. # How to Bulk Add Up to 25,000 Existing ASINs to Your Amazon Catalog (https://sellersheetai.com/guides/bulk-add-existing-asins-to-your-catalog) > Add products that already exist on Amazon to your own catalog in bulk from Google Sheets — check eligibility, pair your SKUs with the ASINs, and submit them in one feed. Want to sell products that already exist on Amazon? In Seller Central, you'd search for each ASIN, click "Sell this product," fill in your offer, and repeat — one at a time. For a catalog of hundreds or thousands of products, that's hours of manual work. SellerSheet lets you **add up to 25,000 existing ASINs to your catalog in a single submission** from Google Sheets. The whole process takes three steps: 1. **Check eligibility** — verify you're approved to sell each ASIN. 2. **Fill in SKUs & ASINs** — set productType to `PRODUCT` and add your SKU/ASIN pairs. 3. **Submit to Amazon** — one click, up to 25,000 SKUs per submission. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. If not, follow [Install & first sync](/help/sheets/install). * **A list of ASINs:** the ASINs you want to add, plus your own SKU for each. ## Step 1: Check selling eligibility [#step-1-check-selling-eligibility] Some ASINs are restricted — they require approval, brand gating, or category ungating before you can sell them. Finding out after submission wastes time, and in Seller Central you'd have to check each one individually. Before adding ASINs, check that you're approved to sell them with the **Restriction Check** sheet in your SellerSheet Catalog spreadsheet: 1. Go to the **Restriction Check** sheet tab. 2. Enter your stores and ASINs in the **Store** and **ASIN** columns, and pick a **Reason Locale** (the language of Amazon's reasons) on every row. 3. Click **Get Restrictions** in the sidebar. 4. Review the **Status** column — `ALLOWED` ASINs are ready to add. `APPROVAL_REQUIRED` rows have an **Approval Link** to apply in Seller Central, and `RESTRICTED` rows say why in **Reasons**. Paste all your ASINs at once — SellerSheet checks them in bulk. For a detailed walkthrough, see [How to Bulk Check ASIN Selling Eligibility](/guides/check-asin-selling-eligibility-in-google-sheets). ## Step 2: Prepare and fill in your SKUs [#step-2-prepare-and-fill-in-your-skus] Now switch to the **Publish Queue** sheet tab. Since you're adding existing products (not creating new ones), the setup is minimal: 1. Set **Store** (A3) and **Listing Locale** (B3) for your marketplace. 2. Write `PRODUCT` in the **Product Type** column (D) for each row, from row 7 down. 3. Click **Get Template** in the sidebar — this loads the PRODUCT template (very few columns needed). 4. Set **Operation Type** to `UPDATE` in column C for each row. 5. Fill in your **SKU** (column B) — your own identifier for each product. 6. Fill in the ASIN of each row in its **Merchant Suggested ASIN** column. ### Why productType = PRODUCT? [#why-producttype--product] `PRODUCT` is the simplest productType — designed for matching existing catalog products. Since the product already exists on Amazon (with title, brand, images and so on), you only need to provide your SKU and the ASIN. Amazon handles the rest. Optionally, you can also fill in your offer (price) and the condition (new/used) if you want to set them during submission. Have your SKU/ASIN list ready in another sheet tab or file. After Get Template loads the columns, paste your data into the right columns — no manual entry needed. ## Step 3: Submit and track results [#step-3-submit-and-track-results] Which button you click depends on how many SKUs you're submitting: | SKU count | Action | Processing | | ---------------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | Up to 20 SKUs | **Validate (Preview)** (dry run), then **Create/Replace/Del.** | Immediate — per-SKU results appear in the Submission Log | | 20 – 25,000 SKUs | **Submit Feed** | Amazon queue — the feed is recorded in the Submission Log; click **Refresh Status** to check | ### Tracking your submission [#tracking-your-submission] 1. Go to the **Submission Log** sheet tab. 2. Find your submission row. 3. For Submit Feed: click **Refresh Status** in the sidebar until the **Feed Status** shows the feed is finished. 4. Check the **Result** and **Issues** columns — they show success or error details for each SKU. Submit Feed accepts up to **25,000 rows** per submission, but the total payload must stay under **10 MB**. Since PRODUCT listings are lightweight (just SKU + ASIN), you can typically reach the row limit without hitting the size limit. ## Tips for maximum efficiency [#tips-for-maximum-efficiency] * **Always check restrictions first:** submitting restricted ASINs wastes time. Check eligibility in the Restriction Check sheet before filling in the Publish Queue. * **Batch your submissions:** prepare all your SKU/ASIN pairs in the sheet first, then submit in one click. No need to submit row by row. * **Update price or title later with PARTIAL_UPDATE:** once your ASINs are in your catalog, use the `PARTIAL_UPDATE` operation type to update specific attributes like price, title or images without re-submitting everything. * **Need full listing control?** See [How to Bulk Create & Revise Amazon Listings](/guides/bulk-create-revise-amazon-listings-in-google-sheets) for creating new listings, updating attributes, managing variations and cross-marketplace expansion. Every button of the panel is listed on [Catalogs](/help/sheets/sellers/catalogs). # How to Bulk Create Invoices for Amazon Customers in Google Sheets (https://sellersheetai.com/guides/bulk-create-invoices-for-amazon-customers-in-google-sheets) > Generate VAT invoices or receipts for your Amazon customers in bulk, straight from your synced order data in Google Sheets, with your own branding and tax details. Generating professional invoices for Amazon customers can be a time-consuming manual task. SellerSheet automates the whole process: you create VAT invoices or receipts in bulk, directly from your synced order data in Google Sheets. ## Step 1: Configure store information [#step-1-configure-store-information] Before generating invoices, set up your business branding and tax details in the **Store Info** sheet of the SellerSheet Sales spreadsheet. This data fills your invoice headers. | Column | Type | Description | Sample | | ------------- | -------- | ---------------------------------------------------------- | --------------- | | StoreName | Required | Primary identifier. Must match a connected store. | myStore-AE | | Company | Required | Legal entity name for the invoice header. | The Company LLC | | TRN / TaxRate | Optional | If empty, a receipt is generated instead of a VAT invoice. | 123… / 5% | ### Invoice type logic [#invoice-type-logic] SellerSheet uses the presence of **TRN** and **TaxRate** to decide the invoice type: * **RECEIPT (REC):** created if TRN or TaxRate is missing. * **VAT INVOICE (INV):** created only if **both** TRN and TaxRate are provided. \[\[TODO: screenshot Store Info sheet configuration (retake — the old one showed real store data)]] ## Step 2: Generate bulk invoices [#step-2-generate-bulk-invoices] Once your store information is configured, generate invoices by providing order and customer details in the **Invoices** sheet. ### Invoice prerequisites [#invoice-prerequisites] * **Store match:** the store in the **Store** column must exist in the **Store Info** sheet. * **Order match:** the **Amazon Order ID** must already exist in your **Orders** sheet (synced from the Sales panel — see [How to Sync Amazon Orders](/guides/sync-amazon-orders-to-your-google-sheets)). * **Shipped orders:** the order must be shipped. ### Filling customer data [#filling-customer-data] Fill in these columns for each order you want to invoice: * **Customer Name:** the name that appears on the invoice. * **Customer TRN:** required for VAT invoices only. * **Customer Address:** ship-to or billing address. * **Invoice Time:** optional. If left blank, the current time is used. ### Triggering creation [#triggering-creation] 1. Go to the **Sales** panel in the SellerSheet sidebar. 2. In the **Invoices** dropdown, click **Create Invoices**. SellerSheet goes through the active sheet and generates a PDF invoice in Google Drive for every valid row. Create Invoices button on the Sales panel \[\[TODO: screenshot Invoices sheet populated with orders ready for bulk invoicing (retake — the old one showed real store data)]] ### Automation results [#automation-results] * **Auto-populated links:** once created, the **Invoice Link** and **Invoice Folder** columns fill in automatically. * **Folder logic:** invoices are stored in a nested structure, `SellerSheet/{Store}/{Marketplace}/{Year}/{Month}` (for example `SellerSheet/myStore/AE/2025/07`). ### Limits and scope [#limits-and-scope] * **Runtime limits:** Google Sheets sidebars have a standard execution limit. If you have hundreds of invoices and the process stops, click **Create Invoices** again to resume. * **Active sheet scope:** the action only processes the sheet you are currently viewing. * **Skipping logic:** if an **Invoice Link** already exists for a row, SellerSheet skips it to prevent duplicates. If invoicing times out because of Google's limits, your progress is saved. Click the button again — it picks up where it left off by skipping rows that already have links. ## Conclusion [#conclusion] With SellerSheet's bulk invoicing, you keep professional communication with your customers while your tax paperwork runs on its own. Every button of the panel is listed on [Sales](/help/sheets/sellers/sales). # How to Bulk Create & Revise Amazon Listings in Google Sheets (https://sellersheetai.com/guides/bulk-create-revise-amazon-listings-in-google-sheets) > Create, update and delete Amazon listings in bulk from Google Sheets — Seller Central's template columns, with Amazon's check before anything goes live. * The **Publish Queue** tab is Seller Central's category template inside Google Sheets: same columns, one row per SKU. * **Get Template** builds the columns for a product type. You fill the rows — or fetch them from a live listing — and choose each row's **Operation Type**: `UPDATE`, `PARTIAL_UPDATE`, `PATCH-DELETE` or `DELETE`. * **Validate (Preview)** has Amazon check the rows before anything goes live. **Create/Replace/Del.** publishes up to 20 rows at once; **Submit Feed** sends up to 25,000. Results land in the **Submission Log** tab. [Overview](/guides/manage-amazon-listings-in-google-sheets) · 1 [All your SKUs](/guides/see-all-amazon-skus-in-google-sheets) · 2 [Live listings](/guides/fetch-live-listings-in-google-sheets) · 3 [Competitor research](/guides/research-amazon-competitors-in-google-sheets) · 4 [Selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets) · 5 [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets) · **6 Bulk create & revise** This guide follows one example from start to finish. The store is **myStore-US** and the brand is **myBrand**. You create two new listings for earbuds, change a price, take a SKU out of its variation family and delete an old SKU, all from one sheet. ## If you know Seller Central's template, you know this sheet [#if-you-know-seller-centrals-template-you-know-this-sheet] Each step of the flat-file workflow has a counterpart on the Publish Queue tab: Two lanes. On the left, the Seller Central flat-file steps: download the category template, look up definitions and valid values, fill one row per SKU, upload, read the processing report. On the right, the Publish Queue step for each: Get Template, the row-4 guide and dropdowns, Fetch by SKU or by ASIN, Validate (Preview), then Create/Replace/Del. or Submit Feed | In Seller Central's template | On the Publish Queue tab | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | Download the template for a category | **Get Template** builds the columns for the product types in column D | | Required columns | Gold names on row 6 | | Definitions and valid values | The row-4 guide above each column; a dropdown where the values are fixed | | The update / delete column | **Operation Type**, column C: Update → `UPDATE`, PartialUpdate → `PARTIAL_UPDATE`, Delete → `DELETE`. `PATCH-DELETE` has no flat-file twin. | | Export your listings, edit, re-upload | **Fetch by SKU** fills a row from your live listing | | Upload, then read the processing report | **Validate (Preview)**, then **Create/Replace/Del.** or **Submit Feed**; read the result in **Submission Log** | ## Why switch [#why-switch] * **Validate instead of upload, wait, download.** In Seller Central you find out which attributes a new product type requires by uploading the flat file, waiting, and downloading the processing report — then doing it again. **Validate (Preview)** gives the same answer in the Submission Log within moments, row by row, and publishes nothing. For a new listing, fill what you know and validate: Amazon's list of missing attributes tells you what is left. * **Three flat-file accidents are blocked before anything is sent:** a blank operation (never treated as a full update), a partial update without the ASIN (which can create a new listing), and one SKU on two rows. See [If a row is blocked](#if-a-row-is-blocked). * **Your live listing, fetched into the row.** No export and re-import: **Fetch by SKU** fills a row with what is on Amazon now. ## Before you start [#before-you-start] * Connect your Amazon store at [sellersheetai.com](https://sellersheetai.com/home) under **Settings → Stores & Marketplaces**. * Install the SellerSheet sidebar. See [Install & first sync](/help/sheets/install). * Open the **SellerSheet Catalog** spreadsheet from the sidebar's **Catalogs** panel (under **Resources**) or from your SellerSheet folder in Drive. Go to the **Publish Queue** tab and expand the **Publish Queue** group in the sidebar. Its buttons work only while that tab is open. ## The tab, row by row [#the-tab-row-by-row] The Publish Queue tab with callouts: rows 2–3 hold the store and locale, row 4 the guide of each column, row 5 is hidden and holds Amazon's key, row 6 the column names in gold or white, and from row 7 one listing per row. Columns A–E are the control columns; attributes start at column F * **A3 Store** and **B3 Listing Locale** apply to every row. **C3 Template Locale** sets the language of the guides; leave it blank to use B3. * **D3 Last Result** shows a summary of the last Validate or publish, such as `✓ Validate OK · 2 rows`. * **Row 6 names:** gold = required, white = optional, slate = filled for you. * **Columns A–E** are the same on every template: Image (filled for you), **SKU**, **Operation Type**, **Product Type** and Attributes JSON. ## Lesson 1 — Create new listings (UPDATE) [#lesson-1--create-new-listings-update] You will list two new SKUs, **EB-PRO-BLK** and **EB-PRO-WHT**, under product type **HEADPHONES**. ### Set the store and locale [#set-the-store-and-locale] Type `myStore-US` in **A3** and pick **en_US** in **B3**. ### Get the template [#get-the-template] Type the SKUs in **B7:B8**, `UPDATE` in **C7:C8** and `HEADPHONES` in **D7:D8**. Then click **Publish Queue › Get Template**. The Publish Queue tab with HEADPHONES in D7 and D8 outlined, and the sidebar's Publish Queue group open with Get Template highlighted under step 1, Template The HEADPHONES columns now start at column F, with a guide on row 4 and their names on row 6. Required names are gold. * **Get the template first, then fill.** A re-run keeps each row's SKU, Operation Type and Product Type (columns B–D) but clears every other cell of the rows below. * **Several product types?** Put a different one on each row. Get Template merges their columns into one sheet. * **Not sure of the product type?** Let Amazon fill it in. See [the trick](#let-amazon-fill-in-the-product-type). ### Fill the rows [#fill-the-rows] Fill every gold column. On HEADPHONES these are Brand Name, Item Name, Item Highlight, Bullet Point, Product Description and Generic Keyword. Scroll right for Item Condition, Fulfillment Channel Code, Country of Origin and Dangerous Goods Regulations. Then add **one** product ID. Columns K to N of the Publish Queue: L7 and M7 hold the product ID type upc and the barcode, outlined. The guide of L4 is shown on the right: what the column means, an example, and the options ean, gtin, upc and asin. A note says to fill a product ID or the GTIN exemption, never both * **Row 4 is the manual.** Click a row-4 cell to read what the column means, its format, its limits and its valid values. Each guide title ends with Amazon's attribute key, so when Amazon names a key in an error, Ctrl+F (⌘+F on a Mac) finds the column. * **Dropdowns** hold Amazon's valid values. Pick one rather than typing your own word. * **Several values in one cell** (bullet points, for example): put each on its own line with Alt+Enter (⌥+Enter on a Mac). * **Product ID:** fill **External Product ID Type** and **External Product ID**, or set **Has GTIN exemption?** to Yes for a product without a barcode. Not both. * **A barcode that starts with 0 keeps it.** Get Template formats the product ID and Merchant Suggested ASIN columns as plain text. On a sheet set up earlier, a typed `012345678905` can still turn into the number 12345678905: select the column, choose **Format › Number › Plain text** and type it again. Type your new SKU in column B and a similar product's ASIN in **Merchant Suggested ASIN**, then click **Fetch by ASIN**. The row fills with the attributes Amazon shows for that ASIN. Then clear Merchant Suggested ASIN (left in place, it attaches your SKU to that ASIN) and put in your own product ID and copy. Fetch by ASIN rewrites every row that has an ASIN there and an empty Item Name, so keep other rows off the tab while you use it. ### Validate [#validate] Click **Validate (Preview)**. Amazon checks up to 20 rows, and nothing is published. **D3** gives the summary, for example `⚠ 1 error — see Submission Log`. The **Submission Log** tab lists each problem on its own line: > Row 7 · EB-PRO-BLK · 'Country of Origin' is required but missing. Fix the cell it names and validate again until **D3** reads `✓ Validate OK`. ### Publish [#publish] Click **Create/Replace/Del.** Amazon accepts the rows, and the Submission Log shows a result for each SKU, such as `✓ 2 of 2 accepted`. For more than 20 rows, use **Submit Feed** instead (see [Bulk](#bulk-more-than-20-rows)). **Validate**, **Create/Replace/Del.** and **Submit Feed** run every row that has a SKU. Delete a finished lesson's rows before you start the next one, or they are sent again. ## Lesson 2 — Change a price, title or images (PARTIAL_UPDATE) [#lesson-2--change-a-price-title-or-images-partial_update] `PARTIAL_UPDATE` sends only the cells you fill. Everything else on the listing stays as it is. With `UPDATE`, a blank cell would be removed from the listing. Here you change the price of **EB-LITE-BLU** to 29.99: 1. On a row, fill **SKU** = EB-LITE-BLU, **Operation Type** = `PARTIAL_UPDATE`, **Product Type** = HEADPHONES. 2. Fill the listing's ASIN in **Merchant Suggested ASIN**. A `PARTIAL_UPDATE` row without the ASIN (or the External Product ID) is blocked, because Amazon sometimes creates a new listing from a partial update. Don't know the ASIN? Click **Fetch by SKU**: the row fills from your live listing, with its ASIN or its barcode. The other cells then hold your live values, so sending them again changes nothing. 3. Fill only the cell to change: **Your Price (Sell on Amazon)** = 29.99. 4. **Validate (Preview)**, then **Create/Replace/Del.** These are the columns sellers change most often: | To change | Column | | -------------------------- | -------------------------------------------------------- | | Title | Item Name | | Bullets | Bullet Point (one per line) | | Description | Product Description | | Search terms | Generic Keyword | | Price | Your Price (Sell on Amazon), Sale Price (Sell on Amazon) | | Stock (merchant-fulfilled) | Quantity | | Images | Main Image URL, Other Image URL | ## Lesson 3 — Take a SKU out of its variation family (PATCH-DELETE) [#lesson-3--take-a-sku-out-of-its-variation-family-patch-delete] `PATCH-DELETE` deletes only the attributes you list. Here **EB-LITE-RED** leaves the **EB-LITE-PARENT** family, and the parent and the other colours stay as they are: 1. Type the SKU in column B and click **Fetch by SKU**. The row fills with its real values. 2. Set **Operation Type** to `PATCH-DELETE`. 3. Clear every attribute cell **except** Child Relationship Type, Parent SKU, Parentage Level, Variation Theme Name and the theme's own attribute (here **Color** = Red). 4. **Validate (Preview)**, then **Create/Replace/Del.** Amazon deletes the value that matches. Fetch first and leave the fetched values exactly as they are. Don't retype them. ## Lesson 4 — Delete a SKU (DELETE) [#lesson-4--delete-a-sku-delete] 1. Type **EB-OLD-GRY** in column B and click **Fetch by SKU**. The row now holds the whole listing. 2. Click **Backup**. It saves a copy of the tab in your Drive and records its link on the **Listing Log** tab of this spreadsheet. 3. Set **Operation Type** to `DELETE`. The other cells can stay — a `DELETE` row sends only the SKU. 4. Click **Create/Replace/Del.** A `DELETE` row needs only **SKU** and **Operation Type**: no product type and no template. To delete many SKUs, paste them into column B, click **Fetch by SKU** and **Backup**, fill `DELETE` down column C, then click **Create/Replace/Del.** (up to 20 rows) or **Submit Feed** (more). `DELETE` removes the SKU from your catalog. Validate skips `DELETE` rows because Amazon has no preview for them, and the deletion cannot be undone. ## All four in one batch [#all-four-in-one-batch] A sheet can hold rows of every Operation Type. One click of **Create/Replace/Del.** runs each row by its own type: Four cards, one per Operation Type, each with a one-row example. UPDATE: EB-PRO-BLK with every gold column and a product ID. PARTIAL_UPDATE: EB-LITE-BLU with its ASIN and a new price. PATCH-DELETE: EB-LITE-RED with only the variation cells and their real values. DELETE: EB-OLD-GRY with only the SKU ## Validate, publish, read the result [#validate-publish-read-the-result] Flow: Get Template, fill the rows, Validate (Preview) — DELETE rows are skipped, and issues are fixed and validated again. Then, for up to 20 rows Create/Replace/Del., for more Submit Feed followed by Refresh Status until DONE. Both end in the Submission Log | Button | Rows | What it does | | ----------------------- | -------------------------- | ------------------------------------------------------------------------------ | | **Validate (Preview)** | up to 20 | Amazon checks the rows and nothing goes live. `DELETE` rows are skipped. | | **Create/Replace/Del.** | up to 20 | Live. Each row runs by its Operation Type; the result for each SKU is instant. | | **Submit Feed** | up to 25,000 (under 10 MB) | Live. Every row goes in one feed, which Amazon processes in its queue. | Each run adds one row to the **Submission Log** tab: The Submission Log tab: a Validate run with "0 of 1 valid" and the issue "Row 7 · EB-PRO-BLK · 'Country of Origin' is required but missing", a Validate with 4 of 4 valid, a Publish with 4 of 4 accepted, and a Submit Feed with 248 of 250 accepted and two issues * **Action** names the button: **Publish** is **Create/Replace/Del.** * **Result** is the cell to read: `✓ 4 of 4 accepted`, `⚠ 248 of 250 accepted` or `⏳ Processing`. * **Issues** gives one line per problem, naming the sheet row or the SKU. * **Feed ID** and **Feed Status** are filled for Submit Feed only. **Remark ✎** is for your own notes, and **Raw Response** keeps Amazon's full answer. ### Bulk: more than 20 rows [#bulk-more-than-20-rows] 1. Put up to 20 sample rows on the tab, one or two of each product type, and **Validate** them until they pass. 2. Add the rest of the rows and click **Submit Feed**. 3. Open the **Submission Log** tab and click **Submission Log › Refresh Status** until **Feed Status** reads `DONE`. **Result** then shows how many rows Amazon accepted, and **Issues** shows the rest. * **Fill from JSON:** paste a listing's JSON (for example the JSON cell of a [Listing Snapshot](/guides/fetch-live-listings-in-google-sheets) row) into **Attributes JSON** and click **Fill from JSON**. An empty SKU or Product Type is filled from the JSON too. * **From Listing Drafts:** copy written with AI arrives with **Send to Publish Queue**. See [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets). * **Existing ASINs:** to sell a product that is already on Amazon, use product type `PRODUCT`. See [Bulk add existing ASINs](/guides/bulk-add-existing-asins-to-your-catalog). * The sidebar's full button list is on [Catalogs](/help/sheets/sellers/catalogs). ## Tricks that save you time [#tricks-that-save-you-time] ### Fetch a whole column of SKUs at once [#fetch-a-whole-column-of-skus-at-once] Type 50 SKUs in column B and click **Fetch by SKU** once; each row fills from its own listing. Only rows with an empty Item Name are fetched. A run stops after about five minutes, and the sidebar says how many rows are left — click again to continue. ### Let Amazon fill in the product type [#let-amazon-fill-in-the-product-type] You don't need to know a SKU's product type to get its template: Three steps on the Publish Queue tab. 1, Fetch by SKU: the SKUs in column B, with PARTIAL_UPDATE in column C, get their product type in column D, HEADPHONES and SPEAKERS. 2, Get Template builds the columns for both types; columns B to D stay and the other cells are cleared. 3, Fetch by SKU again fills the rows under the template's own columns 1. Type the SKUs in column B and `PARTIAL_UPDATE` in column C, then click **Fetch by SKU**. Column D fills with each SKU's product type. Values that have no column yet go into new columns at the far right. 2. Click **Get Template**. It builds the columns of every product type in column D, in Amazon's order, with the required names in gold, and replaces those extra columns. 3. Click **Fetch by SKU** again. Get Template cleared everything except columns B–D, so this second fetch puts the values back, under the template's own columns this time. 4. Change the cells you want, then click **Validate (Preview)**. You can also copy a SKU's **SKU** (column B) and **Product Type** (column J) from [Listing Snapshot](/guides/fetch-live-listings-in-google-sheets). For a product you don't sell yet, put its ASIN on a Listing Snapshot row and click **Fetch by ASIN**; column J shows its product type. ### Change a listing without a new template [#change-a-listing-without-a-new-template] A SKU of another product type can use the columns already on the tab, so you skip **Get Template**, which would clear your rows. Item Name, Bullet Point and Your Price are on almost every template. For a `PARTIAL_UPDATE`, **column D** must hold the SKU's own product type, because Amazon checks the row against it. Copy it from Listing Snapshot, or click **Fetch by SKU** on the row. ### Check whether Amazon took your change [#check-whether-amazon-took-your-change] `accepted` means Amazon accepted your submission. Shoppers see Amazon's product page, and Amazon may show another seller's value there, or its own, instead of yours. To see which value won, fetch the product twice on Listing Snapshot — once by SKU, once by ASIN — and compare. See [Live listings, Lesson 3](/guides/fetch-live-listings-in-google-sheets#lesson-3--check-whether-amazon-took-your-change). ### Read the guides in your own language [#read-the-guides-in-your-own-language] **B3 Listing Locale** is the language shoppers read. **C3 Template Locale** is the language you read the row-4 guides and the row-6 names in. A US listing can be written in **en_US** while you read the template in **zh_CN**; the row-6 names then show in Chinese, while this guide uses the English names. ### One Publish Queue per marketplace [#one-publish-queue-per-marketplace] The Publish Queue buttons work on any tab whose name starts with **Publish Queue**. Duplicate the tab and rename the copy **Publish Queue UK**. Set its **A3** to `myStore-UK` and **B3** to **en_GB**, then click **Get Template**. Each tab keeps its own store and template. Listing Drafts' **Send to Publish Queue** always fills the tab named exactly **Publish Queue**. ## If a row is blocked [#if-a-row-is-blocked] The sidebar checks every row before it sends anything. If one row fails a check, nothing is sent, and the message names the row: | The message says | Fix | | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | operationType is empty | Fill column C. A blank is never treated as `UPDATE`, because `UPDATE` replaces the whole listing. | | SKU "…" is on rows 7, 9 | Keep one row per SKU. | | … has no productType | Fill column D. Only a `DELETE` row can leave it blank. | | UPDATE needs a product identifier | Fill External Product ID (type and value) or Merchant Suggested ASIN, or set Has GTIN exemption? to Yes. | | … are mutually exclusive — fill exactly one | A row has both a product ID and the GTIN exemption. Clear one. | | PARTIAL_UPDATE requires … | Fill the ASIN in Merchant Suggested ASIN. **Fetch by SKU** fills the ASIN or the barcode. | | Product type "…" does not exist on this marketplace | Check column D. Product types are in capitals, such as `HEADPHONES`. | | Country Mismatch | Set **B3** to a language of the store's country, such as **en_GB** for `myStore-UK`. | | Too many SKUs … Maximum allowed is 20 | Use **Submit Feed** for more than 20 rows. | | This Publish Queue sheet is an old version | Update the tab as the message says. Your old tab is kept as a backup tab, so you can copy your rows over from it. | This message comes from Amazon, not from the sidebar: **"'X' is required but missing — but you filled X…"**. The value you typed isn't exactly one of the dropdown options, and capital letters count. Amazon ignores the value and reports it as missing. Pick it again from the dropdown. ## Frequently asked questions [#frequently-asked-questions] ### Is the Publish Queue the same as Seller Central's flat file? [#is-the-publish-queue-the-same-as-seller-centrals-flat-file] It holds the same columns. The tab's hidden row 5 carries Amazon's own flat-file key for every column, and row 6 the column names you know from the template. What differs is the workflow — the template builds in the sheet, Amazon checks rows before they go live, and the results land in the Submission Log tab instead of a report you download. ### Why was my PARTIAL_UPDATE row blocked? [#why-was-my-partial_update-row-blocked] A `PARTIAL_UPDATE` row needs the listing's identifier — its ASIN in Merchant Suggested ASIN, or the External Product ID. Amazon sometimes creates a new listing from a partial update; with the identifier filled it never will. Fetch by SKU fills it from your live listing. ### Can I validate more than 20 rows? [#can-i-validate-more-than-20-rows] No. Validate (Preview) and Create/Replace/Del. take up to 20 SKUs. For a bigger batch, validate up to 20 sample rows first, then put all the rows in and click Submit Feed — up to 25,000 rows, under 10 MB. ### Can I undo a DELETE? [#can-i-undo-a-delete] No. `DELETE` removes the SKU from your catalog, has no preview and cannot be undone. Fetch the SKU first, then click Backup — it saves a copy of the tab, with the whole listing, and records its link on the Listing Log tab — so you can list the SKU again from the copy. ### Why did Fetch by SKU skip my row? [#why-did-fetch-by-sku-skip-my-row] Fetch by SKU, Fetch by ASIN and Fill from JSON run only on rows whose Item Name is empty — a filled title means the row is done. Clear the Item Name to fetch the row again; the whole row is then rewritten from the live listing. ### Does Get Template erase what I typed? [#does-get-template-erase-what-i-typed] It keeps the SKU, Operation Type and Product Type of every row (columns B–D) and clears the other cells of the rows below the header, so run it before you fill the rows. If the rows came from Fetch by SKU or Fetch by ASIN, fetch again afterwards to put the values back. # How to Bulk Check ASIN Selling Eligibility in Google Sheets (https://sellersheetai.com/guides/check-asin-selling-eligibility-in-google-sheets) > Check whether you may sell hundreds of ASINs at once in Google Sheets — allowed, approval required or restricted, with Amazon's reason and the approval link — next to each product's Buy Box, rank and offer counts. * The **Restriction Check** tab answers "can I sell this?" for many ASINs at once, before you spend time on a listing. * Type the store and ASIN, pick a **Reason Locale**, then click **Fetch ASIN Info** (image, brand, rank, Buy Box, offers) and **Get Restrictions**. * **Status** reads `ALLOWED`, `APPROVAL_REQUIRED` (open the **Approval Link** to apply) or `RESTRICTED`, with Amazon's reason next to it. A check that failed reads `ERROR`, with the error. [Overview](/guides/manage-amazon-listings-in-google-sheets) · 1 [All your SKUs](/guides/see-all-amazon-skus-in-google-sheets) · 2 [Live listings](/guides/fetch-live-listings-in-google-sheets) · 3 [Competitor research](/guides/research-amazon-competitors-in-google-sheets) · **4 Selling eligibility** · 5 [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets) · 6 [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets) In Seller Central you search each ASIN under **Catalog › Add Products** to see whether you may sell it. Here each row also shows the Buy Box price and how many FBA and FBM sellers compete, so you can decide on a product at a glance. In this guide **myStore-US** checks a short list of earbuds it found in [competitor research](/guides/research-amazon-competitors-in-google-sheets) — and the same product on **myStore-UK** — in two clicks. ## Before you start [#before-you-start] * Connect your store at [sellersheetai.com](https://sellersheetai.com/home) and install the sidebar ([Install & first sync](/help/sheets/install)). * In the sidebar's **Catalogs** panel, click **Catalog** under **Resources** to open the **SellerSheet Catalog** spreadsheet. Go to the **Restriction Check** tab and expand the **Restriction Check** group in the sidebar. The Restriction Check tab next to the SellerSheet sidebar. Four rows from row 4: myStore-US with B0COMPET02, B0COMPET06 and B0COMPET07, and myStore-UK with B0COMPET02, each with a Reason Locale, a thumbnail and a Status — ALLOWED in green, APPROVAL_REQUIRED in amber, RESTRICTED in red, ALLOWED in green. In the sidebar the Restriction Check group is open with Get Restrictions highlighted ## Check a list of ASINs [#check-a-list-of-asins] ### Fill the rows [#fill-the-rows] From row 4, fill three columns per row: * **Store ✎:** the store and marketplace, such as `myStore-US`. Type it — there is no dropdown — with the country code in capitals. * **ASIN ✎:** the ASIN, in capitals and without spaces. * **Reason Locale ✎:** pick the language Amazon should write its reasons in, such as en_US. Without one, the row gets `ERROR`. Coming from [Catalog Research](/guides/research-amazon-competitors-in-google-sheets)? Select the rows there and click **Send to Restriction Check**: their store and ASIN are added here, with the Reason Locale set to the marketplace's language (en_US for myStore-US). Change it if you want Amazon's reasons in another language. ### Click Fetch ASIN Info [#click-fetch-asin-info] Click **Fetch ASIN Info**. Each row fills with the product's **Image** and **Brand**, its **Rank** (it can be blank), the **Buy Box** price and the number of **FBA Offers** and **MFC Offers** (merchant-fulfilled, FBM), all for a new item. The sidebar says how many rows it filled. A row left without an image got nothing back from Amazon: check the ASIN and the store's marketplace. ### Click Get Restrictions [#click-get-restrictions] Click **Get Restrictions**. Each row gets a **Status**, the **Reasons**, an **Approval Link** where Amazon offers one, and the time in **Checked At**. A long list stops after about five minutes, and the sidebar says so; click **Get Restrictions** again to check the rest. Close-up of Status, Reasons and Approval Link. B0COMPET02 is ALLOWED. B0COMPET06 is APPROVAL_REQUIRED with the reason "You need approval to list in this brand." and a Seller Central approval link. B0COMPET07 is RESTRICTED, in red, with the reason "You cannot list the product in this condition." B0COMPET9, an ASIN one character short, is ERROR, in red, with "Error: InvalidInput: Invalid 'asin' provided." ## What the Status means [#what-the-status-means] | Status | What to do | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ALLOWED` | You can list it as new. Go on to [Listing Drafts](/guides/write-amazon-listings-with-ai-in-google-sheets) or the [Publish Queue](/guides/bulk-create-revise-amazon-listings-in-google-sheets). | | `APPROVAL_REQUIRED` | Open the **Approval Link** and apply in Seller Central. Check again once you're approved. | | `RESTRICTED` | You can't list it. **Reasons** says why. Pick another product. | | `ERROR` | The check failed. **Reasons** gives the error — often a mistyped ASIN or a missing Reason Locale. Fix it, clear Status and check again. | ## Tricks [#tricks] * **Check again:** clear the **Status** cell and click **Get Restrictions**. Rows with a Status are skipped, so a second click only checks new rows — and continues where a long run stopped. * **Fresh prices:** **Fetch ASIN Info** refreshes the Buy Box, rank and offers on every click. The image and brand are fetched only while **Image** is empty; clear it to fetch them again. * **Several marketplaces:** each row has its own store, so put the same ASIN on a `myStore-US` row and a `myStore-UK` row to see where you may sell it. * **Track your approvals:** sort by **Status** to group the `APPROVAL_REQUIRED` rows, apply through their links, then clear their Status and check them again later. ## Frequently asked questions [#frequently-asked-questions] ### What do the Status values mean? [#what-do-the-status-values-mean] `ALLOWED` means you can list the ASIN as new. `APPROVAL_REQUIRED` means Amazon needs to approve you first — open the Approval Link to apply. `RESTRICTED` means you cannot list it, and Reasons says why. `ERROR` means the check failed for that row, and Reasons gives the error. ### How do I check a row again? [#how-do-i-check-a-row-again] Clear its Status cell and click Get Restrictions. Rows that already have a Status are skipped, so a second click only checks the new rows. ### Why does a row say ERROR with "missing reasonLocale"? [#why-does-a-row-say-error-with-missing-reasonlocale] The row has no Reason Locale. Pick one from the dropdown, clear the ERROR in Status, and click Get Restrictions again. ### Which condition does the check use? [#which-condition-does-the-check-use] New. Both the restriction check and the Buy Box and offer counts are for a new item. ### Does it use credits? [#does-it-use-credits] No. These buttons don't use Credits. On the Free plan, each check counts toward your monthly sidebar operations. # How to Connect noon to SellerSheet (https://sellersheetai.com/guides/connect-noon-to-sellersheet) > Create a noon service-account key in the noon Access App and connect your noon store to SellerSheet, so you can run noon reports, stock, pricing and FBN inbound from Google Sheets or your AI agent. * In the noon Access App, create a service account (**Platform** namespace → **Project Admin** role) and download its `.json` key. * In the SellerSheet app, open **Settings → Stores & Marketplaces**, click **Add noon account**, name the account, pick your marketplaces, paste the values from the `.json` key, and click **Connect account**. * Then run noon reports from the SellerSheet sidebar in Google Sheets. ## Introduction [#introduction] SellerSheet connects to your **noon Partner** account so you can run your noon operations straight from Google Sheets — the same way you run Amazon today, on both the **sidebar** (you) and **MCP** (your AI agent) paths, with your sheet as the surface. Once connected you can work with: * **Reports** — orders, finance, FBN inventory aging, and product-views & sales (on demand or scheduled). * **Stock & Pricing** — read and push stock levels and price changes. * **Offers, Catalog & Warehouses** — offer data, SKU↔barcode mapping, warehouse list. * **FBN inbound & Cross-border pricing** — manage inbound shipments end to end and set transfer prices. noon authenticates with a **service-account key** (a small `.json` file you download once from noon), not a username and password. This guide has two parts: first you create and download your key from the **noon Access App**, then you add your noon account in the **SellerSheet app**. ## Prerequisites [#prerequisites] * **noon Partner account** with access to the noon Seller portal / Access App. * **SellerSheet account** ([sign in](https://sellersheetai.com/home)) with the add-on installed in Google Sheets — see [Install & first sync](/help/sheets/install). ## Part 1 — Get your noon service-account key [#part-1--get-your-noon-service-account-key] You create the key once in noon's **Access App**. noon downloads a `.json` file to your computer at the end — the values in that file are what you give SellerSheet. ### 1. Open the Access App [#1-open-the-access-app] Go to the [noon Access App](https://access.noon.partners/en/), or open **User & Access → User access** in the noon Seller portal. \[\[TODO: screenshot noon Seller portal — User & Access section / Access App (retake — the old one showed real store data)]] ### 2. Go to API Users [#2-go-to-api-users] In the left sidebar, click **API Users** to see your service accounts. \[\[TODO: screenshot API Users option in the Access App left sidebar (retake — the old one showed real store data)]] ### 3. Add a service account [#3-add-a-service-account] Click **Add Service Account** to create a new API identity for SellerSheet. \[\[TODO: screenshot Add Service Account button (retake — the old one showed real store data)]] ### 4. Fill in the details [#4-fill-in-the-details] Enter a **Display Name** and **Username** (for example "SellerSheet"). You can optionally set an IP whitelist and a key-expiry date; leave them blank for a key that works from any IP and never expires. \[\[TODO: screenshot Service account form: Display Name, Username, IP whitelist, key expiry (retake — the old one showed real store data)]] ### 5. Choose the role — Platform → Project Admin — then click Add [#5-choose-the-role--platform--project-admin--then-click-add] In the role picker, pick the **Platform** namespace on the left, then select **Project Admin** on the right and click **Select Role**. Project Admin gives SellerSheet the access it needs to read your reports, orders, and catalog (and manage your stores) without handing over full owner control — choose **Project Owner** instead only if you want the key to have everything. Add more roles if you like, then click **Add**. A `.json` key file downloads automatically — it contains your "key_id", "private_key", "project_code", and "channel_identifier". Role selection for the service account: Platform → Project Admin The "private_key" inside the `.json` is your secret — treat it like a password. noon allows up to **5 keys per service account**; you can deactivate a key in the Access App at any time if you suspect misuse. The session a key creates lasts 30 days, and SellerSheet refreshes it for you automatically. ## Part 2 — Add your noon account on SellerSheet [#part-2--add-your-noon-account-on-sellersheet] ### 1. Open Stores & Marketplaces and click Add noon account [#1-open-stores--marketplaces-and-click-add-noon-account] Sign in to the [SellerSheet app](https://sellersheetai.com/home), open **Settings → Stores & Marketplaces**, and in the **noon accounts** section click **Add noon account**. \[\[TODO: screenshot Settings → Stores & Marketplaces, noon accounts section with Add noon account]] ### 2. Name the account and pick marketplaces [#2-name-the-account-and-pick-marketplaces] In the dialog: * Enter an **account name** — this is how you'll refer to the store everywhere in SellerSheet, so keep it short and memorable (e.g. `myStore`). Use 1–10 letters, digits or `_` — no spaces or hyphens: the hyphen is reserved to attach the marketplace. You then reference a specific marketplace as `-` (e.g. `myStore-AE`, `myStore-SA`), the same identifier in both places: * **In your sheet** — the value you put in the noon Reports **Store** column (the same convention as your Amazon stores). * **With AI / MCP** — the `store` argument every noon tool takes (e.g. "run the noon orders report for `myStore-AE`"). * Pick the **marketplaces** your account covers (e.g. UAE, Saudi). Every noon marketplace counts against your plan's marketplaces, the same as Amazon ones. ### 3. Paste the key and click Connect account [#3-paste-the-key-and-click-connect-account] Choose **Use an API key** and copy the values from the `.json` file you downloaded in Part 1 into the fields: **Key ID** ("key_id"), **Private key** ("private_key" — the whole key, BEGIN and END lines included), **Project code** ("project_code") and, if your file has one, **Channel identifier** ("channel_identifier"). Click **Connect account**. If the dialog offers **Connect with noon**, you can instead sign in on noon and let it grant access — no key to copy. SellerSheet validates the key against noon and stores it **encrypted** (it is never shown again). Your account appears in the noon accounts table as **Connected**, with its project code and **Recheck**, **Marketplaces**, **Reconnect** and **Disconnect** actions. \[\[TODO: screenshot the noon account connected in Settings → Stores & Marketplaces]] A noon project can be connected to **one SellerSheet account**. If a project is already linked, disconnect it there first before reconnecting. ## What you can do with noon in SellerSheet [#what-you-can-do-with-noon-in-sellersheet] Once connected, open the **SellerSheet sidebar** in Google Sheets and switch to the **noon** tab. Every operation works on both paths — the **sidebar** for hands-on work and the **MCP tools** so your AI agent can run them for you: * **Reports** — orders, finance, FBN inventory aging, and product-views & sales reports, downloaded to Drive and into your sheet (and available on a schedule). See [noon Reports](/help/sheets/noon/reports). * **Stock** — read current stock and push stock updates. * **Pricing** — read prices and upsert price changes. * **Offers** — pull your offer data. * **Catalog** — map your SKUs to noon barcodes. See [noon Listings](/help/sheets/noon/listings). * **FBN inbound** — create and manage inbound shipments end to end: eligible items, shipment create/update, items, delivery slots, scheduling, and status. See [noon FBN](/help/sheets/noon/fbn). * **Cross-border pricing** — read and upsert transfer prices and cross-border product setup. * **Warehouses** — list your noon warehouses. A good first run: create the **noon Reports** tab, choose a report and date range, click **Create Reports**, then **Get Reports** — SellerSheet downloads it, exactly like Amazon Store Reports. ## FAQ [#faq] ### What do I need to connect noon to SellerSheet? [#what-do-i-need-to-connect-noon-to-sellersheet] A noon Partner account with access to the noon Access App, where you create a service account and download its `.json` key. No password sharing is involved. ### Where do I get my noon service-account key? [#where-do-i-get-my-noon-service-account-key] In the noon Access App, open **API Users**, click **Add Service Account**, choose the **Platform** namespace with the **Project Admin** role, and click **Add**. A `.json` key file downloads automatically. ### Is my noon private key safe with SellerSheet? [#is-my-noon-private-key-safe-with-sellersheet] Yes. SellerSheet validates the key and stores the private key **encrypted**. Never share the `.json` file itself — it is your secret key. ### Which noon role does the service account need? [#which-noon-role-does-the-service-account-need] The **Platform** namespace with the **Project Admin** role. Without it, noon reports return a missing-role error. ### Can I run noon reports in Google Sheets after connecting? [#can-i-run-noon-reports-in-google-sheets-after-connecting] Yes. Open the SellerSheet sidebar in Google Sheets, go to the **noon** tab, create the **noon Reports** tab, and run your reports. # How to Connect SellerSheet MCP (https://sellersheetai.com/guides/connect-sellersheet-mcp) > Connect the SellerSheet MCP server to Claude Code, Claude Desktop, Cursor, Windsurf, Coze and Codex, and manage your Amazon business directly from your own AI agent. SellerSheet provides an MCP server that gives the AI client you already use — Claude, ChatGPT/Codex, Cursor and others — more than tools for your Amazon and noon stores. This guide connects it to Claude Code, Claude Desktop, Cursor, Windsurf, Coze and Codex. ## How authentication works [#how-authentication-works] The SellerSheet MCP server is a standard OAuth 2.0 remote MCP endpoint at `https://sellersheetai.com/mcp`. You do **not** need to copy an API key or configure any tokens manually for most clients. Here is what happens the first time you connect: 1. **Your client sends a request to `/mcp`.** The server responds with `401 Unauthorized` and a pointer to the OAuth discovery endpoint. 2. **The client discovers the authorization server.** It fetches `/.well-known/oauth-authorization-server` to learn the login and token endpoints. 3. **A browser tab opens automatically.** Your client opens the SellerSheet sign-in page in your default browser. You sign in to SellerSheet — with Google, or with a code sent by email — not to Amazon. 4. **You see an "Authorize Connection" page.** After signing in, SellerSheet shows a confirmation page with your account and the client name. Click **Authorize**. 5. **The client receives and stores the Bearer token.** The client exchanges the authorization code for a Bearer token and saves it locally. All future requests use this token silently — you do not sign in again unless the connection is revoked. For Claude Code, Claude Desktop, Cursor and Windsurf, just paste the URL and click **Authorize** in the browser. The token is handled automatically. SellerSheet already holds your Amazon SP-API authorization from when you connected your store. The MCP sign-in only identifies *you* as a SellerSheet user. You need an active SellerSheet account with at least one Amazon store connected. Sign in at [sellersheetai.com](https://sellersheetai.com/home) and connect a store under **Settings → Stores & Marketplaces** first if you haven't already. ## Claude Code [#claude-code] Run this one command in your terminal, then start Claude Code and run `/mcp` to sign in — your browser opens the SellerSheet sign-in and Claude Code stores the token. ```bash claude mcp add --transport http sellersheet https://sellersheetai.com/mcp ``` Alternatively, add it to your project's `.mcp.json`: ```json { "mcpServers": { "sellersheet": { "type": "http", "url": "https://sellersheetai.com/mcp" } } } ``` ## Claude Desktop [#claude-desktop] 1. Open **Settings → Connectors → Add custom connector**. 2. Name it `SellerSheet` and paste `https://sellersheetai.com/mcp` as the server URL. 3. Click **Connect** — your browser opens the SellerSheet sign-in; approve, and you're back in Claude. The same steps work on claude.ai in the browser (custom connectors need a paid Claude plan). ## Cursor [#cursor] Go to **Cursor Settings → MCP → Add new global MCP server** and paste the config below, or add it directly to `~/.cursor/mcp.json`: ```json { "mcpServers": { "sellersheet": { "url": "https://sellersheetai.com/mcp" } } } ``` There is no API key or token field in the config — Cursor handles OAuth automatically. When you first use a SellerSheet tool in a Cursor chat, Cursor detects the `401` from the server, reads the OAuth metadata, and opens your browser for the authorization flow described above. After you click **Authorize**, Cursor stores the Bearer token and reuses it for all future sessions. If Cursor does not open the browser automatically, check **Settings → MCP** and click the refresh icon next to the sellersheet entry to trigger the authorization flow. ## Windsurf [#windsurf] Edit `~/.codeium/windsurf/mcp_config.json` (or open **Windsurf Settings → MCP Servers → Add Server**): ```json { "mcpServers": { "sellersheet": { "serverUrl": "https://sellersheetai.com/mcp" } } } ``` Same OAuth flow as Cursor — no token to copy. A browser tab opens the first time Windsurf calls a SellerSheet tool. ## Coze [#coze] Coze does not run a browser OAuth flow — it calls MCP endpoints directly from its servers. You need to provide your SellerSheet API key as a Bearer token in the request header. Create an API key in the SellerSheet app under **Settings → API & MCP**. Then in Coze: 1. Open your Coze Bot → **Skills → MCP Tool → Add MCP Tool**. 2. Select **Connect via URL**. 3. Enter `https://sellersheetai.com/mcp`. 4. Add a custom header: `Authorization: Bearer `. 5. Save and publish. ```json { "name": "SellerSheet MCP", "url": "https://sellersheetai.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY_HERE" } } ``` ## Codex (OpenAI) [#codex-openai] The OpenAI Codex CLI supports remote MCP servers through its configuration file. Add the following to `~/.codex/config.toml`: ```toml [mcp_servers.sellersheet] url = "https://sellersheetai.com/mcp" ``` Codex follows the same OAuth 2.0 flow — a browser tab opens on the first SellerSheet tool call and you sign in to SellerSheet and authorize. No API key is required. You can also add it from the terminal without editing the file: `codex mcp add sellersheet --url https://sellersheetai.com/mcp`. ## Your first tool call [#your-first-tool-call] Once connected, start every session with `get_user_context`. It returns your stores (with the ready-made store refs such as `myStore-US` that every store tool takes), your plan and your workspace config — the context every other tool depends on. ```text Call get_user_context to load my SellerSheet workspace, then show me all active FBA shipments. ``` ## Troubleshooting [#troubleshooting] ### "No Amazon stores connected" [#no-amazon-stores-connected] You need to connect an Amazon Seller Central account first. Sign in at [sellersheetai.com](https://sellersheetai.com/home) and go to **Settings → Stores & Marketplaces**. The MCP server uses the authorization you grant there — no separate Amazon login is needed in your AI tool. ### "Workspace not initialized" [#workspace-not-initialized] Open Google Sheets → **Extensions → SellerSheet → Open Sidebar** and complete the workspace setup. This creates the Drive folder structure the MCP server writes reports into. See [Install & first sync](/help/sheets/install). ### 401 Unauthorized after authorizing [#401-unauthorized-after-authorizing] This usually means the key or connection was revoked under **Settings → API & MCP** after the client was authorized. Remove the MCP server from your client, re-add the URL, and go through the authorization again. ### Browser tab doesn't open in Cursor / Windsurf [#browser-tab-doesnt-open-in-cursor--windsurf] Make sure your client version supports MCP OAuth 2.0. In Cursor, go to **Settings → MCP** and click the refresh/reconnect icon next to the sellersheet entry to trigger the flow manually. In Windsurf, restart the IDE after saving the config — it starts the authorization on the first tool call. For every tool and the Tool API, see [MCP & API](/docs/mcp-api). # How to Create Amazon A+ Content in Google Sheets (https://sellersheetai.com/guides/create-amazon-a-plus-content-in-google-sheets) > Build, submit and manage Amazon A+ Content from Google Sheets — define modules in a sheet, load images from Drive, publish, and assign ASINs in bulk. Amazon A+ Content (formerly Enhanced Brand Content / EBC) lets brand-registered sellers add rich media — images, comparison charts and formatted text — to their product detail pages. Well-designed A+ Content can increase conversion rates by 3–10%. The problem? Seller Central's A+ editor is slow and tedious, especially when you create or update content across dozens of ASINs. There's no way to bulk-create modules or reuse templates efficiently. SellerSheet handles the whole A+ Content workflow from Google Sheets. Define your content modules in a spreadsheet, load images from Google Drive, submit to Amazon and manage ASIN assignments — all from the sidebar. This guide covers the three sheets of the SellerSheet A+ spreadsheet — **Create A+**, **List A+** and **Manage A+ ASINs** — in four steps: 1. **Create A+** — define modules and content. 2. **Submit** — load images and publish. 3. **Manage ASINs** — assign and revise ASINs. 4. **List A+** — review and track status. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. If not, follow [Install & first sync](/help/sheets/install). * **Brand Registry:** your Amazon Seller Central account must be enrolled in [Amazon Brand Registry](https://brandservices.amazon.com/) to access A+ Content. * **Product images:** prepare your A+ images in a Google Drive folder. Images must meet Amazon's requirements (minimum 970 px wide for most modules). ## The Create A+ sheet [#the-create-a-sheet] In Seller Central, building A+ Content means dragging and dropping modules one at a time, uploading images individually and typing text into tiny input boxes. There's no way to create templates, duplicate content across ASINs or bulk-edit modules. The **Create A+** sheet is where you define your A+ Content. It has two parts: a **config row** (row 4, labelled in row 3) for the document settings, and a **modules area** (row 6 down) where you define each content module. \[\[TODO: screenshot Create A+ sheet showing content module configuration with the sidebar (retake — the old one showed real store data)]] ### Config settings (row 4) [#config-settings-row-4] The config row holds the settings of the whole A+ document: * **Store:** your store ref (e.g. `myStore-AE`). * **Locale:** the language/marketplace locale (e.g. **en_AE**). * **A+ Name:** a descriptive name for this A+ content (e.g. "My Brand Story"). * **Content Type:** `EBC` for standard A+ Content. * **Image Folder:** the subfolder of your SellerSheet images folder in Google Drive where this content's images are stored (e.g. `SKU-001`). Optional. * **Content Document:** the document as JSON — filled when you load an existing document. * **ASINs:** the ASINs to apply this A+ content to. * **Content Reference Key:** Amazon's unique identifier for this A+ content — auto-filled after submission, or typed in to load an existing document. * **ASIN Submit Result / Aplus Submit Result:** the status of the ASIN association and of the A+ content submission, auto-filled. ### Content modules (row 6 down) [#content-modules-row-6-down] Each row from row 6 down defines one A+ content module. Pick the module type in the first column, then click **Load Hints**: the **Example** column shows Amazon's sample of that module, and the row's cells are coloured green (required), yellow (optional) or gray (unused). The columns map directly to Amazon's A+ Content API: * **Content Module Type:** the Amazon module type (e.g. `STANDARD_COMPANY_LOGO`, `STANDARD_IMAGE_TEXT_OVERLAY`, `STANDARD_FOUR_IMAGE_TEXT`). * **Headline / Sub Headline / Body Text / Bullet Points:** the module's text. * **Image 1–4** with their **Alt**, **Caption**, **Headline** and **Body** columns: the module's images — the image file name, loaded from Google Drive with **Load Images (Drive)** — and their text. Alt text is required for accessibility. * **Overlay Color / Image Position:** layout options for the modules that take them. Each module type has its own image dimension requirements. Check [Amazon's A+ Content guidelines](https://advertising.amazon.com/library/guides/a-plus-content) for the supported module types and their image specifications. ## Submitting A+ Content [#submitting-a-content] Once your modules are defined, use the sidebar buttons in the **Create A+** dropdown to load images and submit. ### 1. Load Images (Drive) [#1-load-images-drive] Click **Load Images (Drive)** in the sidebar. SellerSheet reads the **Image Folder** value from the config row, finds that folder in your Google Drive and fills in the image URLs of every image named in the module rows. Create a folder in Google Drive for each A+ content set, named after the SKU or product line, and put all module images inside. The image cells only need the file name (e.g. `hero-banner.jpg`) — SellerSheet finds it in the specified folder. ### 2. Create & Submit [#2-create--submit] Click **Create & Submit** in the sidebar. SellerSheet: 1. Reads all content modules from the sheet (or the Content Document JSON, if present). 2. Creates a new A+ Content document through the Amazon SP-API — Amazon-hosted images are reused directly, Drive and other image URLs are uploaded. 3. Applies the ASINs from the config row and submits the content for approval. 4. Fills in the **Content Reference Key**, **ASIN Submit Result** and **Aplus Submit Result**. To change a document you already published, put its key in **Content Reference Key** and click **Load A+**: its modules land in the rows, its JSON in **Content Document** and its ASINs in **ASINs**. Edit it, then click **Update A+** to replace the existing document and resubmit it for approval — or change the name or store and click **Create & Submit** to publish a copy. ## The List A+ sheet [#the-list-a-sheet] The **List A+** sheet gives you an overview of all your existing A+ Content for a store. Set the store in the config row, then click **List A+** in the sidebar; details fill 25 rows per click. \[\[TODO: screenshot List A+ sheet showing A+ content with status and content reference keys (retake — the old one showed real store data)]] ### List A+ columns [#list-a-columns] * **A+ Name:** the name you gave when creating the content. * **Status:** current approval status (e.g. `APPROVED`, `DRAFT`, `REJECTED`). * **Update Time:** last modification timestamp. * **Badge Set:** any badges associated with the content. * **Marketplace ID:** the Amazon marketplace identifier. * **Content Reference Key:** Amazon's unique identifier — use it to manage the ASINs of this content. * **Content Document:** the full content document data. * **ASINs:** ASINs currently associated with this A+ content. Click a result row and then **Load A+** in the List A+ dropdown: that document loads into the Create A+ sheet as an editable copy. Or copy its **Content Reference Key** into the **Manage A+ ASINs** sheet to change its ASINs. ## Managing A+ ASINs [#managing-a-asins] In Seller Central, associating A+ Content with ASINs means opening each content, searching for ASINs one by one and applying them individually. Applying the same A+ content to 50+ ASINs takes forever. The **Manage A+ ASINs** sheet lets you change the ASIN associations of your A+ content in bulk. Fill in the store, content reference key and ASINs, then submit with one click. \[\[TODO: screenshot Manage A+ ASINs sheet showing ASIN assignments for A+ content (retake — the old one showed real store data)]] ### Manage A+ ASINs columns [#manage-a-asins-columns] * **Store:** your store ref (e.g. `myStore-AE`). * **Content Reference Key:** the A+ content identifier, from List A+ or the Create A+ results. * **ASINs:** one or more ASINs, each on a new line within the cell (e.g. `B0XXXXXXXX`). * **Submit Result:** filled in with the submission status after you click **Revise A+ ASINs**. ### Revise A+ ASINs [#revise-a-asins] Click **Revise A+ ASINs** in the **Manage A+ ASINs** dropdown. It **replaces** the ASIN set of each existing A+ document with the ASINs in its row and resubmits it for approval — so list every ASIN the content should keep, not only the new ones. To assign several ASINs, enter each ASIN on a separate line within the same cell (use `Alt+Enter` or `Ctrl+Enter` in Google Sheets to add a new line within a cell). ## Complete workflow [#complete-workflow] The end-to-end process for creating and publishing A+ Content: 1. **Prepare images** — create a folder in Google Drive with your A+ module images. 2. **Fill the Create A+ sheet** — set your store, locale, A+ name, content type, image folder and ASINs in the config row. Add content modules row by row and click **Load Hints**. 3. **Load Images (Drive)** — fill the image URLs from Drive. 4. **Create & Submit** — submit the A+ content to Amazon for approval. 5. **Check status** — use **List A+** to verify your content status (`APPROVED`, `DRAFT` or `REJECTED`). 6. **Change ASINs** — fill the **Manage A+ ASINs** sheet with the content reference key and the ASINs, then click **Revise A+ ASINs**. ## Quick reference [#quick-reference] | What you need | Action | Sheet | | ------------------------------- | ------------------------------------------------- | --------------- | | Define A+ content modules | Fill the config row + module rows, **Load Hints** | Create A+ | | Upload images from Drive | **Load Images (Drive)** | Create A+ | | Submit A+ content to Amazon | **Create & Submit** | Create A+ | | Edit a published document | **Load A+**, then **Update A+** | Create A+ | | View all existing A+ content | **List A+** | List A+ | | Replace the ASINs of A+ content | **Revise A+ ASINs** | Manage A+ ASINs | ## Maximizing efficiency [#maximizing-efficiency] * **Reuse templates:** duplicate a Create A+ sheet tab, or load an existing document with **Load A+**, to create variations for different product lines. Change the A+ name, images and text while keeping the same module structure. * **Bulk ASIN assignment:** apply one A+ content to dozens of ASINs at once — list all ASINs in the cell with line breaks. * **Google Drive integration:** organize your A+ images by product or SKU in Google Drive folders. **Load Images (Drive)** pulls directly from these folders. * **Track with List A+:** regularly use List A+ to check content approval status across all your stores. Rejected content can be revised and resubmitted. * **Combine with listings:** after publishing A+ Content, manage your product listings (titles, prices, descriptions) with [How to Bulk Create & Revise Amazon Listings](/guides/bulk-create-revise-amazon-listings-in-google-sheets). Every button of the panel is listed on [A+](/help/sheets/sellers/a-plus). # How to Create Amazon Image URLs for Flat Files (https://sellersheetai.com/guides/create-amazon-image-urls-for-flat-files) > Create and manage the image URLs your Amazon flat files and bulk listing uploads need, with SellerSheet's Dropbox integration. Streamline your image management with Dropbox integration. ## Introduction [#introduction] Managing product images for Amazon listings can be challenging, especially when dealing with bulk uploads. This guide shows you how to efficiently create and manage image URLs for your Amazon flat files using Dropbox integration. ## Prerequisites [#prerequisites] * Amazon Seller Central account * Dropbox account * Product images * Basic understanding of image optimization ## Step-by-step process [#step-by-step-process] 1. Set up your Dropbox account 2. Organize your product images 3. Generate image URLs 4. Format URLs for flat files 5. Test and validate URLs ## Best practices [#best-practices] * Optimize images for web * Use consistent naming conventions * Maintain image backups * Verify URL accessibility ## Conclusion [#conclusion] By following this guide, you can efficiently manage your product images and create valid URLs for your Amazon flat files, ensuring smooth bulk uploads and updates. The sidebar's Dropbox buttons are listed on [Dropbox](/help/sheets/sellers/dropbox); to use the URLs in a listing, see [How to Bulk Create & Revise Amazon Listings](/guides/bulk-create-revise-amazon-listings-in-google-sheets). # How to Create FBA Shipments (Send to Amazon) in Google Sheets (https://sellersheetai.com/guides/create-sta-shipments-in-google-sheets) > Run Amazon's whole Send-to-Amazon (STA) workflow from Google Sheets with the SellerSheet sidebar — set up your warehouse and products once, then create, confirm, label and track every FBA shipment in a few clicks. ## Introduction [#introduction] Creating FBA shipments in Seller Central means navigating multiple pages for every single shipment — entering your warehouse address, adding products one by one, filling box dimensions, choosing carriers, and downloading labels. It's repetitive, error-prone, and slow. SellerSheet handles the entire **Send-to-Amazon (STA)** workflow from Google Sheets. Set up your warehouse address once, fill in your products and box configurations, then click through the sidebar buttons to initiate, confirm, and track your shipment — including FBA carton labels and FNSKU barcode labels. This guide covers the **Box First, Split Later** workflow using 4 sheets: **Shipment Setting**, **Product Info**, **Manage Shipments**, and the **STA** working sheet. In four stages: 1. **Set up sheets** — address, products, tracking. 2. **Fill the STA sheet** — boxes, MSKUs, quantities. 3. **Create & confirm** — initiate, options, confirm. 4. **Get labels** — FBA + FNSKU labels. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected to your SellerSheet account — sign in at [sellersheetai.com](https://sellersheetai.com/home) and connect it under **Settings → Stores & Marketplaces**. * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. See [Install & first sync](/help/sheets/install). * **FBA access:** your Amazon Seller Central account must have FBA (Fulfillment by Amazon) enabled. ## Setting up your sheets [#setting-up-your-sheets] In Seller Central, you re-enter your warehouse address, product details, and box dimensions every time you create a shipment. There's no way to save templates or reuse configurations across plans. SellerSheet uses an **FBA spreadsheet** with dedicated tabs so you configure your data once and reuse it for every shipment. The FBA spreadsheet contains 4 key tabs. ### 1. Shipment Setting [#1-shipment-setting] Fill in your warehouse or ship-from address. Each row represents a different warehouse/location identified by a unique **Warehouse Code**. You only need to fill this once per warehouse. \[\[TODO: screenshot Shipment Setting sheet showing warehouse address configuration (retake — the old one showed real store data)]] | Column | What it holds | | ----------------------------------------------------- | ----------------------------------------------------- | | warehouseCode | Unique ID for this warehouse (e.g. `myStore-US-WH1`). | | companyName | Company name on the shipping label. | | name / phoneNumber / email | Contact information for the ship-from address. | | addressLine1 / addressLine2 | Street address. | | city / stateOrProvinceCode / countryCode / postalCode | Location details. | | unitOfDimention | Measurement unit for box dimensions (`CM` or `IN`). | | unitOfWeight | Weight unit (`KG` or `LB`). | ### 2. Product Info [#2-product-info] Fill in your product catalog with SKU, FNSKU, ASIN, box dimensions, and prep details. When you create an STA sheet, product data is pulled in automatically via VLOOKUP — so you only fill this once per product. \[\[TODO: screenshot Product Info sheet showing SKU, FNSKU, ASIN, and box details (retake — the old one showed real store data)]] | Column | What it holds | | ------------------------ | ---------------------------------------------------------------------------------------------- | | store | Store ref (e.g. `myStore-US`). | | msku | Your Merchant SKU. | | fnsku | Amazon's Fulfillment Network SKU. | | asin | Amazon Standard Identification Number. | | qtyPerBox | Number of units per box. | | boxDimensions | Length x Width x Height (e.g. `50x42.5x35`) in the units from Shipment Setting. | | boxWeight | Weight per box in the units from Shipment Setting. | | labelOwner | Who labels items (`SELLER` or `AMAZON`). | | prepOwner | Who preps items (`SELLER` or `AMAZON`). | | prepCategory / prepTypes | Prep requirements (e.g. `NONE`, `ITEM_NO_PREP, ITEM_LABELING` — comma-separated for multiple). | Use **Store Reports** to create an **FBA Inventory Report** — it gives you SKU, FNSKU, ASIN, and product title automatically. See the [Store Reports guide](/guides/create-store-reports-in-google-sheets) for details. ### 3. Manage Shipments [#3-manage-shipments] This is your **central tracking hub** for all FBA shipments. Each row represents one shipment plan. You fill in the basic details here, then click **Create STA SS** to generate the working spreadsheet. \[\[TODO: screenshot Manage Shipments sheet showing shipment tracking with sidebar (retake — the old one showed real store data)]] | Column | What it holds | | ---------------------------------- | ------------------------------------------------------------- | | store / warehouseCode | Which store and warehouse to ship from. | | planName | Your label for this shipment plan. | | fulfillmentSplit | Packing strategy (`Box First, Split Later`). | | shipDate / deliveryWindowStartDate | Shipping schedule. | | planFolder | Hyperlink to the STA spreadsheet (auto-generated). | | planId / shipmentId | Amazon's plan and shipment identifiers (auto-filled). | | fbaLabel / fbaId | FBA label PDF link and confirmation ID (auto-filled). | | amazonReferenceId | Amazon's reference number confirming readiness (auto-filled). | | status | Current shipment status (`WORKING`, `SHIPPED`, `CLOSED`). | | carrier / tracking | Your carrier and tracking number. | | remark | Internal notes. | ## Creating your STA shipment [#creating-your-sta-shipment] In Seller Central, creating an FBA shipment plan means clicking through 5+ pages of forms — entering the ship-from address, adding products one by one, filling box dimensions, selecting carriers. For each shipment. Every time. SellerSheet's sidebar walks you through numbered steps. Each button calls the Amazon API and fills the results back into your sheet. The entire flow takes a few clicks instead of dozens of form pages. Every button of the panel is listed on [FBA](/help/sheets/sellers/fba). ### 1. Create the STA spreadsheet [#1-create-the-sta-spreadsheet] On the **Manage Shipments** sheet, fill in a row with your shipment details: 1. Set **Store** and **Warehouse Code** (must match Shipment Setting). 2. Enter a **Plan Name** (your internal label). 3. Set **Fulfillment Split** to `Box First, Split Later`. 4. Fill in **Ship Date** and **Delivery Window Start Date**. 5. Click **Create STA SS** in the sidebar. SellerSheet creates a new spreadsheet in organized Google Drive folders (Store › Country › Year › Month) and opens it. The STA sheet is pre-populated with your warehouse address from Shipment Setting and product data from Product Info via VLOOKUP. ### 2. Fill the STA sheet [#2-fill-the-sta-sheet] The STA sheet has two main areas: the **header section** (filled from your Manage Shipments row, with a step-by-step progress stepper) and the **item grid** (where you fill in your products and box assignments). \[\[TODO: screenshot STA sheet showing shipment overview, logistics, packing configuration, and item grid (retake — the old one showed real store data)]] **Header section.** Holds the shipment overview (Store, Plan Name, Fulfillment Split, Send From Address, Ship Date, Delivery Window Start Date, the box dimension and weight units, FNSKU Label Size, FBA Box Label Size), the progress stepper with the IDs Amazon returns (Packing Option, Placement Option, fees), and — once confirmed — the FBA ID, Reference ID and warehouse. **Item grid.** Columns boxNo, msku, image, fnsku, title, asin, qtyPerBox, boxDimensions, boxWeight, boxes, quantity, expiration, labelOwner, prepOwner, prepCategory, prepTypes. Fill in: 1. **boxNo** — which boxes contain this product (e.g. `1~3` means boxes 1 through 3). 2. **msku** — your Merchant SKU. VLOOKUP fills fnsku, title, asin, qtyPerBox, boxDimensions, boxWeight, labelOwner, prepOwner, prepCategory, and prepTypes from Product Info. 3. **boxes** — how many boxes for this product line (calculated from the boxNo range). Use `1~3` to indicate boxes 1 through 3 share the same contents. Each range or number on a separate row represents a distinct product-to-box assignment. ### 3. Initiate the plan [#3-initiate-the-plan] Click **Initiate Plan** in the sidebar. SellerSheet calls the Amazon API to: 1. Create an inbound plan with your products and box configuration. 2. Generate packing options. 3. Confirm the packing option at once if only one exists. The progress stepper marks steps **1a** and **1b** as done. If Amazon returns several packing options, pick one in the stepper's **1b** cell, then click **Confirm Pack**. After packing is confirmed, click **Set Box Info** to send your box dimensions and weights to Amazon. ### 4. Generate options [#4-generate-options] Amazon returns three types of options, each fetched by its own button: * **Placement options** — click **Gen Placement Opts.** Amazon returns which fulfillment centers to ship to, with their placement fees. Each shipment's warehouse, weight and volume land in the **STA-Options** sheet. Pick a placement in the stepper's **2** cell. * **Transportation options** — click **Gen Trans. Opts.** Shipping methods (Amazon Partnered Carrier vs. Use Your Own Carrier), with cost and mode, land in the STA-Options **Transportation** dropdowns — pick one per shipment there. * **Delivery windows** — own-carrier shipments only: click **Gen Delivery Window** to fill the STA-Options **Delivery Window** dropdowns, then pick a slot per shipment. When Amazon splits items to different warehouses, STA-Options holds one row per shipment, each with its own dropdowns. See [Handling multiple shipments](#handling-multiple-shipments) below. | Transportation option | What it means | | -------------------------- | -------------------------------------------------------------------------------------------------------------- | | `AMAZON_PARTNERED_CARRIER` | Amazon handles pickup and delivery. No delivery window selection needed — Amazon manages the scheduling. | | `USE_YOUR_OWN_CARRIER` | You arrange your own shipping. Click **Gen Delivery Window** to get available delivery slots, then select one. | ### 5. Confirm the shipment [#5-confirm-the-shipment] Once you've selected your options, click **Confirm Shipment**. SellerSheet performs the full confirmation sequence: 1. Confirms the placement option picked in the stepper. 2. Confirms each shipment's transportation option (carrier selection). 3. Confirms each shipment's delivery window (if using your own carrier). After confirmation: * The **FBA ID**, **Reference ID** and warehouse appear in the STA header and in STA-Options; the FBA ID becomes the link to the label PDF once Amazon has it. * **Status** updates to `WORKING`. * The **Manage Shipments** sheet is updated with the confirmed shipment row. When Amazon splits your plan into multiple shipments, **Confirm Shipment** processes all shipments for the selected placement option at once. Each gets its own FBA label PDF and row in Manage Shipments. ### 6. Get the Reference ID [#6-get-the-reference-id] Click **Get Ref. ID** to check whether Amazon has assigned a Reference ID to your shipment. If ready, the Reference ID is filled in (and mirrored to Manage Shipments) and the status may update. If not ready yet, wait 5–10 minutes and try again. The Reference ID confirms Amazon is ready to receive your shipment. It typically takes 5–10 minutes to generate after confirmation. Don't worry if it shows "Not Ready" immediately. ## Getting labels [#getting-labels] Downloading FBA carton labels from Seller Central means finding the right shipment, navigating to the labels page, and downloading one PDF at a time. For FNSKU labels, you need a separate barcode generator tool. ### FBA carton labels [#fba-carton-labels] Set **FBA Box Label Size** in the STA header, then click **Get FBA Box Labels** in the sidebar. SellerSheet downloads the FBA carton label PDF to your Google Drive in the plan folder. The **FBA ID** cell becomes a clickable hyperlink to the PDF. This also works from the **Manage Shipments** sheet — select the row and download the labels for any shipment. ### FNSKU item labels [#fnsku-item-labels] To generate FNSKU barcode labels for individual items: 1. Set **FNSKU Label Size** in the STA sheet header (e.g. `30x50 mm`, `4x6 inch`). 2. Click **Get FNSKU Labels** in the sidebar. SellerSheet generates a barcode label for every unit across all boxes (qtyPerBox × boxes) and opens them in a print dialog. Labels are grouped by FNSKU with a summary page showing the box breakdown and total label count — ready for printing. ## Handling multiple shipments [#handling-multiple-shipments] Amazon often splits your inbound plan into multiple shipments going to different fulfillment centers. In Seller Central, you have to manage each split separately — different carriers, different delivery windows, different labels. Tracking everything across multiple shipment IDs gets overwhelming. When Amazon splits your items, SellerSheet fills the **STA-Options** sheet with one row per shipment per placement option. Each row has its own: * **Shipment ID** — unique identifier for each split. * **Transportation Option ID** — chosen independently per shipment (e.g. Amazon Partnered for one warehouse, your own carrier for another). * **Delivery Window Option ID** — delivery slot per shipment (only needed for `USE_YOUR_OWN_CARRIER`). * **Reference ID / Status** — tracked per shipment after confirmation. How it works: 1. After **Gen Placement Opts.** and **Gen Trans. Opts.**, review the STA-Options rows. 2. Select the **Placement Option** in the stepper's **2** cell on the main STA sheet (options show the fulfillment centers and fee). 3. For each shipment row in STA-Options, select your preferred Transportation Option and Delivery Window Option. **Match Carriers** copies shipment 1's carrier to the other shipments of the same placement. 4. Click **Confirm Shipment** — all shipments for the selected placement are confirmed in one click. 5. Each shipment gets its own FBA label PDF and its own row in Manage Shipments. An **Inbound PL** (Packing List) sheet is also created showing the detailed item breakdown per shipment — which products go to which fulfillment center. Different placement options may have different fees. Check the fee of each placement option before confirming — choose the option that balances cost and delivery speed for your needs. ## Track & manage shipments [#track--manage-shipments] The **Manage Shipments** sheet is your central dashboard for all FBA shipments. After confirming, each shipment appears as a row with its data filled in: * **Plan Folder** — clickable link back to the STA spreadsheet. * **FBA Label** — direct link to the carton label PDF. * **Status** — tracks the lifecycle: `WORKING` → `SHIPPED` → `CLOSED`. * **Carrier / Tracking** — fill in your carrier name and tracking number after shipping. Click **Refresh Shipment** in the sidebar to refresh the status of every open shipment on the sheet from Amazon at any time. Made a mistake? Click **Cancel Plan** in the sidebar before shipping to cancel the entire inbound plan. Every step of the stepper and the Status cell become `CANCELLED`. ## Quick reference [#quick-reference] | What you need | Action | Sheet | | ----------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------- | | Set up warehouse address | Fill once, reuse for all shipments | `Shipment Setting` | | Prepare product catalog | Fill SKU / FNSKU / ASIN / box details | `Product Info` | | Create a new shipment | Fill row → **Create STA SS** | `Manage Shipments` → `STA` | | Walk through the STA workflow | **Initiate Plan** → **Gen Placement Opts.** → **Gen Trans. Opts.** → **Confirm Shipment** → **Get Ref. ID** | `STA` | | Print carton labels | **Get FBA Box Labels** | `STA` | | Print item barcodes | **Get FNSKU Labels** | `STA` | | Track all shipments | View status, labels, tracking; **Refresh Shipment** | `Manage Shipments` | ## Maximizing efficiency [#maximizing-efficiency] * **Reuse Product Info:** fill your product catalog once. Every new STA sheet fills product data via VLOOKUP — no re-entering box dimensions or prep details. * **Auto-import with FBA inventory reports:** use [Store Reports](/guides/create-store-reports-in-google-sheets) to create FBA Inventory Reports and get SKU, FNSKU, ASIN, and title imported automatically. * **Batch shipments:** create multiple rows in Manage Shipments and generate STA spreadsheets for each — work on them in parallel across different tabs. * **Multiple warehouses:** set up multiple warehouse codes in Shipment Setting for different ship-from locations. Select the right one per shipment. * **After shipment:** for listing management (updating prices, titles, or adding ASINs), see the [Create Listings guide](/guides/bulk-create-revise-amazon-listings-in-google-sheets). # How to Create Store Reports in Google Sheets (https://sellersheetai.com/guides/create-store-reports-in-google-sheets) > Get any Amazon store report into Google Sheets — ask your AI client over SellerSheet MCP, request and download it from the sidebar, or find reports Amazon already generated, like settlements. Amazon Seller Central offers dozens of report types — inventory, orders, settlement, FBA and more. But getting them into a spreadsheet where you can actually analyze the data? That's where the frustration begins: logging into Seller Central, navigating menus, waiting for reports to generate, downloading CSV files, importing them by hand — and doing it all again tomorrow. SellerSheet's **Store Reports** removes all of that. It offers distinct workflows, each for a specific seller pain point: * **Ask your AI client** — describe the report in plain language and let your AI do the create → poll → download cycle over SellerSheet MCP. * **Create & download reports** — need a specific report right now? Request it from Google Sheets and download the result in one click. * **Search & download existing reports** — need a settlement report that Amazon generates by itself? Search for it by date range and download it without opening Seller Central. * **Synced reports** — the reports you need every day are already synced into SellerSheet's report warehouse on a schedule. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. If not, follow [Install & first sync](/help/sheets/install). ## Using Claude Code + SellerSheet MCP [#using-claude-code--sellersheet-mcp] Opening Seller Central, navigating menus, waiting for reports, downloading files and importing them into a spreadsheet — every time, for every report. Even with the sidebar, you still click through the steps. What if you could just ask: "Get me the orders report for last week and save it to my Drive"? With SellerSheet MCP connected to your AI client (Claude Code, Claude Desktop, ChatGPT/Codex, Cursor or any MCP client), you describe what you want in plain language. Your AI runs the whole create → poll → download → analyze cycle — no sidebar clicking. ```text Get me the Flat File All Orders report for myStore-AE from March 1–7, 2026. Save it to my Drive and write the link to my Store Reports tracking sheet. ``` Your AI calls these tools in sequence: * `reports_getReports` — checks the reports Amazon already holds before creating a new one, which saves time on duplicate requests. * `reports_createReport` — submits the report request to Amazon SP-API and returns the report ID at once; your AI writes it to your tracking sheet with `write_sheet`. * `reports_getReport` — polls until the report is DONE (1–15 minutes depending on the type) and returns its download link; your AI saves the file to your Drive with `save_url_to_drive`. \[\[TODO: screenshot Claude Code creating a store report over SellerSheet MCP (create → poll → download)]] Add the server `https://sellersheetai.com/mcp` to your client: it opens a browser, you sign in to SellerSheet and approve. Clients that cannot do OAuth use an API key from **Settings → API & MCP** as `Authorization: Bearer `. The same tools then work across all your AI workflows — see [MCP & API](/docs/mcp-api). ## How the sidebar works [#how-the-sidebar-works] Before diving into Store Reports, it helps to know how SellerSheet works in general. Every feature follows the same three-step pattern: 1. **Go to the right sheet** — each feature has its own spreadsheet and sheet tabs. Open the correct one first. 2. **Fill in the colored columns** — **yellow** = required, **light yellow** = optional, **gray** = auto-filled. 3. **Click the sidebar button** — buttons inside a named dropdown only work when you're on the matching sheet tab. ### Button types [#button-types] * **Sheet-specific (inside a dropdown):** only work on the matching sheet. Example: the buttons inside the "Store Reports" dropdown require you to be on the **Store Reports** sheet. * **Global (standalone, not inside any dropdown):** work from any sheet of the spreadsheet. For the full guide — including color coding and tooltips — see [the add-on documentation](/help/sheets). ## Getting started [#getting-started] The first time, SellerSheet creates a **Store Reports** spreadsheet in your `SellerSheet` Google Drive folder. It contains the sheet tabs **Store Reports**, **Report Lookup** and **Store Report Type** (the list of available report types). ### Opening the Store Reports spreadsheet [#opening-the-store-reports-spreadsheet] There are two ways to get to your Store Reports spreadsheet: * **From Google Drive:** open your **SellerSheet** folder in Google Drive, then the **Store Reports** spreadsheet. Launch the sidebar from **Extensions → SellerSheet** and go to the **Store Reports** panel. * **From the sidebar:** open the sidebar in any Google Sheet, go to the **Store Reports** panel and open the spreadsheet from its **Resources** section — then reopen the sidebar from Extensions. \[\[TODO: screenshot the SellerSheet sidebar with the Store Reports panel]] ### Starting fresh or recovering deleted resources [#starting-fresh-or-recovering-deleted-resources] SellerSheet remembers each spreadsheet and folder by its ID. As long as the resource exists, it keeps using it. If a resource is deleted or can't be found, SellerSheet creates a new one and remembers the new ID from then on. Click **Re-Initiate Resources** in the sidebar. SellerSheet checks every folder, spreadsheet and sheet tab by name — if the exact name is missing, it recreates it from a fresh template. Resources that already exist are left untouched. * **Want a clean sheet?** Rename the existing sheet tab (e.g. **Store Reports** → **Store Reports - Backup**), then click Re-Initiate Resources. SellerSheet sees the original name as missing and creates a fresh template next to your renamed copy. * **Want a full backup?** Use **File → Make a copy** to duplicate the whole spreadsheet first, then clear the data in the original. SellerSheet keeps using the original because its ID hasn't changed. * **Deleted something by accident?** Click the missing item in the sidebar's resources or run Re-Initiate Resources. SellerSheet creates a new resource and remembers it automatically. ## Workflow 1: Create & download reports [#workflow-1-create--download-reports] You need a specific report — inventory health, order data, FBA fees — but getting it means logging into Seller Central, opening Reports, requesting the report, waiting for it, downloading the CSV and importing it into your spreadsheet. For several reports or several stores, that takes hours. With SellerSheet, you request any Amazon report and download it straight into a Google Sheet from the **Store Reports** sheet: ### 1. Configure your report rows [#1-configure-your-report-rows] In the **Store Reports** sheet, from row 4 down, fill in the required columns: 1. **Report Type:** switch to the **Store Report Type** sheet to see all available report types. Copy the exact Report Type you want (e.g. `GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA`). 2. **Store:** enter your store ref — the store name plus the country code (e.g. `myStore-US`). 3. **Time frame (optional):** some reports require a date range. Fill in **Data Start Time** and **Data End Time** if needed. | Color | Type | Meaning | | ------------ | ----------- | ------------------------------------------------ | | Yellow | Required | Must be filled (Report Type, Store). | | Light yellow | Optional | Optional fields (Data Start/End Time). | | Gray | Auto-filled | System-managed (Report ID, Status). Do not edit. | ### 2. Create the report [#2-create-the-report] Click **Create Reports** in the sidebar. SellerSheet sends the request to Amazon through the SP-API. On success, the **Request Time** and **Report ID** columns fill in automatically. Rows that already have a Report ID are skipped — no duplicates. ### 3. Download the report [#3-download-the-report] After a moment for Amazon to process the report, click **Get Reports** in the sidebar. SellerSheet checks the status of each Report ID with Amazon: * **IN_QUEUE / IN_PROGRESS:** Amazon is still preparing the report. Try again in a minute. * **DONE:** the report is ready. SellerSheet downloads it to `SellerSheet/StoreReports/{Report Name}` in your Drive. * **CANCELLED:** the report had no data — Amazon cancelled it. * **FATAL:** error in the request (wrong report type or a missing required time frame). When the status is **DONE**, the **Sheet URL** and **Folder URL** columns fill in with links to your downloaded report. \[\[TODO: screenshot the Store Reports sheet with configured rows, Report IDs and download links]] Fill out several rows at once — different reports, different stores, different date ranges. SellerSheet processes **all valid rows** of the active sheet when you click Create Reports or Get Reports. Request 20 reports in one click instead of one at a time. For a shorter walkthrough of this workflow with screenshots, see [How to Download Amazon Reports in Google Sheets](/guides/download-amazon-reports-in-google-sheets). ## Workflow 2: Search & download existing reports [#workflow-2-search--download-existing-reports] Some of the most important reports — like **settlement reports** — are generated by Amazon on a regular schedule. You can't request them yourself. To get a Flat File V2 Settlement Report, you open Seller Central's Payments section, find the settlement period, download the file and import it by hand. With several stores or historical settlement data, that becomes a huge time sink. The **Report Lookup** sheet searches Amazon for reports that already exist — by type and date range — so you can download them straight into Google Sheets. ### 1. Set your search criteria [#1-set-your-search-criteria] Go to the **Report Lookup** sheet and fill in the filter row (row 4) with your search parameters: * **Store:** your store ref (e.g. `myStore-US`). * **Report Type:** the report type to search for (e.g. `GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2`). * **Created Since** (optional): only show reports created after this date. * **Created Until** (optional): only show reports created before this date. ### 2. Search for reports [#2-search-for-reports] With **Report Lookup** as your active sheet, open the sidebar and go to the **Store Reports** panel. Expand the **Report Lookup** dropdown, then click **Search Reports**. SellerSheet asks Amazon for all reports matching your criteria. ### 3. View results and download [#3-view-results-and-download] Results appear from **row 6** down, showing each report's ID, type, data dates, creation time and processing status. To download a specific report: 1. Copy the **Report ID** from the search results. 2. Go to the **Store Reports** sheet and paste the Report ID into a new row (with the Store). 3. Click **Get Reports** in the sidebar to download it to your Drive. \[\[TODO: screenshot the Report Lookup sheet with settlement report search results]] Amazon generates settlement reports every 14 days. Use the **Created Since** and **Created Until** filters to narrow down to the exact settlement period you need — no more scrolling through dozens of reports in Seller Central. ## Synced reports: no scheduling needed [#synced-reports-no-scheduling-needed] You need up-to-date data every day — active listings, inventory levels, orders — but requesting the same reports each morning is unsustainable. SellerSheet syncs a set of Amazon reports for every connected store on a schedule, into its report warehouse — see [Data](/docs/data) for the tables. You don't schedule anything in a sheet: * Your AI client reads the synced rows with `query_report_data`, without calling Amazon again. * `list_report_syncs` shows each store's sync schedules, so your AI can check the data is fresh before trusting it. Use the Store Reports sheet for anything the warehouse does not hold, or for a one-off date range. ## Which workflow should you use? [#which-workflow-should-you-use] | What you need | Workflow | Where | Best for | | ---------------------------------------- | --------------------------- | -------------------------------------------- | ---------------------------------------------------------- | | Any report, described in plain language | Your AI client over MCP | `reports_createReport` + `reports_getReport` | Power users and AI workflows — full automation | | A specific report right now | Create & download (sidebar) | Store Reports sheet | Inventory, orders and FBA reports with custom date ranges | | Amazon-generated reports | Search & download (sidebar) | Report Lookup sheet | Settlement and reimbursement reports | | Daily data (listings, inventory, orders) | Synced reports | `query_report_data` | Dashboards and analysis on data that stays fresh by itself | ## Maximizing efficiency with Google Sheets [#maximizing-efficiency-with-google-sheets] Your report data lands directly in Google Sheets — the most flexible analysis tool for Amazon sellers. To get the most out of it: * **Bulk requests across stores:** fill several rows with different reports and different store refs. SellerSheet processes them all in one click — ideal for multi-marketplace sellers. * **Smart duplicate prevention:** rows with an existing Report ID are skipped by Create Reports; rows already marked DONE are skipped by Get Reports. No accidental double downloads. * **Organized Drive storage:** reports are saved to `SellerSheet/StoreReports/{Report Name}` folders in your Google Drive, neatly categorized. * **Settlement analysis:** use Search Reports to find settlement data, download it, then use Google Sheets formulas and pivot tables to analyze fees, refunds and net proceeds in one place. Every button of the panel is listed on [Store Reports](/help/sheets/sellers/store-reports). # How to Download Amazon PPC Reports in Google Sheets (https://sellersheetai.com/guides/download-amazon-ppc-reports-in-google-sheets) > Download and analyze Amazon Sponsored Products advertising reports directly in Google Sheets. Create reports, track status, and get campaign, keyword, targeting, and search term data — all from the SellerSheet sidebar. ## Introduction [#introduction] Analyzing Amazon PPC performance means logging into Seller Central, navigating to Campaign Manager, selecting date ranges, choosing report types, waiting for downloads, and then copy-pasting data into spreadsheets. For multiple report types or multiple stores, this becomes a daily time sink. SellerSheet's **Ads Reports** feature lets you request and download Amazon Sponsored Products advertising reports directly into Google Sheets. Fill in your store, report type, and date range — then click two buttons in the sidebar to queue the report and retrieve the data. This guide covers the full workflow: setting up the **Ads Reports** sheet, choosing from **10 report types** (campaigns, keywords, targeting, search terms, and more), and downloading the results into dedicated spreadsheets for analysis. 1. **Set up the sheet** — store, report type, dates. 2. **Create Reports** — queue them on Amazon's servers. 3. **Get Reports** — download the completed data. 4. **Analyze** — full metrics in Sheets. ## Prerequisites [#prerequisites] * **Store connected:** connect your Amazon store under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). * **Advertising authorized:** authorize Amazon Advertising API access for your store. This is a separate authorization from the SP-API store authorization. * **Sidebar installed:** install the SellerSheet add-on in Google Sheets. See [Install & first sync](/help/sheets/install). * **Active PPC campaigns:** you need active or historical Sponsored Products campaigns to generate reports. ## Setting up the Ads Reports sheet [#setting-up-the-ads-reports-sheet] In Seller Central, downloading PPC reports means navigating Campaign Manager, selecting report types one at a time, waiting for each to generate, then downloading CSVs and importing them into your spreadsheet. For multiple report types across multiple stores, this takes a significant amount of time every week. The **Ads Reports** sheet is where you define what reports you want. Each row represents one report request. You fill in the store, report type, and date range — then the sidebar handles the rest. \[\[TODO: screenshot the Ads Reports sheet with the sidebar (retake — the old one showed a real store and spreadsheet)]] ### Ads Reports columns [#ads-reports-columns] * **Store:** your store ref with country code (e.g. `myStore-US`). * **Name:** the report type name. Must match one of the [supported report types](#available-report-types). * **Start Date:** beginning of the reporting period. * **End Date:** end of the reporting period. * **Report ID:** *(auto-filled)* Amazon's unique identifier for the queued report. * **Status:** *(auto-filled)* current status — `PENDING` or `COMPLETED`. * **Report Sheet:** *(auto-filled)* hyperlink to the generated spreadsheet with full report data. * **Report Folder:** *(auto-filled)* Google Drive folder where the report spreadsheet is saved. To set up a report request, fill in a row with: 1. **Store** — select your store (e.g. `myStore-US`). 2. **Name** — enter the exact report type name (see [Available report types](#available-report-types) below). 3. **Start Date** — the first day of data you want. 4. **End Date** — the last day of data you want. Add multiple rows for different report types and date ranges. **Create Reports** processes all rows at once, so you can queue a campaign summary, keyword report, and search term report in a single click. ## Step 1: Create Reports [#step-1-create-reports] After filling in your report rows, open the SellerSheet sidebar, go to the **Ads** tab and its [Reports](/help/sheets/ads/reports) panel, and click **Create Reports**. SellerSheet sends each report request to Amazon's Advertising API. For each row it: 1. Validates that **Store**, **Name**, **Start Date**, and **End Date** are filled in. 2. Constructs the full report configuration (columns, filters, groupBy, timeUnit) based on the report type name. 3. Sends the request to Amazon. 4. Writes the returned **Report ID** and **Status** back to the sheet. Most reports start with status `PENDING` while Amazon generates the data. Some small reports may complete immediately and show `COMPLETED`. The **Name** column must exactly match one of the supported report type names (e.g. `SponsoredProductsTargetingSummaryReport`). Misspellings or unsupported names will fail. See the [full list below](#available-report-types). ## Step 2: Get Reports [#step-2-get-reports] Once your reports have a **Report ID**, click **Get Reports** in the sidebar. SellerSheet checks the status of each pending report: * **If COMPLETED:** downloads the full report data, creates a new Google Spreadsheet in your Drive, populates it with headers and all data rows, and writes a clickable hyperlink to the **Report Sheet** column. * **If still PENDING:** updates the status. Wait a few minutes and click **Get Reports** again. The generated spreadsheet contains every metric Amazon provides for the report type — impressions, clicks, spend, sales, ACOS, ROAS, and more, depending on the [report type](#available-report-types). Amazon typically generates advertising reports within 1–5 minutes. If a report is still `PENDING`, wait a few minutes and click **Get Reports** again. Rows that already have a **Report Sheet** link are automatically skipped. ## Available report types [#available-report-types] SellerSheet supports **10 Sponsored Products report types**. Each covers different dimensions and time granularities. Use the exact **Name** in the table below when filling in your Ads Reports sheet. | Report Name | Time Unit | What It Covers | | ------------------------------------------------------ | --------- | --------------------------------------------------------------- | | `SponsoredProductsCampaignsSummaryReport` | Summary | Campaign-level performance summary | | `SponsoredProductsCampaignsWithPlacementSummaryReport` | Summary | Campaign performance broken down by ad placement | | `SponsoredProductsCampaignsWithAdGroupDailyReport` | Daily | Campaign and ad group level daily metrics | | `SponsoredProductsKeywordsSummaryReport` | Summary | Keyword-level performance summary | | `SponsoredProductsKeywordsAndTargetingSummaryReport` | Summary | Combined keywords and targeting performance | | `SponsoredProductsTargetingSummaryReport` | Summary | Targeting-level performance (product targeting, auto targeting) | | `SponsoredProductsSearchTermSummaryReport` | Summary | Search term performance and customer query analysis | | `SponsoredProductsAdvertisedProductDailyReport` | Daily | Daily performance for each advertised product (ASIN/SKU) | | `SponsoredProductsPurchasedProductDailyReport` | Daily | Products actually purchased through ad clicks (attribution) | | `SponsoredProductsGrossAndInvalidTrafficDailyReport` | Daily | Gross vs invalid traffic tracking and click quality | ### Summary vs daily reports [#summary-vs-daily-reports] * **Summary:** aggregated data for the entire date range. One row per campaign/keyword/targeting. Best for period-over-period comparisons. * **Daily:** one row per day per entity. Best for trend analysis and identifying daily performance fluctuations. ## Report metrics [#report-metrics] Each report spreadsheet contains 30–60 columns depending on the report type. Key metrics include: | Category | Metrics | | ----------- | ---------------------------------------------------------------------------------- | | Traffic | impressions, clicks, clickThroughRate, costPerClick | | Spend | cost, spend | | Conversions | purchases (1d/7d/14d/30d attribution windows), unitsSoldClicks | | Revenue | sales (1d/7d/14d/30d attribution windows) | | Efficiency | acosClicks (7d/14d), roasClicks (7d/14d) | | Dimensions | campaignName, adGroupName, keyword, targeting, advertisedAsin, purchasedAsin, date | ## Example workflow [#example-workflow] Here's a typical workflow for pulling weekly PPC reports: 1. **Add report rows** to the Ads Reports sheet: | Store | Name | Start Date | End Date | | ---------- | ---------------------------------------- | ---------- | ---------- | | myStore-US | SponsoredProductsCampaignsSummaryReport | 2025-07-01 | 2025-07-07 | | myStore-US | SponsoredProductsSearchTermSummaryReport | 2025-07-01 | 2025-07-07 | | myStore-US | SponsoredProductsTargetingSummaryReport | 2025-07-01 | 2025-07-22 | 2. **Click Create Reports** in the sidebar — all 3 reports are queued simultaneously. Report IDs and statuses appear in the sheet. 3. **Wait 1–5 minutes** for Amazon to generate the reports. 4. **Click Get Reports** — completed reports get a clickable link in the Report Sheet column. Click any link to open the full data in a new spreadsheet. ## Quick reference [#quick-reference] | What You Need | Action | Result | | --------------------------- | ---------------------------------- | ------------------------------------------- | | Queue reports on Amazon | **Create Reports** | Report ID + Status filled in | | Download completed data | **Get Reports** | New spreadsheet with full report data | | Campaign-level overview | Use `CampaignsSummaryReport` | Spend, sales, ACOS per campaign | | Keyword optimization | Use `KeywordsSummaryReport` | Performance per keyword and match type | | Discover new keywords | Use `SearchTermSummaryReport` | Customer search queries that triggered ads | | Product-level ASIN analysis | Use `AdvertisedProductDailyReport` | Daily metrics per advertised ASIN/SKU | | Attribution analysis | Use `PurchasedProductDailyReport` | Which products customers actually purchased | ## Tips for PPC analysis [#tips-for-ppc-analysis] * **Weekly routine:** set up the same report rows each week with updated dates. Create Reports on Monday morning, Get Reports a few minutes later, and you have last week's data ready to analyze. * **Multiple stores:** add rows for different stores in the same sheet. Each row targets the store specified in the Store column, so you can pull reports for all your marketplaces at once. * **Search term mining:** use the `SearchTermSummaryReport` to find high-converting customer search queries, then add them as exact match keywords to your campaigns. * **ACOS tracking:** the `CampaignsSummaryReport` gives you ACOS (acosClicks7d/14d) and ROAS (roasClicks7d/14d) per campaign — perfect for identifying campaigns that need bid adjustments. * **Placement analysis:** use `CampaignsWithPlacementSummaryReport` to see how your ads perform in Top of Search vs Rest of Search vs Product Pages. Adjust placement modifiers based on this data. Every button of the panel is listed on [Ads → Reports](/help/sheets/ads/reports). # How to Download Amazon Reports in Google Sheets (https://sellersheetai.com/guides/download-amazon-reports-in-google-sheets) > Request Amazon Seller Central reports from Google Sheets, track their status, and download the finished reports to Google Drive with links in your sheet. Requesting and downloading Amazon reports directly from Google Sheets streamlines your workflow. This guide shows you how to use SellerSheet to request, track and download reports like Inventory, Orders and Tax reports. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected under **Settings → Stores & Marketplaces** in the [SellerSheet app](https://sellersheetai.com/home). * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. If not, follow [Install & first sync](/help/sheets/install). ## Step 1: Open the reports spreadsheet [#step-1-open-the-reports-spreadsheet] You work in the **Store Reports** spreadsheet. There are two ways to find it: * Go to your Google Drive root folder and open the **SellerSheet** folder. * Or open the SellerSheet sidebar, go to the **Store Reports** panel, and open the Store Reports spreadsheet from its **Resources** section. SellerSheet folder in Google Drive Opening the Store Reports spreadsheet from the sidebar ## Step 2: Configure your report [#step-2-configure-your-report] In the spreadsheet, go to the **Store Reports** sheet. This is where you configure report requests, one per row from row 4 down. ### Understanding column colors [#understanding-column-colors] | Color | Type | Meaning | | ------------ | ----------- | ------------------------------------------------------------- | | Yellow | Required | Must be filled (e.g. Store, Report Type). | | Light yellow | Optional | Optional or conditional (e.g. Data Start/End Time). | | Gray | Auto-filled | Do not edit. The system fills these (e.g. Report ID, Status). | You don't have to do this one by one. Fill out several rows with different reports or stores. When you click **Create Reports** or **Get Reports**, SellerSheet applies the action to **all valid rows in the active sheet** at once. Store Report Type sheet listing the available reports \[\[TODO: screenshot Store Reports sheet with the report type and store filled in (retake — the old one showed real store data)]] ### Filling the data [#filling-the-data] 1. **Find the report type:** switch to the **Store Report Type** sheet for the list of available reports. Copy the exact **Report Type** of the report you want (e.g. `GET_FLAT_FILE_OPEN_LISTINGS_DATA`). 2. **Paste the report type:** go back to the **Store Reports** sheet and paste it into the **Report Type** column. 3. **Enter the store:** fill in the **Store** column with the store ref — your store name plus the country code (e.g. for a store named "myStore" in the UAE, enter `myStore-AE`). 4. **Time frame (optional):** if the report requires a date range (like 30 days), fill in **Data Start Time** and **Data End Time**. ## Step 3: Create reports [#step-3-create-reports] Once your rows are configured: 1. Open the sidebar and go to the **Store Reports** panel. 2. Click **Create Reports**. SellerSheet sends the requests to Amazon. On success, it fills the **Request Time** and **Report ID** columns automatically. A row that already has a **Report ID** is skipped. ## Step 4: Get reports [#step-4-get-reports] After requesting reports, check their status and download them: 1. Click **Get Reports** in the sidebar. 2. SellerSheet checks the status of each **Report ID** with Amazon. ### Processing status meanings [#processing-status-meanings] * **IN_QUEUE / IN_PROGRESS:** Amazon is still preparing the report. Try again later. * **DONE:** the report is ready. SellerSheet downloads it to your Drive in `SellerSheet/StoreReports/{Report Name}`. * **CANCELLED:** usually means the report contains no data and Amazon cancelled it. * **FATAL:** error in the request (e.g. an incorrect report type or a missing required time frame). Once a report is **DONE**, the **Sheet URL** and **Folder URL** columns fill in with links to your new report file. ## Important notes [#important-notes] * **Active sheet scope:** both **Create Reports** and **Get Reports** apply to the **active sheet** — they process all valid rows of the sheet you are viewing. * **Skipping logic:** **Create Reports** skips rows that already have a Report ID. **Get Reports** skips rows whose status is already DONE, CANCELLED or FATAL, or whose Sheet URL already exists. For searching reports Amazon already generated (like settlement reports) and asking your AI client for a report in plain language, see [How to Create Store Reports in Google Sheets](/guides/create-store-reports-in-google-sheets). Every button of the panel is listed on [Store Reports](/help/sheets/sellers/store-reports). # How to Fetch Live Amazon Listings in Google Sheets (https://sellersheetai.com/guides/fetch-live-listings-in-google-sheets) > See any Amazon listing in Google Sheets — your own by SKU, or any catalog page by ASIN — to audit status and issues, check that Amazon took your change, and copy a listing into the Publish Queue. * The **Listing Snapshot** tab shows a listing as a row: your own by **SKU**, or any Amazon catalog page by **ASIN**. * **Fetch by SKU** gives you what you submitted, with its **Status** and **Issues**. **Fetch by ASIN** gives you what shoppers see, with its category and best-seller rank. * Put the same product on both kinds of row to check whether Amazon took your change. Then copy the SKU, product type or JSON straight into the Publish Queue. [Overview](/guides/manage-amazon-listings-in-google-sheets) · 1 [All your SKUs](/guides/see-all-amazon-skus-in-google-sheets) · **2 Live listings** · 3 [Competitor research](/guides/research-amazon-competitors-in-google-sheets) · 4 [Selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets) · 5 [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets) · 6 [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets) In Seller Central you open listings one at a time. Here every SKU's status and issues sit in one table, next to what shoppers really see. In this guide, the store **myStore-US** sells earbuds under the brand **myBrand**. You check three of its listings, look at a competitor's page, and check whether a new title went live. ## Before you start [#before-you-start] * Connect your Amazon store at [sellersheetai.com](https://sellersheetai.com/home) under **Settings → Stores & Marketplaces**. * Install the SellerSheet sidebar. See [Install & first sync](/help/sheets/install). * In the sidebar's **Catalogs** panel, click **Catalog** under **Resources** to open the **SellerSheet Catalog** spreadsheet. Go to the **Listing Snapshot** tab and expand the **Listing Snapshot** group in the sidebar. Its buttons work only while that tab is open. ## The tab [#the-tab] The Listing Snapshot tab next to the SellerSheet sidebar. Rows 4 to 6 are fetched by SKU — myStore-US, EB-PRO-BLK, EB-PRO-WHT and EB-LITE-BLU, with their ASIN, thumbnail, JSON and source "Listing · SKU". Row 7 is an ASIN-only row fetched by ASIN, source "Catalog · ASIN". In the sidebar the Listing Snapshot group is open with Fetch by SKU highlighted * You type **A Store**, and either **B SKU** or **C ASIN**. Everything else is filled by a fetch. * **D Image** shows the main image. If a row can't be fetched, the reason is written here instead. * **E JSON** holds Amazon's whole answer, including attributes that have no column of their own. * **F Source** says which fetch filled the row: `Listing · SKU` or `Catalog · ASIN`. Each row names its own store, so one tab can hold rows of several stores and marketplaces. You change listings on another tab, the **Publish Queue** (part 6). ## Lesson 1 — Audit your own listings (Fetch by SKU) [#lesson-1--audit-your-own-listings-fetch-by-sku] ### Fill the rows [#fill-the-rows] From row 4, type `myStore-US` in column A and one SKU per row in column B: **EB-PRO-BLK**, **EB-PRO-WHT**, **EB-LITE-BLU**. To check your whole catalog, copy columns B and C (Store, SKU) of the [Catalog tab](/guides/see-all-amazon-skus-in-google-sheets) into columns A and B here. ### Click Fetch by SKU [#click-fetch-by-sku] Click **Listing Snapshot › Fetch by SKU**. Each row fills from your listing, with its ASIN in column C. Only rows whose JSON cell is empty are fetched. With many rows, a click can stop after about five minutes; click again to continue. ### Read the rows [#read-the-rows] | Column | What it tells you | | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Status** | `BUYABLE` (shoppers can buy it) and `DISCOVERABLE` (shoppers can find it). Blank means neither. `NOT_ACCEPTED` means Amazon never accepted the listing. | | **Issues** | One line per issue, such as `ERROR 90220: 'Item Highlight' is required but missing.` | | **Last Updated** | When Amazon last changed the listing. | | **Product Type** | The product type to use on the Publish Queue for this SKU. | | **Parentage Level, Parent, Variation Theme, Color, Size** | Where the SKU sits in its variation family. Parent is the parent SKU. | | **Brand Name … Generic Keyword** | The listing copy, in the Publish Queue's order, one bullet per line. | | **Fulfillment Channel Code, Quantity, Your Price** | The offer. `DEFAULT` means you ship it; `AMAZON_NA`, `AMAZON_EU` and so on mean FBA. | | **Main Image URL … Swatch Image URL** | Every image slot as a link. | Select row 3 and turn on a filter (**Data › Create a filter**). On **Issues**, choose **Filter by condition › Is not empty**; or filter **Status** to blank. That leaves only the SKUs with a problem. ## Lesson 2 — Look at any ASIN (Fetch by ASIN) [#lesson-2--look-at-any-asin-fetch-by-asin] 1. On a new row, type `myStore-US` in column A and the ASIN in column C. Leave column B (SKU) blank. The ASIN can be yours or a competitor's. 2. Click **Listing Snapshot › Fetch by ASIN**. The row fills from Amazon's catalog page, which is what shoppers see. Columns that only a catalog page has are filled too: **Browse Node** (the category Amazon files it under), **BSR Category** and **BSR Rank**. Status, Issues and the offer stay blank, because they belong to a seller's listing. ## Lesson 3 — Check whether Amazon took your change [#lesson-3--check-whether-amazon-took-your-change] An `accepted` result in the Publish Queue means Amazon accepted your submission. But Amazon decides what the catalog page shows, and it may keep another value there, such as one from another seller or its own. Put the product on two rows: one with the SKU (Fetch by SKU) and one with only the ASIN (Fetch by ASIN). Two Listing Snapshot rows for the same earbuds. The row fetched by SKU, source Listing · SKU, has the Item Name you submitted with "40H Playtime". The row fetched by ASIN, source Catalog · ASIN, still shows "30H Playtime". Both Item Name cells are outlined If the copy matches, your change is live. If it doesn't, Amazon still shows another value. Read the SKU row's **Issues**. To check again later, clear the ASIN row's JSON cell and click **Fetch by ASIN**. ## Lesson 4 — Take a listing into the Publish Queue [#lesson-4--take-a-listing-into-the-publish-queue] Listing Snapshot only reads; you change a listing on the [Publish Queue](/guides/bulk-create-revise-amazon-listings-in-google-sheets). The tab hands over what the Publish Queue needs: Arrows from Listing Snapshot columns to Publish Queue columns. SKU (B) goes to SKU (B). Product Type (J) goes to Product Type (D). JSON (E) goes to Attributes JSON (E), followed by the Fill from JSON button. The copy block, Brand Name to Generic Keyword, goes to the columns of the same name. Main Image URL goes to Main Image URL * **SKU and Product Type** are all **Get Template** needs. A `PARTIAL_UPDATE` row (change only the cells you fill) also needs the ASIN in **Merchant Suggested ASIN**. * **JSON:** paste it into the Publish Queue's **Attributes JSON** and click **Fill from JSON**. The whole row is rebuilt from it, and an empty SKU or Product Type is filled too. JSON from an ASIN row has no SKU, so type your own — and if it is a competitor's page, replace their product ID with yours before you submit. * **Copy and image URLs** use the Publish Queue's names and order, one bullet per line, so you can paste them straight across. ## Copy a listing to another marketplace [#copy-a-listing-to-another-marketplace] This happens on the **Publish Queue** tab. It sends every row to the store in **A3**, in the language in **B3**, and its fetch keeps only that store's and language's values. So you build the template for the new marketplace, fetch from the old one, then switch: 1. Set **A3** to the new store, `myStore-UK`, and **B3** to **en_GB**. Type the product type in **D7** and click **Get Template**: the columns are now the UK ones. 2. Set **A3** back to `myStore-US` and **B3** to **en_US**. From row 7, type the SKUs in column B and `UPDATE` in column C, then click **Publish Queue › Fetch by SKU**. 3. Set **A3** to `myStore-UK` and **B3** to **en_GB** again. 4. Change what differs: the price and currency, and **Fulfillment Channel Code** for FBA (`AMAZON_NA` becomes `AMAZON_EU`). 5. Click **Validate (Preview)** and fix what Amazon lists. Then click **Create/Replace/Del.** or **Submit Feed**. If the SKU already sells in that marketplace, `UPDATE` replaces that listing. For a marketplace in another language, translate the copy first with [Translate Listing (AI)](/guides/write-amazon-listings-with-ai-in-google-sheets). ## Tricks [#tricks] * **Refresh a row:** clear its JSON cell and click the fetch again. Rows with JSON are never fetched again, so a second click only fills the new rows. * **A row that failed** says why in its Image cell, for example `Not fetched: …`. Its JSON stays empty, so the next click retries it. * **Compare marketplaces:** add one row per store for the same SKU (`myStore-US`, `myStore-UK`) and read them side by side. * **Everything is in the JSON:** an attribute without its own column is still in column E. Search the cell (Ctrl+F, ⌘+F on a Mac) for its name. ## Frequently asked questions [#frequently-asked-questions] ### What is the difference between Fetch by SKU and Fetch by ASIN? [#what-is-the-difference-between-fetch-by-sku-and-fetch-by-asin] Fetch by SKU reads your own listing — what you submitted — with its status, issues, price and stock. Fetch by ASIN reads Amazon's catalog page — what shoppers see — for any ASIN, yours or a competitor's, with its category and best-seller rank. ### How do I refresh a row? [#how-do-i-refresh-a-row] Clear its JSON cell and click the fetch again. A row is fetched only while its JSON cell is empty, so a second click never overwrites rows you already have. ### Why does a row say "Not fetched" in the Image column? [#why-does-a-row-say-not-fetched-in-the-image-column] The fetch failed for that row and the reason is written in its Image cell, for example a SKU that does not exist in that store. The JSON cell stays empty, so the next click tries the row again. ### What does NOT_ACCEPTED mean in the Status column? [#what-does-not_accepted-mean-in-the-status-column] Amazon never accepted the listing, so it holds no listing data for the SKU — only issues. The Issues column says why. Fix them in the Publish Queue and submit the SKU again. # Guides (https://sellersheetai.com/guides) > Step-by-step guides for common Amazon and noon jobs — with the SellerSheet add-on in Google Sheets, or with your own AI agent over MCP. Step-by-step guides, one job each. Many can be handed to your own AI agent over [MCP](/docs/mcp-api); every one also works in the Google Sheets add-on. ## Get connected [#get-connected] Connect Claude, ChatGPT, Codex, Cursor and other AI clients to your SellerSheet account. Create a noon API key and connect your noon account. ## Webhooks [#webhooks] Get Amazon's changes to your listings, prices, brand content, offers and account in your team chat, or as signed JSON in your own system. ## Advertising [#advertising] What an AI agent can do with your Amazon Ads budgets, rules and recommendations. Watch live budget usage, apply Amazon's recommendations and set self-reverting budget rules for peak days — reviewed in your sheet. Analyze advertising performance with Amazon Ads reports in Google Sheets. Turn on AMC, then let your AI answer new-to-brand and campaign-overlap questions, live or from synced reports, and build audiences your campaigns bid on. ## Listings and catalog [#listings-and-catalog] Start here: the Catalog spreadsheet's tabs, and which guide covers each job. Every SKU of a store with its image, price, stock, status and fulfillment. Your listing by SKU or any catalog page by ASIN — status, issues, and whether Amazon took your change. Rank, Buy Box, offers, FBA fee and your margin for every competitor, then pick a winner. Allowed, approval required or restricted, for many ASINs at once. Copy from a photo, a competitor or your own listing, with length checks and translations. Seller Central's template in a sheet: create, update and delete listings, validated first. Match your products to existing ASINs in the Amazon catalog in bulk. Move a listing to a brand-new ASIN while keeping your SKU and FBA inventory. Build and publish A+ content, or revise the ASINs of existing documents. Host product images and create image URLs for flat-file uploads. ## Orders, FBA and reports [#orders-fba-and-reports] Sync orders automatically and refresh any single order on demand. Generate PDF invoices for shipped orders in bulk. Create FBA shipments with Send to Amazon and get FBA and FNSKU labels in your spreadsheet. A live, filterable view of every FBA SKU — stock, age, sell-through and recommended actions. Request standard Amazon reports and download them into Google Drive. Request on-demand reports from a sheet, and query the reports SellerSheet syncs for you. # How to Use the FBA Inventory Health Dashboard in Google Sheets (https://sellersheetai.com/guides/inventory-health-dashboard) > See stock, inventory age, sell-through, alerts and estimated long-term storage fees for every FBA SKU in one live Google Sheets table, refreshed from your synced Amazon reports with one click. ## Introduction [#introduction] Managing FBA inventory on Amazon means juggling several Seller Central reports — FBA Inventory Health, Stranded Inventory, Storage Fees, Restock Recommendations and more. Each is a separate download, a separate tab, a separate analysis. And there's no single view that answers "should I restock this SKU?" and "is this SKU aging into storage fees?" at the same time. SellerSheet's **Inventory Health** dashboard puts this into one live table in your FBA workbook: one row per SKU × condition × marketplace, with stock, inventory age, sell-through, sales, Amazon's alerts and recommended action, stranded and suppressed flags, estimated excess and estimated long-term storage fees (LTSF) — plus a product thumbnail. * Open the **FBA** panel of the sidebar and click **Refresh Data** — it opens (or creates) the **Inventory Health** sheet. * Type your store refs in **A4** (e.g. `myStore-US`) and click **Refresh Data** again. * Use the row-4 filters to find what to restock, what is aging, and what is stranded — the table re-queries instantly. ## Prerequisites [#prerequisites] * **Store connected:** at least one Amazon store connected to your SellerSheet account — sign in at [sellersheetai.com](https://sellersheetai.com/home) and connect it under **Settings → Stores & Marketplaces**. * **Reports synced:** SellerSheet syncs your FBA inventory reports on a schedule once the store is connected. The dashboard reads that synced data, so it fills once the first sync has run. * **Sidebar installed:** the SellerSheet Google Sheets add-on installed and authorized. See [Install & first sync](/help/sheets/install) if needed. ## Workflow 1: Open the dashboard [#workflow-1-open-the-dashboard] Several reports. Several downloads. A few pivot tables. And you still can't answer "what do I restock this week?" because your storage fees are in one file, your restock recommendations in another, and your inventory age data in a third — none of them linked. The dashboard solves this with a single table that joins your inventory data for you. ### 1. Open the sidebar [#1-open-the-sidebar] Open Google Sheets and launch the SellerSheet sidebar via **Extensions → SellerSheet**. Go to **Sellers → FBA** and find the **Inventory Health** section. ### 2. Click "Refresh Data" [#2-click-refresh-data] Click **Refresh Data**. Clicked anywhere but the Inventory Health sheet, it jumps there — creating the tab in your FBA workbook if needed — so you can run it again. ### 3. Pick your stores and refresh [#3-pick-your-stores-and-refresh] 1. Type your store ref(s) in **A4**, e.g. `myStore-US` — comma-separate several. A4 is required; there is no "All". 2. Click **Refresh Data** again. SellerSheet fills the hidden data layer from the SellerSheet database (no Amazon call) and stamps **Last Sync** (L4) and **Data as of** (M4). \[\[TODO: screenshot the Inventory Health sheet with filter row, tiles and data table]] The live table uses the add-on's `SQL()` function, which activates after the SellerSheet sidebar has been opened once in the workbook. ### Sheet layout [#sheet-layout] | Rows | What they hold | | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Row 2 | Banner — its note carries the tab guide. | | Rows 3–4 | Filter labels and inputs: **Stores**, **SKU**, **ASIN**, **Product Name**, **Condition**, **Rec. Action**, **Alert**, **Stranded**, **Suppressed**, **Min Avail**, **Max Avail**, plus the **Last Sync** and **Data as of** stamps. | | Rows 5–8 | Summary tiles that total the filtered table: Total SKUs, Available Units, FBA Total, FBA Reserved, Unsellable, Inbound Total, Est. Excess, Est. LTSF, Units and Sales over 7 / 30 / 60 / 90 days, and units per age bucket (0–90, 91–180, 181–270, 271–365, 365+ days). | | Row 9 | Column headers (with a column filter). | | Row 10+ | One row per SKU × condition × marketplace. | Text filters take several values separated by commas — a row matches ANY of them (OR); the filters combine with AND; blank means all. The table re-queries the moment you change a filter — no re-sync. ## Workflow 2: Find what to restock [#workflow-2-find-what-to-restock] You check FBA Health — it says 14 days of supply. You check Restock Recommendations — it says nothing. You're not sure whether to order. Meanwhile, you run out of stock and lose the Buy Box for three weeks. 1. Set **Rec. Action** to `CreateShippingPlan` to see the SKUs Amazon recommends restocking. 2. Read **Available**, the inbound columns (**Inbound Working**, **Inbound Shipped**, **Receiving**), **Days of Supply** and **Weeks Cover** (30-day and 90-day) side by side. 3. Compare the **Units** and **Sales** columns over 7 / 30 / 60 / 90 days to see whether demand is growing or slowing. 4. Use **Min Avail** / **Max Avail** to narrow to low-stock SKUs. When a SKU needs stock, create the shipment from the same workbook — see [How to Create FBA Shipments (Send to Amazon) in Google Sheets](/guides/create-sta-shipments-in-google-sheets). ## Workflow 3: Cut storage costs [#workflow-3-cut-storage-costs] You know you're paying long-term storage fees. But you don't know which ASINs are the worst offenders until the charge already hits. And even then, you have to cross-reference the storage fee report against your inventory report to figure out which ones are worth removing — by hand. * **Aged units:** the age tiles (rows 7–8) and the age-bucket columns show units aged 0–90, 91–180, 181–270, 271–365 and 365+ days. * **Est. LTSF** and **Est. Excess:** the projected long-term storage fee and the estimated excess quantity per SKU, totalled in the tiles. * **Rec. Action:** filter on `Create removal order`, `Lower price` or `NoRestockExcessActionRequired` to see what Amazon suggests for excess stock. * **Stranded / Suppressed:** set either filter to `Only` to list the inventory that cannot sell right now, or `Exclude` to hide it. * **Alert:** filter on `Low traffic` or `Low conversion` to find SKUs whose listing, not their stock, is the problem. Long-term storage fees (LTSF) are projected from current aged unit counts — they're an estimate, not a billed amount yet. Amazon charges LTSF on the 15th of each month for any units that have been in FBA for more than 365 days. Use this number as a monthly "cost to hold" signal to prioritize removal or liquidation actions. Start with the 181+ day age buckets to find aged units, then check those SKUs' **Est. LTSF** and sell-through. A SKU with both high LTSF exposure and slow sales is a removal candidate even before it hits 365 days. ## Refreshing the data [#refreshing-the-data] | Method | Use when | Calls Amazon? | | --------------------- | ---------------------------------------------------------------------------------- | ----------------------------------- | | Automatic report sync | Scheduled — SellerSheet keeps your synced reports current | Yes, in the background | | **Refresh Data** | You want the table to show the latest synced data, or you changed the stores in A4 | No (reads the SellerSheet database) | | Change a row-4 filter | You want a different slice of the data already loaded | No | ## Maximizing efficiency [#maximizing-efficiency] * **Filter, don't sort, with the row-9 column filter:** it is safe for filtering, but sorting with it breaks the live table. If that happens, fix it with **Reset to template**. * **Several marketplaces at once:** put several store refs in A4 (e.g. `myStore-US, myStore-CA`) to compare the same SKU across marketplaces side by side. * **Tiles follow your filters:** the tiles total only the rows your filters (and the row-9 column filter) leave visible. * **Every button of the panel** is listed on [FBA](/help/sheets/sellers/fba). # How to Manage Amazon Listings in Google Sheets (https://sellersheetai.com/guides/manage-amazon-listings-in-google-sheets) > The SellerSheet Catalog spreadsheet puts every Amazon listing job in Google Sheets — see every SKU, audit what's live, research competitors, write copy with AI, check eligibility, and create, update or delete listings in bulk. * One spreadsheet, the **SellerSheet Catalog**, holds a tab for each Amazon listing job. The sidebar's **Catalogs** panel has a button group for each tab. * **Improve what you sell:** Catalog → Listing Snapshot → Listing Drafts → Publish Queue. **Launch a product:** Catalog Research → Restriction Check → Listing Drafts → Publish Queue. * Before you publish, **Validate (Preview)** has Amazon check each row. Every result lands in the **Submission Log**. In Seller Central you edit one listing per page, or you upload a flat file and wait for a report. This series moves the whole job into Google Sheets: a row per listing, a button per step, and Amazon's own check before you publish. Each guide follows the same made-up store, **myStore-US**, selling earbuds under **myBrand**. The Catalog spreadsheet's tabs as two journeys. Improve the listings you have: Catalog (Sync Catalog), Listing Snapshot (Fetch by SKU), Listing Drafts (Optimize Listing (AI)), Publish Queue (Validate (Preview)), Submission Log (Refresh Status). Launch a new product: Catalog Research (Discover by Keyword), Restriction Check (Get Restrictions), Listing Drafts (Image → Listing (AI)), Publish Queue (Get Template), Submission Log. Then close the loop on Listing Snapshot to see whether Amazon shows your change ## The series [#the-series] The Catalog tab: every SKU of a store with its image, price, stock, status and fulfillment — filter it in seconds. Listing Snapshot: your listing by SKU or any catalog page by ASIN — status, issues, and whether Amazon took your change. Catalog Research: rank, Buy Box, offers, FBA fee and your margin for every competitor, then pick a winner. Restriction Check: allowed, approval required or restricted, for hundreds of ASINs at once. Listing Drafts: copy from a photo, a competitor or your own listing — with live length checks and translations. The Publish Queue: Seller Central's template in a sheet — create, update and delete listings, validated before they go live. ## Why do it in a sheet [#why-do-it-in-a-sheet] * **Amazon checks your rows first.** Click **Validate (Preview)**. Amazon checks each row, and the sheet shows which attribute is missing. You don't upload a file, wait and download a report. * **Bulk, not one at a time.** One click fills every row of a tab, and one feed sends up to 25,000 rows. * **Side by side.** Your listing next to Amazon's catalog page, your product next to its competitors, every language of a listing in one tab. * **Your own record:** the spreadsheet lives in your Google Drive. The Submission Log keeps every validation and submission, and Backup saves a copy of the Publish Queue before a big change. * **Share it:** your team works in the same spreadsheet, with Google Sheets' comments and version history. ## Before you start [#before-you-start] * [Start free](https://sellersheetai.com/home) and connect your Amazon store under **Settings → Stores & Marketplaces**. * Install the SellerSheet sidebar in Google Sheets. See [Install & first sync](/help/sheets/install). * Open the sidebar's **Catalogs** panel. Under **Resources**, click **Catalog**. This is your **SellerSheet Catalog** spreadsheet; the sidebar made it in your Google Drive the first time you opened it. * Each tab's buttons sit in the sidebar group of the same name. Open the tab before you click. The sidebar's full button list is on [Catalogs](/help/sheets/sellers/catalogs). ## Prefer to ask your AI? [#prefer-to-ask-your-ai] [SellerSheet MCP](/guides/connect-sellersheet-mcp) connects the AI assistant you already use, such as Claude or ChatGPT, to your store. It can prepare a Publish Queue template, fill the rows and validate them. You review and approve the rows in the sheet. ## Frequently asked questions [#frequently-asked-questions] ### Do I need to know Seller Central's flat files? [#do-i-need-to-know-seller-centrals-flat-files] No, but it helps. The Publish Queue holds the same columns as Seller Central's category template, with the guide for each column on row 4 and Amazon's check before anything goes live. ### Where does my listing data live? [#where-does-my-listing-data-live] Your spreadsheets are in your own Google Drive. The sidebar reads from and writes to Amazon through Amazon's official Selling Partner API. For the Catalog tab, SellerSheet keeps a daily copy of your Amazon All Listings report, and Sync Catalog copies it into the sheet. ### Can my AI assistant do this instead? [#can-my-ai-assistant-do-this-instead] Yes. The same listing jobs are available over SellerSheet MCP, so an AI assistant you already use can fill and submit the Publish Queue while you review the rows in the sheet. # How to Refurbish an Amazon Listing (New ASIN, Same SKU & FBA Inventory) in Google Sheets (https://sellersheetai.com/guides/refurbish-amazon-listing-in-google-sheets) > Migrate an Amazon listing to a brand-new ASIN without moving inventory or relabeling — keep your SKU and FBA stock, reset the listing, all from Google Sheets. * **Back up**: capture the listing twice in **Listing Snapshot** — your own version by SKU and Amazon's catalog version by ASIN. * **Create**: in the **Publish Queue**, create a new ASIN under a temporary SKU with a fresh UPC (or GTIN exemption) and a partially-modified title, highlight, bullets and description — every other attribute carried over — while a DELETE row removes the old listing in the same batch. * **Rebuild**: restore the original copy on the new ASIN, then rebuild your original SKU on it using the new ASIN as the externally_assigned_product_identifier. * **Move stock**: a one-line support case remaps your FBA inventory. Product, warehouse stock and SKU all stay put; only the ASIN changes. ## Introduction [#introduction] Refurbishing a listing means migrating an existing FBA product onto a **brand-new ASIN** — while keeping the SKU, the FNSKU labels, and every unit already sitting in Amazon's warehouses. Sellers do it to start a listing fresh and regain new-product momentum, without touching physical inventory. The whole play is four moves: 1. **Before:** you have SKU1 → ASIN1 (the old listing). 2. **Create:** create a new product under a temporary SKU2 — partially modify the title, highlight, bullets and description, keep every other attribute — and Amazon assigns a fresh ASIN2. 3. **Re-home:** delete the old listing, then rebuild SKU1 pointing directly at ASIN2. From now on SKU1 → ASIN2. 4. **Move stock:** FBA units still reference ASIN1; one support case remaps them to ASIN2. Done. Doing this in Seller Central means juggling flat files, category templates and inventory loader quirks. With SellerSheet's **Catalog spreadsheet**, the entire workflow lives in two tabs — **Listing Snapshot** (backup & verification, both your submitted version and Amazon's catalog version) and the **Publish Queue** (every create / update / delete submission). ### Variables used throughout this guide [#variables-used-throughout-this-guide] * **SKU1**: your original SKU, the one you keep — e.g. `SKU-001`. * **ASIN1**: the old ASIN you're leaving behind — e.g. `B0XXXXXXX1`. * **SKU2**: a temporary SKU used to create the new ASIN — e.g. `SKU-001-08141030` (SKU1 + timestamp). * **ASIN2**: the brand-new ASIN, your listing's new home — e.g. `B0XXXXXXX2`. ## Prerequisites [#prerequisites] * **Store authorization:** your Amazon store connected to SellerSheet with write access — sign in at [sellersheetai.com](https://sellersheetai.com/home) and connect it under **Settings → Stores & Marketplaces**. * **An identifier that won't collide with ASIN1:** either a **fresh, unused UPC**, or a category with **GTIN exemption** (identifier left empty). * **The Catalog spreadsheet** with its **Listing Snapshot** and **Publish Queue** tabs (created by the SellerSheet sidebar — see [Catalogs](/help/sheets/sellers/catalogs)). * **Variation children only:** note the parent SKU, variation theme and theme attribute values before you start — you'll restore the relationship at the end. Amazon matches products by GTIN *before* it ever looks at your title. Submit SKU2 with ASIN1's UPC and it attaches straight back to ASIN1 — no new ASIN is ever created. This single mistake is the most common reason the whole workflow fails. ## Getting around the sidebar [#getting-around-the-sidebar] Four habits make the whole workflow self-explanatory — the sheet documents itself: * **The sidebar menu must match the active sheet tab.** Each section (Listing Snapshot, Publish Queue…) is sheet-specific — the sidebar even says "active tab must match". If a button seems to do nothing, check which tab is active at the bottom of your spreadsheet. * **Hover any button** to see a tooltip explaining exactly what it does before you click. * **Read the cell notes.** Header cells carry notes (the small corner marker) describing how the column is used, accepted values, and examples — hover to read them. * **The Publish Queue header is the built-in manual.** For every attribute column, row 4 is a guide with a format hint and example, row 6 shows the column's display name (e.g. Externally Assigned Product Identifier), and the hidden row 5 holds the code key the server reads. Your listings start on row 7. ## Phase 1: Back up everything first [#phase-1-back-up-everything-first] **The problem:** this workflow deletes a live listing on purpose. If anything goes sideways and you didn't capture every attribute first, you're rebuilding a listing from memory — titles, bullets, dimensions, compliance fields, all of it. ### 1a. Back up what you submitted (by SKU) [#1a-back-up-what-you-submitted-by-sku] Open the **Listing Snapshot** tab. Enter your store (e.g. `myStore-US`) in the **Store** column and SKU1 in the **SKU** column, then click **Listing Snapshot → Fetch by SKU** in the sidebar. The row fills in — and the **JSON** column now holds a complete JSON backup of every attribute on the listing. That's your restore source. Note the **ASIN** column value: that's ASIN1. \[\[TODO: screenshot Listing Snapshot tab with Fetch by SKU]] ### 1b. Back up what Amazon accepted (by ASIN) [#1b-back-up-what-amazon-accepted-by-asin] On a new row of **Listing Snapshot**, enter the store and ASIN1 with the SKU cell left empty, and click **Listing Snapshot → Fetch by ASIN**. This captures Amazon's catalog-side, normalized version of your listing (what shoppers see) — useful for spotting what Amazon rewrote, and as evidence for the support case later. \[\[TODO: screenshot Listing Snapshot tab with Fetch by ASIN]] Fetch by SKU and Fetch by ASIN only run on rows whose **JSON** cell is empty. To fetch a SKU again later in this guide, use a new row or clear that row's JSON cell. ## Phase 2: Create the new ASIN [#phase-2-create-the-new-asin] **The problem:** you can't just "ask Amazon for a new ASIN" — the catalog exists to prevent duplicates. Submit the same product unchanged and Amazon binds your new SKU straight to the ASIN you're trying to escape. Here's the balance this phase walks: the new listing must carry the **old ASIN's attributes** — the Phase 4 support case depends on the two ASINs matching. But submit them 100% identical and Amazon decides the product already exists and binds SKU2 to ASIN1; differ too much and changing the copy back after creation sometimes fails. So: keep **every attribute** from the old listing, and **partially modify only four copy fields** — Item Name, Item Highlight, Bullet Point, Product Description — just enough for Amazon to treat it as a new product. Once the new ASIN is created, those four fields are changed back to the old ASIN's exact content (Phase 3, step 1). ### 1. Load the product into the Publish Queue [#1-load-the-product-into-the-publish-queue] Switch to the **Publish Queue** tab and follow the numbered groups in the sidebar: 1. Fill **Store** and **Listing Locale** (e.g. en_US) in row 3. 2. Enter the **productType** from your Listing Snapshot backup (e.g. `HEADPHONES`) in the data row. 3. Click **Get Template** — it loads every attribute column for that category, like downloading the category's Excel template from Seller Central, but in-sheet. 4. Put SKU1 in the **sku** column and click **Fetch by SKU** — the whole row populates. \[\[TODO: screenshot Publish Queue tab with Get Template, Fetch by SKU, Validate and Create/Replace/Del buttons (retake — the old one showed real store data)]] The Publish Queue workflow — Template → Fill rows → Validate → Publish, all from the sidebar. ### 2. Edit the row into a "new product" (SKU2) [#2-edit-the-row-into-a-new-product-sku2] | Column | Change to | | ---------------------------------------------------------------------- | -------------------------------------------------- | | sku | SKU2 — e.g. `SKU-001-08141030` (SKU1 + timestamp) | | operationType | `UPDATE` | | externally_assigned_product_identifier#1.value | Fresh UPC — or **empty** if GTIN-exempt | | externally_assigned_product_identifier#1.type | `upc` — or **empty** if GTIN-exempt | | supplier_declared_has_product_identifier_exemption | `true` if GTIN-exempt; otherwise leave empty | | product_site_launch_date | **Clear it** if it carries the old SKU's past date | | item_name / title_differentiation / bullet_point / product_description | **Partially modify** (see below) | **Why does creating use `UPDATE`?** UPDATE submits the full listing: if the SKU doesn't exist it is created; if it exists it is overwritten. There is no separate "create" operation — SKU2 takes UPDATE too. \[\[TODO: screenshot Publish Queue identifier columns: externally_assigned_product_identifier type, value and merchant_suggested_asin (retake — the old one showed real store data)]] The three key identifier columns — type, value, and merchant_suggested_asin (used later in Phase 3). **Modify, don't rewrite from scratch.** Touch only the four copy fields and change them just enough that duplicate detection sees a new product — restructure the title, reword the highlight and bullets, rephrase the description. Change too little and SKU2 merges back into ASIN1; go far beyond these four fields and restoring the original content later can fail. Everything else stays identical to the old listing. If SKU1 is a **variation child**, also clear parentage_level, child_parent_sku_relationship, variation_theme and the theme attributes (e.g. color / size) — create it as a standalone product and restore the variation at the end. \[\[TODO: screenshot Publish Queue GTIN exemption column and variation columns (retake — the old one showed real store data)]] Scroll right for the GTIN exemption flag and the variation columns (clear these for children). ### 3. Add a DELETE row for SKU1 in the same batch [#3-add-a-delete-row-for-sku1-in-the-same-batch] On the next empty row, enter SKU1 in the **sku** column and set **operationType** to `DELETE`. That's it — a delete row needs only those two cells. Creating SKU2 and deleting the old listing in the same batch frees SKU1 up, so you can rebuild it on the new ASIN2 in Phase 3. \[\[TODO: screenshot Publish Queue with the SKU2 UPDATE row and the SKU1 DELETE row submitted together (retake — the old one showed real store data)]] Two rows, one batch — SKU2 (UPDATE) creates the new product; SKU1 (DELETE) removes the old listing. ### 4. Validate, then submit [#4-validate-then-submit] Click **Validate (Preview)** and check the **Submission Log** tab for ERROR-level issues — validation is a preview, nothing publishes (a DELETE row has no preview and is skipped). Once clean, click **Create/Replace/Del.** to submit (instant for up to 20 rows, dispatched per row's operationType; use **Submit Feed** for larger batches). ### 5. Verify ASIN2 was born [#5-verify-asin2-was-born] Wait 10–15 minutes. In **Listing Snapshot**, fetch SKU2 and read the **ASIN** column — that's ASIN2. The critical check: **ASIN2 ≠ ASIN1**. You can cross-check in Seller Central too. If SKU2 returns ASIN1, Amazon merged it — the four copy fields weren't different enough (or the identifier matched). Delete SKU2, increase the changes to those four fields, and resubmit. ## Phase 3: Rebuild your SKU on the new ASIN [#phase-3-rebuild-your-sku-on-the-new-asin] **The problem:** ASIN2 exists, but it's living on a throwaway SKU with placeholder copy. Your real SKU — the one your FBA inventory, ads and operations are built around — is deleted and homeless. And if the two ASINs don't look like the same product, support will refuse to move your inventory. ### 1. Restore the original copy on SKU2 first [#1-restore-the-original-copy-on-sku2-first] Before rebuilding SKU1, copy the **original** copy from your Phase 1 Listing Snapshot backup back onto the SKU2 row and submit with operationType `UPDATE`. The column mapping: | Backup (display name) | Publish Queue (code key) | | --------------------- | ------------------------ | | Item Name | item_name | | Item Highlight | title_differentiation | | Bullet Point | bullet_point | | Product Description | product_description | The Publish Queue shows the display name on row 6; the hidden row 5 holds the code key. **Why this matters:** it makes ASIN2's attributes identical to ASIN1's. When you open the support case in Phase 4, support can't reject the remap on the grounds that the two ASINs are different products. After submitting, fetch SKU2 in Listing Snapshot once more and confirm it still resolves to ASIN2. **In the same submission, lock the identifier to the new ASIN** — so every later update lands on the newly created ASIN (with the identifier left empty, Amazon can sometimes spawn yet another listing): | Column | Set to | | ---------------------------------------------- | ------------------- | | externally_assigned_product_identifier#1.value | **ASIN2** | | externally_assigned_product_identifier#1.type | `asin` | | merchant_suggested_asin | **ASIN2** | | operationType | `UPDATE` (required) | **Identifier and GTIN exemption are mutually exclusive**: if SKU2 was created via exemption (supplier_declared_has_product_identifier_exemption = TRUE), clear the TRUE first — it cannot coexist with externally_assigned_product_identifier. ### 2. Rebuild SKU1 pointing at ASIN2 [#2-rebuild-sku1-pointing-at-asin2] Back in the Publish Queue: 1. The row's attributes already match SKU1 exactly and the identifier points at ASIN2 from the previous step — **just change the sku cell to SKU1**, with operationType `UPDATE`. 2. **Confirm SKU1 is fully deleted** — Fetch by SKU on SKU1 in Listing Snapshot no longer finds the SKU (the row's Image cell shows the reason). If it still resolves, wait and re-check before submitting. 3. **Validate (Preview)** → **Create/Replace/Del.** ### 3. Verify the rebuild [#3-verify-the-rebuild] * **Listing Snapshot** — fetch SKU1: the ASIN column should now read **ASIN2**. * **Seller Central** — Manage All Inventory shows SKU1 / ASIN2; **Fix Stranded Inventory** shows SKU1 / ASIN1. The stranded entry is *expected* — your FBA units still reference the old ASIN until Phase 4. Amazon "successfully" accepts operations on SKUs that don't exist. Always confirm the result by fetching the SKU in Listing Snapshot or checking Seller Central — never by the feed status alone. ## Phase 4: Move the FBA inventory & clean up [#phase-4-move-the-fba-inventory--clean-up] **The problem:** your listing lives on ASIN2, but every unit in Amazon's warehouses still references ASIN1 — stranded and unsellable. Creating removal orders and re-shipping would cost weeks and real money. ### 1. Open the support case [#1-open-the-support-case] Go to **Seller Central → Help → Get support → Selling on Amazon → Products and inventory → Fix a product page**, and use this one-liner (swap in your own SKU1 and ASIN2): ```text Hello team, please remap SKU: SKU-001 to ASIN: B0XXXXXXX2. They represent the same product. Thanks! ``` If support asks for evidence, provide a Manage All Inventory screenshot and your Phase 1 Listing Snapshot backup (by ASIN) showing the two ASINs are the same product. Once processed, the stranded entry clears and your stock is sellable under ASIN2 — no relabeling, no new shipment. ### 2. Clean up [#2-clean-up] * **Delete SKU2** — after the remap it's just a duplicate empty offer on ASIN2 that can interfere with pricing and the Buy Box. Add a DELETE row in the Publish Queue. * **Restore the variation** (children only) — re-add parentage_level = child, child_parent_sku_relationship, variation_theme and a theme attribute value that doesn't clash with existing siblings. * **Archive** the backup rows, the case ID and the timeline. ## Common pitfalls [#common-pitfalls] | Pitfall | Consequence | Avoid it | | --------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------- | | Reusing the old UPC on SKU2 | Attaches straight back to ASIN1 — no new ASIN | Fresh UPC, or GTIN exemption with the identifier left empty | | Modifying the copy too timidly | Duplicate detection merges SKU2 into ASIN1 | Partially modify the four copy fields; always verify ASIN2 ≠ ASIN1 | | Rebuilding SKU1 before it's released | The SKU can re-link to its old catalog data | Confirm SKU1 is gone first; always set merchant_suggested_asin to ASIN2 | | Trusting the feed status | The listing may not actually exist | Verify by fetching the SKU in Listing Snapshot or in Seller Central | | Forgetting to delete SKU2 | Duplicate offer on the same ASIN | Clean up in Phase 4 after the inventory remap | | Leaving variation attributes on a child | Creation errors, or the child re-attaches to the parent | Clear variation columns in Phase 2; restore them in Phase 4 | ## FAQ [#faq] ### Do I need to relabel or move my FBA inventory? [#do-i-need-to-relabel-or-move-my-fba-inventory] No. FBA inventory is tied to the FNSKU, which never changes in this workflow. After you rebuild your SKU on the new ASIN, a short support case asks Amazon to remap the existing inventory — no removal orders, no relabeling, no new shipment. ### Why does the temporary SKU need a new UPC or GTIN exemption? [#why-does-the-temporary-sku-need-a-new-upc-or-gtin-exemption] Amazon matches products by GTIN before it looks at your title. If the temporary SKU carries the old UPC, it attaches straight back to the old ASIN and no new ASIN is created. Use an unused UPC, or leave the identifier empty and set the GTIN exemption flag if your category allows it. ### My temporary SKU came back with the OLD ASIN — what went wrong? [#my-temporary-sku-came-back-with-the-old-asin--what-went-wrong] Either the identifier matched (same UPC) or the four modified copy fields were still too similar, so Amazon's duplicate detection merged it into the existing ASIN. Delete the temporary SKU, increase the changes to those four fields, and resubmit. ### Why does Fix Stranded Inventory show my SKU with the old ASIN? [#why-does-fix-stranded-inventory-show-my-sku-with-the-old-asin] That is expected mid-workflow. Manage All Inventory shows your SKU on the new ASIN, while the FBA units still reference the old ASIN until the support case remaps them. Once the case is processed, the stranded entry clears and the stock is sellable under the new ASIN. ### Can I refurbish a variation child? [#can-i-refurbish-a-variation-child] Yes. Note the parent SKU, variation theme and theme attribute values first, clear the variation columns when creating the temporary SKU, and re-attach the rebuilt SKU to the parent at the end — using a theme value that does not clash with existing siblings. ### Why restore the original copy before rebuilding the SKU? [#why-restore-the-original-copy-before-rebuilding-the-sku] The support case succeeds when the two ASINs clearly represent the same product. Restoring the original title, bullets and description makes the new ASIN's attributes identical to the old one, so support has no grounds to reject the remap as a different product. # How to Research Amazon Competitors in Google Sheets (https://sellersheetai.com/guides/research-amazon-competitors-in-google-sheets) > Compare competitor ASINs side by side in Google Sheets — copy, best-seller rank, Buy Box, offers, FBA fees and your margin — then pick a winner and send it to drafting and the restriction check. * The **Catalog Research** tab compares competitor ASINs side by side: copy, best-seller rank, Buy Box, offer counts, an FBA fee estimate and your margin. * **Discover by Keyword** finds up to 10 ASINs for a search term; **Fetch Catalog Data** fills every row. Type **Your Cost** to see **Est Margin**. * **Listed?** shows at once which ASINs you already sell. * **Set as Winner** puts the best one in row 4. From there, **Copy Winner to Drafts** starts the listing and **Send to Restriction Check** checks you may sell it. [Overview](/guides/manage-amazon-listings-in-google-sheets) · 1 [All your SKUs](/guides/see-all-amazon-skus-in-google-sheets) · 2 [Live listings](/guides/fetch-live-listings-in-google-sheets) · **3 Competitor research** · 4 [Selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets) · 5 [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets) · 6 [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets) In this guide **myStore-US** wants to launch open-ear earbuds under **myBrand**. You find the products that already sell, see what each one would earn you, and pick the one to model your listing on. One click does for every row what Amazon's Revenue Calculator does one ASIN at a time. Flow of the Catalog Research tab: 1 Find with Discover by Keyword, or paste ASINs. 2 Fill with Fetch Catalog Data. 3 Price it: type Your Cost, and Est Margin is Buy Box minus fee minus cost. 4 Pick: Set as Winner copies the clicked row to row 4. 5 Copy Winner to Drafts goes to Listing Drafts, and Send to Restriction Check goes to Restriction Check ## Before you start [#before-you-start] * Connect your store at [sellersheetai.com](https://sellersheetai.com/home) and install the sidebar ([Install & first sync](/help/sheets/install)). * In the sidebar's **Catalogs** panel, click **Catalog** under **Resources** to open the **SellerSheet Catalog** spreadsheet. Go to the **Catalog Research** tab and expand the **Catalog Research** group in the sidebar. * The tab has two parts: **row 4 is your winner**, and competitors go from **row 5** down. ## Research a niche [#research-a-niche] ### Find the competitors [#find-the-competitors] Type `myStore-US` in **A5** (any row from 4 down works). Click **Discover by Keyword**, type `open ear earbuds` in the box and click OK. Up to 10 ASINs that match are added below and filled. They are Amazon's first 10 catalog matches, not a best-seller list, and ASINs already on the tab are skipped — so try other search terms to add more. You can also paste ASINs you found yourself into **column C**, from row 5, with the store in column A. ### Fetch Catalog Data [#fetch-catalog-data] Rows from **Discover by Keyword** are already filled. Click **Fetch Catalog Data** for ASINs you pasted, or to refresh the numbers. Every row from 5 with a store and an ASIN fills from Amazon: | Columns | What you learn | | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | | **Image, Product Type, Brand Name, Item Name … Generic Keyword** | The competitor's listing copy, one bullet per line. | | **BSR Category, BSR Rank** | Its Best Sellers Rank. A lower rank sells more; compare ranks only within the same BSR Category. | | **Buy Box** | The Buy Box price for a new item. | | **FBA Offers, MFC Offers** | How many sellers offer it new — fulfilled by Amazon, or merchant-fulfilled (MFC, the same as FBM). | | **Fee Est** | Amazon's FBA fulfilment plus referral fee, at the Buy Box price. | | **Listed?** | Your own SKUs on that ASIN, if you already sell it. | ### Type your cost [#type-your-cost] Type your landed cost per unit — what one unit costs you, delivered to Amazon — in the marketplace's currency, in **Your Cost**. **Est Margin** works it out as Buy Box − Fee Est − Your Cost, and turns red when you would lose money. It leaves out ads, storage, returns and other costs. Catalog Research rows. Row 4 is the winner, B0COMPET02, highlighted: rank 1,284, Buy Box 39.99, Fee Est 12.84, Your Cost 9.50, Est Margin 17.65. Below it the competitors: one with no Buy Box and so no fee or margin, one at 19.99 with a margin of −1.07 in red, and B0EXAMPLE5, which Listed? shows you already sell as EB-SPORT-GRN ### Set as Winner [#set-as-winner] Click anywhere in the row you want to model, then click **Set as Winner**. The whole row is copied to **row 4**. Fetches never overwrite row 4, so edit it freely — it is your summary. ### Send it on [#send-it-on] * **Copy Winner to Drafts:** type your own SKU in **B4** first, then click it. A row is added to [Listing Drafts](/guides/write-amazon-listings-with-ai-in-google-sheets) with the store, your SKU, the winner's ASIN, image, product type and copy. Each click adds another row. * **Send to Restriction Check:** select the rows to check (row 4 counts too) and click it. Their store and ASIN are added to [Restriction Check](/guides/check-asin-selling-eligibility-in-google-sheets), with the marketplace's language as the Reason Locale. That tab shows whether Amazon restricts that product for you — for example a brand or category that needs approval. When the draft reaches the Publish Queue, the winner's ASIN lands in **Merchant Suggested ASIN**. If you are launching your own product, clear that cell before you publish. Otherwise your SKU joins the competitor's listing. ## Tricks [#tricks] * **Model a price:** row 4 recalculates its margin from its own cells. Type a different Buy Box, fee or cost in row 4 to see what a lower price would earn. Fee Est doesn't follow the Buy Box by itself, so change it too. * **Refresh the numbers:** click **Fetch Catalog Data** again — every competitor row is fetched again. Buy Box, offers, fee and Listed? are only written when Amazon returns a value, so clear those cells first to see whether a Buy Box has gone. * **Compare marketplaces:** put the same ASIN on two rows with different stores, such as `myStore-US` and `myStore-UK`. Each row reads its own marketplace. * **Spot what you already sell:** **Listed?** names your SKU on an ASIN. A competitor row that is really your own product shows up at once. * **Reasons in another language:** the rows you send to Restriction Check get the marketplace's language as their Reason Locale. Pick another locale there before you click **Get Restrictions**. ## Frequently asked questions [#frequently-asked-questions] ### Why are Fee Est and Est Margin blank? [#why-are-fee-est-and-est-margin-blank] The fee is estimated at the Buy Box price, so an ASIN without a Buy Box gets no fee and no margin. With a fee, Est Margin appears once you type Your Cost. ### Is the fee right if I ship the product myself? [#is-the-fee-right-if-i-ship-the-product-myself] Fee Est is Amazon's FBA fulfilment fee plus the referral fee, at the Buy Box price. If you ship it yourself, you pay the referral fee plus your own shipping instead. Type your own fee in the winner row to see that margin. ### Does Catalog Research use my Credits? [#does-catalog-research-use-my-credits] No. These buttons read Amazon's catalog, pricing and fee data; none of them uses Credits. ### Does a second Fetch Catalog Data overwrite my rows? [#does-a-second-fetch-catalog-data-overwrite-my-rows] It refreshes every competitor row from 5 down, but never touches row 4 (your winner) or Your Cost. Buy Box, offers, fee and Listed? are only written when Amazon returns a value, so clear those cells first if you want to see a Buy Box the ASIN has lost. # How to See All Your Amazon SKUs in Google Sheets (https://sellersheetai.com/guides/see-all-amazon-skus-in-google-sheets) > List every SKU of an Amazon store in Google Sheets — thumbnail, price, stock, status and fulfillment — filter it in seconds and pass SKUs on to Listing Snapshot or the Publish Queue. * The **Catalog** tab lists every SKU of one store: thumbnail, ASIN, name, price, quantity, status, live status and fulfillment. * Type the store in **A4** and click **Sync Catalog**. Then filter row 5 as you like — no new sync needed. * A first win: filter **Fulfillment** to FBM and **Qty** to 0. These are the listings you can't ship today. * Use the list as the starting point for everything else: paste its SKUs into [Listing Snapshot](/guides/fetch-live-listings-in-google-sheets) or the [Publish Queue](/guides/bulk-create-revise-amazon-listings-in-google-sheets). [Overview](/guides/manage-amazon-listings-in-google-sheets) · **1 All your SKUs** · 2 [Live listings](/guides/fetch-live-listings-in-google-sheets) · 3 [Competitor research](/guides/research-amazon-competitors-in-google-sheets) · 4 [Selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets) · 5 [Write listings with AI](/guides/write-amazon-listings-with-ai-in-google-sheets) · 6 [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets) Seller Central's inventory page shows your listings a page at a time. The Catalog tab puts the whole store in one sheet you can sort, filter and copy from. In this guide the store is **myStore-US**, selling earbuds under **myBrand**. ## Before you start [#before-you-start] * Connect your Amazon store at [sellersheetai.com](https://sellersheetai.com/home) under **Settings → Stores & Marketplaces**. SellerSheet then syncs Amazon's All Listings report for it every day. * Install the SellerSheet sidebar. See [Install & first sync](/help/sheets/install). * Open the **SellerSheet Catalog** spreadsheet from the sidebar's **Catalogs** panel (under **Resources**). If another tab is open when you click **Sync Catalog**, the sidebar switches to the Catalog tab for you; type the store and click again. ## Sync the list [#sync-the-list] The Catalog tab next to the SellerSheet sidebar. A4 holds myStore-US and is outlined; B4 shows the last sync time and C4 the data date. From row 6, one row per SKU sorted A to Z: a thumbnail, the store, SKU, ASIN and product name. In the sidebar the Catalog group is open with Sync Catalog highlighted ### Type the store in A4 [#type-the-store-in-a4] Type one store and marketplace, such as `myStore-US`: your store name, a dash, and the country code. Not sure of the name? Leave A4 empty and click **Sync Catalog** — the message lists your stores. ### Click Sync Catalog [#click-sync-catalog] Click **Catalog › Sync Catalog**. The rows land from row 6, sorted by SKU. **B4 Last Sync** shows when you synced, and **C4 Data as of** shows the date of the Amazon report the rows come from. ### Read and filter [#read-and-filter] Close-up of the Catalog columns from row 5: SKU, Price, Qty, Status, Condition, Live and Fulfillment. EB-LITE-RED is FBM with Qty 0, outlined, and Live shows only DISCOVERABLE. EB-OLD-GRY is Inactive with Live blank. The two FBA SKUs have no Qty, because Amazon's report doesn't carry FBA stock | Column | What it shows | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Image** | The main image as a thumbnail. | | **Store, SKU, ASIN** | One row per SKU, marketplace and condition. | | **Product Name, Price, Qty** | As on the listing. Qty is your own stock on an FBM listing; Amazon's report doesn't carry FBA stock. | | **Status** | The listing status from Amazon's report, such as Active. | | **Condition** | Amazon's condition code; 11 means New. | | **Live** | What Amazon last reported. `BUYABLE, DISCOVERABLE`: shoppers can buy and find it. `DISCOVERABLE` alone: they can find it but not buy it. Checked in the background, so it can be weeks old. | | **Fulfillment** | **FBA** or **FBM**. | | **Open Date** | When the listing was created. | Use the filter buttons on row 5 to narrow the list. A filter works at once, without a new sync. ## Things to do with the list [#things-to-do-with-the-list] * **Find the gaps:** filter **Qty** to 0 and **Fulfillment** to FBM to see what you can't ship. Or filter **Live** with **Text does not contain** `BUYABLE`, then check those SKUs on Listing Snapshot for today's status. * **Audit them:** copy the SKUs of column C into column B of [Listing Snapshot](/guides/fetch-live-listings-in-google-sheets) from row 4, with the store in column A, and click **Fetch by SKU** to see each listing's issues. * **Edit them in bulk:** on the [Publish Queue](/guides/bulk-create-revise-amazon-listings-in-google-sheets), type the store in **A3**, paste the SKUs in column B from row 7 and click **Fetch by SKU**. Each row fills from its live listing, ready to change only the cells you edit (`PARTIAL_UPDATE`). * **Delete old SKUs:** paste them into the Publish Queue with `DELETE` in column C — that is all a `DELETE` row needs. A `DELETE` can't be undone, so click **Backup** first. ## Tricks [#tricks] * **Keep your filters:** each sync rebuilds the row-5 filter and clears its settings. Save the ones you use as a filter view (**Data › Filter views › Create new filter view**); a sync leaves filter views alone. * **Keep your notes elsewhere:** a sync rewrites everything from row 5 down, and re-sorts it. Put your own notes on another tab and look them up by SKU with `XLOOKUP`, so they never fall out of line. * **Another marketplace:** change A4 (for example to `myStore-UK`) and sync again. The table is replaced with that marketplace's SKUs. * **A listing you created today** appears after Amazon's next daily report. ## If the sync stops [#if-the-sync-stops] | The message says | What to do | | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | Type ONE store in A4 before syncing | A4 is empty or says All. Type one store; the message lists yours. | | A4 accepts ONE store, but 2 were given | Keep one store in A4. | | "…" is not a store you own or have been given access to | Check the spelling against the list in the message. | | No … listings in the SellerSheet warehouse for this store | That marketplace's listings report isn't syncing. Check the store's report sync and marketplace on the dashboard. | | The SellerSheet warehouse has NO listings for this store at all | Its listings report isn't syncing. Re-authorize the store, or check its report sync on the dashboard. | | ROW CAP HIT | The store has more than 50,000 listings; the first 50,000 are shown. | | … hit the 50,000-row query cap … the table is incomplete | A store that sells in several marketplaces can reach this with fewer listings in one marketplace. Some SKUs are missing from the tab. | ## Frequently asked questions [#frequently-asked-questions] ### Where does the Catalog tab get its data? [#where-does-the-catalog-tab-get-its-data] From Amazon's All Listings report, which SellerSheet syncs for your store every day once the store is connected. Sync Catalog reads the newest copy SellerSheet holds — it does not ask Amazon live. ### Why is "Data as of" amber? [#why-is-data-as-of-amber] C4 shows the date of the Amazon report the rows come from, and turns amber when it is more than a day old. A catalog that has not changed is not stored again, so the date can be a few days old while the list is still current. ### Can I see every marketplace at once? [#can-i-see-every-marketplace-at-once] No. A4 takes one store and marketplace, such as myStore-US. To see another marketplace, change A4 and click Sync Catalog again; the table is replaced. ### Why are the Image or Live cells blank for some SKUs? [#why-are-the-image-or-live-cells-blank-for-some-skus] Images and the live status are filled in the background, newest SKUs first, and each SKU is checked again about every 60 days. A SKU that has not been reached yet shows blank cells; sync again later. # How to Sync Amazon Orders to Your Google Sheets (https://sellersheetai.com/guides/sync-amazon-orders-to-your-google-sheets) > Sync your Amazon Seller Central orders into Google Sheets with the SellerSheet sidebar, keep them updated automatically, and refresh any single order on demand. Keeping track of your Amazon orders and analyzing sales data is crucial for business growth. This guide shows you how to sync your Amazon orders to Google Sheets automatically, for better organization and analysis. ## Prerequisites [#prerequisites] * **Store connected:** your Amazon store is connected to your SellerSheet account (sign in at [sellersheetai.com](https://sellersheetai.com/home)). * **Sidebar installed:** the SellerSheet add-on is installed in Google Sheets. If not, follow [Install & first sync](/help/sheets/install). ## Step 1: Open the sidebar and sync orders [#step-1-open-the-sidebar-and-sync-orders] To begin, trigger the first fetch from the SellerSheet sidebar: 1. Open your Google Sheet and launch the **SellerSheet sidebar**. 2. Go to the **Sales** panel. 3. Click **Sync Orders**. SellerSheet Sidebar Sales Tab ### Syncing logic explained [#syncing-logic-explained] * **First time:** the first Sync Orders fetches the last **30 days** of orders. This may take a few moments. * **Automatic sync:** after that, SellerSheet keeps the sheet current by itself — about **every 2 hours**, together with the fees sync, fetching everything since the last sync. * **Updates:** existing orders are updated when something changed (a status update, for example) since the last sync. * **Manual sync:** click the button again at any time for an immediate refresh. ## Step 2: Access and manage your orders [#step-2-access-and-manage-your-orders] Once synced, your order data lives in a dedicated spreadsheet: * Open the **SellerSheet Sales** spreadsheet — from your Google Drive, or from the panel's Resources links in the sidebar. * Go to the **Orders** sheet, where synced orders populate automatically. \[\[TODO: screenshot Synced Orders in Google Sheets (retake — the old one showed real store data)]] ### Manual order updates [#manual-order-updates] To update one order immediately, without waiting for the automatic sync: 1. Find the order in the **AmazonOrderId** column. 2. Click the cell containing its **AmazonOrderId**. 3. In the sidebar, click **Update Order**. SellerSheet fetches the latest information for that order from Amazon. **Update Order** works on the **active cell**: the active row must hold a valid **Store** and **AmazonOrderId**. You can pull orders that are not in your sheet yet. Write the **Store** and **AmazonOrderId** in an empty row, click the **AmazonOrderId** cell, and click **Update Order** to pull that order's data into the sheet. ## Bulk invoice creation [#bulk-invoice-creation] Beyond syncing orders, you can use your order data to generate invoices for your customers. \[\[TODO: screenshot Store Info Sheet for Invoices (retake — the old one showed real store data)]] \[\[TODO: screenshot Invoices Sheet (retake — the old one showed real store data)]] Fill the **Store Info** sheet once, and SellerSheet puts your branding and business details into every invoice generated from the **Invoices** sheet. For the step-by-step, see [How to Bulk Create Invoices for Amazon Customers](/guides/bulk-create-invoices-for-amazon-customers-in-google-sheets). ## Conclusion [#conclusion] With the sync running on its own, you save the time of manual data entry and keep an up-to-date view of your Amazon business. Every button of the panel is listed on [Sales](/help/sheets/sellers/sales). # How to Write Amazon Listings with AI in Google Sheets (https://sellersheetai.com/guides/write-amazon-listings-with-ai-in-google-sheets) > Draft Amazon listing copy with AI in Google Sheets — from a product photo, a competitor's listing or your own — check every length, translate it for other marketplaces and send it to the Publish Queue. * The **Listing Drafts** tab is your writing desk: one row per listing, with your notes on the left and the AI's copy on the right. * Start a row from a competitor, a reference ASIN or your own listing. Write **Instructions** and **Draft Keywords**, click the row, then click **Image → Listing (AI)**, **Optimize Listing (AI)** or **Optimize Title (AI)**. * Check the live character counts and translate with **Translate Listing (AI)**. Then click **Send to Publish Queue**; you publish from the Publish Queue. [Overview](/guides/manage-amazon-listings-in-google-sheets) · 1 [All your SKUs](/guides/see-all-amazon-skus-in-google-sheets) · 2 [Live listings](/guides/fetch-live-listings-in-google-sheets) · 3 [Competitor research](/guides/research-amazon-competitors-in-google-sheets) · 4 [Selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets) · **5 Write listings with AI** · 6 [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets) In a chat window you copy each field by hand, count the characters, and start again for every country. Here each listing is one row: the AI writes into the listing fields, the sheet counts the characters, one click translates for every marketplace, and the copy goes straight into the Publish Queue's columns. The AI is told to use only what your photo and Instructions say — still read every line. In this guide **myStore-US** writes a listing for a new product, the open-ear earbuds **EB-OPEN-BLK**, and rewrites the title of an existing one, **EB-PRO-BLK**. Then it translates the new listing for Germany, France and Spain. Flow of the Listing Drafts tab. 1 Start a row with Copy Winner, Fetch by ASIN or Fetch by SKU, or type it. 2 Guide the AI with Instructions and Draft Keywords. 3 Write with one of three buttons: Image → Listing (AI) for a full listing from the photo, Optimize Listing (AI) to rewrite the Draft Listing, Optimize Title (AI) for the title and highlight only. 4 Review and edit the AI columns — Item Name Chars turns amber over 74. Other languages go to Translate Listing (AI). Then Send to Publish Queue, choose the Operation Type and validate ## Before you start [#before-you-start] * Connect your store at [sellersheetai.com](https://sellersheetai.com/home) and install the sidebar ([Install & first sync](/help/sheets/install)). * In the sidebar's **Catalogs** panel, click **Catalog** under **Resources** to open the **SellerSheet Catalog** spreadsheet. Go to the **Listing Drafts** tab and expand the **Listing Drafts** group in the sidebar. * The AI buttons are billed from your **Credits** balance, and refunded if a call fails. ## The tab [#the-tab] From row 4, one draft per row. Columns with ✎ are yours; the AI columns are written by the buttons, and you can edit them. | Columns | What goes there | | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Store ✎, SKU ✎, ASIN ✎** | The target store, the SKU you will list under, and a reference ASIN (a competitor's, or your own). | | **Image** | The product photo, filled by a fetch. You can also type image URLs, separated by commas. | | **Product Type ✎** | Amazon's product type. A fetch fills it. | | **Instructions ✎** | What the AI must know: facts, tone, audience, what to stress. | | **Draft Listing ✎** | Copy to start from — a competitor's or your own listing. A fetch fills it. | | **Draft Keywords ✎** | Search terms the copy should use, separated by commas or lines. | | **AI Item Name … AI Generic Keyword** | The AI's listing: title, highlight (the short line Amazon shows below the title), five bullets (one per line), description and backend search terms. | | **AI PPC Keywords** | Short-, mid- and long-tail ideas for your ad campaigns. Not sent to the listing. | | **A+ Idea, Image Idea** | An outline of 4–5 A+ modules, and a brief for seven product photos, main image first. Not sent to the listing. | | **Item Name Chars, Highlight Chars, Bullet Chars** | Live character counts. | | **Action ✎** | Stamped `SENT → Publish Queue row N` when you send the row. | ## Write a new listing [#write-a-new-listing] ### Start the row [#start-the-row] The fastest start is the winner of your [competitor research](/guides/research-amazon-competitors-in-google-sheets). On **Catalog Research**, type your SKU in the winner row (row 4) and click **Copy Winner to Drafts**. A new row appears here with the store, your SKU, the competitor's ASIN, image, product type and copy. Other ways to start: * **Fetch by ASIN:** type the store and a reference ASIN, then click it. Every row with a store, an ASIN and an empty Image fills its image, product type and Draft Listing. * **Type it:** fill the store, SKU and product type, and paste in **Image** a public link that opens the photo itself. If the ASIN is a competitor's, you can clear the ASIN cell once the row is filled. The AI buttons don't use it, and **Send to Publish Queue** would copy it to the Publish Queue. ### Guide the AI [#guide-the-ai] Write in **Instructions** what only you know: `Open-ear, 32H battery, IPX5. Sporty tone, no medical claims.` Put the search terms you want in **Draft Keywords**: `open ear earbuds, ear hook headphones`. ### Click the row, then an AI button [#click-the-row-then-an-ai-button] Pick the button by what the row has: no copy yet, **Image → Listing (AI)**; copy in Draft Listing, **Optimize Listing (AI)**; only the title to fix, **Optimize Title (AI)**. Click any cell in the draft row (row 4 or below), then: * **Image → Listing (AI)** writes a complete listing from the photo, the Instructions and the Draft Keywords. The AI must use every Draft Keyword. It doesn't read Draft Listing. * **Optimize Listing (AI)** rewrites the Draft Listing — the competitor's copy, say — into your own, using the photo, Instructions and Draft Keywords. The sidebar says **AI listing written.** The AI columns fill: title, highlight, five bullets, description, backend search terms that use Amazon's 250-byte budget, PPC keyword ideas, and the A+ and image ideas. Each click replaces that row's AI columns, including your edits. For EB-OPEN-BLK the start of it could read: | Field | Example | | ----------------------- | ------------------------------------------------------------------------- | | AI Item Name | myBrand Open Ear Earbuds, Bluetooth 5.3, 32H Playtime, IPX5, Sport, Black | | AI Item Highlight | Open-Ear Comfort, Secure Ear Hooks | | AI Bullet Point (first) | OPEN-EAR DESIGN — hear the traffic around you while the music plays | ### Review the copy [#review-the-copy] Two Listing Drafts rows. EB-OPEN-BLK, written with Image → Listing (AI), has a 73-character AI Item Name. EB-PRO-BLK's title was lengthened by hand to 96 characters: its Item Name Chars cell shows 96 in amber and is outlined Read and edit the AI columns like any cell. Watch the counts: * **Item Name Chars** turns amber over 74 — Amazon shows the Item Highlight only when the title is shorter than 75 characters — and red over 200. * **Highlight Chars** turns amber over 125, Amazon's limit for the Item Highlight. ### Send to Publish Queue [#send-to-publish-queue] 1. On the **Publish Queue**, type the same store in **A3** and the language in **B3**. Type the product type in **D7** and click **Get Template** — only columns already on the Publish Queue receive copy. Then clear **D7**, so the next step can use that row. 2. Back on Listing Drafts, click the row and click **Send to Publish Queue**. The SKU, product type, ASIN and AI copy go into the first empty Publish Queue row, and **Action** is stamped. 3. On the Publish Queue, choose `UPDATE` in **Operation Type** for a new listing. Fill the brand, the product ID and the other required columns (their names are gold), then **Validate (Preview)**. See [Bulk create & revise](/guides/bulk-create-revise-amazon-listings-in-google-sheets). The draft's ASIN lands in the Publish Queue's **Merchant Suggested ASIN**. If it is a competitor's, clear that cell before you validate. Left in place, it lists your SKU on the competitor's product. Fill your own **External Product ID** instead. ## Rewrite a listing you already sell [#rewrite-a-listing-you-already-sell] 1. Type the store and your SKU (**EB-PRO-BLK**) on a row and click **Fetch by SKU**. The row fills with your live copy in Draft Listing, its product type, image and ASIN. 2. Write what to change in **Instructions**, then click **Optimize Listing (AI)** for all the copy, or **Optimize Title (AI)** for the title and highlight only. 3. **Send to Publish Queue**, then choose `PARTIAL_UPDATE` on the Publish Queue: it changes only the cells you send and keeps the rest of the listing. Here the ASIN is your own, so keep it — a `PARTIAL_UPDATE` needs it. **Optimize Title (AI)** works from the AI columns, and from Draft Listing only while the AI columns are empty. Like every AI button, it keeps the title under 75 characters so the highlight shows. ## Translate for other marketplaces [#translate-for-other-marketplaces] The Listing Drafts · Translations tab: three rows for EB-OPEN-BLK — myStore-DE with de_DE and a German title, Status OK; myStore-FR with fr_FR and a French title, Status OK; and myStore-ES with es_ES, its Status empty and outlined, waiting to be translated 1. On the **Listing Drafts · Translations** tab, add one row per language. **Store:** your store name with the target country code, such as `myStore-DE`. **SKU:** the same SKU as the draft. **Locale:** pick it from the dropdown, such as de_DE. Leave **Status** empty. 2. On **Listing Drafts**, click the draft row and click **Translate Listing (AI)**. One call translates every waiting language and marks each row `OK`. It translates the listing copy in the AI columns as it is now, your edits included. 3. To send a translation, set the Publish Queue's **A3** to `myStore-DE` and **B3 Listing Locale** to de_DE. Then click its row on the Translations tab and click **Send to Publish Queue**. To translate a language again, clear its Status and click Translate Listing (AI) again. ## Set the lengths you want [#set-the-lengths-you-want] In the sidebar's **Settings** tab, **AI Length Preferences** sets the longest copy the AI writes. Change a value and click **Save preferences**. | Setting | Range | Default | | ------------------- | -------- | ------- | | Item Name | 45–75 | 75 | | Item Highlight | 65–125 | 115 | | Bullet Point (each) | 100–200 | 200 | | Product Description | 300–1000 | 1000 | The AI writes up to the limit, but an AI title always stays under 75 characters, so the highlight shows: at the default it aims for 65–74. Set Item Name lower for shorter titles. ## Tricks [#tricks] * **One row per click.** The AI buttons and Send to Publish Queue work on the row you clicked, the top one if you selected several. The fetch buttons do every waiting row at once. * **Fetch again:** a fetch runs only on rows whose **Image** is empty. Clear Image to fetch a row again — and note that a fetch overwrites Draft Listing and Product Type, so type your own changes after fetching. * **Several photos:** type their URLs in Image, separated by commas. Image → Listing (AI) and Optimize Listing (AI) send them all. * **Sending twice adds two rows.** Send to Publish Queue always uses a new, empty row; check **Action** to see which drafts already went. ## Frequently asked questions [#frequently-asked-questions] ### Do the AI buttons cost credits? [#do-the-ai-buttons-cost-credits] Yes. Each click of an AI button is billed from your Credits balance, and refunded if the call fails. Translate Listing is billed per language. The fetch buttons and Send to Publish Queue are free. ### Which row does an AI button work on? [#which-row-does-an-ai-button-work-on] The row you clicked — one row per click. If several rows are selected, the top one is used. Click a draft row, row 4 or below, before you click the button. On rows 1–3 the button stops before any credit is used. ### Why is my AI title amber? [#why-is-my-ai-title-amber] Item Name Chars turns amber over 74 characters, because Amazon shows the Item Highlight only when the title is shorter than 75 characters. Shorten it by hand, or run Optimize Title (AI), which rewrites it under 75. ### Does Send to Publish Queue publish the listing? [#does-send-to-publish-queue-publish-the-listing] No. It copies the SKU, product type, ASIN and AI copy into the first empty Publish Queue row. You choose the Operation Type there, add the product ID and the other required columns, validate, and publish. # Catalog (https://sellersheetai.com/help/app/catalog) > The Amazon and noon catalog screens, and a new noon listing. The catalogs show the listings you already have on Amazon and on noon, each with the local SKU it is mapped to in [Products](/help/app/products). **New noon listing** creates a listing on noon from the app. What each control changes: | Effect | Meaning | | -------------------------------- | -------------------------------------------------------------- | | | Reads or opens something — changes nothing on Amazon or noon. | | Changes SellerSheet | Saved in your SellerSheet workspace only — a mapping, a draft. | | Live on noon | Changes your live noon listing, price or stock. | | | Paid from your Credits balance; refunded if it fails. | Nothing in the Amazon Catalog changes your Amazon listings. ## Amazon Catalog [#amazon-catalog] One store's Amazon listings, from its newest listings report: Amazon's images and status, FNSKUs, image coverage and the local SKU. The report's date shows under the list (**listings report of** *date*). No store yet? **Go to Stores** connects one. ### Filters and views [#amazon-filters] | Control | What it does | Effect | | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Columns** | Shows or hides columns. | | | **View** — **Families** · **SKUs** | One row per variation family (open it for its SKUs), or one row per SKU. 50 per page. | | | **Store** | The store and marketplace to show. A marketplace **not activated on your plan** still shows its last report, which is no longer updated. | | | **Status** | **Active**, **Inactive** or **Incomplete** — the listings report's own words. | | | **Buyable** | **Yes** or **No** — whether Amazon said the listing is buyable when last checked. | | | **Sort** | **SKU, A to Z** or **Open date, newest**. | | | **Search SKU, ASIN or title** | At least 3 characters. | | | **Show all** · **Family** | A family shows its first SKUs; **Show all** lists every SKU of it, and a **Family** filter appears. Clear it to go back. | | ### Refresh from Amazon [#refresh-from-amazon] | Control | What it does | Effect | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Refresh from Amazon** | Reads the selected SKUs from Amazon now — up to 20 at a time: their issues, whether they are buyable, and when they were last updated. Nothing is stored. Needs the store's Amazon authorization and an SP grant on it (not Ads only). | | ### Columns and row actions [#amazon-rows] Families: **Image**, **Product**, **Parent ASIN**, **SKUs**, **Buyable**, **Price**, **Image coverage** (slots and main images), **Studio** (a plan's step, e.g. Draft · Copy), **Local SKU**. SKUs: **Image**, **Product**, **MSKU / ASIN**, **FNSKU**, **Status**, **Amazon** (**Buyable**, **Discoverable**, **Not buyable**, **Not checked**, **Not on Amazon**), **Issues** (read by Refresh from Amazon; **Not read** until then), **Price**, **Qty**, **Fulfillment** (**FBA** or **Seller (FBM)**), **Opened**, **Local SKU**. | Control | What it does | Effect | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Suggested** → **Confirm** | Your SKU has this MSKU — confirm to map them. | Changes SellerSheet | | **Map** | **Map to a product**: pick a **Product SKU** (search SKU, name or SPU, at least 3 characters) → **Map**. Needs write access to the store. | Changes SellerSheet | | **Create product** | On a SKU or a family not yet mapped: opens [Add product](/help/app/products#add-product) filled from the listing — a parent with children becomes a product with variants. Nothing is saved until you save the product; its SKUs are then mapped to the listings. Needs write access to the store and the right to change products. | | ## noon Catalog [#noon-catalog] One noon account's listings in noon's newest Catalog Export, and your noon drafts. **Refresh** reads a row's content and QC from noon now. The owner and the admins see it, and so do members given a noon account. A member with read-only access sees the lists without the buttons that change anything. ### Filters [#noon-filters] | Control | What it does | Effect | | ------------------------------------ | ------------------------------------------------------------------ | ----------------------------- | | **Columns** | Shows or hides columns. | | | **Kind** — **Listings** · **Drafts** | Your listings on noon, or your drafts in SellerSheet. 50 per page. | | | **Account** | The noon account and marketplace to show. | | | **Status** | **Live** or **Not live**. | | | **Issue** · **Family** | Listings with one of noon's reasons, or of one family. | | | **QC** | **Approved**, **QC pending** or **Rejected**. | | | **Mapping** | **Mapped** or **Not mapped** to a local SKU. | | | **Search noon listings** | Partner SKU, noon SKU or title — at least 3 characters. | | ### Toolbar [#noon-toolbar] | Control | What it does | Effect | | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **New listing ▾ → Blank** | Opens [New noon listing](#new-noon-listing) for this account and marketplace. | | | **New listing ▾ → From Amazon** *marketplace*… | **New noon listing from Amazon**: pick the **Amazon store**, find the listing by **Seller SKU** or **ASIN**, choose the **noon account and marketplace** → **Create draft**. Its category, attributes, sizes and images become a noon draft — one per colour — for you to check and submit. Free: no AI runs. | Changes SellerSheet | | **Import from Amazon** | Pick an **Amazon store** and up to 50 **Amazon families**, and the noon account and marketplace → **Import N families**. Each family becomes noon drafts, one per colour. Free: no AI runs. It runs as a job — close the dialog and keep working; **Open drafts** when it is done. | Changes SellerSheet | | **Refresh** | Reads content, QC and offers of the selected rows from noon now — up to 50 at a time. | | | **Map** | One unmapped row selected: **Map to a local SKU** — search SKU, SPU or name → **Map**. | Changes SellerSheet | | **Unmap** | Ends the links of the selected mapped rows after you confirm. Nothing changes on noon. | Changes SellerSheet | ### Listings — columns and row actions [#noon-listing-rows] Columns: **Image**, **Partner SKU / noon SKU**, **Title**, **Family**, **Category**, **Price / sale**, **Stock FBN / XDock**, **Status**, **QC**, **Content EN / AR** (completeness), **Local SKU**, **Report date**. | Control | What it does | Effect | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Edit** | Opens the listing in the [noon listing form](#edit-a-noon-listing). If SellerSheet does not hold the listing yet, **Refresh** it first. | | | **Map** · **Unmap** | As in the toolbar, for this row. | Changes SellerSheet | ### Drafts — columns and row actions [#noon-drafts] Columns: **Image**, **Draft**, **Category**, **Partner SKUs**, **Marketplace**, **Updated**, **Status**. | Control | What it does | Effect | | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Edit** (or **Open listing** once submitted) | Opens the draft in the noon listing form. | | | **Submit** | **Create this listing on noon?** — the draft is sent to noon as a new listing; noon reviews its content before it goes live. | Live on noon | | **Delete** | Deletes the draft after you confirm. Nothing changes on noon. | Changes SellerSheet | ## New noon listing [#new-noon-listing] A form for a new listing on one noon account and marketplace. You need write access to a noon account. ### Where and what [#noon-step-listing] Choose the **noon account and marketplace**, the **Brand** and noon's **Category**. The category's attributes and limits fill the form. ### Partner SKUs and attributes [#noon-step-attributes] Add one row per size under **Partner SKUs and sizes**, then fill the category's **Attributes** — the required ones first. ### Copy and images [#noon-step-copy] Write the English and Arabic title, bullets and description. Add images — slot 1 is the main image. ### Create [#noon-step-create] **Create on noon**. noon fetches and reviews the images in about 15 minutes; until then it reports no image. Not ready? **Save as draft** and finish later from the Drafts list. ### Every control [#noon-form-controls] | Control | What it does | Effect | | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **noon account and marketplace** | Where the listing is sold. Only accounts you can write are offered. | | | **Brand** | The listing's brand. | | | **Category** | noon's category — search and pick. Changing it drops the attributes the new category does not have, and says which. | | | **Partner SKUs and sizes** — **Partner SKU** · **Size** · **Add row** · **Remove row** | One row per size; a family of sizes needs a size on every row. Each partner SKU once. | | | **Attributes** — **Mandatory** · **Facets** · **Optional** | The category's attributes with noon's own limits. **N required left** counts what is still missing. | | | **Listing copy** — **English** · **Arabic**: **Title**, **Bullets** (**Add bullet**), **Description** | The copy in both languages. **Copy from** *language* replaces one language's copy with the other's, after a confirm. | | | **Generate with AI** | Writes the English and Arabic title, bullets and description, with an optional **Instruction**. On a new listing, save the draft first. | | | **Images** — **Image URL** → **Add** · **Upload a file** · move · **Replace** · **Remove** | noon's image slots; slot 1 is the main image. Paste an https\:// link or upload a file. On an existing listing, noon keeps the images it holds until another image replaces them — only an image added here can be removed. | | | **Save as draft** | Saves the form as a draft in SellerSheet; find it under **Kind → Drafts**. | Changes SellerSheet | | **Create on noon** | Creates the listing on noon. It waits until a category is picked, at least one partner SKU is added, and no field noon would refuse (in red) is left. | Live on noon | | **Open the listing** · **Update this listing instead** | When a partner SKU already exists on noon: open that listing, or replace it with this form's content after a confirm — noon reviews it again. | Live on noon | Editing the form changes nothing until you save, create or update. ### Edit a noon listing [#edit-a-noon-listing] **Edit** on a listing or a draft opens the same form. | Control | What it does | Effect | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Save draft** | A draft: saves your changes. | Changes SellerSheet | | **Submit to noon** | A draft: creates the listing on noon. A submitted draft is kept as it was sent — edit its listing instead. | Live on noon | | **Generate with AI** | A draft: writes the copy and saves it in the draft. A listing: writes the copy from the listing's content on noon — review it, then save to noon. | | | **Save to noon** | A listing: replaces its content on noon with this form's; noon reviews it again. Partner SKUs cannot be changed here. | Live on noon | | **On noon → Refresh** | A listing: reads completeness, QC, noon's errors and its image review from noon now. | | | **Price** — **Partner SKU to price and stock**, **Price**, **MSRP**, **Offer on** *country* (**Not changed**, **Active**, **Not active**) → **Save prices** | Sets the price per country; an empty cell is not changed. | Live on noon | | **Stock** — **Warehouse**, **Quantity**, **Processing time (days)** → **Set stock** | Sets the stock of one partner SKU in one warehouse. | Live on noon | A listing noon made itself cannot be read from noon, so its form is read-only. ## Related [#related] * [Products](/help/app/products) — your local SKUs, and creating a product from a listing. * [How to Connect noon to SellerSheet](/guides/connect-noon-to-sellersheet) — before the noon Catalog shows anything. * [Selling on noon](/docs/mcp-api/workflows/noon) — the same noon work with your AI. * [View & search listings](/docs/mcp-api/workflows/listings-view) — Amazon listings with your AI. * [noon Listings panel](/help/sheets/noon/listings) — noon listings, pricing and stock in the Google Sheets sidebar. * [How to Fetch Live Amazon Listings in Google Sheets](/guides/fetch-live-listings-in-google-sheets) — Amazon listings in a sheet. ## Stuck? [#stuck] * An error message in the app: [Web app troubleshooting](/help/troubleshooting/app). * Still stuck: [Contact support](/help/contact). # Home (https://sellersheetai.com/help/app/home) > The Home screen of the SellerSheet app. Home is the first screen after you sign in: a setup guide until your workspace is ready, then your plan, stores, Credits, invitations and this month's usage at a glance. ## Main steps — get your workspace ready [#main-steps] The **Setup guide** walks you through four steps, about 5 minutes in all. A member — not the owner or an admin — sees steps 3 and 4 only, because the owner connects the stores. So does someone whose own workspace is empty while they are invited to, or belong to, another one. 1. **Connect your Amazon store** — Seller or Vendor Central, your region and marketplaces, a short store name. Amazon then asks you to confirm. [Step 1](#step-1-connect-your-amazon-store) 2. **Connect Amazon Ads** — lets SellerSheet read campaigns and reports. Skip it if you don't run ads. [Step 2](#step-2-connect-amazon-ads) 3. **Install the sidebar & share folder** — the Google Sheets add-on, your SellerSheet folder in Drive, and a connection check. [Step 3](#step-3-install-the-sidebar--share-folder) 4. **Connect your AI client** — Claude, Claude Code, Codex or ChatGPT. You sign in; there is no key to copy. [Step 4](#step-4-connect-your-ai-client) Each step shows **Done**, **Now**, **Up next** or **Skipped**. Step 4 ticks itself when your AI client makes its first call. ## Every control [#controls] What each control changes: | Effect | Meaning | | ------------------------------------------- | -------------------------------------------------------------------------------------------------- | | | Reads or opens something — changes nothing. | | Changes SellerSheet | Saved in your SellerSheet workspace only — nothing is sent to Amazon or noon. | | Changes Amazon access · Changes noon access | Sends you to Amazon's or noon's sign-in to authorize SellerSheet — your listings stay as they are. | Nothing on Home changes your Amazon or noon listings, and nothing on it uses Credits. ### Header [#header] | Control | What it does | Effect | | -------------------- | --------------------------------------------------------------------------------- | ----------------------------- | | **Show setup guide** | Brings the setup guide back after you hid it. Shown whenever the guide is hidden. | | When you arrive from connecting a store, a one-time sentence at the top says how it went. ### Invitations [#invitations] Shown first when another workspace has invited you. | Control | What it does | Effect | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | | **Accept** | Opens **Join** *workspace*. Optionally give each shared store **Your name for it (optional)** — only you see it. Confirm to join and reach the stores they shared. | Changes SellerSheet | | **Decline** | Asks you to confirm, then declines. They would have to invite you again. | Changes SellerSheet | ### Setup guide [#setup-guide] | Control | What it does | Effect | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ----------------------------- | | **Hide** | Hides the guide in this browser. When every step is done, the guide starts hidden. | | | Step chips **1 · Connect store** … **4 · Connect AI client** | Open that step beside the walkthrough video. **Progress N of M complete** counts the done steps. | | ### Step 1 · Connect your Amazon store [#step-1-connect-your-amazon-store] The store's name becomes its ref everywhere — in the sidebar and with your AI — for example `myStore-US`. Only the owner or an admin can connect a store. | Control | What it does | Effect | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | | **Add a store** | Opens the Add Amazon Store dialog: Seller or Vendor Central, region, marketplaces, a store name. Amazon then asks you to confirm, and you come back to Home. The dialog is described on [Stores & Marketplaces](/help/app/settings/stores). | Changes Amazon access | | **Selling on noon? Connect noon instead** | Opens the dialog to connect a noon account instead. | Changes noon access | ### Step 2 · Connect Amazon Ads [#step-2-connect-amazon-ads] Unlocks after step 1. Only the owner or an admin can authorize Ads. A workspace that sells on noon only has nothing to connect here. | Control | What it does | Effect | | -------------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Store** | The store to authorize Ads for. | | | **Authorize Ads** | Opens Amazon. You pick the advertising account, then you are back here. | Changes Amazon access | | **I don't run ads — skip** | Marks the step skipped for you. You can authorize Ads any time on [Stores & Marketplaces](/help/app/settings/stores). | Changes SellerSheet | ### Step 3 · Install the sidebar & share folder [#step-3-install-the-sidebar--share-folder] | Control | What it does | Effect | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Install add-on** | Opens the SellerSheet add-on on Google Workspace Marketplace in a new tab. Then open any Google Sheet and choose **Extensions → SellerSheet → Open Sidebar**; the sidebar creates your SellerSheet folder in Drive. | | | **New Google Sheet** | Opens a new, empty Google Sheet in a new tab. | | | **Automation address** | Copies `automation@sellersheetai.com`. In Drive, share your SellerSheet folder with it as **Editor**, so reports and your AI can write to your sheets. | | | **Verify connection** | Checks that the sidebar saved your folder and that the automation address can open it. The answer appears under the button. | | ### Step 4 · Connect your AI client [#step-4-connect-your-ai-client] | Control | What it does | Effect | | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Claude** · **Claude Code** · **Codex** · **ChatGPT** | Show the steps for that client: add the SellerSheet plugin (or, for ChatGPT, copy your **MCP URL**), then sign in with OAuth. | | | Copy fields — **Plugin repository**, **Commands**, **Sign-in command**, **MCP URL** | Copy the text to paste into your client. | | | **Test the connection** | Shows a first prompt to send: "Show me my Amazon Seller Central sales for the last 7 days." The step ticks itself on your client's first call. | | | **Create an API key** | Opens **Settings → API & MCP**, for a script or another client (Cursor, Gemini, VS Code…). See [Keys & store access](/docs/mcp-api/keys). | | | **Full MCP setup docs** | Opens the MCP setup documentation. | | The sign-in reaches every workspace you belong to — your own stores and the ones shared with you. No API key is needed. Step-by-step for each client: [Connect an AI client](/docs/start/clients). ### Plan, Stores, Credits and Shared with me [#cards] | Card | What it shows | Its link | | ------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | | **Plan** | Your plan's name and status — **Active**, **Expired** or **No subscription** — and when it ends. | — | | **Stores** | How many **Amazon stores** and **noon accounts** the workspace has. | **Stores & Marketplaces** → [Stores & Marketplaces](/help/app/settings/stores) | | **Credits** | Your Credits balance and the **Model route** your AI actions run on. | **Billing & Credits** → [Billing & Credits](/help/app/settings/billing) | | **Shared with me** | How many invitations wait for you, or **No invitations**. | **Review invitations** jumps to [Invitations](#invitations). | All four only read. If the setup guide and usage cannot load, the cards still show and Home says **Your setup guide and usage could not load**. ### Usage [#usage] This organization's plan, this month: | Meter | What it counts | | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | **Orders this month** | Orders against your plan's cap, marked **Within plan**, **Near the cap** or **Over the cap**, with the date it resets. | | **Amazon stores** | Connected Amazon stores against the cap. | | **Team seats** | Seats in use, pending invitations included. | | **Marketplaces (Amazon and noon)** | Synced marketplaces of Amazon stores and noon accounts on one cap. | A bar turns amber from 80% of its cap and red at the cap. **no cap** means the plan does not limit it. The caps of each plan are on [Plans and prices](/#pricing). ### Learn [#learn] | Control | What it does | Effect | | ----------------- | ------------------------------------------------------------------------------ | ----------------------------- | | **Skills** | Opens the skills — ready-made AI workflows for Amazon and noon — in a new tab. | | | **Documentation** | Opens the guides for the Sheets add-on, MCP and the API in a new tab. | | ## Related [#related] * [Quick start](/docs/start/quickstart) — account, store, AI client and first request. * [Connect your store](/docs/start/connect) — Amazon, Ads and noon, and the marketplaces that sync. * [Connect an AI client](/docs/start/clients) — every client, step by step. * [Install & first sync](/help/sheets/install) — the Google Sheets sidebar. * [Keys & store access](/docs/mcp-api/keys) — MCP keys and API keys. * [Billing & Credits](/help/app/settings/billing) — what uses Credits, and the plan's limits. ## Stuck? [#stuck] * An error message in the app: [Web app troubleshooting](/help/troubleshooting/app). * Still stuck: [Contact support](/help/contact). # Tour of the app (https://sellersheetai.com/help/app) > What the SellerSheet web app is for, beside your AI client and the Google Sheets sidebar. The SellerSheet web app is where you connect your stores, run your team and billing, keep your own product library, and make listing content in Studio. Sign in at [sellersheetai.com/home](https://sellersheetai.com/home). ## The screens [#screens] In the order of the left menu. Each name opens its help page. | Screen | What it is for | | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | [Home](/help/app/home) | The setup guide until your workspace is ready; then your plan, stores, Credits, invitations and this month's usage. | | [Products](/help/app/products) | Your own product library — SPU, SKUs, variants, sizes, costs, images — and the Amazon and noon listing each SKU is mapped to. | | [Amazon Catalog](/help/app/catalog#amazon-catalog) | One store's Amazon listings from its newest listings report, with status, image coverage and the local SKU. | | [noon Catalog](/help/app/catalog#noon-catalog) | One noon account's listings from noon's newest Catalog Export, and your noon drafts. Shown to the owner, the admins and members given a noon account. | | [New noon listing](/help/app/catalog#new-noon-listing) | A form for a new noon listing: category, attributes, English and Arabic copy, images. | | [Studio](/help/app/studio) | One plan per product: buyer insights, listing copy, images and A+, then publish to Amazon or noon. | | [Image Library](/help/app/studio#image-library) | Every image made in Studio, your own gallery and the reference gallery. | | Settings → [Organization](/help/app/settings/organization) | The workspace's name and address, its owner, plan and seats; transfer ownership or leave. | | Settings → [Stores & Marketplaces](/help/app/settings/stores) | Connect Amazon, Amazon Ads and noon; choose the marketplaces that sync. | | Settings → [Members](/help/app/settings/members) | Invite teammates and set what each one may see and change on each store. | | Settings → [API & MCP](/docs/mcp-api/keys) | The keys your AI clients and your own code use. | | Settings → [Webhooks](/help/app/settings/webhooks) | Amazon's notifications about your stores, delivered to your team chat or your own system. Owner and admins. | | Settings → [Billing & Credits](/help/app/settings/billing) | Plan, Credits, the model route, invoices and the Credits ledger. | | Settings → [Affiliate](/help/app/settings/affiliate) | Your partner codes, statement and payout. Shown to partners. | ## Around every screen [#around-every-screen] * **Tabs** — every page you open becomes a tab at the top. Pin the ones you keep coming back to. * **Search…** — bottom left of the menu, or ⌘K (Ctrl+K on Windows): jump to a page, a product, a store or an action. * **Appearance** — light or dark, notifications, and the language switch EN | 中. * **Your profile card** — its menu switches between the **Organizations** you belong to, has **Create organization** (a new workspace with its own stores, members, plan and Credits), and **Log out everywhere** (signs you out on every device). ## When to use which [#when-to-use-which] One set of tools sits behind all three. Pick by the job. | You want to… | Use | Why | | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Ask a question, analyse, or run a job of many steps | **Your AI** over MCP — Claude, ChatGPT, Cursor or any MCP client | Your own AI calls SellerSheet's tools on Amazon's official APIs and reports back. It can change a store only where you gave it [write access](/docs/mcp-api/control). [Get started →](/docs/start) | | Edit many rows at once and keep the record in a spreadsheet | **Google Sheets sidebar** | Each button is one step of a workflow — FBA shipments, ads, store reports, the Publish Queue — on template sheets in your own Drive. [How the sidebar works →](/help/sheets) | | Set up and run the workspace | **Web app** | Stores, members, keys, webhooks, plan and Credits are managed here. | | Keep one product library, make a listing's copy and images step by step, browse a catalog | **Web app** | Products, Studio and the catalogs are screens of the app. Your AI can make listing images too, with the [AI image tools](/docs/mcp-api/workflows/images). | ## Stuck? [#stuck] * An error message in the app: [Web app troubleshooting](/help/troubleshooting/app). * Still stuck: [Contact support](/help/contact). # Products (https://sellersheetai.com/help/app/products) > The Products screen: your product library, new products and variants. Products is your own product library in SellerSheet: one row per SKU, with the Amazon and noon listings each SKU is mapped to. A product (SPU) is a single item with one SKU, or a product with variants — one SKU per colour or size. The menu has three entries: **Product list**, **Variants list** and **Add product**. Opening a product shows its [product page](#product-page). **Who can change products:** the owner, an admin, or a member with write access to one of the workspace's stores or noon accounts. Everyone else can read them. Mapping a listing needs write access to that listing's store. ## Main steps — add a product with variants [#main-steps] ### Choose the kind [#step-kind] **Add product ▾ → Product with variants**. ### Basic info [#step-basic-info] Fill in at least the **SPU** and the **Name**, then **Next**. The SPU must be unique in your workspace. ### Attributes [#step-attributes] Tick the values the product comes in — for example colour Red and Blue, size S and M. Each combination becomes one SKU. Missing a value? Add it under the attribute; it stays in your library. Then **Make N SKUs**. ### SKUs [#step-skus] Check the SKU codes and names, fill in costs, sizes and weights — **Apply to all** copies a number to every row — and set the **Cost currency**. Then **Save product with N SKUs**. ### Map the listings [#step-map] The product page opens. Use **Map ▾** to link each SKU to its Amazon or noon listing, or confirm the suggestions SellerSheet found. Already selling the product? Start from its listing instead: **Create product** on the [Amazon Catalog](/help/app/catalog#amazon-catalog) fills the form from the listing and maps each SKU to it. ## Every control [#controls] What each control changes: | Effect | Meaning | | ----------------------------- | ----------------------------------------------------------------------------- | | | Reads or opens something — changes nothing. | | Changes SellerSheet | Saved in your SellerSheet workspace only — nothing is sent to Amazon or noon. | Nothing on Products changes your Amazon or noon listings, and nothing on it uses Credits. ### Product list — filters [#list-filters] **Product list** shows one row per SKU, 50 per page. | Control | What it does | Effect | | ------------------------ | --------------------------------------------------------------------------------------------------- | ----------------------------- | | **Columns** | Shows or hides columns. | | | **Kind** | **All**, **Single** or **With variants**. | | | **Category** · **Brand** | Your own categories and brands. | | | **Status** | **Draft**, **On sale** or **Off sale**. | | | **Amazon** · **noon** | **Mapped** or **Not mapped** on that channel. | | | **Updated** | **In the last 7 / 30 / 90 days**. | | | **Search products** | Search SKU, ASIN, Z-SKU or name — at least 3 characters — or paste whole SKUs, up to 200 at a time. | | | **Clear filters** | Removes every filter. | | ### Product list — toolbar [#list-toolbar] Shown to people who can change products. Tick rows to act on them; the count at the right becomes **N selected · Clear selection**. | Control | What it does | Effect | | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Add product ▾** | **Single product** or **Product with variants** — opens [Add product](#add-product). | | | **Edit** | For the selected SKUs: set the **SKU status**, **Add a tag to their products** or **Remove a tag from their products**. Only what you set changes. Above 200 SKUs it runs as a job — make one change at a time. | Changes SellerSheet | | **Sync images** | Copies each selected SKU's Amazon images — the main image and the gallery — into its own images. An image it already holds is skipped. Up to 50 SKUs per sync; only SKUs mapped to an Amazon listing. Runs as a job and shows synced, skipped and failed per SKU, with **Sync again**. | Changes SellerSheet | | **Tags ▾** | **Add tag** or **Remove tag** on the products of the selected SKUs. | Changes SellerSheet | | **More ▾ → Confirm all suggestions** | Confirms every suggested Amazon mapping on the stores you may map on, as a job. | Changes SellerSheet | | **Delete** | Deletes the selected SKUs after you confirm. A SKU still mapped to a listing is kept — unmap it first. Deleted codes stay reserved. | Changes SellerSheet | ### Product list — columns and row actions [#list-rows] Columns: **Image**, **Local SKU / SPU**, **Name / category**, **Amazon MSKU / ASIN**, **noon Partner SKU / Z-SKU**, **Variant**, **Cost**, **Supplier**, **Updated**. A **Suggested** mapping — your SKU code matches a listing's SKU — shows with **Confirm**. | Control | What it does | Effect | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Confirm** | Confirms the suggested mapping. | Changes SellerSheet | | **Edit** (or **Open**) | Opens the [product page](#product-page) — on **Basic info** if you can edit, read-only otherwise. | | | **Studio** | Opens the product's [Studio](/help/app/studio) plan. With no plan yet, it starts one that reads the product's first listing; a product listed nowhere opens **New plan** to choose a store. | Changes SellerSheet | | **Map ▾** | **Map an existing listing…** (see below), **Confirm on** *store*, **Unmap from** *store*. Unmap asks first; the old link stays in the product's activity. | Changes SellerSheet | | **⋯ → Duplicate** | Copies the product with its SKUs and images as a draft under a new SPU you name. Listings are not copied. | Changes SellerSheet | | **⋯ → Delete product** / **Delete SKU** | Deletes after you confirm. The codes stay reserved. | Changes SellerSheet | ### Map an existing listing [#map-an-existing-listing] Links a SKU to a listing you already have. | Control | What it does | Effect | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Store and marketplace** | The store (or noon account) and marketplace the listing is on. Only stores you have write access to are listed. | | | **SKU** | Your SKU to map, when the product has several. | | | **Listing** | Amazon: search the store's listings by MSKU, ASIN or title — at least 3 characters. They come from the store's latest listings report, or from Amazon live until that report has run. noon: search partner SKU, noon SKU or title in noon's newest Catalog Export. A listing mapped to another SKU cannot be picked. | | | **Map** | Saves the link. | Changes SellerSheet | ### Add product [#add-product] **Add product** in the menu first asks **What are you adding?** — **Single product** (one item, one SKU — e.g. a mug) or **Product with variants** (one product in several colours or sizes — one SKU each). A single product keeps one SKU; a product with variants can get more SKUs later. Started from an Amazon listing? A banner says **From the Amazon listing on** *store*: the SKUs are created mapped to that listing. Its images stay on Amazon — add your own here. ### Single product [#single-product] One page of cards, then **Save product**. Fields marked \* are required. | Card | Fields | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Basic info** | **SPU** \*, **Name** \*, **SKU code** (the SPU until you change it; unique in your workspace), **Brand**, **Category** (your own path, e.g. Home > Bath > Towels), **Product status**, **Tags** (comma-separated), **Amazon product type**, **noon category code**, **Notes** | | **Specs & logistics** | **Item**, **Package** and **Carton** — length, width, height, weight, **Pieces per package**, **Pcs per carton** — in cm or in, g or kg; **Identifiers**: **GTIN / EAN / UPC**, **HS code**, **Country of origin** (two letters, e.g. CN) | | **Sourcing** | **Cost**, **Cost currency** (three letters, e.g. CNY), **Supplier**, **Supplier link**, **Minimum order (MOQ)** | | **Images** | PNG, JPEG or WebP, uploaded when you save | | Control | What it does | Effect | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Cancel** | Back to the list; nothing is saved. | | | **Save product** | Creates the product and its SKU, then uploads the images. If an image fails, the product is still saved and the message names the image. | Changes SellerSheet | ### Product with variants [#product-with-variants] Three steps: **Basic info** → **Attributes** → **SKUs**. | Control | What it does | Effect | | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Basic info** → **Next** | The same fields as a single product's Basic info. The SKUs are made from the SPU and the values you tick next. | | | Attribute values | Tick the values this product comes in — one SKU per combination. | | | **New value** → **Add value** | Adds a value to an attribute in your library. | Changes SellerSheet | | **New attribute** + **Its first value** → **Add attribute** | Adds an attribute (e.g. colour) to your library. | Changes SellerSheet | | **Make N SKUs** | Builds one row per combination. | | | **Cost currency** | The currency of every row's cost (three letters). | | | SKU grid | **SKU code**, **Name**, **Variant**, cost, item, package and carton sizes and weights. Edit any cell. | | | **Add row** · **Remove row** · **Apply to all** | Add or remove a SKU row; copy a number from one row to every row. | | | **Back** | Back one step; your entries stay. | | | **Save product with N SKUs** | Creates the product and its SKUs, then opens its product page. | Changes SellerSheet | From an Amazon parent listing, the SKUs come from its children — each mapped to its listing, unless another SKU already holds it — and the Attributes step is skipped. ### Variants list [#variants-list] One row per product (SPU), 50 per page. Open a row to see its SKUs. | Control | What it does | Effect | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Columns** | Shows or hides columns. | | | **Search products** | Search SPU, SKU or name — at least 3 characters. | | | **Add product ▾** | As on the Product list. | | | Row | **Image**, **SPU / name**, **Kind**, **SKUs**, **Mapped on Amazon** and **Mapped on noon** (e.g. 2 of 3). Open it for each SKU's name, variant, listings, cost and update date. | | | **Edit** (or **Open**) | Opens the product page. | | | **Delete** | Deletes the product and its SKUs after you confirm. The codes stay reserved. | Changes SellerSheet | ### Product page [#product-page] The header names the product — SPU, name, status, SKU count, its Amazon and noon badges and the size range across its SKUs. | Control | What it does | Effect | | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------- | | **Open in Studio** | As **Studio** on the list: opens or starts the product's plan. | Changes SellerSheet | | **Add listing ▾ → Map an existing listing…** | Opens [Map an existing listing](#map-an-existing-listing). **Create a listing** is not available here yet. | Changes SellerSheet | | **Map ▾** | **Map on** *store*, or confirm a suggestion on *store*. | Changes SellerSheet | The tabs: | Tab | What you do there | Effect | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- | | **Overview** | Channel listings, product details, the SKUs, offers and activity on one page. | | | **Basic info** | Edit the product's fields. **Save** keeps only what you changed; **Undo changes** drops your edits. | Changes SellerSheet | | **Specs & logistics** | Sizes and weights of the item, package and carton, one row per SKU. **Save**. | Changes SellerSheet | | **Sourcing** | Cost, currency, supplier and MOQ, one row per SKU. **Save**. | Changes SellerSheet | | **Images** | Images of the whole product or of one SKU. PNG, JPEG or WebP, up to 15 MB each. Drag to reorder; the first is the main image. Remove asks first. | Changes SellerSheet | | **Channel listings** | Every marketplace the product is listed on, and the suggestions to confirm. Per row: **Edit** (a noon listing opens its form; editing an Amazon listing here comes later), **Refresh** (reads a noon listing from noon now), **Unmap**, **Confirm**. **Confirm all suggestions** confirms them all as a job. | Changes SellerSheet | | **Channel listings → Create on noon ▾** | **From Amazon** *store* (*SKU*)…, **From Amazon…** or **Blank** — makes a noon draft from this product; see [New noon listing](/help/app/catalog#new-noon-listing). | Changes SellerSheet | | **Offers** | Price, stock and status of each mapped listing in its channel's newest data — Amazon: the store's newest listings report; noon: the newest Catalog Export. | | | **Activity** | **Created**, **Updated**, **Mapped**, **Unmapped**. | | ## Related [#related] * [Catalog](/help/app/catalog) — your Amazon and noon listings, and creating a product from one. * [Studio](/help/app/studio) — copy, images and A+ for a product. * [Connect your store](/docs/start/connect) — the stores and marketplaces products map to. * [Stay in control](/docs/mcp-api/control) — who gets write access to which store. * [How to Bulk Create & Revise Amazon Listings in Google Sheets](/guides/bulk-create-revise-amazon-listings-in-google-sheets) — listings in bulk, from the sidebar. ## Stuck? [#stuck] * An error message in the app: [Web app troubleshooting](/help/troubleshooting/app). * Still stuck: [Contact support](/help/contact). # Affiliate (https://sellersheetai.com/help/app/settings/affiliate) > For SellerSheet partners: accept the terms, share your codes and links, follow your earnings and set where they are paid. **Settings → Affiliate** is a partner's statement: the people your codes brought, what you earned, your codes and their links, and where your earnings are paid. It belongs to you as a person, not to an organization. Only partners have it: until SellerSheet sets your account up as a partner, Settings shows no **Affiliate** item, and its address shows **Page not found**. ## How the program works [#how-it-works] * SellerSheet creates your partner codes. Each code may give the people who use it a discount. * Your link is the SellerSheet site with your code in it. The users attributed to you are counted under **Users you brought**. * When they pay, you earn a share of what they pay, for a number of months. Your share and the months are on the **Your codes** card. * Earnings are counted in US dollars; other currencies are shown apart, never added together. This is not **Refer a friend** on [Billing & Credits](/help/app/settings/billing#referral), which every user has and which rewards both sides with credits. ## Main steps [#main-steps] **Accept the partner terms.** Until you do, the screen shows the terms only. **Share your link.** **Copy** next to a code's **Link**. **Add your payout details** under **Payout**, so you can be paid. ## At the top of the page [#header] Your partner type next to the title: **Creator**, **Aggregator**, **Internal** or **Partner**. ## Partner terms [#terms] Shown until you accept them: *Accept the terms to see your codes, your statement and your payout details.* ### Accept the terms [#accept-terms] Records that you accepted the partner terms, then shows the statement. Who: **the partner** · Effect: **changes settings** (you accept an agreement) ## Your statement [#statement] | Figure | What it counts | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Users you brought** | Users attributed to you. | | **Users who earned you commission** | Of those, the users whose payments earned you commission. | | **Earned (USD)** | Your commission in US dollars. Earnings in other currencies are listed below it, apart. Clawed-back commission is not counted. | ## Your codes [#codes] The line under the title says your share and for how many months. Each code shows: * the code, **Active** or **Inactive**; * its discount, as a percent off, when it gives one, with an example of the discounted plan price; * **Link**: your link with the code in it. When you have none, the card says *No code yet — your partner manager creates them.* ### Copy [#copy] Copies the code's link. It says **Copied** when it worked. Who: **the partner** · Effect: changes nothing ## Payout [#payout] Where your earnings are paid. The line under the title shows the details on record, masked, and the date they were set; or *No payout details yet — add them to get paid.* * **Method**: **PayPal**, **Wise**, **支付宝** (Alipay) or **微信** (WeChat). * **Identifier**: what kind of account ID you give. PayPal and Wise take an e-mail address; 支付宝 an e-mail address, a mobile number or an account ID; 微信 a mobile number or an account ID. * **Account**: the address, number or ID itself — never a bank card number. * **Account holder's name**. ### Save [#save-payout] Saves the payout details. They are stored encrypted, and only masked versions are ever shown. **At most 10 changes an hour.** After any change, an e-mail goes to your partner contact address, and payouts are held for 7 days. If you did not make the change, reply to that e-mail at once. Who: **the partner** · Effect: **changes settings** ## Related [#related] * [Billing & Credits](/help/app/settings/billing#referral): **Refer a friend**, the credit reward every user has. ## Stuck? [#stuck] * [Web app errors](/help/troubleshooting/app): what each error means and the fix. * [Contact support](/help/contact) # Billing & Credits (https://sellersheetai.com/help/app/settings/billing) > AI actions — images, listing copy, buyer insights — are paid from one Credits balance, priced before they run and refunded when they fail. Plan limits say how fast and how much. ## The Billing screen [#the-billing-screen] **Settings → Billing & Credits** holds your organization's plan, its Credits balance and model route, its team seats, and your own referral link. Everyone in the organization can open it. Only the owner changes the plan and the seats. The owner and admins top up Credits, switch the model route and read the invoices and the ledger. A member sees the plan, the balance and the seats, read-only, and has their own referral link. The prices themselves are on the screen and on [Plans and prices](/#pricing); this page does not repeat them. Payments run through Stripe. A control marked **costs money** charges the card on file, or takes you to Stripe to pay. ### At the top [#billing-header] * The plan's name and *You are … of this organization.* * **Invoices** opens [Invoices](#invoices). Owner and admins only. * After you pay on Stripe, a banner says *Payment received — your plan updates within a minute.* or *Purchase received — your credits are added within a minute.* ### Plan [#plan] The card shows **Plan name**, **Status** (**Active**, **Expired** or **No subscription**), **Billing cycle** (**Monthly** or **Annual**) and **Renews**, or **Ends** once the plan is cancelled. A scheduled change reads *Changes to … on …*. Below are the plans, one card each: its price, what it includes, and **Current plan** on yours. A member reads *Only the organization's owner manages the subscription.* #### Payment details [#payment-details] On a paid plan. Takes you to Stripe's payment portal for this organization. Who: **owner** · Effect: changes nothing here #### Cancel plan [#cancel-plan] On a paid plan that is not already ending. Asks first: the plan stays active until its end date, then the organization moves to the Free plan. Who: **owner** · Effect: **changes the plan** #### Keep the current plan [#keep-plan] Shown while a change is scheduled. Withdraws the scheduled change; the current plan carries on. Who: **owner** · Effect: **changes the plan** #### Monthly · Annual [#cycle] Switches the plan cards between monthly and annual prices, and picks the cycle you buy or change to. A **Save** badge shows the annual discount when there is one. Who: **everyone** · Effect: changes nothing #### Promo code · Apply [#promo-code] **Apply** checks the code for the chosen cycle and says what it gives. The code is used when you then choose a plan. Who: **owner** · Effect: changes nothing until you choose a plan #### Upgrade to · Switch to [#choose-plan] On every plan card but yours, which reads *You're on this plan*. **Upgrade to** names a dearer plan; **Switch to** a cheaper one. * **Without a paid plan**, it takes you to Stripe Checkout for that plan and cycle, with the promo code you entered, if any. * **On a paid plan**, the change is worked out first. **Change to …** shows what it costs and when it applies; **Change plan** confirms. A dearer plan, or the same plan from Monthly to Annual, applies at once, prorated. A cheaper plan, or the same plan from Annual to Monthly, starts when the current period ends. * **A cheaper plan that cannot hold what you have** is refused with a list of what to remove first: stores, extra seats, members or pending invitations. Who: **owner** · Effect: **costs money**, **changes the plan** ### The Credits card [#credits-card] One prepaid balance for every AI action in this organization, from every member and key. How actions are priced and refunded: [Credits](#credits) below. * **Balance** and **Spent in 30 days**: everyone sees them. * **On this route**: the price of each meter on the current model route — **Images up to 1024 px** and **Images above 1024 px** (per image), **Listing copy** (per language), **Small text calls** (per call), **Buyer insights** (per report). #### Top up [#top-up] A row of amounts. Clicking one takes you to Stripe Checkout to pay it; the Credits are added within a minute of paying. Who: **owner, admin** · Effect: **costs money** #### View ledger [#view-ledger] Opens the [Credit ledger](#ledger). Who: **owner, admin** · Effect: changes nothing #### Model route [#model-route] The route your organization's AI actions run on. A member sees its name only. Picking another route asks first, *Switch the model route to …?*, and lists the prices it brings next to the current ones. **Switch route** applies it to every AI action in the organization, for every member and key, from then on. Who: **owner, admin** · Effect: **changes settings**, and the prices of later AI actions ### Team seats [#seats] A seat lets one more person work in the organization; the owner uses none. | Figure | What it counts | | ------------ | ------------------------------------------------------------------------------------------------------------------------------- | | **In use** | Members who have joined. | | **Reserved** | Invitations waiting; each holds a seat. **Invite someone →** under **Free** opens [Members](/help/app/settings/members#invite). | | **Free** | Seats left. | | **Total** | The plan's included seats plus the extra seats bought. | On a plan that cannot add seats, the card says *Seats come with the plan; a paid plan with a team can add more.* #### Change seats [#change-seats] Opens **Change extra seats**: **One seat fewer** / **One seat more** set the number of extra seats (up to 20). **Now** and **After** compare total and free seats, and the box below says what is charged today to the card on file (prorated), or that nothing is charged today and when the change takes effect. * More seats: **Confirm and pay**, charged at once. * Fewer seats: **Confirm change**. Nothing is refunded; you keep the seats until renewal, then pay less. You cannot go below the seats in use or reserved: remove a member or withdraw an invitation first. **How removing seats works** says the same. Who: **owner** · Effect: **costs money** when adding seats #### Keep … [#keep-seats] Shown while a decrease is scheduled (*Scheduled: extra seats … → … on …*). **Keep**, with your current number, cancels the decrease and keeps the extra seats you have. Who: **owner** · Effect: **changes the plan** ### Refer a friend [#referral] Your own referral link, not the organization's. When a friend you referred first pays, you each get Credits; the card says how many. #### Get my referral link [#referral-link] Creates your link the first time. From then on the card shows **Your referral link** with **Copy**, and three figures: **Friends referred**, **Rewards earned** and **Credits earned**. Who: **everyone** · Effect: creates your link ### Invoices [#invoices] **Invoices** at the top of the page. Owner and admins only; anyone else reads *Invoices are shown to the owner and admins.* * The total paid, at the top. * **Invoice lines**: **Date**, **Description**, **Amount** of every paid invoice line. * **Plan history**: every start, change and end of the subscription — **Date**, **Event** (**Started**, **Plan changed**, **Cancellation scheduled**, **Cancellation withdrawn**, **Renewed**, **Payment failed**, **Ended**, **Charged separately**), **Plan name**, **Billing cycle**. **← Billing & Credits** goes back. ### Credit ledger [#ledger] **View ledger** on the Credits card. Owner and admins only. Every movement of the balance, newest first, 50 to a page: | Column | What it shows | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **When** | The time of the entry. | | **Entry** | **Held** (set aside when an action starts), **Charged**, **Refunded**, **Top-up**, **Granted**, **Referral reward**, **Referral reward taken back** or **Carried over**. | | **Credits** | The change: negative when spent. | | **Meter** | What was priced, as on the Credits card. | | **Feature** | The feature that spent it. | | **Surface** | Where it came from: **AI client (MCP)**, **Sheets sidebar**, **Web** or **Tool API**. | | **Model route** | The route it ran on. | | **Model** | The model that ran. | **Columns** chooses which columns show; page through older entries below the table. **← Billing & Credits** goes back. ## Credits [#credits] Most tools — reading orders, stock, reports, changing listings or bids — cost no Credits. A few actions run an AI model on SellerSheet's side and are paid from your workspace's **Credits** balance: * **Images** — generating and editing listing images (`generate_image`, `edit_image`, `reverse_prompt`). * **Listing copy** — titles, bullets and descriptions generated in the app. * **Buyer insights** — the buyer-insights report (`customerFeedback_insights_report`). How they are charged: * **Priced by the server, before it runs.** Your agent never sends a price; the server prices the action from what you asked for (an image's size, the number of languages). `credits_quote` tells your agent the price before it starts. * **Held, then settled.** The price is held when the action starts and settled when it is delivered. * **Refunded when it fails.** Every failure path returns the hold, so a failed action costs nothing. Top up and choose your workspace's model route on **Settings → Billing & Credits** (owner or admin). If jobs keep failing on one route, switch to another there. When the balance is too low, the call is refused with 402 before anything runs. ## Limits [#limits] Your plan sets how fast and how much your agents and code can work — every plan and its numbers are on [Plans and prices](/#pricing). * **Rate windows** — calls per minute, hour and day, counted together for MCP and the Tool API. * **Calls in flight** — how many calls run at the same time. * **Marketplaces** — how many marketplaces sync, shared by Amazon stores and noon accounts. * **Keys** — how many MCP keys and API keys you can have. When a window is full, the call is refused with **429** and a `Retry-After` header: wait that many seconds and try again. Amazon's own quotas also answer 429 with `Retry-After` — your agent waits the same way. Report questions answered from your synced tables (`query_report_data`) don't spend Amazon's rate limits at all — another reason to ask history from the warehouse and today's state live. See [Synced reports](/docs/mcp-api/workflows/reports). ## Related [#related] * [Plans and prices](/#pricing): every plan, its price and its limits. * [Stay in control](/docs/mcp-api/control): what a key or a member may do on each store. * [Organization](/help/app/settings/organization) and [Members](/help/app/settings/members): who owns the organization, and its seats. ## Stuck? [#stuck] * [Web app errors](/help/troubleshooting/app): what each error means and the fix. * [Contact support](/help/contact) # Members (https://sellersheetai.com/help/app/settings/members) > Invite teammates and decide what each one may see and change. What a key or a member may do on each store: [Stay in control](/docs/mcp-api/control). **Settings → Members** lists the people of your organization, their role and the stores they reach. Everyone in the organization can open it. The owner and admins invite people, set a member's access and remove people. Only the owner changes roles, invites an admin or removes one. A member reads the list, but not the addresses of pending invitations or other members' access. ## The three roles [#roles] | Role | Reaches | Manages | | ---------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **Owner** | Every store and noon account | Everything, including billing, roles and deleting the organization. One per organization. | | **Admin** | Every store and noon account | Stores, noon accounts and members (not roles), credit top-ups and the model route. Not the plan, seats or deleting the organization. | | **Member** | Only the stores and noon accounts granted to them, at the level granted | None of the organization's settings; reads the member list. | A member's access is set per store, separately for the **Seller API** and the **Ads API**, and once per noon account. Each level is **None**, **Read** or **Read & write**. A member's keys and AI never reach beyond it. ## Main steps [#main-steps] **Invite.** **Invite member** → **Email** → **Role** → for a member, the access for each store and noon account → **Send invitation**. They get an e-mail with a sign-in link. **They accept.** The link opens [Stores & Marketplaces](/help/app/settings/stores#invites), where the invitation waits under **Invitations**. Until then, they show as **Invited** here. **Adjust later.** **Access** on a member's row changes their stores and levels at any time. ## At the top of the page [#header] * **People**: how many are in the organization, invitations included. **Columns** chooses which columns the table shows. * **The seats line**: seats used and the plan's cap, how many **pending invitations hold a seat**, and any **extra seats** bought. The owner uses no seat. ### Buy a seat [#buy-a-seat] When the team is full, the owner sees an offer for one more seat with **Buy a seat**. It adds the seat at once and charges the card on file. On a plan that cannot buy seats, the line links **The team is full — upgrade the plan for more seats** to [Billing & Credits](/help/app/settings/billing#seats) instead. Who: **owner** · Effect: **costs money**, **changes settings** ## Invite member [#invite] Opens **Invite a member**: * **Email**: their address. They do not need a SellerSheet account yet. * **Role**: **Member** (*Reaches only the stores you grant below*) or **Admin** (*Reaches every store and manages members — everything but billing and deletion*). Only the owner can invite an admin. * **Access**, for a member: one row per store of the organization, with **Seller API** and **Ads API** levels. A store left at **None** on both is not granted. * **noon account access**, for a member: one level per noon account. * **Send invitation** e-mails a sign-in link. An invitation holds a seat until it is accepted or withdrawn. With no seat free, it is refused, and the message says how to get one more. Inviting an address that is already invited replaces that invitation's role and access and sends it again. An organization can send 20 invitation e-mails a day (UTC), resends included. Who: **owner, admin** (an admin invites members only) · Effect: **changes settings**, sends an e-mail ## The member list [#list] | Column | What it shows | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Member** | Name and e-mail; **(you)** marks your own row. An invited person shows the address they were invited at. | | **Role** | **Owner**, **Admin** or **Member**. | | **Status** | **Active** or **Invited**. | | **Access** | **Every store** for the owner and admins. For a member, the number of stores and noon accounts and their refs; hover for each ref and its levels. **No store yet** when nothing is granted. | | **Joined** | When they joined. | There are no actions on the owner's row or on your own. ### Role [#role] A menu on an active member's row: **Admin** or **Member**. Making an admin a member asks first: they keep only the stores granted to them, and their keys in this organization switch off if no store is granted. The owner keeps the owner role; to hand it over, use [Transfer ownership](/help/app/settings/organization#transfer). Who: **owner** · Effect: **changes settings** ### Access [#access] On a member's row. Opens **Access of** the member: the same store grid and noon grid as the invitation. **Save** applies every change at once and tells you how many changed. **None** on both levels removes a store; **None** removes a noon account. A member left with no store and no noon account has their keys in this organization switched off. You can also set access one store at a time from [Stores & Marketplaces → Access](/help/app/settings/stores#access). Who: **owner, admin** · Effect: **changes settings** ### Resend [#resend] On an invited person's row. Sends the invitation e-mail again. It counts toward the 20 a day. Who: **owner, admin** · Effect: sends an e-mail ### ⋯ Remove member [#remove] Asks first. Their store access ends and their keys in this organization stop working. Only the owner can remove an admin. To leave an organization yourself, use [Leave](/help/app/settings/organization#leave) on Organization. Who: **owner, admin** · Effect: **changes settings** ### ⋯ Withdraw invitation [#withdraw] On an invited person's row, in place of **Remove member**. Asks first; the seat it held is freed. Who: **owner, admin** · Effect: **changes settings** ## Related [#related] * [Stay in control](/docs/mcp-api/control): write access per store, and why a key never reaches beyond its holder. * [Read, write & destructive](/docs/mcp-api/access): what **Read** and **Read & write** allow. * [Keys & store access](/docs/mcp-api/keys): each key's own stores and levels. * [Stores & Marketplaces](/help/app/settings/stores): the stores you grant, and the **Invitations** card. * [Billing & Credits](/help/app/settings/billing#seats): seats and extra seats. ## Stuck? [#stuck] * [Web app errors](/help/troubleshooting/app): what each error means and the fix. * [Contact support](/help/contact) # Organization (https://sellersheetai.com/help/app/settings/organization) > Your workspace's name and settings. An organization is a workspace with its own stores, members, plan and credits. **Settings → Organization** shows the one you are working in: its name and address, who owns it, its plan and seats, and how to hand it over, delete it or leave it. Everyone in the organization can open it. The owner and admins edit the profile; only the owner transfers or deletes the organization; anyone but the owner can leave it. Every account also has a **personal** organization of its own. It cannot be transferred, deleted or left. ## At the top of the page [#header] The organization's name, your role in it (**Owner**, **Admin** or **Member**), **Personal** when it is your personal organization, and its address. ## Profile [#profile] The organization's name and its address. A member sees them read-only, with the line *Only the owner and admins can change these.* ### Name [#name] Up to 120 characters; it cannot be empty. Who: **owner, admin** · Effect: **changes settings** ### Address [#address] The organization's short unique name: 3–60 characters, `a`–`z`, `0`–`9` and `-`, not at either end. An address another organization already uses is refused: choose another. Who: **owner, admin** · Effect: **changes settings** ### Undo changes · Save [#save] **Undo changes** puts back the saved name and address. **Save** saves both. Who: **owner, admin** · Effect: **changes settings** ## Details [#details] Read-only, for everyone: | Field | What it shows | | ------------------ | --------------------------------------------------------------------------------- | | **Owner** | The owner's name and e-mail. | | **Created** | When the organization was created. | | **Active members** | People who have joined. | | **Plan** | The plan, and when it ends if an end date is set. **No plan** when there is none. | | **Seats** | Seats used, the plan's cap and pending invitations. | | **Extra seats** | Seats bought on top of the plan. | To change the plan or the seats, go to [Billing & Credits](/help/app/settings/billing). ## Ownership and membership [#ownership] What you see here depends on your role. In your personal organization it only says that it cannot be transferred, deleted or left. ### Transfer ownership [#transfer] **Transfer** opens a dialog: choose the **New owner** among the active members, then **Transfer**. You become an admin; only the new owner can manage billing or delete the organization from then on. When no one can take it over yet, the dialog says to invite a member and let them accept first. Who: **owner** · Effect: **changes settings** ### Delete organization [#delete] Possible only once the organization has no stores, noon accounts, active keys, credits, paid plan or products; otherwise the refusal names what is left. You type the organization's name to confirm. Its members move to their own organizations, and you land on Home. Who: **owner** · Effect: **changes settings**, **cannot be undone** ### Leave organization [#leave] **Leave** asks first. Your store access here ends and your keys in it stop working. Someone must invite you again to come back. You land on Home, in your personal organization. The owner cannot leave: transfer the organization first, or delete it. Who: **admin, member** · Effect: **changes settings** ## Another organization [#create] **Create organization** is in the organization switcher, not on this page. It creates a new workspace with its own stores, members, plan and credits, and you become its owner. To work in another organization you belong to, switch to it there, or from [Stores & Marketplaces](/help/app/settings/stores#shared). ## Related [#related] * [Members](/help/app/settings/members): invite people and set what they reach. * [Billing & Credits](/help/app/settings/billing): the plan, seats and credits of this organization. * [Stores & Marketplaces](/help/app/settings/stores): this organization's stores, and the other organizations you belong to. * [Keys & store access](/docs/mcp-api/keys): keys belong to an organization; leaving one switches yours there off. ## Stuck? [#stuck] * [Web app errors](/help/troubleshooting/app): what each error means and the fix. * [Contact support](/help/contact) # Stores & Marketplaces (https://sellersheetai.com/help/app/settings/stores) > Connect Amazon, Ads and noon, choose the marketplaces that sync, reauthorize a store. The setup itself is in [Connect your store](/docs/start/connect). **Settings → Stores & Marketplaces** lists your organization's Amazon stores and noon accounts: which marketplaces sync, who reaches each one, and the state of each authorization. Everyone in the organization can open it. The owner and admins add, change and remove stores and noon accounts. A member sees only what was granted to them, read-only, and can give a store a name of their own. Each control below says who may use it and what it changes: * **Changes settings**: changes SellerSheet only. * **Changes Amazon access** / **Changes noon access**: sends you to Amazon's or noon's sign-in, or replaces an authorization. * **Cannot be undone**: there is no way back. ## Main steps [#main-steps] **Add the store.** **Add store** → **Store type**, **1. Region**, **2. Marketplaces**, **3. Store Name** → **Authorize with Amazon**. Sign in on Amazon with the account that owns the store and approve. You come back here with the store in the list. **Choose the marketplaces that sync.** **Edit markets** on the store's row. Only the marketplaces that are on sync reports and answer your AI, and each one counts against your plan. **Authorize Ads,** if you advertise: **Ads** on the store's row. **Add noon** (optional): **Add noon account** → name and marketplaces → **Connect with noon**. **Decide who reaches it:** **⋯ → Access** on the row sets each member's access. To bring someone new in, invite them on [Members](/help/app/settings/members). ## At the top of the page [#header] * **Plan badge** and **Marketplaces used / cap · Stores used / cap**: your plan's quota. Amazon marketplaces and noon marketplaces share one pool. * **The outcome banner**: after any Amazon, Ads or noon sign-in, a banner says how it ended, in the server's own words. When the plan was the reason, it links **Upgrade the plan**. **×** closes it. ## Invitations [#invites] Shown only while an organization has invited you and you have not answered. Each line says who invited you, as what role, and the store refs they share. ### Accept [#accept] Opens **Join** with the organization's name. You may give each shared store **Your name for it (optional)** — only you see it, and your refs for that store use it. Leave it empty to keep the store's own name. When the store's name already names one of your stores in the same marketplace, a suggestion is filled in: the store's name and the organization's, joined by `_`. Change it if you like. Who: **the person invited** · Effect: **changes settings** (you join the organization) ### Decline [#decline] Asks first. They would have to invite you again. Who: **the person invited** · Effect: **changes settings** ## Amazon stores [#stores] The owner and admins see every store of the organization. A member sees the stores granted to them. ### Columns [#stores-columns] **Columns** at the top right of the card chooses which columns show. | Column | What it shows | | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Store** | The store's name and its first store ref, such as , with **+N** for the others. Hover the refs to see every one. These are the refs your sidebar and your AI use. | | **Type** | **Seller Central** or **Vendor Central**. | | **Seller ID** | Amazon's seller ID. | | **Region** | The Amazon region the store was authorized in. | | **Marketplaces** | The marketplaces that are on, then the authorized ones that are off, greyed. Hover for the names. | | **Store authorization** | **Authorized**, **Expiring** (30 days or less left; hover for the days), **Expired**, **Revoked** or **Unknown**. Amazon asks for a new authorization every year. | | **Store authorized** | When the store was last authorized. | | **Ads authorization** | **Authorized** (hover for the number of Ads profiles), **Revoked** or **Not connected**. | | **Ads authorized** | When Ads was last authorized. | | **Marketing Cloud** | One chip per Ads country where Amazon Marketing Cloud is turned on: **On**, **Creating** or **Failed**; "—" when it is off everywhere. See [Turn on Marketing Cloud](#amc). | | **Members with access** | The owner and admins, plus the members granted this store. | | **Issues** | The number of problems, red when one is an error. See [Issues](#issues). | ### Add store [#add-store] Opens **Add Amazon Store**, its fields in this order: * **Store type**: **Seller Central** or **Vendor Central**. A Vendor Central store takes one marketplace at a time. * **1. Region**: the Amazon region. Changing it clears the marketplaces. * **2. Marketplaces**: the marketplaces to authorize. The line below counts them against your plan, Amazon and noon together. **Compare plans** opens [Billing & Credits](/help/app/settings/billing). * **3. Store Name**: 1–10 letters, digits or `_`. The line below shows the ref your sidebar and AI will use, such as . * **Authorize with Amazon**: checks your plan, then sends you to Amazon's consent screen. Sign in with the account that owns the store and approve. When a store with the same name, region and type is already here, the dialog says so and the button becomes **Reauthorize on Amazon**. Going on re-authorizes that store with the account you sign in with: its tokens are refreshed and its schedules kept. A different seller account is refused. When your plan has no room for the marketplaces you picked, the dialog says how many are left: pick fewer, or upgrade. A seller account already connected in another organization is refused. Who: **owner, admin** · Effect: **changes Amazon access**; the marketplaces count against your plan ### Edit markets [#edit-markets] Opens **Marketplaces of** the store: the store's whole set of marketplaces, saved in one go with **Save**. The line at the top counts your plan's marketplaces as they will be after the change, noon accounts included. Next to a marketplace you may see: * **Not authorized**: Amazon did not authorize it for this store. Re-authorize the store to add it. * **On until** a date: a marketplace stays on for 30 days after it is turned on, so it cannot be turned off before that date. * **No slot left on the plan**: every marketplace of your plan is in use. * **Ads not authorized here**: the store has Ads, but no Ads profile for this marketplace. A marketplace that is off stops syncing. A store with no marketplace on is **paused**: your AI is told so instead of getting stale data. Past your plan's quota, **Save** is refused with the reason. Who: **owner, admin** · Effect: **changes settings** ### Rename [#rename] Opens **Rename store**: the name everyone in the organization sees, up to 100 letters, digits, spaces, `-`, `_` or `.`. Every ref of the store changes with it, and the old refs stop working at once, so update prompts and sheets that use them. A name already used by a store with an overlapping marketplace is refused. Who: **owner, admin** · Effect: **changes settings** ### Rename for me [#rename-for-me] A member's only action on a store. Opens **Your name for this store**: only you see this name, and the store keeps its own. Your refs for the store use your name from then on, and your old refs stop working. Who: **member** · Effect: **changes settings** (yours only) ### Reauthorize [#reauthorize] Runs **Add store** again with the store's own name, region, type and marketplaces, straight to Amazon's consent screen. Use it when **Store authorization** says **Expiring**, **Expired** or **Revoked**. After Amazon you land on [Re-authorize store](#confirm-reauth) to confirm. Who: **owner, admin** · Effect: **changes Amazon access** ### Ads [#ads] Sends you to Amazon Advertising's consent screen for this store. Amazon Ads is a separate authorization from the store's. Without it, ad tools and ad report syncs have nothing to work with. Other stores of this organization that the same Ads account covers are linked too. Amazon's answer is shown in the outcome banner when you come back. Who: **owner, admin** · Effect: **changes Amazon access** ### ⋯ Refresh Ads profiles [#refresh-ads-profiles] Reads the store's Ads profiles again with the authorization you already gave; there is no Amazon sign-in. New profiles are added, none are removed, and a message names the marketplaces that gained one. Available only while **Ads authorization** is **Authorized**. Who: **owner, admin** · Effect: **changes settings** ### ⋯ Turn on Marketing Cloud [#amc] Opens **Turn on Amazon Marketing Cloud**. Pick the **Marketplace** and click **Turn on**: Amazon creates a Marketing Cloud (AMC) instance on the store's Ads account for that country, or SellerSheet finds the one you already have. Your AI can then answer AMC questions for the store, and SellerSheet starts syncing its AMC reports. Amazon can take up to five minutes; while the chip says **Creating**, open the dialog again and click **Check again**. Before the first one in a region, accept the AMC terms at Amazon with the login that connected Ads. Until then the dialog shows Amazon's message and **Open Amazon Marketing Cloud**. Available while **Ads authorization** is **Authorized** and a marketplace with an Ads profile does not have AMC on yet. Prerequisites and what your AI can do with it: [Use Amazon Marketing Cloud with your own AI](/guides/analyze-amazon-marketing-cloud-with-ai). Who: **owner, admin** · Effect: **cannot be undone** (it creates an AMC instance on your Ads account, and Amazon cannot delete one) ### ⋯ Access [#access] Opens **Who reaches** the store. The owner and admins reach **Every store, by role**. Each member has two levels for this store, **Seller API** and **Ads API**: **None**, **Read** or **Read & write**. A change applies at once. **None** on both removes the member from the store. To add someone new, use **Invite someone on the Members page**. A member's keys and AI never reach beyond these levels. See [Stay in control](/docs/mcp-api/control). Who: **owner, admin** · Effect: **changes settings** ### ⋯ Delete store [#delete-store] Asks you to type the store's name. Deletes the store and every report synced for it: its schedules stop and its data is removed. The members' grants and key rules on it go too, and an Ads account no other store uses. Who: **owner, admin** · Effect: **changes settings**, **cannot be undone** ### Issues [#issues] The chip on a row opens the list of the store's problems. Each one has its fix: | Problem | Fix in the list | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | An authorization error from Amazon, with its time | **Reauthorize** | | The store authorization has expired, or expires within 30 days | **Reauthorize** | | The store was authorized before Brand Analytics was included: re-authorizing unlocks Search Terms, Repeat Purchase, Sales & Traffic and Data Kiosk | **Reauthorize** | | The Ads authorization was revoked | **Reauthorize Ads** | | Sync paused: no marketplace of the store is on, so its reports stopped updating | **Edit markets** | The fix links show to the owner and admins only. Who: **everyone** sees the list; **owner, admin** use the fixes ## noon accounts [#noon] The owner and admins see every noon account of the organization. A member sees the accounts shared with them, read-only, with a **Your access** column. ### noon columns [#noon-columns] | Column | What it shows | | ---------------- | ---------------------------------------------------------------------------------------- | | **Account** | The account's name and its first ref, such as `myStore-AE`. Hover for every ref. | | **Project code** | The noon Partner project. | | **Marketplaces** | The account's noon marketplaces. Every one counts against your plan. | | **Connection** | **OAuth** (signed in on noon) or **API key**. | | **noon status** | **Connected**, **Role missing** or **Sign-in failed**. Hover for noon's own explanation. | | **Connected** | When the account was connected. | | **Your access** | For a member: **None**, **Read** or **Read & write**. | ### Add noon account [#add-noon-account] Opens **Add a noon account**: * **Account name**: 1–10 letters, digits or `_`. It starts the account's refs, such as `myStore-AE`, and must be unique in the organization. * **Marketplaces**: the noon marketplaces to connect. All of them count against your plan. * **Connect with noon** (the default tab): sign in on noon and let it grant access, with no key to copy. The button **Connect with noon** sends you there. * **Use an API key**: **Key ID**, **Private key** (the whole key, BEGIN and END lines included; it is stored encrypted), **Project code** and **Channel identifier** (only when noon gave you one), then **Connect account**. noon checks the key before anything is saved. A noon project can be connected to one organization only. When noon sign-in is not available, the dialog shows the API key form only and says why. Who: **owner, admin** · Effect: **changes noon access**; the marketplaces count against your plan ### Recheck [#recheck] Checks the stored connection with noon again and updates **noon status**. Who: **owner, admin** · Effect: **changes settings** (the status only) ### Marketplaces [#noon-marketplaces] Opens **noon marketplaces of** the account. Pick at least one and **Save**. Past your plan's quota, it is refused with the reason. Who: **owner, admin** · Effect: **changes settings** ### Reconnect [#reconnect] Shown for an account connected with **OAuth**. Sends you to noon's sign-in again for the same project, keeping the account's name and marketplaces. A sign-in that comes back for another project is refused. Who: **owner, admin** · Effect: **changes noon access** ### ⋯ Access (noon) [#noon-access] Opens **Who reaches the noon account**. The owner and admins reach **Every noon account, by role**. Each member has one level: **None**, **Read** or **Read & write**. A change applies at once; **None** removes the member from the account. Who: **owner, admin** · Effect: **changes settings** ### ⋯ Disconnect [#disconnect] Asks first. The account's reports stop syncing and its key is forgotten. Its marketplaces no longer count against your plan, and the members' access to it goes too. Who: **owner, admin** · Effect: **changes settings**, **cannot be undone** (connect it again to come back) ## Other organizations you belong to [#shared] Every other organization you are in, with your role there and the stores and noon accounts you reach in it, read-only. ### Switch to [#switch] Makes that organization the one you work in, so the app shows its stores. To leave it, switch first, then use [Leave](/help/app/settings/organization#leave) on Organization. Who: **everyone** · Effect: changes nothing ## Re-authorize store [#confirm-reauth] You land here after Amazon when the account you signed in with is already connected here as a store. Nothing has changed yet. The card **Confirm the re-authorization** compares the store **Now** and **After you confirm** (name, region, type, marketplaces) and lists: * **Added**: marketplaces Amazon now authorizes that the store did not have. * **No longer authorized by Amazon — turned off**: marketplaces Amazon dropped. They stop syncing. * **Active on this plan**: the marketplaces that will be on. * **Not activated — no free marketplace on this plan**: marketplaces that stay off until a slot is free. Then: * **Confirm re-authorization** replaces the store's authorization with the new one. * **Cancel** keeps the current one. Either way you go back to Stores & Marketplaces (or to Home's setup guide, if you started there), where the banner says what happened. If nothing is waiting to be confirmed — it expired, it was already confirmed, or it was started in another browser — this page sends you straight to Stores & Marketplaces. Who: **owner, admin** · Effect: **changes Amazon access** ## Related [#related] * [Connect your store](/docs/start/connect): the whole first setup. * [Store refs](/docs/mcp-api/store-refs): how refs are built, and [paused stores](/docs/mcp-api/store-refs#paused-stores). * [Stay in control](/docs/mcp-api/control) and [Keys & store access](/docs/mcp-api/keys): what a member or a key may do on each store. * [How to connect noon to SellerSheet](/guides/connect-noon-to-sellersheet) and [Selling on noon](/docs/mcp-api/workflows/noon). * [Members](/help/app/settings/members): invite people and set their access for every store at once. * [Billing & Credits](/help/app/settings/billing): your plan and its marketplaces. ## Stuck? [#stuck] * [Web app errors](/help/troubleshooting/app): what each error means and the fix. * [Contact support](/help/contact) # Webhook message schema (https://sellersheetai.com/help/app/settings/webhooks-schema) > Every field of a SellerSheet Webhooks HTTPS delivery, schemaVersion 1 — the headers, the delivery, each message, its store, Amazon's notification and the typed summary of every notification delivered today. What an [HTTPS webhook](/help/app/settings/webhooks#https-body) receives, field by field. The same is published as a JSON Schema (draft 2020-12) at [sellersheetai.com/schemas/webhooks-v1.json](https://sellersheetai.com/schemas/webhooks-v1.json), with one sample delivery per notification at [sellersheetai.com/schemas/webhooks-v1-samples.json](https://sellersheetai.com/schemas/webhooks-v1-samples.json). Every value on this page is made up. Rules that hold everywhere: * Keys are camelCase, except inside [`amazon`](#amazon), which keeps Amazon's own spelling. * Every key is always sent. "Required" below is what the schema requires; a key that is not required is sent as `null` (or `[]`, `{}`) when it has no value. * Objects are not closed: a key you do not know may appear later within `schemaVersion` 1 — ignore it. * Times are ISO 8601 date-times in UTC (`2026-10-27T09:28:33Z`), except inside `amazon`, which keeps Amazon's text. ## Headers [#headers] | Header | Example | What it is | | --------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Content-Type` | `application/json` | Always JSON. | | `X-SellerSheet-Webhook-Id` | `0c6f2a8e-4d1b-4e7a-9b35-6e8d2f1a4c90` | The webhook — equal to `webhookId`. | | `X-SellerSheet-Delivery-Id` | `dlv_8f3a1c9e2b7d4e6fa0b1c2d3e4f5a6b7` | The delivery — equal to `deliveryId`, the same on every try. | | `X-SellerSheet-Timestamp` | `1793092113` | Unix seconds when this try was sent. | | `X-SellerSheet-Signature` | `sha256=2225d8c4…` | `sha256=` and the hex HMAC-SHA256, keyed with your signing secret, of the timestamp, a `.` and the raw body. [How to verify](/help/app/settings/webhooks#verify-signature). | | `X-SellerSheet-Test` | `false` | `true` on a **Send test**: the messages are samples for the made-up store `SampleStore`. | ## The delivery [#delivery] The body of one request: up to 100 messages, at most 1 MB. | Field | Type | Required | What it is | Example | | ---------------- | ---------------------------- | -------- | ----------------------------------------------------- | -------------------------------------- | | `deliveryId` | string | yes | This delivery. The same on every try of it. | `dlv_8f3a1c9e2b7d4e6fa0b1c2d3e4f5a6b7` | | `webhookId` | string | yes | The webhook it was sent to. | `0c6f2a8e-4d1b-4e7a-9b35-6e8d2f1a4c90` | | `organizationId` | string | yes | Your workspace. | `7b2e9c41-0d3a-4f6b-8e15-9c2a4d6f8b30` | | `sentAt` | date-time | yes | When this try was sent. | `2026-10-27T09:28:33Z` | | `attempt` | integer ≥ 1 | yes | Which try this is: 1, 2 or 3. | `1` | | `schemaVersion` | integer, `1` | no | This format's version — always `1`. | `1` | | `messages` | array of [message](#message) | yes | The messages, in the order SellerSheet received them. | | ## A message [#message] One Amazon notification. | Field | Type | Required | What it is | Example | | ------------- | ----------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | | `messageId` | string | yes | Amazon's NotificationId. Drop one you already handled. | `5c0e8f4a-2b7d-4e91-a3c6-000000000001` | | `messageType` | string | yes | Amazon's notification type; it decides the shape of [`summary`](#summary). More types may be added within `schemaVersion` 1. | `LISTINGS_ITEM_ISSUES_CHANGE` | | `fingerprint` | string or null | no | `sha256:` and 64 hex characters, the same for the same change published again by Amazon under a new `messageId`. | `sha256:af6e358a…` | | `store` | [store](#store) or null | no | Your store and the marketplace the message is about. A delivered message always names one of your stores. | | | `eventTime` | date-time or null | no | When the change happened (Amazon's EventTime). | `2026-10-27T09:14:03Z` | | `publishTime` | date-time or null | no | When Amazon sent it. | `2026-10-27T09:28:30Z` | | `receivedAt` | date-time | yes | When SellerSheet received it. | `2026-10-27T09:28:32Z` | | `summary` | [summary](#summary) | yes | SellerSheet's reading of the message, typed by `messageType`. | | | `amazon` | [amazon](#amazon) | yes | Amazon's notification, every value as Amazon sent it. | | ## store [#store] | Field | Type | Required | What it is | Example | | --------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | | `storeId` | string | yes | SellerSheet's ID of the store. | `3f6c2a9e-5b1d-4c8e-9a7f-2d4e6b8c0a11` | | `ref` | string | yes | The store ref `-`: the store name and the message's marketplace. | `myStore-US` | | `sellerId` | string or null | no | Amazon's seller ID. | `A1EXAMPLESELLER` | | `marketplaceId` | string or null | no | Amazon's marketplace ID — `null` when Amazon names none (account health, reports, feeds and other account-wide messages). | `ATVPDKIKX0DER` | | `countryCode` | string or null | no | The marketplace's country code. | `US` | | `connected` | boolean | yes | `false` when the store has not connected this marketplace in SellerSheet. | `true` | ## amazon [#amazon] Amazon's notification — the source of truth. The top-level names are fixed; every value is exactly what Amazon sent, in Amazon's own casing (PascalCase for some notifications, camelCase for others): read a key in either casing. | Field | Type | Required | What it is | Example | | ---------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------ | ----------------------------- | | `notificationType` | string | yes | Amazon's NotificationType. | `LISTINGS_ITEM_ISSUES_CHANGE` | | `notificationVersion` | string or null | no | Amazon's NotificationVersion. | `1.0` | | `payloadVersion` | string or null | no | Amazon's PayloadVersion — the shape of `payload`. | `2023-12-13` | | `eventTime` | string or null | no | Amazon's EventTime, as Amazon wrote it. | `2026-10-27T09:14:03.000Z` | | `notificationMetadata` | object | no | Amazon's NotificationMetadata: ApplicationId, SubscriptionId, PublishTime, NotificationId. | | | `payload` | object | no | Amazon's Payload, unchanged. | | The `payload` of each notification is documented by Amazon in the Selling Partner API's notification type reference. ## summary [#summary] Every summary has these four fields: | Field | Type | Required | What it is | Example | | ---------- | -------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `text` | string | yes | One readable line: the item and marketplace, plain words, then Amazon's field names and values. | `SKU SKU-EXAMPLE-01 (B0EXAMPLE01) on US: Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED` | | `severity` | `critical` · `warning` · `info` · `recovery` | yes | How bad it is — red, orange, blue, green on a chat card. [When each applies](/help/app/settings/webhooks#severity). | `critical` | | `sku` | string or null | no | The SKU, when Amazon sent one. | `SKU-EXAMPLE-01` | | `asin` | string or null | no | The ASIN, when Amazon sent one. | `B0EXAMPLE01` | Then the fields of its `messageType`, below, in the order of the Webhooks page. A type this page does not list carries the four fields only. A full sample delivery of each type, valid against the schema: [webhooks-v1-samples.json](https://sellersheetai.com/schemas/webhooks-v1-samples.json). | `messageType` | Notification | | --------------------------------------------- | ------------------------------------------------------- | | `LISTINGS_ITEM_ISSUES_CHANGE` | [Listing issues](#listing-issues) | | `LISTINGS_ITEM_STATUS_CHANGE` | [Listing status](#listing-status) | | `BRANDED_ITEM_CONTENT_CHANGE` | [Brand content](#brand-content) | | `ITEM_PRODUCT_TYPE_CHANGE` | [Product type change](#product-type-change) | | `LISTINGS_ITEM_MFN_QUANTITY_CHANGE` | [Self-fulfilled quantity](#self-fulfilled-quantity) | | `PRODUCT_TYPE_DEFINITIONS_CHANGE` | [Product type definitions](#product-type-definitions) | | `PRICING_HEALTH` | [Pricing health](#pricing-health) | | `ANY_OFFER_CHANGED` | [Competing offers](#competing-offers) | | `B2B_ANY_OFFER_CHANGED` | [Business offers (B2B)](#business-offers) | | `FEE_PROMOTION` | [Fee promotions](#fee-promotions) | | `ORDER_CHANGE` | [Order changes](#order-changes) | | `FULFILLMENT_ORDER_STATUS` | [Multi-Channel Fulfillment orders](#mcf-orders) | | `FBA_OUTBOUND_SHIPMENT_STATUS` | [FBA Onsite shipments (Brazil)](#fba-onsite-shipments) | | `EXTERNAL_FULFILLMENT_SHIPMENT_STATUS_CHANGE` | [External fulfillment shipments](#external-shipments) | | `FBA_INVENTORY_AVAILABILITY_CHANGES` | [FBA inventory](#fba-inventory) | | `ITEM_INVENTORY_EVENT_CHANGE` | [Hourly inventory](#hourly-inventory) | | `ITEM_SALES_EVENT_CHANGE` | [Hourly sales](#hourly-sales) | | `DETAIL_PAGE_TRAFFIC_EVENT` | [Hourly page views](#hourly-page-views) | | `TRANSACTION_UPDATE` | [Transactions](#transactions) | | `ACCOUNT_STATUS_CHANGED` | [Account health](#account-health) | | `REPORT_PROCESSING_FINISHED` | [Report finished](#report-finished) | | `FEED_PROCESSING_FINISHED` | [Feed finished](#feed-finished) | | `DATA_KIOSK_QUERY_PROCESSING_FINISHED` | [Data Kiosk query finished](#data-kiosk-query-finished) | ### Listing issues [#listing-issues] `LISTINGS_ITEM_ISSUES_CHANGE` — the issues now in force on a listing. Amazon never sends the issue text: open the SKU in Seller Central to read it. | Field | Type | What it is | | -------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `severities` | array of string | Amazon's Severities: `ERROR`, `WARNING` (`NONE` is left out). | | `enforcementActions` | array of string | Amazon's EnforcementActions: `LISTING_SUPPRESSED` (not buyable), `ATTRIBUTE_SUPPRESSED` (an attribute value rejected), `CATALOG_ITEM_REMOVED` (the catalog item is inactive, every offer non-buyable), `SEARCH_SUPPRESSED` (hidden from search). | | `cleared` | boolean or null | `true` when no issue remains. | ```json { "text": "SKU SKU-EXAMPLE-01 (B0EXAMPLE01) on US: Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED", "severity": "critical", "sku": "SKU-EXAMPLE-01", "asin": "B0EXAMPLE01", "severities": ["ERROR"], "enforcementActions": ["LISTING_SUPPRESSED"], "cleared": false } ``` ### Listing status [#listing-status] `LISTINGS_ITEM_STATUS_CHANGE` — the listing's current status set. A status that is missing is its opposite: no `BUYABLE` means not buyable, no `DISCOVERABLE` means not in search results. | Field | Type | What it is | | -------------- | --------------- | ------------------------------------------------------ | | `status` | array of string | Amazon's Status: `BUYABLE`, `DISCOVERABLE`, `DELETED`. | | `buyable` | boolean or null | `BUYABLE` is in the set. | | `discoverable` | boolean or null | `DISCOVERABLE` is in the set. | | `deleted` | boolean or null | `DELETED` is in the set. | ```json { "text": "SKU SKU-EXAMPLE-02 (B0EXAMPLE02) on US: Buyable · Status=BUYABLE,DISCOVERABLE", "severity": "recovery", "sku": "SKU-EXAMPLE-02", "asin": "B0EXAMPLE02", "status": ["BUYABLE", "DISCOVERABLE"], "buyable": true, "discoverable": true, "deleted": false } ``` ### Brand content [#brand-content] `BRANDED_ITEM_CONTENT_CHANGE` — which attributes of a catalog item of your brand changed. No SKU. Amazon sends one copy per brand-owner store the webhook takes. | Field | Type | What it is | | ------------------- | --------------- | ------------------------------------------------------------------- | | `brandName` | string or null | Amazon's BrandName. | | `attributesChanged` | array of string | Amazon's AttributesChanged — attribute names as Amazon spells them. | ```json { "text": "ASIN B0EXAMPLE04 on US: Changed: item_name, bullet_point · AttributesChanged=item_name,bullet_point · BrandName=MyBrand", "severity": "info", "sku": null, "asin": "B0EXAMPLE04", "brandName": "MyBrand", "attributesChanged": ["item_name", "bullet_point"] } ``` ### Product type change [#product-type-change] `ITEM_PRODUCT_TYPE_CHANGE` — an ASIN's product type, before and now. What its listings must say may have changed with it. No SKU. | Field | Type | What it is | | --------------------- | -------------- | -------------------------------------------- | | `previousProductType` | string or null | The product type before, as Amazon names it. | | `currentProductType` | string or null | The product type now. | ### Self-fulfilled quantity [#self-fulfilled-quantity] `LISTINGS_ITEM_MFN_QUANTITY_CHANGE` — a SKU's self-fulfilled quantity now. No ASIN, and no marketplace: the quantity is the seller account's. | Field | Type | What it is | | ------------------------ | --------------- | ------------------------------------------------------------------------------------------------------- | | `quantity` | integer or null | The quantity now; `0` is out of stock. | | `fulfillmentChannelCode` | string or null | Amazon's FulfillmentChannelCode: `DEFAULT` is your own fulfillment; another code names a supply source. | ### Product type definitions [#product-type-definitions] `PRODUCT_TYPE_DEFINITIONS_CHANGE` — a new version of a marketplace's product type definitions. No SKU or ASIN. Amazon sends one copy per store the webhook takes. | Field | Type | What it is | | -------------------- | --------------- | ------------------------------------ | | `productTypeVersion` | string or null | Amazon's ProductTypeVersion. | | `newProductTypes` | array of string | The product types this version adds. | ### Pricing health [#pricing-health] `PRICING_HEALTH` — why your offer cannot be the featured offer, against Amazon's reference prices. No SKU: Amazon sends the ASIN only. | Field | Type | What it is | | --------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `issueType` | string or null | Amazon's issueType, for example `BuyBoxDisqualification`. | | `yourPrice` | [money](#money) or null | Your landed price: listing plus shipping. | | `fulfillmentType` | string or null | `AFN` (FBA) or `MFN` (FBM). | | `competitivePriceThreshold` | [money](#money) or null | Amazon's competitive price threshold. | | `referencePrices` | object of [money](#money) | Every reference price Amazon sent, under Amazon's name: `competitivePriceThreshold`, `averageSellingPrice`, `retailOfferPrice`, `msrpPrice`, … | ```json { "text": "ASIN B0EXAMPLE03 on US: Not eligible for the featured offer · issueType=BuyBoxDisqualification · yours 29.99 USD, FBA (fulfillmentType=AFN) · competitivePriceThreshold=24.99 USD · averageSellingPrice=26.50 USD", "severity": "warning", "sku": null, "asin": "B0EXAMPLE03", "issueType": "BuyBoxDisqualification", "yourPrice": { "amount": 29.99, "currencyCode": "USD" }, "fulfillmentType": "AFN", "competitivePriceThreshold": { "amount": 24.99, "currencyCode": "USD" }, "referencePrices": { "competitivePriceThreshold": { "amount": 24.99, "currencyCode": "USD" }, "averageSellingPrice": { "amount": 26.5, "currencyCode": "USD" } } } ``` ### Competing offers [#competing-offers] `ANY_OFFER_CHANGED` — the Buy Box, your offer and up to five other sellers' offers on an ASIN another seller is on. Amazon gives seller IDs, never names, and no SKU. | Field | Type | What it is | | --------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------- | | `changeType` | string or null | Amazon's OfferChangeType, for example `External`. | | `buyBox` | [buy box](#buy-box) or null | The Buy Box price and who holds it. | | `yourOffer` | [offer](#offer) or null | Your own offer, when it is among Amazon's offers. | | `competitors` | array of [offer](#offer), at most 5 | The other sellers' offers, in Amazon's order. | | `numberOfOffers` | integer or null | Every offer on the ASIN, all conditions and channels. | | `sellersChanged` | boolean or null | The sellers on the ASIN differ from the previous message about it. `true` on the first message. | | `buyBoxWinnerChanged` | boolean or null | The Buy Box winner differs from the previous message about it. `true` on the first message. | ```json { "text": "ASIN B0EXAMPLE05 on US: 1 other seller: A2EXAMPLEOTHER 19.99 USD FBM, Buy Box, 95% of 120 · you 21.49 USD FBA, 99% of 812 · OfferChangeType=External · BuyBoxPrice=19.99 USD · NumberOfOffers=new Merchant 1,new Amazon 1", "severity": "warning", "sku": null, "asin": "B0EXAMPLE05", "changeType": "External", "buyBox": { "price": { "amount": 19.99, "currencyCode": "USD" }, "sellerId": "A2EXAMPLEOTHER", "isYours": false }, "yourOffer": { "sellerId": "A1EXAMPLESELLER", "price": { "amount": 21.49, "currencyCode": "USD" }, "shipping": { "amount": 0.0, "currencyCode": "USD" }, "fulfillment": "FBA", "isBuyBoxWinner": false, "feedbackRating": 99, "feedbackCount": 812 }, "competitors": [ { "sellerId": "A2EXAMPLEOTHER", "price": { "amount": 19.99, "currencyCode": "USD" }, "shipping": { "amount": 0.0, "currencyCode": "USD" }, "fulfillment": "FBM", "isBuyBoxWinner": true, "feedbackRating": 95, "feedbackCount": 120 } ], "numberOfOffers": 2, "sellersChanged": true, "buyBoxWinnerChanged": true } ``` ### Business offers (B2B) [#business-offers] `B2B_ANY_OFFER_CHANGED` — as [Competing offers](#competing-offers), over the business (B2B) offers on the ASIN. No `changeType`, `sellersChanged` or `buyBoxWinnerChanged`. | Field | Type | What it is | | ---------------- | ----------------------------------- | ----------------------------------------------------- | | `buyBox` | [buy box](#buy-box) or null | The B2B Buy Box price and who holds it. | | `yourOffer` | [offer](#offer) or null | Your own B2B offer, when it is among Amazon's offers. | | `competitors` | array of [offer](#offer), at most 5 | The other sellers' B2B offers, in Amazon's order. | | `numberOfOffers` | integer or null | Every B2B offer on the ASIN. | ### Fee promotions [#fee-promotions] `FEE_PROMOTION` — a fee promotion Amazon offers you: what it is, when it runs, and its first discount. `sku` or `asin` is set when it names exactly one item. | Field | Type | What it is | | ------------------ | ----------------------- | -------------------------------------------------------------------- | | `promotionType` | string or null | Amazon's FeePromotionType. | | `description` | string or null | Amazon's description of the promotion (FeePromotionTypeDescription). | | `effectiveFrom` | date-time or null | When it starts. | | `effectiveThrough` | date-time or null | When it ends. | | `feeType` | string or null | The fee it discounts, for example `ReferralFee`. | | `discountType` | string or null | Amazon's FeeDiscountType, for example `PERCENTAGE`. | | `discountValue` | number or null | Amazon's FeeDiscountValue. | | `discountAmount` | [money](#money) or null | The discount as an amount, when Amazon gives one. | ### Order changes [#order-changes] `ORDER_CHANGE` — the order's status now and what changed. `sku` is set when the order holds one SKU. | Field | Type | What it is | | ---------------------- | --------------- | ------------------------------------------------------------------------------------------- | | `amazonOrderId` | string or null | The order. | | `changeType` | string or null | Amazon's OrderChangeType: `BuyerRequestedChange`, `OrderStatusChange`, `DeliveryTipChange`. | | `changeReason` | string or null | Amazon's ChangeReason, for example `Buyer Requested Cancel`. | | `orderStatus` | string or null | The order's status now, for example `Unshipped`. | | `fulfillmentType` | string or null | `AFN` (FBA) or `MFN` (FBM). | | `buyerRequestedCancel` | boolean or null | An item of the order says the buyer asked to cancel. | | `sellerSkus` | array of string | The order's SKUs. | ### Multi-Channel Fulfillment orders [#mcf-orders] `FULFILLMENT_ORDER_STATUS` — a Multi-Channel Fulfillment order, its packages and tracking. Amazon names no marketplace. `sku` is set when the order holds one SKU. | Field | Type | What it is | | ------------ | ---------------------------------------- | -------------------------------------------------------------------------------------- | | `orderId` | string or null | The fulfillment order. | | `eventType` | string or null | Amazon's eventType, for example `ORDER_STATUS_CHANGED`. | | `status` | string or null | `PROCESSING`, `COMPLETE`, `COMPLETE_PARTIAL`, `CANCELLED`, `UNFULFILLABLE`, `INVALID`. | | `sellerSkus` | array of string | The order's SKUs. | | `packages` | array of [package](#package), at most 20 | The packages of its shipments, with the carrier's tracking. | ### FBA Onsite shipments (Brazil) [#fba-onsite-shipments] `FBA_OUTBOUND_SHIPMENT_STATUS` — a shipment Amazon created or cancelled for an order. Brazil only. | Field | Type | What it is | | ------------------ | -------------- | -------------------------------------------------- | | `amazonOrderId` | string or null | The order. | | `amazonShipmentId` | string or null | The shipment. | | `shipmentStatus` | string or null | Amazon's ShipmentStatus: `Created` or `Cancelled`. | ### External fulfillment shipments [#external-shipments] `EXTERNAL_FULFILLMENT_SHIPMENT_STATUS_CHANGE` — a shipment of your own fulfillment location changed status. Amazon names no marketplace. | Field | Type | What it is | | ---------------- | -------------- | ----------------------------------------------------- | | `shipmentId` | string or null | The shipment. | | `shipmentStatus` | string or null | Its status now, for example `CREATED` or `CANCELLED`. | | `channelName` | string or null | Amazon's channelName. | | `locationId` | string or null | Your fulfillment location. | ### FBA inventory [#fba-inventory] `FBA_INVENTORY_AVAILABILITY_CHANGES` — a SKU's FBA quantities, summed over every marketplace Amazon lists, and per marketplace. The message's marketplace is the first one listed. | Field | Type | What it is | | --------------- | -------------------------------------------------------- | ---------------------------------------------- | | `fnsku` | string or null | Amazon's FNSKU. | | `fulfillable` | integer or null | Fulfillable units; `0` is out of stock at FBA. | | `inbound` | integer or null | Working + shipped + receiving. | | `reserved` | integer or null | Every reserved quantity. | | `unfulfillable` | integer or null | Unfulfillable units. | | `marketplaces` | array of [marketplace inventory](#marketplace-inventory) | The same counts per marketplace. | ### Hourly inventory [#hourly-inventory] `ITEM_INVENTORY_EVENT_CHANGE` — one hour's highly available inventory, summed over every ASIN Amazon lists. `asin` is set when it lists one. | Field | Type | What it is | | -------------------------- | ----------------- | ------------------------------------- | | `startTime` | date-time or null | The start of the hour. | | `endTime` | date-time or null | The end of the hour. | | `asinCount` | integer or null | How many ASINs Amazon listed. | | `highlyAvailableInventory` | integer or null | Highly available inventory, in units. | ### Hourly sales [#hourly-sales] `ITEM_SALES_EVENT_CHANGE` — one hour's ordered units and revenue, summed over every ASIN Amazon lists. `asin` is set when it lists one. | Field | Type | What it is | | ---------------- | ------------------------ | ---------------------------------------- | | `startTime` | date-time or null | The start of the hour. | | `endTime` | date-time or null | The end of the hour. | | `asinCount` | integer or null | How many ASINs Amazon listed. | | `orderedUnits` | integer or null | Units ordered. | | `orderedRevenue` | array of [money](#money) | Revenue ordered, one entry per currency. | ### Hourly page views [#hourly-page-views] `DETAIL_PAGE_TRAFFIC_EVENT` — one hour's detail page views, summed over every ASIN Amazon lists. `asin` is set when it lists one. | Field | Type | What it is | | ------------- | ----------------- | ----------------------------------------- | | `startTime` | date-time or null | The start of the hour. | | `endTime` | date-time or null | The end of the hour. | | `asinCount` | integer or null | How many ASINs Amazon listed. | | `glanceViews` | integer or null | Detail page views (Amazon's GlanceViews). | ### Transactions [#transactions] `TRANSACTION_UPDATE` — a transaction posted to your account. | Field | Type | What it is | | -------------------- | ----------------------- | --------------------------------------------------------- | | `transactionType` | string or null | Amazon's TransactionType, for example `Shipment`. | | `postedDate` | date-time or null | When it was posted. | | `totalAmount` | [money](#money) or null | Its total. | | `accountType` | string or null | Amazon's AccountType, for example `PAYABLE`. | | `relatedIdentifiers` | object of string | Amazon's RelatedIdentifiers, name → value (`OrderId`, …). | ### Account health [#account-health] `ACCOUNT_STATUS_CHANGED` — the seller account's status. No item; the message's `store` is your store in its first marketplace. | Field | Type | What it is | | ---------------- | -------------- | ------------------------------------- | | `previousStatus` | string or null | `NORMAL`, `AT_RISK` or `DEACTIVATED`. | | `currentStatus` | string or null | `NORMAL`, `AT_RISK` or `DEACTIVATED`. | ```json { "text": "Account at risk · PreviousAccountStatus=NORMAL · CurrentAccountStatus=AT_RISK", "severity": "warning", "sku": null, "asin": null, "previousStatus": "NORMAL", "currentStatus": "AT_RISK" } ``` ### Report finished [#report-finished] `REPORT_PROCESSING_FINISHED` — a report request finished. It includes the reports SellerSheet requests to keep your store's data in sync. Amazon names no marketplace. | Field | Type | What it is | | ------------------ | -------------- | ---------------------------------------------------------------------------------- | | `reportId` | string or null | The report. | | `reportType` | string or null | Amazon's reportType. | | `processingStatus` | string or null | `DONE`, `CANCELLED` (Amazon had no data, or the request was cancelled) or `FATAL`. | | `reportDocumentId` | string or null | The document to download, on `DONE`. | ### Feed finished [#feed-finished] `FEED_PROCESSING_FINISHED` — a feed finished. Amazon names no marketplace. | Field | Type | What it is | | ---------------------- | -------------- | ---------------------------------------------------- | | `feedId` | string or null | The feed. | | `feedType` | string or null | Amazon's feedType, for example `JSON_LISTINGS_FEED`. | | `processingStatus` | string or null | `DONE`, `CANCELLED` or `FATAL`. | | `resultFeedDocumentId` | string or null | The processing report's document, on `DONE`. | ### Data Kiosk query finished [#data-kiosk-query-finished] `DATA_KIOSK_QUERY_PROCESSING_FINISHED` — a Data Kiosk query finished. Amazon names no marketplace. | Field | Type | What it is | | ------------------ | -------------- | --------------------------------------------------------- | | `queryId` | string or null | The query. | | `processingStatus` | string or null | `DONE`, `CANCELLED` or `FATAL`. | | `dataDocumentId` | string or null | The data document; `null` when the query matched no data. | | `errorDocumentId` | string or null | The error document, on `FATAL`. | | `nextToken` | string or null | Set when the result has more pages. | ## Objects [#objects] ### money [#money] | Field | Type | Required | What it is | | -------------- | -------------- | -------- | -------------------------------- | | `amount` | number | yes | The amount. | | `currencyCode` | string or null | no | The currency, for example `USD`. | ### offer [#offer] | Field | Type | Required | What it is | | ---------------- | ----------------------- | -------------------- | ----------------------------- | | `sellerId` | string | yes | Amazon's seller ID. | | `price` | [money](#money) or null | no | The listing price. | | `shipping` | [money](#money) or null | no | The shipping price. | | `fulfillment` | `FBA` · `FBM` or null | no | Who ships it. | | `isBuyBoxWinner` | boolean | no (default `false`) | This offer holds the Buy Box. | | `feedbackRating` | integer or null | no | Positive feedback, percent. | | `feedbackCount` | integer or null | no | Number of ratings. | ### buy box [#buy-box] | Field | Type | Required | What it is | | ---------- | ----------------------- | -------- | ----------------------------------------------------------------- | | `price` | [money](#money) or null | no | The Buy Box landed price. | | `sellerId` | string or null | no | The seller holding it, when one of the offers Amazon listed does. | | `isYours` | boolean or null | no | You hold the Buy Box. | ### package [#package] | Field | Type | Required | What it is | | ---------------- | -------------- | -------- | ------------------------------------ | | `packageId` | string or null | no | The package. | | `status` | string or null | no | Its status, for example `DELIVERED`. | | `carrierCode` | string or null | no | The carrier, for example `FEDEX`. | | `trackingNumber` | string or null | no | The carrier's tracking number. | ### marketplace inventory [#marketplace-inventory] | Field | Type | Required | What it is | | --------------- | -------------- | ---------------- | ------------------------------- | | `marketplaceId` | string or null | no | Amazon's marketplace ID. | | `countryCode` | string or null | no | The marketplace's country code. | | `fulfillable` | integer | no (default `0`) | Fulfillable units. | | `inbound` | integer | no (default `0`) | Working + shipped + receiving. | | `reserved` | integer | no (default `0`) | Every reserved quantity. | | `unfulfillable` | integer | no (default `0`) | Unfulfillable units. | ## Validating [#validating] Any JSON Schema draft 2020-12 validator can check a body against [webhooks-v1.json](https://sellersheetai.com/schemas/webhooks-v1.json). The schema types `summary` by `messageType` (one "if `messageType` is this type, then `summary` is this shape" rule per notification), so a validator checks each message's summary against its own type. # Webhooks (https://sellersheetai.com/help/app/settings/webhooks) > Amazon's notifications about your stores — listings, prices and offers, orders, inventory, sales, finance, account health and more — delivered to your team chat, or to your own system as signed JSON. * Amazon tells SellerSheet when something changes on your listings, prices, offers, orders, inventory or account. A **webhook** passes each message on: as a card in your team chat (Feishu / Lark, Slack, Microsoft Teams, WeCom, DingTalk), or as signed JSON to your own system over HTTPS. * **Choose from 23 of Amazon's notifications**, in groups; a new webhook starts with six. Hourly metrics and per-change streams go to HTTPS only. * Set it up in **Settings → Webhooks → Add webhook** (workspace owner or admin), then click **Send test**. * **500 delivered messages a month are free on every plan.** Beyond them, each delivered message is paid from your Credits. Test, failed and skipped messages are never billed. ## What webhooks are for [#what-for] Amazon sends a notification when something changes on your seller account: a listing is suppressed or becomes buyable again, your offer loses the featured offer on price, someone edits your brand's detail page, another seller joins your ASIN, a buyer asks to cancel an order, your FBA stock runs out, your account goes at risk. A webhook delivers those messages where your work happens: * **A team chat group.** One card a minute at most, the changes grouped by store, with Amazon's own field names so a person — or an AI agent in the group — can act on them. * **Your own system.** An ERP, a database or your own code receives every message as signed JSON with Amazon's notification inside, unchanged. Every message is built only from what Amazon sent; SellerSheet makes no Amazon call to add to it. Amazon is the source of truth. How a notification travels. Amazon sends a notification when something changes on your seller account — listings, prices and offers, orders, inventory, account health, reports. SellerSheet asks Amazon only for the notifications your webhooks want, groups a minute of changes into one chat card, and signs every HTTPS request; 500 messages a month are free on every plan. It delivers to your team chat — Feishu, Slack, Teams, WeCom or DingTalk, at most one card a minute, coloured by the most serious change — or to your own system as signed JSON, up to 100 messages a request with Amazon's notification inside. SellerSheet subscribes at Amazon to what your webhooks want and unsubscribes a notification 24 hours after no webhook wants it ## Add a webhook [#add-a-webhook] You need to be the **owner or an admin** of the workspace. Webhooks belong to the workspace you are in: switch to the right one first. ### Get the address [#get-the-address] Follow the steps for your destination under [Destinations](#destinations) and copy the address. For HTTPS, also make up a signing secret. ### Add the webhook [#add-the-webhook] In the [SellerSheet app](https://sellersheetai.com/home), open **Settings → Webhooks → Add webhook**: * **Destination type**: Feishu, Slack, Microsoft Teams, WeCom, DingTalk or HTTPS. It cannot be changed later. * **Name**: unique in the workspace, for example *ERP feed* or *Ops group*. * The address, and the **Signing secret** where the destination has one. * Chat apps only: **Language** — 中文 or English, the language of the cards in the group. A new webhook starts on the language you use the app in; change it any time. See [Card language](#card-language). * **Notifications and stores**: which notifications, for which stores. The six original notifications start ticked. See [Choose notifications and stores](#types-and-stores). * **Include marketplaces not connected to SellerSheet** (on by default). * Chat apps only: **Competing offers: only when the sellers or the Buy Box winner change** (on by default). A price-only change is then filtered — not posted and not billed. * Tick the per-message pricing box, then **Create webhook**. A webhook can be created, or turned back on, only while your organization can pay for its next message: free messages left this month, or Credits. ### Send a test [#send-a-test] Click **Send test** on the webhook's row (or in its edit panel). One sample message for each notification the webhook takes, for a made-up store, arrives at the destination; on a chat app the card title ends in "· test" ("· 测试" when the webhook's language is 中文). If the destination refuses them, its answer is shown — see [Troubleshooting](#troubleshooting). Test messages are never billed. After that, the list shows each webhook's **Status**, **This month** (messages delivered) and **Last delivery**. **Edit webhook** changes everything but the destination type; a blank address or secret keeps the saved one, and **Enabled** turns the webhook on or off. **Delete webhook** stops it at once; its delivery log stays for 30 days. A workspace keeps up to **10 webhooks**. The address and the secret are stored encrypted and never shown again: the list shows only the address's last four characters. ### Destinations [#destinations] | Destination | What arrives | Signing secret | | --------------- | ------------------------------------------- | ------------------------------------------ | | Feishu / Lark | One interactive card a minute at most | Optional — Feishu's signature verification | | Slack | One message a minute at most | — | | Microsoft Teams | One Adaptive Card a minute at most | — | | WeCom | One markdown message a minute at most | — | | DingTalk | One markdown message a minute at most | Optional — DingTalk's 加签 (Sign) | | HTTPS | Signed JSON, up to 100 messages per request | **Required** | A chat bot with keyword security needs the keyword `SellerSheet` — every card title contains it. A bot or an endpoint with an IP allowlist needs SellerSheet's IP address: [contact support](/help/contact) for it. #### Feishu / Lark [#feishu] 1. In the group, open **Settings → Bots → Add bot → Custom bot**. 2. Copy its webhook address: `https://open.feishu.cn/open-apis/bot/v2/hook/…` (Lark: `https://open.larksuite.com/open-apis/bot/v2/hook/…`). 3. Optional security: turn on **signature verification** and paste the secret into **Signing secret**, or turn on **keyword** security with the keyword `SellerSheet`. #### Slack [#slack] 1. In your Slack app, turn on **Incoming Webhooks**. 2. Click **Add New Webhook** and pick the channel. 3. Copy the URL: `https://hooks.slack.com/services/…` #### Microsoft Teams [#teams] 1. In the channel, open **Workflows**. 2. Choose **Post to a channel when a webhook request is received** and finish the workflow. 3. Copy the URL it gives you; its host ends in `logic.azure.com` or `powerplatform.com`. #### WeCom [#wecom] 1. In the group, open **··· → Group robots → Add**. 2. Copy its webhook address: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…` WeCom takes shorter messages than the other apps, so its card holds fewer lines before "+N more". #### DingTalk [#dingtalk] 1. In the group settings, open **Bots → Add bot → Custom**. 2. Under security, choose **加签 (Sign)** and paste the secret that starts with `SEC` into **Signing secret**, or choose **custom keyword** `SellerSheet`. 3. Copy the address: `https://oapi.dingtalk.com/robot/send?access_token=…` #### HTTPS [#https] 1. Have an endpoint that accepts a `POST` with a JSON body, on an `https://` address on the public internet (port 443). Private and internal addresses are refused, and redirects are not followed. The address is checked again before every request. 2. Make up a long random signing secret (for example the output of `openssl rand -hex 32`), paste it into **Signing secret** and keep it in your receiver. 3. In your receiver, [verify the signature](#verify-signature) of every request, answer any `2xx` within 10 seconds, then process the messages. What arrives: [The HTTPS body](#https-body). ## Choose notifications and stores [#types-and-stores] The **Notifications and stores** table lists every notification Amazon offers, in groups: a row per notification and a column per store. * Tick **All stores** to take every store of the workspace, including the stores you connect later, or tick stores one by one. * **A new webhook starts with the six original notifications ticked** — Listing issues, Listing status, Brand content, Pricing health, Competing offers and Account health — on all stores, except Brand content, which starts on one store. Tick any other row you want. * **Grey rows cannot be ticked**, and say why: *Coming as data in your report tables — not as webhooks* (Amazon Ads), *Not available yet* (shipment tracking milestones), or *HTTPS only* on a chat destination. See [The notifications](#notifications). * **High volume** marks, on HTTPS, the hourly metrics and the notifications with a message for every change: a busy store can send many a day, and each delivered message counts toward [your usage](#pricing). * **Some notifications are sent for some marketplaces only:** FBA Onsite shipments, for Brazil (*BR only*). A store without Brazil cannot be ticked for it. **All stores** is always allowed: Amazon sends nothing for the other stores. * **One copy per store:** Amazon sends **Brand content** and **Product type definitions** once for each store of a seller, and the content is the same across them. Tick one store to get each change once; with more, you get one copy per store, and the table warns you. * **Messages that name no marketplace** — account health, reports, feeds, Data Kiosk queries, Multi-Channel Fulfillment orders, self-fulfilled quantity, external fulfillment shipments — reach a webhook that takes the notification on any store of that seller. * **A chat destination leaves HTTPS-only ticks out.** If you ticked some before choosing a chat app, the form says how many are left out; they are not saved. * **Include marketplaces not connected to SellerSheet**: some notifications cover your whole seller account, so a message can be about a marketplace you have not connected to SellerSheet. With the box on, those messages arrive, marked "(not connected)" on a card and `"connected": false` over HTTPS. Turn it off to drop them. ### Amazon subscriptions follow your webhooks [#amazon-subscriptions] SellerSheet asks Amazon for exactly the notifications your webhooks want, and nothing else: * One Amazon subscription per seller account, region and notification serves every webhook. A new webhook on a store and notification that is already subscribed starts receiving at once. * A notification no webhook wants yet is subscribed at Amazon within about a minute. * When no active webhook has wanted a notification of a store for 24 hours, SellerSheet unsubscribes it at Amazon. If a webhook wants it again, it is subscribed again within about a minute. What Amazon published while it was unsubscribed is not sent. * A small marker on a store's cell explains a subscription that is ending (*Amazon's subscription ends … unless a webhook takes it again.*) or one Amazon refused: *another application holds this notification for the seller*; *this notification needs a permission the store's authorization does not include* (SellerSheet tries again daily — if it keeps failing, re-authorize the store or contact support); or *SellerSheet tries again*. ## The notifications [#notifications] The Webhooks page lists the notifications Amazon's Selling Partner API sends that SellerSheet can deliver, and Amazon Ads' two Marketing Stream datasets, in 9 groups: * **Delivered now — 23 notifications.** The original six are ticked on a new webhook (*default* below). * **Not available yet — Shipment tracking milestones.** Amazon needs each shipment registered first. * **Amazon Ads — not webhooks.** Ads performance arrives as data in your report tables (Amazon Marketing Stream), so the two rows are grey on every destination. On a chat destination, an HTTPS-only notification is grey too, with its reason. On HTTPS those rows can be ticked, and the hourly metrics and the ones with a message for every change are marked **High volume**. Not offered: Amazon's three Brazil and Mexico tax invoice notifications. Amazon allows them only to apps it has granted a tax-invoicing role, and the SellerSheet app does not have that role. ### Listings [#group-listings] | Notification | What it tells you | Delivered | Channels | | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------- | | Listing issues | The issues on a listing change: the severities and enforcement actions now in force, or all clear. Never the issue text. | Now (default) | HTTPS, chat | | Listing status | A listing becomes buyable or not, shows in search or not, or is deleted. | Now (default) | HTTPS, chat | | Brand content | An attribute of a catalog item of your brand changes — title, bullets, images and so on. One copy per store. | Now (default) | HTTPS, chat | | Product type change | An ASIN's product type changes; what its listings must say may change with it. | Now | HTTPS, chat | | Self-fulfilled quantity | A SKU's self-fulfilled quantity changes. | Now | HTTPS only — a message for every change | | Product type definitions | Amazon publishes a new version of a marketplace's product type definitions, naming any new product types. One copy per store. | Now | HTTPS only — a signal for your own code | ### Pricing & offers [#group-pricing] | Notification | What it tells you | Delivered | Channels | | --------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------- | | Pricing health | Your offer cannot be the featured offer because of its price, with Amazon's reference prices. ASIN only, no SKU. | Now (default) | HTTPS, chat | | Competing offers | The offers on an ASIN you sell change while another seller is on it: the Buy Box, prices, sellers. | Now (default) | HTTPS, chat | | Business offers (B2B) | The same for the business (B2B) offers on an ASIN. | Now | HTTPS only — a message for every change | | Fee promotions | Amazon offers you a fee promotion: what it is, when it runs, the discount. | Now | HTTPS, chat | ### Orders & fulfillment [#group-orders] | Notification | What it tells you | Delivered | Channels | | -------------------------------- | --------------------------------------------------------------------------------- | --------- | ----------- | | Order changes | An order's status changes, or the buyer asks for a change such as a cancellation. | Now | HTTPS, chat | | Multi-Channel Fulfillment orders | A Multi-Channel Fulfillment order's status, packages and tracking. | Now | HTTPS, chat | | FBA Onsite shipments (Brazil) | Amazon creates or cancels a shipment for an order. *BR only.* | Now | HTTPS, chat | | External fulfillment shipments | A shipment from your own fulfillment location changes status. | Now | HTTPS, chat | | Shipment tracking milestones | A shipment's carrier tracking milestones. | Not yet | HTTPS, chat | ### Inventory [#group-inventory] | Notification | What it tells you | Delivered | Channels | | ---------------- | ------------------------------------------------------------------------------------------------ | --------- | --------------------------------------- | | FBA inventory | A SKU's FBA quantities change — fulfillable, inbound, reserved, unfulfillable — per marketplace. | Now | HTTPS only — a message for every change | | Hourly inventory | Each hour: your highly available inventory, in units. | Now | HTTPS only — hourly metrics | ### Sales & traffic [#group-sales] | Notification | What it tells you | Delivered | Channels | | ----------------- | ------------------------------------- | --------- | --------------------------- | | Hourly sales | Each hour: ordered units and revenue. | Now | HTTPS only — hourly metrics | | Hourly page views | Each hour: detail page views. | Now | HTTPS only — hourly metrics | ### Finance [#group-finance] | Notification | What it tells you | Delivered | Channels | | ------------ | ----------------------------------------------------------------------------------------- | --------- | --------------------------------------- | | Transactions | A transaction posts to your account: its type, amount and related IDs, such as the order. | Now | HTTPS only — a message for every change | ### Account [#group-account] | Notification | What it tells you | Delivered | Channels | | -------------- | ---------------------------------------------------------------------------- | ------------- | ----------- | | Account health | The seller account's status changes between normal, at risk and deactivated. | Now (default) | HTTPS, chat | ### Reports & data — for developers [#group-data] | Notification | What it tells you | Delivered | Channels | | ------------------------- | -------------------------------------------------------------------------------------------- | --------- | --------------------------------------- | | Report finished | A report request finishes — done, cancelled or fatal — with the report's ID and document ID. | Now | HTTPS only — a signal for your own code | | Feed finished | A feed finishes — done, cancelled or fatal — with its result document ID. | Now | HTTPS only — a signal for your own code | | Data Kiosk query finished | A Data Kiosk query finishes, with its data or error document ID. | Now | HTTPS only — a signal for your own code | ### Amazon Ads — Marketing Stream [#group-ads] | Dataset | What it holds | Delivered | Channels | | -------------------------- | --------------------------------------------------------------------------- | --------------------------------------------- | -------- | | Ads performance (hourly) | Each hour: impressions, clicks, spend, conversions and sales, per campaign. | As data in your report tables — not a webhook | — | | Converted products (daily) | Each day: the products bought after an ad. | As data in your report tables — not a webhook | — | Every message's `summary` has a readable `text` and a `severity`, plus the fields of its notification. Amazon's code for each notification (`messageType`) and its fields: [Webhook message schema](/help/app/settings/webhooks-schema). ### What you will see [#amazon-behaviour] * **When messages arrive.** Listing issues and Listing status come about 11–19 minutes after the change; Pricing health and Brand content within about a minute. Of the six defaults, Competing offers is usually the busiest. * **Issues cleared after a delete.** About 20 minutes after you delete a SKU, Amazon clears its issues; that message is delivered like any other. * **The last competitor leaving.** Amazon notifies only while another seller is on the ASIN, so the moment the last one leaves produces no message. * **Report finished includes SellerSheet's own reports:** the ones it requests to keep your store's data in sync, many a day. * **Use a message as confirmation.** When you change a listing, a price or brand content, the message tells you Amazon has applied it. ### Severity and colour [#severity] | `severity` | Card colour | When | | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `critical` | Red | A listing suppressed or its catalog item removed; the account deactivated; an order that cannot be fulfilled | | `warning` | Orange | Other listing issues; a listing not buyable or deleted; a product type changed; pricing health; another seller holds the Buy Box; the account at risk; out of stock, self-fulfilled or at FBA; a buyer asks to cancel, or an order is cancelled; a fulfillment order partly complete or cancelled; a shipment cancelled; a report, feed or Data Kiosk query cancelled or failed | | `info` | Blue | Everything else — for example brand content, competing offers where you hold the Buy Box or nobody does, hourly metrics, transactions, fee promotions, a finished report | | `recovery` | Green | Issues cleared; a listing buyable again; the account back to normal; a Multi-Channel Fulfillment order complete | ## What a chat card shows [#chat-card]
```text SellerSheet Webhooks · myStore · 3 messages myStore-US (3) • Listing issues · SKU SKU-EXAMPLE-01 · B0EXAMPLE01 — Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED • Listing status · SKU SKU-EXAMPLE-02 · B0EXAMPLE02 — Buyable · Status=BUYABLE,DISCOVERABLE • Competing offers · B0EXAMPLE05 — 1 other seller: A2EXAMPLEOTHER 19.99 USD FBM, Buy Box, 95% of 120 · you 21.49 USD FBA, 99% of 812 · OfferChangeType=External · BuyBoxPrice=19.99 USD · NumberOfOffers=new Merchant 1,new Amazon 1 Amazon sent 02:28 (changed 02:14) GMT-7 · What these mean ``` * **One card a minute at most.** The first message opens a one-minute window; every message that arrives in it goes on the same card. (A window that reaches 2,000 messages sends its card at once.) * **Title:** `SellerSheet Webhooks`, the store names (up to two, else the number of stores) and the number of messages. * **Colour:** the worst [severity](#severity) on the card. * **Sections:** one per store ref, for example `myStore-US`; "(not connected)" marks a marketplace you have not connected. * **Lines:** the notification, the SKU and ASIN (the ASIN links to the product page on that marketplace), plain words, then Amazon's own field names and values as `Field=VALUE`, so an AI agent in the group can act on the exact codes. A competing seller's ID links to its storefront, which shows its name; up to 5 sellers are listed, then "+N more". * **Repeats:** identical messages — the same store, notification, text and change time — are one line ending `×N`. Each was delivered, and counts. * **Long cards:** after 40 lines, or the chat app's size limit, the card ends with "+N more — open the delivery log", a link to this webhook's [delivery log](#delivery-log). Every message the card carries, shown or not, was delivered. * **Footer:** when Amazon sent the messages and, in brackets, when the changes happened (with the date if that was an earlier day), in the first store's marketplace time — then **What these mean**, a link to this section. ### Card language [#card-language] Each chat webhook has a **Language**: English or 中文. Everything SellerSheet writes on the card follows it — the message count, the notification names, the plain words, "(not connected)", "+N more" and the footer, whose **What these mean** then opens the Chinese version of this section. Amazon's field names and values (`Severities=ERROR`, `competitivePriceThreshold=24.99 USD`), SKUs, ASINs, seller IDs and prices stay exactly as Amazon sends them, so an AI agent in the group reads the same codes in either language. The same card in 中文: ```text SellerSheet Webhooks · myStore · 3 条消息 myStore-US (3) • 商品问题 · SKU SKU-EXAMPLE-01 · B0EXAMPLE01 — 商品不可购买(被禁止显示) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED • 商品状态 · SKU SKU-EXAMPLE-02 · B0EXAMPLE02 — 可购买 · Status=BUYABLE,DISCOVERABLE • 竞争报价 · B0EXAMPLE05 — 1 个其他卖家:A2EXAMPLEOTHER 19.99 USD FBM,购物车,好评率 95%(120 条) · 你 21.49 USD FBA,好评率 99%(812 条) · OfferChangeType=External · BuyBoxPrice=19.99 USD · NumberOfOffers=new Merchant 1,new Amazon 1 亚马逊 02:28 发送(02:14 变更)GMT-7 · 各项含义 ``` HTTPS has no language: its JSON carries Amazon's notification unchanged. ## The HTTPS body [#https-body] Each request is a `POST` with `Content-Type: application/json` and these headers: | Header | Value | | --------------------------- | ----------------------------------------------------------------------------------------------------------- | | `X-SellerSheet-Webhook-Id` | The webhook's ID | | `X-SellerSheet-Delivery-Id` | The delivery's ID — the same on every try | | `X-SellerSheet-Timestamp` | Unix seconds when this try was sent | | `X-SellerSheet-Signature` | `sha256=` and the hex HMAC-SHA256, keyed with your signing secret, of the timestamp, a `.` and the raw body | | `X-SellerSheet-Test` | `true` on a **Send test**, else `false` | The body is one **delivery**: up to 100 messages, at most 1 MB. A request goes when 100 messages are waiting, or 2 seconds after the first one arrived. An example with one message, made-up values: ```json { "deliveryId": "dlv_8f3a1c9e2b7d4e6fa0b1c2d3e4f5a6b7", "webhookId": "0c6f2a8e-4d1b-4e7a-9b35-6e8d2f1a4c90", "organizationId": "7b2e9c41-0d3a-4f6b-8e15-9c2a4d6f8b30", "sentAt": "2026-10-27T09:28:33Z", "attempt": 1, "schemaVersion": 1, "messages": [ { "messageId": "5c0e8f4a-2b7d-4e91-a3c6-000000000001", "messageType": "LISTINGS_ITEM_ISSUES_CHANGE", "fingerprint": "sha256:af6e358a51bec4bc1275fba29469312dce87aa4609a42c42564a35c8c190d1a5", "store": { "storeId": "3f6c2a9e-5b1d-4c8e-9a7f-2d4e6b8c0a11", "ref": "myStore-US", "sellerId": "A1EXAMPLESELLER", "marketplaceId": "ATVPDKIKX0DER", "countryCode": "US", "connected": true }, "eventTime": "2026-10-27T09:14:03Z", "publishTime": "2026-10-27T09:28:30Z", "receivedAt": "2026-10-27T09:28:32Z", "summary": { "text": "SKU SKU-EXAMPLE-01 (B0EXAMPLE01) on US: Listing not buyable (suppressed) · Severities=ERROR · EnforcementActions=LISTING_SUPPRESSED", "severity": "critical", "sku": "SKU-EXAMPLE-01", "asin": "B0EXAMPLE01", "severities": ["ERROR"], "enforcementActions": ["LISTING_SUPPRESSED"], "cleared": false }, "amazon": { "notificationType": "LISTINGS_ITEM_ISSUES_CHANGE", "notificationVersion": "1.0", "payloadVersion": "2023-12-13", "eventTime": "2026-10-27T09:14:03.000Z", "notificationMetadata": { "ApplicationId": "amzn1.sp.solution.00000000-0000-4000-8000-000000000000", "SubscriptionId": "9d4b7e2a-6c1f-4a85-b3e0-000000000001", "PublishTime": "2026-10-27T09:28:30.000Z", "NotificationId": "5c0e8f4a-2b7d-4e91-a3c6-000000000001" }, "payload": { "Sku": "SKU-EXAMPLE-01", "Asin": "B0EXAMPLE01", "SellerId": "A1EXAMPLESELLER", "MarketplaceId": "ATVPDKIKX0DER", "Severities": ["ERROR"], "EnforcementActions": ["LISTING_SUPPRESSED"] } } } ] } ``` Reading it: * **The delivery.** `deliveryId` is the same on every try of one request; `attempt` counts the tries (1 to 3). `webhookId` and `organizationId` name the webhook and your workspace. `schemaVersion` is `1`. * **`messageId`** is Amazon's NotificationId: one Amazon message. **`messageType`** is Amazon's notification type. More types may be added within `schemaVersion` 1: handle one you do not know by its `summary.text`, or skip it. * **`fingerprint`** is the same for the same change published again by Amazon — see [Repeats](#duplicates). * **`store`** is your store and the marketplace the message is about: `ref` is the store ref (`myStore-US`), and `connected` is `false` for a marketplace you have not connected. * **Times** are UTC: `eventTime` when the change happened, `publishTime` when Amazon sent it, `receivedAt` when SellerSheet received it. * **`summary`** is SellerSheet's reading: a readable `text`, a [`severity`](#severity), `sku`, `asin` and the fields of its notification type. * **`amazon`** is Amazon's notification, every value exactly as Amazon sent it — the source of truth. Amazon spells the keys in PascalCase for some notifications and camelCase for others: read a key in either casing. * Every key is always sent; one with no value is `null`. Objects are not closed: ignore a key you do not know. The JSON Schema (2020-12) of the body is published at [sellersheetai.com/schemas/webhooks-v1.json](https://sellersheetai.com/schemas/webhooks-v1.json), with one sample delivery per notification at [sellersheetai.com/schemas/webhooks-v1-samples.json](https://sellersheetai.com/schemas/webhooks-v1-samples.json). Every field, type and example: [Webhook message schema](/help/app/settings/webhooks-schema). A **Send test** carries `X-SellerSheet-Test: true` and one sample message for each notification the webhook takes, for the made-up store `SampleStore`. Answer it like any other request, but do not act on its messages. ## Verify the signature [#verify-signature] Check every request before you trust it: 1. Read the **raw** body bytes, before any JSON parsing. 2. Refuse a timestamp more than 5 minutes from your clock — a replayed request fails. Each try has a fresh timestamp, so retries pass. 3. Compute HMAC-SHA256 over `timestamp + "." + raw body` with your signing secret as the key, and compare `sha256=` with the header in constant time. 4. On success, answer `2xx` at once and process the messages after; on failure, answer `401`. ```python title="verify.py" import hashlib, hmac, time def verify(secret: str, headers, raw_body: bytes, tolerance: int = 300) -> bool: timestamp = headers.get("X-SellerSheet-Timestamp", "") signature = headers.get("X-SellerSheet-Signature", "") if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > tolerance: return False mac = hmac.new(secret.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256) return hmac.compare_digest("sha256=" + mac.hexdigest(), signature) ``` ```js title="verify.mjs" import { createHmac, timingSafeEqual } from "node:crypto"; // headers: lower-case names, as Node gives them; rawBody: a Buffer of the body as received export function verify(secret, headers, rawBody, tolerance = 300) { const timestamp = headers["x-sellersheet-timestamp"] ?? ""; const signature = headers["x-sellersheet-signature"] ?? ""; if (!/^\d+$/.test(timestamp) || Math.abs(Date.now() / 1000 - Number(timestamp)) > tolerance) return false; const mac = createHmac("sha256", secret).update(`${timestamp}.`).update(rawBody).digest("hex"); const expected = Buffer.from(`sha256=${mac}`); const given = Buffer.from(signature); return expected.length === given.length && timingSafeEqual(expected, given); } ``` In Express, read the raw body with `express.raw({ type: "application/json" })` on the route; in Flask, `request.get_data()`. ## Retries, pause and resume [#retries-and-pause] * **Tries.** A delivery is tried at once, then again after 20 seconds and after 90 seconds — the same `deliveryId`, the next `attempt`. Each try waits up to 10 seconds for an answer. * **What fails a try:** an answer other than `2xx` (a redirect included — it is not followed), no answer within 10 seconds, no connection, or a chat app's refusal inside its answer (for example Feishu's `code` or WeCom's `errcode`). * **A failed delivery.** When all three tries fail, its messages are **Failed**: not billed, and not sent again. * **Pause.** After **3 failed deliveries in a row** the webhook is **Paused — failing** and the organization's owner and admins get one e-mail. A delivered one in between starts the count again. * **Resume.** The Webhooks page shows a banner for a paused webhook. **Resume** sends a test message first and turns the webhook back on only if the destination accepts it; otherwise it stays paused and the destination's answer is shown. * **While paused or off**, nothing is sent and nothing is billed. Messages that arrive meanwhile are recorded as **Skipped** in the delivery log and are not sent later. * **Paused — no credits.** See [Pricing and usage](#pricing): it turns itself back on. * **Too slow.** If an HTTPS endpoint falls 2,000 messages behind, new messages for it fail at once ("the webhook answers too slowly") instead of holding up everyone else's. * To stop a webhook yourself, edit it and untick **Enabled**. ## Repeats and messageId [#duplicates] Amazon is the source of truth: SellerSheet delivers every message Amazon sends, including Amazon's own repeats, and drops nothing on the way. * **A retry repeats a delivery.** If your endpoint processed a delivery but answered too late, the next try brings the same `deliveryId` and the same messages. Keep the `messageId`s you have handled for a day or two and drop one you already have. * **Amazon sometimes publishes the same change again** as a new message — a new `messageId`, the same `eventTime`. Its `fingerprint` is the same, so compare `fingerprint` if you want to act on each change once. On a chat card such repeats are one line `×N`. * **Brand content** and **Product type definitions** arrive once per store you tick — tick one store to get each change once. * **Competing offers** on HTTPS: every message arrives, with `sellersChanged` and `buyBoxWinnerChanged` saying whether the sellers on the ASIN or the Buy Box winner changed since the previous message; filter on them if you only want those. ## Pricing and usage [#pricing] * **500 delivered messages a month are free**, for every organization, on every plan. The count starts again on the 1st of each month (UTC). * **Beyond the 500**, each delivered message is paid from the organization's Credits, at the price shown on the Webhooks page. Plans and Credits: [Plans and prices](/#pricing) and [Billing & Credits](/help/app/settings/billing). * **One message delivered to one webhook is one message.** A message two webhooks take counts twice. A chat card counts every message it carries, `×N` lines and "+N more" included. * **Never billed:** test messages, failed messages, skipped messages (a paused or off webhook), and filtered ones (a chat webhook's competing-offers option). * **80 %.** When the month reaches 400 messages, the owner gets one e-mail. * **Out of Credits.** When the month's 500 are used and the Credits run out, the organization's webhooks pause (**Paused — no credits**) and the owner gets an e-mail. They turn themselves back on after a top-up, or at the start of the next month. About a minute of messages may still be delivered after the balance reaches zero; the balance never goes below zero. * **Where to see it:** the top of the Webhooks page shows this month's messages, what is left of the 500 and the Credits spent on webhooks this month; **Billing & Credits** shows the same in its Credits card; the [Credit ledger](/help/app/settings/billing#ledger) has one line per charge; the delivery log shows each delivery's billable messages. ## The delivery log [#delivery-log] **Settings → Webhooks → Delivery log** lists every delivery and every message of the last 30 days, newest first. Open it from the button at the top of the Webhooks page, from a webhook's row (**Open its delivery log**, already filtered to that webhook), or from a chat card's "+N more" link. **Show** switches between two lists: | List | One row per | Columns | | -------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Deliveries** | HTTPS request or chat card | **Sent**, **Webhook** (name and type), **Outcome** (with a **Test** tag for a test), **Messages sent**, **Billable** (and "billed" once charged), **HTTP status**, **Tries**, **Error** | | **Messages** | Amazon message | **Received**, **Notification**, **Store** ("Not a SellerSheet store" when it names none of yours), **SKU / ASIN**, **Webhooks** (its outcome at each webhook, or "No webhook took it") | Filters, kept in the page address so a filtered view can be bookmarked or shared: * **Webhook** and **Time** (**Last hour**, **Last 24 hours**, **Last 7 days**, **Last 30 days**) on both lists. * **Outcome**: **Delivered** or **Failed** on Deliveries; Messages add **Skipped** and **Filtered**. * Messages only: **Notification**, **Store**, and **Search SKU or ASIN** — an exact SKU, or an ASIN. * **Reset** clears them. The columns button shows or hides columns. | Outcome | Meaning | | ------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **Delivered** | The destination accepted it. Billable beyond the month's free 500. | | **Failed** | Every try failed, or the webhook fell too far behind. Not billed, not sent again. | | **Skipped** | The webhook was paused or off when the message arrived. Not billed, not sent later. | | **Filtered** | A chat webhook with **Competing offers: only when the sellers or the Buy Box winner change**, and only a price moved. Not billed. | **Open** on a message shows its **Message ID**, **Received**, **Event time**, **Store**, **SKU / ASIN**, **Fingerprint**, its outcome at each webhook, and **The message as sent** — the message's JSON exactly as delivered, with **Copy JSON**. The JSON is ready a few minutes after the message arrives (until then the panel asks you to open it again shortly) and is kept 30 days. ## Troubleshooting [#troubleshooting] **Send test**, the log's **Error** column and the paused banner show the destination's own answer: | You see | Fix | | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | | Feishu 19021 | Signature check failed: paste the secret again, exactly as Feishu shows it — or remove it if the bot does not verify signatures. | | Feishu 19022 | The bot has an IP allowlist: [contact support](/help/contact) for the IP to allow. | | Feishu 19024 | Keyword check failed: add the keyword `SellerSheet`. | | DingTalk 310000 | A security setting refused it: check the keyword `SellerSheet`, the 加签 secret or the IP setting. | | DingTalk 300001 · WeCom 93000 | The robot's address is no longer valid: copy it again. | | DingTalk 130101 · WeCom 45009 | The app's rate limit: several webhooks post to the same group. Combine them into one. | | Slack: invalid_token, no_service | The Slack webhook was removed: create a new one. | | Teams: … | The workflow refused it: check the workflow in Teams. | | HTTP 3xx (redirects are not followed) | Use the final address. | | HTTP 401 / 403 from your endpoint | Your signature check refused it: verify over the raw body, with the secret saved on the webhook. | | no answer within 10 s | Answer `2xx` first and process after. | | could not connect | The endpoint is down or not reachable from the internet. | | That address is not on the public internet | Use a public `https://` address on port 443. | **A webhook receives nothing:** * Its status is **Active** — not paused or off. * The notifications and stores you want are ticked, in the workspace that owns the store. * **Include marketplaces not connected to SellerSheet** is on, if the change was on a marketplace you have not connected. * In the delivery log, **Messages** shows whether the message arrived at all and what happened to it at each webhook (**Skipped**, **Filtered**, "No webhook took it"). * A marker on the store's cell in the edit panel says when Amazon refused the subscription. When it names a permission the store's authorization does not include, re-authorize the store on [Stores & Marketplaces](/help/app/settings/stores); if it keeps failing, [contact support](/help/contact). ## FAQ [#faq] ### Who can manage webhooks? [#who-can-manage-webhooks] The owner or an admin of the workspace. Members do not see the Webhooks page. ### How many webhooks can a workspace have? [#how-many-webhooks-can-a-workspace-have] Up to 10. ### Why can't I tick some notifications? [#why-cant-i-tick-some-notifications] A grey row is a notification the webhook cannot take: Amazon Ads (it arrives as data in your report tables, not as webhooks) or shipment tracking milestones (not available yet), or, on a chat destination, one that is HTTPS only — hourly metrics, a message for every change, or a signal for your own code. The row says why. ### What do webhooks cost? [#what-do-webhooks-cost] Every organization gets 500 delivered messages a month free, on every plan. Each delivered message beyond them is paid from the organization's Credits, at the price shown on the Webhooks page. Test, failed, skipped and filtered messages are never billed. ### Can a webhook send e-mail? [#can-a-webhook-send-e-mail] No. E-mail is not a destination; use a chat group or an HTTPS endpoint. SellerSheet still sends its own notices by e-mail: to the owner and admins when a webhook pauses after failed deliveries, and to the owner at 80 % of the month's free messages and when Credits run out. ### Do webhooks read my Google Sheets? [#do-webhooks-read-my-google-sheets] No. Webhooks pass on Amazon's notifications; SellerSheet does not read or write your sheets to send them. ### What happened to SellerSheet Alerts? [#what-happened-to-sellersheet-alerts] Alerts is now Webhooks. The same notifications and chat apps, plus 17 more of Amazon's notifications, on every plan, up to 10 per workspace, and HTTPS for your own systems. # Studio (https://sellersheetai.com/help/app/studio) > The Studio screen and its library. Studio makes a product's listing content step by step — buyer insights, copy, images and A+ — and publishes the copy and images to the live listing (A+ you copy into your Sheet). Each product has one plan, shared by your team. The **Image Library** keeps every image Studio makes. A plan has five steps: **Product** → **Buyer insights** → **Copy** → **Images** → **Publish**. It saves itself a moment after each edit. **Credits.** Every AI action shows its price on its button before you click (**· N credits**). It is billed when it starts and refunded if it fails. Your balance and model route are in the Studio header; top up on [Billing & Credits](/help/app/settings/billing). **Write access.** Studio reads the live listing from the store you pick. Placing an image on a store's listing slot and sending to Amazon need write access to that store. ## Main steps — make a product's listing content [#main-steps] ### Start a plan [#step-start] **New plan** → pick the **Product** and the store to **Read the live listing from** → **Create plan**. Or click **Studio** on a row of [Products](/help/app/products). ### 1 · Product [#step-product] **Refresh** reads the live listing and the top competitors from Amazon. Pick the hero SKU, click the images to use as samples, add competitors by ASIN. ### 2 · Buyer insights (optional) [#step-insights] **Create report** on what buyers praise and complain about in the category, answer the questions it raises, then **Write brief** — the facts your copy must use. ### 3 · Copy [#step-copy] Choose what the copy uses (your **Draft** or the **AI Revised** brief), the samples, competitors to learn from, keywords and languages → **Generate copy**. Edit any field in place. ### 4 · Images [#step-images] **Re-plan** (or **Plan by hand**) sets the images and A+ modules. For each slot, add a reference and samples → **Generate**, then **Select** the version that goes on the listing. ### 5 · Publish [#step-publish] **Dry run** asks Amazon to check the change without saving it. **Send** changes the live listing, after a confirm that names the SKUs. ## Every control [#controls] What each control changes: | Effect | Meaning | | -------------------------------- | ------------------------------------------------------------------------------- | | | Reads or opens something — changes nothing on Amazon or noon. | | Changes SellerSheet | Saved in your SellerSheet workspace only — the plan, your images, your library. | | | Changes your live Amazon listing. | | Live on noon | Changes your live noon listing. | | | Paid from your Credits balance; refunded if it fails. | ### Studio home [#studio-home] The workspace's plans, 50 per page. | Control | What it does | Effect | | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Continue** | Opens the plan saved last. | | | Tiles **In progress** · **Ready to publish** · **Published** · **Credits spent** | Counts of plans; Credits spent in the last 30 days. **Ready to publish** and **Published** filter the list. | | | **All** · **Ready** · **Published** · **Archived** | Filters by plan status. | | | **Store** · **Since** · **Sort** | The store a plan reads; **Last 7 / 30 / 90 days**; **Last saved**, **Newest** or **Name**. | | | **Search plan, SPU, product name…** | At least 2 characters. | | | **New plan** | Opens [New plan](#new-plan). | | | **Archive** / **Unarchive** | Archives the selected plans, or brings archived ones back. | Changes SellerSheet | | **Columns** | Shows or hides columns: **Image**, **Product / SPU**, **Store**, **Step**, **Status**, **Images**, **Saved**, **By**. | | | **Open** | Opens the plan. | | ### New plan [#new-plan] | Control | What it does | Effect | | ------------------------------ | ---------------------------------------------------------------------------------------------------- | ----------------------------- | | **Product** | A product from your catalog — search SKU, ASIN or name. A product has one plan. | | | **Read the live listing from** | The store Studio reads the live listing and competitors from. You choose where to publish in step 5. | | | **Create plan** | Creates the plan — or opens the product's plan if it has one. | Changes SellerSheet | ### Plan header and footer [#plan-header] | Control | What it does | Effect | | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- | | **Saved** *time* · *name* **on** *step* | When the plan was saved, and who else is on it now. | | | **Activity** | Who saved each step, and who is on the plan now. | | | **Credits** *balance* | Opens Billing & Credits. Hover it for what this plan spent. | | | Steps **Product** … **Publish** | Opens that step. | | | **Profile** — **Amazon** *store* / **noon** *account* | Copy, Images and Publish work on the profile chosen here; each keeps its own copy and images. Product and Buyer insights are shared. **read-only** marks a profile you cannot write. | | | **Back** · **Continue** | The previous or next step. Steps save themselves; these buttons save nothing extra. | | | **Save to Sheet** | Not available yet — saving a plan to a Google Sheet comes in a later release. | — | | **Changed by someone else · Resolve** | When a teammate saved the same step while you edited: **Show their version**, then **Keep mine** or **Load theirs**. | Changes SellerSheet | ### 1 · Product [#product] | Control | What it does | Effect | | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Refresh** | Reads the live listing and the top competitors from Amazon into the plan. Amazon stores only. | | | **SKUs & images** tab | Each SKU with its status, price and images. Click an image to use it as a sample — samples go with every copy and image generation. | Changes SellerSheet | | **Make hero** | Makes this SKU the product's hero. | Changes SellerSheet | | **Upload files** · **Paste image URL + Enter** | Adds your own photos to the plan's uploads. | Changes SellerSheet | | **Live text** tab | The live title, item highlight, bullet points and description of one **SKU**; edit them as your draft. **Reset to live** puts the live text back. When the plan has also read a noon listing, switch between **Amazon** and **noon**. | Changes SellerSheet | | **Competitors** tab → **Find top 3** | Searches Amazon with the product's name and adds the top 3 listings. | | | **ASIN or image URL** → **Add** | Adds a competitor by its ASIN or product page, or an image URL to your uploads. | Changes SellerSheet | | **Upload reference** | Uploads a reference image. | Changes SellerSheet | | **Copy** · **Copy to draft** | Copies one field, or every field, of a competitor into your draft. | Changes SellerSheet | | **Remove** · hide image | Removes a competitor, or hides one of its images from the pickers. | Changes SellerSheet | ### 2 · Buyer insights [#buyer-insights] Optional — Copy works from your Draft too. Amazon shares buyer data for US, UK, FR, IT, DE, ES and JP only; for another marketplace you pick one of these to view the report through. | Control | What it does | Effect | | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Marketplace the report is viewed through** · **Category the report is about** | Where and what the report covers. The category is the listing's own, or one you look up by browse node id or product kind. | | | **Create report** / **Create again** | Builds the buyer insights report: what buyers praise and complain about, and what top sellers solved. | | | **Answer the N questions** | Opens **Answers** on the gaps buyers ask about. | | | **Answers** tab — answer boxes, **Confirm**, **Use examples as starting points** | Your answers become facts in the brief; blanks are left out and nothing is invented. Press Tab in an empty box to start from the sample. | Changes SellerSheet | | Buyer keywords · **Add all** | Words buyers use. Click one, or **Add all**, to add them to the copy's must-integrate keywords. | Changes SellerSheet | | **Write brief** | Writes the Listing Brief from your answers. | | | **Brief** tab → **Copy uses** **Draft** / **AI Revised** | Which instructions Copy generates from: your Draft, or the Draft plus this brief. | Changes SellerSheet | | **Revise** | Writes the brief again. | | | **Generate copy from this brief** | Sets Copy to use AI Revised and opens step 3. Nothing runs until you generate there. | Changes SellerSheet | ### 3 · Copy [#copy] | Control | What it does | Effect | | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Instructions** — **Draft** · **AI Revised**, **Copy uses** | The facts, tone and claims the copy must follow. AI Revised is the brief from step 2; editing it by hand marks the brief out of date. | Changes SellerSheet | | **Samples** | Product photos the model looks at. | Changes SellerSheet | | **Learn from** | Competitors whose title and first five bullets the model studies. None picked sends none. | Changes SellerSheet | | **Must-integrate keywords** | Words the copy must include. Enter or a comma adds one; paste a list to add many. | Changes SellerSheet | | **Variants** | Every child SKU goes to the model, which writes a title, highlight and one bullet per SKU on top of the shared copy. Read-only. | | | **Output languages** | English is the source and always generated. Each language is priced separately. | Changes SellerSheet | | **Length** — **Shorter** · **Longer** · **Reset** | The longest each field may be, for this plan. | Changes SellerSheet | | **Save as default** | Keeps these lengths as your own default, for your next plans and the Sheets sidebar. | Changes SellerSheet | | **Generate copy** / **Regenerate copy** | Writes the title, item highlight, bullet points, description and search terms in every chosen language. | | | Language tabs → **Regenerate** *language* | Writes one language again. | | | **SKU** · **Show original** | Shows the copy of the parent, the hero or one SKU; compare with the live text. | | | Fields **Title** · **Item highlight** · **Bullet point** · **Description** · **Search terms** | Edit in place. Counters turn amber at the limit and red over it. **verify** marks numbers that are not in your facts — check them. | Changes SellerSheet | On a **noon** profile, Copy writes English and Arabic together: | Control | What it does | Effect | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Generate EN + AR** | Writes noon's title, bullets and description in both languages; priced as two languages. | | | **Start from Amazon** | Free. Copies the Amazon English text (generated, else live) and places the Amazon images on noon — MAIN to S01, Image 1–7 to S02–S08. Image 8 has no noon slot. | Changes SellerSheet | ### 4 · Images [#images] The **Plan** card sets what to make; the slot table below has one row per listing position, per SKU. The **A+** tab beside the SKU tabs holds the A+ modules. | Control | What it does | Effect | | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------- | | **Reads** | What Re-plan reads: the brief, the copy and the sample photos. | | | **Images** · **Number of images** · **Size** · **Callouts** | Images on or off; MAIN + N images; **1024 · fast** or **2048 · full**; short feature text on the secondary images, never on MAIN. | Changes SellerSheet | | **A+** · **Tier** · **Modules** · **Text** | A+ on or off; **Basic · 970 × 600** or **Premium · 1464 × 600**; how many modules; text on or off. | Changes SellerSheet | | **Plan by hand** | Fill the rows' guides yourself. | Changes SellerSheet | | **Re-plan** | Writes each row's guide and the A+ modules from the brief, copy and samples. Samples, references and versions stay. | | | **Fold the plan** | Folds the card to one line, in this browser. | | | SKU picker | The SKU whose slots you see; **2/6** = slots holding a selected version. | | | **Add slot ▾** | Adds a free listing position. | Changes SellerSheet | | **Generate ready** | Generates every slot that is ready. | | | **Guide** | What the slot's image should show (Purpose, Callouts). **Held** waits for an unanswered fact. | Changes SellerSheet | | **Add sample photos** | Photos of your product the image is made from, up to 6. | Changes SellerSheet | | **Add a reference** · **Change the reference** · **Clear the reference** | A style to follow — from **My gallery**, **Reference gallery**, **My images** or **Competitors**, a pasted URL or an upload — used as **Style**, **Blend** or **Exact**. | Changes SellerSheet | | **Generate** / **Again** | Makes new versions of this slot. Its menu sets **Size**, versions per run, and **Remove slot**. | | | Live image → **Edit an area of the live** *slot* | Edits an area of the image now on the listing, as a new version. | | A version's menu: | Control | What it does | Effect | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Select** · *language* | Puts this version on the plan's store at this position. It reaches Amazon only when you send it in Publish. Needs write access to the store. | Changes SellerSheet | | **Place on** | Puts it on the same position of the plan's other stores. | Changes SellerSheet | | **Use as a sample** · **Use as the reference** | Feeds this version into the next generation. | Changes SellerSheet | | **Also use this image for** · **Use for** *SKU* | A copy for another SKU, placed on its slot. | Changes SellerSheet | | **Edit an area…** | Changes one area of this version, as a new version. | | | **Compare** | Compares this version with others. | | | **Add to my gallery** | Saves it to your gallery; the image is read once to describe its style. | | | **Contains an AI person** | Adds or removes Amazon's AI-person disclosure tag in the image file. | Changes SellerSheet | | **Languages · click to convert** | Makes this image for another language, as a new version. Priced per language. | | | **Colours · convert for another SKU** | Makes the image in another SKU's colour. Priced per conversion. | | The **A+** tab: | Control | What it does | Effect | | --------------------------------------------------------------- | ------------------------------------------------ | -------------------------------- | | **Generate all** | Makes every module's image. | | | Module brief line · **Headline** · **Body** | Edit the module's brief and text by hand. | Changes SellerSheet | | **Write with AI** | Writes the module's headline, body and alt text. | | | **Convert to Premium** · **Convert to Basic** · **Make mobile** | Remakes a module image at another canvas size. | | | **Pick** | Chooses the version used for the module. | Changes SellerSheet | Studio never sends A+ to Amazon: Publish lists the A+ cells for you to copy into your Sheet. ### 5 · Publish [#publish] | Control | What it does | Effect | | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | | **Preview** · **Publish** | Preview the listing page, or send. | | | **Stores** · **Language** · **Live or new** · **SKU** | In Preview: which store, language, SKU, and **Current live** or **New**. | | | Store tabs | Publish has one tab per Amazon store of the plan. A ringed image is a new version (sent); a faded image is the live one (kept, not sent). | | | **Include text, all SKUs** · **Text** | Whether each SKU's text is sent with its images. | Changes SellerSheet | | **Copy images from** | Copies the new image versions of another SKU onto this one. | Changes SellerSheet | | **Edit listing** | Per field: **Text source** **Generated** or **Original**, and which fields to submit — **Submit all** or **Submit none**. A field over Amazon's limit, or with an unanswered ⟨fill in⟩, is never sent; the row says **Fix N field(s)**. | Changes SellerSheet | | **Dry run** · **Dry run all** | Amazon checks the change and answers **Valid** or the issues. Nothing is saved on Amazon. | | | **Send** · **Send N SKUs** | After a confirm, **Send to Amazon** changes the live listings of the named SKUs: their new images and ticked text fields. Amazon may take minutes to show it. | | | **Use in catalog** | Adds the SKU's new images to its images in [Products](/help/app/products). | Changes SellerSheet | | A+ → **Copy as TSV** | Copies the A+ cells to paste into your Sheet. | | On a **noon** profile, Publish sends one noon listing — the English and Arabic copy, the images by position, and the SKUs linked on that account: | Control | What it does | Effect | | ------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------- | | **Dry run** | noon checks the listing without saving. | | | **Send N to noon** | Sends it. Waits until the Arabic copy exists. noon then reviews it; images are fetched 8–17 minutes after a save. | Live on noon | | **Check status** | Reads QC and noon's review from noon again. | | | **Open the listing form** | Opens the listing in the [noon listing form](/help/app/catalog#new-noon-listing). | | Removing an image in Studio never removes it on noon. ### Image Library [#image-library] **Image Library** in the menu: images made in Studio and saved for your catalog SKUs. | Control | What it does | Effect | | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | **Catalog** · **My gallery** · **Reference gallery** | Your SKUs' versions; your own saved images; public reference images. | | | **List** · **Grid** | How the images are shown. | | | **Product** · **SKU** · **Slot** · **Used on** · **Source** | Filters for Catalog. **Used on** is the store a version is placed on, or **not used**. | | | **Platform** · **Surface** · **Image type** · **Category** · **Style** | Filters for the galleries. **Surface**: **Listing images**, **A+ basic**, **A+ premium**. | | | **Search SKU, SPU, product…** | At least 2 characters. | | | **Use on SKU…** | Catalog, one image selected: copies it to a SKU and slot you pick on the same store, as a new version, and places it there. The original stays. | Changes SellerSheet | | **Add to my gallery** | Catalog: saves the selected versions to your gallery. Each is read once to describe its style, billed per image. | | | **Copy URLs** · **Download** | Catalog: copies the selected images' links, or downloads them. | | | **Upload** | My gallery: adds your own images. Each is read once to describe its style. | | | An image → details | **Used on**, its **Versions**, when it was **Made**; **Copy URL**, **Add to my gallery**, **Open in Studio**, **Use on SKU…**. | | | **AI person** | Marks an image showing a photorealistic AI-made person (Amazon's disclosure); the file's metadata is updated. | Changes SellerSheet | ## Related [#related] * [AI images](/docs/mcp-api/workflows/images) — the same image tools for your AI over MCP. * [Optimize listings](/docs/mcp-api/workflows/listings-optimize) — listing copy with your AI. * [Review insights](/docs/mcp-api/workflows/reviews) — the buyer insights report. * [A+ Content](/docs/mcp-api/workflows/aplus) — publishing A+, which Studio leaves to you. * [Images panel](/help/sheets/sellers/images) — AI listing images in the Google Sheets sidebar. * [Billing & Credits](/help/app/settings/billing) — how Credits are charged and refunded. ## Stuck? [#stuck] * An error message in the app: [Web app troubleshooting](/help/troubleshooting/app). * Still stuck: [Contact support](/help/contact). # Contact support (https://sellersheetai.com/help/contact) > Write to support, or ask in the MCP group on WeChat or WhatsApp — and what to include so we can answer the first time. **E-mail:** [support@sellersheetai.com](mailto:support@sellersheetai.com) **Ask in the group:** scan a code with the app on your phone. ## What to include [#what-to-include] * **The message you saw**, word for word, and where: the sidebar panel, the app screen or your AI client. * **When it happened**, with your time zone. * **The store ref**, for example . # Help (https://sellersheetai.com/help) > Help for SellerSheet's own screens — the Google Sheets sidebar and the web app — and for anything that went wrong. ## Where are you stuck? [#where-are-you-stuck] ## Common questions [#common-questions] * [The sidebar asks for a store. What do I type?](/help/troubleshooting/sheets#err-store-ref) * [The sidebar says to run an earlier step first](/help/troubleshooting/sheets#err-step-order) * [Get Amazon's notifications in Feishu, Slack or your own system](/help/app/settings/webhooks) * [Connect a store or add a marketplace](/docs/start/connect) * [Let a teammate see a store without changing it](/docs/mcp-api/control) * [How Credits are charged, and refunded](/help/app/settings/billing) * [Does this button change anything on Amazon?](/help/sheets/buttons) * [My AI says the key is unauthorized](/help/troubleshooting/ai#signing-in) Still stuck? [Contact support](/help/contact) — by e-mail, or in the MCP group on WeChat or WhatsApp. # Ads Reports (https://sellersheetai.com/help/sheets/ads/reports) > Request Amazon Ads reports from sheet rows and download the finished reports. The **Ads Reports** panel requests Amazon Ads reports on demand. The Ads reports SellerSheet syncs on a schedule are already in the [data warehouse](/docs/data). \[\[TODO: screenshot ads/reports]] ## Main steps [#main-steps] ### Fill the rows [#fill-the-rows] On the Ads report sheet, one request per row — pick the report type from the Ads Report Type catalog tab. ### Create Reports [#create-reports] **Create Reports** submits the requests to Amazon Ads. ### Get Reports [#get-reports] **Get Reports** polls pending rows and downloads the completed reports. **Refresh Report Types** regenerates the Ads Report Type catalog tab from the latest report definitions. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Create Reports | 创建报告 | Submit ads report requests from the sheet rows. | WRITES SHEET | | Get Reports | 获取报告 | Poll pending report rows and download completed reports. | WRITES SHEET | | Refresh Report Types | 刷新报告类型 | Regenerate the Ads Report Type catalog tab from the latest report definitions. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`ads_create_async_report`](/docs/mcp-api/tools/ads_create_async_report) requests the same reports over MCP. Guide: [Download Amazon PPC reports](/guides/download-amazon-ppc-reports-in-google-sheets). # Sponsored Brands (https://sellersheetai.com/help/sheets/ads/sb) > List, create, edit and archive Sponsored Brands campaigns, ad groups, ads, ad associations, targets and negatives from sheets. The **Sponsored Brands** panel manages SB advertising with one sheet per entity: campaigns, ad groups, ads, ad associations, targets and negatives. \[\[TODO: screenshot ads/sb]] ## How every ads sheet works [#how-every-ads-sheet-works] * **Setup … Sheet** creates or resets the header block; data rows are not touched. * **List …** fetches entities with the row-4 filters (by default ENABLED and PAUSED). On SB Targets, the Negative filter splits negatives from bidding targets. * **Create …** sends the rows with the required ✎ fields and an EMPTY ID column; new IDs are written back. * **Edit …** pushes the changes of the ticked rows only. **Delete …** archives the ticked rows on Amazon — it cannot be undone. * **Load …** drills down from the clicked row (campaign → ad groups or targets, ad group → ads or targets, ad → ad associations). ## Negatives [#negatives] SB negatives are ad-group level only (Level AD_GROUP with an ad group). **Resolve Brand IDs** looks a plain brand name up on Amazon and rewrites it as `Name (id)` before you create brand negatives. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | List SB campaigns | 列出 | Fetch SB campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SB Ad Groups sheet to that campaign and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SB Targets sheet to that campaign and lists them. | WRITES SHEET | | Create SB campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SB campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SB campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SB campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SB ad groups | 列出 | Fetch SB ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SB Ads sheet to that ad group and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SB Targets sheet to that ad group and lists them. | WRITES SHEET | | Create SB ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SB ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SB ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SB ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SB ads | 列出 | Fetch SB ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ad Associations | 加载广告关联 | Drill down: click a ad row first — this filters the SB Ad Associations sheet to that ad and lists them. | WRITES SHEET | | Create SB ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SB ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SB ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SB ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SB targets | 列出 | Fetch SB targets using the row-4 filters. Default shows active only (ENABLED+PAUSED). Use the Negative filter (TRUE/FALSE/ALL) to split negatives from bidding targets. | WRITES SHEET | | Create SB targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SB targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SB targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SB targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SB negatives | 列出 | Pull ALL SB negatives (keyword · product · brand, ad-group level) for the store, filtered by row-4 Campaign / State. Names from Ads Names. | WRITES SHEET | | Create SB negatives | 创建 | Create from rows with NO Target ID. Per-type gate first; SB is ad-group level only (Level=AD_GROUP + an Ad Group required). | LIVE ON AMAZON, WRITES SHEET | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows with a plain name, look up the brand via Amazon and rewrite as 'Name (id)'. | WRITES SHEET | | Edit SB negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes for ticked rows. | LIVE ON AMAZON, WRITES SHEET | | Delete SB negatives | 删除所选 | PERMANENTLY archive ticked negatives — v1 delete = archive. | LIVE ON AMAZON, WRITES SHEET | | Setup SB Negatives Sheet | 设置表格 | Create or reset the SB Negatives tab. | WRITES SHEET | | List SB ad associations | 列出 | Fetch SB ad associations using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Create SB ad associations | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SB ad associations | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SB ad associations | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SB Associations Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] The same entities are available over MCP — see the Ads section of the [tool reference](/docs/mcp-api/tools). # Sponsored Display (https://sellersheetai.com/help/sheets/ads/sd) > List, create, edit and archive Sponsored Display campaigns, ad groups, ads, targets and negatives from sheets. The **Sponsored Display** panel manages SD advertising with one sheet per entity: campaigns, ad groups, ads, targets and negatives. \[\[TODO: screenshot ads/sd]] ## How every ads sheet works [#how-every-ads-sheet-works] * **Setup … Sheet** creates or resets the header block; data rows are not touched. * **List …** fetches entities with the row-4 filters (by default ENABLED and PAUSED). On SD Targets, the Negative filter splits negatives from bidding targets. * **Create …** sends the rows with the required ✎ fields and an EMPTY ID column; new IDs are written back. * **Edit …** pushes the changes of the ticked rows only. **Delete …** archives the ticked rows on Amazon — it cannot be undone. * **Load …** drills down from the clicked campaign or ad group. ## Negatives [#negatives] SD negatives are product or brand only, at ad-group level (no keyword negatives). **Resolve Brand IDs** turns a plain brand name into `Name (id)`. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | List SD campaigns | 列出 | Fetch SD campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SD Ad Groups sheet to that campaign and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SD Targets sheet to that campaign and lists them. | WRITES SHEET | | Create SD campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SD campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SD campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SD campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SD ad groups | 列出 | Fetch SD ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SD Ads sheet to that ad group and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SD Targets sheet to that ad group and lists them. | WRITES SHEET | | Create SD ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SD ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SD ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SD ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SD ads | 列出 | Fetch SD ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Create SD ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SD ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SD ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SD ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SD targets | 列出 | Fetch SD targets using the row-4 filters. Default shows active only (ENABLED+PAUSED). Use the Negative filter (TRUE/FALSE/ALL) to split negatives from bidding targets. | WRITES SHEET | | Create SD targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SD targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SD targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SD targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SD negatives | 列出 | Pull ALL SD negatives (product · brand, ad-group level) for the store, filtered by row-4 Campaign / State. | WRITES SHEET | | Create SD negatives | 创建 | Create from rows with NO Target ID. SD is PRODUCT/BRAND only, ad-group level only (keyword is not offered). | LIVE ON AMAZON, WRITES SHEET | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows with a plain name, look up the brand via Amazon and rewrite as 'Name (id)'. | WRITES SHEET | | Edit SD negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes for ticked rows. | LIVE ON AMAZON, WRITES SHEET | | Delete SD negatives | 删除所选 | PERMANENTLY archive ticked negatives — v1 delete = archive. | LIVE ON AMAZON, WRITES SHEET | | Setup SD Negatives Sheet | 设置表格 | Create or reset the SD Negatives tab. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] The same entities are available over MCP — see the Ads section of the [tool reference](/docs/mcp-api/tools). # Sponsored Products (https://sellersheetai.com/help/sheets/ads/sp) > Build, list, create, edit and archive Sponsored Products campaigns, ad groups, ads, targets and negatives from sheets — plus suggestions, a bid optimizer, portfolios, exports, history and recommendations. The **Sponsored Products** panel manages SP advertising from Google Sheets. Every entity has its own sheet and the same five buttons; the Campaign Builder creates a whole campaign structure in one go. \[\[TODO: screenshot ads/sp]] ## How every ads sheet works [#how-every-ads-sheet-works] * **Setup … Sheet** creates or resets the header block — filters in row 4, results below. Data rows are not touched. * **List …** fetches entities with the row-4 filters. By default only active ones load (ENABLED and PAUSED). * **Create …** sends the rows that have the required ✎ fields and an EMPTY ID column; the new Amazon IDs are written back. * **Edit …** pushes your changes — only for rows whose Select box is ticked, so nothing is mass-edited by accident. * **Delete …** archives the ticked rows on Amazon. Archiving cannot be undone. * **Load Ad Groups / Load Ads / Load Targets** drill down from the clicked row to the next sheet. ## Main steps — launch a campaign with the Builder [#main-steps--launch-a-campaign-with-the-builder] ### Set up the Builder [#set-up-the-builder] **Setup Tabs** creates the five Campaign Builder tabs: Campaigns, Targets, Bidding Adjustment, Negatives, Bulk Sheet. ### Plan and get suggestions [#plan-and-get-suggestions] Fill the campaigns and ad groups; **Get Suggestions** writes Amazon's ranked keyword recommendations with suggested bids to Builder · Suggestions; **Add Selected to Targets** appends the ticked ones. ### Validate [#validate] **Validate All** checks joins, enums, budgets, naming and name collisions; problems land in the Status columns. ### Launch [#launch] **Launch** validates, then creates the whole structure on Amazon — campaigns, ad groups, ads, targets, negatives — and writes the IDs back. Rows that already have IDs are skipped. ## Optimize [#optimize] * **SP Suggestions:** get targeting and keyword suggestions, mine your own search-term report for negatives (terms with clicks and zero orders), then stage the ticked rows into SP Targets as PAUSED rows to review and create. * **Bid Optimizer:** **Analyze Campaign** reads targets, bid recommendations, the suggested budget and Amazon's recommendations without changing anything; **Apply Selected Bids** and **Apply Suggested Budget** then change the campaign on Amazon. * **Portfolios, Ads Export, Ads History, Ads Recommendations:** list and edit portfolios, export entities, read the change history, and list or apply Amazon's recommendations. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Setup Tabs | 1 · 初始化标签页 | Create the 5 Campaign Builder tabs (Campaigns / Targets / Bidding Adjustment / Negatives / Bulk Sheet). | WRITES SHEET | | Get Suggestions | 获取建议 | Amazon ranked keyword recommendations with suggested bids for every manual ad group's products — written to Builder · Suggestions for review. | WRITES SHEET | | Add Selected to Targets | 3 · 将所选加入投放 | Append the ticked suggestion rows to Builder · Targets with their suggested bids. | WRITES SHEET | | Validate All | 4 · 全部校验 | Validate the whole Builder workbook — joins, enums, budgets, naming, and live name-collision check. Problems land in the Status columns and the Bulk Sheet tab. | WRITES SHEET | | Launch | 5 · 启动 | Validate, then create the whole structure on Amazon (campaigns → ad groups → ads → targets → negatives); IDs and per-row statuses are written back. Rows that already have IDs are skipped. | LIVE ON AMAZON, WRITES SHEET | | List SP campaigns | 列出 | Fetch SP campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SP Ad Groups sheet to that campaign and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SP Targets sheet to that campaign and lists them. | WRITES SHEET | | Create SP campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SP campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SP campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SP campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SP ad groups | 列出 | Fetch SP ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SP Ads sheet to that ad group and lists them. | WRITES SHEET | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SP Targets sheet to that ad group and lists them. | WRITES SHEET | | Create SP ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SP ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SP ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SP ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SP ads | 列出 | Fetch SP ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | WRITES SHEET | | Create SP ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SP ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SP ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SP ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SP targets | 列出 | Fetch SP BIDDING targets using the row-4 filters (positives only — negatives are on SP Negatives). Default shows active (ENABLED+PAUSED). | WRITES SHEET | | Create SP targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit SP targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | LIVE ON AMAZON, WRITES SHEET | | Delete SP targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SP targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | WRITES SHEET | | List SP negatives | 列出 | Pull ALL negatives (keyword · product · brand, both levels) for the store, filtered by the row-4 Campaign / State. Names resolved from Ads Names. | WRITES SHEET | | Create SP negatives | 创建 | Create from rows with NO Target ID. Per-type gate runs first (⚠️ reasons). KEYWORD→keyword+match; PRODUCT→ASIN; BRAND→brand id; Level CAMPAIGN omits the ad group. | LIVE ON AMAZON, WRITES SHEET | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows whose Brand cell is a plain name, look the brand up via Amazon's brand search and rewrite it as 'Name (id)'. | WRITES SHEET | | Edit SP negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes to Amazon for ticked rows (negatives have no bid). | LIVE ON AMAZON, WRITES SHEET | | Delete SP negatives | 删除所选 | PERMANENTLY archive the ticked negatives — v1 delete = archive, cannot be undone. | LIVE ON AMAZON, WRITES SHEET | | Setup SP Negatives Sheet | 设置表格 | Create or reset the SP Negatives tab (data rows untouched). | WRITES SHEET | | Get Suggestions | 获取建议 | Fetch suggestions per the row-4 controls (Source, ASINs / Campaign+Ad Group names, Suggestion Type). Keyword bids are already decimal currency. NOTE: negative-KEYWORD suggestions have no Amazon endpoint — mine the SP Search Terms report instead. | WRITES SHEET | | Search-Term Negatives | 搜索词否定 | NOT an Amazon suggestion — Amazon has no negative-keyword recommendation endpoint. Mines YOUR SP Search Terms report (rpt_sp_search_terms) for search terms with ≥ Min Clicks (J4) and ZERO orders over the Window (K4), writing MINED rows into the grid. Campaign (C4) scopes it; blank = whole account. Tick rows and Send Selected as Negatives. | WRITES SHEET | | Send Selected to SP Targets | 将所选发送 → SP 投放 | Stage the ticked suggestions into SP Targets (PAUSED, empty ID, Select ticked) — review there, then Create. Duplicates already on SP Targets are SKIPPED. | WRITES SHEET | | Send Selected as Negatives | 将所选发送为否定投放 | Stage the ticked rows into SP Targets with Negative=TRUE (keyword negatives; brand rows stage as PRODUCT_CATEGORY brand refinements). | WRITES SHEET | | Setup SP Suggestions Sheet | 初始化表格 | Create or reset the SP Suggestions tab (data rows untouched). | WRITES SHEET | | Analyze Campaign | 分析广告活动 | Read-only: pull the campaign's targets, bid recs per ad group, suggested budget (with the missed-opportunity WINDOW dates — they can be years old) and Amazon's campaign recommendations. Ad groups without servable ads show 'not delivering' (Amazon 422 — normal). | READ | | Apply Selected Bids | 应用所选竞价 | MUTATES Amazon: bulk-update the ticked targets' bids per the Apply Mode (MEDIAN / HIGH / CUSTOM New Bid). | LIVE ON AMAZON, WRITES SHEET | | Apply Suggested Budget | 应用建议预算 | MUTATES Amazon: set the campaign's daily budget to the analyzed Suggested Budget (D4). | LIVE ON AMAZON, WRITES SHEET | | Setup Bid Optimizer Sheet | 初始化表格 | Create or reset the Bid Optimizer tab. | WRITES SHEET | | List Portfolios | 列出 | Fetch all portfolios with budgets into the Portfolios sheet. | WRITES SHEET | | Create Portfolios | 创建 | Create portfolios from rows with a name and NO Portfolio ID; new IDs are written back. | LIVE ON AMAZON, WRITES SHEET | | Edit Selected | 编辑所选 | Push changes to Amazon — ONLY for Select-ticked rows. Portfolios cannot be archived via the API. | LIVE ON AMAZON, WRITES SHEET | | Setup Sheet | 设置表格 | Create or reset the Portfolios sheet header block. | WRITES SHEET | | Setup Sheet | 设置表格 | Create or reset the Ads Export sheet. | WRITES SHEET | | Submit Export | 提交导出 | Submit ads entity export requests. | WRITES SHEET | | Get Export Result | 获取导出结果 | Poll pending exports and download completed files. | WRITES SHEET | | Setup Sheet | 设置表格 | Create or reset the Ads History sheet. | WRITES SHEET | | Get History | 获取历史 | Fetch ads change history for a date range and entity type. | WRITES SHEET | | Setup Sheet | 设置表格 | Create or reset the Ads Recommendations sheet. | WRITES SHEET | | List Recommendations | 列出 | Fetch Amazon’s automated ads recommendations. | WRITES SHEET | | Apply Recommendations | 应用所选 | Apply the selected recommendations to your account. | LIVE ON AMAZON, WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] The Ads tools work over MCP too — [`ads_query_campaign`](/docs/mcp-api/tools/ads_query_campaign), [`ads_create_campaign`](/docs/mcp-api/tools/ads_create_campaign), [`ads_update_campaign_budget`](/docs/mcp-api/tools/ads_update_campaign_budget) and the rest of the [tool reference](/docs/mcp-api/tools). Guides: [Automate Amazon Ads budgets](/guides/automate-amazon-ads-budgets-in-google-sheets); on the blog, [Let AI manage every dollar of ad budget](/blog/amazon-ads-budget-tools). # How the sidebar works (https://sellersheetai.com/help/sheets) > The SellerSheet sidebar for Google Sheets — every Amazon and noon workflow as a button, on template sheets in your own Drive. The SellerSheet add-on is a sidebar inside Google Sheets. It has buttons, each one a step of a workflow — sync orders, publish listings, create an FBA shipment, launch a campaign — that reads and writes the template sheets SellerSheet creates in your Google Drive. New here? Start with [Install & first sync](/help/sheets/install). ## Five things to know [#how-the-sidebar-works] 1. **Pick a master tab, then a panel.** The tabs at the top switch between **Sellers**, **Vendors**, **Ads** and **noon**; the icon rail down the side lists the panels of that tab. Star any button to pin it to your favorites. 2. **Resources first.** At the top of a panel, Resources links open the panel's spreadsheet and its Drive folder. 3. **Read the group label.** Buttons under *Global · works on any sheet* run from anywhere. Buttons under *Sheet-specific · active tab must match* sit in a group named after a sheet tab — switch to that tab before you click. 4. **Fill the ✎ columns.** On every template sheet a ✎ header is your input (hover it for a note; many offer a dropdown); columns without the mark are filled by SellerSheet after an action, like a status or a link. 5. **Name the store.** Actions that talk to Amazon or noon need a store, written `-` — your store's name plus the marketplace's country code, for example `myStore-US`. It must match one of your stores exactly. ## The panels [#the-panels] | Master tab | Panel | For | | ---------- | --------------------------------------------------- | ---------------------------------------------------------- | | Sellers | [Sales](/help/sheets/sellers/sales) | Orders and invoices | | Sellers | [Catalogs](/help/sheets/sellers/catalogs) | Research, AI drafts, restriction checks, the Publish Queue | | Sellers | [FBA](/help/sheets/sellers/fba) | Send to Amazon shipments, labels, inventory health | | Sellers | [Store Reports](/help/sheets/sellers/store-reports) | On-demand SP-API reports to Drive | | Sellers | [A+ Content](/help/sheets/sellers/a-plus) | Build, publish and edit A+ documents | | Sellers | [Images](/help/sheets/sellers/images) | Image library and AI listing images | | Sellers | [Data Kiosk](/help/sheets/sellers/data-kiosk) | Data Kiosk queries to Drive sheets | | Sellers | [Dropbox](/help/sheets/sellers/dropbox) | Image URLs from Dropbox | | Sellers | [Shipments](/help/sheets/sellers/shipments) | B2B shipping orders and packing lists | | Vendors | [Vendor Orders](/help/sheets/vendors/vendors) | Purchase orders, acknowledgements, status | | Ads | [Sponsored Products](/help/sheets/ads/sp) | SP campaigns, Builder, suggestions, bid optimizer | | Ads | [Sponsored Brands](/help/sheets/ads/sb) | SB campaigns and their entities | | Ads | [Sponsored Display](/help/sheets/ads/sd) | SD campaigns and their entities | | Ads | [Ads Reports](/help/sheets/ads/reports) | On-demand Amazon Ads reports | | noon | [noon Listings](/help/sheets/noon/listings) | noon Publish Queue, AI drafts, pricing, stock | | noon | [noon FBN](/help/sheets/noon/fbn) | noon inbound shipments (ASN) | | noon | [noon Reports](/help/sheets/noon/reports) | On-demand noon exports to Drive | Every button of every panel, on one page: [Sidebar buttons](/help/sheets/buttons). ## What a button does to your data [#what-a-button-does-to-your-data] Each panel page lists its buttons with their effect: | Effect | Meaning | | ------------------------------------- | --------------------------------------------------------------------------------------------- | | **READ** | Changes nothing you typed and nothing on Amazon or noon — a check, a preview, a print dialog. | | **WRITES SHEET** | Fills, rewrites or clears rows or tabs of your workbook. | | **WRITES DRIVE** | Saves a file or a spreadsheet to your Google Drive. | | **LIVE ON AMAZON** / **LIVE ON NOON** | Changes your live data on Amazon or noon — listings, shipments, campaigns, prices, stock. | | **USES CREDITS** | An AI action, billed from your Credits balance and refunded if it fails. | ## Home [#home] The bottom bar of the sidebar holds Settings, Dashboard, Notifications and Documentation. The **mini Dashboard** shows your plan, API usage and stores without leaving the sheet. ## Settings [#settings] Settings holds your account and profile, the **Workspace** (where SellerSheet keeps your folders and spreadsheets), the model route your AI actions use (chosen on Billing & Credits in the app — shown here read-only), **AI Length Preferences** for listing copy, and store management. Deleted a folder or a template tab? **Re-Initiate Resources** (Settings → Workspace) re-creates what is missing; anything that still exists is left alone. Re-created sheets are empty templates — make a copy first (File → Make a copy) if you want to keep old data. ## Prefer to ask an agent? [#prefer-to-ask-an-agent] Everything the sidebar does is also available to your own AI client over MCP, and to programs over the API — see [MCP & API](/docs/mcp-api). The agent works in the same sheets, and you review and approve there. # Install & first sync (https://sellersheetai.com/help/sheets/install) > Create your SellerSheet account, connect your Amazon store, install the Google Sheets add-on and sync your first orders. Four steps, about ten minutes: an account, a connected store, the add-on, and a first sync that proves it all works. ## What you need [#what-you-need] * An Amazon Seller Central account (Professional) — or a Vendor Central or noon account for those tabs. * A Google account (personal or Workspace). Use the same one for SellerSheet and for Google Sheets. * Chrome is recommended. ### Create your account [#create-your-account] Go to [sellersheetai.com/home](https://sellersheetai.com/home) and sign in with Google — or with a code sent to your email. A new account starts on the Free plan. ### Connect your store [#connect-your-store] In the app, open **Settings → Stores & Marketplaces** and connect your Amazon store: give it a name, pick the region of your Seller Central account, and approve SellerSheet on Amazon. Connect Amazon Ads the same way to use the Ads tab, and a noon account for the noon tab. Connect from the network you normally work from. Your store's name plus the marketplace's country code is its **store ref**, for example `myStore-US` — that is what you type in a sheet's Store column. Teammates can be invited under **Settings → Members**. ### Install the add-on [#install-the-add-on] Install **SellerSheet** from the Google Workspace Marketplace (or "Admin install" for a Workspace domain) and grant the permissions it asks for. Open any Google Sheet (`sheet.new`), then **Extensions → SellerSheet** to open the sidebar. On first open, SellerSheet creates a **SellerSheet** folder in your Drive with its template spreadsheets — Sales, Catalogs, FBA, Store Reports, A+ and more. The panels' Resources links open them. ### Sync your first orders [#sync-your-first-orders] In the sidebar, open **Sellers → Sales** and click **Sync Orders**. The **Orders** sheet of the SellerSheet Sales spreadsheet fills with your last 30 days of orders, and from then on keeps itself up to date about every 2 hours. \[\[TODO: screenshot the sidebar after the first sync]] ## Next [#next] * Learn the sidebar's five ideas on [Sheets add-on](/help/sheets), then pick a panel — [Catalogs](/help/sheets/sellers/catalogs) and [FBA](/help/sheets/sellers/fba) are the busiest. * Prefer to work with an AI? Connect your own AI client to SellerSheet over MCP: [Get started](/docs/start). ## Troubleshooting [#troubleshooting] * **"Store not found"** — the Store cell does not match a store of yours. Use the exact `-` ref — your store's name as shown under Settings → Stores & Marketplaces, a hyphen, and the country code. * **A sheet or folder is missing** — Settings → Workspace → **Re-Initiate Resources** re-creates it. * **A button says the wrong tab is active** — switch to the sheet tab named in the button's group, then click again. # noon FBN (https://sellersheetai.com/help/sheets/noon/fbn) > Create a noon FBN inbound shipment (ASN) from a sheet — items, seal, slot booking, rescheduling and cancellation — and list your shipments. The **noon FBN** panel sends stock to noon's fulfilment centres. The **noon Inbound** sheet holds one ASN at a time; **noon Shipments** lists them all. \[\[TODO: screenshot noon/fbn]] ## Main steps [#main-steps] ### Pick the items [#pick-the-items] **List Eligible Items** loads your FBN-eligible SKUs, with images, into the FBN Product tab; copy the ones to ship into the items table. ### Create the ASN [#create-the-asn] **Create Shipment** creates the ASN from Store (A9) and Ext Ref (B9); the ASN number lands in C9. **Update Items** pushes the items table (partner SKU, quantity, storage type) to it. ### Seal [#seal] **Seal Shipment** locks the ASN so it can be scheduled — its items can no longer change. ### Book a slot [#book-a-slot] **Get Slot Availability** lists destination warehouses and delivery slots; tick ONE slot row and click **Schedule Shipment**. **Reschedule Shipment** releases a booked slot (the ASN goes back to SEALED) so you can book another; **Cancel Shipment** cancels the whole ASN on noon. **Clear Data (new ASN)** resets the sheet for the next shipment and sends nothing to noon. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | List Eligible Items | 列出可入库商品 | Load FBN-eligible SKUs (with images) into the FBN Product tab, then copy the ones to ship into the items table. | WRITES SHEET | | Create Shipment | 创建货件 | Create an ASN from Store (A9) + Ext Ref (B9); the ASN number lands in C9. | LIVE ON NOON, WRITES SHEET | | Update Items | 更新商品 | Push the items table (partner_sku, qty, storage_type) to the ASN. | LIVE ON NOON, WRITES SHEET | | Load existing items | 加载现有商品 | Pull the current ASN items back into the table to review or edit. | WRITES SHEET | | Seal Shipment | 封箱发运 | Lock the ASN (SEAL) so it can be scheduled — items can no longer change. | LIVE ON NOON, WRITES SHEET | | Get Slot Availability | 获取时段可用性 | List destination warehouses + delivery slots for the SEALED ASN into the slots table. | WRITES SHEET | | Schedule Shipment | 预约送仓 | Tick ONE slot row in the table, then book it for the ASN. | LIVE ON NOON, WRITES SHEET | | Refresh Status | 刷新状态 | Re-fetch the ASN header + status from noon. | WRITES SHEET | | Reschedule Shipment | 重新预约送仓 | Release the booked slot of a SCHEDULED ASN (back to SEALED), then Get Slot Availability and Schedule again. | LIVE ON NOON, WRITES SHEET | | Delete selected item(s) | 删除所选条目 | Remove the ticked item rows from the ASN (before Seal). | LIVE ON NOON, WRITES SHEET | | Cancel Shipment | 取消货件 | Cancel the whole ASN on noon. | LIVE ON NOON, WRITES SHEET | | Clear Data (new ASN) | 清空数据(新 ASN) | Wipe this ASN data and reset the sheet to a blank template for the next shipment — keeps the Store. Nothing is sent to noon. | WRITES SHEET | | List Shipments | 列出货件 | Enter Store in A4, then list all ASNs for the Store into the noon Shipments tab. | WRITES SHEET | | List Shipment Items | 列出货件商品 | Loads the clicked ASN row's items (with images) into the noon Shipment Items tab. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`noon_inbound_CreateShipment`](/docs/mcp-api/tools/noon_inbound_CreateShipment) and the other noon inbound tools do the same over MCP. # noon Listings (https://sellersheetai.com/help/sheets/noon/listings) > Create and update noon listings from the noon Publish Queue, write bilingual copy with AI, and manage content status, pricing, stock and barcodes. The **noon Listings** panel does for noon what Catalogs does for Amazon: a Publish Queue that creates and updates listings, AI drafts in English and Arabic, and the sheets for content QC, pricing, stock and barcodes. A noon store is named `-`, for example `myNoon-AE`. \[\[TODO: screenshot noon/listings]] ## Main steps — publish listings [#main-steps--publish-listings] ### Get the template [#get-the-template] On **noon Publish Queue**, list the Category Codes in F7:F and click **Get Template**: it builds the columns (G onward) with guides for every category. A product whose Parent Group Key is a noon id (Z…) and whose Category Code is blank gets its category from noon. ### Fill the products [#fill-the-products] The rows sharing a Parent Group Key are one product; its Parent row gives the details and every row gives its Partner SKU and size variant. **Fetch by SKU** fills the Parent row of a product that is already on noon (only when its Product Title is empty). ### Create / Update Listing [#create--update-listing] **Create / Update Listing** sends every product to noon, one call per product, built from the sheet alone. ### Next batch [#next-batch] **Clear Row 7+** empties your product rows and keeps the template. Nothing is sent to noon. ## AI drafts and the other sheets [#ai-drafts-and-the-other-sheets] * **noon Listing Drafts:** **Fetch by SKU**, then **Image → Listing (AI)** or **Optimize Listing (AI)** for bilingual copy (billed from your Credits balance, refunded if it fails), then **Send to Publish Queue**. * **noon Live Listings:** **Fetch by SKU** loads what is live. * **noon Content QC:** **Get QC Status** shows attribute, image and live status per parent SKU and language. * **noon Pricing and noon Stock:** read with **Get Pricing**, **Get Transfer Price**, **Get Offers**, **Get Stock**; change with **Update Pricing**, **Update Transfer Price**, **Update Stock**; **Map Barcodes** and **Create Import** connect partner SKUs to barcodes. * **noon SKU Delete:** **Delete SKUs** deletes the ticked SKUs on noon — a parent delete removes every variant. * **noon Reference:** **List Categories**, **List Warehouses**, **Lookup Returns**. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Get Template | 获取模板 | Builds the columns (G+) with guides for every category in Category Code (F7:F); a product whose Parent Group Key is a noon id (Z…) and whose Category Code is blank gets its category from noon. Starts fresh: columns G onward are rebuilt empty; rows 1-3 and columns A-F are kept. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Fills the Parent row of each product whose Parent Group Key is a noon id (Z…) from noon — one call per product. Only a Parent row whose Product Title is empty runs — clear the title to fetch again; columns G onward are rewritten from noon. A column the template lacks is added at the right; a product noon cannot return keeps its row and gets ⚠ in Brand. Sizes are yours to add: a Child row per size. | WRITES SHEET | | Create / Update Listing | 创建/更新商品 | LIVE — sends every product to noon, one call per product, built from the sheet alone: the rows sharing a Parent Group Key are one product, its Parent row gives the details and every row gives its Partner SKU and Size Variation. noon keeps any value you leave blank, and each image column is one image slot. noon answers at once: the result is final in the noon Submission Log, and a saved product gets its noon id (Z…) in Parent Group Key and is added to noon Content QC — run Get QC Status there for noon's content check (missing required attributes, QC). noon has no preview, so there is no Validate. | LIVE ON NOON, WRITES SHEET | | Clear Row 7+ | 清空第 7 行及以下 | Empties your product rows (row 7 down) from column B and keeps the template — ready for the next batch. Nothing is sent to noon. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Rows with Store+SKU Parent set, Fetched At empty. Clear Fetched At to redo. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Rows with Store+SKU Parent set, Draft Listing empty. | WRITES SHEET | | Image → Listing (AI) | 图片 → Listing(AI) | Writes bilingual AI copy from the row's image + Instructions. | USES CREDITS, WRITES SHEET | | Optimize Listing (AI) | 优化 Listing(AI) | AI rewrites the row's bilingual copy — facts kept. AI | USES CREDITS, WRITES SHEET | | Send to Publish Queue | 发送至发布队列 | Copies the row into the noon Publish Queue (existing columns only) and marks it SENT. | WRITES SHEET | | Get QC Status | 获取质检状态 | Fetch content status (attribute/image/live) per sku_parent × language. List sku_parents in column A of the noon Content QC tab first. | WRITES SHEET | | Delete SKUs | 删除 SKU ⚠ | DESTRUCTIVE: delete ticked child/parent SKUs on noon. Parent deletes cascade to every variant. | LIVE ON NOON, WRITES SHEET | | Get Pricing | 获取定价 | Read price / msrp / is_active per partner_sku. | WRITES SHEET | | Update Pricing | 更新定价 | Push price / msrp / is_active to noon. | LIVE ON NOON, WRITES SHEET | | Get Transfer Price | 获取调拨价 | Read USD cross-border transfer prices per partner_sku. | WRITES SHEET | | Update Transfer Price | 更新调拨价 | Push USD transfer_price / msrp / is_active to noon. | LIVE ON NOON, WRITES SHEET | | Get Offers | 获取报价 | Look up noon sku / title / brand / per-country offers for each partner_sku. | WRITES SHEET | | Get Stock | 获取库存 | Read current available qty for each (warehouse_code, partner_sku) row. | WRITES SHEET | | Update Stock | 更新库存 | Push the qty column to noon for each row. | LIVE ON NOON, WRITES SHEET | | Map Barcodes | 映射条码 | Connect each partner_sku to its barcode (UPC/EAN/ISBN) on noon. | LIVE ON NOON, WRITES SHEET | | Create Import | 创建导入 | Submit the barcode rows as an async import; writes an import reference. | LIVE ON NOON, WRITES SHEET | | Refresh Status | 刷新状态 | Poll the import status/report for the saved reference. | WRITES SHEET | | List Warehouses | 列出仓库 | Load the partner warehouses for the Store in A4. | WRITES SHEET | | List Categories | 列出类目 | List noon catalog categories (codes used by noon Publish Queue). | WRITES SHEET | | Lookup Returns | 查询退货 | List noon return items + barcode references matching a barcode. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`noon_content_UpsertProduct`](/docs/mcp-api/tools/noon_content_UpsertProduct), [`noon_pricing_BatchUpsertPricing`](/docs/mcp-api/tools/noon_pricing_BatchUpsertPricing) and [`noon_stock_UpdateStock`](/docs/mcp-api/tools/noon_stock_UpdateStock) do the same over MCP. Guide: [Connect noon to SellerSheet](/guides/connect-noon-to-sellersheet). # noon Reports (https://sellersheetai.com/help/sheets/noon/reports) > Request noon exports from sheet rows and get the finished files in Google Drive. The **noon Reports** panel requests noon exports on demand. The noon reports SellerSheet syncs on a schedule are already in the [data warehouse](/docs/data). \[\[TODO: screenshot noon/reports]] ## Main steps [#main-steps] 1. On the **noon Reports** sheet, from row 4: the Report Type and its parameters. 2. **Create Reports** requests the exports; the Export Code fills in automatically. 3. **Get Reports** polls pending exports; finished ones download to Drive (SellerSheet/NoonReports) and are linked in their row. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Create Reports | 创建报告 | Request noon exports from rows 4+ (Report Type + params); the Export Code fills in automatically. | WRITES SHEET | | Get Reports | 获取报告 | Poll pending exports; finished ones download to Drive (SellerSheet/NoonReports) and link in the row. | WRITES DRIVE, WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`noon_impex_CreateExport`](/docs/mcp-api/tools/noon_impex_CreateExport) and [`noon_impex_download_export`](/docs/mcp-api/tools/noon_impex_download_export) do the same over MCP. # A+ Content (https://sellersheetai.com/help/sheets/sellers/a-plus) > Build A+ documents one module per row, load images from Drive, create and submit them for approval, and manage the ASINs they apply to. The **A+ Content** panel builds, publishes and maintains A+ documents from the **Create A+** sheet — one module per row, in display order. \[\[TODO: screenshot sellers/a-plus]] ## Main steps [#main-steps] ### Set up the sheet [#set-up-the-sheet] Fill the config row (store, locale, A+ name, content type), pick a Module Type per row, then click **Load Hints**: headers, dropdowns and per-module color hints show what each module needs, with an Example column. ### Add images [#add-images] Paste image URLs, or click **Load Images (Drive)** to fill them from the Drive folder set in E4. ### Create & Submit [#create--submit] Enter the ASINs (G4) and click **Create & Submit**: it creates a NEW A+ document on Amazon, applies the ASINs and submits it for approval. Amazon-hosted images are reused; Drive and other image URLs are uploaded. ## Edit what is already live [#edit-what-is-already-live] * **List A+** (List A+ sheet) lists every A+ document of the store in A3, 25 rows per click; **Load A+** there copies the clicked document into Create A+ as an editable copy. * **Load A+** (Create A+) loads the document whose key is in H4; edit it and click **Update A+** for a full-replace update — the ASINs are re-applied and approval is resubmitted. * **Revise A+ ASINs** replaces the ASIN set of an existing document and resubmits it. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Load Hints | 加载提示 | Sets up / refreshes the sheet: headers, dropdowns, per-module color hints and the Example column. Run after picking module types. | WRITES SHEET | | Load Images (Drive) | 加载图片(Drive) | Fill image URLs from the Drive folder set in E4. | WRITES SHEET | | Create & Submit | 创建并提交 | LIVE: creates a NEW A+ document on Amazon (Content Document JSON if present, else the module rows), applies the ASINs (G4) and submits for approval. Amazon-hosted images are reused directly; Drive/other image URLs are uploaded. | LIVE ON AMAZON, WRITES SHEET | | Load A+ | 加载 A+ | Loads the existing A+ document whose key is in the Content Reference Key config cell (H4): modules into rows, module JSON into Content Document, ASINs into G4 — edit it, or change name/store to copy it. | WRITES SHEET | | Update A+ | 更新 A+ | LIVE: full-replace update of the EXISTING document whose key is in Content Reference Key (H4) — load it with Load A+, edit, then update; ASINs re-applied and approval resubmitted. | LIVE ON AMAZON, WRITES SHEET | | Revise A+ ASINs | 修订 ASIN | Replace the ASIN set on an existing A+ document and resubmit for approval. | LIVE ON AMAZON, WRITES SHEET | | List A+ | 列出 A+ | List all A+ documents for the store in A3; details fill 25 rows per click. | WRITES SHEET | | Load A+ | 加载 A+ | Loads the clicked result row's A+ document into the Create A+ sheet as an editable copy (JSON saved in its Content Document cell). | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`aplusContent_create_and_publish`](/docs/mcp-api/tools/aplusContent_create_and_publish) creates and submits a document over MCP. Guide: [Create Amazon A+ content in Google Sheets](/guides/create-amazon-a-plus-content-in-google-sheets). # Catalogs (https://sellersheetai.com/help/sheets/sellers/catalogs) > Your catalog, competitor research, AI listing drafts, restriction checks and the Publish Queue that creates, updates and deletes listings in bulk. The **Catalogs** panel is where listings are researched, written and published. Each group of buttons is named after the sheet tab it works on — switch to that tab before you click. \[\[TODO: screenshot sellers/catalogs]] ## The sheets [#the-sheets] | Sheet | What it is for | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **Catalog** | Every SKU of one store (typed in A4, e.g. `myStore-US`), with thumbnails, from the SellerSheet warehouse. | | **Listing Snapshot** | Your own listing as submitted (fetch by SKU) next to Amazon's catalog page (fetch by ASIN) — compare the copy. | | **Catalog Research** | Competitor rows with content, BSR, Buy Box, offers, fee estimate and margin; pick a winner as your starting point. | | **Listing Drafts** | AI-written or AI-optimized listing copy, translations, then a hand-off to the Publish Queue. | | **Restriction Check** | Whether you can list an ASIN, plus its buy box price, rank and offer counts. | | **Publish Queue** | Create, replace, partially update or delete listings — validate first, then publish a few rows instantly or the whole tab as a feed. | | **Submission Log** | Results and issues of every validation and submission. | ## Main steps — publish listings [#main-steps--publish-listings] ### Get the template [#get-the-template] On **Publish Queue**, list the product types in D7:D and click **Get Template**: it builds the attribute columns (F onward) with guides from Amazon's schema. Rows 1–3 and columns A–E are kept, so it is safe to re-run. ### Fill the rows [#fill-the-rows] Type the values, or fill a row from an existing listing: **Fetch by ASIN** (Amazon's catalog), **Fetch by SKU** (your submitted listing) or **Fill from JSON**. These rewrite the whole row and clear a column the source lacks, and only run on rows whose Item Name is empty — clear the title to fetch again. ### Validate [#validate] **Validate (Preview)** checks up to 20 rows against Amazon without publishing. Issues land in **Submission Log**; fix them and validate again. ### Publish [#publish] **Create/Replace/Del.** runs up to 20 rows instantly, each by its operation type (UPDATE, PARTIAL_UPDATE, PATCH-DELETE, DELETE — a DELETE removes the SKU from Amazon and has no preview). **Submit Feed** publishes every row as one bulk feed of up to 25,000 rows; **Refresh Status** on Submission Log fills in the feed results. ### Back up [#back-up] **Backup** snapshots the tab into your Listing Log spreadsheet before a big change. ## Main steps — write a listing with AI [#main-steps--write-a-listing-with-ai] 1. On **Catalog Research**, **Fetch Catalog Data** for competitor ASINs (or **Discover by Keyword**), **Set as Winner**, then **Copy Winner to Drafts**. 2. On **Listing Drafts**, run **Image → Listing (AI)** or **Optimize Listing (AI)**; **Optimize Title (AI)** rewrites only the title and highlight; **Translate Listing (AI)** fills the languages listed on the Translations tab. Lengths follow Settings → AI Length Preferences. 3. **Send to Publish Queue** copies the draft into the first empty Publish Queue row — run Get Template for that product type first. The AI buttons are billed from your Credits balance and refunded if they fail. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Sync Catalog | 同步商品目录 | Pulls every SKU of the ONE store typed in A4 (e.g. myStore-US) from the SellerSheet warehouse into the Catalog tab, with thumbnails. Filter afterwards with the row-5 column filter. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Fetches your own listing (what you submitted) for rows with Store + SKU and an empty JSON cell; fills the ASIN too. Clear a row's JSON cell to re-fetch it. A row that fails shows the reason in its Image cell. | WRITES SHEET | | Fetch by ASIN | 按 ASIN 获取 | Fetches Amazon's catalog page (what shoppers see) for rows with Store + ASIN, NO SKU and an empty JSON cell — yours or a competitor's. Put the same product on a SKU row and an ASIN row to compare the copy. | WRITES SHEET | | Fetch Catalog Data | 获取目录数据 | Fills every competitor row with Store + ASIN (rows 5+) from the Amazon catalog: content, BSR, Buy Box, FBA/MFC offers, fee estimate, margin, and your own SKU if already listed. The winner row (4) is never overwritten. | WRITES SHEET | | Discover by Keyword | 按关键词发现 | Searches Amazon by keyword and appends up to 10 new competitor ASINs as fully filled rows. | WRITES SHEET | | Set as Winner | 设为最佳 | Copies the clicked competitor row into the winner row (row 4) as your listing starting point. | WRITES SHEET | | Copy Winner to Drafts | 将最佳复制到草稿 | Sends the winner row (row 4) — identity, image and combined listing copy — to Listing Drafts for AI optimization. | WRITES SHEET | | Send to Restriction Check | 发送至限制检查 | Adds the selected rows' Store + ASIN to the Restriction Check sheet to verify you can list them. | WRITES SHEET | | Fetch by ASIN | 按 ASIN 获取 | Fills draft rows from the reference ASIN's catalog data (rows with Store + ASIN and an empty Image). | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Fills draft rows from YOUR OWN live listing by SKU — refurbish an existing listing (rows with Store + SKU and an empty Image). | WRITES SHEET | | Image → Listing (AI) | 图片 → Listing(AI) | Sends the row's Image photo(s) + Instructions + Draft Keywords (each queued keyword MUST appear in the copy) to AI, which writes a complete listing into the AI columns: Item Name, Item Highlight, 5 Bullet Points, Description, backend Generic Keywords (fills Amazon's 250-byte budget) and PPC keyword ideas, plus A+ / image ideas. Lengths follow Settings → AI Length Preferences. | USES CREDITS, WRITES SHEET | | Optimize Listing (AI) | 优化 Listing(AI) | Sends the row's Image + Instructions + Draft Listing + Draft Keywords to AI, which rewrites everything into the AI columns: Item Name, Item Highlight, Bullets, Description, backend Generic Keywords (fills Amazon's 250-byte budget) and PPC ideas, plus A+ / image ideas — facts are kept, only the copy improves. Lengths follow Settings → AI Length Preferences. | USES CREDITS, WRITES SHEET | | Optimize Title (AI) | 优化标题(AI) | Sends Instructions + the row's copy (the AI columns, or Draft Listing when they are empty) + Draft Keywords + Image; AI rewrites ONLY the AI Item Name (kept under 75 characters so Amazon shows the Highlight) and the AI Item Highlight — bullets, description and keywords stay untouched. | USES CREDITS, WRITES SHEET | | Translate Listing (AI) | 翻译 Listing(AI) | Target languages are set in the 'Listing Drafts · Translations' tab: add one row per language — same store NAME + SKU (the country code may differ: draft myStore-US matches translation row myStore-DE) + Locale (e.g. de_DE), Status left empty. One click sends the row's AI columns (fallback: Draft Listing) and translates ALL pending locales in a single AI call, marking each row OK. To redo one language, clear its Status. | USES CREDITS, WRITES SHEET | | Send to Publish Queue | 发送至发布队列 | Copies the clicked draft row's SKU, Product Type and AI copy into the first empty Publish Queue row (ASIN → Merchant Suggested ASIN) and marks the draft SENT. On the Translations tab it sends the translated copy; the row's Locale must match the Publish Queue Listing Locale (B3). Needs SKU + Product Type + Item Name, and the Store must match Publish Queue A3. Run Get Template for that product type FIRST — only columns already on the Publish Queue receive copy. Choose the Operation Type there. | WRITES SHEET | | Fetch ASIN Info | 获取 ASIN 信息 | One click fetches listing info (image, brand) plus buy box price, rank and offer counts for rows with Store + ASIN; rows whose Image is already filled are skipped — clear Image to refresh. | WRITES SHEET | | Get Restrictions | 获取限制 | Check selling restrictions for every row with Store + ASIN. | WRITES SHEET | | Get Template | 获取模板 | Builds attribute columns (F+) with guides from Amazon's schema, for the product types in D7:D. Rows 1-3 and columns A-E are kept — safe to re-run. | WRITES SHEET | | Fetch by ASIN | 按 ASIN 获取 | Rewrites each row from the Amazon catalog (what shoppers see) for the ASIN in the Merchant Suggested ASIN column: every attribute column is refilled and a column the catalog lacks is cleared, so no stale value survives. Only rows whose Item Name is empty run — clear the title to re-fetch. A failed ASIN keeps its values and gets ⚠ in Brand; new attributes append at the right. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Rewrites each row from YOUR submitted listing (SKU in column B): every attribute column is refilled and a column the listing lacks is cleared, so no stale value survives. Only rows whose Item Name (row 6) is empty run — a filled title means done; clear it to re-fetch. A row Amazon fails keeps its values and gets ⚠ in Brand. Also step 1 of PATCH-DELETE: fetch, keep only the cells to delete. | WRITES SHEET | | Fill from JSON | 从 JSON 填充 | Rewrites each row from the JSON pasted in Attributes JSON (col E, e.g. from Listing Snapshot): every attribute column is refilled from it and a column the JSON lacks is cleared (the summary counts them), so no stale value survives. Only rows whose Item Name is empty run — clear the title to re-fill; the blob and columns A-E stay. Invalid JSON or a failed parse leaves the row untouched and is listed. Fill productType (col D) first. | WRITES SHEET | | Validate (Preview) | 校验(预览) | Step 1 for every change: checks rows against Amazon WITHOUT publishing (max 20; DELETE has no preview and is skipped here). Issues land in Submission Log — fix, then publish with Create/Replace/Delete (≤20, instant) or Submit Feed (bulk). | READ | | Create/Replace/Del. | 创建/替换/删除 | Create / Replace / Delete — LIVE, runs each row by its operationType, instant per-SKU results (max 20): UPDATE creates or fully replaces the SKU; PARTIAL_UPDATE / PATCH-DELETE change or delete only the listed attributes; DELETE removes the SKU from Amazon — irreversible, no preview exists. | LIVE ON AMAZON, WRITES SHEET | | Submit Feed | 提交 Feed | LIVE — publishes ALL rows (any operationType) as one bulk feed, up to 25,000 rows; results appear in Submission Log. | LIVE ON AMAZON, WRITES SHEET | | Backup | 备份 | Snapshots this tab into your Listing Log spreadsheet (named by SKU + timestamp) and records the link. | WRITES DRIVE, WRITES SHEET | | Refresh Status | 刷新状态 | Asks Amazon about every Submit Feed row that is not finished yet and fills Feed Status, Result and Issues. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] An agent can run the same Publish Queue over MCP — prepare the template with [`listings_prepare_publish_queue_template`](/docs/mcp-api/tools/listings_prepare_publish_queue_template), validate with [`listings_validate_rows`](/docs/mcp-api/tools/listings_validate_rows) and submit with [`listings_submit_feed`](/docs/mcp-api/tools/listings_submit_feed) — while you approve the rows in the sheet. Guides: [Bulk create or revise listings](/guides/bulk-create-revise-amazon-listings-in-google-sheets), [Check ASIN selling eligibility](/guides/check-asin-selling-eligibility-in-google-sheets), [Refurbish a listing](/guides/refurbish-amazon-listing-in-google-sheets). # Data Kiosk (https://sellersheetai.com/help/sheets/sellers/data-kiosk) > Run Amazon Data Kiosk queries — sales and traffic, economics — from sheet rows and get the results as Drive sheets. The **Data Kiosk** panel submits Amazon Data Kiosk queries from the **Data Kiosk** sheet and brings the results back as Google Sheets in Drive. \[\[TODO: screenshot sellers/data-kiosk]] ## Main steps [#main-steps] ### Fill a row [#fill-a-row] From row 4, with an empty Query ID: pick the report type, aggregate and dates — or paste your own GraphQL. ### Create Queries [#create-queries] **Create Queries** submits one query per ready row. ### Get Results [#get-results] **Get Results** polls pending queries; finished ones download to a Drive sheet linked in the Report Sheet column. On **Data Kiosk Lookup**, **Search Queries** lists past queries with the row-4 filters (Store required). **Clear Table** empties the data rows; headers stay. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Create Queries | 创建查询 | Sheet: Data Kiosk. Submit a query per ready row (rows 4+, empty Query ID) — pick report type, aggregate and dates, or paste custom GraphQL. | WRITES SHEET | | Get Results | 获取结果 | Poll pending queries; finished ones download to a Drive sheet linked in the Report Sheet column. | WRITES DRIVE, WRITES SHEET | | Clear Table | 清空表格 | Clear data rows; headers and dropdowns stay. Ctrl+Z to undo. | WRITES SHEET | | Search Queries | 搜索查询 | Search past Data Kiosk queries using the row-4 filters (Store required); all pages load in one click. | WRITES SHEET | | Clear Table | 清空表格 | Clear result rows; headers and filters stay. Ctrl+Z to undo. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`dataKiosk_createQuery`](/docs/mcp-api/tools/dataKiosk_createQuery) runs the same queries over MCP; the synced Data Kiosk tables are in the [data warehouse](/docs/data). # Dropbox (https://sellersheetai.com/help/sheets/sellers/dropbox) > Turn product images stored in Dropbox into image URLs for listings and flat files. The **Dropbox** panel creates shareable image URLs from your Dropbox for the rows of the active sheet — for example, the image columns of a listing or a flat file. \[\[TODO: screenshot sellers/dropbox]] ## Main steps [#main-steps] 1. Open the sheet whose rows need image URLs. 2. Click **Fetch Image URLs**: SellerSheet looks the images up in Dropbox and writes their URLs into the rows. 3. If Dropbox access has expired, click **Refresh Access** and try again. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Fetch Image URLs | 获取图片链接 | Fetch image URLs for the rows on this sheet. | WRITES SHEET | | Refresh Access | 刷新授权 | Refresh access token. | READ | Guide: [Create Amazon image URLs for flat files](/guides/create-amazon-image-urls-for-flat-files). # FBA (https://sellersheetai.com/help/sheets/sellers/fba) > Send stock to Amazon with Send to Amazon (STA) plans built in Google Sheets — box first or split first — plus labels, shipment tracking and an inventory health view. The **FBA** panel creates and tracks FBA inbound shipments from Google Sheets, and keeps a live inventory health view of every FBA SKU. Each plan gets its own STA spreadsheet; the numbered stepper on it shows which step is DONE. \[\[TODO: screenshot sellers/fba]] ## Main steps — create a shipment [#main-steps--create-a-shipment] ### Start the plan [#start-the-plan] On **Manage Shipments**, add a row for the plan, click a cell in it and use **Create STA SS**: SellerSheet creates a dedicated STA spreadsheet for that shipment. ### Box first — you know your boxes [#box-first--you-know-your-boxes] On **STA-BoxFirst**: **Initiate Plan** (from row 9 and the box lines from row 14) → **Confirm Pack** if Amazon offered several packing options → **Set Box Info** → **Gen Placement Opts.** (each placement's warehouses, weight, volume and fees land in STA-Options; price your own carrier there) → pick a placement → **Gen Trans. Opts.** → pick carriers (**Match Carriers** copies shipment 1's carrier to the rest) → **Gen Delivery Window** for own-carrier shipments → **Confirm Shipment**. ### Or split first — Amazon splits first [#or-split-first--amazon-splits-first] On **STA-SplitFirst**: **Initiate Plan** → **Confirm Placement** (builds STA-Pack, one box block per shipment) → fill the boxes → **Set Box Info** → **Gen Trans. Opts.** → **Gen Delivery Window** (own carrier only) → **Confirm Shipment**. ### Labels and tracking [#labels-and-tracking] **Get FBA Box Labels** saves the box labels PDF to the plan folder and links it from the FBA ID; **Get FNSKU Labels** opens item labels in a print dialog. **Get Ref. ID** and **Refresh Shipment** keep status, Reference ID and warehouse current on Manage Shipments. **Confirm Shipment** books the shipment on Amazon, and **Cancel Plan** cancels the inbound plan — both change your account. The Ship Date must be today or later, or Amazon returns no carrier options. ## Inventory Health and past plans [#inventory-health-and-past-plans] * **Refresh Data** (Inventory Health) reloads the hidden data layer from the SellerSheet warehouse for the stores in the Stores filter (A4); the live table re-queries instantly. No Amazon call. * **List Inbound Plans** (Search Inbound Plans) lists your inbound plans of the last 365 days using the row-4 filters. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Refresh Data | 刷新数据 | Refresh the hidden data layer from the SellerSheet database — stores picked in the Stores filter (A4); the live table re-queries instantly. No Amazon call. Runs on the Inventory Health sheet — clicked elsewhere it jumps there (creating the tab if needed) so you can run it again. | WRITES SHEET | | Create STA SS | 创建 STA 表格 | Create an STA spreadsheet for the active row’s shipment. | WRITES DRIVE, WRITES SHEET | | Refresh Shipment | 刷新货件 | Refresh status for every non-terminal shipment on this sheet from Amazon. | WRITES SHEET | | Initiate Plan | 创建入库计划 | Creates the inbound plan from row 9 and the box lines (row 14+) and lists Amazon's packing options; a single packing group is confirmed with its box info at once (1a–1c DONE). Several groups mean the items cannot ship together: the error lists each group's SKUs below the items — cancel, keep one group's SKUs and run again. | LIVE ON AMAZON, WRITES SHEET | | Confirm Pack | 确认装箱 | Re-confirms the packing option ID in the stepper's 1b cell (1b DONE); Initiate Plan normally does this for you. | LIVE ON AMAZON, WRITES SHEET | | Set Box Info | 填写箱子信息 | Re-sends every box line's dimensions and weight (row 14+, units in H9/I9) for the packing group in the stepper's 1c cell — after you edit the box lines (1c DONE); refused once the shipment is confirmed. | LIVE ON AMAZON, WRITES SHEET | | Gen Placement Opts. | 生成分仓方案 | Fetches Amazon's placement options and fees; each shipment's warehouse, weight and volume land in STA-Options, where Rate/kg ✎ or Rate/m³ ✎ prices your own carrier. Pick one in the stepper's 2 cell. Click again to refresh from Amazon (rates carry over by warehouse). | WRITES SHEET | | Gen Trans. Opts. | 生成运输方案 | Fetches carrier options (cost, mode, partnered or own) for every placement's shipments into the STA-Options Transportation dropdowns and rebuilds STA-PL; pick per shipment there (3 DONE). | WRITES SHEET | | Match Carriers | 匹配承运商 | Run on the STA-Options tab: for every placement with 2+ shipments, shipment 1's picked Transportation Option fills the rest with the same carrier (SPD / LTL partnered rules). | WRITES SHEET | | Gen Delivery Window | 生成送达时间窗 | Own-carrier shipments only: fetches delivery windows for the picked placement's shipments (every placement when none is picked) into the STA-Options Delivery Window dropdowns (3b DONE). | WRITES SHEET | | Confirm Shipment | 确认货件 | Confirms the placement picked in the stepper's 2 cell and each shipment's Transportation + Delivery Window from STA-Options — books on Amazon. FBA ID, Reference ID and warehouse land in row 12, STA-Options (the FBA ID becomes the label link when Amazon returns labels) and Manage Shipments (2 and 4 DONE). | LIVE ON AMAZON, WRITES SHEET | | Get Ref. ID | 获取参考 ID | Re-reads each confirmed shipment from Amazon: status, Reference ID and warehouse refresh in STA-Options and row 12; the Reference ID is mirrored to Manage Shipments. | WRITES SHEET | | Get FBA Box Labels | 获取 FBA 箱标 | Fetches Amazon box labels for the picked placement's shipments whose FBA ID in STA-Options is not a link yet (page count from that row; cut to the FBA Box Label Size you chose in row 9 — required: 100x150 as is, 100x100 top square). Saves the PDF to the plan folder, turns the FBA ID into its link and mirrors it to Manage Shipments. Remove a link to fetch again. | WRITES DRIVE, WRITES SHEET | | Get FNSKU Labels | 获取 FNSKU 标签 | Builds FNSKU item labels from the items table — one per unit (Qty/Box × Boxes), at the FNSKU Label Size you chose in row 9 (required) — and opens them in a print dialog; nothing is written to the sheet. | READ | | Cancel Plan | 取消计划 | Cancels the inbound plan on Amazon; every stepper step and the Status cell become CANCELLED. | LIVE ON AMAZON, WRITES SHEET | | Initiate Plan | 创建入库计划 | Creates the inbound plan from row 9 and the item lines (row 14+) and lists Amazon's placement options in STA-Options and the stepper's 2 dropdown (1 DONE). | LIVE ON AMAZON, WRITES SHEET | | Confirm Placement | 确认分仓 | Confirms the placement picked in the stepper's 2 cell with Amazon and builds STA-Pack, one box block per shipment (2 DONE). | LIVE ON AMAZON, WRITES SHEET | | Set Box Info | 填写箱子信息 | Sends STA-Pack's box rows (dimensions + weight per shipment, units in H9/I9) to Amazon as packing information; needs 2 DONE (3 DONE). | LIVE ON AMAZON, WRITES SHEET | | Gen Trans. Opts. | 生成运输方案 | Fetches carrier options (cost, mode, partnered or own) for the confirmed placement's shipments into the STA-Options Transportation dropdowns; needs Ship Date and 3 DONE (4 DONE). | WRITES SHEET | | Gen Delivery Window | 生成送达时间窗 | Own-carrier shipments only: fetches delivery windows for the confirmed placement's shipments into the STA-Options Delivery Window dropdowns (5 DONE). | WRITES SHEET | | Confirm Shipment | 确认货件 | Confirms each shipment's Transportation + Delivery Window from STA-Options — books on Amazon. FBA ID, Reference ID and warehouse land in row 12, STA-Options (the FBA ID becomes the label link when Amazon returns labels) and Manage Shipments (6 DONE). | LIVE ON AMAZON, WRITES SHEET | | Get FBA Box Labels | 获取 FBA 箱标 | Fetches Amazon box labels for the picked placement's shipments whose FBA ID in STA-Options is not a link yet (page count from that row; cut to the FBA Box Label Size you chose in row 9 — required: 100x150 as is, 100x100 top square). Saves the PDF to the plan folder, turns the FBA ID into its link and mirrors it to Manage Shipments. Remove a link to fetch again. | WRITES DRIVE, WRITES SHEET | | Get FNSKU Labels | 获取 FNSKU 标签 | Builds FNSKU item labels from the items table — one per unit (Qty/Box × Boxes), at the FNSKU Label Size you chose in row 9 (required) — and opens them in a print dialog; nothing is written to the sheet. | READ | | Cancel Plan | 取消计划 | Cancels the inbound plan on Amazon; every stepper step and the Status cell become CANCELLED. | LIVE ON AMAZON, WRITES SHEET | | List Inbound Plans | 列出入库计划 | List your inbound plans (last 365 days) using the row-4 filters; newest first. | WRITES SHEET | | Setup Sheet | 设置表格 | Create or reset the Search Inbound Plans sheet header block. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] An agent can build the same STA workbook with [`fbaInbound_create_sta_sheet`](/docs/mcp-api/tools/fbaInbound_create_sta_sheet) and walk the plan over MCP, from [`fbaInbound_createInboundPlan`](/docs/mcp-api/tools/fbaInbound_createInboundPlan) to [`fbaInbound_get_labels`](/docs/mcp-api/tools/fbaInbound_get_labels). Guides: [Create STA shipments](/guides/create-sta-shipments-in-google-sheets), [Inventory health dashboard](/guides/inventory-health-dashboard). # Images (https://sellersheetai.com/help/sheets/sellers/images) > Your product image library, plus AI listing images generated from reference styles and your own product photos. The **Images** panel has two sheets: **Image Library**, a grid of every image slot of your listings, and **Images Generation**, where AI creates new listing images from a reference style and your product samples. \[\[TODO: screenshot sellers/images]] ## Image Library [#image-library] Type the Store (A4) and a SKU or parent SKU (B4) and click **Fetch Images**: one column per image slot, two rows per child SKU — the plain CDN URLs, then an `=IMAGE()` preview row to confirm, delete, and paste the rest into Publish Queue. ## Main steps — generate images [#main-steps--generate-images] ### Load your product and a reference [#load-your-product-and-a-reference] **Fetch by SKU** brings in your own product: a summarized title and bullets as Product Context, the main image as Sample 1. **Fetch by ASIN** writes a reference listing's images into each slot's Ref cell, as style references only. ### Write the prompts [#write-the-prompts] Click a reference image and run **Reverse Prompt**: a vision model turns it into a structured prompt. **Optimize Prompt** adapts it to your product — same style and composition, your product. Prefer the reversed prompt as is? Copy it into the Prompt cell. ### Generate [#generate] **Generate** runs the selected slots from their Prompt; with samples selected it edits so the product stays identical. **Swap Product In** keeps a reference image's exact scene and replaces only the product. Results save automatically in a few minutes — keep the sidebar open. ### Score [#score] **Score Results** rates each slot's versions against its prompt and Amazon's main-image rules. Every AI step is billed from your Credits balance and refunded if it fails. **Preview Images** opens a slideshow of the images on the selection. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Fetch Images | 获取图片 | Reads Store (A4) and SKU / parent SKU (B4) from the Image Library sheet and rebuilds the grid: one column per image slot, s0-s8 first (the Publish Queue block), A+/other slots appended. Each child SKU gets two rows — plain CDN URLs, then an =IMAGE() preview row to confirm, delete, and paste the rest into Publish Queue. | WRITES SHEET | | Fetch by SKU | 按 SKU 获取 | Your OWN listed product: AI-summarized title+bullets → Product Context, main image → Sample 1, every listing image URL → the SKU cell's note. | WRITES SHEET | | Fetch by ASIN | 按 ASIN 获取 | Reads the Ref ASIN in column D (competitor / reference listing) and writes its images into each S-slot's Ref cell BY POSITION (main→S0, PT01→S1 …) as STYLE references only. A+ block refs: paste manually. | WRITES SHEET | | Preview Images | 预览图片 | Slideshow modal of the images on the current selection (the Useful-Tools previewer). | READ | | Reverse Prompt | 反推提示词 | Click a REFERENCE image first (a block's Ref cell, or Ref A-C) — a vision model reverses it into a structured prompt, written to the block's Reversed Prompt (Ref A-C target the Scope slots above). | USES CREDITS, WRITES SHEET | | Optimize Prompt | 优化提示词 | Adapts each Scope slot's Reversed Prompt to YOUR product: keeps the reference's style/composition, swaps the product for the Scope-selected Sample(s) + Product Context → slot Prompt (previous kept in the cell note). Prefer the reversed prompt as-is? Just copy it into the Prompt cell. | USES CREDITS, WRITES SHEET | | Generate | 生成 | Runs the Scope-selected slots from each slot's Prompt. A slot's own Ref attaches as a STYLE anchor only when it has NO Reversed Prompt — an optimized Prompt already carries the ref's style as text. Samples selected → EDIT (product identical to samples) · neither samples nor ref → text-to-image. To keep a Ref's exact scene, use Swap Product In. Files are saved as SKU_S0 / SKU_S0_V2 / SKU_A1 … in Images//. Edit jobs finish in the background and save automatically (~5 min — keep the sidebar open). | USES CREDITS, WRITES SHEET | | Swap Product In | ⇄ 场景换品 | Keeps each Scope slot's Ref image as the EXACT scene and replaces only the product with the Scope-selected Sample(s) — one edit call per slot, Ref goes first, no Prompt cell needed. Slots without a Ref are skipped (BLOCKED). The optional Instruction is appended to the swap prompt. Results queue and save automatically like Generate. | USES CREDITS, WRITES SHEET | | Score Results | 评分 | Queued jobs save automatically (~5 min, keep the sidebar open). This button AI-rates each Scope slot's V1-V3 against its prompt + Amazon main-image compliance → Scores column. | USES CREDITS, WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`generate_image`](/docs/mcp-api/tools/generate_image), [`edit_image`](/docs/mcp-api/tools/edit_image) and [`reverse_prompt`](/docs/mcp-api/tools/reverse_prompt) give an agent the same image steps over MCP. # Sales (https://sellersheetai.com/help/sheets/sellers/sales) > Sync your Amazon orders into the Sales spreadsheet, refresh any single order, and generate PDF invoices in bulk. The **Sales** panel keeps an up-to-date copy of your Amazon orders in Google Sheets and turns shipped orders into invoices. It works on the **SellerSheet Sales** spreadsheet (open it from the panel's Resources links). \[\[TODO: screenshot sellers/sales]] ## Main steps [#main-steps] ### Sync orders [#sync-orders] Click **Sync Orders** — it works from any sheet. The first run brings in the last 30 days; after that it fetches everything since the last sync and keeps itself running about every 2 hours, together with the fees sync. Click it any time for an immediate refresh. ### Refresh or look up one order [#refresh-or-look-up-one-order] On the **Orders** sheet, click the Amazon Order ID cell of an order, then **Update Order** to refresh that row from Amazon. **Order Details** fetches the line items of the selected order. ### Create invoices [#create-invoices] Fill your company details once on the **Store Info** sheet. On the **Invoices** sheet, give each row a Store and an Order ID, then click **Create Invoices**: every row without a link yet gets a PDF invoice in Drive (the order must be Shipped). **Clear Orders** empties every data row of the Orders sheet (headers stay) — press Ctrl+Z right after if you clicked it by mistake. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Sync Orders | 同步订单 | Syncs new and changed orders into the Orders sheet, continuing where the last run stopped, then keeps itself running about every 2 hours. Only the spreadsheet's owner syncs. | WRITES SHEET | | Re-sync | 重新同步 | Clears this tab and reads the ticked stores again from scratch, as far back as First sync reads. | WRITES SHEET | | Update Order | 更新订单 | Click the Amazon Order ID cell of an order first, then this refreshes that row from Amazon. | WRITES SHEET | | Clear Orders | 清空订单 | Clears ALL data rows from the Orders sheet (headers kept). Ctrl+Z to undo right after. | WRITES SHEET | | Order Details | 获取订单明细 | Fetches line items of the selected order from Amazon. | WRITES SHEET | | Create Invoices | 生成发票 | On the Invoices sheet: generates a PDF invoice in Drive for every row with Store + Order ID and no link yet (order must be Shipped; company info from Store Info sheet). | WRITES DRIVE, WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] The same orders are available over MCP and the API: [`orders_searchOrders`](/docs/mcp-api/tools/orders_searchOrders) and [`orders_getOrder`](/docs/mcp-api/tools/orders_getOrder), or the synced `rpt_orders` table through [`query_report_data`](/docs/mcp-api/tools/query_report_data). Guide: [How to Sync Amazon Orders to Your Google Sheets](/guides/sync-amazon-orders-to-your-google-sheets). # Shipments (https://sellersheetai.com/help/sheets/sellers/shipments) > B2B shipping orders, tracking, and packing lists built from your sheet rows. The **Shipments** panel handles shipments outside the FBA inbound flow: B2B shipping orders with tracking, and packing-list spreadsheets. \[\[TODO: screenshot sellers/shipments]] ## Main steps [#main-steps] * **B2B Shipping:** click a row of the **Shipment** sheet and **Create B2B Order** to create its shipping order; **Get Tracking Status** refreshes the tracking of every shipment on the sheet. * **Packing List:** **Create PL SS** creates a packing-list spreadsheet from the sheet's rows; **Fill PL** fills the packing list in the active spreadsheet. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Create B2B Order | 创建 B2B 订单 | Creates a B2B shipping order for the clicked Shipment row. | WRITES SHEET | | Get Tracking Status | 获取追踪状态 | Refreshes tracking status for the shipments on this sheet. | WRITES SHEET | | Create PL SS | 创建装箱单表格 | Creates the packing list from this sheet's rows. | WRITES DRIVE, WRITES SHEET | | Fill PL | 填写装箱单 | Active spreadsheet. Fill packing list. | WRITES SHEET | For FBA inbound shipments to Amazon, use the [FBA](/help/sheets/sellers/fba) panel. # Store Reports (https://sellersheetai.com/help/sheets/sellers/store-reports) > Request any Amazon SP-API report on demand from a sheet row and get the finished report in Google Drive. The **Store Reports** panel requests Amazon SP-API reports on demand and downloads them to Google Drive. The reports SellerSheet syncs for you on a schedule are already in the [data warehouse](/docs/data); use this panel for anything else, or a one-off date range. \[\[TODO: screenshot sellers/store-reports]] ## Main steps [#main-steps] ### Fill a row [#fill-a-row] On the **Store Reports** sheet, from row 4: Store (e.g. `myStore-US`), the Report Type, and the dates for reports that take a range. ### Create Reports [#create-reports] Click **Create Reports**: SellerSheet submits each request to Amazon and fills in the Report ID. ### Get Reports [#get-reports] Amazon takes a few minutes. Click **Get Reports** to poll: finished reports download to Drive and are linked in their row. On **Report Lookup**, **Search Reports** finds past Amazon reports with the row-4 filters. **Clear Table** empties the data rows of either sheet; headers and dropdowns stay. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Create Reports | 创建报告 | Request Amazon reports from rows 4+ (Store, Report Type, dates); the Report ID fills in automatically. | WRITES SHEET | | Get Reports | 获取报告 | Poll pending reports; finished ones download to Drive and link in the row. | WRITES DRIVE, WRITES SHEET | | Clear Table | 清空表格 | Clear data rows; headers and dropdowns stay. Ctrl+Z to undo. | WRITES SHEET | | Search Reports | 搜索报告 | Search past Amazon reports using the row-4 filters. | WRITES SHEET | | Clear Table | 清空表格 | Clear result rows; headers and filters stay. Ctrl+Z to undo. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`reports_createReport`](/docs/mcp-api/tools/reports_createReport) and [`reports_getReport`](/docs/mcp-api/tools/reports_getReport) do the same over MCP; synced reports are one [`query_report_data`](/docs/mcp-api/tools/query_report_data) call away. Guides: [Download Amazon reports](/guides/download-amazon-reports-in-google-sheets), [Create store reports](/guides/create-store-reports-in-google-sheets). # Vendor Orders (https://sellersheetai.com/help/sheets/vendors/vendors) > For Amazon Vendors — sync purchase orders, load their line items with images, acknowledge them, and track item-level status. The **Vendors** master tab has one panel, **Vendor Orders**, for Amazon Vendor Central accounts. It works on three sheets: **Vendor Orders**, **Vendor PO Items** and **Vendor PO Status**. \[\[TODO: screenshot vendors/vendors]] ## Main steps [#main-steps] ### Sync purchase orders [#sync-purchase-orders] On **Vendor Orders**, set the row-4 filters (the default is the last 7 days) and click **Sync Vendor Orders**. ### Load the items [#load-the-items] Click a PO row and **Load PO Items**: its line items land on **Vendor PO Items**, with product thumbnails. ### Acknowledge [#acknowledge] Give every item row an Ack Code (Backordered needs a Ship Date, Rejected needs a Reason) and click **Acknowledge PO** — this submits the acknowledgement to Amazon. ### Track status [#track-status] On **Vendor PO Status**, **Refresh PO Status** loads item-level status with the row-4 filters. **Clear Table** empties the data rows of a sheet; headers, filters and dropdowns stay. ## Every button [#every-button] | Button | 中文 | What it does | Effect | |---|---|---|---| | Sync Vendor Orders | 同步供应商订单 | Fetch vendor POs from Amazon using the row-4 filters; defaults to the last 7 days. | WRITES SHEET | | Load PO Items | 加载 PO 商品 | Loads the clicked PO row's line items into the Vendor PO Items sheet and auto-fills product images (thumbnails in column A, URL in the last column). | WRITES SHEET | | Clear Table | 清空表格 | Clear data rows; headers, filters and dropdowns stay. Ctrl+Z to undo. | WRITES SHEET | | Acknowledge PO | 确认接单(PO) | Submit PO acknowledgements to Amazon — every row needs Ack Code 1; Backordered needs a Ship Date, Rejected needs a Reason. | LIVE ON AMAZON, WRITES SHEET | | Clear Table | 清空表格 | Clear data rows; image formula, headers and dropdowns stay. Ctrl+Z to undo. | WRITES SHEET | | Refresh PO Status | 刷新 PO 状态 | Refresh item-level PO status using the row-4 filters (defaults to the last 7 days) and auto-fill product images for new rows. | WRITES SHEET | | Clear Table | 清空表格 | Clear data rows; image formula, headers and filters stay. Ctrl+Z to undo. | WRITES SHEET | ## Prefer to ask an agent? [#prefer-to-ask-an-agent] [`vendorOrders_getPurchaseOrders`](/docs/mcp-api/tools/vendorOrders_getPurchaseOrders) and [`vendorOrders_submitAcknowledgement`](/docs/mcp-api/tools/vendorOrders_submitAcknowledgement) do the same over MCP. # AI clients & API (https://sellersheetai.com/help/troubleshooting/ai) > Every refusal says what went wrong and what to do. Here is each one, and its fix. Every refusal carries a sentence in `notification.message` — your agent reads it to you — and, when only you can fix it, a note in `human_action`. The HTTP status says which kind it is ([Responses & errors](/docs/mcp-api/responses)). ## Signing in [#signing-in] | Symptom | What it means | Fix | | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | "Unauthorized" (401) | Your sign-in or key is missing, expired, turned off or deleted — or it's the wrong kind (an MCP key on the Tool API, or the other way round) | Sign in again in your client, or create a new key under **Settings → API & MCP** | | The browser never opens | The client is older than MCP sign-in | Update the client, or use an [API key](/docs/mcp-api/keys) | | Sign-in says you've reached your keys | Each browser sign-in creates an MCP key, and your plan's keys are all in use | Delete an unused key under **Settings → API & MCP**, or upgrade | | 403 for a key that used to work | You are no longer an active member of the workspace the key belongs to | Ask the workspace owner, or use a key of your own | ## Stores [#stores] | Symptom | What it means | Fix | | -------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Store ref refused (400) | The ref has no marketplace, like a bare `myStore` | Pass a ref with its marketplace, like . The error lists every ref that works — or take one from `get_user_context` ([Store refs](/docs/mcp-api/store-refs)) | | "Store is paused" (403) | None of its marketplaces is active on your plan | Upgrade, or free a slot under **My Stores → Edit Marketplaces** (in the app: **Settings → Stores & Marketplaces → Edit markets**) | | "No stores" | No store is connected yet, or none is shared with you | [Connect your store](/docs/start/connect) | | Ad tools come back empty | Ads was never authorized for that store | **Ads** on the store's row in **Settings → Stores & Marketplaces** | | The store shows an authorization error | Amazon's authorization was revoked or expired | **Reauthorize on Amazon** on the store's row | ## Permissions [#permissions] | Symptom | What it means | Fix | | ------------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | 403 on a write tool | The key or your membership has read access on that store | Use a key with write access on it, or ask the workspace owner for it ([Stay in control](/docs/mcp-api/control)) | | 403 on a store you can see in the app | The key is **Restricted** and that store isn't on its list, or its reach is one workspace | Add the store to the key, or use another key | ## Limits and Amazon [#limits-and-amazon] | Symptom | What it means | Fix | | ------------------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | | 429 with `Retry-After` | A plan window is full, or Amazon's own quota for that operation | Wait the seconds `Retry-After` says, then retry ([Credits & limits](/help/app/settings/billing)) | | 402 | Not enough Credits for an image, copy or insights action | Top up on **Settings → Billing & Credits** — nothing was charged | | 400 with Amazon's errors | Amazon refused the request — a wrong attribute, a missing field | Read `errors`: it is Amazon's own list; fix the input and send again | | 503 | Amazon, noon or SellerSheet could not answer just then | Retry after `Retry-After` | | A call times out | Some Amazon reports take a minute or two | Raise your client's MCP tool timeout; on the Tool API, run long workflows over MCP instead | ## Sheets [#sheets] | Symptom | Fix | | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | Your agent can't write to your sheet | Open Google Sheets → **Extensions → SellerSheet → Open Sidebar** once to set up the workspace | | A file "isn't yours" | Drive and sheet tools work only on files you own or that are shared with you, inside your workspace — share the file with your Google account | Still stuck? Write to [support@sellersheetai.com](mailto:support@sellersheetai.com) with the time of the call. # Web app (https://sellersheetai.com/help/troubleshooting/app) > Errors in the SellerSheet web app, and their fixes. When something in the SellerSheet app goes wrong, it tells you in one sentence — on the page, or in a short message after you click. Find yours below, or [contact support](/help/contact) with that sentence. | Error | For example | | --------------------------------------------------- | ------------------------------------------------------------------------- | | [You're signed out](#app-signed-out) | The sign-in page, "Sign in to SellerSheet" | | [Not enough Credits](#app-credits) | "Not enough credits: this needs …, you have …." | | [A plan limit is reached](#app-plan-limit) | "The team is full — upgrade the plan for more seats" | | [No access to this store or action](#app-no-access) | "… needs write access to that store — yours is read-only." | | [A store's authorization expired](#app-store-auth) | "Store authorization expired — re-authorize to restore access" | | [Page not found](#app-not-found) | "This page does not exist, or your account cannot open it." | | [The server did not answer](#app-server) | "The server did not answer. Nothing was changed — try again in a moment." | ## You're signed out [#app-signed-out] **What you see:** the sign-in page, "Sign in to SellerSheet", instead of the page you opened · "That sign-in link has expired — start again." · "Google sign-in did not finish — try again." · "No SellerSheet account uses this email — sign up with Google first." The app needs you signed in. Your session ends when you log out, when you use **Log out everywhere**, or 14 days after you last opened the app. 1. Click **Continue with Google**, or **Email me a code** and type the 6-digit code from the email. 2. After you sign in, the app opens the page you asked for. 3. "That sign-in link has expired" or "did not finish": start again from the sign-in page. 4. "No SellerSheet account uses this email": the code works only for an existing account. Sign in with Google first. ## Not enough Credits [#app-credits] **What you see:** "Not enough credits: this needs …, you have …." · "This batch costs … credits and the balance is … — nothing was started. Top up on Billing & Credits." An AI action — images, listing copy, buyer insights — is paid from your organization's Credits balance, and the balance can't cover it. The action was refused before it ran, so nothing was charged. 1. Open **Settings → Billing & Credits** and click **Top up**. Only the owner or an admin can buy Credits; a member asks one of them. 2. Run the action again. A failed action costs nothing. See [Billing & Credits](/help/app/settings/billing). ## A plan limit is reached [#app-plan-limit] **What you see:** "The team is full — upgrade the plan for more seats" · "Your plan allows … keys of this kind and all are in use — delete or turn off one, or upgrade the plan." · "Your … plan has room for … more marketplaces (… of … in use, noon included). Pick fewer, or upgrade." · "Sync paused — no marketplace on this store is active on your plan, so its reports have stopped updating. Upgrade your plan, or free a slot under Edit Marketplaces." Your plan sets how many people, keys and marketplaces your organization has. Amazon marketplaces and noon accounts share the marketplace count. A store with no active marketplace stops syncing. 1. See your plan and its limits on **Settings → Billing & Credits**. 2. Free a slot: turn off a marketplace you don't need with **Edit markets** on **Stores & Marketplaces** (one marked "On until …" stays on until that date); delete or turn off a key on **API & MCP**; withdraw an invitation on **Members** — an invitation holds a seat until it is accepted or withdrawn. 3. Or upgrade. Only the organization's owner can change the plan. See [Billing & Credits](/help/app/settings/billing), [Stores & Marketplaces](/help/app/settings/stores), [Members](/help/app/settings/members) and [Keys & store access](/docs/mcp-api/keys). ## No access to this store or action [#app-no-access] **What you see:** "Mapping a listing on … needs write access to that store — yours is read-only." · "Placing images on … needs write access to that store — yours is read-only." · "Only the owner or an admin of this organization can add or re-authorize stores." · "This workspace is no longer one of your organizations — reload the page to open your own." You are signed in, but your role or your access to that store doesn't allow this. The owner and admins reach every store. A member reaches only the stores granted to them, each with **Seller API** and **Ads API** access set to None, Read or Read & write. Adding or re-authorizing stores and buying Credits are for the owner or an admin; the plan is for the owner alone. 1. Read-only on a store: ask the owner or an admin to open **Settings → Members**, click **Access** on your row and set that store's **Seller API** or **Ads API** to **Read & write**. 2. An owner-or-admin action: ask one of them to do it, or to change your **Role** on Members. 3. "This workspace is no longer one of your organizations" or "You are not a member of that workspace.": you left or were removed. Reload the page — the app opens your own organization. 4. Your AI client has its own access, set per key: see [Stay in control](/docs/mcp-api/control). See [Members](/help/app/settings/members) and [Organization](/help/app/settings/organization). ## A store's authorization expired [#app-store-auth] **What you see:** on **Stores & Marketplaces**, **Expired**, **Revoked** or **Expiring** under Store authorization or Ads authorization, and in Issues: "Store authorization expired — re-authorize to restore access" · "Store auth expires in … days — re-authorize before it lapses" · "Ads authorization revoked — reauthorize ads". A noon account shows **Sign-in failed** or **Role missing**. Amazon's authorization of a store lasts 365 days; the app marks it Expiring in the last 30. It can also be revoked sooner — then Issues shows "Auth Error:" with the reason. Until you authorize again, SellerSheet can't reach the store on Amazon — from the app, the sidebar or your AI. 1. On **Settings → Stores & Marketplaces**, open the store's **Issues** and click its fix — **Reauthorize** or **Reauthorize Ads** — or use **Reauthorize** or **Ads** on the store's row. 2. Sign in on Amazon's consent screen with the seller account the store belongs to. A different seller account is refused. 3. When the app asks you to **Confirm the re-authorization**, compare the marketplaces under Now and After you confirm, then click **Confirm re-authorization**. Cancel keeps the current authorization. 4. For noon, click **Recheck**, or **Reconnect** for an account you connected by signing in on noon. Only the owner or an admin has these buttons; a member asks one of them. See [Stores & Marketplaces](/help/app/settings/stores). ## Page not found [#app-not-found] **What you see:** "404" · "Page not found" · "This page does not exist, or your account cannot open it." The address matches no page, or it is a page your account can't open — the app shows both the same way. 1. Click **Go to Home** and find the page from the menu. 2. A link from a teammate can point at a page only some accounts open, like **Affiliate**, which only partners see. ## The server did not answer [#app-server] **What you see:** "Your workspace could not be loaded" with "The sign-in service did not answer. Nothing was changed — try again in a moment." · "This page could not load" with "The server did not answer. Nothing was changed — try again in a moment." · "The server answered with an error (HTTP …). Nothing was changed." The app could not reach SellerSheet's server in time, or the server failed. Nothing was changed. 1. Click **Try again**. On "Your workspace could not be loaded", a second click reloads the whole page. 2. The same sentence in a message after you clicked a button: your change was not saved. Make it again in a moment. 3. Still there after a few minutes? [Contact support](/help/contact) with the exact sentence, the screen and the time. # Sheets sidebar messages (https://sellersheetai.com/help/troubleshooting/sheets) > Every message the Google Sheets sidebar shows belongs to one of nine families. Find yours by its words, and fix it. Every message the sidebar shows belongs to one of these nine. Find yours by its words — or [contact support](/help/contact) with the message. Look for the sentence itself: the sidebar sometimes puts the button's name and "failed:" in front of it. | Family | For example | | ------------------------------------------------------- | ----------------------------------------------------------------------------------- | | [The store is missing or doesn't match](#err-store-ref) | "Please enter the store (e.g. myStore-US) in cell A4." | | [A step was skipped](#err-step-order) | "Missing Inbound Plan ID. Run step 1 first." | | [The wrong tab is open](#err-wrong-tab) | "Wrong sheet! Expected sheet name starts with: …. You are in: …." | | [The wrong row is selected](#err-wrong-row) | "Click a product data row (row 5+) first." | | [A ✎ column is empty or invalid](#err-input) | "Missing required fields: …" | | [A template tab is damaged](#err-template) | "Sheet has no header row — restore the tab from the master template." | | [Sign-in or Amazon authorization](#err-auth) | "Your authorization was revoked, please reauthorize on sellersheetai.com/dashboard" | | [Plan limits, Credits or file size](#err-quota) | "Not enough credits: this needs …, you have …." | | [SellerSheet, Amazon or noon failed](#err-server) | "Create failed — see server logs." | ## The store is missing or doesn't match [#err-store-ref] **What you see:** "Please enter the store (e.g. myStore-US) in cell A4." · "Please set store name with country code in cell B2" · "Store is missing in the selected row." · "Store (A3) is empty — select the store in row 3 first." Actions that talk to Amazon or noon need the store, written `-`: your store's name plus the marketplace's country code. The cell the message names is empty, or doesn't match one of your stores exactly. 1. Find the exact name: SellerSheet app → **Settings → Stores & Marketplaces**, or the sidebar's mini Dashboard. 2. Type it in the cell the message names, with the marketplace: , `myStore-UK`… Many of these cells offer a dropdown. 3. Click the button again. Most often from: [Sponsored Products](/help/sheets/ads/sp), [Sponsored Brands](/help/sheets/ads/sb), Ads suggestions, [FBA](/help/sheets/sellers/fba). See also [Store refs](/docs/mcp-api/store-refs). ## A step was skipped [#err-step-order] **What you see:** "Missing Inbound Plan ID. Run step 1 first." · "STA-Options sheet not found. Run Phase 1 first." · "No placement option confirmed. Complete Phase 2 first." · "Nothing to stage — run Get Suggestions first." The button needs the result of an earlier button in the same group — usually an ID that step writes into the sheet. 1. In the sidebar, the group named after your tab lists the steps in order (1, 2, 3…). On an STA spreadsheet, the numbered stepper shows which step is DONE. 2. Run the step the message names, wait for its notification, then click your button again. 3. Steps marked *Optional · when Initiate asks* run only when the earlier step says so. Most often from: [FBA](/help/sheets/sellers/fba) (STA box first / split first), the Sponsored Products Builder, Ads suggestions. ## The wrong tab is open [#err-wrong-tab] **What you see:** "Wrong sheet! Expected sheet name starts with: …. You are in: …." · "This function only works from STA or Manage Shipments sheets." · "Not the Shipment tab — open the Shipment tab first." · "Sync Catalog runs on a Catalog tab — open the SellerSheet catalog workbook (or any sheet that has one) and run again." The button works on one tab, and another tab is open. Buttons under *Sheet-specific · active tab must match* sit in a group named after the tab they need. For "Wrong sheet!", the open tab's name must start with the name the message gives. 1. Read the tab the message names — or the name of the button's group in the sidebar. 2. Click that tab at the bottom of the spreadsheet. If it is in another workbook, open that workbook first: the panel's Resources links open its spreadsheet. 3. Renamed the tab? Give it back a name that starts with the expected one. Deleted it? See [A template tab is damaged](#err-template). 4. Click the button again. Most often from: [Catalogs](/help/sheets/sellers/catalogs), [A+ Content](/help/sheets/sellers/a-plus), [FBA](/help/sheets/sellers/fba), [Shipments](/help/sheets/sellers/shipments). ## The wrong row is selected [#err-wrong-row] **What you see:** "Click a product data row (row 5+) first." · "Please select a data row (not a header row)." · "No rows selected. Tick the Select box (column A) on the rows you want to edit, then try again." · "Click the draft row (row 4 or below) first, then Send to Publish Queue." The button works on rows of the sheet, and it found none: your cursor is in the header rows at the top, or no row is ticked. 1. Read the first data row the message gives — "row 5+", "row 4 or below". Everything above it is header. 2. A button for one row: click any cell in that row. A button for several rows (Edit, Delete, Archive, Apply Selected): tick the **Select** box in column A of each row. 3. Click the button again. Most often from: [Images](/help/sheets/sellers/images), [FBA](/help/sheets/sellers/fba) (Manage Shipments), [Sponsored Products](/help/sheets/ads/sp), [Sponsored Brands](/help/sheets/ads/sb), [Sponsored Display](/help/sheets/ads/sd), [Catalogs](/help/sheets/sellers/catalogs). ## A ✎ column is empty or invalid [#err-input] **What you see:** "Missing required fields: …" · "Row …: "Box Weight" must be a positive number — got: …." · "… row(s) blocked before Amazon — fix the ⚠️ reasons in the Status column, then Create again." · "Warehouse Code "…" not found on the Shipment Setting sheet — add its row (gold ✎ columns) first." A column you fill — its header carries ✎ — is empty, or holds a value the button can't use. These checks run before anything is sent to Amazon or noon. 1. Read the field, row and value the message names. When rows are refused, each row's reason is in its **Status** column. 2. Fill or fix that ✎ cell. Hover the header for its note: whether it is required, the format it takes and the values it allows. Many ✎ cells offer a dropdown. 3. If the message names another tab, like Shipment Setting, add the missing row there first. 4. Click the button again. Most often from: [FBA](/help/sheets/sellers/fba), [Catalogs](/help/sheets/sellers/catalogs) (the Publish Queue), [Sponsored Products](/help/sheets/ads/sp), [Sponsored Brands](/help/sheets/ads/sb), [Sponsored Display](/help/sheets/ads/sd), [Shipments](/help/sheets/sellers/shipments). ## A template tab is damaged [#err-template] **What you see:** "Sheet has no header row — restore the tab from the master template." A template tab lost its header rows or columns. **Fix:** in the sidebar, open **Settings → Workspace → Re-Initiate Resources**: it re-creates whatever is missing and leaves everything that still exists alone. A re-created tab is an empty template, so make a copy first (File → Make a copy) if you want to keep old data. ## Sign-in or Amazon authorization [#err-auth] **What you see:** "Your authorization was revoked, please reauthorize on sellersheetai.com/dashboard" · "Store … is expired. Please reauthorize." · "No connected noon store named '…'. Connect it on the dashboard." · "No Amazon stores connected. Please authorize your store on the website first. Once authorized or store is shared with you, click Refresh Workspace to update." The sidebar reaches Amazon, Amazon Ads and noon with the authorization you gave in the SellerSheet app. Amazon's authorization of a store lasts 365 days, and it can be revoked sooner. Until you authorize again, every button for that store stops. 1. Open the SellerSheet app → **Settings → Stores & Marketplaces**. The store's row shows its **Store authorization** and **Ads authorization** (Expired, Revoked, Expiring), and **Issues** lists each problem with the button that fixes it. 2. Click **Reauthorize** on the store's row and sign in on Amazon's consent screen with the same seller account. For Amazon Ads, click **Ads** (or **Reauthorize Ads** in Issues). For noon, click **Recheck**, or **Reconnect** for an account you connected by signing in on noon; a noon account that isn't there yet needs **Add noon account**. 3. Only the organization's owner or an admin has these buttons. A member asks one of them. 4. Back in Google Sheets, close and reopen the sidebar (**Extensions → SellerSheet → Open Sidebar**) so it reads your stores again, then click your button again. Most often from: any panel that talks to Amazon, Amazon Ads or noon. The fix is always in the app: [Stores & Marketplaces](/help/app/settings/stores). ## Plan limits, Credits or file size [#err-quota] **What you see:** "Not enough credits: this needs …, you have …." · "Monthly sidebar operations limit reached (…). Any paid plan includes unlimited usage — upgrade at sellersheetai.com/billing." · "File size (… MB) exceeds the 10MB limit" · "Too many SKUs: … SKUs found. Maximum allowed is 20." A limit stopped the button before it ran, so nothing was changed or charged. Either your Credits balance can't cover an AI action, the Free plan's sidebar operations for this month are used up, or the batch is bigger than the button takes. 1. **Credits:** top up on **Settings → Billing & Credits** in the SellerSheet app (owner or admin) — the message's **Buy credits →** opens billing. Then click the button again. A failed AI action costs nothing. 2. **Monthly sidebar operations:** upgrade the plan on Billing & Credits (owner only), or wait for the monthly reset. The sidebar's mini Dashboard shows your plan and usage. 3. **File size or too many SKUs:** send fewer rows at a time. **Validate (Preview)** and **Create/Replace/Del.** take up to 20 SKUs; **Submit Feed** takes up to 25,000 in a feed file of at most 10 MB. Most often from: [Catalogs](/help/sheets/sellers/catalogs) (the Publish Queue), [Images](/help/sheets/sellers/images), [A+ Content](/help/sheets/sellers/a-plus), [noon Listings](/help/sheets/noon/listings) — every button marked USES CREDITS. See [Billing & Credits](/help/app/settings/billing). ## SellerSheet, Amazon or noon failed [#err-server] **What you see:** "Create failed — see server logs." (or List, Edit, Delete, Archive… failed) · "SellerSheet server did not respond correctly (HTTP …). It may be busy or briefly unavailable — please try again in a minute." · "Failed to generate initial plan: …" · "Sync failed for every store (…) — the table below is unchanged." The call to SellerSheet, Amazon or noon got no answer, or was refused. "— see server logs" means no answer came back to the sidebar. Those logs are SellerSheet's own: you can't open them, and you don't need to. When Amazon or noon refused, their reason follows the colon. 1. Wait a minute, then click the button again. A busy server or Amazon's rate limits often clear by then. 2. Before you repeat **Create**, **Edit**, **Delete** or **Archive**, click **List** with the same filters: the change may have reached Amazon even though the answer was lost. Repeat only what is missing. 3. If Amazon's or noon's reason follows the colon, fix what it names in the sheet and click again. 4. Still failing? [Contact support](/help/contact) with the exact message, the panel and button, and the time you clicked. Most often from: [Sponsored Products](/help/sheets/ads/sp), [Sponsored Brands](/help/sheets/ads/sb), [Sponsored Display](/help/sheets/ads/sd), [FBA](/help/sheets/sellers/fba) (List Inbound Plans, Initiate Plan), [Catalogs](/help/sheets/sellers/catalogs) (Sync Catalog). # SellerSheet docs (https://sellersheetai.com/docs) > Turn your Amazon business into an AI-native company — your own AI, the SellerSheet MCP and tools, Amazon's official APIs. **Your AI does the work. You step in only where it counts.** Give the AI you already use — Claude, ChatGPT, Cursor, Coze or any agent — the SellerSheet plugin: skills plus an MCP connection with more than tools over Amazon's official SP-API and Ads API, synced report tables, and a Google Sheets add-on with buttons. [Start free](https://sellersheetai.com/home). ## Three ways in [#three-ways-in] Connect your AI client once. It reads Amazon, drafts changes and — once you trust it — acts. Most of the business runs here. The same tools over HTTP, for dashboards and approval pages whose numbers stay live and whose buttons act on Amazon. Early access. Change a hundred rows at once, keep the history, share it with the team; the sidebar runs the same operations by click. ## The docs [#the-docs] * [Get started](/docs/start) — connect your store and your AI, run your first job. * [AI & MCP](/docs/mcp-api) — keys and [store refs](/docs/mcp-api/store-refs) like , how calls work, the [tool reference](/docs/mcp-api/tools), the [skills](/docs/skills) your agents follow, and the [data tables](/docs/data) SellerSheet keeps in sync. * [Help](/help) — the Google Sheets sidebar button by button, the web app, troubleshooting, and how to reach us. * [Guides](/guides) — step-by-step jobs from the first prompt to the result on Amazon. * [Blog](/blog) — launches, playbooks and walkthroughs. ## Try a prompt [#try-a-prompt] Ask your AI in plain words — it picks the tools: * "Build an FBA shipment from the box sizes in my sheet — packing, placement, confirm, labels." * "From the last 30 days of search terms, find the converting ones I'm not targeting yet." * "What do buyers praise and complain about most on this ASIN?" More requests to copy are in the [prompt library](/docs/start/prompts). ## Machine-readable [#machine-readable] * [/llms.txt](/llms.txt) — an index of every docs page; [/llms-full.txt](/llms-full.txt) — all of them in one file. * [/api/v1/openapi.json](https://api.sellersheetai.com/api/v1/openapi.json) — the Tool API's OpenAPI description. * [/\_data/mcp-tools.json](/_data/mcp-tools.json) — the tool catalog. * Any docs page as Markdown: add `.md` to its URL. # Read, write & destructive (https://sellersheetai.com/docs/mcp-api/access) > Every tool carries one access label, served with the tool — and write access is granted per store, per API. ## The three labels [#the-three-labels] | Label | Meaning | Examples | | ------------------------------------ | --------------------------------------------------------- | -------------------------------------------------------------------------------------- | | | Reads only — changes nothing | `orders_searchOrders`, `query_report_data`, `fbaInbound_listPlacementOptions` | | | Creates or changes something | `fbaInbound_createInboundPlan`, `generate_image`, `append_sheet_rows` | | | Changes or removes something that cannot simply be undone | `listings_putListingsItem`, `fbaInbound_confirm_plan_options`, `ads_update_target_bid` | The label is part of the tool, not of this page: the MCP server sends it with every tool (as the standard read-only and destructive hints your client understands), and the Tool API's catalog and OpenAPI carry it as `access`. The [tool reference](/docs/mcp-api/tools) shows each tool's label. * **No tool both reads and writes.** A request to look can never change anything by accident. * **Report and export requests are reads.** Asking Amazon to prepare a report, or creating a Data Kiosk query, changes nothing in your seller account. * **A sheet, doc or Drive write is a write** — to your file, not to Amazon. ## Write access is per store, per API [#write-access-is-per-store-per-api] A label says what a tool does; access says whether *you* may. A tool that changes your Amazon account checks, before it calls Amazon: * **Seller API write** on that store for SP-API changes — feeds, listings, FBA plans and shipments, A+ publishing, vendor submissions. * **Ads API write** on that store for advertising changes — campaigns, targets, bids, budgets. * **noon write** on that noon account for changes to it. Your key's access and, in a shared workspace, the access the owner or an admin gave you both apply — the lower one wins. Without it, the call is refused with 403 and nothing reaches Amazon. How to set it: [Keys & store access](/docs/mcp-api/keys), [Stay in control](/docs/mcp-api/control). ## Confirm before destructive [#confirm-before-destructive] A destructive tool replaces a live listing, confirms a plan or changes a bid. Your agent shows you what will be sent and waits; your own code should do the same — a write happens because a person pressed a button. # Call from code (https://sellersheetai.com/docs/mcp-api/code) > Every tool your agent uses over MCP is also an HTTP operation — same name, same arguments, same result — for your own scripts, dashboards and approval pages. What your agent calls in a conversation, your code calls by the same name with the same arguments. So your agent can build you your own tools on it — a live dashboard, a listing tool, an approval page — whose buttons act on Amazon exactly as the agent does in chat. | | | | ----------- | ---------------------------------------------------------------------------------------------------------- | | Endpoint | `POST https://api.sellersheetai.com/api/v1/tools/{tool}` | | Auth | `Authorization: Bearer ` — an API key, not an MCP key ([Keys & store access](/docs/mcp-api/keys)) | | Body | the tool's arguments as a JSON object | | Result | the same envelope the MCP tool returns ([Responses & errors](/docs/mcp-api/responses)) | | Catalog | `GET https://api.sellersheetai.com/api/v1/tools` | | OpenAPI 3.1 | `https://api.sellersheetai.com/api/v1/openapi.json` | ## One call [#one-call] Start where an agent starts — `get_user_context` returns your store refs: Then pass one of its `store_refs` verbatim as the `store` of every store-scoped tool: Every tool is a `POST`: a tool is an operation with arguments, not a resource. Whether it reads, writes or destroys is its access label in the catalog (see [Read, write & destructive](/docs/mcp-api/access)). ## Keep the key out of your code [#keep-the-key-out-of-your-code] Save it once as `SELLERSHEET_API_KEY` — in your shell, or a `.env` file next to your script that is listed in `.gitignore` — and read it from there, as the snippets above do. A browser page has no `.env`: ask for the key when the page opens and keep it in `sessionStorage` under the same name — never in the HTML, never in a page you share. ## What to know before you build [#what-to-know-before-you-build] * **The status code tells you whether it ran.** 200 means the call was carried out; a 4xx means it was not; 503 means Amazon, noon or the backend could not answer — retry after `Retry-After`. Details: [Responses & errors](/docs/mcp-api/responses). * **Paging is your loop.** A list tool returns a token for the next page; call again with it. See [Paging](/docs/mcp-api/paging). * **Show before you write.** A write should happen because a person pressed a button: show what will be sent first, and confirm explicitly before a destructive tool. * **Long calls belong on MCP.** The public edge cuts an HTTP call still running after about 100 seconds. A long workflow — a whole FBA plan, a large A+ library — runs over MCP, whose streamed response is not cut. * **Same limits as MCP.** API calls count under the same plan windows as your agent's calls; a 429 carries `Retry-After`. See [Credits & limits](/help/app/settings/billing). * **Browser pages are allowed.** The API accepts calls from any origin with the `Authorization` and `Content-Type` headers and no cookies. A page hosted inside an AI client may be blocked from calling other hosts — run it as a local file, on localhost, or on your own host. Every tool, with its arguments and a ready call: the [tool reference](/docs/mcp-api/tools). # Stay in control (https://sellersheetai.com/docs/mcp-api/control) > Your agent works for you. Labels on every tool, write access per store, approval in your client and trust you widen step by step keep it that way. ## Every tool says what it does [#every-tool-says-what-it-does] Each tool carries one label, and your AI client reads the same label: | Label | Meaning | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | | Reads only — changes nothing. | | | Creates or changes something. | | | Changes or removes something that cannot simply be undone — a live listing, a confirmed shipment plan, a bid. | No tool both reads and writes, so a "look" request can never change anything by accident. The full rules: [Read, write & destructive](/docs/mcp-api/access). ## Turn on tool approval [#turn-on-tool-approval] Most clients can ask before every tool call. Keep it on for anything that writes. Many let you allow read-only tools once and keep asking for the rest — a good place to start. ## Write access is per store [#write-access-is-per-store] Reading always works on a store you can see. Changing it needs write access **on that store**, or the call is refused with 403 before anything reaches Amazon: * **Your keys** carry Seller API and Ads API access per store — none, read, or read and write ([Keys & store access](/docs/mcp-api/keys)). * **Your team**: the owner or an admin of the workspace sets each member's Seller API and Ads API access per store, and one level per noon account, under **Settings → Members**. * A key never reaches beyond what its holder can reach, so a read-only member's key is read-only too. Report and export *requests* — asking Amazon to prepare a report — are reads: they change nothing in your account. ## Trust grows over time [#trust-grows-over-time] Start by approving everything. Ask your agent to write what it intends into a Google Sheet first — the bids it would change, the listings it would submit — and approve there; the sheet is also your team's record. Once a kind of work has gone right many times, let it run on its own: low-risk reads and reports first, changes later. Your agent never picks an option for you — a placement, a transport offer — unless you give it the rule. ## Revoke any time [#revoke-any-time] * **An AI client or a key:** **Settings → API & MCP** lists every key, including the one each browser sign-in created. Turn it off or delete it and it stops working at once. * **SellerSheet's access to Amazon:** Seller Central → Manage Your Apps. Your stores then stop syncing and refuse calls until you reauthorize. See also: [Data we never see](/docs/start/privacy) · [Troubleshooting](/help/troubleshooting/ai). # One set of endpoints (https://sellersheetai.com/docs/mcp-api) > The same tools, with the same arguments and the same results, for your AI over MCP, for your code over the Tool API, and behind the Google Sheets add-on. SellerSheet has one set of tools — more than of them. They reach you three ways, each with its own job: 1. **An MCP tool** your AI calls in a conversation — through `https://sellersheetai.com/mcp`. This is where the work happens: your agent reads, decides, asks you, and acts. [Connect an AI client](/docs/start/clients). 2. **A Tool API operation** your own code calls — `POST https://api.sellersheetai.com/api/v1/tools/{tool}`. A dashboard or approval page your agent builds on it is live: its numbers update and its buttons act on Amazon. Early access — [Call from code](/docs/mcp-api/code). 3. **The engine behind the Google Sheets add-on**, where your team does bulk edits and keeps the record. See the [add-on docs](/help/sheets). Over MCP and the Tool API a tool keeps its name, its arguments and its result, so a call your agent made in chat, your code can make tomorrow (the add-on drives the same operations from your sheet rows): ## What every call shares [#what-every-call-shares] * **One store argument.** Store-scoped tools take `store`, a ref such as from `get_user_context` — [Store refs](/docs/mcp-api/store-refs). * **One result shape.** `notification`, `data`, `human_action` — [Responses & errors](/docs/mcp-api/responses). * **One way to page.** A token in, a token out; your agent or your loop calls again — [Paging](/docs/mcp-api/paging). * **One label per tool.** Read, write or destructive, and write access per store — [Read, write & destructive](/docs/mcp-api/access). * **The vendor's own names.** A tool that wraps one Amazon operation carries Amazon's name, such as `orders_getOrder` or `fbaInbound_listPlacementOptions`; a SellerSheet workflow over several operations keeps the API area's prefix with a lower-case tail, such as `fbaInbound_create_sta_sheet`. * **The schema says the rules.** Allowed values, bounds and formats from Amazon's specification are in each tool's input schema, so a wrong value is refused before anything reaches Amazon. ## Where to go next [#where-to-go-next] * [Workflows](/docs/mcp-api/workflows) — one page per job, FBA first. * [Tool reference](/docs/mcp-api/tools) — every tool, its arguments and a ready call. # Keys & store access (https://sellersheetai.com/docs/mcp-api/keys) > Sign in with OAuth where you can, use a key where you must — and decide exactly which stores and which actions each key may touch. Most AI clients sign in in the browser and never show you a key. A key is for clients that can't open a browser (Coze, servers, headless agents) and for your own code. ## Two kinds of key [#two-kinds-of-key] | Kind | For | Where it works | | ----------- | ----------------------------------------------------------------------------- | ------------------------------------ | | **MCP key** | AI clients — Claude, Cursor, ChatGPT, Coze and others | `https://sellersheetai.com/mcp` only | | **API key** | Your own scripts and pages — the [Tool API](/docs/mcp-api/code), early access | the Tool API only | An MCP key is refused by the Tool API, and an API key is refused by the MCP server, both with 401. Each browser sign-in creates an MCP key for that client, so it shows in the same list. ## Create a key [#create-a-key] ### Open the key list [#open-the-key-list] In the app: **Settings → API & MCP → Create key**. ### Name it after where it will live [#name-it-after-where-it-will-live] "Claude on my laptop", "VA agency", "reporting server". When a laptop is lost or a key leaks, the name tells you which one to turn off. ### Choose its reach [#choose-its-reach] **All my workspaces** reaches every store you reach in every workspace you belong to, stores shared with you included. **⟨workspace⟩ only** reaches that workspace's stores. Reach is fixed when the key is created — create a new key to change it. ### Choose its stores and access [#choose-its-stores-and-access] **Open** — every store the key reaches. **Restricted** — only the stores and marketplaces you list. For each, set **Seller API** and **Ads API** access: none, read, or read and write. A read key can analyse everything but cannot submit a feed, create a shipment or change a bid — useful as the everyday key, with a second write key you use on purpose. ### Copy it and connect [#copy-it-and-connect] Copy the token right away and keep it like a password — anyone holding it acts as you. **Snippets** on the key's row prints a ready-made configuration for each AI client with the key filled in. **Last used** tells you whether a key is still in use; turn a key off or delete it from the same list and every client using it stops at once. Your plan sets how many keys of each kind you can have. A key never reaches beyond what you can reach yourself, and on a store shared with you it gets at most what the owner granted you. ## How your agent knows its own limits [#how-your-agent-knows-its-own-limits] Every session starts with `get_user_context`. Its answer tells the agent which stores it can reach, with their `store_refs`, and what it may do on each — so it can tell you **before** it tries a change that would be refused. ## Keep keys out of sight [#keep-keys-out-of-sight] * Keep a key in an environment variable (`SELLERSHEET_API_KEY`) or a `.env` file listed in `.gitignore` — never in code, a shared document or a command line. * An agent that was handed a key in chat may write it to `.env` for you; it must not echo it back or commit it. * Suspect a leak? Turn the key off in **Settings → API & MCP** and create a new one. Related: [Store refs](/docs/mcp-api/store-refs) · [Stay in control](/docs/mcp-api/control) · [Troubleshooting](/help/troubleshooting/ai). # Paging (https://sellersheetai.com/docs/mcp-api/paging) > A list tool returns one page and a token for the next. Calling again is your agent's step — or your loop's. Amazon answers long lists one page at a time, and so does every SellerSheet tool that wraps such a list. A result never tells your agent to "call again" — the tool's description says how it pages, and the agent decides whether it needs the next page. ## How it works [#how-it-works] 1. Call the tool without a token — you get the first page and, when there is more, a token in `data` (Amazon's own name for it, such as `nextToken`). 2. Call the same tool with the same arguments plus that token — you get the next page. 3. No token in the result means you have the last page. The argument that takes the token is named in each tool's reference — usually `pagination_token` or `next_token`, sometimes the vendor's own spelling. Most list tools also take a page size, such as `page_size`. ## Good habits [#good-habits] * **Pass `null`, not an empty string, for "no token".** Every optional argument accepts an explicit `null`, so your agent can start with `pagination_token: null`. * **Keep the other arguments the same** between pages; a token belongs to its query. * **Ask the warehouse for history.** "Every order last quarter" is one `query_report_data` call over the synced tables, with `limit` and `offset`, not hundreds of pages from Amazon — and it spends none of Amazon's rate limits. See [Synced reports](/docs/mcp-api/workflows/reports). * **Write as you go.** For a whole catalog into a sheet, your agent appends each page to the sheet before fetching the next, so a long run never holds everything at once. # Responses & errors (https://sellersheetai.com/docs/mcp-api/responses) > Every tool answers with the same envelope, and the HTTP status says whether the call was carried out. ## The envelope [#the-envelope] Every tool — over MCP and over the Tool API — returns the same three fields: ```json { "notification": { "message": "Found 12 unshipped orders.", "type": "success" }, "data": { "...": "the tool's result" }, "human_action": "" } ``` | Field | What it is | What your agent does | | ---------------------- | ------------------------------------------------------------------------------ | -------------------- | | `notification.message` | One sentence saying what happened | Tells you | | `notification.type` | `success`, `info`, `warning` or `error` | Weighs the result | | `data` | The result itself — its fields are in each tool's output schema | Works with it | | `human_action` | Something only you can do — reauthorize a store, top up Credits. Usually empty | Passes it on to you | What to call next is in each tool's description, never in the result. ## The status says whether it was carried out [#the-status-says-whether-it-was-carried-out] * **200 — the call was carried out.** `notification.type` says how it ended. A call that ran and ended badly — a feed Amazon rejected, a job that failed — is still 200, with the detail in `data`. * **4xx — the call was not carried out.** Nothing changed. A refused call is never a 200 with `type: "error"`. * **503 — nobody could answer.** Amazon, noon or SellerSheet's backend could not answer just then; retry after `Retry-After`. The Tool API never answers 502: the public edge would replace its body with its own page. | Status | Meaning | What to do | | ------ | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | 200 | Carried out — read `data` | — | | 400 | Bad input or a missing precondition; Amazon's own refusal comes back as 400 with Amazon's list in `errors` | Fix the arguments; don't retry as is | | 401 | Your SellerSheet sign-in or key is missing, invalid, turned off or the wrong kind — never an Amazon or noon problem | Sign in again or use the right key ([Keys](/docs/mcp-api/keys)) | | 402 | Not enough Credits | Top up — nothing was charged ([Credits](/help/app/settings/billing)) | | 403 | Signed in, but not allowed: the store, the marketplace, write access, a paused store | Read the sentence; it names the fix ([Stay in control](/docs/mcp-api/control)) | | 404 | No such tool (Tool API) — a renamed tool says its new name | Look it up in the catalog | | 429 | A plan window or Amazon's quota is full | Wait `Retry-After` seconds | | 503 | Amazon, noon or the backend could not answer | Retry after `Retry-After` | ## A refusal [#a-refusal] Every refusal, on every tool — the sheet, doc and Drive tools included — has the same body: ```json { "notification": { "message": "…the sentence your agent reads to you…", "type": "error" }, "error_code": "rate_limit_exceeded", "errors": null, "human_action": "" } ``` * `notification.message` — the sentence; it names the fix. * `error_code` — a stable identifier your code can branch on, such as `rate_limit_exceeded`, `quota_exceeded` or `insufficient_credits`. * `errors` — Amazon's own list of problems when Amazon refused, otherwise null. Keep it next to the sentence; never flatten it into a string. * `retry_after` and the `Retry-After` header — seconds to wait, on 429 and 503. Each Tool API response also carries `X-Request-Id`; quote it when you write to support. All the fixes, by symptom: [Troubleshooting](/help/troubleshooting/ai). # Store refs (https://sellersheetai.com/docs/mcp-api/store-refs) > Every store-scoped call names its store as - — the store and the marketplace in one string, taken verbatim from get_user_context. A store ref is the store's name, a dash and the marketplace's country code: , `myStore-DE`, . noon accounts use the same shape, such as `myNoon-AE`. It is the `store` argument of every store-scoped tool — over MCP, over the Tool API and in the sidebar alike. ## Take refs from get_user_context — never build one [#take-refs-from-get_user_context--never-build-one] `get_user_context` returns a ready-made `store_refs` list for each store. Your agent passes one **verbatim**. It never glues a name to a country code itself, and never guesses a marketplace: picking one by hand is how a call lands on a marketplace your plan doesn't cover. No Amazon seller (SP-API) tool takes a separate country code — the ref already names the marketplace. The Amazon Ads tools are the exception: they also take a `countryCode` for the advertising profile. ## A bare name is refused — with the answer [#a-bare-name-is-refused--with-the-answer] A bare store name (`myStore`) names the store but not the marketplace, so it is refused with a 400. The refusal lists **every ref that would have worked**, so your agent corrects itself in one step: For a store selling in the US, Canada and Mexico, that is `myStore-US`, `myStore-CA` and `myStore-MX`. A ref that matches two of your stores is refused too, the same way — rename one of them in the app. ## Paused stores [#paused-stores] A store whose **every** marketplace is inactive on your plan stops syncing, so its report data would be out of date. Rather than answer from stale data, SellerSheet **refuses** the store (403), naming it, your plan's usage and both remedies: * upgrade the plan, or * free a marketplace slot under **My Stores → Edit Marketplaces** — in the app, **Settings → Stores & Marketplaces → Edit markets**. `get_user_context` marks such a store `paused` with the reason, so your agent knows before it picks a store. A store with only **some** marketplaces active is not paused: it keeps syncing those and answers for them. noon marketplaces count against the same plan quota as Amazon ones, so a noon account can be the reason an Amazon marketplace is not active. ## Stores shared with you [#stores-shared-with-you] A store another account shares with you appears in your `store_refs` like your own. What you can do on it is what its owner granted you — and a key never reaches beyond that. See [Stay in control](/docs/mcp-api/control). # Advertising account (https://sellersheetai.com/docs/mcp-api/workflows/ads-account) > Ads accounts and profiles, manager accounts, invoices, brands, Stores insights, budget rules and event streams — by conversation or by code. Everything around your campaigns: which Ads accounts and profiles you have, what Amazon billed you, which brands and Stores assets you own, budget rules and usage, and real-time event streams. ## In your daily workflow [#in-your-daily-workflow] * **Accounts and profiles** — `ads_list_ads_accounts` and `ads_get_ads_account` show what your connection reaches; `ads_get_manager_accounts` covers manager accounts. * **Invoices** — `ads_list_invoices` and `ads_get_invoice` answer "what did Amazon bill us, and is it paid?" * **Budgets** — `ads_campaigns_budget_usage` and `ads_portfolio_budget_usage` show how much of each budget is spent; the budget-rule tools raise budgets on a schedule or on performance. * **Brands and Stores** — `ads_get_brands`, `ads_list_assets`, `ads_get_asin_engagement_for_store` and `ads_get_insights_for_store_api`. * **Localization** — `ads_get_localized_keywords`, `ads_get_localized_products` and their siblings translate keywords and products for another marketplace. * **Event streams** — `ads_list_stream_subscriptions` and `ads_create_stream_subscription` manage real-time Ads event subscriptions. ## Try asking [#try-asking] > "List my Amazon Ads accounts and profiles." > "Show me my unpaid advertising invoices." > "Which campaigns ran out of budget this week?" ## Accounts, both ways [#accounts-both-ways] **MCP** — you ask: "Which Ads accounts can you see?" Your agent calls `ads_list_ads_accounts`. Creating accounts, associating manager accounts, budget rules and stream subscriptions change your Ads account, so the store needs Ads write access (see [Stay in control](/docs/mcp-api/control)). Everything else here reads. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### My agent sees no Ads profile. [#my-agent-sees-no-ads-profile] Advertising is a separate authorization on Amazon. Authorize Ads for the store — see [Connect your store](/docs/start/connect). ### Where are the campaigns? [#where-are-the-campaigns] See [Sponsored Products](/docs/mcp-api/workflows/ads-sp). # Ad reports (https://sellersheetai.com/docs/mcp-api/workflows/ads-reports) > Performance for every ad type — from your synced ad reports instantly, or a fresh report from Amazon when you need one — plus brand metrics. Most ad questions are answered from your synced Sponsored Products, Brands and Display reports in seconds. When you need a report shape that is not synced, your agent requests it from Amazon, waits for it and reads the rows. ## Two ways to get the numbers [#two-ways-to-get-the-numbers] ### Ask your synced reports first [#ask-your-synced-reports-first] Campaign, ad group, keyword, target, search-term and placement reports sync on a schedule. `query_report_data` filters and totals them instantly — "SP campaigns with ACoS above 40% last month" never waits on Amazon. The tables are listed on the [Data](/docs/data) tab. ### Request a fresh report when you need one [#request-a-fresh-report-when-you-need-one] `ads_create_async_report` asks Amazon for a report with the columns, grouping and dates you choose. Amazon builds it in the background; `ads_get_async_report` checks the status and returns the rows when it is complete. ### Brand metrics [#brand-metrics] `ads_generate_brand_metrics_report` and `ads_get_brand_metrics_report` return brand awareness and consideration KPIs — also built in the background. ## Try asking [#try-asking] > "Generate a Sponsored Products campaign performance report for last month." > "From the last 30 days of search terms, find the converting ones I'm not targeting yet." > "Show me my brand metrics report." ## A fresh report, both ways [#a-fresh-report-both-ways] **MCP** — you ask: "Get last month's Sponsored Products campaign report." Your agent calls `ads_create_async_report`, then polls `ads_get_async_report` until it is done. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Synced or fresh? [#synced-or-fresh] Synced for anything over a date range — it is instant and does not use Amazon's rate limits. Fresh when the shape you need is not synced. See [Synced reports](/docs/mcp-api/workflows/reports). ### How far back can a fresh report go? [#how-far-back-can-a-fresh-report-go] Most Ads report types look back at most 95 days. ### Is there a skill for this? [#is-there-a-skill-for-this] Yes — the `amazon-ads` skill carries ready-made report request bodies. See [Install the skills](/docs/start/skills). # Sponsored Brands (https://sellersheetai.com/docs/mcp-api/workflows/ads-sb) > Headline search ads that show your brand — campaigns, ad groups, creatives, keywords and bids — by conversation or by code. Sponsored Brands campaigns use the same campaign, ad group, ad and target tools as every other ad type, filtered to Sponsored Brands. Your agent asks Amazon for keyword and bid suggestions before it proposes anything. ## In your daily workflow [#in-your-daily-workflow] * **Start from your brand** — `ads_get_brands` lists the brands registered under your Ads profile; `ads_list_assets` finds the logos and images your creatives can use. * **Pick keywords** — `ads_get_keyword_recommendations` suggests keywords for a Sponsored Brands campaign; `ads_get_bids_recommendations` returns Amazon's suggested bids. * **Build it** — `ads_create_campaign`, `ads_create_ad_group`, `ads_create_ad` and `ads_create_target` create the entities; `ads_query_campaign` lists what is live. * **Budget** — `ads_sb_get_budget_recommendations` tells you where a campaign is losing impressions to budget. * **Performance** — your synced Sponsored Brands reports answer through `query_report_data`. ## Try asking [#try-asking] > "Create a Sponsored Brands campaign for my brand with the three best keywords Amazon suggests — show me the plan first." > "Get bid recommendations for my Sponsored Brands keywords." ## Listing campaigns, both ways [#listing-campaigns-both-ways] **MCP** — you ask: "List my Sponsored Brands campaigns." Your agent calls `ads_query_campaign`. Creating and changing campaigns, ads and targets changes your Ads account, so the store needs Ads write access (see [Stay in control](/docs/mcp-api/control)). Recommendations and reads work with read access. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Why are the campaign tools the same as Sponsored Products? [#why-are-the-campaign-tools-the-same-as-sponsored-products] Amazon's current Ads API treats campaigns, ad groups, ads and targets the same way for every ad type; you choose the ad type in the request. See [Sponsored Products](/docs/mcp-api/workflows/ads-sp). ### Where are the reports? [#where-are-the-reports] See [Ad reports](/docs/mcp-api/workflows/ads-reports) and [Synced reports](/docs/mcp-api/workflows/reports). # Sponsored Display (https://sellersheetai.com/docs/mcp-api/workflows/ads-sd) > Reach shoppers on and off Amazon — display campaigns, audiences and product targeting, with Amazon's bid and budget suggestions — by conversation or by code. Sponsored Display uses the shared campaign, ad group, ad and target tools, plus three Sponsored Display suggestions from Amazon: products and categories to target, bids, and budgets. ## In your daily workflow [#in-your-daily-workflow] * **Find who to target** — `ads_get_target_recommendations` suggests products and categories to target for the ASINs you advertise. * **Bid with Amazon's numbers** — `ads_get_target_bid_recommendations` returns suggested bids for those targets. * **Spot missed reach** — `ads_get_sd_budget_recommendations` returns budget suggestions and the missed-opportunity metrics behind them. * **Build and change** — `ads_create_campaign`, `ads_create_ad_group`, `ads_create_ad` and `ads_create_target`; `ads_update_target_bid` changes a bid you approved. * **Performance** — your synced Sponsored Display reports answer through `query_report_data`. ## Try asking [#try-asking] > "Create a Sponsored Display retargeting campaign for B0EXAMPLE1 — suggest the targets and bids first." > "What are the recommended budgets for my Sponsored Display campaigns?" ## Budget suggestions, both ways [#budget-suggestions-both-ways] **MCP** — you ask: "What budgets does Amazon recommend for these Sponsored Display campaigns?" Your agent calls `ads_get_sd_budget_recommendations` and lays the suggestions next to today's budgets. Creating and changing campaigns, targets and bids changes your Ads account, so the store needs Ads write access (see [Stay in control](/docs/mcp-api/control)). Recommendations and reads work with read access. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Do the campaign tools differ from Sponsored Products? [#do-the-campaign-tools-differ-from-sponsored-products] No — the same tools serve every ad type. See [Sponsored Products](/docs/mcp-api/workflows/ads-sp) and [Sponsored Brands](/docs/mcp-api/workflows/ads-sb). ### Where are the reports? [#where-are-the-reports] See [Ad reports](/docs/mcp-api/workflows/ads-reports). # Sponsored Products (https://sellersheetai.com/docs/mcp-api/workflows/ads-sp) > Launch, tune and audit Sponsored Products campaigns — campaigns, ad groups, keywords, product targets, bids, negatives and Amazon's own recommendations — by conversation or by code. Describe the campaign you want; your agent builds the whole structure, asks Amazon for the suggested bid, and shows you the plan before anything goes live. Day to day it reads performance from your synced ad reports and changes only the bids and targets you approve. ## Launch a campaign, step by step [#launch-a-campaign-step-by-step] ### Describe it in one sentence [#describe-it-in-one-sentence] "Create a Sponsored Products campaign for B0EXAMPLE1 with a daily budget I set, targeting 'organic protein powder'." Your agent plans the campaign, an ad group, the product ad and the keyword, and shows you the structure first. ### Ask Amazon what to bid [#ask-amazon-what-to-bid] `ads_get_theme_based_bid_recommendation_for_ad_group_v1` returns Amazon's suggested bids for the keywords and targets; `ads_get_ranked_keyword_recommendation` suggests more keywords worth adding. ### Create it in one request [#create-it-in-one-request] `ads_sp_bulk_create` creates the campaign, ad groups, keywords and product ads in one atomic request — much faster than one entity at a time. Single entities go through `ads_create_campaign`, `ads_create_ad_group`, `ads_create_ad` and `ads_create_target`. ### Tune it every week [#tune-it-every-week] `query_report_data` reads campaign, keyword and search-term performance from your synced SP reports. Your agent writes the proposed bid changes to your sheet; on your go-ahead `ads_update_target_bid` applies them. Negative keywords and targets cut wasted spend; `ads_get_history` shows the last 90 days of changes. ## In your daily workflow [#in-your-daily-workflow] * **Amazon's own tips** — `ads_list_recommendations` lists Amazon's optimization suggestions; `ads_apply_recommendations` applies the ones you accept. * **Rules instead of manual edits** — `ads_sp_create_optimization_rules` and `ads_associate_optimization_rules_to_campaign` set schedule-based bid rules. * **Portfolios** — `ads_list_portfolios`, `ads_create_portfolio` and `ads_update_portfolio` group campaigns under a shared budget. * **Full snapshots** — `ads_campaign_export` and its siblings export every entity; `ads_get_export` downloads the file. ## Try asking [#try-asking] > "Create a Sponsored Products campaign for B0EXAMPLE1 targeting 'organic protein powder', with Amazon's suggested bid — show me the structure before you create it." > "Raise the bids on these keywords 10% toward the suggested bid — write them to the sheet first, I'll confirm before you submit." ## Listing campaigns, both ways [#listing-campaigns-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "List my Sponsored Products campaigns." Your agent calls `ads_query_campaign` and pages through the results. Creating campaigns, changing bids, budgets and targets, and applying recommendations change your Ads account, so the store needs Ads write access (see [Stay in control](/docs/mcp-api/control)). Reading campaigns, recommendations and reports works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. Campaigns, ad groups, ads and targets for every ad type: Sponsored Products recommendations, portfolios, rules and exports: ## FAQ [#faq] ### Where does performance data come from? [#where-does-performance-data-come-from] From your synced ad reports — `query_report_data` answers instantly without waiting on Amazon. See [Synced reports](/docs/mcp-api/workflows/reports) and [Ad reports](/docs/mcp-api/workflows/ads-reports). ### Will my agent change bids on its own? [#will-my-agent-change-bids-on-its-own] Not unless you tell it to. The usual pattern is: write the proposal to the sheet, you review, then it submits. ### What about budgets? [#what-about-budgets] `ads_campaigns_budget_usage` shows which campaigns ran out this week; budget rules are on [Advertising account](/docs/mcp-api/workflows/ads-account) and the other ad types on [Sponsored Brands](/docs/mcp-api/workflows/ads-sb) and [Sponsored Display](/docs/mcp-api/workflows/ads-sd). ### Is there a skill for this? [#is-there-a-skill-for-this] Yes — the `amazon-ads` skill. See [Install the skills](/docs/start/skills). # A+ Content (https://sellersheetai.com/docs/mcp-api/workflows/aplus) > Check, create, iterate and publish A+ content — and manage which ASINs it is live on — without opening Seller Central. Your agent checks whether an ASIN already has A+, builds and submits a whole module set in one call, edits drafts, relinks variation families and takes content down without deleting it. ## In your daily workflow [#in-your-daily-workflow] ### Before writing anything [#before-writing-anything] "Does this ASIN already have A+?" `aplusContent_searchContentPublishRecords` answers per ASIN, so you never draft content that would fight a live document. ### Launch day [#launch-day] `aplusContent_create_and_publish` is the one-call pipeline: it uploads your images, creates the document, links the ASINs and submits it for Amazon's review. ### Iterate on a draft [#iterate-on-a-draft] `aplusContent_updateContentDocument` edits copy and modules while the document is still a draft; `aplusContent_postContentDocumentApprovalSubmission` sends it for review when you are happy. ### Manage a variation family [#manage-a-variation-family] New variation added? `aplusContent_validateContentDocumentAsinRelations` checks the ASINs first, then `aplusContent_postContentDocumentAsinRelations` replaces the linked set. ### Review the portfolio, take content down [#review-the-portfolio-take-content-down] `aplusContent_list_documents_detailed` pulls your documents with full detail, so your agent can lay out coverage brand-wide in a sheet. `aplusContent_postContentDocumentSuspendSubmission` unpublishes a document and keeps it for later. ## Try asking [#try-asking] > "Check if B0EXAMPLE1 already has live A+ content, then create and publish A+ for it using the images in my Images Generation sheet." > "Create the A+ page from the content in my sheet and submit it." ## Step 1, both ways [#step-1-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "Does B0EXAMPLE1 have A+ yet?" Your agent calls `aplusContent_searchContentPublishRecords` and tells you what is live. Creating, editing, submitting, linking and suspending change your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Searching and reading documents works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Where do the A+ images come from? [#where-do-the-a-images-come-from] From your own files, or from images your agent generates — see [AI images](/docs/mcp-api/workflows/images). Generated images are paid from Credits. ### What should the copy say? [#what-should-the-copy-say] Ask your agent to start from what buyers say — see [Review insights](/docs/mcp-api/workflows/reviews). # Data Kiosk (https://sellersheetai.com/docs/mcp-api/workflows/datakiosk) > Run Amazon Data Kiosk GraphQL queries — Sales & Traffic, Economics, Vendor Analytics — and read the results, by conversation or by code. Data Kiosk is Amazon's GraphQL analytics API. Your agent writes the query, submits it, waits for Amazon and reads the document — sales and traffic by date or ASIN, per-unit fees and margin, vendor analytics. ## Query, wait, read [#query-wait-read] ### Submit the query [#submit-the-query] `dataKiosk_createQuery` sends a GraphQL query for one dataset and date range. ### Wait for Amazon [#wait-for-amazon] `dataKiosk_getQuery` checks the status and downloads the result when it is done. `dataKiosk_getQueries` lists your recent queries; `dataKiosk_cancelQuery` stops one. ### Read the document [#read-the-document] `dataKiosk_getDocument` fetches a finished result by its document ID. ## Try asking [#try-asking] > "Run a Data Kiosk Sales & Traffic query by ASIN for last month." > "Check my pending Data Kiosk queries." ## Checking a query, both ways [#checking-a-query-both-ways] **MCP** — you ask: "Is my Data Kiosk query done yet?" Your agent calls `dataKiosk_getQuery`. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Is Sales & Traffic already synced? [#is-sales--traffic-already-synced] Yes — by date and by ASIN, as synced tables you query instantly. See [Synced reports](/docs/mcp-api/workflows/reports) and the [Data](/docs/data) tab. ### How does my agent write a valid query? [#how-does-my-agent-write-a-valid-query] The `data-kiosk` skill carries each dataset's fields, arguments and enums. See [Install the skills](/docs/start/skills). # Google Docs (https://sellersheetai.com/docs/mcp-api/workflows/docs) > Create and edit Google Docs — reports, SOPs, briefs — in your SellerSheet workspace. `write_doc_structured` writes a whole document in one call — headings, paragraphs, lists, tables. The other Docs tools give your agent fine control over text, tables, images, headers, footers and styles. ## In your daily workflow [#in-your-daily-workflow] ### Create the document [#create-the-document] `create_doc_in_folder` creates a doc inside your workspace folder; `get_doc` and `get_doc_text` read one back. ### Write it in one call [#write-it-in-one-call] `write_doc_structured` takes a list of blocks and writes them in order — the fastest way to turn a week's numbers into a report. ### Edit precisely [#edit-precisely] `find_doc_text`, `replace_doc_text`, `insert_doc_text` and `delete_doc_range` change text; `insert_doc_table`, `set_doc_table_cell_text` and `insert_doc_image` add tables and images; `update_doc_text_style` and `update_doc_paragraph_style` style it. `doc_batch_update` is the escape hatch. ## Try asking [#try-asking] > "Create a weekly performance report doc in my reports folder." > "Insert a 3-column table summarising my top ASINs." ## Writing a document, both ways [#writing-a-document-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask for the weekly report. Your agent pulls the numbers, then calls `write_doc_structured`. The write tools change the document you name — never your Amazon account. A document must be yours: owned by you, shared with your Google account, or inside your workspace. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Where do the numbers come from? [#where-do-the-numbers-come-from] From the Amazon tools and your synced reports — for example [Sales analytics](/docs/mcp-api/workflows/sales) and [Synced reports](/docs/mcp-api/workflows/reports). # Google Drive (https://sellersheetai.com/docs/mcp-api/workflows/drive) > Find, save, copy, share and organise files in your SellerSheet workspace on Google Drive. Your agent works inside your SellerSheet workspace folders: it lists and searches files there, saves files from a link, creates spreadsheets, and shares or moves what you ask. A listing never leaves your workspace, and a file named by its id must be yours. ## In your daily workflow [#in-your-daily-workflow] ### Find it [#find-it] `list_drive_files` lists a folder of your workspace; `search_drive_files` and `find_file_in_folder` find files by name; `get_drive_file` returns one file's details. ### Save and create [#save-and-create] `save_url_to_drive` streams a file from a link into a folder — a report document, a label PDF; `start_drive_upload` opens an upload for large files. `find_or_create_folder` and `create_spreadsheet_in_folder` set up a place for new work. ### Organise and share [#organise-and-share] `copy_drive_file`, `move_file_to_folder` and `rename_drive_file` keep things tidy; `share_drive_file`, `unshare_drive_file` and `list_drive_permissions` manage who can see a file. ## Try asking [#try-asking] > "List all files in my reports folder." > "Share my sales spreadsheet with my team, view only." ## Listing a folder, both ways [#listing-a-folder-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "What's in my reports folder?" Your agent calls `list_drive_files`. Saving, moving, sharing and deleting change files in your Drive — never your Amazon account. Deleting a file and removing someone's access cannot simply be undone. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Where is my workspace folder? [#where-is-my-workspace-folder] The Google Sheets add-on creates it the first time you open the sidebar. See [Connect your store](/docs/start/connect). ### Are generated images in Drive? [#are-generated-images-in-drive] No — generated images live on SellerSheet's CDN and in your Image Library. See [AI images](/docs/mcp-api/workflows/images). # Check FBA stock & restock (https://sellersheetai.com/docs/mcp-api/workflows/fba-inventory) > Check Amazon's live stock before you act, and run restock, aging and stranded-inventory analysis over your synced inventory reports. Spot-check live, analyse synced. A live call gives Amazon's numbers right now for a few SKUs; the synced inventory reports answer whole-catalog questions — restock, aging, stranded stock — instantly. ## In your daily workflow [#in-your-daily-workflow] ### Before you create a shipment [#before-you-create-a-shipment] `fbaInventory_getInventorySummaries` returns Amazon's live numbers for the SKUs you are about to send: fulfillable, inbound, reserved and unsellable. Use it when the decision depends on *right now*. ### Restock day [#restock-day] "Which SKUs run out within 3 weeks?" is an analysis over your synced FBA reports — inventory ledger, restock recommendations, aging — through `query_report_data`. It covers every SKU at once and joins with your sales velocity. See the [synced tables](/docs/data). ### Stranded and aging audit [#stranded-and-aging-audit] The synced stranded-inventory and aging tables show cash quietly stuck in fulfillment centers. Ask for them once a month. ## Try asking [#try-asking] > "Check live FBA stock for SKU-A and SKU-B in myStore-US." > "Which of my SKUs will run out of FBA stock within 21 days at current sales velocity?" ## The spot check, both ways [#the-spot-check-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "How many units of SKU-A are fulfillable and inbound right now?" Your agent calls `fbaInventory_getInventorySummaries` for that SKU and reads the counts back to you. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Live or synced — which should I use? [#live-or-synced--which-should-i-use] Live is per SKU and counts against Amazon's rate limits; synced covers the whole catalog and answers at once. Spot-check live, analyse synced. ### Ready to send stock? [#ready-to-send-stock] Continue with [Create FBA shipments](/docs/mcp-api/workflows/fba-shipments). ### Can I ship FBA stock to a non-Amazon order? [#can-i-ship-fba-stock-to-a-non-amazon-order] Yes — see [Multi-channel fulfillment](/docs/mcp-api/workflows/mcf). # Create FBA shipments (https://sellersheetai.com/docs/mcp-api/workflows/fba-shipments) > The whole Send-to-Amazon run — plan, pack, compare placement fees, pick transport, print labels, upload tracking — by conversation or by code, with your STA sheet as the record. One sentence starts the plan. You see Amazon's placement fees before anything is confirmed. Labels and tracking follow. Every step is a tool your agent calls — and your own code can call the same tool with the same arguments. ## The shipment day, step by step [#the-shipment-day-step-by-step] ### Start with one sentence [#start-with-one-sentence] "Create an FBA shipment for these 5 SKUs, 40 units each." `fbaInbound_orchestrate_packing` creates the inbound plan and starts Amazon's packing, placement and transport options in one call. `fbaInbound_create_sta_sheet` gives you an STA spreadsheet that records the whole run. ### Compare placement fees before you commit [#compare-placement-fees-before-you-commit] `fbaInbound_listPlacementOptions` shows Amazon's warehouse splits with their fees — often the difference between a free split across several warehouses and a paid single destination. You pick; your agent runs `fbaInbound_confirm_plan_options`, which confirms placement and transport in one step. Confirming cannot be undone for that plan, so the money is shown first. ### Pack, label, hand over to the carrier [#pack-label-hand-over-to-the-carrier] `fbaInbound_setPackingInformation` records what went into each box. `fbaInbound_create_packing_list` writes the packing list from Amazon's own box IDs, `fbaInbound_get_labels` downloads the box-label PDF into the plan folder, and `fbaInbound_createMarketplaceItemLabels` prints FNSKU labels when your products need them. ### Track it until Amazon checks it in [#track-it-until-amazon-checks-it-in] `fbaInbound_updateShipmentTrackingDetails` uploads the carrier's tracking. `fbaInbound_sync_shipment_status` answers "has Amazon received it yet?" on any day after. Delivering it yourself? `fbaInbound_getSelfShipAppointmentSlots` and `fbaInbound_scheduleSelfShipAppointment` book the dock appointment. ## Try asking [#try-asking] > "Create an FBA shipment for SKU-A ×40 and SKU-B ×24 from my warehouse — show me the placement options and fees before you confirm anything." ## Step 2, both ways [#step-2-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "Show me the placement options and fees for this plan before confirming anything." Your agent calls `fbaInbound_listPlacementOptions`, lays the splits and fees out for you, and waits for your pick. Creating plans, confirming options, packing and uploading tracking change your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Reading plans, options and status works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. The workflow tools above call the single-step tools below for you; reach for those when you want to run one step on its own. Most generate/list pairs are asynchronous: *generate* starts the job on Amazon, *list* reads its result. Every FBA inbound tool: ## FAQ [#faq] ### Can I check stock before I plan? [#can-i-check-stock-before-i-plan] Yes — `fbaInventory_getInventorySummaries` returns Amazon's live fulfillable and inbound counts for the SKUs you are about to send. See [FBA inventory](/docs/mcp-api/workflows/fba-inventory). ### Will my agent pick an option for me? [#will-my-agent-pick-an-option-for-me] Not unless you name the rule ("always take the cheapest placement"). Otherwise it shows you the options and waits. ### Can I do this in the Google Sheets add-on instead? [#can-i-do-this-in-the-google-sheets-add-on-instead] Yes — the FBA panel of the add-on runs the same steps from the STA sheet. See the [add-on buttons](/help/sheets/buttons#sellers-fba). ### Is there a skill for this? [#is-there-a-skill-for-this] Yes — the `fba-inbound` skill walks your agent through the whole run. See [Install the skills](/docs/start/skills). # Fee estimator (https://sellersheetai.com/docs/mcp-api/workflows/fees) > Estimate Amazon's referral and FBA fees for a price before you list or reprice — one item or a batch — by conversation or by code. Name a price; your agent returns Amazon's own fee estimate — referral fee, FBA fee and the total — so the margin is known before you list, reprice or send stock. ## In your daily workflow [#in-your-daily-workflow] * **One ASIN** — `productFees_getMyFeesEstimateForASIN` estimates the fees for any ASIN at a price you give. * **Your SKU** — `productFees_getMyFeesEstimateForSKU` does the same for one of your own listings. * **A whole list** — `productFees_getMyFeesEstimates` estimates many items in one call; your agent writes them to your sheet beside your costs. ## Try asking [#try-asking] > "If I price this SKU at 29.99, what are the referral and FBA fees, and my net margin?" > "Estimate Amazon fees for B0EXAMPLE1 at 29.99." > "Calculate fees for all my FBA products at their current prices." ## An estimate, both ways [#an-estimate-both-ways] **MCP** — you ask: "What would Amazon charge on B0EXAMPLE1 at 29.99, fulfilled by Amazon?" Your agent calls `productFees_getMyFeesEstimateForASIN`. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Are these the fees Amazon will actually charge? [#are-these-the-fees-amazon-will-actually-charge] They are Amazon's own estimate for that price. What was really charged on an order is in [Financial reports](/docs/mcp-api/workflows/financials). ### What price wins the Buy Box? [#what-price-wins-the-buy-box] See [Competitive pricing](/docs/mcp-api/workflows/pricing). # Financial reports (https://sellersheetai.com/docs/mcp-api/workflows/financials) > Settlements, financial events and transactions — what Amazon charged, credited and paid out, by period or by order. Ask in money terms — "what did the last settlement pay out?", "which fees hit this order?" — and your agent reads Amazon's financial events and transactions for the period or order you name. ## In your daily workflow [#in-your-daily-workflow] ### Settlement periods [#settlement-periods] `finances_listFinancialEventGroups` lists your settlement periods; `finances_listFinancialEventsByGroupId` returns every charge, fee and refund inside one of them. ### A date range [#a-date-range] `finances_listFinancialEvents` lists financial events for a date range; `finances_listTransactions` lists the transactions behind them. ### One order [#one-order] `finances_listFinancialEventsByOrderId` itemizes what Amazon charged and credited for a single order. ## Try asking [#try-asking] > "Show me my latest settlement — revenue, refunds and FBA fees." > "List all financial events from last week." > "Which fees did Amazon take on order 112-3456789-0000000?" ## The settlement list, both ways [#the-settlement-list-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask for the last settlement; your agent calls `finances_listFinancialEventGroups`, picks the latest period and reads its events. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Can I see settlements across months? [#can-i-see-settlements-across-months] Yes — your synced financial reports answer that at once with `query_report_data`. See [Synced reports](/docs/mcp-api/workflows/reports). ### How do I estimate fees before I sell? [#how-do-i-estimate-fees-before-i-sell] See the [Fee estimator](/docs/mcp-api/workflows/fees). # AI images (https://sellersheetai.com/docs/mcp-api/workflows/images) > Generate and edit Amazon-ready product images. Every delivered image lands on SellerSheet's CDN and in your store's Image Library, versioned per SKU and slot. Describe the image, or hand your agent reference images to edit. Jobs run in the background; the finished image comes back as a CDN link and is filed in your Image Library under its store, SKU and slot — nothing is written to Google Drive. ## How it works [#how-it-works] ### Generate or edit [#generate-or-edit] `generate_image` makes a new image from a description; `edit_image` changes an existing one — swap your product into a scene, recolour a variant, clean up a background. `reverse_prompt` turns a reference shot into a description you can reuse. ### Wait for the job [#wait-for-the-job] Images take a while, so the call starts a job. `check_image_job` (or `check_image_jobs` for several) reports when it is done and returns the image's CDN link. ### Filed in your library, versioned [#filed-in-your-library-versioned] Every generate and edit call names the store, the SKU and the slot, so the result is filed in the right place; each new image of a slot becomes the next version. `list_generated_images` lists what is there; the Image Library in the app shows it all. ### Disclose AI people [#disclose-ai-people] When an image shows a photorealistic person who does not exist, it carries Amazon's synthetic-performer marking. `set_synthetic_performer` changes the marking on an image after the fact. Images are paid from your [Credits](/help/app/settings/billing). The price is shown and held before the job runs, and refunded when a job fails — a failed image costs nothing. Your store ref is checked before anything is held. ## Try asking [#try-asking] > "Generate a white-background main image for SKU-A in myStore-US — product on a subtle shadow, no props, compliant with Amazon's main-image rules." > "Make a white-background main image of my product in the style of this competitor shot." > "Swap my product into this picture and keep the scene." ## Step 1, both ways [#step-1-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask for the main image above. Your agent calls `generate_image` with the store, SKU and slot, polls `check_image_job`, and shows you the result for review. Generating and editing create new images in your library and spend Credits, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Listing images and checking jobs only read. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Do the images go to my listing automatically? [#do-the-images-go-to-my-listing-automatically] No — they wait in your Image Library for review. Put them on a listing through [Create listings](/docs/mcp-api/workflows/listings-create) or [A+ Content](/docs/mcp-api/workflows/aplus). ### Is there a skill for this? [#is-there-a-skill-for-this] Yes — the `image-gen` skill teaches your agent the compliance rules and the review loop. See [Install the skills](/docs/start/skills). # Workflows (https://sellersheetai.com/docs/mcp-api/workflows) > One page per job — FBA, listings, orders, ads, reports, pricing, content, noon, Vendor Central and Google Workspace — done through your AI client or your own code. Each workflow is one job you hand to your agent. It shows the steps, prompts to try, one call written both ways — as the MCP tool call your AI client sends and as the same call from code — and the tools it uses, with their access labels. The tools and arguments are the same either way. Every tool is in the [tool reference](/docs/mcp-api/tools). ## FBA & inventory [#fba--inventory] * [Create FBA shipments](/docs/mcp-api/workflows/fba-shipments) — plan, pack, compare placement fees, label, track. * [FBA inventory](/docs/mcp-api/workflows/fba-inventory) — live stock before you act, restock analysis on synced reports. * [Multi-channel fulfillment](/docs/mcp-api/workflows/mcf) — ship orders from other channels out of your FBA stock. ## Listings [#listings] * [View & search listings](/docs/mcp-api/workflows/listings-view) — your catalog, its status and its issues. * [Create listings](/docs/mcp-api/workflows/listings-create) — new products from product-type templates, validated before they go. * [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes) — flat sheet cells to Amazon attributes, in bulk. * [Optimize listings](/docs/mcp-api/workflows/listings-optimize) — reviews, competitors, keywords and images into a better listing. ## Orders & finance [#orders--finance] * [Orders](/docs/mcp-api/workflows/orders) — today's orders live, history from your synced data. * [Sales analytics](/docs/mcp-api/workflows/sales) — units, orders and revenue over any period. * [Financial reports](/docs/mcp-api/workflows/financials) — settlements, financial events and transactions. ## Advertising [#advertising] * [Sponsored Products](/docs/mcp-api/workflows/ads-sp) — campaigns, targets, bids and budgets. * [Sponsored Brands](/docs/mcp-api/workflows/ads-sb) — brand campaigns and their recommendations. * [Sponsored Display](/docs/mcp-api/workflows/ads-sd) — display campaigns, targeting and budgets. * [Ad reports](/docs/mcp-api/workflows/ads-reports) — performance reports for every ad type. * [Ads account & brand](/docs/mcp-api/workflows/ads-account) — accounts, invoices, brands, Stores and event streams. ## Reports & data [#reports--data] * [Synced reports](/docs/mcp-api/workflows/reports) — query your report warehouse instantly. * [On-demand reports](/docs/mcp-api/workflows/reports-ondemand) — request a fresh report from Amazon. * [Data Kiosk](/docs/mcp-api/workflows/datakiosk) — GraphQL analytics datasets. ## Pricing, fees & replenishment [#pricing-fees--replenishment] * [Competitive pricing](/docs/mcp-api/workflows/pricing) — Buy Box, lowest offers, Featured Offer price. * [Fee estimates](/docs/mcp-api/workflows/fees) — referral and FBA fees before you price. * [Replenishment](/docs/mcp-api/workflows/replenishment) — Subscribe & Save metrics and offers. ## Content & buyers [#content--buyers] * [A+ Content](/docs/mcp-api/workflows/aplus) — create, publish, relink and suspend A+. * [Review insights](/docs/mcp-api/workflows/reviews) — what buyers praise, complain about and return. * [AI images](/docs/mcp-api/workflows/images) — generate and edit product images into your Image Library. ## noon & Vendor Central [#noon--vendor-central] * [Selling on noon](/docs/mcp-api/workflows/noon) — catalog, pricing, stock, FBN inbound and reports. * [Vendor Central](/docs/mcp-api/workflows/vendor) — purchase orders, shipments and invoices. ## Google Workspace [#google-workspace] * [Google Sheets](/docs/mcp-api/workflows/sheets) — where your agent records results for review. * [Google Docs](/docs/mcp-api/workflows/docs) — reports and SOPs in one call. * [Google Drive](/docs/mcp-api/workflows/drive) — files in your SellerSheet workspace. # Attributes & Publish Queue (https://sellersheetai.com/docs/mcp-api/workflows/listings-attributes) > Turn flat spreadsheet cells into Amazon-shaped attribute JSON and back, validate, and publish many listings at once from a Publish Queue sheet. Seed a Publish Queue sheet for one or more product types, fill flat cells (or fetch what Amazon already has), then submit. SellerSheet translates each cell to the attribute shape Amazon expects, and back again. ## Step by step [#step-by-step] ### Seed the sheet [#seed-the-sheet] "Prepare a Publish Queue template for product type LUGGAGE." `listings_prepare_publish_queue_template` bundles everything needed to set up a Publish Queue tab for one or several product types — columns merged across types, required ones first. ### Fill it — or start from what is live [#fill-it--or-start-from-what-is-live] `listings_fetch_attributes_by_skus` fetches your own listings and flattens their attributes into cells; `listings_fetch_attributes_by_asins` does the same for any ASIN's catalog attributes, and `listings_parse_asin_to_cells` maps one ASIN onto the sheet's columns. `listings_get_attribute_guide` explains an attribute: its format, units and allowed values. ### Check the translation [#check-the-translation] `listings_build_payload` turns flat values into Amazon's attribute JSON so you can see exactly what will be sent; `listings_parse_payload` does the reverse. ### Submit [#submit] `listings_submit_items` builds and submits per SKU in one step; `listings_submit_feed` sends a whole batch through Amazon's Feeds API, and `listings_poll_feed_results` reads back what Amazon accepted or rejected. ## Try asking [#try-asking] > "Prepare a Publish Queue template for product type LUGGAGE." > "Fetch the current attributes for these 50 ASINs and flatten them into my sheet." > "Submit the rows I changed." ## Seeding the template, both ways [#seeding-the-template-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you name the product types; your agent calls `listings_prepare_publish_queue_template` and writes the template into your sheet with the sheet tools. Submitting items or a feed changes your listings, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Templates, fetches, guides and payload previews work with read access. A submitted update replaces the listing's attributes with the row, so fetch first and edit from there. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Can I check rows before submitting? [#can-i-check-rows-before-submitting] Yes — `listings_validate_rows` runs Amazon's validation preview on the rows first. See [Create listings](/docs/mcp-api/workflows/listings-create). ### Can I do this in the Google Sheets add-on? [#can-i-do-this-in-the-google-sheets-add-on] Yes — the add-on's catalog panel runs the same Publish Queue from the sidebar. See the [add-on buttons](/help/sheets/buttons#sellers-catalogs). ### Where do I find which listings need work? [#where-do-i-find-which-listings-need-work] Start with [View & search listings](/docs/mcp-api/workflows/listings-view). # Create listings (https://sellersheetai.com/docs/mcp-api/workflows/listings-create) > List new products on Amazon from the product type's own schema — find the type, fill the required attributes, validate, then submit. Your agent finds the product type, reads its schema, fills the attributes with you, checks them with Amazon's validation preview and only then creates the listing. ## Step by step [#step-by-step] ### Find the product type [#find-the-product-type] "I'm listing a new yoga mat." `productTypeDefinitions_searchDefinitionsProductTypes` finds the matching Amazon product types by keyword. ### Read what Amazon requires [#read-what-amazon-requires] `productTypeDefinitions_getDefinitionsProductType` returns the full schema for that type — every attribute, which ones are required, and their allowed values. ### Validate before you publish [#validate-before-you-publish] `listings_validate_rows` runs Amazon's validation preview on your rows and returns the issues it would raise — nothing goes live. ### Create or change the listing [#create-or-change-the-listing] `listings_putListingsItem` creates a listing (or fully replaces one); `listings_patchListingsItem` changes only the attributes you name on an existing listing. For many SKUs at once, use the Publish Queue — see [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes). ## Try asking [#try-asking] > "Create a listing for a new yoga mat in the Sports category — check it with Amazon's validation first." > "Show me the required attributes for the product type SPORTING_GOODS." ## The schema lookup, both ways [#the-schema-lookup-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you describe the product; your agent calls `productTypeDefinitions_searchDefinitionsProductTypes`, suggests the best match, and asks before going on. Creating, replacing or patching a listing changes your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Searching product types and reading schemas work with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Can I list many products at once? [#can-i-list-many-products-at-once] Yes — prepare a Publish Queue sheet for the product type and submit it as one feed. See [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes). ### Is replacing a listing safe? [#is-replacing-a-listing-safe] `listings_putListingsItem` replaces the whole listing with what you send, so your agent fetches the current attributes first ([View & search listings](/docs/mcp-api/workflows/listings-view)). To change one field, patch it instead. # Optimize listings (https://sellersheetai.com/docs/mcp-api/workflows/listings-optimize) > Improve titles, bullets, images and A+ content with your own agent — grounded in your reviews, your competitors and Amazon's own data. Optimizing a listing is several reads and a few careful writes: what buyers say, what competitors show, what Amazon has on file, then new copy and images you approve before anything is submitted. ## Step by step [#step-by-step] ### Learn what buyers say [#learn-what-buyers-say] `customerFeedback_getItemReviewTopics` lists the topics buyers praise and complain about most on your ASIN — the raw material for better bullets. See [Review insights](/docs/mcp-api/workflows/reviews). ### See what competitors show [#see-what-competitors-show] `catalogItems_searchCatalogItems` and `catalogItems_getCatalogItem` pull competitors' titles, bullets and images; `productPricing_getCompetitiveSummary` shows where your price sits. ### Start from what is live [#start-from-what-is-live] `listings_fetch_attributes_by_asins` puts your current title, bullets and attributes side by side in a sheet, so every change is visible as an edit. ### Rewrite, review, submit [#rewrite-review-submit] Your agent drafts new copy in the sheet for you to edit; new images come from [AI image generation](/docs/mcp-api/workflows/images) and A+ from the [A+ workflow](/docs/mcp-api/workflows/aplus). When you approve, `listings_patchListingsItem` updates just the attributes you changed. ## Try asking [#try-asking] > "Optimize the listing for ASIN B0EXAMPLE1 — start from its reviews and its three closest competitors, and put the proposed title and bullets next to the current ones in a sheet." A listing-optimization skill that runs this end to end — reviews, competitors, keywords, images, A+ and a PPC plan — is on the way to the [skills catalog](/docs/skills). ## The review read, both ways [#the-review-read-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "What do buyers complain about most on B0EXAMPLE1?" Your agent calls `customerFeedback_getItemReviewTopics` and turns the topics into copy ideas. Patching a listing changes your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Every read on this page works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Does copy or image generation use Credits? [#does-copy-or-image-generation-use-credits] Images and buyer-insights reports use Credits; see [Credits & limits](/help/app/settings/billing). ### Can I change many listings at once? [#can-i-change-many-listings-at-once] Yes — through a Publish Queue sheet. See [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes). # View & search listings (https://sellersheetai.com/docs/mcp-api/workflows/listings-view) > Search your whole catalog, find suppressed or errored listings, and pull everything into a Google Sheet for review — or look up any ASIN on Amazon. Ask for the listings you care about — by keyword, ASIN, SKU, status or issue — and your agent searches your catalog, explains what is wrong, and can write the list to a sheet for you to work through. ## In your daily workflow [#in-your-daily-workflow] ### Find listings with issues [#find-listings-with-issues] "Show me every listing that is suppressed or has warnings." `listings_searchListingsItems` filters your catalog by status and issue severity (ERROR means suppressed) and returns the reasons Amazon gives. ### Look closer at one SKU [#look-closer-at-one-sku] `listings_getListingsItem` returns what Amazon has on file for one SKU right now: attributes, offers, status and issues. ### Audit in bulk [#audit-in-bulk] `listings_fetch_attributes_by_skus` (your SKUs) and `listings_fetch_attributes_by_asins` (any ASIN) pull full attribute sets for a batch at once — the starting point for a side-by-side review in your sheet. See [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes). ### Look up any product on Amazon [#look-up-any-product-on-amazon] `catalogItems_searchCatalogItems` searches the Amazon catalog by keyword or identifier (ASIN, UPC, EAN); `catalogItems_getCatalogItem` returns the detail of one ASIN — competitors' included. `listings_getListingsRestrictions` tells you whether you may sell an ASIN, and in which condition. ## Try asking [#try-asking] > "Show me all my listings that have issues or are suppressed." > "Write them to a sheet, and show me the suppressed ones first." Your agent lists each problem with Amazon's reason — a missing main image, a restricted category waiting for approval, a missing description — and writes the rows to the sheet you name. ## The search, both ways [#the-search-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "Which of my listings are suppressed?" Your agent calls `listings_searchListingsItems` with an issue filter, pages through the results, and explains each one. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### How does my agent get past the first page? [#how-does-my-agent-get-past-the-first-page] It passes the page token from each result into the next call. See [Paging](/docs/mcp-api/paging). ### Found the problem — how do I fix it? [#found-the-problem--how-do-i-fix-it] Edit the attributes in a Publish Queue sheet and submit them — see [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes) — or ask your agent to change one attribute with a patch ([Create listings](/docs/mcp-api/workflows/listings-create)). # Multi-channel fulfillment (https://sellersheetai.com/docs/mcp-api/workflows/mcf) > Ship orders from any sales channel — Shopify, TikTok Shop, your own site — out of your FBA inventory, with the fee shown before anything ships. Preview the fee and delivery speed for an order, create it once you agree, and track the package — Amazon picks, packs and ships from your FBA stock. ## Step by step [#step-by-step] ### Preview before committing [#preview-before-committing] `fbaOutbound_getFulfillmentPreview` returns the delivery-speed options and fulfillment fees for an order you describe — SKU, quantity and address — without creating anything. `fbaOutbound_deliveryOffers` answers "how fast can this arrive?" for one product. ### Create the fulfillment order [#create-the-fulfillment-order] On your go-ahead, `fbaOutbound_createFulfillmentOrder` hands the order to Amazon, which picks, packs and ships it from your FBA stock. ### Track every package [#track-every-package] `fbaOutbound_getFulfillmentOrder` shows the order's status and shipments; `fbaOutbound_getPackageTrackingDetails` gives the carrier, tracking number and delivery estimate. ### Handle changes [#handle-changes] `fbaOutbound_updateFulfillmentOrder` changes an order that has not shipped, `fbaOutbound_cancelFulfillmentOrder` cancels it, and `fbaOutbound_createFulfillmentReturn` creates a return — `fbaOutbound_listReturnReasonCodes` lists the reasons Amazon accepts. ## Try asking [#try-asking] > "A customer on my Shopify store ordered 2 units of SKU-A. Ship it from FBA to their address at standard speed — show me the fee first." ## The preview, both ways [#the-preview-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you paste the address and the SKU. Your agent calls `fbaOutbound_getFulfillmentPreview`, shows you the fee and delivery window for each speed, and creates the order only when you confirm. Creating, updating, cancelling or returning a fulfillment order changes your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Previews, offers and tracking work with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Is my stock enough? [#is-my-stock-enough] Check first with [FBA inventory](/docs/mcp-api/workflows/fba-inventory). ### Does a preview reserve stock or cost anything? [#does-a-preview-reserve-stock-or-cost-anything] No — a preview creates nothing. Only `fbaOutbound_createFulfillmentOrder` places an order. # Selling on noon (https://sellersheetai.com/docs/mcp-api/workflows/noon) > Run your noon store (UAE, Saudi Arabia, Egypt) the same way as Amazon — catalog and content, pricing, stock, FBN inbound and synced reports. Connect your noon Partners account once, and your agent works on noon with the same kind of request it uses on Amazon. A noon store ref is `-`, like . ## Before you start [#before-you-start] Connect the account in the app: **Settings → Stores & Marketplaces → Add a noon account**. noon marketplaces count against the same plan marketplace quota as your Amazon marketplaces — so a noon account can be the reason an Amazon marketplace has no slot left. See [Connect your store](/docs/start/connect). ## In your daily workflow [#in-your-daily-workflow] ### Catalog and content [#catalog-and-content] `noon_content_GetContent` reads a product; `noon_content_UpsertProduct` creates or updates one. `noon_content_draft_from_amazon_asin` drafts a noon product from one of your Amazon ASINs. For bulk work, `noon_content_prepare_publish_queue_template` and `noon_content_load_publish_queue_content` load drafts and live listings into your sheet for review before publishing. ### Pricing, stock and offers [#pricing-stock-and-offers] `noon_pricing_BatchGetPricing` and `noon_pricing_BatchUpsertPricing` read and change prices in batches; `noon_stock_GetStock` and `noon_stock_UpdateStock` do the same for stock; `noon_offer_GetProductOffers` shows the live offers on a product. Cross-border transfer prices have their own tools. ### FBN inbound [#fbn-inbound] Eligible items, shipment creation, slot booking, item updates and status changes — the whole FBN inbound flow, starting from `noon_inbound_ListEligibleItems`. noon offers its inbound API to global sellers only; on other accounts noon refuses these calls. ### Synced noon reports [#synced-noon-reports] Orders, finance and transactions, FBN inventory aging, and product views and sales sync into your warehouse on a schedule. Your agent queries them with `query_report_data`, exactly like Amazon report tables — see [Data](/docs/data). ## Try asking [#try-asking] > "Update stock for all my noon SKUs from the Stock tab of my sheet." > "What were my noon sales in Saudi Arabia last week compared with Amazon.ae?" > "Create an FBN inbound shipment for the 40 units arriving Thursday." ## Reading stock, both ways [#reading-stock-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "How much stock does myNoon-AE have for SKU-A?" Your agent finds the warehouse with `noon_warehouse_platform_ListWarehouses`, then calls `noon_stock_GetStock`. Changing products, prices, stock and inbound shipments changes your noon account, so you need write access to it (see [Stay in control](/docs/mcp-api/control)). Reading works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Is there a skill for noon? [#is-there-a-skill-for-noon] Yes — `noon-report-data` for the synced noon tables and `fbn-inbound` for FBN shipments. See [Install the skills](/docs/start/skills). ### Can I copy my Amazon listings to noon? [#can-i-copy-my-amazon-listings-to-noon] Yes — start from `noon_content_draft_from_amazon_asin`, review the draft, then publish it. # Track orders (https://sellersheetai.com/docs/mcp-api/workflows/orders) > Triage today's orders and answer a buyer in one ask — and leave history and totals to your synced order data, which answers instantly. Two live tools cover order tracking: search across orders, then drill into one. For history and totals, your synced order data answers at once, with no call to Amazon. ## In your daily workflow [#in-your-daily-workflow] ### Morning check [#morning-check] "Any unshipped orders?" `orders_searchOrders` filters by fulfillment status and date, so you triage pending, unshipped or cancelled orders in one ask. ### A buyer writes in [#a-buyer-writes-in] Paste the order ID. `orders_getOrder` returns that one order in full — status, items, shipping service, tracking — everything you need to answer the message. ### "How did last month do?" [#how-did-last-month-do] That is not an Orders-API question. Your orders sync into the warehouse continuously, and `query_report_data` answers revenue, units and repeat-buyer questions over any date range at once. See [Synced reports](/docs/mcp-api/workflows/reports). ### "Where is the money for this order?" [#where-is-the-money-for-this-order] `finances_listFinancialEventsByOrderId` itemizes the charges, fees and refunds behind one order. See [Financial reports](/docs/mcp-api/workflows/financials). ## Try asking [#try-asking] > "Show me unshipped orders from the last 7 days for myStore-US." > "What's the status of order 111-1234567-1234567?" ## The search, both ways [#the-search-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask for unshipped orders; your agent calls `orders_searchOrders` with a status filter and a date range, pages through the results, and can write the list to your sheet to work through. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Do orders show the buyer's name and address? [#do-orders-show-the-buyers-name-and-address] No. SellerSheet does not hold Amazon's restricted-data role, so an order shows at most the delivery city, country and postal code. See [Data we never see](/docs/start/privacy). ### Live or synced? [#live-or-synced] Live Orders tools for today's operational questions; synced data for anything historical or aggregated — it is faster and does not use Amazon's rate limits. For totals by period, also see [Sales analytics](/docs/mcp-api/workflows/sales). # Competitive pricing (https://sellersheetai.com/docs/mcp-api/workflows/pricing) > Buy Box, lowest offers and the price that wins the Featured Offer — for your SKUs or any ASIN, one at a time or in batches. Ask where your price stands and your agent reads Amazon's pricing data: your own offer, the competitive and lowest prices, and the expected price to win the Featured Offer. ## In your daily workflow [#in-your-daily-workflow] ### Where do I stand? [#where-do-i-stand] `productPricing_getCompetitiveSummary` returns the featured buying options, reference prices and lowest offers for up to 20 ASINs in one call. `productPricing_getPricing` and `productPricing_getCompetitivePricing` give your own and the competitive prices. ### Who is undercutting me? [#who-is-undercutting-me] `productPricing_getItemOffers` lists the lowest-priced offers on an ASIN; `productPricing_getListingOffers` does the same for one of your SKUs. Their batch versions take many at once. ### What price wins the Featured Offer? [#what-price-wins-the-featured-offer] `productPricing_getFeaturedOfferExpectedPriceBatch` returns the price Amazon expects to win the Featured Offer for your SKUs. ## Try asking [#try-asking] > "Check competitive pricing for ASIN B0EXAMPLE1." > "What are the Buy Box and lowest prices for my top 10 products right now?" > "Roughly what price would win the Featured Offer?" ## The summary, both ways [#the-summary-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you list the ASINs; your agent calls `productPricing_getCompetitiveSummary` and lays out where each one stands. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. Every pricing tool only reads; changing a price goes through your listings (see [Attributes & Publish Queue](/docs/mcp-api/workflows/listings-attributes)). ## FAQ [#faq] ### What would my margin be at that price? [#what-would-my-margin-be-at-that-price] Ask for the fees at that price — see the [Fee estimator](/docs/mcp-api/workflows/fees). ### Can I track prices over time? [#can-i-track-prices-over-time] Ask your agent to write each check to a sheet tab with the date; for synced history, see [Synced reports](/docs/mcp-api/workflows/reports). # Replenishment (Subscribe & Save) (https://sellersheetai.com/docs/mcp-api/workflows/replenishment) > Subscribe & Save performance — your program metrics, per-offer metrics and which offers are eligible — by conversation or by code. Three read-only tools answer how your Subscribe & Save program is doing: overall, offer by offer, and which offers can join. ## In your daily workflow [#in-your-daily-workflow] * **The program as a whole** — `replenishment_getSellingPartnerMetrics` returns your aggregated Subscribe & Save performance for a period, looking back or forecast ahead. * **Offer by offer** — `replenishment_listOfferMetrics` returns the same metrics per ASIN or SKU. * **Who can join** — `replenishment_listOffers` lists your offers with their eligibility and customer preferences. ## Try asking [#try-asking] > "Show my Subscribe & Save partner metrics for last month." > "List my replenishment offers and their eligibility." ## Program metrics, both ways [#program-metrics-both-ways] **MCP** — you ask: "How did Subscribe & Save do in September?" Your agent calls `replenishment_getSellingPartnerMetrics`. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Does this change any offer? [#does-this-change-any-offer] No — every tool here reads. ### Where are sales overall? [#where-are-sales-overall] See [Sales analytics](/docs/mcp-api/workflows/sales). # On-demand reports (https://sellersheetai.com/docs/mcp-api/workflows/reports-ondemand) > Request a report straight from Amazon when the synced copy is not enough — create, wait, download — and set up recurring report schedules. For any report type Amazon offers, your agent asks Amazon to build it, polls until it is done and reads the document. Use it for reports that are not synced, or when you need the very latest data. ## Create, wait, download [#create-wait-download] ### Ask for the report [#ask-for-the-report] `reports_createReport` submits the request with the report type and date range. Your agent picks the report type from what you describe — "the All Listings report", "Brand Analytics search query performance". ### Wait for Amazon [#wait-for-amazon] Amazon builds reports in the background, from seconds to many minutes. `reports_getReport` checks the status and, once it is done, downloads the document. ### Reuse what exists [#reuse-what-exists] `reports_getReports` lists reports Amazon already built for the store; `reports_cancelReport` stops one still in the queue. ## Recurring reports [#recurring-reports] `reports_createReportSchedule` asks Amazon to build a report on a fixed cadence; `reports_getReportSchedules`, `reports_getReportSchedule` and `reports_cancelReportSchedule` list, read and stop schedules. ## Try asking [#try-asking] > "Request a fresh inventory report from Amazon." > "Pull the Brand Analytics search query performance report — what's my click share on these terms?" > "Download my latest settlement report." ## A request, both ways [#a-request-both-ways] **MCP** — you ask: "Get me a fresh All Listings report." Your agent calls `reports_createReport`, then `reports_getReport` until it is done. Creating or cancelling a recurring schedule changes your seller account's settings, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). One-off report requests and downloads are reads. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### Synced or on demand? [#synced-or-on-demand] Synced first — it is instant. See [Synced reports](/docs/mcp-api/workflows/reports). ### How does my agent know a report's fields? [#how-does-my-agent-know-a-reports-fields] The `amazon-report` skill carries the report types, options and field names of the common reports. See [Install the skills](/docs/start/skills). ### Is there a GraphQL option? [#is-there-a-graphql-option] Yes — [Data Kiosk](/docs/mcp-api/workflows/datakiosk). # Synced reports (https://sellersheetai.com/docs/mcp-api/workflows/reports) > Your Amazon and noon reports, synced on a schedule into your own tables — your agent queries them in seconds, months back, without waiting on Amazon. SellerSheet syncs report tables for every connected store — inventory, listings, orders, returns, settlements, Data Kiosk sales and traffic, every Sponsored Products, Brands and Display report, and noon. `query_report_data` filters, joins and totals them instantly. ## How it works [#how-it-works] ### Reports sync on their own [#reports-sync-on-their-own] Each table has its own schedule, set when the store connects. Nothing to request, nothing to wait for. `list_report_syncs` shows what syncs for a store and when it last ran. ### Your agent reads the schema first [#your-agent-reads-the-schema-first] `get_table_schema` returns the columns, types and unique key of one table, so the query uses real column names. Every table also has its own page on the [Data](/docs/data) tab. ### One query, any date range [#one-query-any-date-range] `query_report_data` takes the tables, columns, filters, grouping and sort — results come back in seconds and do not use Amazon's rate limits. Your agent writes them to your sheet when you work there. ## Try asking [#try-asking] > "What were my top 10 products by revenue last month?" > "From the synced inventory reports, find stock that hasn't sold in over 90 days." > "Total sales and sessions by week for the last 3 months, as a trend table." ## A query, both ways [#a-query-both-ways] **MCP** — you ask: "How many orders did I get yesterday?" Your agent calls `query_report_data` on the orders table. ## Tools on this page [#tools-on-this-page] ## FAQ [#faq] ### I need data fresher than the last sync. [#i-need-data-fresher-than-the-last-sync] Request a report from Amazon directly — see [On-demand reports](/docs/mcp-api/workflows/reports-ondemand) — or call the live tool for that area, such as [Orders](/docs/mcp-api/workflows/orders) or [FBA inventory](/docs/mcp-api/workflows/fba-inventory). ### Where is the list of tables? [#where-is-the-list-of-tables] On the [Data](/docs/data) tab — each table with its report type, cadence and columns. ### Is there a skill for this? [#is-there-a-skill-for-this] Yes — the `report-data` skill teaches your agent the tables and the query patterns. See [Install the skills](/docs/start/skills). # Review insights (https://sellersheetai.com/docs/mcp-api/workflows/reviews) > Learn what buyers praise and complain about — for your ASIN and for your whole category — and ask delivered orders for a review. Your agent reads Amazon's review topics and trends for an ASIN or a category, return reasons for the category, and can write a buyer-insights report. It can also send Amazon's review request to delivered orders. ## In your daily workflow [#in-your-daily-workflow] ### What buyers say about your product [#what-buyers-say-about-your-product] `customerFeedback_getItemReviewTopics` returns the top positive and negative topics for your ASIN; `customerFeedback_getItemReviewTrends` shows how they move month to month. ### What buyers say about the category [#what-buyers-say-about-the-category] `customerFeedback_getItemBrowseNode` finds the ASIN's category; `customerFeedback_getBrowseNodeReviewTopics`, `customerFeedback_getBrowseNodeReturnTopics` and their trend twins show what the whole category is praised for and returned for. ### A report to work from [#a-report-to-work-from] `customerFeedback_insights_report` writes a buyer-insights report to guide your copy and images; `customerFeedback_insights_report_status` tells you when it is ready. The report is paid from [Credits](/help/app/settings/billing) — priced before it runs, refunded if it fails. ### Ask for reviews [#ask-for-reviews] `solicitations_getSolicitationActionsForOrder` checks whether an order can be asked; `solicitations_createProductReviewAndSellerFeedbackSolicitation` sends Amazon's own review request. ## Try asking [#try-asking] > "What are the 10 things buyers praise and complain about most on this ASIN?" > "How have return reasons in this category trended over 6 months?" > "Send a review request to these delivered orders." ## Step 1, both ways [#step-1-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "What are the top review complaints for B0EXAMPLE1?" Your agent calls `customerFeedback_getItemReviewTopics` and summarises them. Sending review requests acts on your seller account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Reading topics and trends works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Can I turn the insights into new copy and images? [#can-i-turn-the-insights-into-new-copy-and-images] Yes — hand them to [A+ Content](/docs/mcp-api/workflows/aplus) or [AI images](/docs/mcp-api/workflows/images). ### Is there a skill for the report? [#is-there-a-skill-for-the-report] Yes — see [Install the skills](/docs/start/skills). # Sales analytics (https://sellersheetai.com/docs/mcp-api/workflows/sales) > Units, orders and revenue over any period — bucketed by hour, day, week or month — straight from Amazon or from your synced sales data. "How much did I sell?" has two answers: Amazon's order metrics for a quick series over a period, and your synced sales data for breakdowns by ASIN, SKU or anything you can join. ## In your daily workflow [#in-your-daily-workflow] ### A quick number or trend [#a-quick-number-or-trend] `sales_getOrderMetrics` returns units, order count and revenue for an interval, bucketed by hour, day, week, month or year — or one total. Filter it to one ASIN or SKU. ### A breakdown [#a-breakdown] "Units sold by ASIN for March" or "sales and sessions by week" is an analysis over your synced sales and traffic tables through `query_report_data`. See [Synced reports](/docs/mcp-api/workflows/reports). ## Try asking [#try-asking] > "What were my total sales last month?" > "Show me units sold by ASIN for March 2026." > "Total sales and sessions by week for the last 3 months, as a trend table." ## The metrics call, both ways [#the-metrics-call-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask for last month's total; your agent calls `sales_getOrderMetrics` with the month as the interval and Total as the bucket. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Which should my agent use? [#which-should-my-agent-use] A period total or a simple series: `sales_getOrderMetrics`. Anything per ASIN, per SKU or joined with stock, ads or fees: the synced data. ### Where are fees and payouts? [#where-are-fees-and-payouts] In [Financial reports](/docs/mcp-api/workflows/financials). # Google Sheets (https://sellersheetai.com/docs/mcp-api/workflows/sheets) > Your agent's tools for the sheet — read, write, format, filter, chart and protect — so results land where your team reviews them. The Amazon and noon tools never write to a sheet themselves. When you work in a Google Sheet, your agent records results there with these tools: headers, formats, filters and dropdowns included. You review and edit in the sheet, then say "submit the rows I changed". ## How your agent uses the sheet [#how-your-agent-uses-the-sheet] ### Read what is there [#read-what-is-there] `list_sheet_tabs` and `get_sheet_metadata` show the workbook; `read_sheet` reads a range, `get_sheet_cell` one cell with its dropdown and note, `get_sheet_notes` the notes on a tab. ### Write results [#write-results] `write_sheet` writes a block of values, `append_sheet_rows` adds rows at the end, `write_sheet_formula` writes formulas, `import_sheet_tsv` drops in a whole report. `setup_sheet` and `add_sheet_tab` build a new tab. ### Make it readable [#make-it-readable] `format_sheet_range`, `set_sheet_number_format`, `freeze_sheet_panes`, `autofit_sheet_columns` and `apply_sheet_table_style` format it; `add_sheet_conditional_format`, `add_sheet_chart` and `insert_sheet_sparkline` add the visuals. ### Make it a working surface [#make-it-a-working-surface] `add_sheet_dropdown` puts Amazon's own values in a column, `create_sheet_filter` and `sort_sheet_range` order the rows, `protect_sheet_range` locks what nobody should edit. `sheet_batch_update` is the escape hatch for anything else. ## Try asking [#try-asking] > "Read the data from my Sales spreadsheet." > "Format the header row of my listings sheet, freeze it, and add a filter." ## Reading a range, both ways [#reading-a-range-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "What's in A1:F20 of my Sales tab?" Your agent calls `read_sheet`. The write and format tools change the workbook you name — never your Amazon account. A sheet must be one your Google account can open. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Is there a skill for building good sheets? [#is-there-a-skill-for-building-good-sheets] Yes — `sellersheet-sheets` (sheet building, formats, live data) and `sellersheet-dashboard` (multi-tab dashboards). See [Install the skills](/docs/start/skills). ### What about the Google Sheets add-on? [#what-about-the-google-sheets-add-on] The add-on's buttons run their own workflows inside the sheet — see the [add-on buttons](/help/sheets/buttons). Docs and Drive have their own pages: [Google Docs](/docs/mcp-api/workflows/docs), [Google Drive](/docs/mcp-api/workflows/drive). # Vendor Central (https://sellersheetai.com/docs/mcp-api/workflows/vendor) > Purchase orders, acknowledgements, shipments, labels and invoices for 1P vendors — read, decide, submit. Connect a Vendor Central store and your agent lists and reads your purchase orders, accepts or rejects them, submits shipments and confirmations, downloads labels, submits invoices and checks each submission's status. ## In your daily workflow [#in-your-daily-workflow] ### See what Amazon ordered [#see-what-amazon-ordered] `vendorOrders_getPurchaseOrders` lists your purchase orders — a window of up to 7 days per call, so your agent pages through longer ranges. `vendorOrders_getPurchaseOrder` returns one PO in full; `vendorOrders_getPurchaseOrdersStatus` gives the status list. ### Accept or reject [#accept-or-reject] `vendorOrders_submitAcknowledgement` accepts or rejects one or more POs, item by item. ### Ship and confirm [#ship-and-confirm] `vendorShipments_SubmitShipments` submits shipment requests and waits for Amazon's answer; `vendorShipments_SubmitShipmentConfirmations` confirms shipments in a batch. `vendorShipments_GetShipmentDetails` and `vendorShipments_GetShipmentLabels` read shipment details and download small-parcel labels. ### Invoice and check [#invoice-and-check] `vendorInvoices_submitInvoices` submits invoices for payment. Submissions are asynchronous; `vendorTransactionStatus_getTransaction` tells you whether Amazon accepted them. ## Try asking [#try-asking] > "Show me my pending purchase orders." > "Accept every line of PO 1ABCD234 we can fill, reject the rest, and submit the invoice once it ships." ## Step 1, both ways [#step-1-both-ways] The same tool and the same arguments — through your AI client, or from your own code. **MCP** — you ask: "Show me this week's new purchase orders." Your agent calls `vendorOrders_getPurchaseOrders` and lays them out for you. Acknowledgements, shipments, confirmations and invoices change your vendor account, so the store needs write access (see [Stay in control](/docs/mcp-api/control)). Reading orders, shipments and transaction status works with read access. ## Tools on this page [#tools-on-this-page] Pulled from the catalog at build time, each with its own access label. ## FAQ [#faq] ### Which account types work? [#which-account-types-work] A Vendor Central store connected in the app, one marketplace at a time. See [Connect your store](/docs/start/connect). ### Can I get vendor reports too? [#can-i-get-vendor-reports-too] Yes — through [On-demand reports](/docs/mcp-api/workflows/reports-ondemand) and [Data Kiosk](/docs/mcp-api/workflows/datakiosk). # Skills (https://sellersheetai.com/docs/skills) > Released skills that teach your AI the best practice for each job. The public skills, read from their released SKILL.md files. A skill is a short, versioned instruction file your agent loads when a job matches it: the steps, the checks and the tool calls that make that job go right — building a sheet, running an FBA shipment, querying synced reports, managing Ads. The MCP server gives your agent the tools; skills give it the best practice. They install as one bundle — on Claude Code, Codex and CodeBuddy the SellerSheet plugin adds them and the server in one step. See [Install the skills](/docs/start/skills). ## What do you want done? [#what-do-you-want-done] Pick the job. Each card shows what the skill can change — worked out from the tools it calls, not written by hand — how many tools it calls, and where the same job works: with your AI, in the Google Sheets sidebar or in the web app. # ChatGPT (https://sellersheetai.com/docs/start/clients/chatgpt) > Connect SellerSheet to ChatGPT as a custom connector in developer mode, signed in with OAuth. ChatGPT connects to remote MCP servers as a custom connector in developer mode. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * A paid ChatGPT plan — developer mode is available on paid plans. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in ChatGPT [#step-2-add-sellersheet-in-chatgpt] 1. In ChatGPT, open **Settings → Apps & Connectors → Advanced settings** and turn on **Developer mode**. 2. Back in **Apps & Connectors**, choose **Create**, name it `SellerSheet`, and paste `https://sellersheetai.com/mcp` as the MCP server URL with OAuth authentication. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Sign in to SellerSheet when the browser asks, then enable the connector in a chat. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Claude Code (https://sellersheetai.com/docs/start/clients/claude-code) > Add the SellerSheet MCP server to Claude Code with one command and sign in with /mcp — or reference an API key from .mcp.json. Add SellerSheet to Claude Code from the terminal, then sign in from inside a session. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * Claude Code installed. The SellerSheet plugin adds the skills **and** the MCP server in one step — see [Install the skills](/docs/start/skills). The steps below set up the server by hand. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Claude Code [#step-2-add-sellersheet-in-claude-code] Add the server: ```bash claude mcp add --transport http sellersheet https://sellersheetai.com/mcp ``` **No browser on this machine?** Use an [API key](/docs/mcp-api/keys): keep it in an environment variable and reference it from `.mcp.json` — never paste the key on the command line. ```json title=".mcp.json" { "mcpServers": { "sellersheet": { "type": "http", "url": "https://sellersheetai.com/mcp", "headers": { "Authorization": "Bearer ${SELLERSHEET_API_KEY}" } } } } ``` ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Start Claude Code and run `/mcp`, pick `sellersheet` and sign in in the browser. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Claude desktop & claude.ai (https://sellersheetai.com/docs/start/clients/claude) > Add SellerSheet to the Claude desktop app or claude.ai as a custom connector — browser sign-in, no key to copy. Add SellerSheet to Claude as a custom connector — the same steps work in the desktop app and on claude.ai in the browser. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * A paid Claude plan — custom connectors need one. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Claude [#step-2-add-sellersheet-in-claude] 1. Open **Settings → Connectors → Add custom connector**. 2. Name it `SellerSheet` and paste `https://sellersheetai.com/mcp` as the server URL. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Click **Connect**. Your browser opens the SellerSheet sign-in; approve, and you're back in Claude. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # CodeBuddy (https://sellersheetai.com/docs/start/clients/codebuddy) > Install the SellerSheet plugin in CodeBuddy Code — the same plugin as Claude Code — and sign in with /mcp. CodeBuddy Code reads the same plugin as Claude Code: skills and server in one step. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * CodeBuddy Code installed. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` You won't paste it here: the plugin carries the server. ## Step 2: Add SellerSheet in CodeBuddy [#step-2-add-sellersheet-in-codebuddy] Inside a CodeBuddy session: ```text /plugin marketplace add sellersheetai/sellersheet-skills /plugin install sellersheet-skills@sellersheet-marketplace ``` Then `/reload-plugins`. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Sign in to `sellersheet` with `/mcp`. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Codex (https://sellersheetai.com/docs/start/clients/codex) > Install the SellerSheet plugin in Codex, or add the MCP server by hand with codex mcp add — sign in with codex mcp login. Add SellerSheet to Codex with the plugin (skills and server together) or by hand. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * The Codex CLI installed. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Codex [#step-2-add-sellersheet-in-codex] Plugin (skills and server together): ```bash codex plugin marketplace add sellersheetai/sellersheet-skills codex plugin add sellersheet-skills@sellersheet-marketplace codex mcp login sellersheet ``` By hand: ```bash codex mcp add sellersheet --url https://sellersheetai.com/mcp codex mcp login sellersheet ``` With a key, `~/.codex/config.toml` takes `http_headers` (not `headers`): ```toml title="~/.codex/config.toml" [mcp_servers.sellersheet] url = "https://sellersheetai.com/mcp" http_headers = { "Authorization" = "Bearer " } ``` ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. `codex mcp login sellersheet` — the last command of either set above — signs you in in the browser. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Coze 扣子 (https://sellersheetai.com/docs/start/clients/coze) > Add SellerSheet to a Coze bot as an MCP tool, with an API key in the Authorization header. Coze calls MCP servers from its own cloud, so it uses an [API key](/docs/mcp-api/keys), not a browser sign-in. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * A SellerSheet API key — [API keys](/docs/mcp-api/keys). ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Coze [#step-2-add-sellersheet-in-coze] 1. In your bot, open **Skills → MCP Tool → Add**. 2. Choose **Connect via URL** and enter `https://sellersheetai.com/mcp`. 3. Add the header `Authorization: Bearer `. 4. Save and publish the bot. The same key-in-a-header pattern works for other hosted agent platforms. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. There is no browser step: the key in the header is the sign-in. 2. In the bot, ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Cursor (https://sellersheetai.com/docs/start/clients/cursor) > Add SellerSheet to Cursor as a global MCP server — in Cursor Settings or ~/.cursor/mcp.json — and sign in in the browser. Add SellerSheet to Cursor once, globally or per project; the sign-in opens on the first tool call. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * Cursor installed. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Cursor [#step-2-add-sellersheet-in-cursor] **Cursor Settings → MCP → Add new global MCP server**, or edit `~/.cursor/mcp.json` (per project: `.cursor/mcp.json`): ```json title="~/.cursor/mcp.json" { "mcpServers": { "sellersheet": { "url": "https://sellersheetai.com/mcp" } } } ``` With a key instead, add `"headers": { "Authorization": "Bearer " }` next to `url`. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. The first time a chat uses a SellerSheet tool, Cursor opens the browser sign-in. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### The browser sign-in does not open [#the-browser-sign-in-does-not-open] Click the refresh icon next to `sellersheet` in **Settings → MCP**. If it still does not open, update Cursor — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Connect an AI client (https://sellersheetai.com/docs/start/clients) > Add SellerSheet to the assistant you already use — one server URL, browser sign-in or an API key, the same tools in every client. Your AI signs in to your SellerSheet account, sees only the stores you can see, and works through the same tools as the Google Sheets sidebar. ## What you need [#what-you-need] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * An AI client that speaks MCP over Streamable HTTP — every client below does. | Setting | Value | | ---------- | -------------------------------------------------------------------------------------- | | Server URL | `https://sellersheetai.com/mcp` | | Transport | Streamable HTTP | | Sign-in | OAuth in the browser (no key to copy) — or an API key as `Authorization: Bearer ` | The SellerSheet plugin adds the skills **and** the MCP server in one step — see [Install the skills](/docs/start/skills). The pages below are for setting it up by hand, and for every other client. ## Choose your client [#choose-your-client] ## Check it works [#check-it-works] Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## How sign-in works [#how-sign-in-works] Your sign-in identifies **you** to SellerSheet with Google or an email code — never with Amazon. SellerSheet already holds the Amazon authorization you gave when you [connected your store](/docs/start/connect). Each browser sign-in creates an MCP key under **Settings → API & MCP** in the app, named after the client; delete it there and that client stops working at once. ## If something's off [#if-somethings-off] | Symptom | Fix | | ----------------------- | --------------------------------------------------------------------------------- | | "Unauthorized" (401) | Your sign-in or key expired or was deleted. Sign in again, or create a new key. | | The browser never opens | Update the client — older versions don't support MCP sign-in — or use an API key. | | "No stores" | Connect a store first: [Connect your store](/docs/start/connect). | | Tools time out | Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. | More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [call the same tools from code](/docs/mcp-api/code). # Any MCP client (https://sellersheetai.com/docs/start/clients/other) > Any client that speaks MCP over Streamable HTTP works — the URL, the transport, and the two ways to sign in. Any client that speaks MCP over Streamable HTTP works. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * A client that speaks MCP over Streamable HTTP. * For a headless client, an [API key](/docs/mcp-api/keys). ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in your client [#step-2-add-sellersheet-in-your-client] * **URL** `https://sellersheetai.com/mcp`, transport Streamable HTTP (`"type": "http"` or `"streamableHttp"` in most configs). * **Interactive clients** sign in with OAuth 2.0 + PKCE: the server answers the first request with 401 and points the client at `/.well-known/oauth-authorization-server`; the client opens the browser. * **Headless clients** send `Authorization: Bearer `. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Sign in in the browser when your client opens it — or, headless, send the key. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. Test a key from a terminal: ```bash curl -sS https://sellersheetai.com/mcp \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Windsurf (https://sellersheetai.com/docs/start/clients/windsurf) > Add SellerSheet to Windsurf in mcp_config.json — serverUrl, not url — and sign in on the first tool call. Add SellerSheet to Windsurf's MCP config; the sign-in opens on the first tool call. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * Windsurf installed. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` ## Step 2: Add SellerSheet in Windsurf [#step-2-add-sellersheet-in-windsurf] Edit `~/.codeium/windsurf/mcp_config.json` (or **Windsurf Settings → MCP Servers → Add Server**). Windsurf uses `serverUrl`, not `url`: ```json title="mcp_config.json" { "mcpServers": { "sellersheet": { "serverUrl": "https://sellersheetai.com/mcp" } } } ``` ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Restart Windsurf; the browser sign-in opens on the first SellerSheet tool call. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### The browser never opens [#the-browser-never-opens] Update the client — older versions don't support MCP sign-in — or use an [API key](/docs/mcp-api/keys). ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # WorkBuddy (https://sellersheetai.com/docs/start/clients/workbuddy) > Connect SellerSheet from WorkBuddy's connector marketplace — nothing to download, no command; the skills load with it. WorkBuddy installs SellerSheet from its **connector marketplace** — nothing to download, no command. ## Prerequisites [#prerequisites] * A SellerSheet account with a connected store — [Connect your store](/docs/start/connect). * WorkBuddy 4.24 or newer. ## Step 1: Copy the SellerSheet MCP URL [#step-1-copy-the-sellersheet-mcp-url] ```text https://sellersheetai.com/mcp ``` You won't paste it here: the SellerSheet connector in WorkBuddy's marketplace already points at it. ## Step 2: Add SellerSheet in WorkBuddy [#step-2-add-sellersheet-in-workbuddy] 1. Open **专家·技能·连接器 → 连接器**. 2. Find **SellerSheet** and click **连接**. ## Step 3: Sign in and test [#step-3-sign-in-and-test] 1. Sign in on sellersheetai.com in the browser and click **Authorize**. The connector shows 已连接, and the SellerSheet skills load with it. 2. Ask: "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as , with your plan and each store's status. Every session should start there. ## Troubleshooting [#troubleshooting] ### "Unauthorized" (401) [#unauthorized-401] Your sign-in or key expired or was deleted. Sign in again, or create a new key. ### "No stores" [#no-stores] Connect a store first: [Connect your store](/docs/start/connect). ### Tools time out [#tools-time-out] Some Amazon reports take a minute or two. Raise your client's MCP tool timeout. More in [Troubleshooting](/help/troubleshooting/ai). Next: [Install the skills](/docs/start/skills), or [try the prompt library](/docs/start/prompts). # Connect your store (https://sellersheetai.com/docs/start/connect) > Authorize your Amazon store once, choose which marketplaces sync, add Ads and noon — then every AI client you connect works on it. You connect a store once, in the SellerSheet app. Every AI client, script and sheet you connect afterwards uses that connection — no Amazon sign-in inside your AI. Amazon's own consent flow does the connecting. SellerSheet never sees your Seller Central password — only the API authorization for the permissions you approve, which you can revoke at any time in Seller Central → Manage Your Apps. ### Add the store [#add-the-store] **Settings → Stores & Marketplaces → Add store.** Pick the region, the store type (Seller Central or Vendor Central) and the marketplaces, and give the store a name — 1–10 letters, digits or `_`. The name starts every store ref, so a store called `myStore` selling in the US becomes . Click **Authorize with Amazon**, sign in with the account that owns the store, and approve. You come back to the app with the store listed. ### Choose which marketplaces sync [#choose-which-marketplaces-sync] Marketplaces are what your plan counts: it includes a number of active marketplaces, shared by your Amazon stores and noon accounts. Change them per store with **Edit markets** on the store's row. Only active marketplaces sync reports and answer your agent; a store with no active marketplace is **paused** — see [Store refs](/docs/mcp-api/store-refs#paused-stores). ### Authorize Ads (if you advertise) [#authorize-ads-if-you-advertise] Amazon Advertising is a separate consent: use **Ads** on the store's row. Without it, the advertising tools and ad report syncs have nothing to work with — campaign questions come back empty, not broken. ### Add noon (optional) [#add-noon-optional] **Add a noon account** connects a noon Partners project, with noon's own sign-in or the project's API key. noon refs follow the same shape, such as `myNoon-AE`, and noon marketplaces use the same plan quota. ### Let your agent write into Google Sheets [#let-your-agent-write-into-google-sheets] Open any Google Sheet → **Extensions → SellerSheet → Open Sidebar** once. This sets up the Drive folders your agent reads and writes, and lets it write reports and dashboards into your sheets. ### Check from your AI [#check-from-your-ai] Ask your agent "Which stores can you see?" It calls `get_user_context` and lists each store with its `store_refs`, its sync status and your plan. The first reports start syncing right after you connect; most tables have data within hours. ## What each account type gives your agent [#what-each-account-type-gives-your-agent] | Account | APIs | What your agent can do | | ----------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------- | | Seller Central | SP-API + Ads API | The whole tool catalog (more than tools) | | Vendor Central | SP-API vendor surface | The common tools plus purchase orders, shipments and invoices — see [Vendor Central](/docs/mcp-api/workflows/vendor) | | noon Partners | noon APIs | The noon tools plus synced noon reports — see [noon](/docs/mcp-api/workflows/noon) | | A store shared with you | The owner's connection | What the owner granted you, per store | ## Common connection problems [#common-connection-problems] | Symptom | Fix | | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Authorization worked but the wrong store appears | You were signed into another Seller Central account in the browser. Remove the store, sign out of Amazon, add it again. | | The store shows an authorization error later | The authorization was revoked or expired. Use **Reauthorize** on the store's row ([how](/help/app/settings/stores#reauthorize)); syncing resumes on its own. | | Ad tools come back empty | Ads was never authorized for that store — **Ads** on the store's row. | | Your agent can't write to your sheet | The workspace was never set up — open the sidebar once (step 5). | | You can't add another store or marketplace | Your plan's marketplaces are all in use. Upgrade, or turn one off with **Edit markets**. | # Get started (https://sellersheetai.com/docs/start) > Connect your store, connect the AI you already use, and give it its first job. SellerSheet gives your own AI — Claude, ChatGPT, Cursor, Coze or any MCP client — the tools to run your Amazon and noon stores through Amazon's official SP-API and Ads API. You bring the AI; SellerSheet provides the MCP server, the skills and the data: tools, skills, synced report tables and Google Sheets sidebar buttons. ## Your first hour [#your-first-hour] Five things to have done by the end of it, each with where it happens. 1. **[Connect your store](/docs/start/connect)** · *Web app* — authorize Amazon (and Ads, and noon) once, then choose the marketplaces that sync. 2. **[Connect your AI](/docs/start/clients)** · *Your AI* — add SellerSheet to Claude, Cursor, Codex, Coze or any MCP client. On Claude Code, Codex and CodeBuddy the [plugin](/docs/start/skills) adds the skills in the same step. 3. **Ask a first question** · *Your AI → Google Sheets* — "Pull the last 7 days of orders for myStore-US into a sheet, totalled by SKU." Your AI reads, writes the sheet, and changes nothing on Amazon. 4. **Approve a first change** · *Your AI + Google Sheets* — let your AI stage a change in a sheet, check the rows, then say "submit the rows I changed". Nothing reaches Amazon before you say so, and only on a store you gave [write access](/docs/mcp-api/control). 5. **Get Amazon's changes in your team chat** · *Web app* — add a webhook in [Settings → Webhooks](/help/app/settings/webhooks): at most one card a minute in Feishu, Slack, Teams, WeCom or DingTalk, or signed JSON to your own system. ## Prompts to try [#prompts-to-try] Copy one, swap in your own store, and send it to your AI. More in the [prompt library](/docs/start/prompts). * "Pull the last 7 days of orders for myStore-US into a sheet, totalled by SKU — units and sales."
`orders_searchOrders` * "List every SKU with less than 30 days of sellable stock."
`query_report_data` * "Raise these keyword bids 10% toward the suggested bid — write them to the sheet first, I'll confirm before you submit."
`ads_query_target` · `ads_update_target_bid` * "Make a white-background main image of my product in the style of this competitor shot."
`generate_image` changes nothing on Amazon. changes your Amazon account and needs write access on that store. is paid from your Credits balance, and refunded if it fails. ## Three ways to work [#three-ways-to-work] One set of tools behind all three. Pick by the job: * **Your AI** — ask in Claude, ChatGPT, Cursor or any MCP client; it calls SellerSheet's tools and reports back. For questions, analysis and jobs of many steps. [Connect an AI client →](/docs/start/clients) * **Google Sheets sidebar** — click through a panel in your own spreadsheet: FBA shipments, ads, store reports. Your team edits rows in bulk and keeps the record. [How the sidebar works →](/help/sheets) * **Web app** — your stores, team, billing and webhooks, plus Products, Studio and the catalogs. [Tour of the app →](/help/app) ## Every step in detail [#every-step-in-detail] ## Before your agent touches anything [#before-your-agent-touches-anything] * [Store refs](/docs/mcp-api/store-refs) — how every call names a store and its marketplace. * [Stay in control](/docs/mcp-api/control) — read, write and destructive labels, and write access per store. * [Data we never see](/docs/start/privacy) — no buyer personal data, ever. * [Credits & limits](/help/app/settings/billing) — what is paid, and what happens when a limit is reached. * [Troubleshooting](/help/troubleshooting/ai) — every refusal, and its fix. # Data we never see (https://sellersheetai.com/docs/start/privacy) > SellerSheet holds no Amazon role for buyers' personal data — no names, no e-mail addresses, no street addresses, ever. Amazon keeps buyers' personal information behind a separate, restricted role. **SellerSheet does not hold that role and does not ask for it.** So no tool — over MCP, the Tool API or the sidebar — can return a buyer's name, e-mail address, phone number or street address, and none of it is stored in your synced tables. ## What an order shows [#what-an-order-shows] * Orders, items, quantities, prices, fees, taxes, promotions, fulfillment, packages and tracking — everything you need to run the order. * Where it went, **at most**: the delivery **city, country and postal code** (the `RECIPIENT` selector of `orders_getOrder` and `orders_searchOrders`). * **`BUYER` is not offered.** Amazon's selector for buyer details is left out of SellerSheet's order tools, so no agent can ask for it. ## What else SellerSheet never sees [#what-else-sellersheet-never-sees] * **Your Seller Central password.** You connect a store through Amazon's own consent page; SellerSheet receives only the API authorization for the permissions you approve, and you can revoke it in Seller Central → Manage Your Apps. * **Files outside your workspace.** Drive tools list and search only inside your SellerSheet workspace folders, and a file named by its id must be yours or shared with you. ## What your agent sees [#what-your-agent-sees] Your AI client sees whatever its tools return to it — the data above, never more. What it does with that is between you and your AI provider: SellerSheet provides the MCP server, the AI is your own. See [Stay in control](/docs/mcp-api/control). # Prompt library (https://sellersheetai.com/docs/start/prompts) > Requests to copy into your agent — each with the tools it calls and whether it changes anything. Every prompt works in English and 中文. Copy a request, swap in your own store and SKUs, and send it to your agent. Each one shows the tools it calls and its effect: * changes nothing on Amazon — reading orders, stock, reports. * changes your Amazon account — feeds, listings, shipments, ads. It needs write access on that store, or the call is refused. * is paid from your Credits balance, and refunded automatically if it fails. ## How your agent works with SellerSheet [#how-your-agent-works-with-sellersheet] * It starts with `get_user_context`, which returns your store refs (like ). Every later call names the store and its marketplace that way. * Every result carries a message your agent passes on to you, and a note when something needs you personally. * Results go into the Google Sheet you name, with headers, formats and filters. Edit it there, then say "submit the rows I changed". ## Orders & finance [#orders--finance] * "Pull the last 7 days of orders for myStore-US into a sheet, totalled by SKU — units and sales."
把 myStore-US 最近 7 天的订单拉到表格里,按 SKU 汇总销量和销售额
`orders_searchOrders` * "Which fees did Amazon take on order 112-3456789-0000000?"
订单 112-3456789-0000000 亚马逊到底扣了哪些费用?
`finances_listFinancialEventsByOrderId` * "What were revenue, refunds and FBA fees in the last settlement period?"
上一个结算周期的收入、退款、FBA 费用分别是多少?
`finances_listFinancialEventGroups` · `finances_listFinancialEventsByGroupId` * "Send a review request to these delivered orders."
给这批已送达订单发送 Request a Review
`solicitations_getSolicitationActionsForOrder` · `solicitations_createProductReviewAndSellerFeedbackSolicitation` ## Listings [#listings] * "Put the title, bullets and A+ status of these 20 ASINs side by side in a sheet."
把这 20 个 ASIN 的标题、五点、A+ 状态拉下来做一张对比表
`listings_fetch_attributes_by_asins` · `aplusContent_searchContentPublishRecords` * "Push the prices and stock for these 50 SKUs from my sheet to Amazon."
帮我把表格里这 50 个 SKU 的价格和库存批量更新到亚马逊
`listings_submit_feed` * "Can I sell this ASIN? Does it need approval?"
检查这个 ASIN 我能不能卖,需不需要审批
`listings_getListingsRestrictions` * "Make a new-product sheet from this category's template — I fill it in, you submit."
按这个类目的模板生成新品上架表,我填完你提交
`listings_prepare_publish_queue_template` · `listings_submit_feed` * "This listing fails with error 8541 — which attribute is wrong?"
这条 Listing 报错 8541,告诉我哪个属性不合规
`listings_getListingsItem` ## FBA & inventory [#fba--inventory] * "List every SKU with less than 30 days of sellable stock."
列出所有可售库存低于 30 天的 SKU
`query_report_data` * "Build an FBA shipment from the box sizes in my sheet: packing, placement, confirm, then download the box labels."
用表格里的箱规建一个 FBA 货件:生成装箱方案、选仓、确认、下载箱标
`fbaInbound_orchestrate_packing` · `fbaInbound_listPlacementOptions` · `fbaInbound_confirm_plan_options` · `fbaInbound_get_labels` * "Where is shipment FBA15XXXXXXX — received and shelved yet?"
查一下货件 FBA15XXXXXXX 的签收和上架进度
`fbaInbound_sync_shipment_status` * "Ship one order to a non-Amazon customer from my FBA stock — estimate the cost first."
用 FBA 库存给非亚马逊客户发一单多渠道配送,先预估运费
`fbaOutbound_getFulfillmentPreview` · `fbaOutbound_createFulfillmentOrder` ## Ads · SP / SB / SD [#ads--sp--sb--sd] * "List SP campaigns with ACoS above 40%, with their keywords and bids."
列出 ACoS 高于 40% 的 SP 广告活动,把关键词和竞价拉出来
`query_report_data` * "Raise these keyword bids 10% toward the suggested bid — write them to the sheet first, I'll confirm before you submit."
把表格里这批关键词竞价按建议价上调 10%,先写到表格我确认再提交
`ads_query_target` · `ads_update_target_bid` * "From the last 30 days of search terms, find the converting ones I'm not targeting yet."
拉最近 30 天的搜索词报告,找出转化好但还没投的词
`query_report_data` * "Add a batch of negative keywords to this ad group."
给这个广告组补一批否定关键词
`ads_create_target` * "Which campaigns ran out of budget this week?"
这周广告预算用完的活动有哪些?
`ads_campaigns_budget_usage` ## Pricing & fees [#pricing--fees] * "What are the Buy Box and lowest prices for these 20 ASINs right now?"
这 20 个 ASIN 现在的 Buy Box 价格和最低价是多少?
`productPricing_getCompetitiveSummary` * "If I price this SKU at 29.99, what are the referral and FBA fees, and my net margin?"
如果把这个 SKU 定价 29.99,亚马逊佣金和 FBA 费各多少,净利率多少?
`productFees_getMyFeesEstimateForSKU` * "Roughly what price would win the Featured Offer?"
拿到 Featured Offer 大概要定到什么价?
`productPricing_getFeaturedOfferExpectedPriceBatch` ## Reports & synced data [#reports--synced-data] * "From the synced inventory reports, find stock that hasn't sold in over 90 days."
查已同步的库存健康报表,找出滞销超过 90 天的库存
`query_report_data` * "Pull the Brand Analytics search query performance report — what's my click share on these terms?"
拉品牌分析的搜索查询表现报告,看我的 ASIN 在这些词上的点击份额
`reports_createReport` · `reports_getReport` * "Request a Sales & Traffic report, wait until it's ready, then write it into my sheet."
帮我申请一份 Sales & Traffic 报告并等它生成后写入表格
`reports_createReport` · `reports_getReport` * "Total sales and sessions by week for the last 3 months, as a trend table."
按周汇总最近 3 个月的销量和会话数,做一张趋势表
`query_report_data` ## Reviews & buyers [#reviews--buyers] * "What are the 10 things buyers praise and complain about most on this ASIN?"
这个 ASIN 买家最常夸的和最常抱怨的 10 个点是什么?
`customerFeedback_getItemReviewTopics` * "How have return reasons in this category trended over 6 months?"
这个类目最近 6 个月的退货原因趋势
`customerFeedback_getBrowseNodeReturnTrends` * "Write a buyer-insights report for B0XXXXXXXX to guide my copy and images."
给 B0XXXXXXXX 生成一份买家洞察报告,指导我改文案和图片
`customerFeedback_insights_report` ## Images & A+ [#images--a] * "Make a white-background main image of my product in the style of this competitor shot."
参考这张竞品图的风格,给我的产品生成一张白底主图
`generate_image` * "Swap my product into this picture and keep the scene."
把这张图里的产品换成我的,场景保留
`edit_image` * "Recolor this variation family into 5 secondary images."
给这个变体系列改色出 5 张副图
`edit_image` * "Create the A+ page from the content in my sheet and submit it."
按表格里的内容创建 A+ 页面并提交发布
`aplusContent_create_and_publish` ## Working in Google Sheets [#working-in-google-sheets] * "Write the results into my sheet, with headers, formats and a filter."
把结果写进我的表格,加上表头、格式和筛选
`write_sheet` · `format_sheet_range` · `set_sheet_basic_filter` * "Submit the rows I changed to Amazon."
把我改过的行提交到亚马逊
`read_sheet` · `listings_submit_feed` ## Want one of these inside your own tools? [#want-one-of-these-inside-your-own-tools] Ask your agent to build it on the [Tool API](/docs/mcp-api/code) — a dashboard, a listing tool, an approval page whose buttons act on Amazon. It calls the same tools with the same arguments, so it behaves exactly as it does in chat. Every job, step by step: [Workflows](/docs/mcp-api/workflows). # Quick start (https://sellersheetai.com/docs/start/quickstart) > From no account to your agent's first answer about your store — about five minutes, no code. ### Start free [#start-free] Sign in at [sellersheetai.com](https://sellersheetai.com/login) with Google (afterwards Google or an email code both work). Every new account starts on the Free plan. ### Connect your store [#connect-your-store] In the app, open **Settings → Stores & Marketplaces → Add store**, pick the region and the marketplaces, name the store and click **Authorize with Amazon**. Amazon's own consent page does the rest. Authorize Ads on the store's row too if you run ads. Details: [Connect your store](/docs/start/connect). ### Connect your AI client [#connect-your-ai-client] Add one server to the AI you already use: ```text https://sellersheetai.com/mcp ``` It speaks Streamable HTTP and signs in with OAuth — your browser opens, you approve, done. On Claude Code, Codex or CodeBuddy, install the SellerSheet plugin instead: it adds the server **and** the skills in one step. Every client: [Connect an AI client](/docs/start/clients). ### Ask [#ask] Start with "Which stores can you see?" Your agent calls `get_user_context` and lists your store refs, such as . Then give it a real job: * "Show me all my active listings in myStore-US." * "What were my total sales last month?" * "Check the Buy Box price for B0EXAMPLE1." * "Which SKUs will run out of FBA stock within 21 days?" More in the [prompt library](/docs/start/prompts). ## What happens behind the scenes [#what-happens-behind-the-scenes] * **Amazon's official APIs.** Your agent calls SellerSheet's tools; SellerSheet calls Amazon's Selling Partner API (listings, orders, FBA, catalog, pricing, finances, reports) and Ads API (Sponsored Products, Brands and Display) with the authorization you gave. You never paste an Amazon password anywhere. * **Reports are already synced.** SellerSheet keeps your Amazon reports in synced tables, so "how did last month do?" is answered in seconds. See the [Data](/docs/data) tab. * **Your sheet is the review surface.** Your agent writes results into the Google Sheet you name; you edit there and say "submit the rows I changed". * **Changes need your permission.** Reading works with read access; anything that changes Amazon needs write access on that store. See [Stay in control](/docs/mcp-api/control). ## Next [#next] * [Install the skills](/docs/start/skills) — your agent learns SellerSheet's best practice for sheets, dashboards, reports, FBA, Ads and images. * [Workflows](/docs/mcp-api/workflows) — one page per job, FBA first. # Install the skills (https://sellersheetai.com/docs/start/skills) > Skills teach your agent SellerSheet's best practice — the plugin installs them and the MCP server in one step. The MCP server gives your agent the tools. **Skills** teach it how to use them well: how to build a sheet, run an FBA shipment, query the synced reports, manage Ads, write a Data Kiosk query or make listing images. SellerSheet publishes of them, installed as one bundle — see the [skills catalog](/docs/skills). ## Claude Code — the plugin [#claude-code--the-plugin] ```text /plugin marketplace add sellersheetai/sellersheet-skills /plugin install sellersheet-skills@sellersheet-marketplace ``` This installs the whole skill bundle **and** registers the SellerSheet MCP server. Sign in once: run `/mcp`, pick `sellersheet` and approve in the browser — no API key. ## Codex — the same plugin [#codex--the-same-plugin] ```bash codex plugin marketplace add sellersheetai/sellersheet-skills codex plugin add sellersheet-skills@sellersheet-marketplace codex mcp login sellersheet ``` ## CodeBuddy — the same plugin [#codebuddy--the-same-plugin] Inside a CodeBuddy session: ```text /plugin marketplace add sellersheetai/sellersheet-skills /plugin install sellersheet-skills@sellersheet-marketplace ``` Then `/reload-plugins`, and sign in with `/mcp`. Skills appear namespaced, such as `/sellersheet-skills:report-data`. ## WorkBuddy — the connector [#workbuddy--the-connector] Connecting SellerSheet from WorkBuddy's connector marketplace loads the same skills with it — see [Connect an AI client](/docs/start/clients/workbuddy). ## Claude Desktop [#claude-desktop] Register the server under **Settings → Connectors** ([steps](/docs/start/clients/claude)), then install the skills: ```bash bash <(curl -fsSL https://raw.githubusercontent.com/sellersheetai/sellersheet-skills/main/install.sh) --target claude-desktop ``` ## Cursor, Gemini CLI and other agents [#cursor-gemini-cli-and-other-agents] The open `npx skills` installer works across most coding agents: ```bash npx skills add sellersheetai/sellersheet-skills # the whole bundle npx skills add sellersheetai/sellersheet-skills --list # preview first npx skills add sellersheetai/sellersheet-skills -a codex # one specific agent npx skills add sellersheetai/sellersheet-skills -g # user level instead of per project ``` No Node.js? Use the install script with `--target `, or clone the repository and copy its `skills/` folder into your agent's skills directory. Skills installed this way don't connect the server — add it as in [Connect an AI client](/docs/start/clients). The skills always install together: they share one small companion skill with the common rules (how to start a session, store refs, how to read a result), so a partial install is not supported. ## Keep them up to date [#keep-them-up-to-date] * **Claude Code / CodeBuddy:** run `/plugin`, open **Marketplaces**, select `sellersheet-marketplace` and choose **Enable auto-update** — third-party marketplaces don't update on their own until you do. Or update on demand: `/plugin marketplace update sellersheet-marketplace`, then `/plugin update sellersheet-skills`. * **WorkBuddy:** it tells you when a new connector version is approved; update from the connector page. * **Other agents:** re-run the installer with `--update` (or `--check` to compare). ## Check it [#check-it] Ask: "Show me my SellerSheet user context." Your agent calls `get_user_context`, which also tells it whether its skills are current. # Tool reference (https://sellersheetai.com/docs/mcp-api/tools) > More than 400 tools — the same ones over MCP and the Tool API. Generated from what production serves. ## amazon_ads - [ads_ad_export](https://sellersheetai.com/docs/mcp-api/tools/ads_ad_export) (read): Submit a bulk export of every product ad across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. - [ads_ad_group_export](https://sellersheetai.com/docs/mcp-api/tools/ads_ad_group_export) (read): Submit a bulk export of every ad group across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. - [ads_amc_turn_on](https://sellersheetai.com/docs/mcp-api/tools/ads_amc_turn_on) (write): Turn Amazon Marketing Cloud (AMC) on for this store's Ads account in one country: finds the advertiser's AMC instance — creating it the first time — and remembers it. - [ads_apply_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_apply_recommendations) (destructive): Accept Amazon-generated Sponsored Products campaign recommendations — Amazon applies the proposed change to the campaign. - [ads_associate_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_associate_accounts) (write): Link an advertising account to an Amazon Ads manager account. - [ads_associate_optimization_rules_to_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_associate_optimization_rules_to_campaign) (destructive): Attach Sponsored Products bid optimization rules to a campaign — a rule changes nothing until it is associated. - [ads_campaign_export](https://sellersheetai.com/docs/mcp-api/tools/ads_campaign_export) (read): Submit a bulk export of every campaign across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. - [ads_campaigns_budget_usage](https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) (read): Real-time budget consumption for campaigns — how much of today's budget is already spent, so you can see which campaigns are about to stop serving. - [ads_create_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad) (write): Create ads (creatives) across ALL ad products via the unified Amazon Ads API v1. - [ads_create_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_association) (write): Create ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product link in - [ads_create_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_group) (write): Create ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). - [ads_create_ads_account](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ads_account) (write): Register a new Amazon Ads account. - [ads_create_associated_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_create_associated_budget_rules_for_campaigns) (destructive): Attach budget rules to one campaign. - [ads_create_async_report](https://sellersheetai.com/docs/mcp-api/tools/ads_create_async_report) (read): Request an Amazon Advertising performance report (async — not immediately available; poll with ads_get_async_report until status=COMPLETED, then read data.report rows). - [ads_create_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_create_budget_rules_for_campaigns) (write): Create budget rules — automatic, time- or performance-based daily-budget increases. - [ads_create_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_create_campaign) (write): Create advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon DSP; t - [ads_create_lookalike_audience](https://sellersheetai.com/docs/mcp-api/tools/ads_create_lookalike_audience) (write): Create an AMC lookalike audience: Amazon models shoppers similar to a seed the AMC query selects (for example the store's ad clickers) and activates them in the store's sponsored-a - [ads_create_manager_account](https://sellersheetai.com/docs/mcp-api/tools/ads_create_manager_account) (write): Create an Amazon Ads manager account. - [ads_create_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_create_optimization_rule) (destructive): Sponsored Products rule-based bidding — hand bid control to Amazon under a ROAS guardrail you declare; Amazon raises and lowers the campaign's base bids itself to increase conversi - [ads_create_portfolio](https://sellersheetai.com/docs/mcp-api/tools/ads_create_portfolio) (write): Create portfolios (cross-product: Sponsored Products, Brands and Display). - [ads_create_query_based_audience](https://sellersheetai.com/docs/mcp-api/tools/ads_create_query_based_audience) (write): Create an AMC rule-based audience: the shoppers an AMC query selects become an audience in the store's sponsored-ads account — a Sponsored Products / Brands bid adjustment (bidAdju - [ads_create_schedule](https://sellersheetai.com/docs/mcp-api/tools/ads_create_schedule) (write): Run a saved AMC workflow on a schedule — Daily or Weekly — on the store's instance. - [ads_create_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_create_stream_subscription) (write): Create an Amazon Marketing Stream subscription: Amazon pushes one dataset (dataSetId, from Amazon's Marketing Stream data guide) to an AWS SQS queue or Firehose stream the seller o - [ads_create_target](https://sellersheetai.com/docs/mcp-api/tools/ads_create_target) (write): Create targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negative=true - [ads_create_workflow](https://sellersheetai.com/docs/mcp-api/tools/ads_create_workflow) (write): Save an AMC query on the store's instance under an id of your choosing, so a schedule (ads_create_schedule) can run it every day or week. - [ads_create_workflow_execution](https://sellersheetai.com/docs/mcp-api/tools/ads_create_workflow_execution) (read): Run an AMC SQL query over the store's AMC data (an ad-hoc execution). - [ads_delete_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad) (destructive): Delete (archive) ads (creatives) across ALL ad products via the unified Amazon Ads API v1. - [ads_delete_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_association) (destructive): Delete (archive) ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the produc - [ads_delete_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_group) (destructive): Delete (archive) ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). - [ads_delete_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign) (destructive): Delete (archive) advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Ama - [ads_delete_campaign_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign_optimization_rule) (destructive): Sponsored Products: delete a rule-based-bidding rule — unlike ads_sp_update_optimization_rules's API (which has no delete), this one really does support delete; the campaign return - [ads_delete_query_based_audience_by_audience_execution_id](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_query_based_audience_by_audience_execution_id) (destructive): Delete an AMC audience (FAILED or SUCCEEDED) and its segment in the sponsored-ads account. - [ads_delete_schedule](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_schedule) (destructive): Delete an AMC schedule from the store's instance; its workflow stays saved. - [ads_delete_target](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_target) (destructive): Delete (archive) targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (neg - [ads_delete_workflow](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_workflow) (destructive): Delete a saved AMC query from the store's instance. - [ads_disassociate_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_accounts) (destructive): Unlink an advertising account from an Amazon Ads manager account — the manager loses access to that account. - [ads_disassociate_associated_budget_rule_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_associated_budget_rule_for_campaigns) (destructive): Detach one budget rule from one campaign. - [ads_dsp_advertisers](https://sellersheetai.com/docs/mcp-api/tools/ads_dsp_advertisers) (read): List Amazon DSP advertisers accessible to this profile — the `advertiserId` a DSP report needs in its `filters` (e.g. - [ads_generate_brand_metrics_report](https://sellersheetai.com/docs/mcp-api/tools/ads_generate_brand_metrics_report) (read): Request a Brand Metrics report — your brand's shopper-funnel metrics in a category against category peers (engaged-shopper rate, customer conversion rate, new-to-brand customer rat - [ads_get_ads_account](https://sellersheetai.com/docs/mcp-api/tools/ads_get_ads_account) (read): Get one Amazon Ads account by id. - [ads_get_all_query_based_audiences_by_instance_id](https://sellersheetai.com/docs/mcp-api/tools/ads_get_all_query_based_audiences_by_instance_id) (read): List the AMC audiences of the store's instance — rule-based and lookalike, made by these tools or in the AMC console — with their status and size. - [ads_get_asin_engagement_for_store](https://sellersheetai.com/docs/mcp-api/tools/ads_get_asin_engagement_for_store) (read): Per-ASIN engagement on a brand's Store pages (renders, views, clicks, add-to-carts, orders, in-stock rate), or a store-level TOTAL_VIEWS / TOTAL_CLICKS row. - [ads_get_async_report](https://sellersheetai.com/docs/mcp-api/tools/ads_get_async_report) (read): Poll an Amazon Advertising report's status; auto-downloads and returns the rows in data.report once status=COMPLETED. - [ads_get_bids_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_bids_recommendations) (read): Sponsored Brands: suggested bids for keywords, product targets or themes. - [ads_get_brand_metrics_report](https://sellersheetai.com/docs/mcp-api/tools/ads_get_brand_metrics_report) (read): Poll a Brand Metrics report; when the server sees it finished, the same call also downloads the file, so there is no separate download step. - [ads_get_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_get_brands) (read): Sponsored Brands: list the brands registered under this advertiser profile — brandId, brandRegistryName and (sellers only) the brandEntityId the Store insights tools take (ads_get_ - [ads_get_budget_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_recommendation) (read): Sponsored Products: a daily-budget suggestion for a new campaign, before it exists. - [ads_get_budget_rule_by_rule_id_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rule_by_rule_id_for_campaigns) (read): Get one budget rule by id. - [ads_get_budget_rules_for_advertiser](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_for_advertiser) (read): Page all of the advertiser's budget rules for one ad product. - [ads_get_budget_rules_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_recommendation) (read): Special-event budget-rule recommendations for one EXISTING campaign — Amazon's list of upcoming shopping events (Prime Day etc.) with a suggested budget-increase percent for this c - [ads_get_campaign_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaign_optimization_rule) (read): Sponsored Products: get one rule-based-bidding rule by its id. - [ads_get_campaigns_associated_with_budget_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_associated_with_budget_rule) (read): List the campaigns a budget rule is attached to. - [ads_get_campaigns_validation_configs](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_validation_configs) (read): Validation rules Amazon enforces on campaign create/update — allowed values, ranges, and required fields, before building a payload. - [ads_get_category_recommendations_for_asins](https://sellersheetai.com/docs/mcp-api/tools/ads_get_category_recommendations_for_asins) (read): Sponsored Products: category targets recommended for a list of ASINs — the coarse half of SP product targeting; narrow one further with ads_get_refinements_for_category. - [ads_get_data_source](https://sellersheetai.com/docs/mcp-api/tools/ads_get_data_source) (read): One AMC table's columns, each with its type and privacy class — read it before writing SQL against a table you have not used. - [ads_get_export](https://sellersheetai.com/docs/mcp-api/tools/ads_get_export) (read): Poll a bulk export submitted with ads_campaign_export / ads_ad_group_export / ads_target_export / ads_ad_export; downloads the file once status=COMPLETED. - [ads_get_history](https://sellersheetai.com/docs/mcp-api/tools/ads_get_history) (read): Get the entity change history — an audit log of edits to campaigns, ad groups, keywords, targets and product ads. - [ads_get_insights_for_store_api](https://sellersheetai.com/docs/mcp-api/tools/ads_get_insights_for_store_api) (read): Store traffic / sales / dwell / bounce insights for a brand's Store page. - [ads_get_invoice](https://sellersheetai.com/docs/mcp-api/tools/ads_get_invoice) (read): Get one Amazon Ads invoice by id — invoice lines, payments, adjustments and tax detail. - [ads_get_keyword_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_keyword_recommendations) (read): Sponsored Brands: suggested keywords, from ASINs or a landing page URL. - [ads_get_localized_currencies](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_currencies) (read): Convert amounts to a target marketplace's local currency — use before creating campaigns in a different marketplace than the store's primary one. - [ads_get_localized_keywords](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_keywords) (read): Translate keyword targeting between marketplaces. - [ads_get_localized_products](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_products) (read): Map products (ASIN or SKU) from the source marketplace to their equivalents in up to 10 target marketplaces — Sponsored Products only. - [ads_get_localized_targeting_expression](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_targeting_expression) (read): Translate targeting expressions between marketplaces. - [ads_get_manager_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_get_manager_accounts) (read): List Amazon Ads manager accounts — an agency or brand's umbrella over several advertiser accounts. - [ads_get_negative_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_get_negative_brands) (read): Sponsored Products: brands Amazon recommends excluding from targeting (no input needed). - [ads_get_optimization_rule_eligibility](https://sellersheetai.com/docs/mcp-api/tools/ads_get_optimization_rule_eligibility) (read): Sponsored Products: check which campaigns are eligible for rule-based bidding (a ROAS guardrail Amazon manages itself) before creating a rule with ads_create_optimization_rule — Am - [ads_get_query_based_audience_by_audience_execution_id](https://sellersheetai.com/docs/mcp-api/tools/ads_get_query_based_audience_by_audience_execution_id) (read): One AMC audience's status — poll it after creating one. - [ads_get_ranked_keyword_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_ranked_keyword_recommendation) (read): Sponsored Products: ranked keyword recommendations with per-match-type suggested bids, from either an ad group or a list of ASINs. - [ads_get_refinements_for_category](https://sellersheetai.com/docs/mcp-api/tools/ads_get_refinements_for_category) (read): Sponsored Products: the refinements (brand / age-range / genre facets) targetable WITHIN a category — e.g. - [ads_get_rule_notification](https://sellersheetai.com/docs/mcp-api/tools/ads_get_rule_notification) (read): Sponsored Products: the daily health-check for a rule-based-bidding rule — whether Amazon has silently disabled it. - [ads_get_schedule](https://sellersheetai.com/docs/mcp-api/tools/ads_get_schedule) (read): Read one AMC schedule on the store's instance: the workflow it runs, its period and whether it is enabled. - [ads_get_sd_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_sd_budget_recommendations) (read): Budget recommendations and missed-opportunity metrics for up to 100 Sponsored Display campaigns — suggestedBudget, and under sevenDaysMissedOpportunities the percentTimeInBudget (s - [ads_get_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_get_stream_subscription) (read): Get one Amazon Ads event stream subscription by id. - [ads_get_target_bid_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_bid_recommendations) (read): Sponsored Display: bid recommendations for up to 100 targeting clauses, derived from the last 7 days of winning auction bids for each one. - [ads_get_target_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_recommendations) (read): Sponsored Display: up to 100 recommended product, category, audience or content-category targets (whichever typeFilter asks for), based on the ASINs/SKUs you advertise. - [ads_get_targeting_clauses_validation_configs](https://sellersheetai.com/docs/mcp-api/tools/ads_get_targeting_clauses_validation_configs) (read): Validation rules Amazon enforces on targeting-clause create — allowed expression types, ASIN/category id formats, bid constraints. - [ads_get_theme_based_bid_recommendation_for_ad_group_v1](https://sellersheetai.com/docs/mcp-api/tools/ads_get_theme_based_bid_recommendation_for_ad_group_v1) (read): Sponsored Products: suggested bid amounts for keywords or targeting expressions, for an existing ad group or a new one. - [ads_get_workflow](https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow) (read): Read one saved AMC query (workflow) on the store's instance: its SQL, parameters and output settings. - [ads_get_workflow_execution](https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow_execution) (read): The status of an AMC query from ads_create_workflow_execution. - [ads_get_workflow_execution_download_urls](https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow_execution_download_urls) (read): The finished result of an AMC query as rows: the tool downloads Amazon's result file and returns its rows (no download links). - [ads_insights_get_audiences_overlapping_audiences](https://sellersheetai.com/docs/mcp-api/tools/ads_insights_get_audiences_overlapping_audiences) (read): Get the audiences that OVERLAP one given audience segment — audience-overlap insights for a single audienceId, not a catalog of audiences. - [ads_list_ads_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_list_ads_accounts) (read): List the Amazon Ads accounts linked to this store's Ads credentials, each with its per-country profileId and entityId. - [ads_list_assets](https://sellersheetai.com/docs/mcp-api/tools/ads_list_assets) (read): Sponsored Brands: list a brand's Stores asset library — logos, images, lifestyle imagery, video — every asset tied to the supplied entity id. - [ads_list_associated_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_list_associated_budget_rules_for_campaigns) (read): List the budget rules applied to one campaign. - [ads_list_data_sources](https://sellersheetai.com/docs/mcp-api/tools/ads_list_data_sources) (read): List the AMC tables the store's instance can query — sponsored_ads_traffic, conversions, amazon_attributed_events_by_conversion_time and the rest — with their column counts. - [ads_list_invoices](https://sellersheetai.com/docs/mcp-api/tools/ads_list_invoices) (read): List Amazon Ads billing invoices — billing period (fromDate/toDate), amount due, status and the document types available in the advertising console (INVOICE, CREDIT_NOTE), per invo - [ads_list_portfolios](https://sellersheetai.com/docs/mcp-api/tools/ads_list_portfolios) (read): List portfolios (group campaigns across Sponsored Products, Brands and Display for shared budget caps and reporting). - [ads_list_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_list_recommendations) (read): List Amazon-generated recommendations for SP, SB, SD and ST campaigns (budget, bid, bidding strategy, new keywords, new campaigns, …) — filter by AD_PRODUCT. - [ads_list_schedules](https://sellersheetai.com/docs/mcp-api/tools/ads_list_schedules) (read): List the AMC schedules on the store's instance — each runs a saved workflow Daily or Weekly. - [ads_list_stream_subscriptions](https://sellersheetai.com/docs/mcp-api/tools/ads_list_stream_subscriptions) (read): List Amazon Ads event stream subscriptions — real-time notifications of campaign state changes, budget events, etc. - [ads_list_targetable_entities](https://sellersheetai.com/docs/mcp-api/tools/ads_list_targetable_entities) (read): List what a sponsored-ads campaign can target in the store's Ads account (Amazon's Discovery API). - [ads_list_targetable_entity_paths](https://sellersheetai.com/docs/mcp-api/tools/ads_list_targetable_entity_paths) (read): List the taxonomy paths under which ads_list_targetable_entities finds entities (Amazon's Discovery API): the direct sub-paths of each path in paths_filter, or the top level. - [ads_list_workflow_executions](https://sellersheetai.com/docs/mcp-api/tools/ads_list_workflow_executions) (read): List the AMC queries run on the store's instance — from these tools, the AMC console or a schedule — newest first, with their status. - [ads_list_workflows](https://sellersheetai.com/docs/mcp-api/tools/ads_list_workflows) (read): List the saved AMC queries (workflows) on the store's instance: the seller's own, and SellerSheet's synced report templates (named in data.synced_ids — read-only here; their rows a - [ads_portfolio_budget_usage](https://sellersheetai.com/docs/mcp-api/tools/ads_portfolio_budget_usage) (read): Real-time budget consumption for portfolios — how much of the portfolio's current budget cap (its date-range or monthly policy) is already spent; a portfolio with no budget cap com - [ads_product_metadata](https://sellersheetai.com/docs/mcp-api/tools/ads_product_metadata) (read): Get SP product metadata for ASINs or SKUs — title, brand, category, image and advertising eligibility, to check before creating product ads. - [ads_query_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad) (read): Query (read) ads (creatives) across ALL ad products via the unified Amazon Ads API v1. - [ads_query_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_association) (read): Query (read) ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product li - [ads_query_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_group) (read): Query (read) ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). - [ads_query_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_query_campaign) (read): Query (read) advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon - [ads_query_target](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (read): Query (read) targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negativ - [ads_sb_get_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sb_get_budget_recommendations) (read): Daily-budget recommendations and missed-opportunity estimates for EXISTING Sponsored Brands campaigns (SP: ads_sp_get_budget_recommendations; a not-yet-created SP campaign: ads_get - [ads_search_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_search_brands) (read): Sponsored Products: search for a brand by name, to exclude it from targeting (negative brand target) — use this to find a specific named competitor. - [ads_search_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_search_optimization_rules) (read): Search Sponsored Products bid optimization rules — rules that raise bids on a SCHEDULE or, with apiVersion='v2', while a PERFORMANCE condition holds (ROAS, CVR, CTR, …). - [ads_sp_bulk_create](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_bulk_create) (write): Create complete Sponsored Products campaign structures in one call (Amazon Ads API v1) — campaign → ad groups → product ads → targets, with the created ids chained server-side. - [ads_sp_create_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_create_optimization_rules) (write): Create a Sponsored Products bid optimization rule — schedule or performance bid rules that raise bids automatically. - [ads_sp_get_all_rule_events](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_all_rule_events) (read): Sponsored Products: list the special shopping events (Prime Day, Black Friday, …) with Amazon's suggested date range in this profile's marketplace. - [ads_sp_get_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_budget_recommendations) (read): Sponsored Products: the recommended daily budget and missed opportunities for existing campaigns — campaigns that are budget-capped, losing impressions/clicks/sales because they ru - [ads_sp_get_product_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_product_recommendations) (read): Sponsored Products: suggested target ASINs (product targets) for your advertised ASINs — competitor / complementary ASINs Amazon considers relevant, each with the themes that produ - [ads_sp_update_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_update_optimization_rules) (destructive): Update a Sponsored Products bid optimization rule — Amazon replaces the rule, it does not merge, so send the FULL rule object(s) including optimizationRuleId. - [ads_target_export](https://sellersheetai.com/docs/mcp-api/tools/ads_target_export) (read): Submit a bulk export of every targeting clause (keywords, product targets and all negatives) across Sponsored Products, Brands and Display — an asynchronous full snapshot in one fi - [ads_update_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad) (destructive): Update ads (creatives) across ALL ad products via the unified Amazon Ads API v1. - [ads_update_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_association) (destructive): Update ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product link in - [ads_update_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_group) (destructive): Update ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). - [ads_update_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_update_budget_rules_for_campaigns) (destructive): Update existing budget rules — rename, change the increase, threshold or duration, or set ruleState PAUSED to stop one. - [ads_update_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign) (destructive): Update advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon DSP; t - [ads_update_campaign_budget](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_budget) (destructive): Change ONE campaign's budget amount — nothing else about the campaign. - [ads_update_campaign_state](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_state) (destructive): Enable or pause ONE campaign — nothing else about it. - [ads_update_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_update_optimization_rule) (destructive): Sponsored Products: update a rule-based-bidding rule — same shape as ads_create_optimization_rule plus campaignOptimizationId. - [ads_update_portfolio](https://sellersheetai.com/docs/mcp-api/tools/ads_update_portfolio) (destructive): Update portfolios (cross-product: Sponsored Products, Brands and Display). - [ads_update_query_based_audience_by_audience_execution_id](https://sellersheetai.com/docs/mcp-api/tools/ads_update_query_based_audience_by_audience_execution_id) (destructive): Fix a FAILED AMC audience and run it again — Amazon accepts an update on a FAILED audience only; a working one cannot be changed (create a new one). - [ads_update_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_update_recommendation) (destructive): Modify one Amazon-generated Sponsored Products campaign recommendation before accepting it. - [ads_update_schedule](https://sellersheetai.com/docs/mcp-api/tools/ads_update_schedule) (destructive): Replace an AMC schedule on the store's instance — e.g. - [ads_update_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_update_stream_subscription) (destructive): Archive an Amazon Ads event stream subscription — Amazon has no enable/disable for this resource, only ARCHIVED. - [ads_update_target](https://sellersheetai.com/docs/mcp-api/tools/ads_update_target) (destructive): Update targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negative=true - [ads_update_target_bid](https://sellersheetai.com/docs/mcp-api/tools/ads_update_target_bid) (destructive): Change ONE target's (keyword, product or audience target) bid. - [ads_update_workflow](https://sellersheetai.com/docs/mcp-api/tools/ads_update_workflow) (destructive): Replace a saved AMC query on the store's instance. - [ads_update_workflow_execution](https://sellersheetai.com/docs/mcp-api/tools/ads_update_workflow_execution) (read): Cancel an AMC query that is still PENDING or RUNNING — Amazon's UpdateWorkflowExecution, whose one documented change is the status CANCELLED. ## amazon_sp - [aplusContent_create_and_publish](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_create_and_publish) (destructive): Full A+ pipeline in one call: upload the images → create the content document → link the ASINs → submit for approval. - [aplusContent_getContentDocument](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_getContentDocument) (read): Get an A+ Content document. - [aplusContent_listContentDocumentAsinRelations](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_listContentDocumentAsinRelations) (read): List the ASINs currently linked to a specific A+ Content document. - [aplusContent_list_documents_detailed](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_list_documents_detailed) (read): Up to 50 A+ Content documents per call (5 pages × 10 records), each enriched with its full contentDocument JSON and linked ASINs — sheet-ready rows for the "List A+" tab. - [aplusContent_postContentDocumentApprovalSubmission](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentApprovalSubmission) (destructive): Submit an A+ document for Amazon review and publication — after aplusContent_create_and_publish ran with submitForApproval false, or to retry its failed submit step. - [aplusContent_postContentDocumentAsinRelations](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentAsinRelations) (destructive): Replace all ASINs linked to an existing A+ content document. - [aplusContent_postContentDocumentSuspendSubmission](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentSuspendSubmission) (destructive): Suspend live (APPROVED) A+ content: it leaves every linked ASIN's detail page while the document and its ASIN links stay. - [aplusContent_searchContentDocuments](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_searchContentDocuments) (read): Fetch one metadata page of A+ Content documents — lightweight, no enrichment. - [aplusContent_searchContentPublishRecords](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_searchContentPublishRecords) (read): Check if an ASIN already has published (live) A+ Content on Amazon. - [aplusContent_updateContentDocument](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_updateContentDocument) (destructive): Replace the content of an existing A+ document, keeping its key and ASIN links — to revise copy, module order or images without creating a new document. - [aplusContent_validateContentDocumentAsinRelations](https://sellersheetai.com/docs/mcp-api/tools/aplusContent_validateContentDocumentAsinRelations) (read): Validate ASINs against an A+ content document before linking — no changes made (read-only). - [catalogItems_getCatalogItem](https://sellersheetai.com/docs/mcp-api/tools/catalogItems_getCatalogItem) (read): Get Amazon's LIVE catalog data for a single ASIN — the reconciled version that shoppers see on the detail page. - [catalogItems_searchCatalogItems](https://sellersheetai.com/docs/mcp-api/tools/catalogItems_searchCatalogItems) (read): Search Amazon's live catalog by keywords or by identifiers — what shoppers see, not one seller's submission. - [customerFeedback_getBrowseNodeReturnTopics](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReturnTopics) (read): The top 10 reasons customers give when returning products in a browse node, each with its share of the category's returns (US, UK, FR, IT, DE, ES, JP only) — use them to set accura - [customerFeedback_getBrowseNodeReturnTrends](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReturnTrends) (read): Month-by-month share of the category's returns that cite each return reason (past 6 months, newest first) for a browse node (US, UK, FR, IT, DE, ES, JP only) — whether a reason is - [customerFeedback_getBrowseNodeReviewTopics](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReviewTopics) (read): The 10 most positive and 10 most negative review topics of a whole browse node (US, UK, FR, IT, DE, ES, JP only). - [customerFeedback_getBrowseNodeReviewTrends](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReviewTrends) (read): Month-by-month occurrence trends (past 6 months, newest first) of a browse node's top review topics — the category baseline for customerFeedback_getItemReviewTrends (US, UK, FR, IT - [customerFeedback_getItemBrowseNode](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemBrowseNode) (read): Get the browse node (category) ID for a specific ASIN. - [customerFeedback_getItemReviewTopics](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemReviewTopics) (read): The 10 most positive and 10 most negative review topics of one ASIN (US, UK, FR, IT, DE, ES, JP only), each with review snippets, occurrence %, star-rating impact and the browse-no - [customerFeedback_getItemReviewTrends](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemReviewTrends) (read): Month-by-month occurrence trends (past 6 months, newest first) of one ASIN's 10 most positive and 10 most negative review topics, beside the category's — to see whether a fix impro - [customerFeedback_insights_report](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_insights_report) (write): Buyer insights report for ONE ASIN — what buyers of this CATEGORY praise, complain about and return, turned into the questions to answer before writing listing copy. - [dataKiosk_cancelQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_cancelQuery) (read): Cancel a Data Kiosk query that is IN_QUEUE or IN_PROGRESS. - [dataKiosk_createQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_createQuery) (read): Submit a Data Kiosk GraphQL query; returns queryId at once. - [dataKiosk_getDocument](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getDocument) (read): Fetch a Data Kiosk document by document ID. - [dataKiosk_getQueries](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getQueries) (read): List Data Kiosk queries for this store with optional filters. - [dataKiosk_getQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getQuery) (read): Poll Data Kiosk query status. - [fbaInboundEligibility_getItemEligibilityPreview](https://sellersheetai.com/docs/mcp-api/tools/fbaInboundEligibility_getItemEligibilityPreview) (read): Check whether an ASIN is eligible for FBA inbound (or commingling) (read). - [fbaInbound_cancelInboundPlan](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_cancelInboundPlan) (destructive): Cancel an FBA inbound plan. - [fbaInbound_cancelSelfShipAppointment](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_cancelSelfShipAppointment) (destructive): Cancel a self-ship appointment (write, async). - [fbaInbound_confirmDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmDeliveryWindowOptions) (destructive): Confirm a delivery window option for a shipment (write, async). - [fbaInbound_confirmPackingOption](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPackingOption) (destructive): Confirm a packing option (Amazon write — irreversible for this plan). - [fbaInbound_confirmPlacementOption](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPlacementOption) (destructive): Confirm one placement option of an inbound plan; the server waits until Amazon's operation finishes. - [fbaInbound_confirmShipmentContentUpdatePreview](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmShipmentContentUpdatePreview) (destructive): Confirm a content update preview, accepting the cost change (write, async). - [fbaInbound_confirmTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmTransportationOptions) (destructive): Confirm the chosen transportation option per shipment (write, async). - [fbaInbound_confirm_plan_options](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirm_plan_options) (destructive): Confirm the human's placement option and, per shipment, the transport option (+ delivery window) in one call — after the human approved them from fbaInbound_generate_shipment_optio - [fbaInbound_createInboundPlan](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_createInboundPlan) (write): Create an FBA inbound plan on Amazon (single-step). - [fbaInbound_createMarketplaceItemLabels](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_createMarketplaceItemLabels) (write): Create FNSKU item labels for a list of MSKUs (write). - [fbaInbound_create_packing_list](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_packing_list) (write): Packing list from Amazon's OWN box contents. - [fbaInbound_generateDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateDeliveryWindowOptions) (write): Start generating delivery window options for one shipment (USE_YOUR_OWN_CARRIER). - [fbaInbound_generatePackingOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePackingOptions) (write): Start generating packing options for a plan (async). - [fbaInbound_generatePlacementOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePlacementOptions) (write): Start generating placement options for a plan (async). - [fbaInbound_generateSelfShipAppointmentSlots](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateSelfShipAppointmentSlots) (write): Generate self-ship appointment slots for a shipment (write, async). - [fbaInbound_generateShipmentContentUpdatePreviews](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateShipmentContentUpdatePreviews) (write): Generate content update previews for revised box content (write, async). - [fbaInbound_generateTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateTransportationOptions) (write): Start generating transportation options for a placement option (async). - [fbaInbound_generate_shipment_options](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generate_shipment_options) (write): The transportation options + delivery windows for ONE placement option: the cheapest `limit` partnered options per shipping mode and, when named, one carrier type. - [fbaInbound_getDeliveryChallanDocument](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getDeliveryChallanDocument) (read): Fetch the delivery challan document of an India (IN) shipment that uses Amazon-partnered (PCP) transport (read). - [fbaInbound_getInboundOperationStatus](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getInboundOperationStatus) (read): Poll getInboundOperationStatus for a previously started async operation. - [fbaInbound_getInboundPlan](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getInboundPlan) (read): Fetch the raw inbound plan object from Amazon (read-only). - [fbaInbound_getSelfShipAppointmentSlots](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getSelfShipAppointmentSlots) (read): List available self-ship appointment slots (read, one page). - [fbaInbound_getShipment](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getShipment) (read): Fetch a single shipment object from Amazon (read). - [fbaInbound_getShipmentContentUpdatePreview](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getShipmentContentUpdatePreview) (read): Fetch a single content update preview (read). - [fbaInbound_get_labels](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_get_labels) (write): Download the box-label PDF of a confirmed shipment (v0 getLabels): the server fetches Amazon's downloadURL, cuts the pages to the label size and returns the PDF base64. - [fbaInbound_get_plan_status](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_get_plan_status) (read): List every placement option of an inbound plan (all pages) — a quick existence and stage probe before a phase. - [fbaInbound_listDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listDeliveryWindowOptions) (read): List delivery window options for a shipment (after generate completed). - [fbaInbound_listInboundPlanBoxes](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanBoxes) (read): List all boxes in an inbound plan (read, one page). - [fbaInbound_listInboundPlanItems](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanItems) (read): List the items (msku/fnsku/quantity/prep) in an inbound plan (read, one page). - [fbaInbound_listInboundPlanPallets](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanPallets) (read): List all pallets in an inbound plan (read, one page; LTL/FTL freight). - [fbaInbound_listInboundPlans](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlans) (read): List inbound plans for a store (one page per call). - [fbaInbound_listItemComplianceDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listItemComplianceDetails) (read): List inbound compliance (tax) details for MSKUs (read). - [fbaInbound_listPackingGroupBoxes](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingGroupBoxes) (read): List boxes in a packing group (read, one page; provided via setPackingInformation). - [fbaInbound_listPackingGroupItems](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingGroupItems) (read): List items in a packing group (read, one page; Box First). - [fbaInbound_listPackingOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingOptions) (read): List packing options after generatePackingOptions completed. - [fbaInbound_listPlacementOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPlacementOptions) (read): List placement options for a plan (read, one page). - [fbaInbound_listPrepDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPrepDetails) (read): Get preparation details + owner constraints for MSKUs (read). - [fbaInbound_listShipmentBoxes](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentBoxes) (read): List boxes in a shipment (read, one page). - [fbaInbound_listShipmentContentUpdatePreviews](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentContentUpdatePreviews) (read): List content update previews in a shipment (read, one page). - [fbaInbound_listShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentItems) (read): List item packages in a shipment (read, one page). - [fbaInbound_listShipmentPallets](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentPallets) (read): List pallets in a shipment (read, one page; LTL/FTL freight). - [fbaInbound_listTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listTransportationOptions) (read): List transportation options after generateTransportationOptions completed. - [fbaInbound_orchestrate_packing](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_orchestrate_packing) (write): Create an FBA inbound plan through to PLACEMENT OPTIONS and stop: setPrepDetails → createInboundPlan → generate and confirm the packing option → setPackingInformation → generatePla - [fbaInbound_scheduleSelfShipAppointment](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_scheduleSelfShipAppointment) (write): Book, or reschedule, a self-ship appointment on a chosen slot (write, synchronous). - [fbaInbound_setPackingInformation](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPackingInformation) (destructive): Set box packing information per shipment/group (Amazon write, async). - [fbaInbound_setPrepDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPrepDetails) (destructive): Set preparation details (category + types) for MSKUs (write, async). - [fbaInbound_sync_shipment_status](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_sync_shipment_status) (read): One shipment's current Amazon status plus a terminal flag — a cheap poll; for the full shipment object use fbaInbound_getShipment. - [fbaInbound_updateInboundPlanName](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateInboundPlanName) (write): Rename an inbound plan (write, synchronous). - [fbaInbound_updateItemComplianceDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateItemComplianceDetails) (destructive): Update India (IN) compliance tax details for MSKUs (write, async). - [fbaInbound_updateShipmentName](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentName) (write): Rename a shipment (write, synchronous). - [fbaInbound_updateShipmentSourceAddress](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentSourceAddress) (destructive): Update a shipment's source address (write, async). - [fbaInbound_updateShipmentTrackingDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentTrackingDetails) (destructive): Upload carrier tracking for one shipment to Amazon. - [fbaInventory_getInventorySummaries](https://sellersheetai.com/docs/mcp-api/tools/fbaInventory_getInventorySummaries) (read): Live FBA inventory for one or a few SKUs right now (read, one page) — e.g. - [fbaOutbound_cancelFulfillmentOrder](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_cancelFulfillmentOrder) (destructive): Cancel an MCF fulfillment order. - [fbaOutbound_createFulfillmentOrder](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_createFulfillmentOrder) (write): Create a Multi-Channel Fulfillment order — ships FBA inventory to a non-Amazon customer address. - [fbaOutbound_createFulfillmentReturn](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_createFulfillmentReturn) (write): Create a return for a fulfilled MCF order. - [fbaOutbound_deliveryOffers](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_deliveryOffers) (read): Get estimated delivery options (date + expiry) for a SKU to a destination. - [fbaOutbound_getFeatureInventory](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatureInventory) (read): List inventory SKUs eligible for a given MCF feature. - [fbaOutbound_getFeatureSKU](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatureSKU) (read): Get the count of one SKU eligible for a given MCF feature. - [fbaOutbound_getFeatures](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatures) (read): List MCF features available in the store's marketplace + seller enrollment. - [fbaOutbound_getFulfillmentOrder](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFulfillmentOrder) (read): Get one MCF fulfillment order with its items and shipments. - [fbaOutbound_getFulfillmentPreview](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFulfillmentPreview) (read): Preview an MCF order's fees and fulfillability BEFORE creating it. - [fbaOutbound_getPackageTrackingDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getPackageTrackingDetails) (read): Get delivery tracking details for one outbound MCF package. - [fbaOutbound_listAllFulfillmentOrders](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_listAllFulfillmentOrders) (read): List MCF fulfillment orders. - [fbaOutbound_listReturnReasonCodes](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_listReturnReasonCodes) (read): List valid return reason codes for a SKU (call before fbaOutbound_createFulfillmentReturn). - [fbaOutbound_updateFulfillmentOrder](https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_updateFulfillmentOrder) (destructive): Update or request shipment for an MCF order that has an order hold. - [feeds_cancelFeed](https://sellersheetai.com/docs/mcp-api/tools/feeds_cancelFeed) (destructive): Cancel a queued feed (cancelFeed). - [feeds_createFeed](https://sellersheetai.com/docs/mcp-api/tools/feeds_createFeed) (destructive): Submit a feed to Amazon (createFeedDocument upload + createFeed); returns feedId at once. - [feeds_getFeed](https://sellersheetai.com/docs/mcp-api/tools/feeds_getFeed) (read): Get Amazon feed processing status (getFeed). - [feeds_getFeeds](https://sellersheetai.com/docs/mcp-api/tools/feeds_getFeeds) (read): List/filter your recent feeds (getFeeds). - [finances_listFinancialEventGroups](https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventGroups) (read): List Amazon financial event groups (settlement periods). - [finances_listFinancialEvents](https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEvents) (read): List Amazon financial events (charges, credits, fees, etc.) by posted-date range. - [finances_listFinancialEventsByGroupId](https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventsByGroupId) (read): List all financial events for a specific settlement group. - [finances_listFinancialEventsByOrderId](https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventsByOrderId) (read): Get all financial events for a specific Amazon order ID. - [finances_listTransactions](https://sellersheetai.com/docs/mcp-api/tools/finances_listTransactions) (read): List Amazon financial transactions by posted-date range. - [listings_build_payload](https://sellersheetai.com/docs/mcp-api/tools/listings_build_payload) (read): Build Amazon-shaped attribute JSON from a Publish Queue row's flat cells, per SKU, driven by the productType schema. - [listings_deleteListingsItem](https://sellersheetai.com/docs/mcp-api/tools/listings_deleteListingsItem) (destructive): Delete this seller's listing for a SKU (offer and submitted attributes); the ASIN's catalog page stays. - [listings_fetch_attributes_by_asins](https://sellersheetai.com/docs/mcp-api/tools/listings_fetch_attributes_by_asins) (read): Bulk fetch + flatten Amazon catalog attributes for N ASINs in ONE call. - [listings_fetch_attributes_by_skus](https://sellersheetai.com/docs/mcp-api/tools/listings_fetch_attributes_by_skus) (read): Bulk fetch + flatten Amazon listings attributes for N OWNED SKUs in ONE call. - [listings_getListingsItem](https://sellersheetai.com/docs/mcp-api/tools/listings_getListingsItem) (read): Get the SELLER'S SUBMITTED attributes, status, and issues for a single listing SKU. - [listings_getListingsRestrictions](https://sellersheetai.com/docs/mcp-api/tools/listings_getListingsRestrictions) (read): Check whether you are approved to sell an ASIN in a given condition. - [listings_get_attribute_guide](https://sellersheetai.com/docs/mcp-api/tools/listings_get_attribute_guide) (read): The row-4 guide (format, unit, allowed values, example) for each Publish Queue column of a productType — one per flat-file key, so item_weight has one for #1.value and one for #1.u - [listings_parse_asin_to_cells](https://sellersheetai.com/docs/mcp-api/tools/listings_parse_asin_to_cells) (read): Convenience: fetch an ASIN's catalog attributes from Amazon and return flat, operator-readable cell values. - [listings_parse_payload](https://sellersheetai.com/docs/mcp-api/tools/listings_parse_payload) (read): Turn Amazon attribute JSON you already hold (from listings_getListingsItem or catalogItems_getCatalogItem) into Publish Queue cells keyed by Amazon's flat-file keys — the inverse o - [listings_patchListingsItem](https://sellersheetai.com/docs/mcp-api/tools/listings_patchListingsItem) (destructive): Patch attributes on an existing listing (JSON Patch) without replacing it — the tool for fixing a suppressed listing or changing price, inventory, title or images. - [listings_poll_feed_results](https://sellersheetai.com/docs/mcp-api/tools/listings_poll_feed_results) (write): Check the feeds behind the Submission Log's unfinished Submit Feed rows and get back the cells to write: Feed Status, Result, Issues, Raw Response. - [listings_prepare_publish_queue_template](https://sellersheetai.com/docs/mcp-api/tools/listings_prepare_publish_queue_template) (read): Everything needed to seed a Publish Queue tab for N productTypes in one call: one bundle for a single productType, or ONE merged bundle keyed by the joined names ("TOWEL,HEADPHONES - [listings_putListingsItem](https://sellersheetai.com/docs/mcp-api/tools/listings_putListingsItem) (destructive): Create a listing, or fully replace an existing one — PUT replaces every attribute, so for a targeted change use listings_patchListingsItem. - [listings_searchListingsItems](https://sellersheetai.com/docs/mcp-api/tools/listings_searchListingsItems) (read): Search and filter the seller's own listings catalog — the entry point for a suppressed-listing audit (with_issue_severity ['ERROR'] and included_data ['summaries', 'issues'], then - [listings_submit_feed](https://sellersheetai.com/docs/mcp-api/tools/listings_submit_feed) (destructive): Bulk publish through Amazon's Feeds API (JSON_LISTINGS_FEED) — the sidebar's "Submit Listing" parity, for 10+ SKUs up to ~25,000 per call; for interactive edits of ≤20 SKUs with pe - [listings_submit_feed_legacy](https://sellersheetai.com/docs/mcp-api/tools/listings_submit_feed_legacy) (destructive): Legacy Create Listing flow: submit flat Create Listing rows via JSON_LISTINGS_FEED or the Listings Items API — new work uses listings_submit_feed (Publish Queue keys). - [listings_submit_items](https://sellersheetai.com/docs/mcp-api/tools/listings_submit_items) (destructive): Build Amazon-shaped payloads from Publish Queue cells AND submit them per SKU through the listings-items API in one call — the same input shape as listings_build_payload, then one - [listings_validate_rows](https://sellersheetai.com/docs/mcp-api/tools/listings_validate_rows) (write): Validate rows of the LEGACY Create Listing sheet (combined headers, config in rows 1–2) with Amazon's VALIDATION_PREVIEW. - [orders_getOrder](https://sellersheetai.com/docs/mcp-api/tools/orders_getOrder) (read): Get one order (Orders v2026-01-01) with its line items inline (order.orderItems) and any included_data expansions. - [orders_searchOrders](https://sellersheetai.com/docs/mcp-api/tools/orders_searchOrders) (read): Search orders (Orders v2026-01-01): ONE Amazon page plus data.nextToken, the full v2026 filter set, and line items INLINE on each order (order.orderItems) — no separate items call. - [productFees_getMyFeesEstimateForASIN](https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimateForASIN) (read): Estimate Amazon fees (referral fee + FBA/MFN fees) for a single ASIN at a given price. - [productFees_getMyFeesEstimateForSKU](https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimateForSKU) (read): Estimate Amazon fees (referral fee + FBA/MFN fees) for a seller SKU at a given price. - [productFees_getMyFeesEstimates](https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimates) (read): Amazon fee estimates for a batch of items in one request (Product Fees v0) — the batch form of productFees_getMyFeesEstimateForASIN and productFees_getMyFeesEstimateForSKU. - [productPricing_getCompetitivePricing](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getCompetitivePricing) (read): Get competitive pricing for up to 20 ASINs or SKUs (Product Pricing v0). - [productPricing_getCompetitiveSummary](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getCompetitiveSummary) (read): Competitive summary for 1–20 ASINs (Product Pricing v2022-05-01): featured buying options (who wins the featured offer, at what price), lowest-priced offers, reference prices and s - [productPricing_getFeaturedOfferExpectedPriceBatch](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getFeaturedOfferExpectedPriceBatch) (read): Featured offer expected price (FOEP) for 1–20 seller SKUs (Product Pricing v2022-05-01) — the price at or below which each SKU is expected to win the featured offer, an input for r - [productPricing_getItemOffers](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getItemOffers) (read): Get lowest-priced offers for a single ASIN (Product Pricing v0). - [productPricing_getItemOffersBatch](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getItemOffersBatch) (read): Get lowest-priced offers for a batch of ASINs in a single request (Product Pricing v0). - [productPricing_getListingOffers](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getListingOffers) (read): Get lowest-priced offers for a single seller SKU listing (Product Pricing v0). - [productPricing_getListingOffersBatch](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getListingOffersBatch) (read): Get lowest-priced offers for a batch of SKU listings in a single request (Product Pricing v0). - [productPricing_getPricing](https://sellersheetai.com/docs/mcp-api/tools/productPricing_getPricing) (read): Get pricing information for up to 20 ASINs or SKUs (Product Pricing v0). - [productTypeDefinitions_getDefinitionsProductType](https://sellersheetai.com/docs/mcp-api/tools/productTypeDefinitions_getDefinitionsProductType) (read): Retrieve an Amazon product type's definition — its attribute groups, requirements and a link to its JSON Schema. - [productTypeDefinitions_searchDefinitionsProductTypes](https://sellersheetai.com/docs/mcp-api/tools/productTypeDefinitions_searchDefinitionsProductTypes) (read): Search for Amazon product types that have definitions available. - [replenishment_getSellingPartnerMetrics](https://sellersheetai.com/docs/mcp-api/tools/replenishment_getSellingPartnerMetrics) (read): Get aggregated, account-level Subscribe & Save replenishment metrics for the selling partner. - [replenishment_listOfferMetrics](https://sellersheetai.com/docs/mcp-api/tools/replenishment_listOfferMetrics) (read): List Subscribe & Save replenishment metrics per offer (ASIN/SKU). - [replenishment_listOffers](https://sellersheetai.com/docs/mcp-api/tools/replenishment_listOffers) (read): List Subscribe & Save offers with eligibility, pricing, inventory, program config, and delivery forecasts. - [reports_cancelReport](https://sellersheetai.com/docs/mcp-api/tools/reports_cancelReport) (read): Cancel a report Amazon has not started yet (processingStatus IN_QUEUE); an IN_PROGRESS report can no longer be cancelled. - [reports_cancelReportSchedule](https://sellersheetai.com/docs/mcp-api/tools/reports_cancelReportSchedule) (destructive): Cancel a recurring report schedule. - [reports_createReport](https://sellersheetai.com/docs/mcp-api/tools/reports_createReport) (read): Submit one SP-API report request; returns reportId at once. - [reports_createReportSchedule](https://sellersheetai.com/docs/mcp-api/tools/reports_createReportSchedule) (write): Set up a recurring Amazon report. - [reports_getReport](https://sellersheetai.com/docs/mcp-api/tools/reports_getReport) (read): Get one report's status; when DONE it returns a presigned download URL (data.documentUrl), never the rows — download and process the file yourself (no inline document, preview or s - [reports_getReportSchedule](https://sellersheetai.com/docs/mcp-api/tools/reports_getReportSchedule) (read): Fetch one report schedule by its reportScheduleId. - [reports_getReportSchedules](https://sellersheetai.com/docs/mcp-api/tools/reports_getReportSchedules) (read): List active report schedules for one or more reportTypes. - [reports_getReports](https://sellersheetai.com/docs/mcp-api/tools/reports_getReports) (read): List the SP-API reports Amazon already holds for the store. - [sales_getOrderMetrics](https://sellersheetai.com/docs/mcp-api/tools/sales_getOrderMetrics) (read): Order metrics (units, order count, revenue) as a time series per granularity — sales trends, year-over-year comparisons, revenue reporting. - [solicitations_createProductReviewAndSellerFeedbackSolicitation](https://sellersheetai.com/docs/mcp-api/tools/solicitations_createProductReviewAndSellerFeedbackSolicitation) (write): Send a product review and seller feedback solicitation for an order. - [solicitations_getSolicitationActionsForOrder](https://sellersheetai.com/docs/mcp-api/tools/solicitations_getSolicitationActionsForOrder) (read): Check which solicitation actions are available for an order. - [vendorInvoices_submitInvoices](https://sellersheetai.com/docs/mcp-api/tools/vendorInvoices_submitInvoices) (destructive): Submit vendor invoices or credit notes to Amazon. - [vendorOrders_getPurchaseOrder](https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrder) (read): Get full details for a single vendor purchase order. - [vendorOrders_getPurchaseOrders](https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrders) (read): List vendor purchase orders created or changed in a window of at most 7 days, no older than 6 months. - [vendorOrders_getPurchaseOrdersStatus](https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrdersStatus) (read): Get purchase order status list. - [vendorOrders_submitAcknowledgement](https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_submitAcknowledgement) (destructive): Acknowledge (accept, backorder or reject) one or more purchase orders. - [vendorShipments_GetShipmentDetails](https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_GetShipmentDetails) (read): Get shipment details from Amazon with date and status filters. - [vendorShipments_GetShipmentLabels](https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_GetShipmentLabels) (read): Get small parcel transport labels from Amazon. - [vendorShipments_SubmitShipmentConfirmations](https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_SubmitShipmentConfirmations) (destructive): Confirm vendor shipments AFTER dispatch (the advance notice before dispatch is vendorShipments_SubmitShipments). - [vendorShipments_SubmitShipments](https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_SubmitShipments) (destructive): Submit vendor shipment requests — the advance shipment notice, BEFORE goods ship (after dispatch use vendorShipments_SubmitShipmentConfirmations). - [vendorTransactionStatus_getTransaction](https://sellersheetai.com/docs/mcp-api/tools/vendorTransactionStatus_getTransaction) (read): Read the status of a vendor retail transaction (an invoice, acknowledgement or shipment submit). ## google_workspace - [add_sheet_chart](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_chart) (write): Insert a native Google Sheets chart over a range of data. - [add_sheet_conditional_format](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_conditional_format) (write): Add a conditional formatting rule to a range: a boolean rule (the default) that formats the cells meeting a condition, or a 2- or 3-stop colour gradient. - [add_sheet_dropdown](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_dropdown) (write): Set, replace or remove the dropdown on a range — the one dropdown tool. - [add_sheet_named_range](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_named_range) (write): Add a new named range. - [add_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_tab) (write): Add a new tab to the spreadsheet. - [append_doc_text](https://sellersheetai.com/docs/mcp-api/tools/append_doc_text) (write): Append text to the end of the document body. - [append_sheet_rows](https://sellersheetai.com/docs/mcp-api/tools/append_sheet_rows) (write): Append rows below the last non-empty row of the columns in range_. - [apply_doc_bullets](https://sellersheetai.com/docs/mcp-api/tools/apply_doc_bullets) (write): Convert paragraphs in a range into a bulleted or numbered list. - [apply_sheet_table_style](https://sellersheetai.com/docs/mcp-api/tools/apply_sheet_table_style) (write): Style an already-written range as a table: a bold, coloured, centred header row, alternating row bands, thin grey borders and a frozen header. - [autofit_sheet_columns](https://sellersheetai.com/docs/mcp-api/tools/autofit_sheet_columns) (write): Auto-resize columns to fit their content — wraps Sheets `autoResizeDimensions`. - [clear_doc](https://sellersheetai.com/docs/mcp-api/tools/clear_doc) (destructive): Delete all content from the document body. - [clear_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/clear_sheet_range) (destructive): Clear the values in a range. - [collapse_sheet_group](https://sellersheetai.com/docs/mcp-api/tools/collapse_sheet_group) (write): Collapse (collapsed=True) or expand the row or column groups that lie inside range_. - [copy_drive_file](https://sellersheetai.com/docs/mcp-api/tools/copy_drive_file) (write): Copy a file, returns new file ID. - [copy_sheet_format](https://sellersheetai.com/docs/mcp-api/tools/copy_sheet_format) (write): Copy formatting only (no values) from source range to target range. - [copy_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/copy_sheet_tab) (write): Copy a tab, with all its formatting, into another spreadsheet (or the same one). - [create_doc_footer](https://sellersheetai.com/docs/mcp-api/tools/create_doc_footer) (write): Create a document footer and optionally fill it with initial text. - [create_doc_header](https://sellersheetai.com/docs/mcp-api/tools/create_doc_header) (write): Create a document header and optionally fill it with initial text. - [create_doc_in_folder](https://sellersheetai.com/docs/mcp-api/tools/create_doc_in_folder) (write): Create a new blank Google Doc inside a Drive folder. - [create_sheet_filter](https://sellersheetai.com/docs/mcp-api/tools/create_sheet_filter) (write): Create a filter view on a range: a named, saved filter anyone can open from Data > Filter views without touching the tab's one basic filter (set_sheet_basic_filter sets that). - [create_spreadsheet_in_folder](https://sellersheetai.com/docs/mcp-api/tools/create_spreadsheet_in_folder) (write): Create a new empty Google Sheet in a Drive folder — for light builds, or when you have no local filesystem. - [delete_doc_range](https://sellersheetai.com/docs/mcp-api/tools/delete_doc_range) (destructive): Delete a content range by index. - [delete_drive_file](https://sellersheetai.com/docs/mcp-api/tools/delete_drive_file) (destructive): Delete or trash a file. - [delete_sheet_named_range](https://sellersheetai.com/docs/mcp-api/tools/delete_sheet_named_range) (destructive): Delete a named range. - [delete_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/delete_sheet_tab) (destructive): Delete a tab from the spreadsheet. - [doc_batch_update](https://sellersheetai.com/docs/mcp-api/tools/doc_batch_update) (destructive): Escape hatch: apply a raw Docs API batchUpdate Requests list. - [find_doc_text](https://sellersheetai.com/docs/mcp-api/tools/find_doc_text) (read): Find every occurrence of a text substring and return its index ranges. - [find_file_in_folder](https://sellersheetai.com/docs/mcp-api/tools/find_file_in_folder) (read): Find the first Google Sheet in a folder whose name contains a substring — only spreadsheets match; for any other file type use search_drive_files with rawQuery and parentId. - [find_or_create_folder](https://sellersheetai.com/docs/mcp-api/tools/find_or_create_folder) (write): Find a subfolder by name inside parentId, or create it if missing. - [find_replace_in_sheet](https://sellersheetai.com/docs/mcp-api/tools/find_replace_in_sheet) (destructive): Find and replace text in a sheet. - [format_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/format_sheet_range) (write): Set the fill colour, font colour, bold and font size of a range. - [freeze_sheet_panes](https://sellersheetai.com/docs/mcp-api/tools/freeze_sheet_panes) (write): Freeze rows and/or columns in a sheet. - [get_doc](https://sellersheetai.com/docs/mcp-api/tools/get_doc) (read): Get the full Docs API document resource (body, headers, styles, revisionId). - [get_doc_metadata](https://sellersheetai.com/docs/mcp-api/tools/get_doc_metadata) (read): Get document title, revisionId, and documentStyle. - [get_doc_text](https://sellersheetai.com/docs/mcp-api/tools/get_doc_text) (read): Extract the plain text of the document body, table cells included (headers and footers are not). - [get_drive_file](https://sellersheetai.com/docs/mcp-api/tools/get_drive_file) (read): Get file metadata. - [get_sheet_cell](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_cell) (read): Read everything about a cell or a small range in one call: value, formula, format, note, hyperlink and dropdown. - [get_sheet_links](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_links) (read): Get hyperlinks from a range. - [get_sheet_metadata](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_metadata) (read): Get the spreadsheet's metadata: title, locale, time zone and every tab's properties. - [get_sheet_named_range](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_named_range) (read): Get a specific named range. - [get_sheet_notes](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_notes) (read): Get notes from a range. - [group_sheet_rows_cols](https://sellersheetai.com/docs/mcp-api/tools/group_sheet_rows_cols) (write): Group rows or columns (creates a collapsible [+] toggle in the sheet). - [hide_sheet_rows](https://sellersheetai.com/docs/mcp-api/tools/hide_sheet_rows) (write): Hide rows in a sheet, or show hidden rows again. - [import_sheet_tsv](https://sellersheetai.com/docs/mcp-api/tools/import_sheet_tsv) (destructive): Server-side parse + write of TSV (tab-separated) text. - [insert_doc_heading](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_heading) (write): Convenience: insert a line of text and apply HEADING_{level}. - [insert_doc_image](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_image) (write): Insert an inline image from a public URL. - [insert_doc_page_break](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_page_break) (write): Insert a page break. - [insert_doc_section_break](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_section_break) (write): Insert a section break (Docs adds a newline before it; not allowed inside a table, header or footer). - [insert_doc_table](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_table) (write): Insert an empty table. - [insert_doc_text](https://sellersheetai.com/docs/mcp-api/tools/insert_doc_text) (write): Insert text at a specific index. - [insert_sheet_rows_cols](https://sellersheetai.com/docs/mcp-api/tools/insert_sheet_rows_cols) (write): Insert rows or columns in a sheet. - [insert_sheet_sparkline](https://sellersheetai.com/docs/mcp-api/tools/insert_sheet_sparkline) (write): Insert an in-cell SPARKLINE chart by writing the formula for you. - [list_drive_files](https://sellersheetai.com/docs/mcp-api/tools/list_drive_files) (read): List the files directly inside a folder of your SellerSheet workspace. - [list_drive_permissions](https://sellersheetai.com/docs/mcp-api/tools/list_drive_permissions) (read): List all permissions on a file. - [list_sheet_named_ranges](https://sellersheetai.com/docs/mcp-api/tools/list_sheet_named_ranges) (read): List all named ranges in the spreadsheet. - [list_sheet_tabs](https://sellersheetai.com/docs/mcp-api/tools/list_sheet_tabs) (read): List all tabs in the spreadsheet. - [merge_sheet_cells](https://sellersheetai.com/docs/mcp-api/tools/merge_sheet_cells) (destructive): Merge cells in a range. - [move_file_to_folder](https://sellersheetai.com/docs/mcp-api/tools/move_file_to_folder) (write): Move a file to a new parent folder. - [paste_sheet_with_format](https://sellersheetai.com/docs/mcp-api/tools/paste_sheet_with_format) (destructive): Write values AND apply uniform format to the same range — saves a round-trip vs calling write_sheet then format_sheet_range. - [protect_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/protect_sheet_range) (write): Protect a range from editing. - [read_sheet](https://sellersheetai.com/docs/mcp-api/tools/read_sheet) (read): Read cell values from a range. - [read_sheet_format](https://sellersheetai.com/docs/mcp-api/tools/read_sheet_format) (read): Read cell formatting from a range. - [remove_doc_bullets](https://sellersheetai.com/docs/mcp-api/tools/remove_doc_bullets) (write): Remove bullet/number glyphs from paragraphs in a range. - [rename_doc](https://sellersheetai.com/docs/mcp-api/tools/rename_doc) (write): Rename a Google Doc via the Drive API. - [rename_drive_file](https://sellersheetai.com/docs/mcp-api/tools/rename_drive_file) (write): Rename a file. - [rename_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/rename_sheet_tab) (write): Rename an existing tab. - [replace_doc_text](https://sellersheetai.com/docs/mcp-api/tools/replace_doc_text) (destructive): Find and replace text across the entire document. - [resize_sheet_columns](https://sellersheetai.com/docs/mcp-api/tools/resize_sheet_columns) (write): Resize columns in a sheet. - [resize_sheet_rows](https://sellersheetai.com/docs/mcp-api/tools/resize_sheet_rows) (write): Resize rows in a sheet. - [save_url_to_drive](https://sellersheetai.com/docs/mcp-api/tools/save_url_to_drive) (write): Save an Amazon image-CDN file (media-amazon.com, ssl-images-amazon.com and their .cn twins; at most 10 MB) straight to a Drive folder — the server streams it. - [search_drive_files](https://sellersheetai.com/docs/mcp-api/tools/search_drive_files) (read): Search files by text or raw Drive query inside your SellerSheet workspace. - [set_doc_table_cell_text](https://sellersheetai.com/docs/mcp-api/tools/set_doc_table_cell_text) (destructive): Replace the text content of a specific table cell. - [set_sheet_basic_filter](https://sellersheetai.com/docs/mcp-api/tools/set_sheet_basic_filter) (write): Set a basic filter (column dropdown arrows) on a header row range. - [set_sheet_borders](https://sellersheetai.com/docs/mcp-api/tools/set_sheet_borders) (write): Add cell borders to a range. - [set_sheet_number_format](https://sellersheetai.com/docs/mcp-api/tools/set_sheet_number_format) (write): Set number format for a range. - [setup_sheet](https://sellersheetai.com/docs/mcp-api/tools/setup_sheet) (write): Create a tab if it is missing, write a key row and a label row, and format them. - [share_drive_file](https://sellersheetai.com/docs/mcp-api/tools/share_drive_file) (write): Share a file with one person (email) or a whole domain (domain; email wins if both are passed). - [sheet_batch_update](https://sellersheetai.com/docs/mcp-api/tools/sheet_batch_update) (destructive): Apply several raw Sheets API v4 requests (spreadsheets.batchUpdate) in one call. - [sort_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/sort_sheet_range) (destructive): Sort a range by specified columns. - [start_drive_upload](https://sellersheetai.com/docs/mcp-api/tools/start_drive_upload) (write): Begin a direct upload of LOCAL bytes to Drive. - [style_doc_text_by_match](https://sellersheetai.com/docs/mcp-api/tools/style_doc_text_by_match) (write): Find every occurrence of `needle` and apply the given text style. - [ungroup_sheet_rows_cols](https://sellersheetai.com/docs/mcp-api/tools/ungroup_sheet_rows_cols) (write): Remove a row/column group (ungroup). - [unmerge_sheet_cells](https://sellersheetai.com/docs/mcp-api/tools/unmerge_sheet_cells) (write): Unmerge cells in a range. - [unprotect_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/unprotect_sheet_range) (write): Remove protection from a range. - [unshare_drive_file](https://sellersheetai.com/docs/mcp-api/tools/unshare_drive_file) (destructive): Remove a permission from a file. - [update_doc_document_style](https://sellersheetai.com/docs/mcp-api/tools/update_doc_document_style) (write): Update document-level properties: margins, page size, background. - [update_doc_paragraph_style](https://sellersheetai.com/docs/mcp-api/tools/update_doc_paragraph_style) (write): Apply paragraph-level style to a range. - [update_doc_text_style](https://sellersheetai.com/docs/mcp-api/tools/update_doc_text_style) (write): Apply character-level text styles to an index range (from find_doc_text or get_doc). - [update_sheet_note](https://sellersheetai.com/docs/mcp-api/tools/update_sheet_note) (write): Update note on a cell or range. - [write_doc_structured](https://sellersheetai.com/docs/mcp-api/tools/write_doc_structured) (destructive): Build a document from a list of semantic blocks in ONE call. - [write_sheet](https://sellersheetai.com/docs/mcp-api/tools/write_sheet) (destructive): Write a 2D block of values to a range; every cell is parsed as if typed (USER_ENTERED). - [write_sheet_formula](https://sellersheetai.com/docs/mcp-api/tools/write_sheet_formula) (destructive): Fill one formula into a cell — or across EVERY cell of a range. ## noon - [noon_catalog_BarcodeSkuMap](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_BarcodeSkuMap) (destructive): Map existing partner SKUs to barcodes (UPC/EAN/ISBN) on noon, synchronously, so warehouse systems know what a scanned barcode is; a new barcode is created. - [noon_catalog_ChildSkuDelete](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_ChildSkuDelete) (destructive): DELETE child (sellable variant) SKUs from the noon catalog — DESTRUCTIVE, irreversible. - [noon_catalog_CreateBarcodeImport](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_CreateBarcodeImport) (destructive): Create an ASYNCHRONOUS bulk barcode-to-partner_sku import on noon — for mapping barcodes in bulk. - [noon_catalog_GenerateImportSignedUrl](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_GenerateImportSignedUrl) (read): Get a short-lived GCS signed URL to upload a barcode-import file to noon — step 1 of a file-based import, for more rows than is practical inline (over 10,000; smaller batches go in - [noon_catalog_GetImportStatus](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_GetImportStatus) (read): Poll a noon bulk import until it is final, then read which rows were rejected and why. - [noon_catalog_ParentSkuDelete](https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_ParentSkuDelete) (destructive): DELETE parent SKUs from the noon catalog — DESTRUCTIVE and CASCADES: the non-sellable base product and every child SKU under it are removed. - [noon_content_GetContent](https://sellersheetai.com/docs/mcp-api/tools/noon_content_GetContent) (read): Fetch a noon product's stored content, images and per-language completeness / QC status — to check whether a listing is complete and approved. - [noon_content_ListCategories](https://sellersheetai.com/docs/mcp-api/tools/noon_content_ListCategories) (read): List every product category code in the noon catalog — to choose a new product's category before creating it; then read its fields with noon_content_ListCategoryAttributes. - [noon_content_ListCategoryAttributes](https://sellersheetai.com/docs/mcp-api/tools/noon_content_ListCategoryAttributes) (read): Get the attribute schema a product in one category must satisfy — read it before building the attributes of noon_content_UpsertProduct: every is_mandatory attribute needs a value m - [noon_content_UpsertProduct](https://sellersheetai.com/docs/mcp-api/tools/noon_content_UpsertProduct) (destructive): Create or update a product listing on noon — new partner_skus create a product, known ones update the product they belong to. - [noon_content_draft_from_amazon_asin](https://sellersheetai.com/docs/mcp-api/tools/noon_content_draft_from_amazon_asin) (write): Turn one of your Amazon listings into a noon listing draft in SellerSheet. - [noon_content_load_publish_queue_content](https://sellersheetai.com/docs/mcp-api/tools/noon_content_load_publish_queue_content) (read): Load an existing noon product into a noon Publish Queue sheet for editing — one GetContent shaped onto the sheet's row-5 keys, with the columns the sheet still lacks and the produc - [noon_content_prepare_publish_queue_template](https://sellersheetai.com/docs/mcp-api/tools/noon_content_prepare_publish_queue_template) (read): Build the ordered column spec for a noon Publish Queue sheet by merging noon's attribute schema for every category the sheet holds — call it before writing or extending the sheet. - [noon_impex_CreateExport](https://sellersheetai.com/docs/mcp-api/tools/noon_impex_CreateExport) (read): Start a noon export (a report file) and return its export_code at once; noon builds the file asynchronously. - [noon_impex_GetExportCategoryList](https://sellersheetai.com/docs/mcp-api/tools/noon_impex_GetExportCategoryList) (read): List the noon export categories this account can request, each with its required and optional params — call it before noon_impex_CreateExport. - [noon_impex_GetExportStatus](https://sellersheetai.com/docs/mcp-api/tools/noon_impex_GetExportStatus) (read): Poll a noon export by its export_code; when it is COMPLETE, call noon_impex_download_export. - [noon_impex_download_export](https://sellersheetai.com/docs/mcp-api/tools/noon_impex_download_export) (write): Download and parse a COMPLETE noon export; the full file is also saved to the operator's Drive when a reports folder is configured. - [noon_inbound_CreateShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_CreateShipment) (write): Create an FBN inbound shipment (ASN) header in CREATED status with no items — step 2, after noon_inbound_ListEligibleItems. - [noon_inbound_DeleteShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_DeleteShipmentItems) (destructive): Remove items from a CREATED noon ASN, at most 1000 per call — to fix a draft before sealing; to change a quantity use noon_inbound_UpdateShipmentItems. - [noon_inbound_GetShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetShipment) (read): Get one noon ASN's header (no items) — its lifecycle status and receiving progress, at any time. - [noon_inbound_GetSlotAvailability](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetSlotAvailability) (read): Get the destination warehouses and check-in days / time slots open to a SEALED noon ASN — after sealing it with noon_inbound_UpdateShipmentStatus, before noon_inbound_ScheduleShipm - [noon_inbound_ListEligibleItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListEligibleItems) (read): List the catalog SKUs noon accepts on an FBN inbound shipment (ASN), with their storage_type — step 1 of an ASN. - [noon_inbound_ListShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipmentItems) (read): List the items on a noon ASN in any status, with product details (paginated) — to verify a draft or sealed ASN's contents. - [noon_inbound_ListShipments](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipments) (read): List noon ASN headers (no items), optionally by status or destination country — to find a draft or audit history (paginated). - [noon_inbound_ScheduleShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ScheduleShipment) (write): Book a SEALED noon ASN for inbound delivery at a warehouse, date and time slot from noon_inbound_GetSlotAvailability — the final step; it also assigns the destination warehouse (SE - [noon_inbound_UpdateShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipment) (destructive): Set free-form metadata (misc, e.g. - [noon_inbound_UpdateShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentItems) (destructive): Add items to, or change quantities on, a CREATED noon ASN — upsert by partner_sku (an existing SKU's qty is overwritten), at most 1000 per call; then SEAL it with noon_inbound_Upda - [noon_inbound_UpdateShipmentStatus](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentStatus) (destructive): Seal, cancel or reschedule a noon ASN. - [noon_offer_GetProductOffers](https://sellersheetai.com/docs/mcp-api/tools/noon_offer_GetProductOffers) (read): Get a partner SKU's offers in every country and why any is not buyable — the check to run when a SKU shows live but does not sell (noon_status='live' does not mean purchasable). - [noon_pricing_BatchGetPricing](https://sellersheetai.com/docs/mcp-api/tools/noon_pricing_BatchGetPricing) (read): Read the current price, msrp and is_active noon holds for a batch of partner SKUs — the authoritative state before repricing, or to confirm an upsert took effect. - [noon_pricing_BatchUpsertPricing](https://sellersheetai.com/docs/mcp-api/tools/noon_pricing_BatchUpsertPricing) (destructive): Create or update price, msrp and is_active for a batch of partner SKUs; only the fields you pass change. - [noon_returns_ListReturnReferences](https://sellersheetai.com/docs/mcp-api/tools/noon_returns_ListReturnReferences) (read): Look up the purchased items being returned that match a scanned barcode, across the merchants you can access, with every barcode reference on each — when a return arrives and you n - [noon_stock_GetStock](https://sellersheetai.com/docs/mcp-api/tools/noon_stock_GetStock) (read): Read the stock quantity noon holds for each (warehouse_code, partner_sku) pair — before a restock or reprice; change quantities with noon_stock_UpdateStock. - [noon_stock_UpdateStock](https://sellersheetai.com/docs/mcp-api/tools/noon_stock_UpdateStock) (destructive): Overwrite the available stock (and optionally processing_time) noon holds per warehouse_code + partner_sku; check each row's status, then re-read with noon_stock_GetStock. - [noon_warehouse_platform_ListWarehouses](https://sellersheetai.com/docs/mcp-api/tools/noon_warehouse_platform_ListWarehouses) (read): List the warehouses on the noon partner account, up to 500 per page — to find the warehouse_code the stock tools take. - [noon_xborder_pricing_BatchGetTransferPrice](https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchGetTransferPrice) (read): Read the cross-border USD transfer price, MSRP and active state noon holds for up to 1000 partner SKUs — check them before noon_xborder_pricing_BatchUpsertTransferPrice. - [noon_xborder_pricing_BatchUpsertProduct](https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchUpsertProduct) (destructive): Create or update the cross-border product record noon needs to ship a SKU cross-border (dimensions, weights, HS code) — when onboarding a new cross-border SKU, before its noon_xbor - [noon_xborder_pricing_BatchUpsertTransferPrice](https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchUpsertTransferPrice) (destructive): Set or change the USD transfer price and MSRP noon uses to list a SKU cross-border, or toggle it active, for a batch of SKUs. ## sellersheet - [check_image_job](https://sellersheetai.com/docs/mcp-api/tools/check_image_job) (read): Poll an async image job (edit_image). - [check_image_jobs](https://sellersheetai.com/docs/mcp-api/tools/check_image_jobs) (read): Batch-poll multiple async image jobs in one call. - [credits_quote](https://sellersheetai.com/docs/mcp-api/tools/credits_quote) (read): Price ONE paid action for this user, on their model route, before spending — quote data.credits to the user, never a number from memory. - [customerFeedback_insights_report_status](https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_insights_report_status) (read): Poll a Buyer insights job submitted by customerFeedback_insights_report — every ~4 s until status is done or error. - [edit_image](https://sellersheetai.com/docs/mcp-api/tools/edit_image) (write): Edit one image, or compose 2–10 into one, from a text instruction (1 input = revise, 2 or more = compose): background swaps, style transfer, object add/remove, composites. - [fbaInbound_create_sta_sheet](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_sta_sheet) (write): Create the plan workbook for an FBA inbound plan — the SAME workbook the sidebar's "Create STA SS" builds, so the sidebar buttons can continue any step: the stepper tab (STA-BoxFir - [generate_image](https://sellersheetai.com/docs/mcp-api/tools/generate_image) (write): Generate images from a text prompt — listing photos, A+ banners, lifestyle and infographic shots, icons. - [get_table_schema](https://sellersheetai.com/docs/mcp-api/tools/get_table_schema) (read): Return the schema for one rpt_* table — column names, types, unique key. - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) (read): Get the user's plan, stores, workspace folders, permissions, credits and the skills catalog. - [list_amc_templates](https://sellersheetai.com/docs/mcp-api/tools/list_amc_templates) (read): The AMC queries SellerSheet runs for every store whose AMC is on, and the warehouse table each one fills. - [list_generated_images](https://sellersheetai.com/docs/mcp-api/tools/list_generated_images) (read): List images already generated and saved for a store — newest first. - [list_report_syncs](https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) (read): List a store's report sync schedules — check sync health before trusting rpt_* data. - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) (read): Query the synced report warehouse (rpt_* tables) — rows without calling Amazon. - [reverse_prompt](https://sellersheetai.com/docs/mcp-api/tools/reverse_prompt) (write): Describe reference image(s) as a structured English prompt — step 1 of a restyle: adapt the fields to your product (subject, colors and materials stay faithful; swap scene, lightin - [set_synthetic_performer](https://sellersheetai.com/docs/mcp-api/tools/set_synthetic_performer) (destructive): Toggle Amazon's contains-synthetic-performer disclosure tag on an already-saved image, without regenerating it. # ads_associate_accounts (https://sellersheetai.com/docs/mcp-api/tools/ads_associate_accounts) > Link an advertising account to an Amazon Ads manager account. Access: **WRITE** · toolset amazon_ads · family ads.manager-accounts Amazon Ads API · LinkAdvertisingAccountsToManagerAccountPublicAPI · POST /managerAccounts/{managerAccountId}/associate Docs: https://advertising.amazon.com/API/docs/en-us/reference/1-0/managerAccount#tag/Manager-Accounts/operation/LinkAdvertisingAccountsToManagerAccountPublicAPI Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_associate_accounts", "arguments": { "store": "myStore-US", "countryCode": "", "managerAccountId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_associate_accounts \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","managerAccountId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `managerAccountId` | string | yes | data.result.managerAccounts[].managerAccountId from ads_get_manager_accounts. | | `body` | object | yes | {accounts: [{id, type, roles: [ONE role]}]} (max 20) — for type ACCOUNT_ID the id is the profile's accountInfo.id (may begin with 'ENTITY'); a DSP_ADVERTISER_ID comes from ads_dsp_advertisers. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.succeedAccounts / data.result.failedAccounts[]` — {account, error} — any failedAccounts entry was not linked. # ads_create_ads_account (https://sellersheetai.com/docs/mcp-api/tools/ads_create_ads_account) > Register a new Amazon Ads account. Access: **WRITE** · toolset amazon_ads · family ads.accounts List existing accounts first with ads_list_ads_accounts so you do not create a duplicate. Amazon Ads API · RegisterAdsAccount · POST /adsAccounts Docs: https://advertising.amazon.com/API/docs/en-us/account-management#tag/Account/operation/RegisterAdsAccount Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_ads_account", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_ads_account \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. | ## Result - Amazon's payload in data.result. - `data.result.adsAccount` — {adsAccountId, accountName, status} — status CREATED, PENDING, PARTIALLY_CREATED or DISABLED. # ads_create_manager_account (https://sellersheetai.com/docs/mcp-api/tools/ads_create_manager_account) > Create an Amazon Ads manager account. Access: **WRITE** · toolset amazon_ads · family ads.manager-accounts List existing ones first with ads_get_manager_accounts. Amazon Ads API · createManagerAccount · POST /managerAccounts Docs: https://advertising.amazon.com/API/docs/en-us/reference/1-0/managerAccount#tag/Manager-Accounts/operation/createManagerAccount Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_manager_account", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_manager_account \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. | ## Result - Amazon's payload in data.result. # ads_create_stream_subscription (https://sellersheetai.com/docs/mcp-api/tools/ads_create_stream_subscription) > Create an Amazon Marketing Stream subscription: Amazon pushes one dataset (dataSetId, from Amazon's Marketing Stream data guide) to an AWS SQS queue or Firehose stream the seller o Access: **WRITE** · toolset amazon_ads · family ads.marketing-stream wns (destination ARN). Only for a seller who already runs that AWS endpoint; read the new subscription's status with ads_get_stream_subscription. Amazon Ads API · CreateStreamSubscription · POST /streams/subscriptions Docs: https://advertising.amazon.com/API/docs/en-us/amazon-marketing-stream/openapi#tag/Stream-Subscription/operation/CreateStreamSubscription Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_stream_subscription", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_stream_subscription \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. | ## Result - Amazon's payload in data.result. - `data.result.subscriptionId` — for ads_get_stream_subscription / ads_update_stream_subscription. # ads_disassociate_accounts (https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_accounts) > Unlink an advertising account from an Amazon Ads manager account — the manager loses access to that account. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.manager-accounts Amazon Ads API · UnlinkAdvertisingAccountsToManagerAccountPublicAPI · POST /managerAccounts/{managerAccountId}/disassociate Docs: https://advertising.amazon.com/API/docs/en-us/reference/1-0/managerAccount#tag/Manager-Accounts/operation/UnlinkAdvertisingAccountsToManagerAccountPublicAPI Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_disassociate_accounts", "arguments": { "store": "myStore-US", "countryCode": "", "managerAccountId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_disassociate_accounts \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","managerAccountId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `managerAccountId` | string | yes | data.result.managerAccounts[].managerAccountId from ads_get_manager_accounts. | | `body` | object | yes | {accounts: [{id, type}]} (max 20) — id is that manager's linkedAccounts[].accountId (or its dspAdvertiserId) from ads_get_manager_accounts. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.succeedAccounts / data.result.failedAccounts[]` — {account, error} — any failedAccounts entry is still linked. # ads_dsp_advertisers (https://sellersheetai.com/docs/mcp-api/tools/ads_dsp_advertisers) > List Amazon DSP advertisers accessible to this profile — the `advertiserId` a DSP report needs in its `filters` (e.g. Access: **READ** · toolset amazon_ads · family ads.dsp-advertiser {"field": "advertiserId", "values": [""]}). Amazon Ads API · GET /dsp/advertisers ## Call it MCP tool call: ```json { "name": "ads_dsp_advertisers", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_dsp_advertisers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional query params dict: {"startIndex": 0, "count": 100, "advertiserIdFilter": ","}. | ## Result - Amazon's payload in data.result. ## Params (Amazon schema) - startIndex: integer (max 29900) count: integer (1–100) — max 100 advertisers per call advertiserIdFilter: string ## Gotchas - Requires an AGENCY-type ad profile. Seller/vendor profiles return 400 "Selected profile type is not agency" — those accounts have no DSP advertiser seat, so DSP offline reports can't run for them. # ads_get_ads_account (https://sellersheetai.com/docs/mcp-api/tools/ads_get_ads_account) > Get one Amazon Ads account by id. Access: **READ** · toolset amazon_ads · family ads.accounts Amazon Ads API · GetAccount · GET /adsAccounts/{advertisingAccountId} Docs: https://advertising.amazon.com/API/docs/en-us/account-management#tag/Account/operation/GetAccount ## Call it MCP tool call: ```json { "name": "ads_get_ads_account", "arguments": { "store": "myStore-US", "countryCode": "", "advertisingAccountId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_ads_account \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","advertisingAccountId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `advertisingAccountId` | string | yes | data.result.adsAccounts[].adsAccountId from ads_list_ads_accounts. | ## Result - Amazon's payload in data.result. # ads_get_asin_engagement_for_store (https://sellersheetai.com/docs/mcp-api/tools/ads_get_asin_engagement_for_store) > Per-ASIN engagement on a brand's Store pages (renders, views, clicks, add-to-carts, orders, in-stock rate), or a store-level TOTAL_VIEWS / TOTAL_CLICKS row. Access: **READ** · toolset amazon_ads · family ads.stores For page / date / traffic-source traffic and sales use ads_get_insights_for_store_api. Amazon Ads API · getAsinEngagementForStore · POST /stores/{brandEntityId}/asinMetrics Docs: https://advertising.amazon.com/API/docs/en-us/stores/open-api#tag/Stores-Analytics/operation/getAsinEngagementForStore ## Call it MCP tool call: ```json { "name": "ads_get_asin_engagement_for_store", "arguments": { "store": "myStore-US", "countryCode": "", "brandEntityId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_asin_engagement_for_store \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","brandEntityId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `brandEntityId` | string | yes | from ads_get_brands. | | `body` | object | yes | {startDate, endDate, metrics: [...]}; dimension='ASIN' for per-ASIN rows, omitted for a store-aggregate row; optional orderBy / sortBy. | ## Result - Amazon's payload in data.result. - `data.result.metricsDetails[]` — one map per ASIN (max 1500), keyed by the requested metrics. ## Gotchas - A store-aggregate call (dimension omitted) accepts ONLY TOTAL_VIEWS and TOTAL_CLICKS — every other metric needs dimension='ASIN'. sortBy is valid only when dimension='ASIN'. - Amazon returns 400 "Invalid request body" when the brand has no published Store page. # ads_get_brands (https://sellersheetai.com/docs/mcp-api/tools/ads_get_brands) > Sponsored Brands: list the brands registered under this advertiser profile — brandId, brandRegistryName and (sellers only) the brandEntityId the Store insights tools take (ads_get_ Access: **READ** · toolset amazon_ads · family ads.sb3 asin_engagement_for_store, ads_get_insights_for_store_api). Amazon Ads API · getBrands · GET /brands Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi#tag/Brands/operation/getBrands ## Call it MCP tool call: ```json { "name": "ads_get_brands", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_brands \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `brand_type_filter` | string | | keep one brand type; omit for every brand. Allowed: brandRegistry \| bookAuthor. Allowed: brandRegistry \| bookAuthor. | ## Result - Amazon's payload in data.result. - `data.result` — a list of {brandId, brandEntityId, brandRegistryName}. # ads_get_campaigns_validation_configs (https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_validation_configs) > Validation rules Amazon enforces on campaign create/update — allowed values, ranges, and required fields, before building a payload. Access: **READ** · toolset amazon_ads · family ads.validation-configurations Amazon Ads API · getCampaignsValidationConfigs · POST /validationConfigurations/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/validation-configuration#tag/Validation-Configurations-Retrieval/operation/getCampaignsValidationConfigs ## Call it MCP tool call: ```json { "name": "ads_get_campaigns_validation_configs", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_campaigns_validation_configs \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional context — countryCodesList (Amazon's codes: 'UK', not 'GB'), entityTypesList, programTypesList (see Body). Pass all three to get one context instead of the whole set; the answer is under data.result.campaignValidationConfigs. | ## Result - Amazon's payload in data.result. ## Gotchas - The payload is large (~200KB+) — filter to the relevant section before writing it anywhere. # ads_get_insights_for_store_api (https://sellersheetai.com/docs/mcp-api/tools/ads_get_insights_for_store_api) > Store traffic / sales / dwell / bounce insights for a brand's Store page. Access: **READ** · toolset amazon_ads · family ads.stores Amazon Ads API · getInsightsForStoreAPI · POST /stores/{brandEntityId}/insights Docs: https://advertising.amazon.com/API/docs/en-us/stores/open-api#tag/Stores-Analytics/operation/getInsightsForStoreAPI ## Call it MCP tool call: ```json { "name": "ads_get_insights_for_store_api", "arguments": { "store": "myStore-US", "countryCode": "", "brandEntityId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_insights_for_store_api \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","brandEntityId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `brandEntityId` | string | yes | from ads_get_brands. | | `body` | object | yes | {dimension: DATE\|PAGE\|SOURCE\|TAG\|STORE, startDate, endDate, metrics: [...]}; optional filter {pageIds, sources, tags}, maxResult (1-1500), paginationToken, language. | ## Result - Amazon's payload in data.result. - `data.result.metricsDetails[]` — one map per dimension value (max 1500). - `data.result.paginationToken` — pass back as body.paginationToken with the SAME request body, within 24 h. ## Gotchas - The metric allowlist depends on dimension: DATE/PAGE/SOURCE/TAG take the traffic metrics (VIEWS, ORDERS, UNITS, SALES, VISITS, DWELL_TIME, BOUNCE_RATE, ...); STORE takes only DWELL_TIME, BOUNCE_RATE, NEW_TO_STORE. Non-SQS metrics: exactly ONE per call; SQS (Store-Quality) metrics may be combined freely. - filter accepts pageIds, sources, tags, but sources+tags together are not supported. - language is SQS-only (default 'en'), e.g. 'fr-FR', 'de-DE', 'ja-JP', 'zh-CN', 'ar-AE', 'en-GB'. # ads_get_invoice (https://sellersheetai.com/docs/mcp-api/tools/ads_get_invoice) > Get one Amazon Ads invoice by id — invoice lines, payments, adjustments and tax detail. Access: **READ** · toolset amazon_ads · family ads.billing A presigned PDF/XML link exists only on a government invoice (governmentInvoiceInformation.governmentDocumentS3Link). Amazon Ads API · getInvoice · GET /invoices/{invoiceId} Docs: https://advertising.amazon.com/API/docs/en-us/billing#tag/invoice/operation/getInvoice ## Call it MCP tool call: ```json { "name": "ads_get_invoice", "arguments": { "store": "myStore-US", "countryCode": "", "invoiceId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_invoice \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","invoiceId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `invoiceId` | string | yes | data.result.payload.invoiceSummaries[].id from ads_list_invoices. | ## Result - Amazon's payload in data.result. # ads_get_localized_currencies (https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_currencies) > Convert amounts to a target marketplace's local currency — use before creating campaigns in a different marketplace than the store's primary one. Access: **READ** · toolset amazon_ads · family ads.localization Amazon Ads API · getLocalizedCurrencies · POST /currencies/localize Docs: https://advertising.amazon.com/API/docs/en-us/localization#tag/Currency-Localization/operation/getLocalizedCurrencies ## Call it MCP tool call: ```json { "name": "ads_get_localized_currencies", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_localized_currencies \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {localizeCurrencyRequests: [{currency: {amount}}], sourceCountryCode, sourceMarketplaceId, targetCountryCodes: [...]}. | ## Result - Amazon's payload in data.result. # ads_get_localized_keywords (https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_keywords) > Translate keyword targeting between marketplaces. Access: **READ** · toolset amazon_ads · family ads.localization Amazon Ads API · getLocalizedKeywords · POST /keywords/localize Docs: https://advertising.amazon.com/API/docs/en-us/localization#tag/Keyword-Localization/operation/getLocalizedKeywords ## Call it MCP tool call: ```json { "name": "ads_get_localized_keywords", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_localized_keywords \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {localizeKeywordRequests: [{localizationKeyword: {keyword}}], sourceDetails: {countryCode \| marketplaceId \| locale}, targetDetails: {countryCodes \| marketplaceIds \| locales: [...]}} — targetDetails is ONE object of lists, not a list of objects. | ## Result - Amazon's payload in data.result. # ads_get_localized_products (https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_products) > Map products (ASIN or SKU) from the source marketplace to their equivalents in up to 10 target marketplaces — Sponsored Products only. Access: **READ** · toolset amazon_ads · family ads.localization A target fails when no matching product exists there or the advertiser cannot advertise it. Amazon Ads API · getLocalizedProducts · POST /products/localize Docs: https://advertising.amazon.com/API/docs/en-us/localization#tag/Product-Localization/operation/getLocalizedProducts ## Call it MCP tool call: ```json { "name": "ads_get_localized_products", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_localized_products \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {adType, entityType, sourceAdvertiserId, sourceCountryCode, targetDetails: [{countryCode, marketplaceId, advertiserId}] (advertiserId required on each), localizeProductRequests: [{product: {asin \| sku}}]}. | ## Result - Amazon's payload in data.result. # ads_get_localized_targeting_expression (https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_targeting_expression) > Translate targeting expressions between marketplaces. Access: **READ** · toolset amazon_ads · family ads.localization Amazon Ads API · getLocalizedTargetingExpression · POST /targetingExpression/localize Docs: https://advertising.amazon.com/API/docs/en-us/localization#tag/Targeting-Expression-Localization/operation/getLocalizedTargetingExpression ## Call it MCP tool call: ```json { "name": "ads_get_localized_targeting_expression", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_localized_targeting_expression \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {requests: [{targetingExpression: {expression: [{type, value}], isForNegativeTargeting: true\|false}}], sourceDetails: {countryCode \| marketplaceId}, targetDetailsList: [{countryCode \| marketplaceId}]}. | ## Result - Amazon's payload in data.result. # ads_get_manager_accounts (https://sellersheetai.com/docs/mcp-api/tools/ads_get_manager_accounts) > List Amazon Ads manager accounts — an agency or brand's umbrella over several advertiser accounts. Access: **READ** · toolset amazon_ads · family ads.manager-accounts Most sellers get an empty list; this is normal. Amazon Ads API · getManagerAccountsForUser · GET /managerAccounts Docs: https://advertising.amazon.com/API/docs/en-us/reference/1-0/managerAccount#tag/Manager-Accounts/operation/getManagerAccountsForUser ## Call it MCP tool call: ```json { "name": "ads_get_manager_accounts", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_manager_accounts \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | ## Result - Amazon's payload in data.result. - `data.result.managerAccounts[]` — {managerAccountId, managerAccountName, linkedAccounts[{accountId, accountName, accountType, profileId, dspAdvertiserId}]} — at most 50 linked accounts shown per manager. # ads_get_stream_subscription (https://sellersheetai.com/docs/mcp-api/tools/ads_get_stream_subscription) > Get one Amazon Ads event stream subscription by id. Access: **READ** · toolset amazon_ads · family ads.marketing-stream Amazon Ads API · GetStreamSubscription · GET /streams/subscriptions/{subscriptionId} Docs: https://advertising.amazon.com/API/docs/en-us/amazon-marketing-stream/openapi#tag/Stream-Subscription/operation/GetStreamSubscription ## Call it MCP tool call: ```json { "name": "ads_get_stream_subscription", "arguments": { "store": "myStore-US", "countryCode": "", "subscriptionId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_stream_subscription \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","subscriptionId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `subscriptionId` | string | yes | from ads_list_stream_subscriptions. | ## Result - Amazon's payload in data.result. # ads_get_targeting_clauses_validation_configs (https://sellersheetai.com/docs/mcp-api/tools/ads_get_targeting_clauses_validation_configs) > Validation rules Amazon enforces on targeting-clause create — allowed expression types, ASIN/category id formats, bid constraints. Access: **READ** · toolset amazon_ads · family ads.validation-configurations Amazon Ads API · getTargetingClausesValidationConfigs · POST /validationConfigurations/targetingClauses Docs: https://advertising.amazon.com/API/docs/en-us/validation-configuration#tag/Validation-Configurations-Retrieval/operation/getTargetingClausesValidationConfigs ## Call it MCP tool call: ```json { "name": "ads_get_targeting_clauses_validation_configs", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_targeting_clauses_validation_configs \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional context — countryCodesList (Amazon's codes: 'UK', not 'GB'), entityTypesList, programTypesList (see Body). Pass all three to get one context instead of the whole set; the answer is under data.result.targetingClausesValidationConfigs. | ## Result - Amazon's payload in data.result. ## Gotchas - The payload is large (~200KB+) — filter to the relevant section before writing it anywhere. # ads_list_ads_accounts (https://sellersheetai.com/docs/mcp-api/tools/ads_list_ads_accounts) > List the Amazon Ads accounts linked to this store's Ads credentials, each with its per-country profileId and entityId. Access: **READ** · toolset amazon_ads · family ads.accounts Amazon Ads API · ListAdsAccounts · POST /adsAccounts/list Docs: https://advertising.amazon.com/API/docs/en-us/account-management#tag/Account/operation/ListAdsAccounts ## Call it MCP tool call: ```json { "name": "ads_list_ads_accounts", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_ads_accounts \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional {maxResults, nextToken} — paging only; Amazon has no filters here. | ## Result - Amazon's payload in data.result. - `data.result.adsAccounts[]` — {adsAccountId, accountName, status, countryCodes, alternateIds[{countryCode, entityId, profileId}]}. - `data.result.nextToken` — pass back as body.nextToken. # ads_list_assets (https://sellersheetai.com/docs/mcp-api/tools/ads_list_assets) > Sponsored Brands: list a brand's Stores asset library — logos, images, lifestyle imagery, video — every asset tied to the supplied entity id. Access: **READ** · toolset amazon_ads · family ads.sb3 Amazon Ads API · listAssets · GET /stores/assets Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi#tag/Stores/operation/listAssets ## Call it MCP tool call: ```json { "name": "ads_list_assets", "arguments": { "store": "myStore-US", "countryCode": "", "brandEntityId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_assets \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","brandEntityId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `brandEntityId` | string | yes | the entityId from ads_list_ads_accounts (data.result.adsAccounts[].alternateIds[].entityId for this country) — NOT the brandEntityId from ads_get_brands, which typically returns empty here although Amazon's spec names it. | | `mediaType` | string | | optional filter; in practice Amazon only accepts 'brandLogo' (every other value, including 'image' from its own schema, 400s "MediaType X is not supported"). Omit it and filter client-side for the complete asset list. Allowed: brandLogo \| image. | ## Result - Amazon's payload in data.result. # ads_list_invoices (https://sellersheetai.com/docs/mcp-api/tools/ads_list_invoices) > List Amazon Ads billing invoices — billing period (fromDate/toDate), amount due, status and the document types available in the advertising console (INVOICE, CREDIT_NOTE), per invo Access: **READ** · toolset amazon_ads · family ads.billing ice. There is no download URL in the list. Amazon Ads API · getAdvertiserInvoices · GET /invoices Docs: https://advertising.amazon.com/API/docs/en-us/billing#tag/invoice/operation/getAdvertiserInvoices ## Call it MCP tool call: ```json { "name": "ads_list_invoices", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_invoices \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional query params — invoiceStatuses (a list of ISSUED, PAID_IN_PART, PAID_IN_FULL, WRITTEN_OFF), startDate / endDate (inclusive dates as YYYYMMDD — Amazon refuses dashes), count (max 100, default 10; not with cursor), cursor (the previous page's data.result.payload.nextCursor). | ## Result - Amazon's payload in data.result. - `data.result.payload.invoiceSummaries[]` — {id, status, fromDate, toDate, amountDue, ...} — id goes to ads_get_invoice (Amazon wraps this answer in `payload`). - `data.result.payload.nextCursor` — pass back as body.cursor. ## Params (Amazon schema) - invoiceStatuses: ISSUED | PAID_IN_FULL | PAID_IN_PART | WRITTEN_OFF (list) startDate: string endDate: string count: integer (0–100) cursor: string # ads_list_stream_subscriptions (https://sellersheetai.com/docs/mcp-api/tools/ads_list_stream_subscriptions) > List Amazon Ads event stream subscriptions — real-time notifications of campaign state changes, budget events, etc. Access: **READ** · toolset amazon_ads · family ads.marketing-stream Most accounts have an empty list; this is normal unless streaming was explicitly configured. Amazon Ads API · ListStreamSubscriptions · GET /streams/subscriptions Docs: https://advertising.amazon.com/API/docs/en-us/amazon-marketing-stream/openapi#tag/Stream-Subscription/operation/ListStreamSubscriptions ## Call it MCP tool call: ```json { "name": "ads_list_stream_subscriptions", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_stream_subscriptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `max_results` | integer · 1–5000 | | subscriptions per page; omit for Amazon's default. | | `starting_token` | string | | the cursor from the previous call's data.result.nextToken; omit for the first page. | ## Result - Amazon's payload in data.result. - `data.result.subscriptions` — the page. - `data.result.nextToken` — present when more remain — pass it as starting_token. # ads_product_metadata (https://sellersheetai.com/docs/mcp-api/tools/ads_product_metadata) > Get SP product metadata for ASINs or SKUs — title, brand, category, image and advertising eligibility, to check before creating product ads. Access: **READ** · toolset amazon_ads · family ads.product-selector Amazon Ads API · ProductMetadata · POST /product/metadata Docs: https://advertising.amazon.com/API/docs/en-us/product-metadata#tag/Product-Selector/operation/ProductMetadata ## Call it MCP tool call: ```json { "name": "ads_product_metadata", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_product_metadata \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | ONE of asins / skus / searchStr (max 300 ids; skus work for SP sellers only), adType (required when checkEligibility is true), checkItemDetails / checkEligibility optional bools. Amazon requires pageIndex and pageSize; the server fills 0 and 100 when omitted — pass pageSize up to 300, or page with pageIndex, for more than 100 items. | ## Result - Amazon's payload in data.result. ## Gotchas - data.result is an OBJECT, not a list — rows are under data.result.ProductMetadataList. # ads_update_stream_subscription (https://sellersheetai.com/docs/mcp-api/tools/ads_update_stream_subscription) > Archive an Amazon Ads event stream subscription — Amazon has no enable/disable for this resource, only ARCHIVED. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.marketing-stream Amazon Ads API · UpdateStreamSubscription · PUT /streams/subscriptions/{subscriptionId} Docs: https://advertising.amazon.com/API/docs/en-us/amazon-marketing-stream/openapi#tag/Stream-Subscription/operation/UpdateStreamSubscription Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_stream_subscription", "arguments": { "store": "myStore-US", "countryCode": "", "subscriptionId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_stream_subscription \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","subscriptionId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `subscriptionId` | string | yes | the subscription to archive. | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. | ## Result - Amazon's payload in data.result. # ads_amc_turn_on (https://sellersheetai.com/docs/mcp-api/tools/ads_amc_turn_on) > Turn Amazon Marketing Cloud (AMC) on for this store's Ads account in one country: finds the advertiser's AMC instance — creating it the first time — and remembers it. Access: **WRITE** · toolset amazon_ads · family ads.amc-administration Every other AMC tool needs it on; get_user_context's amc says, per store and country, whether it is. Ask the seller before the first call: an AMC instance cannot be deleted. Calling it again is safe; when AMC is on it only reads. Amazon Ads API · listInstances · GET /amc/instances Amazon Ads API · ListAdsAccounts · POST /adsAccounts/list Docs: https://advertising.amazon.com/API/docs/en-us/amc-administration#tag/Instance-management/operation/listInstances Docs: https://advertising.amazon.com/API/docs/en-us/account-management#tag/Account/operation/ListAdsAccounts Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_amc_turn_on", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_amc_turn_on \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). One AMC instance per country of the Ads account. | ## Result - the orchestrated result described below. - `data.instance_id` — the store's AMC instance. - `data.creation_status` — COMPLETED, or IN_PROGRESS while Amazon builds it (up to 5 minutes; call again to finish). - `data.already_on` — true when nothing was created or looked up at Amazon. ## Gotchas - Gate: commit — the first call creates an instance at Amazon that cannot be removed. - The Amazon login that connected Ads must accept the AMC terms once per region (NA, EU, FE) at https://advertising.amazon.com/marketing-cloud; until then the call is refused with error_code amc_terms_not_accepted. Only the seller can do it. - Amazon offers AMC to advertisers with campaigns live in the last 28 days. # ads_create_lookalike_audience (https://sellersheetai.com/docs/mcp-api/tools/ads_create_lookalike_audience) > Create an AMC lookalike audience: Amazon models shoppers similar to a seed the AMC query selects (for example the store's ad clickers) and activates them in the store's sponsored-a Access: **WRITE** · toolset amazon_ads · family ads.amc-audiences ds account. Ask the seller first. Amazon Ads API · createLookalikeAudience · POST /amc/audiences/lookalike Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience-lookalike/operation/createLookalikeAudience Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_lookalike_audience", "arguments": { "store": "myStore-US", "country_code": "", "audience_name": "", "sql_query": "", "time_window_start": "", "time_window_end": "", "lookalike_audience_expected_reach": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_lookalike_audience \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","audience_name":"","sql_query":"","time_window_start":"","time_window_end":"","lookalike_audience_expected_reach":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audience_name` | string | yes | shown in the Ads console; use a new name for each audience. | | `sql_query` | string | yes | AMC SQL over the *_for_audiences tables whose SELECT returns user_id — the seed, 500 to 500,000 shoppers (count it first with ads_create_workflow_execution). | | `time_window_start` | string · date-time | yes | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `time_window_end` | string · date-time | yes | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `lookalike_audience_expected_reach` | string | yes | how far from the seed to reach. Allowed: MOST_SIMILAR \| SIMILAR \| BALANCED \| BROAD \| MOST_BROAD. MOST_SIMILAR gives the smallest, closest audience (about 500K–1M shoppers in Europe and the Americas, 200K–300K in Asia); MOST_BROAD the largest. | | `audience_description` | string | | optional text shown with the audience. | | `time_window_relative` | boolean | | true to move the seed's window forward at each refresh. | | `parameter_values` | object | | values for parameters the SQL declares. | ## Result - `data.audience_execution_id` — poll it with ads_get_query_based_audience_by_audience_execution_id. - `data.status` — PENDING at first. ## Body (Amazon schema) - advertiserId*: string audienceDescription: string audienceName*: string countryCode: AE | AU | BR | CA | DE | ES | FR | IN | IT | JP | MX | NL | SA | SE | TR | UK | US inputParameters: [{columnType: DIMENSION | METRIC, dataType*: string | {elementDataType, elementNullable, type} | {precision, type} | {keyDataType, type, valueDataType, valueNullable} | {fields, type}, defaultValue, description, name*}] (max 100) inputParameters.dataType.type: ARRAY | DECIMAL | MAP | STRUCT parameterValues: object query: string refreshRateDays: integer (7–21; default 21) timeWindowEnd*: string (date-time) timeWindowRelative: boolean (default False) timeWindowStart*: string (date-time) workflowId: string lookalikeAudienceExpectedReach*: string ## Gotchas - Gate: commit — the audience goes to the seller's ads account and cannot be changed. - Only the lookalike is created, not a copy of the seed. - A seed that clears 500 in an AMC count can still FAIL after about 20 minutes with "did - not find a sufficient match for seed users" (measured: 716 ad clickers over 28 days) — - Amazon keeps only shoppers it can match; seed broadly (reach, or a longer window). # ads_create_query_based_audience (https://sellersheetai.com/docs/mcp-api/tools/ads_create_query_based_audience) > Create an AMC rule-based audience: the shoppers an AMC query selects become an audience in the store's sponsored-ads account — a Sponsored Products / Brands bid adjustment (bidAdju Access: **WRITE** · toolset amazon_ads · family ads.amc-audiences stments.audienceBidAdjustments in ads_update_campaign) or a Sponsored Display target. Ask the seller first: an audience cannot be edited once created. Amazon Ads API · createQueryBasedAudience · POST /amc/audiences/query Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/createQueryBasedAudience Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_query_based_audience", "arguments": { "store": "myStore-US", "country_code": "", "audience_name": "", "sql_query": "", "time_window_start": "", "time_window_end": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_query_based_audience \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","audience_name":"","sql_query":"","time_window_start":"","time_window_end":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audience_name` | string | yes | shown in the Ads console; use a new name for each audience. | | `sql_query` | string | yes | AMC SQL over the *_for_audiences tables (sponsored_ads_traffic_for_audiences, conversions_for_audiences, …) whose SELECT returns user_id. | | `time_window_start` | string · date-time | yes | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `time_window_end` | string · date-time | yes | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `audience_description` | string | | optional text shown with the audience. | | `time_window_relative` | boolean | | true to move the window forward at each refresh (recent shoppers). | | `parameter_values` | object | | values for parameters the SQL declares. | ## Result - `data.audience_execution_id` — poll it with ads_get_query_based_audience_by_audience_execution_id. - `data.status` — PENDING at first. ## Body (Amazon schema) - advertiserId*: string audienceDescription: string audienceName*: string countryCode: AE | AU | BR | CA | DE | ES | FR | IN | IT | JP | MX | NL | SA | SE | TR | UK | US inputParameters: [{columnType: DIMENSION | METRIC, dataType*: string | {elementDataType, elementNullable, type} | {precision, type} | {keyDataType, type, valueDataType, valueNullable} | {fields, type}, defaultValue, description, name*}] (max 100) inputParameters.dataType.type: ARRAY | DECIMAL | MAP | STRUCT parameterValues: object query: string refreshRateDays: integer (0–21; default 21) timeWindowEnd*: string (date-time) timeWindowRelative: boolean (default False) timeWindowStart*: string (date-time) workflowId: string ## Gotchas - Gate: commit — the audience goes to the seller's ads account and cannot be changed. - The advertiser is the store's AMC instance's own; it is not a parameter. - Amazon refreshes the audience itself; one left unused in campaigns is refreshed less often and deactivated after about 100 days. ## Workflow - 1. Count the shoppers first with ads_create_workflow_execution (SELECT COUNT(DISTINCT user_id) … over the same tables without _for_audiences); Amazon fails an audience under 2,000 (aim for 2,500). 2. Create it here; poll ads_get_query_based_audience_by_audience_execution_id. 3. When it SUCCEEDED, find its audienceId with ads_list_targetable_entities. # ads_create_schedule (https://sellersheetai.com/docs/mcp-api/tools/ads_create_schedule) > Run a saved AMC workflow on a schedule — Daily or Weekly — on the store's instance. Access: **WRITE** · toolset amazon_ads · family ads.amc-reporting Each run appears in ads_list_workflow_executions (filter by its workflow_id). Ask the seller first. Amazon Ads API · createSchedule · POST /amc/reporting/{instanceId}/schedules Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Schedules/operation/createSchedule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_schedule", "arguments": { "store": "myStore-US", "country_code": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_schedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. scheduleId, workflowId (a saved workflow) and aggregationPeriod are needed; scheduleEnabled false saves it paused. The marketplace is the store's. | ## Result - `data.schedule_id` — the schedule's id. - `data.workflow_id` — the workflow it runs. ## Gotchas - A run's result can be downloaded for about a day; read each run in time. - A synced report's schedule or workflow (data.synced_ids of the two list tools) is refused. # ads_create_workflow (https://sellersheetai.com/docs/mcp-api/tools/ads_create_workflow) > Save an AMC query on the store's instance under an id of your choosing, so a schedule (ads_create_schedule) can run it every day or week. Access: **WRITE** · toolset amazon_ads · family ads.amc-reporting Ask the seller first. Amazon Ads API · createWorkflow · POST /amc/reporting/{instanceId}/workflows Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflows/operation/createWorkflow Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_workflow", "arguments": { "store": "myStore-US", "country_code": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_workflow \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. workflowId (letters, digits, '_', '-', '.') and sqlQuery are required; the SQL is the same AMC SQL as ads_create_workflow_execution's. | ## Result - `data.workflow_id` — the saved workflow's id. ## Gotchas - A synced report's workflow (data.synced_ids of ads_list_workflows) is refused. - Check the SQL first with ads_create_workflow_execution (dry_run true). # ads_create_workflow_execution (https://sellersheetai.com/docs/mcp-api/tools/ads_create_workflow_execution) > Run an AMC SQL query over the store's AMC data (an ad-hoc execution). Access: **READ** · toolset amazon_ads · family ads.amc-reporting Answers at once with an execution id; poll ads_get_workflow_execution, then read the rows with ads_get_workflow_execution_download_urls. Check a new query with dry_run first: AMC validates it in seconds without running it. Amazon Ads API · createWorkflowExecution · POST /amc/reporting/{instanceId}/workflowExecutions Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/createWorkflowExecution ## Call it MCP tool call: ```json { "name": "ads_create_workflow_execution", "arguments": { "store": "myStore-US", "country_code": "", "sql_query": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_workflow_execution \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","sql_query":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `sql_query` | string | yes | AMC SQL; line breaks are joined into one line for Amazon. The final SELECT must aggregate (GROUP BY dimensions, SUM / COUNT(DISTINCT user_id)). | | `time_window_type` | string | | which days of data the query reads; EXPLICIT needs time_window_start and time_window_end. Amazon's default is MOST_RECENT_DAY. Allowed: ALL \| CURRENT_MONTH \| EXPLICIT \| MOST_RECENT_DAY \| MOST_RECENT_WEEK \| PREVIOUS_MONTH. Allowed: ALL \| CURRENT_MONTH \| EXPLICIT \| MOST_RECENT_DAY \| MOST_RECENT_WEEK \| PREVIOUS_MONTH. | | `time_window_start` | string | | EXPLICIT only — 'YYYY-MM-DDTHH:MM:SS'. | | `time_window_end` | string | | EXPLICIT only — 'YYYY-MM-DDTHH:MM:SS', exclusive. | | `time_window_time_zone` | string | | the window's IANA zone, e.g. 'Asia/Dubai' (the marketplace's own day); default UTC. | | `parameter_values` | object | | values for parameters the SQL declares. | | `dry_run` | boolean | | true to validate the SQL and the time window only — nothing is computed, no Amazon quota is used; the run then ends SUCCEEDED (valid, no rows) or REJECTED with Amazon's reason. | ## Result - `data.workflow_execution_id` — pass to ads_get_workflow_execution. - `data.status` — PENDING at first. ## Body (Amazon schema) - timeWindowType: ALL | CURRENT_MONTH | EXPLICIT | MOST_RECENT_DAY | MOST_RECENT_WEEK | PREVIOUS_MONTH + 15 more: additionalAcrResultsReceivers, advertisers, disableAggregationControls, dryRun, maxCertifiedTime, maxDimensionTime, parameterValues, requireSyntheticData, skipPublish, timeWindowEnd, timeWindowStart, timeWindowTimeZone, workflow, workflowExecutionTimeoutSeconds, workflowId Full schema: the Docs link above. ## Gotchas - Gate: none — a report request; it reads the advertiser's own AMC data. - AMC runs at most 10 queries at a time per instance; wait for one to finish before starting more. - For numbers that no longer change, query amazon_attributed_events_by_conversion_time: its window is complete once it ends. The by_traffic_time table (the SP console's view) keeps adding purchases for up to 30 days after the window. - A SQL keyword as a column alias (`hour`, `date`) is REJECTED as unparsable. - Outputting user_id or another VERY_HIGH column is REJECTED. - spend is in microcents: divide by 100,000,000 for the currency. - For Sponsored Products the detail_page_view / add_to_cart columns of the attributed-events tables are 0; join the clickers in sponsored_ads_traffic to `conversions` (event_subtype 'shoppingCart') on user_id instead. # ads_delete_query_based_audience_by_audience_execution_id (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_query_based_audience_by_audience_execution_id) > Delete an AMC audience (FAILED or SUCCEEDED) and its segment in the sponsored-ads account. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-audiences Ask the seller first: it cannot be undone. Amazon Ads API · deleteQueryBasedAudienceByAudienceExecutionId · DELETE /amc/audiences/query/{audienceExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/deleteQueryBasedAudienceByAudienceExecutionId Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_query_based_audience_by_audience_execution_id", "arguments": { "store": "myStore-US", "country_code": "", "audience_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_query_based_audience_by_audience_execution_id \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","audience_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audience_execution_id` | string | yes | the audience's data.audience_execution_id. | ## Result - `data.deleted` — true when Amazon removed it. ## Gotchas - Gate: commit — irreversible. - Take it out of every campaign first: Amazon refuses an audience it sees in use, but only on a best-effort check. # ads_delete_schedule (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_schedule) > Delete an AMC schedule from the store's instance; its workflow stays saved. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-reporting Ask the seller first. Amazon Ads API · deleteSchedule · DELETE /amc/reporting/{instanceId}/schedules/{scheduleId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Schedules/operation/deleteSchedule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_schedule", "arguments": { "store": "myStore-US", "country_code": "", "schedule_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_schedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","schedule_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `schedule_id` | string | yes | the schedule's id. | ## Result - `data.deleted` — true when Amazon removed it. ## Gotchas - A synced report's schedule (data.synced_ids of ads_list_schedules) is refused: SellerSheet removes its own when the store leaves it. # ads_delete_workflow (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_workflow) > Delete a saved AMC query from the store's instance. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-reporting Ask the seller first. Amazon Ads API · deleteWorkflow · DELETE /amc/reporting/{instanceId}/workflows/{workflowId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflows/operation/deleteWorkflow Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_workflow", "arguments": { "store": "myStore-US", "country_code": "", "workflow_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_workflow \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_id` | string | yes | the saved workflow's id. | ## Result - `data.deleted` — true when Amazon removed it. ## Gotchas - Its past runs stay, but it cannot be run by id again. - Delete the schedules that run it first (ads_list_schedules names their workflowId). - A synced report's workflow (data.synced_ids of ads_list_workflows) is refused. # ads_get_all_query_based_audiences_by_instance_id (https://sellersheetai.com/docs/mcp-api/tools/ads_get_all_query_based_audiences_by_instance_id) > List the AMC audiences of the store's instance — rule-based and lookalike, made by these tools or in the AMC console — with their status and size. Access: **READ** · toolset amazon_ads · family ads.amc-audiences Amazon Ads API · getAllQueryBasedAudiencesByInstanceId · GET /amc/audiences/query Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/getAllQueryBasedAudiencesByInstanceId ## Call it MCP tool call: ```json { "name": "ads_get_all_query_based_audiences_by_instance_id", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_all_query_based_audiences_by_instance_id \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `max_results` | integer · 1–100 | | audiences per page, 1–100 (Amazon's default 100). | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.audiences[]` — {audience_execution_id, audience_name, audience_type (RULE_BASED | LOOKALIKE), status (PENDING | RUNNING | SUCCEEDED | FAILED | DEACTIVATED), status_reason, audience_count, deletable, create_time, last_refreshed_time, query}. - `data.nextToken` — set when more audiences remain. # ads_get_data_source (https://sellersheetai.com/docs/mcp-api/tools/ads_get_data_source) > One AMC table's columns, each with its type and privacy class — read it before writing SQL against a table you have not used. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Amazon Ads API · getDataSource · GET /amc/reporting/{instanceId}/dataSources/{dataSourceId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Data-sources/operation/getDataSource ## Call it MCP tool call: ```json { "name": "ads_get_data_source", "arguments": { "store": "myStore-US", "country_code": "", "data_source_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_data_source \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","data_source_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `data_source_id` | string | yes | the table name from ads_list_data_sources, e.g. 'sponsored_ads_traffic' or 'conversions'. | ## Result - `data.columns[]` — {name, data_type, column_type (DIMENSION | METRIC), sensitivity (NONE | LOW | MEDIUM | HIGH | VERY_HIGH | INTERNAL), min_distinct_users, description}. ## Gotchas - A VERY_HIGH column (user_id, ip_address) can never be in the final SELECT — use it inside COUNT(DISTINCT …) or a join only. - A result row whose dimension values cover fewer shoppers than min_distinct_users comes back with those dimensions blank; its metrics stay. # ads_get_query_based_audience_by_audience_execution_id (https://sellersheetai.com/docs/mcp-api/tools/ads_get_query_based_audience_by_audience_execution_id) > One AMC audience's status — poll it after creating one. Access: **READ** · toolset amazon_ads · family ads.amc-audiences SUCCEEDED means Amazon has sent it to the store's sponsored-ads account, where it appears within 2–24 hours; ads_list_targetable_entities then gives the audienceId campaigns take. Amazon Ads API · getQueryBasedAudienceByAudienceExecutionId · GET /amc/audiences/query/{audienceExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/getQueryBasedAudienceByAudienceExecutionId ## Call it MCP tool call: ```json { "name": "ads_get_query_based_audience_by_audience_execution_id", "arguments": { "store": "myStore-US", "country_code": "", "audience_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_query_based_audience_by_audience_execution_id \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","audience_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audience_execution_id` | string | yes | data.audience_execution_id from a create, or from ads_get_all_query_based_audiences_by_instance_id. | ## Result - `data.audience` — {audience_execution_id, audience_name, audience_type, status, status_reason, audience_count, deletable, time_window_start, time_window_end, query}. ## Gotchas - FAILED comes back as an error notification carrying Amazon's status_reason — most often fewer than 2,000 shoppers, or a table without the _for_audiences suffix. Fix it with ads_update_query_based_audience_by_audience_execution_id or delete it. - DEACTIVATED: the audience has no members any more (unused for long, or refresh off). # ads_get_schedule (https://sellersheetai.com/docs/mcp-api/tools/ads_get_schedule) > Read one AMC schedule on the store's instance: the workflow it runs, its period and whether it is enabled. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Amazon Ads API · getSchedule · GET /amc/reporting/{instanceId}/schedules/{scheduleId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Schedules/operation/getSchedule ## Call it MCP tool call: ```json { "name": "ads_get_schedule", "arguments": { "store": "myStore-US", "country_code": "", "schedule_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_schedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","schedule_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `schedule_id` | string | yes | the schedule's id (data.schedules[].scheduleId). | ## Result - `data.schedule` — Amazon's schedule — {scheduleId, workflowId, aggregationPeriod, aggregationStartDay, aggregationHourUtc, scheduleEnabled, …}. # ads_get_workflow (https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow) > Read one saved AMC query (workflow) on the store's instance: its SQL, parameters and output settings. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Amazon Ads API · getWorkflow · GET /amc/reporting/{instanceId}/workflows/{workflowId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflows/operation/getWorkflow ## Call it MCP tool call: ```json { "name": "ads_get_workflow", "arguments": { "store": "myStore-US", "country_code": "", "workflow_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_workflow \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_id` | string | yes | the saved workflow's id (data.workflows[].workflowId). | ## Result - `data.workflow` — Amazon's workflow — {workflowId, sqlQuery, inputParameters, …}. # ads_get_workflow_execution (https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow_execution) > The status of an AMC query from ads_create_workflow_execution. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Poll every 15–30 seconds; most queries finish within two minutes. Amazon Ads API · getWorkflowExecution · GET /amc/reporting/{instanceId}/workflowExecutions/{workflowExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/getWorkflowExecution ## Call it MCP tool call: ```json { "name": "ads_get_workflow_execution", "arguments": { "store": "myStore-US", "country_code": "", "workflow_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_workflow_execution \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_execution_id` | string | yes | data.workflow_execution_id from ads_create_workflow_execution. | ## Result - `data.status` — SUCCEEDED when the rows are ready; PENDING or RUNNING while AMC works; REJECTED when AMC refused the SQL (a privacy rule or a syntax error — Amazon answers it although its spec omits it), FAILED or CANCELLED otherwise. - `data.status_reason` — Amazon's sentence when REJECTED or FAILED — fix the SQL by it. - `data.output_columns[]` — {name, column_type, data_type} once validated. ## Params (Amazon schema) - instanceId*: string workflowExecutionId*: string includeWorkflow: boolean # ads_get_workflow_execution_download_urls (https://sellersheetai.com/docs/mcp-api/tools/ads_get_workflow_execution_download_urls) > The finished result of an AMC query as rows: the tool downloads Amazon's result file and returns its rows (no download links). Access: **READ** · toolset amazon_ads · family ads.amc-reporting Only for a SUCCEEDED query. Amazon Ads API · getWorkflowExecutionDownloadUrls · GET /amc/reporting/{instanceId}/workflowExecutions/{workflowExecutionId}/downloadUrls Amazon Ads API · getWorkflowExecution · GET /amc/reporting/{instanceId}/workflowExecutions/{workflowExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/getWorkflowExecutionDownloadUrls Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/getWorkflowExecution ## Call it MCP tool call: ```json { "name": "ads_get_workflow_execution_download_urls", "arguments": { "store": "myStore-US", "country_code": "", "workflow_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_workflow_execution_download_urls \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_execution_id` | string | yes | data.workflow_execution_id from ads_create_workflow_execution. | | `max_rows` | integer | | rows to return, 1–10000 (default 1000); every row is still counted in data.row_count. | ## Result - the orchestrated result described below. - `data.columns` — the result's column names. - `data.rows[]` — one dict per row; every value is a string, as in Amazon's CSV. - `data.row_count` — the result's rows; data.returned_rows: the rows in data.rows. - `data.row_count_complete` — false when the result is over 20 MB — row_count then counts only the rows read; aggregate more and run it again. - `data.truncated` — true when data.rows holds fewer rows than the result. - `data.hidden_rows` — rows, of the whole result, whose group columns are blank — AMC hides a group with too few shoppers (an empty value looks the same); their metrics still add up; group more broadly to see them. ## Gotchas - AMC `purchases` counts the advertised product only; `total_purchases` adds the brand's other products (what the Ads reports call purchases). # ads_list_data_sources (https://sellersheetai.com/docs/mcp-api/tools/ads_list_data_sources) > List the AMC tables the store's instance can query — sponsored_ads_traffic, conversions, amazon_attributed_events_by_conversion_time and the rest — with their column counts. Access: **READ** · toolset amazon_ads · family ads.amc-reporting ads_get_data_source gives a table's columns and privacy classes. Amazon Ads API · listDataSources · GET /amc/reporting/{instanceId}/dataSources Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Data-sources/operation/listDataSources ## Call it MCP tool call: ```json { "name": "ads_list_data_sources", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_data_sources \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `limit` | integer | | tables per page, 1–100 (Amazon's default 100). | ## Result - `data.data_sources[]` — {data_source_id, description, columns}. - `data.nextToken` — set when more tables remain. # ads_list_schedules (https://sellersheetai.com/docs/mcp-api/tools/ads_list_schedules) > List the AMC schedules on the store's instance — each runs a saved workflow Daily or Weekly. Access: **READ** · toolset amazon_ads · family ads.amc-reporting SellerSheet's synced reports appear too (named in data.synced_ids — read-only here). Amazon Ads API · listSchedules · GET /amc/reporting/{instanceId}/schedules Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Schedules/operation/listSchedules ## Call it MCP tool call: ```json { "name": "ads_list_schedules", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_schedules \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `limit` | integer | | schedules per page. | ## Result - `data.schedules[]` — Amazon's schedules — {scheduleId, workflowId, aggregationPeriod, scheduleEnabled, …}. - `data.synced_ids[]` — the schedules that are SellerSheet's synced reports. - `data.nextToken` — set when more schedules remain. # ads_list_targetable_entities (https://sellersheetai.com/docs/mcp-api/tools/ads_list_targetable_entities) > List what a sponsored-ads campaign can target in the store's Ads account (Amazon's Discovery API). Access: **READ** · toolset amazon_ads · family ads.targetable-entities By default it lists the store's AMC audiences — the audienceId a Sponsored Products / Brands audience bid adjustment or a Sponsored Display target takes. Amazon Ads API · ListTargetableEntities · POST /targetableEntities/list Docs: https://advertising.amazon.com/API/docs/en-us/targetable-entities#operation/ListTargetableEntities ## Call it MCP tool call: ```json { "name": "ads_list_targetable_entities", "arguments": { "store": "myStore-US", "country_code": "", "ad_product": "SPONSORED_BRANDS" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_targetable_entities \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","ad_product":"SPONSORED_BRANDS"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `ad_product` | string | yes | the campaign type the entities are for. Allowed: SPONSORED_BRANDS \| SPONSORED_DISPLAY \| SPONSORED_PRODUCTS \| SPONSORED_TELEVISION. Allowed: SPONSORED_BRANDS \| SPONSORED_DISPLAY \| SPONSORED_PRODUCTS \| SPONSORED_TELEVISION. | | `target_type_filter` | string[] | | entity types; default ['AUDIENCE']. Allowed: AUDIENCE \| CONTENT_CATEGORY \| PRODUCT_CATEGORY \| PRODUCT_CATEGORY_AUDIENCE. Allowed: AUDIENCE \| CONTENT_CATEGORY \| PRODUCT_CATEGORY \| PRODUCT_CATEGORY_AUDIENCE. | | `paths_filter` | object[] | | taxonomy paths to list under; default [['Audience Category', 'Custom-built', 'AMC']] (the AMC audiences). | | `search_query_filter` | string | | words to search the entities for. | | `max_results` | integer · 1–250 | | entities per page. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `locale` | string | | names in this locale, e.g. 'en_AE'. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| en_ZA \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| en_ZA \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. | ## Result - `data.targetable_entities[]` — Amazon's entities — {audienceId, audienceResolved, path, targetType, …}. - `data.nextToken` — set when more entities remain. ## Body (Amazon schema) - adProduct*: SPONSORED_BRANDS | SPONSORED_DISPLAY | SPONSORED_PRODUCTS | SPONSORED_TELEVISION locale: ar_AE | de_DE | en_AE | en_AU | en_CA | en_GB | en_IN | en_SG | en_US | en_ZA | es_ES | es_MX | fr_CA | fr_FR | hi_IN | it_IT | ja_JP | ko_KR | nl_NL | pl_PL | pt_BR | sv_SE | ta_IN | th_TH | tr_TR | vi_VN | zh_CN maxResults: number (1–250) nextToken: string parentBrowseNodeIdFilter: [string] (max 1000) pathsFilter: [[string] (max 10)] (max 10) productCategoryIdFilter: [string] (max 1000) searchQueryFilter: string targetTypeFilter: [AUDIENCE | CONTENT_CATEGORY | PRODUCT_CATEGORY | PRODUCT_CATEGORY_AUDIENCE] (max 4) ## Gotchas - An AMC audience appears here 2–24 hours after it SUCCEEDED. # ads_list_targetable_entity_paths (https://sellersheetai.com/docs/mcp-api/tools/ads_list_targetable_entity_paths) > List the taxonomy paths under which ads_list_targetable_entities finds entities (Amazon's Discovery API): the direct sub-paths of each path in paths_filter, or the top level. Access: **READ** · toolset amazon_ads · family ads.targetable-entities Amazon Ads API · ListTargetableEntityPaths · POST /targetableEntities/paths/list Docs: https://advertising.amazon.com/API/docs/en-us/targetable-entities#operation/ListTargetableEntityPaths ## Call it MCP tool call: ```json { "name": "ads_list_targetable_entity_paths", "arguments": { "store": "myStore-US", "country_code": "", "ad_product": "SPONSORED_BRANDS" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_targetable_entity_paths \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","ad_product":"SPONSORED_BRANDS"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `ad_product` | string | yes | the campaign type the paths are for. Allowed: SPONSORED_BRANDS \| SPONSORED_DISPLAY \| SPONSORED_PRODUCTS \| SPONSORED_TELEVISION. Allowed: SPONSORED_BRANDS \| SPONSORED_DISPLAY \| SPONSORED_PRODUCTS \| SPONSORED_TELEVISION. | | `paths_filter` | object[] | | paths to list the children of, each a list of names, e.g. [['Audience Category']]; omit for the top level. | | `locale` | string | | names in this locale, e.g. 'en_AE'. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| en_ZA \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| en_ZA \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. | ## Result - `data.paths[]` — the sub-paths, each a list of names — pass one to ads_list_targetable_entities' paths_filter. - `data.total_results` — how many paths Amazon has there. # ads_list_workflow_executions (https://sellersheetai.com/docs/mcp-api/tools/ads_list_workflow_executions) > List the AMC queries run on the store's instance — from these tools, the AMC console or a schedule — newest first, with their status. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Use it to find a run whose id you no longer have, or to see how many are still running before starting more. Amazon does not list dry runs. Amazon Ads API · listWorkflowExecutions · GET /amc/reporting/{instanceId}/workflowExecutions Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/listWorkflowExecutions ## Call it MCP tool call: ```json { "name": "ads_list_workflow_executions", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_workflow_executions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `min_creation_time` | string | | runs created at or after 'YYYY-MM-DDTHH:MM:SS'. Default: 7 days ago (UTC) when workflow_id is not given either — Amazon needs one of the two. | | `max_creation_time` | string | | runs created before 'YYYY-MM-DDTHH:MM:SS'. | | `time_zone` | string | | the IANA zone of the two times, e.g. 'Asia/Dubai'; default UTC. | | `workflow_id` | string | | only the runs of this saved workflow. | | `include_cancelled` | boolean | | true to list cancelled runs too. | | `include_workflow` | boolean | | true to add each run's SQL (data.executions[].sql_query). | | `sort_ascending` | boolean | | true for oldest first. | | `limit` | integer | | runs per page, 1–100. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.executions[]` — {workflow_execution_id, status, status_reason, workflow_id, create_time, time_window_start, time_window_end, execution_seconds, sql_query}. - `data.min_creation_time` — the start of the period listed. - `data.nextToken` — set when more runs remain. # ads_list_workflows (https://sellersheetai.com/docs/mcp-api/tools/ads_list_workflows) > List the saved AMC queries (workflows) on the store's instance: the seller's own, and SellerSheet's synced report templates (named in data.synced_ids — read-only here; their rows a Access: **READ** · toolset amazon_ads · family ads.amc-reporting re in the rpt_amc_* tables, see list_amc_templates). Amazon Ads API · listWorkflows · GET /amc/reporting/{instanceId}/workflows Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflows/operation/listWorkflows ## Call it MCP tool call: ```json { "name": "ads_list_workflows", "arguments": { "store": "myStore-US", "country_code": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_workflows \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `limit` | integer | | workflows per page. | ## Result - `data.workflows[]` — Amazon's saved workflows — {workflowId, sqlQuery, …}. - `data.synced_ids[]` — the workflows that are SellerSheet's synced reports. - `data.nextToken` — set when more workflows remain. # ads_update_query_based_audience_by_audience_execution_id (https://sellersheetai.com/docs/mcp-api/tools/ads_update_query_based_audience_by_audience_execution_id) > Fix a FAILED AMC audience and run it again — Amazon accepts an update on a FAILED audience only; a working one cannot be changed (create a new one). Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-audiences Pass only what changes: the name, type and description stay as they are. Amazon Ads API · updateQueryBasedAudienceByAudienceExecutionId · PUT /amc/audiences/query/{audienceExecutionId} Amazon Ads API · getQueryBasedAudienceByAudienceExecutionId · GET /amc/audiences/query/{audienceExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/updateQueryBasedAudienceByAudienceExecutionId Docs: https://advertising.amazon.com/API/docs/en-us/amc-rba#tag/Rule-based-audience/operation/getQueryBasedAudienceByAudienceExecutionId Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_query_based_audience_by_audience_execution_id", "arguments": { "store": "myStore-US", "country_code": "", "audience_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_query_based_audience_by_audience_execution_id \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","audience_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audience_execution_id` | string | yes | the FAILED audience's data.audience_execution_id. | | `sql_query` | string | | the corrected AMC SQL (still over *_for_audiences tables, SELECT user_id). | | `time_window_start` | string · date-time | | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `time_window_end` | string · date-time | | UTC 'YYYY-MM-DDTHH:MM:SSZ'. | | `time_window_relative` | boolean | | true to move the window forward at each refresh. | | `parameter_values` | object | | values for parameters the SQL declares. | | `lookalike_audience_expected_reach` | string | | a lookalike's reach. Allowed: MOST_SIMILAR \| SIMILAR \| BALANCED \| BROAD \| MOST_BROAD. | ## Result - the orchestrated result described below. - `data.audience` — the audience as updated, status PENDING again. ## Gotchas - Refused before any change when the audience is not FAILED. # ads_update_schedule (https://sellersheetai.com/docs/mcp-api/tools/ads_update_schedule) > Replace an AMC schedule on the store's instance — e.g. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-reporting pause it (scheduleEnabled false) or change its period. Amazon replaces the whole schedule: send every field to keep (read it first with ads_get_schedule). Ask the seller first. Amazon Ads API · updateSchedule · PUT /amc/reporting/{instanceId}/schedules/{scheduleId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Schedules/operation/updateSchedule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_schedule", "arguments": { "store": "myStore-US", "country_code": "", "schedule_id": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_schedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","schedule_id":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `schedule_id` | string | yes | the schedule's id. | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema. Its scheduleId is always schedule_id; the marketplace is the store's. | ## Result - `data.schedule_id` — the schedule's id. ## Gotchas - A synced report's schedule or workflow (data.synced_ids of the two list tools) is refused. # ads_update_workflow (https://sellersheetai.com/docs/mcp-api/tools/ads_update_workflow) > Replace a saved AMC query on the store's instance. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.amc-reporting Amazon replaces the whole workflow: send every field to keep (read it first with ads_get_workflow). Ask the seller first. Amazon Ads API · updateWorkflow · PUT /amc/reporting/{instanceId}/workflows/{workflowId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflows/operation/updateWorkflow Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_workflow", "arguments": { "store": "myStore-US", "country_code": "", "workflow_id": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_workflow \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_id":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_id` | string | yes | the saved workflow's id. | | `body` | object | yes | the request body — its fields, enums and required marks are in this parameter's schema; sqlQuery is required. Its workflowId is always workflow_id. | ## Result - `data.workflow_id` — the workflow's id. ## Gotchas - Every schedule that runs the workflow runs the new SQL from then on. - A synced report's workflow (data.synced_ids of ads_list_workflows) is refused. # ads_update_workflow_execution (https://sellersheetai.com/docs/mcp-api/tools/ads_update_workflow_execution) > Cancel an AMC query that is still PENDING or RUNNING — Amazon's UpdateWorkflowExecution, whose one documented change is the status CANCELLED. Access: **READ** · toolset amazon_ads · family ads.amc-reporting Use it to stop a query started by mistake or one that runs too long; it frees one of the instance's 10 parallel runs. Amazon Ads API · UpdateWorkflowExecution · PUT /amc/reporting/{instanceId}/workflowExecutions/{workflowExecutionId} Amazon Ads API · getWorkflowExecution · GET /amc/reporting/{instanceId}/workflowExecutions/{workflowExecutionId} Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/UpdateWorkflowExecution Docs: https://advertising.amazon.com/API/docs/en-us/amc-reporting#tag/Workflow-executions/operation/getWorkflowExecution ## Call it MCP tool call: ```json { "name": "ads_update_workflow_execution", "arguments": { "store": "myStore-US", "country_code": "", "workflow_execution_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_workflow_execution \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","country_code":"","workflow_execution_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `country_code` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `workflow_execution_id` | string | yes | data.workflow_execution_id from ads_create_workflow_execution or ads_list_workflow_executions. | ## Result - the orchestrated result described below. - `data.status` — CANCELLED. ## Gotchas - Gate: none — it stops a report request; nothing the seller owns changes. - A run that has already finished (SUCCEEDED, FAILED, REJECTED) cannot be cancelled: Amazon answers 400. # ads_create_associated_budget_rules_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_create_associated_budget_rules_for_campaigns) > Attach budget rules to one campaign. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Afterwards verify with ads_list_associated_budget_rules_for_campaigns. Amazon Ads API · CreateAssociatedBudgetRulesForSPCampaigns · POST /sp/campaigns/{campaignId}/budgetRules Amazon Ads API · CreateAssociatedBudgetRulesForSBCampaigns · POST /sb/campaigns/{campaignId}/budgetRules Amazon Ads API · CreateAssociatedBudgetRulesForSDCampaigns · POST /sd/campaigns/{campaignId}/budgetRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/CreateAssociatedBudgetRulesForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/CreateAssociatedBudgetRulesForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/CreateAssociatedBudgetRulesForSDCampaigns Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_associated_budget_rules_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "body": {}, "campaignId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_associated_budget_rules_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","body":{},"campaignId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `body` | object | yes | {budgetRuleIds: [...]} (max 25). | | `campaignId` | string | yes | the campaign to attach rules to. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.responses` — per id sent, {ruleId, code, details}. ## Gotchas - A campaign holds at most 250 rules, and every rule attached to one campaign must have a unique name. # ads_create_budget_rules_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_create_budget_rules_for_campaigns) > Create budget rules — automatic, time- or performance-based daily-budget increases. Access: **WRITE** · toolset amazon_ads · family ads.sp A rule does nothing until it is attached with ads_create_associated_budget_rules_for_campaigns. Amazon Ads API · CreateBudgetRulesForSPCampaigns · POST /sp/budgetRules Amazon Ads API · CreateBudgetRulesForSBCampaigns · POST /sb/budgetRules Amazon Ads API · CreateBudgetRulesForSDCampaigns · POST /sd/budgetRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/CreateBudgetRulesForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/CreateBudgetRulesForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/CreateBudgetRulesForSDCampaigns Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_budget_rules_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "body": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_budget_rules_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","body":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `body` | object[] | yes | list of 1-25 FLAT rule details (max 25). | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.responses` — per rule {ruleId, code, details} — ruleId goes to ads_create_associated_budget_rules_for_campaigns; a code other than Ok means that rule failed. ## Body (Amazon schema): {budgetRulesDetails: [BudgetRuleDetails]} (max 25), each item - budgetIncreaseBy: {type*: PERCENT, value*} duration: {dateRangeTypeRuleDuration: {endDate, startDate*}, eventTypeRuleDuration: {endDate, eventId*, eventName, startDate}} name: string (max 355 chars) performanceMeasureCondition: {comparisonOperator*, metricName*, threshold*} recurrence: {daysOfWeek, intraDaySchedule: [{endTime, startTime}] (max 1), type} recurrence.daysOfWeek: [FRIDAY | MONDAY | SATURDAY | SUNDAY | THURSDAY | TUESDAY | WEDNESDAY] ruleType: PERFORMANCE | SCHEDULE By product: SPONSORED_PRODUCTS SPONSORED_BRANDS SPONSORED_DISPLAY comparisonOperator EQUAL_TO + shared shared shared shared: GREATER_THAN GREATER_THAN_OR_EQUAL_TO LESS_THAN LESS_THAN_OR_EQUAL_TO metricName ACOS CTR CVR ROAS IS NTB ROAS ACOS CTR CVR ROAS recurrence.type DAILY DAILY WEEKLY DAILY WEEKLY ## Gotchas - Rules only ever RAISE a budget. For a lower overnight budget, set the base budget low and raise it inside daytime windows (recurrence.intraDaySchedule: max 1 window per rule - a morning/afternoon/evening ramp needs three rules). The time format ("HH:MM:SS") differs from ads_search_optimization_rules' recurrence.timesOfDay ("HH:MM") - two different APIs. - recurrence appears in CREATE bodies only, never in an update. - Rules active together stack additively (+5% and +10% -> +15%). - eventId (for an eventTypeRuleDuration) comes from ads_get_budget_rules_recommendation. - Verify the live effect with ads_campaigns_budget_usage during the rule window, not from the rule definition — an ACTIVE rule can still be ON_HOLD (see ads_list_associated_budget_rules_for_campaigns). - duration.dateRangeTypeRuleDuration dates are YYYYMMDD (no dashes); startDate must be today or later. # ads_disassociate_associated_budget_rule_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_associated_budget_rule_for_campaigns) > Detach one budget rule from one campaign. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Confirm the association first with ads_list_associated_budget_rules_for_campaigns. Amazon Ads API · DisassociateAssociatedBudgetRuleForSPCampaigns · DELETE /sp/campaigns/{campaignId}/budgetRules/{budgetRuleId} Amazon Ads API · DisassociateAssociatedBudgetRuleForSBCampaigns · DELETE /sb/campaigns/{campaignId}/budgetRules/{budgetRuleId} Amazon Ads API · DisassociateAssociatedBudgetRuleForSDCampaigns · DELETE /sd/campaigns/{campaignId}/budgetRules/{budgetRuleId} Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/DisassociateAssociatedBudgetRuleForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/DisassociateAssociatedBudgetRuleForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/DisassociateAssociatedBudgetRuleForSDCampaigns Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_disassociate_associated_budget_rule_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "campaignId": "", "budgetRuleId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_disassociate_associated_budget_rule_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","campaignId":"","budgetRuleId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `campaignId` | string | yes | the campaign to detach the rule from. | | `budgetRuleId` | string | yes | from ads_list_associated_budget_rules_for_campaigns. | ## Result - Amazon's payload in data.result. # ads_get_budget_recommendation (https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_recommendation) > Sponsored Products: a daily-budget suggestion for a new campaign, before it exists. Access: **READ** · toolset amazon_ads · family ads.sp Call before ads_create_campaign to start it with a budget Amazon predicts will not throttle delivery. (Distinct from ads_sp_get_budget_recommendations, which covers existing campaigns.) Amazon Ads API · getBudgetRecommendation · POST /sp/campaigns/initialBudgetRecommendation Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Budget-Recommendation-New-Campaigns/operation/getBudgetRecommendation ## Call it MCP tool call: ```json { "name": "ads_get_budget_recommendation", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_budget_recommendation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {targetingType: 'auto'\|'manual', adGroups: [{asins: [...], targetingExpressions: [{type, bid, value?}]}], bidding: {strategy}}. | ## Result - Amazon's payload in data.result. - `data.result.dailyBudget` — the suggested daily budget. - `data.result.specialEvents[]` — up to 5 event-period budgets. - `data.result.benchmark` — the expected impressions / clicks / conversions range. ## Gotchas - Each targetingExpressions item is an OBJECT and needs a bid, although Amazon's schema lists only type and value — without one Amazon answers 'TargetingExpression bid cannot be null'. value carries the keyword text for the KEYWORD_* types. - targetingType is lowercase ('auto'/'manual') on this endpoint only — every other v1 tool uses the uppercase enum. # ads_get_budget_rule_by_rule_id_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rule_by_rule_id_for_campaigns) > Get one budget rule by id. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · GetBudgetRuleByRuleIdForSPCampaigns · GET /sp/budgetRules/{budgetRuleId} Amazon Ads API · GetBudgetRuleByRuleIdForSBCampaigns · GET /sb/budgetRules/{budgetRuleId} Amazon Ads API · GetBudgetRuleByRuleIdForSDCampaigns · GET /sd/budgetRules/{budgetRuleId} Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/GetBudgetRuleByRuleIdForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/GetBudgetRuleByRuleIdForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/GetBudgetRuleByRuleIdForSDCampaigns ## Call it MCP tool call: ```json { "name": "ads_get_budget_rule_by_rule_id_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "budgetRuleId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_budget_rule_by_rule_id_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","budgetRuleId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `budgetRuleId` | string | yes | from ads_get_budget_rules_for_advertiser. | ## Result - Amazon's payload in data.result. # ads_get_budget_rules_for_advertiser (https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_for_advertiser) > Page all of the advertiser's budget rules for one ad product. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · GetSPBudgetRulesForAdvertiser · GET /sp/budgetRules Amazon Ads API · GetSBBudgetRulesForAdvertiser · GET /sb/budgetRules Amazon Ads API · GetSDBudgetRulesForAdvertiser · GET /sd/budgetRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/GetSPBudgetRulesForAdvertiser Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/GetSBBudgetRulesForAdvertiser Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/GetSDBudgetRulesForAdvertiser ## Call it MCP tool call: ```json { "name": "ads_get_budget_rules_for_advertiser", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_budget_rules_for_advertiser \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `pageSize` | integer | | rules per page, 1–30 (default 30). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - Amazon's payload in data.result. - `data.result.budgetRulesForAdvertiserResponse[]` — {ruleId, ruleState, ruleStatus, ruleDetails}. - `data.nextToken` — the cursor for the next page (absent on the last page). # ads_get_budget_rules_recommendation (https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_recommendation) > Special-event budget-rule recommendations for one EXISTING campaign — Amazon's list of upcoming shopping events (Prime Day etc.) with a suggested budget-increase percent for this c Access: **READ** · toolset amazon_ads · family ads.sp ampaign. For the marketplace's event calendar without a campaign or a suggested percent, use ads_sp_get_all_rule_events. Amazon Ads API · SPGetBudgetRulesRecommendation · POST /sp/campaigns/budgetRules/recommendations Amazon Ads API · SBGetBudgetRulesRecommendation · POST /sb/campaigns/budgetRules/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRulesRecommendation/operation/SPGetBudgetRulesRecommendation Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi#tag/Budget-Rules-Recommendations/operation/SBGetBudgetRulesRecommendation ## Call it MCP tool call: ```json { "name": "ads_get_budget_rules_recommendation", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "campaignId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_budget_rules_recommendation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","campaignId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS (Sponsored Display has no rules-recommendation endpoint). | | `campaignId` | string | yes | ONE campaign id (Amazon takes a single id here) — from ads_query_campaign. | ## Result - Amazon's payload in data.result. - `data.result.recommendedBudgetRuleEvents[]` — {eventId, eventName, startDate, endDate (YYYYMMDD), suggestedBudgetIncreasePercent}. ## Gotchas - To act on an event, call ads_create_budget_rules_for_campaigns with ruleType SCHEDULE and eventTypeRuleDuration {eventId}, budgetIncreaseBy {type: PERCENT, value: suggested percent}, then attach it with ads_create_associated_budget_rules_for_campaigns. # ads_get_campaigns_associated_with_budget_rule (https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_associated_with_budget_rule) > List the campaigns a budget rule is attached to. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · GetCampaignsAssociatedWithSPBudgetRule · GET /sp/budgetRules/{budgetRuleId}/campaigns Amazon Ads API · GetCampaignsAssociatedWithSBBudgetRule · GET /sb/budgetRules/{budgetRuleId}/campaigns Amazon Ads API · GetCampaignsAssociatedWithSDBudgetRule · GET /sd/budgetRules/{budgetRuleId}/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/GetCampaignsAssociatedWithSPBudgetRule Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/GetCampaignsAssociatedWithSBBudgetRule Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/GetCampaignsAssociatedWithSDBudgetRule ## Call it MCP tool call: ```json { "name": "ads_get_campaigns_associated_with_budget_rule", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "budgetRuleId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_campaigns_associated_with_budget_rule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","budgetRuleId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `budgetRuleId` | string | yes | from ads_get_budget_rules_for_advertiser. | | `pageSize` | integer | | campaigns per page, 1–30 (default 30). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - Amazon's payload in data.result. - `data.result.associatedCampaigns[]` — {campaignId, campaignName, ruleStatus}. - `data.nextToken` — the cursor for the next page (absent on the last page). # ads_list_associated_budget_rules_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_list_associated_budget_rules_for_campaigns) > List the budget rules applied to one campaign. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · ListAssociatedBudgetRulesForSPCampaigns · GET /sp/campaigns/{campaignId}/budgetRules Amazon Ads API · ListAssociatedBudgetRulesForSBCampaigns · GET /sb/campaigns/{campaignId}/budgetRules Amazon Ads API · ListAssociatedBudgetRulesForSDCampaigns · GET /sd/campaigns/{campaignId}/budgetRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/ListAssociatedBudgetRulesForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/ListAssociatedBudgetRulesForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/ListAssociatedBudgetRulesForSDCampaigns ## Call it MCP tool call: ```json { "name": "ads_list_associated_budget_rules_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "campaignId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_associated_budget_rules_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","campaignId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `campaignId` | string | yes | from ads_query_campaign. Amazon returns every associated rule in one response. | ## Result - Amazon's payload in data.result. - `data.result.associatedRules[]` — {ruleId, ruleState, ruleStatus, ruleDetails}. ## Gotchas - A rule can be ACTIVE and still be doing NOTHING. ruleState is what you set (ACTIVE | PAUSED); ruleStatus is Amazon's own evaluation status, with ruleStatusDetails {status, reasonCode} beside it — read them here after associating; it is the only signal that the rule is really in effect. A correctly created + associated PERFORMANCE rule was seen sitting at ruleStatus ON_HOLD, reasonCode INELIGIBLE_PERFORMANCE_METRIC — the campaign had no usable ACOS yet, so the rule never evaluated (identical at threshold 30 and 1000: it reflects the campaign's data sufficiency, not the threshold). Never report "rule created" as "rule working". # ads_sb_get_budget_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_sb_get_budget_recommendations) > Daily-budget recommendations and missed-opportunity estimates for EXISTING Sponsored Brands campaigns (SP: ads_sp_get_budget_recommendations; a not-yet-created SP campaign: ads_get Access: **READ** · toolset amazon_ads · family ads.sb4 _budget_recommendation). Amazon Ads API · GetBudgetRecommendations · POST /sb/campaigns/budgetRecommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Recommendations/operation/GetBudgetRecommendations ## Call it MCP tool call: ```json { "name": "ads_sb_get_budget_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "campaignIds": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sb_get_budget_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignIds":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignIds` | string[] | yes | 1-100 SB campaign ids, as strings, from ads_query_campaign. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.success[]` — {index, campaignId, suggestedBudget, sevenDaysMissedOpportunities{startDate, endDate, percentTimeInBudget, estimatedMissed...}}. - `data.result.error[]` — {index, campaignId, code, details}. ## Gotchas - Pair each suggestion with live ads_campaigns_budget_usage before raising a budget — a campaign nowhere near its cap does not need a raise regardless of the recommendation. # ads_update_budget_rules_for_campaigns (https://sellersheetai.com/docs/mcp-api/tools/ads_update_budget_rules_for_campaigns) > Update existing budget rules — rename, change the increase, threshold or duration, or set ruleState PAUSED to stop one. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Budget rules have no delete; ads_disassociate_associated_budget_rule_for_campaigns detaches one from a campaign. Amazon Ads API · UpdateBudgetRulesForSPCampaigns · PUT /sp/budgetRules Amazon Ads API · UpdateBudgetRulesForSBCampaigns · PUT /sb/budgetRules Amazon Ads API · UpdateBudgetRulesForSDCampaigns · PUT /sd/budgetRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRules/operation/UpdateBudgetRulesForSPCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-rules/operation/UpdateBudgetRulesForSBCampaigns Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Rules/operation/UpdateBudgetRulesForSDCampaigns Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_budget_rules_for_campaigns", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "body": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_budget_rules_for_campaigns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","body":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `body` | object[] | yes | list of 1-25 {ruleId*, ruleDetails, ruleState} wrappers (NOT flat like create). | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. ## Body (Amazon schema): {budgetRulesDetails: [BudgetRule]} (max 25), each item - createdDate: number lastUpdatedDate: number ruleDetails: {budgetIncreaseBy: {type*, value*}, duration: {dateRangeTypeRuleDuration, eventTypeRuleDuration}, name (max 355 chars), performanceMeasureCondition: {comparisonOperator*, metricName*, threshold*}, recurrence: {daysOfWeek, intraDaySchedule, type}, ruleType: PERFORMANCE | SCHEDULE} ruleDetails.budgetIncreaseBy.type: PERCENT ruleDetails.recurrence.daysOfWeek: [FRIDAY | MONDAY | SATURDAY | SUNDAY | THURSDAY | TUESDAY | WEDNESDAY] ruleId*: string ruleState: ACTIVE | PAUSED ruleStatus: string By product: SPONSORED_PRODUCTS SPONSORED_BRANDS SPONSORED_DISPLAY comparisonOperator EQUAL_TO + shared shared shared shared: GREATER_THAN GREATER_THAN_OR_EQUAL_TO LESS_THAN LESS_THAN_OR_EQUAL_TO metricName ACOS CTR CVR ROAS IS NTB ROAS ACOS CTR CVR ROAS recurrence.type DAILY DAILY WEEKLY DAILY WEEKLY ## Gotchas - ruleDetails accepts ONLY mutable fields: name, duration, budgetIncreaseBy, performanceMeasureCondition. Amazon's schema also lists ruleType and recurrence, but an update carrying either is rejected (400 'Expected null'). # ads_campaigns_budget_usage (https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) > Real-time budget consumption for campaigns — how much of today's budget is already spent, so you can see which campaigns are about to stop serving. Access: **READ** · toolset amazon_ads · family ads.sp This is live intraday data the synced report warehouse cannot provide. Amazon Ads API · spCampaignsBudgetUsage · POST /sp/campaigns/budget/usage Amazon Ads API · sbCampaignsBudgetUsage · POST /sb/campaigns/budget/usage Amazon Ads API · sdCampaignsBudgetUsage · POST /sd/campaigns/budget/usage Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Budget-Usage/operation/spCampaignsBudgetUsage Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi/prod#tag/Budget-usage/operation/sbCampaignsBudgetUsage Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Usage/operation/sdCampaignsBudgetUsage ## Call it MCP tool call: ```json { "name": "ads_campaigns_budget_usage", "arguments": { "store": "myStore-US", "countryCode": "", "adProduct": "", "ids": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_campaigns_budget_usage \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","adProduct":"","ids":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `adProduct` | string | yes | SPONSORED_PRODUCTS \| SPONSORED_BRANDS \| SPONSORED_DISPLAY. | | `ids` | object[] | yes | 1-100 campaign ids, as strings, from ads_query_campaign. Amazon rejects >100 per call — chunk larger sets. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. ## Body (Amazon schema) - campaignIds: [string] (1–100) ## Gotchas - A partial result is still HTTP-success — always inspect data.result.error[] (per-id failures: unknown id, no active budget) alongside success[]; index matches the position in your ids list. - budgetUsagePercent is spend / available budget under the current budget policy; usageUpdatedTimestamp is when Amazon last evaluated usage — always relay it, the figure is not instantaneous. - Campaigns near 100% are about to stop serving; for SPONSORED_PRODUCTS, ads_sp_get_budget_recommendations suggests a raise. # ads_portfolio_budget_usage (https://sellersheetai.com/docs/mcp-api/tools/ads_portfolio_budget_usage) > Real-time budget consumption for portfolios — how much of the portfolio's current budget cap (its date-range or monthly policy) is already spent; a portfolio with no budget cap com Access: **READ** · toolset amazon_ads · family ads.portfolios es back in data.result.error[]. Amazon Ads API · portfolioBudgetUsage · POST /portfolios/budget/usage Docs: https://advertising.amazon.com/API/docs/en-us/reference/portfolios#tag/Budget-Usage/operation/portfolioBudgetUsage ## Call it MCP tool call: ```json { "name": "ads_portfolio_budget_usage", "arguments": { "store": "myStore-US", "countryCode": "", "ids": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_portfolio_budget_usage \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","ids":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `ids` | object[] | yes | 1-100 portfolio ids, as strings, from ads_list_portfolios. Amazon rejects >100 per call — chunk larger sets. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. ## Body (Amazon schema) - portfolioIds: [string] (1–100) ## Gotchas - Same envelope as ads_campaigns_budget_usage: a partial result is still HTTP-success — always inspect data.result.error[]. # ads_create_async_report (https://sellersheetai.com/docs/mcp-api/tools/ads_create_async_report) > Request an Amazon Advertising performance report (async — not immediately available; poll with ads_get_async_report until status=COMPLETED, then read data.report rows). Access: **READ** · toolset amazon_ads · family ads.reporting Amazon Ads API · createAsyncReport · POST /reporting/reports Docs: https://advertising.amazon.com/API/docs/en-us/offline-report-prod-3p#tag/Asynchronous-Reports/operation/createAsyncReport ## Call it MCP tool call: ```json { "name": "ads_create_async_report", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_async_report \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {name, startDate, endDate, configuration: {adProduct, reportTypeId, format: 'GZIP_JSON', groupBy: [...], columns: [...], timeUnit: 'SUMMARY'\|'DAILY', filters?}}. startDate / endDate: 'YYYY-MM-DD'; most report types look back at most 95 days. | ## Result - `data.reportId` — pass to ads_get_async_report. - `data.status` — the status at creation. ## Gotchas - configuration.adProduct must match the reportTypeId's family: an sp* type needs SPONSORED_PRODUCTS, sb* needs SPONSORED_BRANDS, sd* needs SPONSORED_DISPLAY — a mismatched pair is rejected. - A DSP report's filters need a real advertiserId ({"field": "advertiserId", "values": [""]}) — get one from ads_dsp_advertisers first. - Commonly used report types: spCampaigns (groupBy campaign, SUMMARY, campaign totals; or campaign+campaignPlacement; or campaign+adGroup DAILY for a daily trend), spTargeting (groupBy targeting, SUMMARY), spSearchTerm (groupBy searchTerm, SUMMARY), spAdvertisedProduct / spPurchasedProduct (DAILY, ASIN-level), spGrossAndInvalids (groupBy campaign, DAILY), sbCampaigns / sdCampaigns (groupBy campaign, SUMMARY, adProduct SPONSORED_BRANDS / SPONSORED_DISPLAY respectively). - Reports take minutes and can take up to 3 hours — poll every 5-10 minutes, never in a tight loop. # ads_get_async_report (https://sellersheetai.com/docs/mcp-api/tools/ads_get_async_report) > Poll an Amazon Advertising report's status; auto-downloads and returns the rows in data.report once status=COMPLETED. Access: **READ** · toolset amazon_ads · family ads.reporting Amazon Ads API · getAsyncReport · GET /reporting/reports/{reportId} Docs: https://advertising.amazon.com/API/docs/en-us/offline-report-prod-3p#tag/Asynchronous-Reports/operation/getAsyncReport ## Call it MCP tool call: ```json { "name": "ads_get_async_report", "arguments": { "store": "myStore-US", "countryCode": "", "reportId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_async_report \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","reportId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `reportId` | string | yes | data.reportId from ads_create_async_report. | ## Result - `data.status` — PENDING | PROCESSING | COMPLETED | FAILED. - `data.report` — the rows (a list of dicts, one per groupBy dimension, e.g. campaign/ad group/keyword) once COMPLETED, else null. ## Gotchas - On FAILED (Amazon's failureReason is in notification.message), create a new report with corrected params rather than retrying the same reportId. # ads_get_bids_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_get_bids_recommendations) > Sponsored Brands: suggested bids for keywords, product targets or themes. Access: **READ** · toolset amazon_ads · family ads.sb3 Use the returned amounts as the `bid` when creating SB targets with ads_create_target. Amazon Ads API · getBidsRecommendations · POST /sb/recommendations/bids Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi#tag/Bid-recommendations/operation/getBidsRecommendations ## Call it MCP tool call: ```json { "name": "ads_get_bids_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_bids_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {campaignId, adFormat: 'productCollection'\|'video', keywords: [{keywordText, matchType}] (max 100), targets: [[{type, value}]] (max 100 — each target is a LIST of expressions), themeTypes: [...] (max 100)}; sum of (targets + keywords + themeTypes) ≤ 100. costType (CPC \| VCPM) needs a matching goal — costType without goal is refused; omit both for CPC bids at the default page-visit goal. | ## Result - Amazon's payload in data.result. - `data.result.keywordsBidsRecommendationSuccessResults` — [{keywordIndex, keyword, recommendedBid {rangeStart, recommended, rangeEnd}}]; product targets and themes come back in the matching targets… and themes… lists, failures in the …ErrorResults lists. # ads_get_keyword_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_get_keyword_recommendations) > Sponsored Brands: suggested keywords, from ASINs or a landing page URL. Access: **READ** · toolset amazon_ads · family ads.sb3 Create the picked ones as KEYWORD targets with ads_create_target. Amazon Ads API · getKeywordRecommendations · POST /sb/recommendations/keyword Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi#tag/Keyword-Recommendations/operation/getKeywordRecommendations ## Call it MCP tool call: ```json { "name": "ads_get_keyword_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_keyword_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | one of {asins*: [...], goal?, creativeType?, maxNumSuggestions?, creativeAsins?, locale?} or {url*, goal?, creativeType?, maxNumSuggestions?, creativeAsins?, locale?}. maxNumSuggestions defaults to 100, at most 1000; locale adds a translation per keyword — zh_CN in US, UK and CA, en_GB in DE, FR, IT and ES; any other locale returns none. | ## Result - Amazon's payload in data.result. - `data.result` — [{value, matchType, recommendationId, searchTermImpressionShare, searchTermImpressionRank, translation}] — a bare list, one entry per suggested keyword. # ads_get_sd_budget_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_get_sd_budget_recommendations) > Budget recommendations and missed-opportunity metrics for up to 100 Sponsored Display campaigns — suggestedBudget, and under sevenDaysMissedOpportunities the percentTimeInBudget (s Access: **READ** · toolset amazon_ads · family ads.sd hare of the past 7 days in budget) and estimated missed impressions/clicks/sales. Amazon Ads API · getSDBudgetRecommendations · POST /sd/campaigns/budgetRecommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Budget-Recommendations/operation/getSDBudgetRecommendations ## Call it MCP tool call: ```json { "name": "ads_get_sd_budget_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "campaignIds": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_sd_budget_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignIds":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignIds` | string[] | yes | SD campaign ids, as strings (max 100), from ads_query_campaign (adProductFilter SPONSORED_DISPLAY). | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.budgetRecommendationsSuccessResults` — [{index, campaignId, suggestedBudget, sevenDaysMissedOpportunities}]. - `data.result.budgetRecommendationsErrorResults` — [{index, campaignId, code, details}] — campaigns that got no recommendation. ## Gotchas - Metrics are based on historical performance — not a guarantee of future results. Sort by sevenDaysMissedOpportunities.estimatedMissedSalesUpper descending to prioritize which campaigns to raise, then raise them with ads_update_campaign_budget. # ads_get_target_bid_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_bid_recommendations) > Sponsored Display: bid recommendations for up to 100 targeting clauses, derived from the last 7 days of winning auction bids for each one. Access: **READ** · toolset amazon_ads · family ads.sd Only meaningful when product ads use asin (vendors) or sku (sellers). Amazon Ads API · getTargetBidRecommendations · POST /sd/targets/bid/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Bid-Recommendations/operation/getTargetBidRecommendations ## Call it MCP tool call: ```json { "name": "ads_get_target_bid_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_target_bid_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {bidOptimization*: 'clicks'\|'reach'\|'conversions', costType*: 'cpc'\|'vcpm', targetingClauses*: [{targetingClause: {expressionType, expression}}] (1-100), products: [{asin}] (max 10000), creativeType?}. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. ## Gotchas - products accepts sku as well as asin (Amazon's schema documents only asin, but a seller may pass sku instead) — required for similarProduct, exactProduct and relatedProduct targets. - Use recommended bids as the `bid` when creating targets with ads_create_target. # ads_get_target_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_recommendations) > Sponsored Display: up to 100 recommended product, category, audience or content-category targets (whichever typeFilter asks for), based on the ASINs/SKUs you advertise. Access: **READ** · toolset amazon_ads · family ads.sd Amazon Ads API · getTargetRecommendations · POST /sd/targets/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-display/3-0/openapi#tag/Targeting-Recommendations/operation/getTargetRecommendations ## Call it MCP tool call: ```json { "name": "ads_get_target_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_target_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {tactic*: 'T00020'\|'T00030', products*: [{asin}] (1-10000), typeFilter*: ['PRODUCT'\|'CATEGORY'\|'AUDIENCE'\| 'CONTENT_CATEGORY'] (1-3)}. tactic T00020 is contextual targeting (products); T00030 is audiences or contextual (products, categories, refined categories, audiences). | | `locale` | string | | the language of the returned names; omit for the profile's own. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. | ## Result - Amazon's payload in data.result. ## Gotchas - products accepts sku as well as asin (Amazon's schema documents only asin, but a seller may pass sku instead). - Allow about a week for Amazon to have data on a newly listed ASIN. - The response uses the legacy SD expression form ({type: 'asinSameAs', value: ''}) — ads_create_target does NOT accept that shape; translate before creating (adProduct SPONSORED_DISPLAY): asinSameAs -> targetType PRODUCT, targetDetails {productTarget: {matchType: PRODUCT_EXACT, product: {productId}, productIdType: ASIN}}; asinCategorySameAs -> targetType PRODUCT_CATEGORY, targetDetails {productCategoryTarget: {productCategoryRefinement: {productCategoryRefinement: {productCategoryId}}}} (the wrapper key is nested TWICE). # ads_ad_export (https://sellersheetai.com/docs/mcp-api/tools/ads_ad_export) > Submit a bulk export of every product ad across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. Access: **READ** · toolset amazon_ads · family ads.exports For a filtered, paged read use ads_query_ad. Amazon Ads API · AdExport · POST /ads/export Docs: https://advertising.amazon.com/API/docs/en-us/exports#tag/Exports/operation/AdExport ## Call it MCP tool call: ```json { "name": "ads_ad_export", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_ad_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional filters — adProductFilter (default: all three ad products) and stateFilter (default ENABLED + PAUSED; ARCHIVED only when asked for). | ## Result - Amazon's payload in data.result. - `data.result.exportId` — poll it with ads_get_export, typeExport='ads', until data.result.status is COMPLETED (or FAILED). # ads_ad_group_export (https://sellersheetai.com/docs/mcp-api/tools/ads_ad_group_export) > Submit a bulk export of every ad group across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. Access: **READ** · toolset amazon_ads · family ads.exports For a filtered, paged read use ads_query_ad_group. Amazon Ads API · AdGroupExport · POST /adGroups/export Docs: https://advertising.amazon.com/API/docs/en-us/exports#tag/Exports/operation/AdGroupExport ## Call it MCP tool call: ```json { "name": "ads_ad_group_export", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_ad_group_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional filters — adProductFilter (default: all three ad products) and stateFilter (default ENABLED + PAUSED; ARCHIVED only when asked for). | ## Result - Amazon's payload in data.result. - `data.result.exportId` — poll it with ads_get_export, typeExport='adGroups', until data.result.status is COMPLETED (or FAILED). # ads_apply_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_apply_recommendations) > Accept Amazon-generated Sponsored Products campaign recommendations — Amazon applies the proposed change to the campaign. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.recommendations Confirm with the user which ones to accept first. Amazon Ads API · ApplyRecommendations · POST /recommendations/apply Gate: approve, choice — interactive: show the change and the option (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change, within named rule (one option, no tie); otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_apply_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_apply_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {recommendationIds: [recommendationId, ...]} (1–100) — the recommendationIds from ads_list_recommendations. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.successes[] / data.result.failures[]` — one entry per id sent; read each failure's details. ## Gotchas - NEW_CAMPAIGN / NEW_VIDEO_CAMPAIGN recommendations are accepted asynchronously — confirm with ads_list_recommendations (STATUS APPLY_SUCCESS or APPLY_FAILED). # ads_associate_optimization_rules_to_campaign (https://sellersheetai.com/docs/mcp-api/tools/ads_associate_optimization_rules_to_campaign) > Attach Sponsored Products bid optimization rules to a campaign — a rule changes nothing until it is associated. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Amazon Ads API · AssociateOptimizationRulesToCampaign · POST /sp/campaigns/{campaignId}/optimizationRules Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Optimization-Rules/operation/AssociateOptimizationRulesToCampaign Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_associate_optimization_rules_to_campaign", "arguments": { "store": "myStore-US", "countryCode": "", "campaignId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_associate_optimization_rules_to_campaign \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignId` | string | yes | the SP campaign the rules attach to. | | `body` | object | yes | {optimizationRuleIds: ["amzn1.ads-rule.m.xxx"]}. | | `apiVersion` | string | | v1 (default) \| v2. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.failed` — [{index, optimizationRuleId, code, details}] for every item Amazon did not confirm. ALWAYS relay this verbatim. ## Gotchas - A campaign that already carries a rule from ads_create_optimization_rule (the campaign-optimization / rule-based-bidding API) REFUSES association: "Campaign has performance based rule enabled and therefore cannot associate an Intraday bidding rule or performance based rule." The two automation models are mutually exclusive per campaign — pick one and say which. - Changes take up to 24 hours to take effect. # ads_campaign_export (https://sellersheetai.com/docs/mcp-api/tools/ads_campaign_export) > Submit a bulk export of every campaign across Sponsored Products, Brands and Display — an asynchronous full snapshot in one file. Access: **READ** · toolset amazon_ads · family ads.exports For a filtered, paged read use ads_query_campaign. Amazon Ads API · CampaignExport · POST /campaigns/export Docs: https://advertising.amazon.com/API/docs/en-us/exports#tag/Exports/operation/CampaignExport ## Call it MCP tool call: ```json { "name": "ads_campaign_export", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_campaign_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional filters — adProductFilter (default: all three ad products) and stateFilter (default ENABLED + PAUSED; ARCHIVED only when asked for). | ## Result - Amazon's payload in data.result. - `data.result.exportId` — poll it with ads_get_export, typeExport='campaigns', until data.result.status is COMPLETED (or FAILED). # ads_create_optimization_rule (https://sellersheetai.com/docs/mcp-api/tools/ads_create_optimization_rule) > Sponsored Products rule-based bidding — hand bid control to Amazon under a ROAS guardrail you declare; Amazon raises and lowers the campaign's base bids itself to increase conversi Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp ons while trying to hold it. This is NOT the same API as ads_sp_create_optimization_rules (which only applies fixed percentage increases on a schedule). Amazon Ads API · CreateOptimizationRule · POST /sp/rules/campaignOptimization Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/CreateOptimizationRule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_optimization_rule", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_optimization_rule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {campaignIds (max 20, fewer than eligibility's 100 — split larger sets), ruleType: BID, ruleAction: ADOPT, recurrence: DAILY, ruleCondition: [{metricName, ...}]}. Use the roas returned by ads_get_optimization_rule_eligibility as the threshold rather than inventing one. | ## Result - Amazon's payload in data.result. - `data.result.campaignOptimizationId` — the rule id that ads_get_campaign_optimization_rule, ads_update_optimization_rule and ads_delete_campaign_optimization_rule take. - `data.result.code / data.result.details` — whether Amazon created it. ## Gotchas - ALWAYS call ads_get_optimization_rule_eligibility first — Amazon rejects ineligible campaigns. - ruleType only supports BID today: KEYWORD and PRODUCT are in the spec enum but Amazon answers "Rule type is invalid. Only support BID as of now." - A ROAS condition is MANDATORY — AVERAGE_BID is in the spec enum but Amazon answers "Condition on ROAS is required, and AVERAGE_BID is not allowed." - When metricName=ROAS, Amazon only actually supports GREATER_THAN and EQUAL_TO, despite the fuller comparisonOperator enum in the spec. - Mutually exclusive with ads_associate_optimization_rules_to_campaign on the same campaign — associating a schedule/intraday bid rule fails once this kind is attached. Pick ONE automation model and say which one you picked. # ads_delete_campaign_optimization_rule (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign_optimization_rule) > Sponsored Products: delete a rule-based-bidding rule — unlike ads_sp_update_optimization_rules's API (which has no delete), this one really does support delete; the campaign return Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp s to its previous bidding. Amazon Ads API · DeleteCampaignOptimizationRule · DELETE /sp/rules/campaignOptimization/{campaignOptimizationId} Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/DeleteCampaignOptimizationRule Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_campaign_optimization_rule", "arguments": { "store": "myStore-US", "countryCode": "", "campaignOptimizationId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_campaign_optimization_rule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignOptimizationId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignOptimizationId` | string | yes | the rule to delete. | ## Result - Amazon's payload in data.result. # ads_generate_brand_metrics_report (https://sellersheetai.com/docs/mcp-api/tools/ads_generate_brand_metrics_report) > Request a Brand Metrics report — your brand's shopper-funnel metrics in a category against category peers (engaged-shopper rate, customer conversion rate, new-to-brand customer rat Access: **READ** · toolset amazon_ads · family ads.brand-metrics e, branded searches, detail-page views). It is brand-level, not per ad product or campaign. Poll and download it with ads_get_brand_metrics_report. Amazon Ads API · generateBrandMetricsReport · POST /insights/brandMetrics/report Docs: https://advertising.amazon.com/API/docs/en-us/brand-metrics-openapi#tag/Report/operation/generateBrandMetricsReport ## Call it MCP tool call: ```json { "name": "ads_generate_brand_metrics_report", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_generate_brand_metrics_report \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | every field optional — brandName, categoryTreeName, categoryPath, reportStartDate / reportEndDate (YYYY-MM-DD, at most 3 months apart; omit both for the latest computation), lookBackPeriod (default 1W), metrics (omit for all), format (default JSON). {} reports every brand. | ## Result - Amazon's payload in data.result. - `data.result.reportId` — pass to ads_get_brand_metrics_report. - `data.result.status` — IN_PROGRESS, SUCCESSFUL or FAILED. ## Gotchas - Brand metrics may not be supported in all marketplaces (e.g. AE). # ads_get_brand_metrics_report (https://sellersheetai.com/docs/mcp-api/tools/ads_get_brand_metrics_report) > Poll a Brand Metrics report; when the server sees it finished, the same call also downloads the file, so there is no separate download step. Access: **READ** · toolset amazon_ads · family ads.brand-metrics Poll every ~30 s. Amazon Ads API · getBrandMetricsReport · GET /insights/brandMetrics/report/{reportId} Docs: https://advertising.amazon.com/API/docs/en-us/brand-metrics-openapi#tag/Report/operation/getBrandMetricsReport ## Call it MCP tool call: ```json { "name": "ads_get_brand_metrics_report", "arguments": { "store": "myStore-US", "countryCode": "", "reportId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_brand_metrics_report \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","reportId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `reportId` | string | yes | data.result.reportId from ads_generate_brand_metrics_report. | ## Result - Amazon's payload in data.result. - `data.result.status` — IN_PROGRESS, SUCCESSFUL or FAILED (statusDetails says why; a FAILED report answers with a warning). - `data.result.reportData` — the parsed rows once SUCCESSFUL, capped at 20,000 (reportDataTruncated / reportDataTotalRecords when larger). ## Gotchas - The file is parsed server-side when it is JSON (the default format); a CSV file comes back base64 with reportDataParsed false. data.result.location is the file's presigned URL (valid for data.result.expiration ms). # ads_get_campaign_optimization_rule (https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaign_optimization_rule) > Sponsored Products: get one rule-based-bidding rule by its id. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · GetCampaignOptimizationRule · GET /sp/rules/campaignOptimization/{campaignOptimizationId} Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/GetCampaignOptimizationRule ## Call it MCP tool call: ```json { "name": "ads_get_campaign_optimization_rule", "arguments": { "store": "myStore-US", "countryCode": "", "campaignOptimizationId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_campaign_optimization_rule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignOptimizationId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignOptimizationId` | string | yes | from ads_create_optimization_rule (data.result.campaignOptimizationId) or ads_get_rule_notification. | ## Result - Amazon's payload in data.result. # ads_get_export (https://sellersheetai.com/docs/mcp-api/tools/ads_get_export) > Poll a bulk export submitted with ads_campaign_export / ads_ad_group_export / ads_target_export / ads_ad_export; downloads the file once status=COMPLETED. Access: **READ** · toolset amazon_ads · family ads.exports Amazon Ads API · GetExport · GET /exports/{exportId} Docs: https://advertising.amazon.com/API/docs/en-us/exports#tag/Exports/operation/GetExport ## Call it MCP tool call: ```json { "name": "ads_get_export", "arguments": { "store": "myStore-US", "countryCode": "", "exportId": "", "typeExport": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","exportId":"","typeExport":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `exportId` | string | yes | from the submit call. | | `typeExport` | string | yes | 'campaigns' \| 'adGroups' \| 'targets' \| 'ads' — MUST match the export you submitted (selects the download's Accept header); no default, an unknown/missing value is refused. | ## Result - Amazon's payload in data.result. - `data.result.status` — PROCESSING, COMPLETED or FAILED (data.result.error {errorCode, message} on FAILED). - `data.result.exportData` — the parsed records once COMPLETED (see Gotchas). ## Gotchas - The download is gunzipped and parsed server-side into data.result.exportData (a list of dicts), capped at 20,000 records. When the export is larger, exportDataTruncated=true and exportDataTotalRecords gives the real count — fetch data.result.url (short-lived) for the rest. If Amazon ever serves a non-JSON format, exportDataParsed=false and exportData is a base64 slice with exportDataError explaining why. # ads_get_history (https://sellersheetai.com/docs/mcp-api/tools/ads_get_history) > Get the entity change history — an audit log of edits to campaigns, ad groups, keywords, targets and product ads. Access: **READ** · toolset amazon_ads · family ads.change-history Sponsored Products and Sponsored Brands only: Sponsored Display changes are not returned, and no event says who made the change. Amazon Ads API · getHistory · POST /history Docs: https://advertising.amazon.com/API/docs/en-us/change-history#operation/getHistory ## Call it MCP tool call: ```json { "name": "ads_get_history", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_history \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {fromDate, toDate (millisecond Unix timestamps, 13 digits, within the last 90 days), eventTypes (below), count (page size, 50–200, default 100), pageOffset (0-based page index — the result carries pageOffset, maxPageNumber and totalRecords; there is no nextToken), sort ({key: 'DATE', direction: 'ASC' \| 'DESC'})}. eventTypes is an object keyed by entity type — CAMPAIGN \| AD_GROUP \| AD \| KEYWORD \| NEGATIVE_KEYWORD \| PRODUCT_TARGETING \| NEGATIVE_PRODUCT_TARGETING \| THEME — each value {eventTypeIds: [the ids of the entities to audit — required, an entry without them matches nothing], filters: [change types, e.g. NAME \| STATUS \| BUDGET_AMOUNT \| BID_AMOUNT \| START_DATE \| END_DATE], parents: [parent ids, e.g. the campaignId of an ad group]}. List the ids first (ads_query_campaign, ads_query_ad_group, ads_query_target, ads_query_ad) and pass them. | ## Result - Amazon's payload in data.result. ## Gotchas - eventTypes is an object keyed by event type, NOT an array (an array 400s), and every entry needs eventTypeIds: Amazon answers 0 events, not an error, for an entry without them, so the server refuses such a call (400) before Amazon — an empty page is never mistaken for 'no changes'. THEME is sent with Amazon's v1.1 Accept header, which it requires. - Date range must be within the last 90 days. # ads_get_optimization_rule_eligibility (https://sellersheetai.com/docs/mcp-api/tools/ads_get_optimization_rule_eligibility) > Sponsored Products: check which campaigns are eligible for rule-based bidding (a ROAS guardrail Amazon manages itself) before creating a rule with ads_create_optimization_rule — Am Access: **READ** · toolset amazon_ads · family ads.sp azon rejects ineligible campaigns. Amazon Ads API · GetOptimizationRuleEligibility · POST /sp/rules/campaignOptimization/eligibility Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/GetOptimizationRuleEligibility ## Call it MCP tool call: ```json { "name": "ads_get_optimization_rule_eligibility", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_optimization_rule_eligibility \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {campaignIds: [...] (max 100), requirePerformanceMetrics (default true — false also lists eligible campaigns with no roas yet; read performanceMetricsExists)}. | ## Result - Amazon's payload in data.result. ## Gotchas - Eligibility needs the campaign running >=10 DAYS, >=10 CONVERSIONS in the last 30 days, and the marketplace's minimum daily budget. Use the returned roas as the create threshold rather than inventing one — it is derived from this campaign's own history. - Response keys are lowerCamelCase, not the PascalCase Amazon's guide shows: campaignOptimizationRecommendations[{campaignId, performanceMetrics: {roas}}]. Per-campaign failures (e.g. LOW_BUDGET, NO_CONVERSIONS — one campaign can produce several at once) land in data.failed; an empty recommendations list with errors present means NOT eligible, whatever the HTTP status says. # ads_get_rule_notification (https://sellersheetai.com/docs/mcp-api/tools/ads_get_rule_notification) > Sponsored Products: the daily health-check for a rule-based-bidding rule — whether Amazon has silently disabled it. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · GetRuleNotification · POST /sp/rules/campaignOptimization/state Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/GetRuleNotification ## Call it MCP tool call: ```json { "name": "ads_get_rule_notification", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_rule_notification \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {campaignIds: [...]} (max 100). | ## Result - Amazon's payload in data.result. - `data.result.campaignOptimizationNotifications[]` — {campaignId, campaignOptimizationId, ruleState (ENABLED or DISABLED), notificationString}. - `data.failed` — per-campaign errors. ## Gotchas - Amazon can disable the rule on its own: if the campaign's ROAS over the last 20 days falls below 30% of its ROAS over the 20-to-40-day window, Amazon switches the rule off, restores the previous bidding strategy and target-level bids, and only notifies inside the Seller Central bell drawer — nothing is pushed to the API. Poll this at least once a day and tell the user when ruleState changes, or a dead rule looks alive. - The guardrail is evaluated over the PREVIOUS 21 DAYS at campaign level — it is not an intraday control. # ads_insights_get_audiences_overlapping_audiences (https://sellersheetai.com/docs/mcp-api/tools/ads_insights_get_audiences_overlapping_audiences) > Get the audiences that OVERLAP one given audience segment — audience-overlap insights for a single audienceId, not a catalog of audiences. Access: **READ** · toolset amazon_ads · family ads.insights Amazon Ads API · insightsGetAudiencesOverlappingAudiences · GET /insights/audiences/{audienceId}/overlappingAudiences Docs: https://advertising.amazon.com/API/docs/en-us/overlapping-audiences#tag/Audience-insights/operation/insightsGetAudiencesOverlappingAudiences ## Call it MCP tool call: ```json { "name": "ads_insights_get_audiences_overlapping_audiences", "arguments": { "store": "myStore-US", "countryCode": "", "audienceId": "", "ad_type": "DSP" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_insights_get_audiences_overlapping_audiences \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","audienceId":"","ad_type":"DSP"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `audienceId` | string | yes | the one audience segment to fetch overlap insights for — there is no list-all mode; sent inside the request body as body.audienceId. | | `ad_type` | string | yes | Amazon's adType — the ad program whose audiences are compared; DSP also needs body.advertiserId. Allowed: DSP \| SD. Allowed: DSP \| SD. | | `body` | object | | optional query parameters — adType comes from ad_type; advertiserId (required for DSP, from ads_dsp_advertisers), minimumOverlapAffinity / maximumOverlapAffinity (≥ 0), audienceCategory (list, 1–20), maxResults (1–500, default 30), nextToken. | ## Result - Amazon's payload in data.result. ## Params (Amazon schema) - audienceId*: string adType*: DSP | SD advertiserId: string minimumOverlapAffinity: number (min 0) maximumOverlapAffinity: number (min 0) — if specified, the affinities of all returned overlapping audiences will be at most the provided affinity audienceCategory: [string] (max 20) maxResults: integer (1–500) nextToken: string ## Gotchas - For standard SP brand performance use ads_generate_brand_metrics_report / ads_get_brand_metrics_report instead. # ads_list_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_list_recommendations) > List Amazon-generated recommendations for SP, SB, SD and ST campaigns (budget, bid, bidding strategy, new keywords, new campaigns, …) — filter by AD_PRODUCT. Access: **READ** · toolset amazon_ads · family ads.recommendations To accept some use ads_apply_recommendations; to modify one before accepting use ads_update_recommendation. Amazon Ads API · ListRecommendations · POST /recommendations/list ## Call it MCP tool call: ```json { "name": "ads_list_recommendations", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional {filters: [{field, operator: EXACT, values}], maxResults, nextToken, locale} — e.g. {filters: [{field: 'AD_PRODUCT', operator: 'EXACT', values: ['SP']}]}. | ## Result - Amazon's payload in data.result. - `data.result.recommendations[]` — max 500 per page, each with recommendationId, recommendationType, status, recommendedValue. - `data.result.nextToken / data.result.totalResults` — pass nextToken back as body.nextToken for the next page. ## Gotchas - This is NOT keyword suggestions — use ads_get_ranked_keyword_recommendation for those. Amazon generates these from campaign performance signals (e.g. "increase budget", "enable suggested bid", "add suggested keywords"). # ads_search_optimization_rules (https://sellersheetai.com/docs/mcp-api/tools/ads_search_optimization_rules) > Search Sponsored Products bid optimization rules — rules that raise bids on a SCHEDULE or, with apiVersion='v2', while a PERFORMANCE condition holds (ROAS, CVR, CTR, …). Access: **READ** · toolset amazon_ads · family ads.sp Rules only ever INCREMENT by a PERCENT; to "lower" bids at night, set a lower base bid and add a rule that raises it during the hours you want. Amazon Ads API · SearchOptimizationRules · POST /sp/rules/optimization/search Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Optimization-Rules/operation/SearchOptimizationRules ## Call it MCP tool call: ```json { "name": "ads_search_optimization_rules", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_search_optimization_rules \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | REQUIRED — Amazon 400s on an empty body. Exactly one of: a rule id filter ALONE (optimizationRuleFilter. optimizationRuleId), or campaignId + ruleCategory + ruleSubCategory together (campaignId lives in its OWN top-level campaignFilter object). | | `apiVersion` | string | | v1 (default — BID+SCHEDULE only) \| v2 (adds PERFORMANCE rules, the condition metrics, targeting[], and the ruleName/ruleStatus search filters). | ## Result - Amazon's payload in data.result. - `data.result.optimizationRules[]` — each with optimizationRuleId, status, ruleCategory, ruleSubCategory. - `data.nextToken` — pass back as body.nextToken with the SAME filters; the page size is pageSize on v1 (≤ 100 rules) or maxResults on v2 (1–300). ## Gotchas - v2's ruleName filter is unreliable — a name-filtered query can return 0 rows against many a name-less query returns. Filter by id or by campaign+category+subcategory and match names client-side. # ads_sp_create_optimization_rules (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_create_optimization_rules) > Create a Sponsored Products bid optimization rule — schedule or performance bid rules that raise bids automatically. Access: **WRITE** · toolset amazon_ads · family ads.sp List existing rules first with ads_search_optimization_rules; a new rule changes nothing until it is associated with ads_associate_optimization_rules_to_campaign. Amazon Ads API · CreateOptimizationRules · POST /sp/rules/optimization Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Optimization-Rules/operation/CreateOptimizationRules Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_sp_create_optimization_rules", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_create_optimization_rules \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | one rule object, a list, or Amazon's {optimizationRules: [...]} envelope (all accepted) — v1 takes exactly ONE rule per call, v2 1–300. | | `apiVersion` | string | | v1 (default — BID+SCHEDULE only) \| v2 (adds PERFORMANCE rules — ruleCategory TARGETING — and targeting[]). | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.failed` — [{index, optimizationRuleId, code, details}] for every item Amazon did not confirm. ALWAYS relay this verbatim. - `data.result.responses` — per rule, optimizationRule.optimizationRuleId — pass it to ads_associate_optimization_rules_to_campaign. ## Body (Amazon schema; application/vnd.spoptimizationrules.v1+json): {optimizationRules - [OptimizationRulesAPISwaggerOptimizationRuleWithoutRuleId]} (exactly 1), each item: action*: {actionDetails*: {actionOperator*, actionUnit*, value*}, actionType*: ADOPT} action.actionDetails.actionOperator: INCREMENT action.actionDetails.actionUnit: PERCENT conditions: [{attributeName: ROAS, criteria: {maxValue*, minValue*} | {comparisonOperator*, value*}}] (max 1) conditions.criteria.comparisonOperator: EQUAL_TO | GREATER_THAN | GREATER_THAN_OR_EQUAL_TO | LESS_THAN | LESS_THAN_OR_EQUAL_TO recurrence*: {daysOfWeek, duration*: {endTime, eventId, eventName, startTime}, timesOfDay: [{endTime*, startTime*}] (max 1), type*: DAILY | WEEKLY} recurrence.daysOfWeek: [FRIDAY | MONDAY | SATURDAY | SUNDAY | THURSDAY | TUESDAY | WEDNESDAY] ruleCategory*: BID ruleName: string ruleSubCategory*: SCHEDULE status: ENABLED | ENDED | PAUSED | SCHEDULED ## Gotchas - Rules only ever INCREMENT by a PERCENT — there is no decrease action. - Changes take up to 24 HOURS to take effect. Max 20 schedule rules per campaign. - Rules active together STACK ADDITIVELY (a 10% daily + 20% event rule = +30%), on top of placement adjustments and bidding strategies. - The response echoes status 'SCHEDULED' even when you sent 'ENABLED' — that is normal, not a failure. - ruleCategory BID pins ruleSubCategory to SCHEDULE; ruleCategory TARGETING pins it to PERFORMANCE — any other pairing 400s, so a performance condition only ever adjusts TARGETING, never a plain BID rule. BUDGET appears in the spec's ruleCategory enum but Amazon rejects it — budget automation lives in ads_create_budget_rules_for_campaigns. - A TARGETING/PERFORMANCE rule must NOT carry recurrence (Amazon rejects it — the start time is the creation time) and MUST carry targeting[]. ACOS is in the spec's condition attributeName enum but Amazon rejects it here — for ACOS-gated automation use ads_create_budget_rules_for_campaigns instead (it acts on budget, not bids). - Mutually exclusive with ads_create_optimization_rule (the DIFFERENT campaign-optimization / rule-based-bidding API) on the same campaign — associating this kind of rule fails "Campaign has performance based rule enabled…" if the other kind is already attached. Pick ONE automation model per campaign. # ads_sp_get_all_rule_events (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_all_rule_events) > Sponsored Products: list the special shopping events (Prime Day, Black Friday, …) with Amazon's suggested date range in this profile's marketplace. Access: **READ** · toolset amazon_ads · family ads.sp An eventId scopes an SP budget rule (duration.eventTypeRuleDuration.eventId on ads_create_budget_rules_for_campaigns) or a bid rule (recurrence.duration.eventId). Amazon Ads API · SPGetAllRuleEvents · POST /sp/v1/events Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/BudgetRulesRecommendation/operation/SPGetAllRuleEvents ## Call it MCP tool call: ```json { "name": "ads_sp_get_all_rule_events", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_get_all_rule_events \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | ## Result - Amazon's payload in data.result. - `data.result.events[]` — {eventId, eventName, startDate, endDate}. - `data.result.groupedEvents[]` — {groupedEventId, groupedEventName, startDate, endDate}. ## Gotchas - Pass an eventId as recurrence.duration.eventId (with eventName) on ads_sp_create_optimization_rules to bound a rule to the event instead of hardcoding dates. Rule changes take up to 24h to take effect, so create event rules well before the event starts. # ads_sp_update_optimization_rules (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_update_optimization_rules) > Update a Sponsored Products bid optimization rule — Amazon replaces the rule, it does not merge, so send the FULL rule object(s) including optimizationRuleId. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Read the current rule first with ads_search_optimization_rules. Amazon Ads API · UpdateOptimizationRules · PUT /sp/rules/optimization Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Optimization-Rules/operation/UpdateOptimizationRules Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_sp_update_optimization_rules", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_update_optimization_rules \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | the FULL rule object(s) including optimizationRuleId — v1 1–25 rules per call, v2 1–300. | | `apiVersion` | string | | v1 (default) \| v2 — must match the rule's own kind. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.failed` — [{index, optimizationRuleId, code, details}] for every item Amazon did not confirm. ALWAYS relay this verbatim. ## Body (Amazon schema; application/vnd.spoptimizationrules.v1+json): {optimizationRules - [OptimizationRulesAPISwaggerOptimizationRule]} (1–25), each item: action*: {actionDetails*: {actionOperator*, actionUnit*, value*}, actionType*: ADOPT} action.actionDetails.actionOperator: INCREMENT action.actionDetails.actionUnit: PERCENT conditions: [{attributeName: ROAS, criteria: {maxValue*, minValue*} | {comparisonOperator*, value*}}] (max 1) conditions.criteria.comparisonOperator: EQUAL_TO | GREATER_THAN | GREATER_THAN_OR_EQUAL_TO | LESS_THAN | LESS_THAN_OR_EQUAL_TO recurrence*: {daysOfWeek, duration*: {endTime, eventId, eventName, startTime}, timesOfDay: [{endTime*, startTime*}] (max 1), type*: DAILY | WEEKLY} recurrence.daysOfWeek: [FRIDAY | MONDAY | SATURDAY | SUNDAY | THURSDAY | TUESDAY | WEDNESDAY] ruleCategory*: BID ruleName: string ruleSubCategory*: SCHEDULE status: ENABLED | ENDED | PAUSED | SCHEDULED optimizationRuleId: string ## Gotchas - To stop a rule, send status: PAUSED yourself — it is the only status Amazon honours as an off-switch. ARCHIVED and ENDED are refused before the call reaches Amazon (Amazon itself 400s ARCHIVED and silently reverts ENDED to SCHEDULED). - A rule read back from ads_search_optimization_rules may carry a `recurrence` (on a TARGETING rule, which rejects it on write) or an empty v2 `targeting: []` (which 400s as "size must be between 1 and 1") — both are stripped automatically before the write, so a naive list -> edit -> update round trip does not fail. - Changes take up to 24 hours to take effect; rules stack additively. # ads_target_export (https://sellersheetai.com/docs/mcp-api/tools/ads_target_export) > Submit a bulk export of every targeting clause (keywords, product targets and all negatives) across Sponsored Products, Brands and Display — an asynchronous full snapshot in one fi Access: **READ** · toolset amazon_ads · family ads.exports le. For a filtered, paged read use ads_query_target. Amazon Ads API · TargetExport · POST /targets/export Docs: https://advertising.amazon.com/API/docs/en-us/exports#tag/Exports/operation/TargetExport ## Call it MCP tool call: ```json { "name": "ads_target_export", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_target_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | optional filters — adProductFilter (default: all three ad products) and stateFilter (default ENABLED + PAUSED; ARCHIVED only when asked for). Targets also take negativeFilter, targetLevelFilter and targetTypeFilter (see Body). | ## Result - Amazon's payload in data.result. - `data.result.exportId` — poll it with ads_get_export, typeExport='targets', until data.result.status is COMPLETED (or FAILED). # ads_update_optimization_rule (https://sellersheetai.com/docs/mcp-api/tools/ads_update_optimization_rule) > Sponsored Products: update a rule-based-bidding rule — same shape as ads_create_optimization_rule plus campaignOptimizationId. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.sp Amazon Ads API · UpdateOptimizationRule · PUT /sp/rules/campaignOptimization Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Campaign-Optimization-Rules/operation/UpdateOptimizationRule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_optimization_rule", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_optimization_rule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the rule shape from ads_create_optimization_rule plus campaignOptimizationId. | ## Result - Amazon's payload in data.result. ## Gotchas - Same field-enum quirks as ads_create_optimization_rule (ruleType only BID; ROAS condition mandatory; comparisonOperator effectively GREATER_THAN | EQUAL_TO for ROAS). # ads_update_recommendation (https://sellersheetai.com/docs/mcp-api/tools/ads_update_recommendation) > Modify one Amazon-generated Sponsored Products campaign recommendation before accepting it. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.recommendations Amazon Ads API · UpdateRecommendation · PUT /recommendations/{recommendationId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_recommendation", "arguments": { "store": "myStore-US", "countryCode": "", "recommendationId": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_recommendation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","recommendationId":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `recommendationId` | string | yes | the recommendation to modify — carried inside the request body as body.recommendationId. | | `body` | object | yes | one of recommendedValue (a string: a number for budgets and bids, YYYY-MM-DD for CAMPAIGN_END_DATE, ENABLED / PAUSED / ARCHIVED for the *_STATE types, a strategy name for CAMPAIGN_BIDDING_STRATEGY), budgetRule.ruleDetails, or ruleBasedBidding.recommendedRuleRoas — matching the recommendation's type. | ## Result - Amazon's payload in data.result. # ads_create_portfolio (https://sellersheetai.com/docs/mcp-api/tools/ads_create_portfolio) > Create portfolios (cross-product: Sponsored Products, Brands and Display). Access: **WRITE** · toolset amazon_ads · family ads.portfolios Amazon Ads API · CreatePortfolios · POST /portfolios Docs: https://advertising.amazon.com/API/docs/en-us/reference/portfolios#tag/Portfolios/operation/CreatePortfolios Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_portfolio", "arguments": { "store": "myStore-US", "countryCode": "", "body": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_portfolio \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] | yes | a bare list of portfolio objects (1–100) — the server wraps it in {portfolios: [...]}, so never send that envelope. name* and state* ('ENABLED') are required; budget is optional ({amount, currencyCode, policy, startDate, endDate}; dates YYYY-MM-DD). | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.portfolios.success` — [{index, portfolioId, portfolio}] — each created portfolio and its id; index is its position in your list. - `data.result.portfolios.error` — [{index, errors}] — items Amazon refused (notification.type is 'warning' when some items failed, 'error' when none succeeded). ## Gotchas - A portfolio's state can only be ENABLED — the one value in Amazon's portfolio API (create, update and list); a portfolio cannot be paused, archived or deleted through the API — do that in the Amazon Ads console. - Check existing names with ads_list_portfolios first; put campaigns in the new portfolio by setting portfolioId with ads_create_campaign or ads_update_campaign. # ads_get_category_recommendations_for_asins (https://sellersheetai.com/docs/mcp-api/tools/ads_get_category_recommendations_for_asins) > Sponsored Products: category targets recommended for a list of ASINs — the coarse half of SP product targeting; narrow one further with ads_get_refinements_for_category. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · getCategoryRecommendationsForASINs · POST /sp/targets/categories/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Product-Targeting/operation/getCategoryRecommendationsForASINs ## Call it MCP tool call: ```json { "name": "ads_get_category_recommendations_for_asins", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_category_recommendations_for_asins \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | {"asins": ["B0XXXXXXXX", ...], "includeAncestor": false} — includeAncestor optionally also returns ancestor categories (more results, less relevant). | | `locale` | string | | the language of the returned category names; omit for the marketplace's default language. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. | ## Result - Amazon's payload in data.result. ## Gotchas - Amazon 500s ("Failed to get category recommendations") for some ASIN/marketplace combinations — relayed as an Amazon error, not a SellerSheet bug. Do not retry-loop; try other ASINs or use ads_sp_get_product_recommendations instead. - Only entries with canBeTargeted=true can be used as targets. - Best practice: call ads_get_refinements_for_category on a chosen category id to get the brand / age-range / genre facets, then create the target with ads_create_target, targetType='PRODUCT_CATEGORY' and targetDetails={"productCategoryTarget": {"productCategoryRefinement": { "productCategoryRefinement": {"productCategoryId": ""}}}} (productCategoryRefinement is nested TWICE — the outer key is the wrapper, the inner one holds the fields). # ads_get_negative_brands (https://sellersheetai.com/docs/mcp-api/tools/ads_get_negative_brands) > Sponsored Products: brands Amazon recommends excluding from targeting (no input needed). Access: **READ** · toolset amazon_ads · family ads.sp To search for a named competitor brand instead, use ads_search_brands. Amazon Ads API · getNegativeBrands · GET /sp/negativeTargets/brands/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Product-Targeting/operation/getNegativeBrands ## Call it MCP tool call: ```json { "name": "ads_get_negative_brands", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_negative_brands \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | ## Result - Amazon's payload in data.result. ## Gotchas - There is NO negative-KEYWORD suggestion endpoint in the Amazon Ads API. To find wasteful search terms, query the SP search-term report (query_report_data on rpt_sp_search_terms — high spend, zero orders), not this tool. - Amazon returns a bare array of {id, name} objects, not an envelope. - To exclude a brand, create a negative target with ads_create_target: targetType PRODUCT_CATEGORY, negative true, targetDetails {productCategoryTarget: {productCategoryRefinement: { productCategoryRefinement: {productBrandId: }}}} (the wrapper key is nested twice). # ads_get_ranked_keyword_recommendation (https://sellersheetai.com/docs/mcp-api/tools/ads_get_ranked_keyword_recommendation) > Sponsored Products: ranked keyword recommendations with per-match-type suggested bids, from either an ad group or a list of ASINs. Access: **READ** · toolset amazon_ads · family ads.sp Amazon Ads API · getRankedKeywordRecommendation · POST /sp/targets/keywords/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Keyword-Targets/operation/getRankedKeywordRecommendation ## Call it MCP tool call: ```json { "name": "ads_get_ranked_keyword_recommendation", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_ranked_keyword_recommendation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | ONE of: - ASIN-based: {"asins": ["B0..."], "maxRecommendations": 100} - ad-group-based:{"adGroupId": "...", "campaignId": "...", "maxRecommendations": 100, "sortDimension": "CLICKS"} recommendationType (KEYWORDS_FOR_ASINS vs KEYWORDS_FOR_ADGROUP) is auto-inferred from whether you pass asins or adGroupId. maxRecommendations 0–200 (default 200; 0 ranks only the keywords you pass in targets); asins ≤ 50; targets ≤ 100. | ## Result - Amazon's payload in data.result. - `data.result.keywordTargetList` — [{keyword, bidInfo}] — one bidInfo entry per match type with its suggested bid, rank and theme. ## Gotchas - The server calls Amazon's v5 media type and automatically falls back to v4 if the marketplace refuses v5. v5 adds a `theme` and `rank` per bidInfo entry and returns a suggested bid for EVERY match type, where v4 left EXACT/PHRASE bids null in ASIN mode. - Bids here are INTEGER MINOR UNITS (94 = 0.94 AED). The theme- based ads_get_theme_based_bid_recommendation_for_ad_group_v1 tool returns DECIMAL currency (2.09 = 2.09 AED). Convert to a single consistent unit before comparing or combining the two. - Create the picked keywords as KEYWORD targets with ads_create_target. # ads_get_refinements_for_category (https://sellersheetai.com/docs/mcp-api/tools/ads_get_refinements_for_category) > Sponsored Products: the refinements (brand / age-range / genre facets) targetable WITHIN a category — e.g. Access: **READ** · toolset amazon_ads · family ads.sp "Toys > Building Sets" refined to brand=LEGO. Amazon Ads API · getRefinementsForCategory · GET /sp/targets/category/{categoryId}/refinements Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Product-Targeting/operation/getRefinementsForCategory ## Call it MCP tool call: ```json { "name": "ads_get_refinements_for_category", "arguments": { "store": "myStore-US", "countryCode": "", "categoryId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_refinements_for_category \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","categoryId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `categoryId` | string | yes | from ads_get_category_recommendations_for_asins (or the catalog browse node). | | `locale` | string | | the language of the returned facet names; omit for the marketplace's default language. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. Allowed: ar_AE \| de_DE \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es_ES \| es_MX \| fr_CA \| fr_FR \| hi_IN \| it_IT \| ja_JP \| ko_KR \| nl_NL \| pl_PL \| pt_BR \| sv_SE \| ta_IN \| th_TH \| tr_TR \| vi_VN \| zh_CN. | ## Result - Amazon's payload in data.result. ## Gotchas - data.result.brands / ageRanges / genres are the facet ids to build the target with (ageRanges / genres may be null). - Best practice: build the target with ads_create_target, targetType='PRODUCT_CATEGORY', targetDetails= {"productCategoryTarget": {"productCategoryRefinement": { "productCategoryRefinement": {"productCategoryId": "", "productBrandId"?, "productAgeRangeId"?, "productGenreId"?}}}} — keep only the facets you actually want to narrow by (productCategoryRefinement is nested TWICE — the outer key is the wrapper, the inner one holds the fields). # ads_get_theme_based_bid_recommendation_for_ad_group_v1 (https://sellersheetai.com/docs/mcp-api/tools/ads_get_theme_based_bid_recommendation_for_ad_group_v1) > Sponsored Products: suggested bid amounts for keywords or targeting expressions, for an existing ad group or a new one. Access: **READ** · toolset amazon_ads · family ads.sp Use before creating or updating keywords/targets to set competitive bids. Amazon Ads API · GetThemeBasedBidRecommendationForAdGroup_v1 · POST /sp/targets/bid/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Theme-based-bid-recommendations/operation/GetThemeBasedBidRecommendationForAdGroup_v1 ## Call it MCP tool call: ```json { "name": "ads_get_theme_based_bid_recommendation_for_ad_group_v1", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_get_theme_based_bid_recommendation_for_ad_group_v1 \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | pick the shape that matches your case: - Auto targeting on an EXISTING ad group: targetingExpressions [{"type": "CLOSE_MATCH"\|"LOOSE_MATCH"\|"SUBSTITUTES"\| "COMPLEMENTS"}], campaignId, adGroupId, recommendationType: "BIDS_FOR_EXISTING_AD_GROUP". - Keyword/PAT targeting for a NEW ad group: asins, targetingExpressions, bidding.strategy, recommendationType: "BIDS_FOR_NEW_AD_GROUP". | ## Result - Amazon's payload in data.result. ## Body (Amazon schema; application/vnd.spthemebasedbidrecommendation.v3+json), one of - AdGroupThemeBasedBidRecommendationRequest adGroupId*: string campaignId*: string recommendationType*: BIDS_FOR_EXISTING_AD_GROUP targetingExpressions*: [{type*, value}] (max 100) (max 100 per request, use pagination for more if needed) targetingExpressions.type: CLOSE_MATCH | COMPLEMENTS | KEYWORD_BROAD_MATCH | KEYWORD_EXACT_MATCH | KEYWORD_PHRASE_MATCH | LOOSE_MATCH | SUBSTITUTES AsinsThemeBasedBidRecommendationRequest asins*: [string] (max 50) bidding*: {adjustments: [{percentage, predicate}] (max 3), strategy*} bidding.adjustments.predicate: PLACEMENT_PRODUCT_PAGE | PLACEMENT_REST_OF_SEARCH | PLACEMENT_TOP bidding.strategy: AUTO_FOR_SALES | LEGACY_FOR_SALES | MANUAL | RULE_BASED recommendationType*: BIDS_FOR_NEW_AD_GROUP targetingExpressions*: [{type*, value}] (max 100) (max 100 per request, use pagination for more if needed) targetingExpressions.type: CLOSE_MATCH | COMPLEMENTS | KEYWORD_BROAD_MATCH | KEYWORD_EXACT_MATCH | KEYWORD_PHRASE_MATCH | LOOSE_MATCH | SUBSTITUTES ## Gotchas - The AUTO types (CLOSE_MATCH/LOOSE_MATCH/SUBSTITUTES/ COMPLEMENTS) and the KEYWORD_* types are TYPE-ONLY — do NOT add a `value` with keyword text (that is only required by the separate ads_get_ranked_keyword_recommendation endpoint). The PAT_* types are the exception: each takes a `value` (target ASIN, category id, or category refinement id). - The response keys each suggested bid back to the expression's `value` when it has one, else to its `type`. # ads_list_portfolios (https://sellersheetai.com/docs/mcp-api/tools/ads_list_portfolios) > List portfolios (group campaigns across Sponsored Products, Brands and Display for shared budget caps and reporting). Access: **READ** · toolset amazon_ads · family ads.portfolios To create or change one use ads_create_portfolio / ads_update_portfolio. Amazon Ads API · ListPortfolios · POST /portfolios/list Docs: https://advertising.amazon.com/API/docs/en-us/reference/portfolios#tag/Portfolios/operation/ListPortfolios ## Call it MCP tool call: ```json { "name": "ads_list_portfolios", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_list_portfolios \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | dict of filters or omit for all. Filters use {"include": [...]} form, e.g.: {"stateFilter": {"include": ["ENABLED"]}, "portfolioIdFilter": {"include": ["123", "456"]}, "nameFilter": {"include": ["My Portfolio"]}} | ## Result - Amazon's payload in data.result. - `data.result.portfolios` — [{portfolioId, name, state, budget, inBudget}]. - `data.result.nextToken` — present when more remain — call again with the same filters plus {"nextToken": ""}; one call returns one page. # ads_search_brands (https://sellersheetai.com/docs/mcp-api/tools/ads_search_brands) > Sponsored Products: search for a brand by name, to exclude it from targeting (negative brand target) — use this to find a specific named competitor. Access: **READ** · toolset amazon_ads · family ads.sp For Amazon's own suggestions with no input, use ads_get_negative_brands. Amazon Ads API · searchBrands · POST /sp/negativeTargets/brands/search Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Product-Targeting/operation/searchBrands ## Call it MCP tool call: ```json { "name": "ads_search_brands", "arguments": { "store": "myStore-US", "countryCode": "", "keyword": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_search_brands \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","keyword":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `keyword` | string | yes | the brand-name query (e.g. 'lego'). | ## Result - Amazon's payload in data.result. ## Gotchas - Amazon returns a bare array of {id, name} objects, not an envelope. - To exclude a found brand, create the negative brand target ads_get_negative_brands describes (ads_create_target with productBrandId = the brand's id). # ads_sp_bulk_create (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_bulk_create) > Create complete Sponsored Products campaign structures in one call (Amazon Ads API v1) — campaign → ad groups → product ads → targets, with the created ids chained server-side. Access: **WRITE** · toolset amazon_ads · family ads.v1 The whole request is validated and preflighted first, so a malformed spec, a duplicate campaign name or an ASIN you do not own creates nothing. Amazon Ads API · QueryCampaign · POST /adsApi/v1/query/campaigns Amazon Ads API · ProductMetadata · POST /product/metadata Amazon Ads API · CreateCampaign · POST /adsApi/v1/create/campaigns Amazon Ads API · CreateAdGroup · POST /adsApi/v1/create/adGroups Amazon Ads API · CreateAd · POST /adsApi/v1/create/ads Amazon Ads API · CreateTarget · POST /adsApi/v1/create/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/QueryCampaign Docs: https://advertising.amazon.com/API/docs/en-us/product-metadata#tag/Product-Selector/operation/ProductMetadata Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/CreateCampaign Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups#tag/AdGroups/operation/CreateAdGroup Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads#tag/Ads/operation/CreateAd Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/CreateTarget Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_sp_bulk_create", "arguments": { "store": "myStore-US", "countryCode": "", "campaign_spec": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_bulk_create \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaign_spec":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaign_spec` | object[] | yes | [{campaign, negativeTargets, adGroups}] — campaign: {name*, state PAUSED (default — a bulk never launches spend by accident) \| ENABLED, dailyBudget*, startDate* 'YYYYMMDD', endDate, targetingType MANUAL (default) \| AUTO, bidStrategy SALES_DOWN_ONLY (default) \| SALES_UP_AND_DOWN \| MANUAL, portfolioId, campaignId (resume only)}; negativeTargets: campaign-level blocks [{targetType KEYWORD \| PRODUCT, targetDetails, state}]; adGroups: [{adGroup: {name*, defaultBid*, state, adGroupId (resume only)}, productAds: [{sku OR asin, state}], targets: [{targetType*, targetDetails*, bid, state}], negativeTargets: [{targetType* KEYWORD \| PRODUCT, targetDetails*, state}]}]. A biddable target's targetType is KEYWORD \| PRODUCT \| PRODUCT_CATEGORY \| THEME, with targetDetails exactly as ads_create_target takes them (the amazon-ads skill lists the catalog); one ad group is single-targeting-type — keyword targets and product/category/theme targets need separate ad groups. At most 10 campaigns per call, 20 ad groups per campaign and 100 productAds / targets / negativeTargets per ad group — split larger launches. | ## Result - the orchestrated result described below. - `data.results` — per campaign {campaignName, status SUCCESS | PARTIAL | ERROR, campaignId, adGroupIds {name: id}, steps: [{action, status, id | error}], message} — inspect every step; PARTIAL means some children failed. ## Gotchas - A rejected request names the field path of each problem. After the preflight only Amazon-side state (an ineligible product) fails, per step: that campaign becomes PARTIAL and every other step proceeds. - A seller account advertises by SKU (one SKU = one ASIN, so it names the offer). An asin is resolved to your SKU, but when it maps to several SKUs the whole request is rejected with the SKUs listed — prefer sku when you list a product more than once. A Vendor Central account has no SKUs and passes asin. - To resume a PARTIAL campaign re-call with the row's campaignId and each created adGroupId (with its defaultBid), OMITTING every child (product ad, target, negative) whose step shows SUCCESS — only the campaign and ad groups are skipped by id; children are re-sent verbatim and an existing one returns a per-index duplicate error. - Idea sources: ads_get_ranked_keyword_recommendation, ads_sp_get_product_recommendations, ads_get_category_recommendations_for_asins, ads_get_budget_recommendation, ads_get_theme_based_bid_recommendation_for_ad_group_v1. ## Example - one manual campaign with a product-targeting ad group — [{"campaign": {"name": "AE_Widget_SP_PT", "state": "PAUSED", "dailyBudget": 10, "startDate": "20261201"}, "adGroups": [{"adGroup": {"name": "AE_Widget_SP_PT_Main", "defaultBid": 0.4}, "productAds": [{"sku": "MY-SKU-001"}], "targets": [{"targetType": "PRODUCT", "bid": 0.4, "targetDetails": {"productTarget": {"matchType": "PRODUCT_EXACT", "product": {"productId": "B0XXXXXXXX"}, "productIdType": "ASIN"}}}], "negativeTargets": [{"targetType": "KEYWORD", "targetDetails": {"keywordTarget": {"keyword": "cheap", "matchType": "EXACT"}}}]}]}] # ads_sp_get_budget_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_budget_recommendations) > Sponsored Products: the recommended daily budget and missed opportunities for existing campaigns — campaigns that are budget-capped, losing impressions/clicks/sales because they ru Access: **READ** · toolset amazon_ads · family ads.sp n out of budget. (Distinct from ads_get_budget_recommendation, which covers a new campaign, before it exists.) Amazon Ads API · getBudgetRecommendations · POST /sp/campaigns/budgetRecommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Budget-recommendations-and-missed-opportunities/operation/getBudgetRecommendations ## Call it MCP tool call: ```json { "name": "ads_sp_get_budget_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "campaignIds": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_get_budget_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignIds":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignIds` | string[] | yes | 1-100 campaign id strings, from ads_query_campaign. | ## Result - Amazon's payload in data.result. - `data.result.budgetRecommendationsSuccessResults` — [{index, campaignId, suggestedBudget, sevenDaysMissedOpportunities {startDate, endDate, percentTimeInBudget, estimatedMissed*Lower/Upper}}]. - `data.result.budgetRecommendationsErrorResults` — per-campaign failures {index, campaignId, code, details}. ## Gotchas - sevenDaysMissedOpportunities reflects the campaign's last ACTIVE period. For a long-paused campaign that window can be YEARS old — always show startDate/endDate next to the numbers. - percentTimeInBudget = -1.0 with null dates is the "no data" sentinel (never served / long paused) — it is NOT 0%, never render it as a percent. - Apply a raise with ads_update_campaign_budget. # ads_sp_get_product_recommendations (https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_product_recommendations) > Sponsored Products: suggested target ASINs (product targets) for your advertised ASINs — competitor / complementary ASINs Amazon considers relevant, each with the themes that produ Access: **READ** · toolset amazon_ads · family ads.sp ced it (e.g. "Similar items (frequently viewed together)"). Amazon Ads API · getProductRecommendations · POST /sp/targets/products/recommendations Docs: https://advertising.amazon.com/API/docs/en-us/sponsored-products/3-0/openapi/prod#tag/Product-Recommendation-Service/operation/getProductRecommendations ## Call it MCP tool call: ```json { "name": "ads_sp_get_product_recommendations", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_sp_get_product_recommendations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {"adAsins": ["B0XXXXXXXX", ...], "count": 25, "cursor": "..."} — adAsins is the ASINs you advertise; count is optional (default 5); cursor pages from the previous data.nextCursor (send the same count with it). | ## Result - Amazon's payload in data.result. ## Gotchas - Best practice: get bids for the picked ASINs with ads_get_theme_based_bid_recommendation_for_ad_group_v1 (targetingExpressions [{"type": "PAT_ASIN", "value": ""}]), then create them as PRODUCT targets with ads_create_target (targetDetails.productTarget, matchType PRODUCT_EXACT). # ads_update_portfolio (https://sellersheetai.com/docs/mcp-api/tools/ads_update_portfolio) > Update portfolios (cross-product: Sponsored Products, Brands and Display). Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.portfolios Amazon Ads API · UpdatePortfolios · PUT /portfolios Docs: https://advertising.amazon.com/API/docs/en-us/reference/portfolios#tag/Portfolios/operation/UpdatePortfolios Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_portfolio", "arguments": { "store": "myStore-US", "countryCode": "", "body": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_portfolio \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] | yes | a bare list of {portfolioId*, ...fields to change} (1–100) — the server wraps it in {portfolios: [...]}; never send that envelope. | ## Result - 207, one result per item; an item whose code is not "Ok" (or that is listed under error / failures) failed — read its details. - `data.result.portfolios.success` — [{index, portfolioId, portfolio}] — each updated portfolio and its id; index is its position in your list. - `data.result.portfolios.error` — [{index, errors}] — items Amazon refused (notification.type is 'warning' when some items failed, 'error' when none succeeded). ## Gotchas - A portfolio's state can only be ENABLED — the one value in Amazon's portfolio API (create, update and list); a portfolio cannot be paused, archived or deleted through the API — do that in the Amazon Ads console. # ads_create_ad (https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad) > Create ads (creatives) across ALL ad products via the unified Amazon Ads API v1. Access: **WRITE** · toolset amazon_ads · family ads.v1 In the v1 model an "ad" is the creative unit inside an ad group; a sponsored ad's advertised product is inside its creative (productCreative for SP, componentCreative for SB and SD, videoCreative for ST) — ad associations (ads_query_ad_association) are AMAZON_DSP's ad-to-ad-group links, not product links. Amazon Ads API · CreateAd · POST /adsApi/v1/create/ads Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads#tag/Ads/operation/CreateAd Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_ad", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_ad \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of ad objects (or {ads: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].ad` — each created ad with its adId; index is its position in your list — partialSuccess[] items were created with errors, error[] items were not. ## Gotchas - adGroupId is REQUIRED for SPONSORED_PRODUCTS, SPONSORED_BRANDS, SPONSORED_DISPLAY and SPONSORED_TELEVISION — only AMAZON_DSP creates ads without an ad group. - adType and creative follow adProduct: SP PRODUCT_AD + productCreative, SB and SD COMPONENT + componentCreative, ST VIDEO + videoCreative (SB and ST also require name); AUDIO, DISPLAY and THIRD_PARTY are AMAZON_DSP's. - productIdType is SKU or ASIN (SP also lists RETAILER_OFFER); a SELLER should use SKU (one SKU names exactly one ASIN, whereas one ASIN can cover several SKUs) — a VENDOR account has no seller SKUs and uses ASIN. SB creatives are ASIN-only. - A well-formed create can still fail per-index with PRODUCT_INELIGIBLE when the product is not currently buyable — check listing status first. # ads_create_ad_association (https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_association) > Create ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product link in Access: **WRITE** · toolset amazon_ads · family ads.v1 the ad itself (see ads_query_ad). Amazon Ads API · CreateAdAssociation · POST /adsApi/v1/create/adAssociations Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations#tag/AdAssociations/operation/CreateAdAssociation Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_ad_association", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_ad_association \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {adId*, adGroupId*, state*, weight?, startDateTime?, endDateTime?} (or {adAssociations: [...]}), at most 20 — weight is the percentage of the ad group's traffic this creative receives. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adAssociation` — each created ad association with its adAssociationId; index is its position in your list — partialSuccess[] items were created with errors, error[] items were not. ## Gotchas - DSP-only: on a sponsored-ads profile the call fails with Amazon's 401 "not authorized to access account", returned as a 400 — only call this entity for DSP work. - Both the ad (ads_create_ad) and the ad group must already exist. # ads_create_ad_group (https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_group) > Create ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). Access: **WRITE** · toolset amazon_ads · family ads.v1 Amazon Ads API · CreateAdGroup · POST /adsApi/v1/create/adGroups Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups#tag/AdGroups/operation/CreateAdGroup Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_ad_group", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_ad_group \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of ad-group objects (or {adGroups: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adGroup` — each created ad group with its adGroupId; index is its position in your list — partialSuccess[] items were created with errors, error[] items were not. ## Gotchas - The parent campaign must already exist (ads_create_campaign). - SPONSORED_PRODUCTS also requires bid: {defaultBid: } — the ad group's default max bid; SPONSORED_DISPLAY requires marketplaceScope and marketplaces ('GB' for a 'UK' profile). # ads_create_campaign (https://sellersheetai.com/docs/mcp-api/tools/ads_create_campaign) > Create advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon DSP; t Access: **WRITE** · toolset amazon_ads · family ads.v1 he ad product is the `adProduct` field, never a separate tool. Amazon Ads API · CreateCampaign · POST /adsApi/v1/create/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/CreateCampaign Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_campaign", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_campaign \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of campaign objects (or {campaigns: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].campaign` — each created campaign with its campaignId; index is its position in your list — partialSuccess[] items were created with errors, error[] items were not. ## Gotchas - To launch a whole Sponsored Products structure (campaign, ad groups, product ads, targets) in one validated call use ads_sp_bulk_create. - SPONSORED_PRODUCTS also needs marketplaceScope=SINGLE_MARKETPLACE, marketplaces=[the profile's country code — 'GB' for a 'UK' profile] (country codes, not marketplace ids — empty -> 400), startDateTime (ISO 8601 date-time, e.g. '2026-12-01T00:00:00Z'), autoCreationSettings: {autoCreateTargets: true for an auto campaign, false for manual} and budgets: [{budgetType: 'MONETARY', recurrenceTimePeriod: 'DAILY', budgetValue: {monetaryBudgetValue: {monetaryBudget: {value: }}}}]. - SPONSORED_BRANDS and SPONSORED_DISPLAY also need budgets, costType (SD: CPC | VCPM), marketplaceScope and startDateTime; SPONSORED_TELEVISION budgets and startDateTime; AMAZON_DSP flights and optimizations. - Create test campaigns PAUSED; delete = archive (Amazon never hard-deletes). # ads_create_target (https://sellersheetai.com/docs/mcp-api/tools/ads_create_target) > Create targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negative=true Access: **WRITE** · toolset amazon_ads · family ads.v1 , ad-group or campaign level); there is no separate keywords entity in v1. Amazon Ads API · CreateTarget · POST /adsApi/v1/create/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/CreateTarget Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_create_target", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_create_target \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of target objects (or {targets: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].target` — each created target with its targetId; index is its position in your list — partialSuccess[] items were created with errors, error[] items were not. ## Gotchas - negative=false is a biddable target; true is a negative (block) target. Set campaignId + adGroupId for an ad-group-level target; set campaignId and OMIT adGroupId for a CAMPAIGN-LEVEL target (e.g. a campaign negative keyword; SPONSORED_PRODUCTS and SPONSORED_DISPLAY only — SB, ST and DSP targets require adGroupId) — Amazon echoes targetLevel: CAMPAIGN. - targetType by ad product: SP KEYWORD | PRODUCT | PRODUCT_CATEGORY | THEME | LOCATION; SB KEYWORD | PRODUCT | PRODUCT_CATEGORY | THEME; SD AUDIENCE | CONTENT_CATEGORY | KEYWORD | LOCATION | PRODUCT | PRODUCT_AUDIENCE | PRODUCT_CATEGORY | THEME; ST AUDIENCE | LOCATION; every other value is AMAZON_DSP's. - A keyword target is {adProduct, campaignId, adGroupId, negative: false, state: 'ENABLED', targetType: 'KEYWORD', bid: {bid: }, targetDetails: {keywordTarget: {keyword, matchType: BROAD | EXACT | PHRASE}}} — bid wraps the number. - An SP ad group is SINGLE-targeting-type: keyword targets and product targets cannot coexist in one ad group. Adding the second type fails with the misleading FIELD_VALUE_NOT_UNIQUE "Duplicate object found" — use separate ad groups per targeting type. - productTarget.product is an OBJECT wrapping productId, not a bare string (a bare string 400s "Expected null"). - productCategoryTarget nests productCategoryRefinement TWICE — the outer key is the wrapper, the inner one holds the fields; a single level 400s. # ads_delete_ad (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad) > Delete (archive) ads (creatives) across ALL ad products via the unified Amazon Ads API v1. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 In the v1 model an "ad" is the creative unit inside an ad group; a sponsored ad's advertised product is inside its creative (productCreative for SP, componentCreative for SB and SD, videoCreative for ST) — ad associations (ads_query_ad_association) are AMAZON_DSP's ad-to-ad-group links, not product links. Amazon Ads API · DeleteAd · POST /adsApi/v1/delete/ads Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads#tag/Ads/operation/DeleteAd Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_ad", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_ad \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {adIds: [...]} — an ID array, not a filter. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].ad` — each deleted ad; error[] items were not. ## Gotchas - AMAZON_DSP ads cannot be deleted here (Amazon has no DSP DeleteAd); SB takes at most 10 ids per call, SD and ST 100. # ads_delete_ad_association (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_association) > Delete (archive) ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the produc Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 t link in the ad itself (see ads_query_ad). Amazon Ads API · DeleteAdAssociation · POST /adsApi/v1/delete/adAssociations Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations#tag/AdAssociations/operation/DeleteAdAssociation Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_ad_association", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_ad_association \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {adAssociationIds: [...]} — an ID array. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adAssociation` — each deleted ad association; error[] items were not. ## Gotchas - DSP-only: on a sponsored-ads profile the call fails with Amazon's 401 "not authorized to access account", returned as a 400 — only call this entity for DSP work. # ads_delete_ad_group (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_group) > Delete (archive) ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 Amazon Ads API · DeleteAdGroup · POST /adsApi/v1/delete/adGroups Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups#tag/AdGroups/operation/DeleteAdGroup Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_ad_group", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_ad_group \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {adGroupIds: [...]} — an ID array, not a filter. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adGroup` — each deleted ad group; error[] items were not. ## Gotchas - Delete = archive (state -> ARCHIVED); the ad group stays queryable. - Only SPONSORED_PRODUCTS, SPONSORED_BRANDS and SPONSORED_DISPLAY ad groups can be deleted; SB takes at most 10 ids per call, SD 100. # ads_delete_campaign (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign) > Delete (archive) advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Ama Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 zon DSP; the ad product is the `adProduct` field, never a separate tool. Amazon Ads API · DeleteCampaign · POST /adsApi/v1/delete/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/DeleteCampaign Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_campaign", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_campaign \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {campaignIds: [...]} — a plain ID array, not a filter. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].campaign` — each deleted campaign; error[] items were not. ## Gotchas - Delete = archive (state -> ARCHIVED); the campaign stays queryable, it is never hard-deleted. - Only SPONSORED_PRODUCTS, SPONSORED_BRANDS and SPONSORED_DISPLAY campaigns can be deleted (no Television or DSP delete); SB takes at most 10 ids per call, SD 100. # ads_delete_target (https://sellersheetai.com/docs/mcp-api/tools/ads_delete_target) > Delete (archive) targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (neg Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 ative=true, ad-group or campaign level); there is no separate keywords entity in v1. Amazon Ads API · DeleteTarget · POST /adsApi/v1/delete/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/DeleteTarget Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_delete_target", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_delete_target \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | {targetIds: [...]} — an ID array; a filter 400s. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].target` — each deleted target; error[] items were not. # ads_query_ad (https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad) > Query (read) ads (creatives) across ALL ad products via the unified Amazon Ads API v1. Access: **READ** · toolset amazon_ads · family ads.v1 In the v1 model an "ad" is the creative unit inside an ad group; a sponsored ad's advertised product is inside its creative (productCreative for SP, componentCreative for SB and SD, videoCreative for ST) — ad associations (ads_query_ad_association) are AMAZON_DSP's ad-to-ad-group links, not product links. Use it for a targeted read of current settings (by id, name or state); for a whole-account dump use ads_ad_export, and for spend or sales use query_report_data. Amazon Ads API · QueryAd · POST /adsApi/v1/query/ads Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads#tag/Ads/operation/QueryAd ## Call it MCP tool call: ```json { "name": "ads_query_ad", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_query_ad \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the filter object — adProductFilter is required, e.g. {adProductFilter: {include: ['SPONSORED_PRODUCTS']}, adGroupIdFilter: {include: ['']}}. | ## Result - Amazon's payload in data.result. - `data.result` — the matching ads — the server follows nextToken for up to 5 pages; maxResults caps the total. - `data.nextToken` — set when more remain — call again with the SAME filters plus this nextToken (a token-only body 400s). # ads_query_ad_association (https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_association) > Query (read) ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product li Access: **READ** · toolset amazon_ads · family ads.v1 nk in the ad itself (see ads_query_ad). Amazon Ads API · QueryAdAssociation · POST /adsApi/v1/query/adAssociations Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations#tag/AdAssociations/operation/QueryAdAssociation ## Call it MCP tool call: ```json { "name": "ads_query_ad_association", "arguments": { "store": "myStore-US", "countryCode": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_query_ad_association \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | | filter dict (no adProductFilter on this entity). | ## Result - Amazon's payload in data.result. - `data.result` — the matching ad associations — the server follows nextToken for up to 5 pages; maxResults caps the total. - `data.nextToken` — set when more remain — call again with the SAME filters plus this nextToken (a token-only body 400s). ## Gotchas - DSP-only: on a sponsored-ads profile the call fails with Amazon's 401 "not authorized to access account", returned as a 400 — only call this entity for DSP work. # ads_query_ad_group (https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_group) > Query (read) ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). Access: **READ** · toolset amazon_ads · family ads.v1 Use it for a targeted read of current settings (by id, name or state); for a whole-account dump use ads_ad_group_export, and for spend or sales use query_report_data. Amazon Ads API · QueryAdGroup · POST /adsApi/v1/query/adGroups Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups#tag/AdGroups/operation/QueryAdGroup ## Call it MCP tool call: ```json { "name": "ads_query_ad_group", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_query_ad_group \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the filter object — adProductFilter is required, e.g. {adProductFilter: {include: ['SPONSORED_PRODUCTS']}, campaignIdFilter: {include: ['']}}. | ## Result - Amazon's payload in data.result. - `data.result` — the matching ad groups — the server follows nextToken for up to 5 pages; maxResults caps the total. - `data.nextToken` — set when more remain — call again with the SAME filters plus this nextToken (a token-only body 400s). # ads_query_campaign (https://sellersheetai.com/docs/mcp-api/tools/ads_query_campaign) > Query (read) advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon Access: **READ** · toolset amazon_ads · family ads.v1 DSP; the ad product is the `adProduct` field, never a separate tool. Use it for a targeted read of current settings (by id, name or state); for a whole-account dump use ads_campaign_export, and for spend or sales use query_report_data. Amazon Ads API · QueryCampaign · POST /adsApi/v1/query/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/QueryCampaign ## Call it MCP tool call: ```json { "name": "ads_query_campaign", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_query_campaign \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the filter object — adProductFilter is required, e.g. {adProductFilter: {include: ['SPONSORED_PRODUCTS']}, stateFilter: {include: ['ENABLED']}}. | ## Result - Amazon's payload in data.result. - `data.result` — the matching campaigns — the server follows nextToken for up to 5 pages; maxResults caps the total. - `data.nextToken` — set when more remain — call again with the SAME filters plus this nextToken (a token-only body 400s). # ads_query_target (https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) > Query (read) targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negativ Access: **READ** · toolset amazon_ads · family ads.v1 e=true, ad-group or campaign level); there is no separate keywords entity in v1. Use it for a targeted read of current settings (by id, name or state); for a whole-account dump use ads_target_export, and for spend or sales use query_report_data. Amazon Ads API · QueryTarget · POST /adsApi/v1/query/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/QueryTarget ## Call it MCP tool call: ```json { "name": "ads_query_target", "arguments": { "store": "myStore-US", "countryCode": "", "body": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_query_target \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object | yes | the filter object — adProductFilter is required; e.g. {adProductFilter: {include: ['SPONSORED_PRODUCTS']}, adGroupIdFilter: {include: ['']}, negativeFilter: {include: [true]}} lists that ad group's negative targets; targetTypeFilter {include: ['KEYWORD']} and keywordFilter {include: [...], queryTermMatchType: EXACT_MATCH \| BROAD_MATCH} narrow further. | ## Result - Amazon's payload in data.result. - `data.result` — the matching targets — the server follows nextToken for up to 5 pages; maxResults caps the total. - `data.nextToken` — set when more remain — call again with the SAME filters plus this nextToken (a token-only body 400s). # ads_update_ad (https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad) > Update ads (creatives) across ALL ad products via the unified Amazon Ads API v1. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 In the v1 model an "ad" is the creative unit inside an ad group; a sponsored ad's advertised product is inside its creative (productCreative for SP, componentCreative for SB and SD, videoCreative for ST) — ad associations (ads_query_ad_association) are AMAZON_DSP's ad-to-ad-group links, not product links. Amazon Ads API · UpdateAd · POST /adsApi/v1/update/ads Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads#tag/Ads/operation/UpdateAd Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_ad", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_ad \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {adId*, name?, state?, creative?} (or {ads: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].ad` — each changed ad; index is its position in your list — error[] items were not changed. # ads_update_ad_association (https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_association) > Update ad<->ad-group associations via the unified Amazon Ads API v1 — an AMAZON_DSP resource (creative rotation across ad groups); sponsored-ads products embed the product link in Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 the ad itself (see ads_query_ad). Amazon Ads API · UpdateAdAssociation · POST /adsApi/v1/update/adAssociations Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations#tag/AdAssociations/operation/UpdateAdAssociation Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_ad_association", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_ad_association \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {adAssociationId*, state?, startDateTime?, endDateTime?, weight?} (or {adAssociations: [...]}). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adAssociation` — each changed ad association; index is its position in your list — error[] items were not changed. ## Gotchas - DSP-only: on a sponsored-ads profile the call fails with Amazon's 401 "not authorized to access account", returned as a 400 — only call this entity for DSP work. # ads_update_ad_group (https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_group) > Update ad groups across ALL ad products via the unified Amazon Ads API v1 (adProduct is a payload field; one shape for SP/SB/SD/ST/DSP). Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 Amazon Ads API · UpdateAdGroup · POST /adsApi/v1/update/adGroups Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups#tag/AdGroups/operation/UpdateAdGroup Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_ad_group", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_ad_group \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {adGroupId*, ...fields to change} (or {adGroups: [...]}) — a bid change is bid: {defaultBid: }, not a bare number. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].adGroup` — each changed ad group; index is its position in your list — error[] items were not changed. # ads_update_campaign (https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign) > Update advertising campaigns across ALL ad products via the unified Amazon Ads API v1 common model — one shape for Sponsored Products, Brands, Display, Television and Amazon DSP; t Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 he ad product is the `adProduct` field, never a separate tool. Amazon Ads API · UpdateCampaign · POST /adsApi/v1/update/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/UpdateCampaign Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_campaign", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_campaign \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {campaignId*, ...fields to change} (or {campaigns: [...]}) — never adProduct: Amazon refuses it on an update (measured 2026-10-26). | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].campaign` — each changed campaign; index is its position in your list — error[] items were not changed. ## Gotchas - For a budget-only or a state-only change use ads_update_campaign_budget / ads_update_campaign_state. - budgets replaces the campaign's whole list; each entry is shaped as on create: {budgetType, recurrenceTimePeriod, budgetValue: {monetaryBudgetValue: {monetaryBudget: {value}}}}. - state is ENABLED or PAUSED on SP, SB, SD and ST (DRAFT and PROPOSED are DSP values); to archive use ads_delete_campaign. # ads_update_campaign_budget (https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_budget) > Change ONE campaign's budget amount — nothing else about the campaign. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 Amazon Ads API · UpdateCampaign · POST /adsApi/v1/update/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/UpdateCampaign Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_campaign_budget", "arguments": { "store": "myStore-US", "countryCode": "", "campaignId": "", "budget": 1, "recurrenceTimePeriod": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_campaign_budget \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignId":"","budget":1,"recurrenceTimePeriod":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignId` | string | yes | the campaign, from ads_query_campaign. | | `budget` | number | yes | the new budget amount in the campaign's currency, above 0. | | `recurrenceTimePeriod` | string | yes | DAILY \| LIFETIME \| MONTHLY — the period the amount caps; pass the campaign's current value unless you mean to change it. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. ## Gotchas - For any other campaign change use ads_update_campaign. - The campaign's budgets list is replaced by this one MONETARY entry. # ads_update_campaign_state (https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_state) > Enable or pause ONE campaign — nothing else about it. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 Amazon Ads API · UpdateCampaign · POST /adsApi/v1/update/campaigns Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns#tag/Campaigns/operation/UpdateCampaign Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_campaign_state", "arguments": { "store": "myStore-US", "countryCode": "", "campaignId": "", "state": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_campaign_state \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","campaignId":"","state":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `campaignId` | string | yes | the campaign, from ads_query_campaign. | | `state` | string | yes | ENABLED or PAUSED — the update states Amazon's spec lists for a live campaign. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. ## Gotchas - To archive a campaign use ads_delete_campaign (Amazon's delete is an archive). - ENABLED starts spending. # ads_update_target (https://sellersheetai.com/docs/mcp-api/tools/ads_update_target) > Update targets across ALL ad products via the unified Amazon Ads API v1 — keywords, product and category targets, audiences, themes and locations, and every negative (negative=true Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 , ad-group or campaign level); there is no separate keywords entity in v1. Amazon Ads API · UpdateTarget · POST /adsApi/v1/update/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/UpdateTarget Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_target", "arguments": { "store": "myStore-US", "countryCode": "", "body": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_target \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","body":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `body` | object[] \| object | yes | list of {targetId*, state?, bid?: {bid: }} (or {targets: [...]}) — bid wraps the number; for a single bid change use ads_update_target_bid. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. - `data.result.success[].target` — each changed target; index is its position in your list — error[] items were not changed. ## Gotchas - Keyword text, match type, targetType and negative cannot be updated (TargetUpdate has no top-level targetDetails or negative; only a per-marketplace override for GLOBAL campaigns) — archive with ads_delete_target and create the new target. - AMAZON_DSP targets cannot be updated (Amazon has no DSP UpdateTarget), so state is ENABLED or PAUSED — DRAFT and PROPOSED are DSP values. # ads_update_target_bid (https://sellersheetai.com/docs/mcp-api/tools/ads_update_target_bid) > Change ONE target's (keyword, product or audience target) bid. Access: **DESTRUCTIVE** · toolset amazon_ads · family ads.v1 Amazon Ads API · UpdateTarget · POST /adsApi/v1/update/targets Docs: https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets#tag/Targets/operation/UpdateTarget Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "ads_update_target_bid", "arguments": { "store": "myStore-US", "countryCode": "", "targetId": "", "bid": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ads_update_target_bid \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","countryCode":"","targetId":"","bid":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `countryCode` | string | yes | the Ads profile's 2-letter country code (e.g. 'US'). | | `targetId` | string | yes | the target, from ads_query_target. | | `bid` | number | yes | the new maximum bid in the campaign's currency, above 0. | ## Result - 207 {success, partialSuccess, error}. HTTP success does not mean every item succeeded; read error[] by index. ## Gotchas - For any other target change use ads_update_target. # aplusContent_create_and_publish (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_create_and_publish) > Full A+ pipeline in one call: upload the images → create the content document → link the ASINs → submit for approval. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.uploads_2020-11-01 Every step's result is returned whichever step failed. Amazon SP-API · createUploadDestinationForResource · POST /uploads/2020-11-01/uploadDestinations/{resource} Amazon SP-API · createContentDocument · POST /aplus/2020-11-01/contentDocuments Amazon SP-API · postContentDocumentAsinRelations · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/asins Amazon SP-API · postContentDocumentApprovalSubmission · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/approvalSubmissions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "aplusContent_create_and_publish", "arguments": { "store": "myStore-US", "contentDocument": {}, "asinSet": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_create_and_publish \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentDocument":{},"asinSet":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentDocument` | object | yes | the A+ document — required fields name (≤100 chars), contentType, locale, contentModuleList (1–100 modules). contentType: EBC (Seller Central A+) \| EMC (Vendor Central). locale: a HYPHENATED IETF tag ('en-US', 'de-DE', 'zh-CN'). A module is {contentModuleType, : {…}}, e.g. {"contentModuleType": "STANDARD_HEADER_IMAGE_TEXT", "standardHeaderImageText": {"headline": {"value": "…"}, "block": {"image": {"uploadDestinationId": "https://…/hero.jpg", "altText": "…"}, "headline": {"value": "…"}, "body": {"textList": [{"value": "…"}]}}}} (contentModuleType values: the Body block). Rich text (headline, body) ≤10,000 chars; positional labels (specs, highlights) ≤250; every image needs uploadDestinationId + altText (≤100). Optional enums: decoratorSet[].type STYLE_BOLD \| STYLE_ITALIC \| STYLE_UNDERLINE \| STYLE_LINEBREAK \| STYLE_PARAGRAPH \| LIST_ORDERED \| LIST_UNORDERED \| LIST_ITEM (each with offset, length; depth for lists); imagePositionType LEFT \| RIGHT (STANDARD_SINGLE_SIDE_IMAGE); overlayColorType DARK \| LIGHT (STANDARD_IMAGE_TEXT_OVERLAY). Images: put a URL straight into uploadDestinationId — an Amazon A+ CDN URL (https://m.media-amazon.com/images/S/) is reused as is; any other http(s) URL (cdn.sellersheetai.com, a public Drive link, any host) is downloaded and uploaded to the A+ media library; a raw uploadDestinationId is kept. A missing imageCropSpecification is filled with the full image size. | | `asinSet` | string[] | yes | the ASINs to link, all in the store's marketplace. | | `submitForApproval` | boolean | | true (default) submits after linking; false leaves a DRAFT to review first. | ## Result - `data.contentReferenceKey` — the created document (null when create failed). - `data.steps` — {step: record} in run order — upload_images {status, count, uploads: [{driveUrl, uploadDestinationId | error, status} | {status 'reused', url}]} (only when a slot held a URL); create {status, contentReferenceKey | error}; link_asins {status, asinCount | error}; submit {status | error | status 'skipped', reason} (only when submitForApproval). - `data.allSucceeded` — true only when every attempted step succeeded — otherwise data.steps names the failing one. ## Params (Amazon schema; createUploadDestinationForResource) - marketplaceIds*: [string] (max 1) contentMD5*: string resource*: string contentType: string ## Params (Amazon schema; createContentDocument) - marketplaceId*: string ## Params (Amazon schema; postContentDocumentAsinRelations) - contentReferenceKey*: string marketplaceId*: string ## Params (Amazon schema; postContentDocumentApprovalSubmission) - contentReferenceKey*: string marketplaceId*: string ## Body (Amazon schema; createContentDocument) - contentDocument*: {name* (max 100 chars), contentType*: EBC | EMC, contentSubType, locale* (min 5 chars), contentModuleList*: [{contentModuleType*, standardCompanyLogo, standardComparisonTable, standardFourImageText, standardFourImageTextQuadrant, standardHeaderImageText, standardImageSidebar, standardImageTextOverlay, standardMultipleImageText, standardProductDescription, standardSingleImageHighlights, standardSingleImageSpecsDetail, standardSingleSideImage, standardTechSpecs, standardText, standardThreeImageText}] (1–100)} contentDocument.contentModuleList.contentModuleType: STANDARD_COMPANY_LOGO | STANDARD_COMPARISON_TABLE | STANDARD_FOUR_IMAGE_TEXT | STANDARD_FOUR_IMAGE_TEXT_QUADRANT | STANDARD_HEADER_IMAGE_TEXT | STANDARD_IMAGE_SIDEBAR | STANDARD_IMAGE_TEXT_OVERLAY | STANDARD_MULTIPLE_IMAGE_TEXT | STANDARD_PRODUCT_DESCRIPTION | STANDARD_SINGLE_IMAGE_HIGHLIGHTS | STANDARD_SINGLE_IMAGE_SPECS_DETAIL | STANDARD_SINGLE_SIDE_IMAGE | STANDARD_TECH_SPECS | STANDARD_TEXT | STANDARD_THREE_IMAGE_TEXT contentDocument.contentModuleList.standardImageTextOverlay.overlayColorType: DARK | LIGHT contentDocument.contentModuleList.standardSingleSideImage.imagePositionType: LEFT | RIGHT ## Body (Amazon schema; postContentDocumentAsinRelations) - asinSet*: [string] (min 10 chars) ## Gotchas - A failed image upload stops the pipeline before create; a failed create skips linking and submit; a failed link skips submit. Check aplusContent_searchContentPublishRecords per ASIN first so you do not create a second document for content that already exists. # aplusContent_getContentDocument (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_getContentDocument) > Get an A+ Content document. Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 ``includedDataSet`` selects which data types Amazon returns (full contents and/or just metadata). Amazon SP-API · getContentDocument · GET /aplus/2020-11-01/contentDocuments/{contentReferenceKey} Use this to inspect an existing document before updating or to audit content. ## Call it MCP tool call: ```json { "name": "aplusContent_getContentDocument", "arguments": { "store": "myStore-US", "contentReferenceKey": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_getContentDocument \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | | `includedDataSet` | string[] | | which A+ data types to return, any subset: CONTENTS is the full content document (modules + text + images), METADATA the document's metadata only (name/status/badges/updateTime). Amazon requires this query param; the server sends ['CONTENTS'] when omitted. Pass ['CONTENTS','METADATA'] for both, or ['METADATA'] for a lightweight metadata-only fetch. Allowed: CONTENTS \| METADATA. | ## Result - `data.contentReferenceKey` — same as input. - `data.contentDocument` — the contentDocument itself — the server unwraps Amazon's GET envelope, so this dict can be passed straight back into ``aplusContent_updateContentDocument``. Present when CONTENTS was requested (None for a METADATA-only fetch). Fields: - name: content name (maxLength 100) - contentType: 'EBC' (Seller Central A+ — what seller accounts get) or 'EMC' (Vendor Central A+) - contentSubType: optional special-purpose subtype string (often absent) - locale: IETF language tag, HYPHENATED — pattern ^[a-z]{2,}-[A-Z0-9]{2,}$ (e.g. 'en-US', 'en-GB', 'de-DE', 'zh-CN'). Underscores are rejected. - contentModuleList: 1–100 module dicts, each with: - contentModuleType: module type string (e.g. 'STANDARD_HEADER_IMAGE_TEXT') - [module-specific key]: module data with images and text - `data.contentMetadata` — (if present, i.e. when METADATA was requested) name/status/badgeSet/marketplaceId/updateTime. - `data.warnings` — (if present) Amazon advisory messages ({code, message, details}). ## Gotchas - A PREMIUM A+ document can fail with 400 "Unsupported content module type" — read its metadata from aplusContent_searchContentDocuments instead. # aplusContent_list_documents_detailed (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_list_documents_detailed) > Up to 50 A+ Content documents per call (5 pages × 10 records), each enriched with its full contentDocument JSON and linked ASINs — sheet-ready rows for the "List A+" tab. Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Each record costs two enrichment calls (aplusContent_getContentDocument and the ASIN relations), ~100 per batch, on purpose. aplusContent_searchContentDocuments first says how many documents exist; then call without pageToken, write data.rows, and repeat with data.nextPageToken until it is absent. Amazon SP-API · searchContentDocuments · GET /aplus/2020-11-01/contentDocuments Amazon SP-API · getContentDocument · GET /aplus/2020-11-01/contentDocuments/{contentReferenceKey} Amazon SP-API · listContentDocumentAsinRelations · GET /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/asins ## Call it MCP tool call: ```json { "name": "aplusContent_list_documents_detailed", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_list_documents_detailed \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `pageToken` | string | | the previous call's data.nextPageToken; omit for the first page. | | `maxPages` | integer | | the batch size in tens, 1–10 (default 5 → at most 50 records enriched); Amazon decides a page's size, so the records beyond maxPages×10 come back as data.unenriched_keys. Lower it for a smaller batch. | ## Result - `data.count` — rows in this batch. - `data.unenriched_keys` — the page's remaining contentReferenceKeys when Amazon's page was larger than the batch — fetch each with aplusContent_getContentDocument. - `data.rows` — one per document — {name, status DRAFT | SUBMITTED | APPROVED | REJECTED (suspended content reverts to DRAFT), updateTime ('YYYY-MM-DD HH:MM:SS'), badgeSet (comma-separated: BULK, GENERATED, LAUNCHPAD, PREMIUM, STANDARD), marketplaceId, contentReferenceKey, contentDocument (JSON string of the document itself — parse it and pass it to aplusContent_updateContentDocument; "error: " when that fetch failed), contentDocumentAsinRelations (every linked ASIN, newline-separated; "error: " when the enrichment failed)}. - `data.nextPageToken` — only when more batches exist. ## Params (Amazon schema; searchContentDocuments) - marketplaceId*: string pageToken: string ## Params (Amazon schema; getContentDocument) - contentReferenceKey*: string marketplaceId*: string includedDataSet*: CONTENTS | METADATA (list) ## Params (Amazon schema; listContentDocumentAsinRelations) - contentReferenceKey*: string marketplaceId*: string includedDataSet: METADATA (list) asinSet: [string] pageToken: string ## Workflow - 1. Write data.rows from row 5 of the "List A+" tab: row 1 = the key headers (name | status | updateTime | badgeSet | marketplaceId | contentReferenceKey | contentDocument | contentDocumentAsinRelations), row 2 = the "Store" label (do not overwrite), row 3 = the store value, row 4 = the display headers (A+ Name | Status | Update Time | Badge Set | Marketplace ID | Content Reference Key | Content Document | ASINs). # aplusContent_listContentDocumentAsinRelations (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_listContentDocumentAsinRelations) > List the ASINs currently linked to a specific A+ Content document. Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · listContentDocumentAsinRelations · GET /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/asins Use this to audit or verify which ASINs will display the content before or after calling ``aplusContent_create_and_publish``. Returns one Amazon page. If ``data.nextPageToken`` is present, call again with ``pageToken`` set to it (and the same other args) to get the next page. ## Call it MCP tool call: ```json { "name": "aplusContent_listContentDocumentAsinRelations", "arguments": { "store": "myStore-US", "contentReferenceKey": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_listContentDocumentAsinRelations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | | `includedDataSet` | string[] | | optional list selecting ASIN metadata to include. Pass ['METADATA'] to enrich each ASIN with parent/title/imageUrl/badgeSet. Omit to return the related ASINs without metadata. | | `asinSet` | string[] | | optional list of ASIN strings to filter to (each at least 10 chars). Omit to return ALL ASINs linked to the document. | | `pageToken` | string | | the previous call's data.nextPageToken; omit for the first page. | ## Result - `data.contentReferenceKey` — same as input. - `data.asinCount` — number of linked ASINs on this page. - `data.asinMetadataSet` — list of ASIN objects (per the A+ AsinMetadata model), each with: - asin: the ASIN string - badgeSet: (if present, when METADATA requested) ASIN-relationship state badges — these are AsinBadge values (NOT the content badges): 'BRAND_NOT_ELIGIBLE' | 'CATALOG_NOT_FOUND' | 'CONTENT_NOT_PUBLISHED' | 'CONTENT_PUBLISHED' - parent: (if present) parent ASIN of a variation family - title: (if present) the ASIN's catalog title - imageUrl: (if present) the ASIN's catalog image URL - contentReferenceKeySet: (if present) keys of content documents linked to this ASIN - `data.warnings` — (if present) list of Amazon advisory messages ({code, message, details}). - `data.nextPageToken` — (only when more pages exist) pass as pageToken to the next call. # aplusContent_postContentDocumentApprovalSubmission (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentApprovalSubmission) > Submit an A+ document for Amazon review and publication — after aplusContent_create_and_publish ran with submitForApproval false, or to retry its failed submit step. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · postContentDocumentApprovalSubmission · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/approvalSubmissions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Link its ASINs first (aplusContent_postContentDocumentAsinRelations). Review typically takes 1–7 business days; once approved the content shows on every linked ASIN. ## Call it MCP tool call: ```json { "name": "aplusContent_postContentDocumentApprovalSubmission", "arguments": { "store": "myStore-US", "contentReferenceKey": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_postContentDocumentApprovalSubmission \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | ## Result - `data.contentReferenceKey` — same as input. - `data.warnings` — (only when present) Amazon's warnings — the notification is then a warning. # aplusContent_postContentDocumentAsinRelations (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentAsinRelations) > Replace all ASINs linked to an existing A+ content document. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · postContentDocumentAsinRelations · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/asins Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. This is a FULL replacement — the new asinSet becomes the complete set of linked ASINs. Any ASIN omitted from asinSet will have A+ content suspended on its listing. Always include ALL ASINs you want linked, not just the new ones. ## Call it MCP tool call: ```json { "name": "aplusContent_postContentDocumentAsinRelations", "arguments": { "store": "myStore-US", "contentReferenceKey": "", "asinSet": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_postContentDocumentAsinRelations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":"","asinSet":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | | `asinSet` | string[] | yes | New complete set of ASIN strings. All previously linked ASINs not in this list will be suspended. | ## Result - `data.contentReferenceKey` — same as input. - `data.asinCount` — number of ASINs sent. - `data.warnings` — (only when present) Amazon accepted the call but did not apply all of it — the notification is then a warning. ## Workflow - 1. aplusContent_listContentDocumentAsinRelations for the current set of linked ASINs. 2. Merge existing ASINs with new ones (or remove specific ones). 3. Optionally aplusContent_validateContentDocumentAsinRelations to check eligibility. 4. Call this tool with the complete new asinSet. 5. If the document is DRAFT, submit it with aplusContent_postContentDocumentApprovalSubmission. 6. Write the updated ASIN list to your tracking sheet. # aplusContent_postContentDocumentSuspendSubmission (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_postContentDocumentSuspendSubmission) > Suspend live (APPROVED) A+ content: it leaves every linked ASIN's detail page while the document and its ASIN links stay. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · postContentDocumentSuspendSubmission · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey}/suspendSubmissions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Use it to hide content during a product refresh or compliance review, or before changing ASIN assignments. The document then reads DRAFT in aplusContent_searchContentDocuments (the SP-API has no separate published or suspended status). To bring it back, fix it if needed (aplusContent_updateContentDocument) and resubmit with aplusContent_postContentDocumentApprovalSubmission. ## Call it MCP tool call: ```json { "name": "aplusContent_postContentDocumentSuspendSubmission", "arguments": { "store": "myStore-US", "contentReferenceKey": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_postContentDocumentSuspendSubmission \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | ## Result - `data.contentReferenceKey` — same as input. # aplusContent_searchContentDocuments (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_searchContentDocuments) > Fetch one metadata page of A+ Content documents — lightweight, no enrichment. Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon decides the page size: a whole library can come back in one page. Amazon SP-API · searchContentDocuments · GET /aplus/2020-11-01/contentDocuments Use this first to discover how many A+ documents exist and get their contentReferenceKeys. Does NOT fetch full contentDocument or linked ASINs — returns metadata only. For sheet-ready rows with full content, use ``aplusContent_list_documents_detailed`` instead. ## Call it MCP tool call: ```json { "name": "aplusContent_searchContentDocuments", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_searchContentDocuments \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `pageToken` | string | | the previous call's data.nextPageToken; omit for the first page. | ## Result - `data.count` — records on this page. - `data.contentMetadataRecords` — list of ContentMetadataRecord dicts. A record has exactly TWO fields — contentReferenceKey, and contentMetadata (which holds everything else): - contentReferenceKey: unique document key (pass to aplusContent_getContentDocument or aplusContent_list_documents_detailed) - contentMetadata.name: A+ content name (e.g. "MY-SKU-001 - V5"; maxLength 100) - contentMetadata.status: 'DRAFT' | 'SUBMITTED' | 'APPROVED' | 'REJECTED' (the only SP-API status values; suspended content reverts to 'DRAFT') - contentMetadata.badgeSet: badges — 'BULK'|'GENERATED'|'LAUNCHPAD'|'PREMIUM'|'STANDARD' - contentMetadata.marketplaceId: marketplace ID - contentMetadata.updateTime: ISO-8601 timestamp This operation returns NO linked ASINs — call ``aplusContent_listContentDocumentAsinRelations`` with a contentReferenceKey for those. - `data.nextPageToken` — (only when more pages exist) pass to next call. ## Workflow - 1. Call without pageToken, then with data.nextPageToken until it is absent. 2. For sheet rows with the full document use aplusContent_list_documents_detailed; for one document aplusContent_getContentDocument. # aplusContent_searchContentPublishRecords (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_searchContentPublishRecords) > Check if an ASIN already has published (live) A+ Content on Amazon. Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · searchContentPublishRecords · GET /aplus/2020-11-01/contentPublishRecords Call this BEFORE creating new A+ content for an ASIN to avoid duplicates or conflicts with existing live content. No records means no live A+ on this ASIN — safe to create; otherwise review the existing content first. Returns one Amazon page. If ``data.nextPageToken`` is present, call again with ``pageToken`` set to it (and the same asin) to get the next page. ## Call it MCP tool call: ```json { "name": "aplusContent_searchContentPublishRecords", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_searchContentPublishRecords \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `pageToken` | string | | the previous call's data.nextPageToken; omit for the first page. | ## Result - `data.asin` — same as input. - `data.count` — number of publish records on this page. - `data.publishRecordList` — list of published content records, each with exactly these fields (per the A+ PublishRecord model — no badgeSet): - contentReferenceKey: the content document behind this published record - asin: the ASIN - contentType: 'EBC' (Seller Central A+) or 'EMC' (Vendor Central A+) - contentSubType: optional subtype string (often absent) - locale: IETF language tag, hyphenated (e.g. 'en-US') - marketplaceId: marketplace the record applies to - `data.nextPageToken` — (only when more pages exist) pass as pageToken to the next call. # aplusContent_updateContentDocument (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_updateContentDocument) > Replace the content of an existing A+ document, keeping its key and ASIN links — to revise copy, module order or images without creating a new document. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.aplusContent_2020-11-01 ASIN links change through aplusContent_postContentDocumentAsinRelations. Amazon SP-API · updateContentDocument · POST /aplus/2020-11-01/contentDocuments/{contentReferenceKey} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "aplusContent_updateContentDocument", "arguments": { "store": "myStore-US", "contentReferenceKey": "", "contentDocument": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_updateContentDocument \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","contentReferenceKey":"","contentDocument":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `contentReferenceKey` | string | yes | the A+ content document key (from aplusContent_searchContentDocuments). | | `contentDocument` | object | yes | The full new document body — same shape as create. Required: name (maxLength 100), contentType (Allowed: EBC = Seller Central A+, use this for seller accounts \| EMC = Vendor Central A+), locale (IETF tag, HYPHENATED — pattern ^[a-z]{2,}-[A-Z0-9]{2,}$, e.g. 'en-US'), contentModuleList (1–100 modules). Optional: contentSubType. See aplusContent_create_and_publish for the module shape and text limits (contentModuleType values: the Body block). | ## Result - `data.contentReferenceKey` — same as input. - `data.warnings` — (only when present) Amazon's warnings — the notification is then a warning. ## Body (Amazon schema) - contentDocument*: {name* (max 100 chars), contentType*: EBC | EMC, contentSubType, locale* (min 5 chars), contentModuleList*: [{contentModuleType*, standardCompanyLogo, standardComparisonTable, standardFourImageText, standardFourImageTextQuadrant, standardHeaderImageText, standardImageSidebar, standardImageTextOverlay, standardMultipleImageText, standardProductDescription, standardSingleImageHighlights, standardSingleImageSpecsDetail, standardSingleSideImage, standardTechSpecs, standardText, standardThreeImageText}] (1–100)} contentDocument.contentModuleList.contentModuleType: STANDARD_COMPANY_LOGO | STANDARD_COMPARISON_TABLE | STANDARD_FOUR_IMAGE_TEXT | STANDARD_FOUR_IMAGE_TEXT_QUADRANT | STANDARD_HEADER_IMAGE_TEXT | STANDARD_IMAGE_SIDEBAR | STANDARD_IMAGE_TEXT_OVERLAY | STANDARD_MULTIPLE_IMAGE_TEXT | STANDARD_PRODUCT_DESCRIPTION | STANDARD_SINGLE_IMAGE_HIGHLIGHTS | STANDARD_SINGLE_IMAGE_SPECS_DETAIL | STANDARD_SINGLE_SIDE_IMAGE | STANDARD_TECH_SPECS | STANDARD_TEXT | STANDARD_THREE_IMAGE_TEXT contentDocument.contentModuleList.standardImageTextOverlay.overlayColorType: DARK | LIGHT contentDocument.contentModuleList.standardSingleSideImage.imagePositionType: LEFT | RIGHT ## Gotchas - SUBMITTED or APPROVED content: suspend it first (aplusContent_postContentDocumentSuspendSubmission), update, then resubmit. ## Workflow - 1. aplusContent_getContentDocument for the current contentDocument. 2. Change it (e.g. a STANDARD_HEADER_IMAGE_TEXT module's headline) and call this tool with the whole document. 3. aplusContent_postContentDocumentApprovalSubmission to publish the new version. # aplusContent_validateContentDocumentAsinRelations (https://sellersheetai.com/docs/mcp-api/tools/aplusContent_validateContentDocumentAsinRelations) > Validate ASINs against an A+ content document before linking — no changes made (read-only). Access: **READ** · toolset amazon_sp · family sp.aplusContent_2020-11-01 Amazon SP-API · validateContentDocumentAsinRelations · POST /aplus/2020-11-01/contentAsinValidations Non-mutating: requires only read access (a read-only user can validate eligibility before asking someone with write access to link). Call this before ``aplusContent_postContentDocumentAsinRelations`` when you're unsure about ASIN eligibility, or to diagnose why the link_asins step failed inside ``aplusContent_create_and_publish``. Returns Amazon's per-ASIN error objects — an empty list means all ASINs are valid. The SP-API validates against the full ``contentDocument`` you pass; the wire request carries only marketplaceId + asinSet + contentDocument. There is NO contentReferenceKey on this Amazon operation, so none is accepted here — pass the document you intend to create, or the existing document retrieved via ``aplusContent_getContentDocument``. ## Call it MCP tool call: ```json { "name": "aplusContent_validateContentDocumentAsinRelations", "arguments": { "store": "myStore-US", "asinSet": [], "contentDocument": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/aplusContent_validateContentDocumentAsinRelations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asinSet":[],"contentDocument":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asinSet` | string[] | yes | List of ASIN strings to validate (e.g. ['B0XXXXXXXX']). Each ASIN is at least 10 chars. | | `contentDocument` | object | yes | Full content document dict (same structure as aplusContent_create_and_publish). This is what the SP-API actually validates the ASINs against. | ## Result - `data.asinCount` — number of ASINs validated. - `data.errors` — Amazon's validation findings, each {code, message, details} (this operation reports findings under `errors`, not `issues`). Empty list means all ASINs are eligible for this content document. - `data.warnings` — (if present) Amazon advisory messages, same {code, message, details} shape. Not returned when Amazon reported errors — the SDK surfaces that response as an error list only. ## Body (Amazon schema) - contentDocument*: {name* (max 100 chars), contentType*: EBC | EMC, contentSubType, locale* (min 5 chars), contentModuleList*: [{contentModuleType*, standardCompanyLogo, standardComparisonTable, standardFourImageText, standardFourImageTextQuadrant, standardHeaderImageText, standardImageSidebar, standardImageTextOverlay, standardMultipleImageText, standardProductDescription, standardSingleImageHighlights, standardSingleImageSpecsDetail, standardSingleSideImage, standardTechSpecs, standardText, standardThreeImageText}] (1–100)} contentDocument.contentModuleList.contentModuleType: STANDARD_COMPANY_LOGO | STANDARD_COMPARISON_TABLE | STANDARD_FOUR_IMAGE_TEXT | STANDARD_FOUR_IMAGE_TEXT_QUADRANT | STANDARD_HEADER_IMAGE_TEXT | STANDARD_IMAGE_SIDEBAR | STANDARD_IMAGE_TEXT_OVERLAY | STANDARD_MULTIPLE_IMAGE_TEXT | STANDARD_PRODUCT_DESCRIPTION | STANDARD_SINGLE_IMAGE_HIGHLIGHTS | STANDARD_SINGLE_IMAGE_SPECS_DETAIL | STANDARD_SINGLE_SIDE_IMAGE | STANDARD_TECH_SPECS | STANDARD_TEXT | STANDARD_THREE_IMAGE_TEXT contentDocument.contentModuleList.standardImageTextOverlay.overlayColorType: DARK | LIGHT contentDocument.contentModuleList.standardSingleSideImage.imagePositionType: LEFT | RIGHT ## Workflow - 1. Call with your intended asinSet and contentDocument. 2. data.errors empty → link with aplusContent_postContentDocumentAsinRelations or create with aplusContent_create_and_publish. 3. data.errors not empty → show them to the user; fix eligibility before retrying. # listings_build_payload (https://sellersheetai.com/docs/mcp-api/tools/listings_build_payload) > Build Amazon-shaped attribute JSON from a Publish Queue row's flat cells, per SKU, driven by the productType schema. Access: **READ** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 Pre-flight only — nothing is submitted; show data.warnings to the user, then listings_submit_items. Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} ## Call it MCP tool call: ```json { "name": "listings_build_payload", "arguments": { "store": "myStore-US", "productType": "", "rows": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_build_payload \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","productType":"","rows":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `productType` | string | yes | the one productType whose schema shapes every row (a row's own productType is ignored — call once per productType), e.g. "HEADPHONES". | | `rows` | object[] | yes | [{sku, attributes: {key: cell_value}}]. A key is Amazon's own flat-file key, copied verbatim from a listings_prepare_publish_queue_template column — never built by hand: `[=]…#.…`, where #n is a 1-based entry, .field an object field, and the bracket selectors are only marketplace_id / language_tag (written as the placeholder tokens marketplace_id / language_tag, filled from store and language_tag) and audience (ALL \| B2B). Every other selector (currency, type, size_system, fulfillment_channel_code …) is an ordinary key with its value in the cell. `#*` is the one-cell form of a multi-value attribute (bullet_point, warranty_description): one value per line. Values: text as a string, numbers as "1.5" or 1.5, booleans as true/false/yes/no. Examples: "item_name[marketplace_id=marketplace_id][language_tag=language_tag]#1.value": "Earbuds" "item_weight[marketplace_id=marketplace_id]#1.value": "1.5", "…#1.unit": "kilograms" "externally_assigned_product_identifier[marketplace_id=marketplace_id]#1.value": "123456789012", "…#1.type": "upc" "purchasable_offer[marketplace_id=marketplace_id][audience=ALL]#1.our_price#1.schedule#1.value_with_tax": "19.99" | | `locale` | string | | schema locale for localized labels (a getDefinitionsProductType locale, e.g. en_US); defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | fills the language_tag token; defaults to the marketplace's primary listing locale (US en_US, UK en_GB, DE de_DE, AE/SA en_AE) — pass one only to list in another language the marketplace supports. | ## Result - `data.rows` — [{sku, attributes, warnings, productType, requirements}] — requirements is the set carried into the PUT: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY. data.total_attrs, data.warnings_count: show the warnings before submitting. ## Params (Amazon schema) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Gotchas - Nothing is filled in for you: what you write is what is sent — a blank unit ships with no unit and Amazon's issues[] names what is missing; the placeholder tokens are the only thing resolved. Hidden fields (list_price[…]#1.currency, child_parent_sku_relationship#1.child_relationship_type = "variation" on parent and child) are ordinary keys. A filled key that does not parse, or names a field this productType's schema lacks (a pre-v6 pseudo key such as …#1.b2b_quantity_discount), comes back in that row's warnings as retired_column_layout, and listings_submit_items / listings_submit_feed skip the row — re-run listings_prepare_publish_queue_template. Dates are UTC on this path: an instant "2026-09-19T10:00:00Z" or "YYYY-MM-DD" (a sale start = 00:00:00Z, a sale end = 23:59:59Z); never a slash date. A sheet's sale cells are the seller's local time — convert before calling. product_site_launch_date comes back from the fetch tools and is sent like any key; once a product has sold, the date shoppers see cannot change — on an existing listing remove the key or leave the fetched value. # listings_fetch_attributes_by_asins (https://sellersheetai.com/docs/mcp-api/tools/listings_fetch_attributes_by_asins) > Bulk fetch + flatten Amazon catalog attributes for N ASINs in ONE call. Access: **READ** · toolset amazon_sp · family sp.catalogItems_2022-04-01 Amazon SP-API · getCatalogItem · GET /catalog/2022-04-01/items/{asin} Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} For each item, fetches the catalog item, infers productType (or uses the explicit hint), looks up the schema, and flattens the whole JSON into cells keyed by Amazon's own flat-file keys — the operator can paste them straight into a Publish Queue row. To edit a listing you own, fetch by SKU (listings_fetch_attributes_by_skus) — an ASIN returns Amazon's merged catalog values, which can include other contributors' data; a full UPDATE would submit them as yours. ## Call it MCP tool call: ```json { "name": "listings_fetch_attributes_by_asins", "arguments": { "store": "myStore-US", "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_fetch_attributes_by_asins \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `items` | object[] | yes | List of {asin: str, productType?: str}. productType is auto-inferred from the catalog if omitted. | | `locale` | string | | schema locale for the labels; defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | which language's entries to keep; defaults to the marketplace's primary listing locale. | ## Result - `data.rows` — [{asin, productType, attributes: {key: cell}, - `data.rows.names` — {key: display_name}, - `data.rows.data.rows.names.dropped_entries` — {attr: sentence}} | {asin, error}] `attributes` keys are self-describing (Amazon's flat-file grammar); `names` gives a NEW key's display name (for a column the target sheet doesn't have yet); `dropped_entries` names, per attribute, any entry skipped for a foreign marketplace/language, in plain English. A row carries `note` when its product-type schema could not be served and the cells were typed from the JSON alone. ## Params (Amazon schema; getCatalogItem) - asin*: string marketplaceIds*: [string] includedData: attributes | classifications | dimensions | identifiers | images | productTypes | relationships | salesRanks | summaries | vendorDetails (list) locale: string ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Workflow - 1. Read column matching `externally_assigned_product_identifier` (or `merchant_suggested_asin`) for the selected rows. 2. Call this tool ONCE with all ASINs. 3. Never rename or move a template column (the template is the source of truth). A bare key, `#1.value`, line 1 of `#*.value` and a literal marketplace/language bracket equal to row 3 are the same column — the template's spelling wins. 4. Any other key that is not yet a column — a leaf the template's productType schema doesn't have (the row's productType differs from the template's) — is APPENDED AT THE RIGHT END, named from `names`, so the seller sees the whole listing. Do not write a special row-4 note for it: its place says it was appended. Only a REPEAT of a cluster the template already has (entry index >1 whose `#1` twin is on the sheet) is inserted beside it. EVERY column is sent on submit — the sheet is trusted; whoever owns the sheet removes a column Amazon no longer takes after reading the result. 5. Write each row's cells back under their row-5 keys (attribute columns start at F; E is attributes_json) and set column D (productType) from the response. # listings_fetch_attributes_by_skus (https://sellersheetai.com/docs/mcp-api/tools/listings_fetch_attributes_by_skus) > Bulk fetch + flatten Amazon listings attributes for N OWNED SKUs in ONE call. Access: **READ** · toolset amazon_sp · family sp.listingsItems_2021-08-01 Amazon SP-API · getListingsItem · GET /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Same shape as `listings_fetch_attributes_by_asins`, but reads your own submitted listing (listings_getListingsItem) instead of Amazon's merged catalog. productType comes from summaries[].productType. ## Call it MCP tool call: ```json { "name": "listings_fetch_attributes_by_skus", "arguments": { "store": "myStore-US", "skus": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_fetch_attributes_by_skus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","skus":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `skus` | object[] | yes | List of SKUs from the configured store. | | `locale` | string | | schema locale for the labels; defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | which language's entries to keep; defaults to the marketplace's primary listing locale. | ## Result - `data.rows` — [{sku, productType, attributes: {key: cell}, - `data.rows.names` — {key: display_name}, - `data.rows.data.rows.names.dropped_entries` — {attr: sentence}, note?} | {sku, error}] `note` is present when the row's product-type schema could not be served and the cells were typed from the JSON alone. ## Params (Amazon schema; getListingsItem) - sellerId*: string sku*: string marketplaceIds*: [string] issueLocale: string includedData: summaries | attributes | issues | offers | fulfillmentAvailability | procurement | relationships | productTypes (list) ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Workflow - 1. Read column B (sku) for the selected rows. 2. Call this tool ONCE with all SKUs. 3. Place the returned keys by the template-is-truth recipe in `listings_fetch_attributes_by_asins` (steps 3–4): never rename a template column; a key outside the template's productType schema goes at the right end, named from `names`. 4. Write each row's flat attributes back + col D productType. 5. `product_site_launch_date` comes back with the rest. Nothing drops it for you: before you update this listing, remove the key or leave the fetched value — see listings_build_payload's note on it. # listings_get_attribute_guide (https://sellersheetai.com/docs/mcp-api/tools/listings_get_attribute_guide) > The row-4 guide (format, unit, allowed values, example) for each Publish Queue column of a productType — one per flat-file key, so item_weight has one for #1.value and one for #1.u Access: **READ** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 nit. Use it to answer "what goes in column X?"; listings_prepare_publish_queue_template already carries the same guide per column (detail 'full'). Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} ## Call it MCP tool call: ```json { "name": "listings_get_attribute_guide", "arguments": { "store": "myStore-US", "productType": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_get_attribute_guide \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","productType":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `productType` | string | yes | Amazon productType, e.g. "HEADPHONES". | | `attributeNames` | object[] | | optional subset of ATTRIBUTE names (not column keys) — every column belonging to a listed attribute is included. None = all attributes for the productType. | | `locale` | string | | schema locale for the labels; defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | fills the language_tag token; defaults to the marketplace's primary listing locale. | ## Result - `data.guides` — {key: markdown_string} — keyed by the flat-file column key, e.g. `item_weight[marketplace_id=marketplace_id]#1.unit`. ## Params (Amazon schema) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT # listings_parse_asin_to_cells (https://sellersheetai.com/docs/mcp-api/tools/listings_parse_asin_to_cells) > Convenience: fetch an ASIN's catalog attributes from Amazon and return flat, operator-readable cell values. Access: **READ** · toolset amazon_sp · family sp.catalogItems_2022-04-01 Keys are Amazon's flat-file keys, as listings_prepare_publish_queue_template writes them. For several ASINs use listings_fetch_attributes_by_asins (one call); to edit a listing you own, fetch by SKU (listings_fetch_attributes_by_skus) — an ASIN returns Amazon's merged catalog values, not what you submitted. Amazon SP-API · getCatalogItem · GET /catalog/2022-04-01/items/{asin} Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} If productType is omitted, the catalog response's productTypes entry matching the store marketplace (else the first) is used as the inferred productType. ## Call it MCP tool call: ```json { "name": "listings_parse_asin_to_cells", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_parse_asin_to_cells \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `productType` | string | | Optional explicit Amazon productType. When omitted it is inferred from the catalog response's productTypes. | | `locale` | string | | Schema/catalog locale passed to getCatalogItem + getDefinitionsProductType. Defaults to the marketplace's default locale. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | the one language kept; defaults to the marketplace's primary listing locale. | ## Result - `data.attributes` — {key: cell_string} — the flat-file key grammar. - `data.names` — {key: display_name} — a NEW key's display name. - `data.dropped_entries` — {attr: sentence} — entries skipped for a foreign marketplace/language, one plain-English sentence per attribute. - `data.productType` — the productType used (provided or inferred) - `data.notes` — [] normally; one sentence when the product-type schema could not be served and the cells were typed from the JSON alone. ## Params (Amazon schema; getCatalogItem) - asin*: string marketplaceIds*: [string] includedData: attributes | classifications | dimensions | identifiers | images | productTypes | relationships | salesRanks | summaries | vendorDetails (list) locale: string ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT # listings_parse_payload (https://sellersheetai.com/docs/mcp-api/tools/listings_parse_payload) > Turn Amazon attribute JSON you already hold (from listings_getListingsItem or catalogItems_getCatalogItem) into Publish Queue cells keyed by Amazon's flat-file keys — the inverse o Access: **READ** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 f listings_build_payload. To fetch and flatten in one call use listings_fetch_attributes_by_skus or listings_fetch_attributes_by_asins. Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Arrays become `#n` entries, object fields `.field`, the bracket selectors (marketplace_id, language_tag, audience) move into the key's brackets, and a one-field attribute with several entries folds into one `#*` cell. ## Call it MCP tool call: ```json { "name": "listings_parse_payload", "arguments": { "store": "myStore-US", "productType": "", "amazon_attributes": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_parse_payload \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","productType":"","amazon_attributes":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `productType` | string | yes | Amazon productType whose schema drives the inverse shaping, e.g. "HEADPHONES". Use productTypeDefinitions_searchDefinitionsProductTypes if unsure. | | `amazon_attributes` | object | yes | Amazon-shaped attribute dict exactly as returned by listings_getListingsItem / catalogItems_getCatalogItem — {attr_name: [ {value:…, marketplace_id:…, …}, … ], …}. | | `locale` | string | | Schema locale for localized enumNames passed to getDefinitionsProductType. Defaults to the marketplace's default locale. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | the one language kept (e.g. en_AE, fr_FR); defaults to the marketplace's primary listing locale. An entry in another language is dropped (see data.dropped_entries) — one language per sheet. | ## Result - `data.attributes` — {key: cell_string} — the flat-file key grammar. A key this productType's CURRENT schema does not carry (Amazon keeps changing schemas) is just more keys here — nothing is skipped or hidden. - `data.names` — {key: display_name} — a NEW key's display name (for seeding row 6 when you write a key the sheet doesn't have yet). - `data.dropped_entries` — {attr: sentence} — one plain-English sentence per attribute naming how many entries were skipped for a foreign marketplace or language, e.g. "2 entries in another language (es_US) ignored — one marketplace and one language per sheet". - `data.notes` — [] normally; one sentence when the product-type schema could not be served and the cells were typed from the JSON alone (notification.type is then "warning"). Submit and validate still need the schema. ## Workflow - 1. catalogItems_getCatalogItem (or listings_getListingsItem) → amazon_attributes 2. listings_parse_payload → flat values 3. write_sheet → populate a review sheet for humans ## Params (Amazon schema) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT # listings_prepare_publish_queue_template (https://sellersheetai.com/docs/mcp-api/tools/listings_prepare_publish_queue_template) > Everything needed to seed a Publish Queue tab for N productTypes in one call: one bundle for a single productType, or ONE merged bundle keyed by the joined names ("TOWEL,HEADPHONES Access: **READ** · toolset amazon_sp · family sp.catalogItems_2022-04-01 ") whose column layout hosts rows of any productType in the set (propertyGroups, properties and required unioned across the schemas). Amazon SP-API · getCatalogItem · GET /catalog/2022-04-01/items/{asin} Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} ## Call it MCP tool call: ```json { "name": "listings_prepare_publish_queue_template", "arguments": { "store": "myStore-US", "productTypes": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_prepare_publish_queue_template \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","productTypes":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `productTypes` | object[] | yes | Amazon productTypes, e.g. ["HEADPHONES", "SHOES"] — one = a single bundle, several = a merged bundle. | | `referenceAsins` | object | | optional {productType: asin}; the bundle then carries reference_values seeded from that ASIN's catalog attributes. | | `locale` | string | | schema locale (e.g. en_AE); inferred from the store ref if omitted. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `language_tag` | string | | the language the language_tag token stands for (en_AE, fr_FR, …); defaults to the marketplace's primary listing locale. | | `required_first` | boolean | | true (default) sorts REQUIRED attributes to the front so they get the lowest column letters. | | `detail` | string | | 'full' (default) — every column carries guide; 'columns' omits guide, a lighter bundle for an AI that only needs keys, names and types to compose rows. | ## Result - `data.bundles` — {productType: {columns, ordered_groups, group_end_indices, required, requirements, attr_count, reference_values, source_product_types, requested_product_types}}. columns: [{key, name, required, type, enum, enum_names, several, strict, guide, group}] in sheet order — key is Amazon's own flat-file key (`[=]…#.…`), name the display name for row 6 (never an identifier), guide the row-4 guide, type string | number | integer | boolean | date | datetime, several = one cell with one value per line (the `#*` column), strict false only for a several-value enum column. required: the keys that are required. reference_values: {key: cell} in the same grammar. ordered_groups and - `data.bundles.group_end_indices` — the visual group dividers (product_identity, variations, product_details, images, offer, shipping, safety_and_compliance). - `data.errors` — {productType: unknown_product_type | schema_unavailable} for a schema that could not be served. ## Params (Amazon schema; getCatalogItem) - asin*: string marketplaceIds*: [string] includedData: attributes | classifications | dimensions | identifiers | images | productTypes | relationships | salesRanks | summaries | vendorDetails (list) locale: string ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Workflow - Seeding a tab: row 5 (hidden) = columns[].key from column F (column E is the attributes_json control), row 4 = columns[].guide, row 6 = columns[].name sized to the name, rows 7+ = data (reference_values as seed), a thick right border at column F + each group_end_indices index. Read the tab first (read_sheet) and append only the keys not already in row 5 at max column + 1 — existing columns are never renamed or moved; always address a column by its row-5 key. # listings_submit_feed (https://sellersheetai.com/docs/mcp-api/tools/listings_submit_feed) > Bulk publish through Amazon's Feeds API (JSON_LISTINGS_FEED) — the sidebar's "Submit Listing" parity, for 10+ SKUs up to ~25,000 per call; for interactive edits of ≤20 SKUs with pe Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 r-SKU feedback in the same call use listings_submit_items. Same row shape as listings_submit_items: flat cell values keyed by Amazon's flat-file key grammar. Returns a feedId at once; per-SKU issues come later in the feed result — track it with listings_poll_feed_results (feed_ids [data.feedId]) every ~30 s until terminal (DONE, FATAL or CANCELLED); it reads the feed and its report for you. Requires SP write access. Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Amazon SP-API · createFeedDocument · POST /feeds/2021-06-30/documents Amazon SP-API · createFeed · POST /feeds/2021-06-30/feeds Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "listings_submit_feed", "arguments": { "store": "myStore-US", "rows": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_submit_feed \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","rows":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `rows` | object[] | yes | [{sku, operationType, productType, attributes}] — operationType UPDATE, PUT or CREATE → feed UPDATE (full replace); PATCH or PARTIAL_UPDATE → feed PARTIAL_UPDATE (the listed attributes only); PATCH-DELETE → feed PATCH (op:delete of the filled attributes); DELETE → feed DELETE. | | `productType` | string | | the default productType when a row omits it. | | `locale` | string | | schema locale for localized labels; defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `issueLocale` | string | | the feed's issue locale (default 'en_US'). | | `language_tag` | string | | fills the language_tag token; defaults to the marketplace's primary listing locale. | | `debug` | boolean | | true returns the built feed as data.feed_json instead of submitting — the only dry run (feeds have no preview mode). | ## Result - `data.feedId` — track it with listings_poll_feed_results. data.feedDocumentId: the uploaded document. - `data.encoded_rows` — how many rows made the feed. data.op_counts: {operationType as - `data.encoded_rows.sent` — rows}. - `data.skipped` — [{sku, reason}] — missing_required_columns, invalid_operationType, unknown_product_type / schema_unavailable, no_valid_attributes_after_build, or a BLOCKING key (retired_column_layout, marketplace_mismatch, language_mismatch, column_collision, as listings_submit_items describes). When every row is skipped no feed is created and data carries no feedId. - `data.submissionLog` — the Submission Log row {action, result, skus, issues, feedId, rawResponse} — skus in feed message order, issues one line per skipped row. ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Body (Amazon schema; createFeedDocument) - contentType*: string ## Body (Amazon schema; createFeed) - feedType*: string marketplaceIds*: [string] (1–25) inputFeedDocumentId*: string feedOptions: object ## Gotchas - A PARTIAL_UPDATE message carries productType + attributes only (no requirements, no patches); a PATCH-DELETE row becomes a PATCH message whose op:delete patches remove the filled attributes, never the identifier. A __DELETE__ cell is not honoured in a feed (warning) — delete one attribute through listings_submit_items. Messages keep the rows' order, minus data.skipped; pass data.submissionLog.skus as listings_poll_feed_results' skus {feedId: one SKU per line}, or its issues read "Message n". Verify a sample row's encoding with listings_build_payload before a large feed. # listings_submit_items (https://sellersheetai.com/docs/mcp-api/tools/listings_submit_items) > Build Amazon-shaped payloads from Publish Queue cells AND submit them per SKU through the listings-items API in one call — the same input shape as listings_build_payload, then one Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 put, patch or delete per row by its operationType. Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Amazon SP-API · getListingsItem · GET /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · putListingsItem · PUT /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · patchListingsItem · PATCH /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · deleteListingsItem · DELETE /listings/2021-08-01/items/{sellerId}/{sku} Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "listings_submit_items", "arguments": { "store": "myStore-US", "productType": "", "rows": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_submit_items \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","productType":"","rows":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `productType` | string | yes | the default for rows that carry no productType of their own — rows of several productTypes may go in one call, e.g. "HEADPHONES". | | `rows` | object[] | yes | [{sku, operationType, productType?, attributes: {key: cell_value}}] in the flat-file key grammar of listings_build_payload. operationType: UPDATE (full replace; PUT and CREATE are legacy aliases) \| PATCH (JSON Patch on /attributes/*; PARTIAL_UPDATE is the feeds-spec alias) \| PATCH-DELETE (deletes the attributes whose cells are filled; identifier attributes are never deleted) \| DELETE. | | `mode` | string | | 'VALIDATION_PREVIEW' (default; a dry run that checks the SHAPE against the schema — Amazon may still refuse a value at submission, so always read issues) \| 'VALIDATION_AND_SUBMISSION' (a real put, patch or delete). A DELETE row is not sent in a preview and comes back SKIP with the reason; only VALIDATION_AND_SUBMISSION deletes the SKU. Live submission needs SP write access; a preview works at SP read. Allowed: VALIDATION_PREVIEW \| VALIDATION_AND_SUBMISSION. | | `locale` | string | | schema locale for localized labels; defaults to the marketplace's. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `issueLocale` | string | | the locale of the returned issue messages (default 'en_US'). | | `language_tag` | string | | fills the language_tag token; defaults to the marketplace's primary listing locale. | ## Result - `data.results` — [{sku, status, submissionId, issues: [{code, message, severity ERROR | WARNING | INFO}], warnings, reason, error}] — status is Amazon's ACCEPTED | VALID | INVALID, or SellerSheet's own SKIP (a pre-check; reason names it) and ERROR (the call failed; error says why). data.submitted, data.accepted, data.failed: counts. - `data.op_counts` — {operationType: rows}. ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Params (Amazon schema; getListingsItem) - sellerId*: string sku*: string marketplaceIds*: [string] issueLocale: string includedData: summaries | attributes | issues | offers | fulfillmentAvailability | procurement | relationships | productTypes (list) ## Params (Amazon schema; putListingsItem) - sellerId*: string sku*: string … (16 more lines; the Docs link above) ## Body (Amazon schema; putListingsItem) - productType*: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY attributes*: object ## Body (Amazon schema; patchListingsItem) - productType*: string patches*: [{op*: add | replace | merge | delete, path*, value: [object]}] (min 1) ## Gotchas - A row whose cells carry a BLOCKING key — one that does not parse or names a field the row's productType schema lacks (retired_column_layout), disagrees with the store's marketplace or the sheet's language (marketplace_mismatch, language_mismatch), or fills the same attribute in both its #* cell and a #1 cell (column_collision) — comes back SKIP; every other row in the call still submits. A cell holding exactly __DELETE__ on a PATCH row deletes that attribute (JSON Patch delete); on an UPDATE row it is ignored with a warning. ## Workflow - 1. Call with VALIDATION_PREVIEW and show the issues. 2. After the user approves and fixes, call with VALIDATION_AND_SUBMISSION. 3. Write the batch outcome to the Last Result pill (row 3, under the row-2 "Last Result" label) and each failing SKU's issues to the Submission Log. # catalogItems_getCatalogItem (https://sellersheetai.com/docs/mcp-api/tools/catalogItems_getCatalogItem) > Get Amazon's LIVE catalog data for a single ASIN — the reconciled version that shoppers see on the detail page. Access: **READ** · toolset amazon_sp · family sp.catalogItems_2022-04-01 Amazon SP-API · getCatalogItem · GET /catalog/2022-04-01/items/{asin} This returns what Amazon ACTUALLY DISPLAYS, not what the seller submitted. Amazon merges data from all sellers and its own sources, then picks the winning value for each attribute (title, images, bullets, brand, etc.). To check whether Amazon kept a seller's submission, compare data.item.attributes with listings_getListingsItem's data.attributes. ## Call it MCP tool call: ```json { "name": "catalogItems_getCatalogItem", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/catalogItems_getCatalogItem \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `includedData` | string[] | | List of additional data to include in response. Default: ['summaries'] (basic info only). NOT supported here: 'customerReviews' (use customerFeedback_getItemReviewTopics), 'offers' (use Product Pricing API → productPricing_getItemOffersBatch). Recommended: ['attributes', 'images', 'dimensions', 'salesRanks'] for full details. Allowed: attributes \| classifications \| dimensions \| identifiers \| images \| productTypes \| relationships \| salesRanks \| summaries \| vendorDetails. Allowed: attributes \| classifications \| dimensions \| identifiers \| images \| productTypes \| relationships \| salesRanks \| summaries \| vendorDetails. | | `locale` | string | | Locale for localized content (e.g. 'en_US', 'fr_CA'). | ## Result - `data.asin` — the requested ASIN. - `data.item` — catalog item object with: - asin: Amazon Standard Identification Number - summaries: basic info (title, brand, manufacturer, etc) if includedData includes 'summaries' - attributes: detailed attributes (color, size, material, etc) if includedData includes 'attributes' - images: product images with URLs if includedData includes 'images' - dimensions: package dimensions (weight, height, width, length) if includedData includes 'dimensions' - identifiers: all product identifiers (EAN, UPC, ISBN, etc) if includedData includes 'identifiers' - productTypes: product type info if includedData includes 'productTypes' - relationships: parent/child relationships (variations) if includedData includes 'relationships' - salesRanks: sales rank by category if includedData includes 'salesRanks' - classifications: the browse-node hierarchy per marketplace if includedData includes 'classifications' — [{marketplaceId, classifications: [{displayName, classificationId, parent: {displayName, classificationId, parent: …}}]}]. Amazon retired the v0 categories operation on 2026-03-31; this is the category hierarchy (a classificationId is a browse node id). - vendorDetails: vendor-only data if includedData includes 'vendorDetails' (vendors only) ## Workflow - 1. Use catalogItems_searchCatalogItems to find ASINs of interest. 2. For up to 20 ASINs at once use catalogItems_searchCatalogItems with identifiers + identifiersType ASIN (same per-item shape); call this tool for a single ASIN. # catalogItems_searchCatalogItems (https://sellersheetai.com/docs/mcp-api/tools/catalogItems_searchCatalogItems) > Search Amazon's live catalog by keywords or by identifiers — what shoppers see, not one seller's submission. Access: **READ** · toolset amazon_sp · family sp.catalogItems_2022-04-01 For a known list of ASINs this is the bulk fetch: up to 20 identifiers in one call return the same per-item shape as catalogItems_getCatalogItem (the catalog limit is 2 req/s, so looping the single-item tool over 20 ASINs costs ~10 s against ~1 s here). Use catalogItems_getCatalogItem only for one ASIN. Amazon SP-API · searchCatalogItems · GET /catalog/2022-04-01/items ## Call it MCP tool call: ```json { "name": "catalogItems_searchCatalogItems", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/catalogItems_searchCatalogItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `keywords` | object[] | | up to 20 keywords, e.g. ['wireless', 'mouse'] — this OR identifiers. | | `identifiers` | object[] | | up to 20 product identifiers — this OR keywords. | | `identifiersType` | string | | the type of every value in identifiers; required with identifiers. Allowed: ASIN \| EAN \| GTIN \| ISBN \| JAN \| MINSAN \| SKU \| UPC. Allowed: ASIN \| EAN \| GTIN \| ISBN \| JAN \| MINSAN \| SKU \| UPC. | | `includedData` | string[] | | datasets per item; default ['summaries']. Not here: customerReviews (the customerFeedback tools) and offers (productPricing_getItemOffersBatch). Allowed: attributes \| classifications \| dimensions \| identifiers \| images \| productTypes \| relationships \| salesRanks \| summaries \| vendorDetails. Allowed: attributes \| classifications \| dimensions \| identifiers \| images \| productTypes \| relationships \| salesRanks \| summaries \| vendorDetails. | | `brandNames` | object[] | | keyword searches only — brandName values from data.refinements.brands of a previous search (with identifiers Amazon returns 400). | | `classificationIds` | object[] | | keyword searches only — browse-node ids from data.refinements.classifications, or a classificationId read from catalogItems_getCatalogItem (includedData=['classifications']). | | `pageSize` | integer · –20 | | items per page, 1–20 (default 10). | | `pageToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `sellerId` | string | | required by Amazon when identifiersType is SKU — defaulted to the store's seller id on a seller account; a vendor passes its vendor code (orderDetails.sellingParty.partyId from vendorOrders_getPurchaseOrders). | | `locale` | string | | locale for localized content (e.g. 'en_US', 'fr_CA'). | | `keywordsLocale` | string | | keyword searches only — the keywords' locale; defaults to the marketplace's. | ## Result - `data.numberOfResults` — total matches. - `data.items` — [{asin, summaries, attributes, images, dimensions, identifiers, productTypes, relationships, salesRanks, classifications, vendorDetails}] — a dataset is present only when requested. - `data.nextToken` — pass it back as pageToken; null on the last page. - `data.refinements` — keyword searches only — {brands: [{brandName, numberOfResults}], - `data.refinements.classifications` — [{classificationId, displayName, numberOfResults}]} to narrow the same search through brandNames / classificationIds. # customerFeedback_getBrowseNodeReturnTopics (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReturnTopics) > The top 10 reasons customers give when returning products in a browse node, each with its share of the category's returns (US, UK, FR, IT, DE, ES, JP only) — use them to set accura Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 te expectations in the listing. One call — this operation takes no sortBy. Call after customerFeedback_getBrowseNodeReviewTrends; then customerFeedback_getBrowseNodeReturnTrends. Amazon SP-API · getBrowseNodeReturnTopics · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/topics ## Call it MCP tool call: ```json { "name": "customerFeedback_getBrowseNodeReturnTopics", "arguments": { "store": "myStore-US", "browseNodeId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getBrowseNodeReturnTopics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","browseNodeId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `browseNodeId` | string | yes | Browse node ID from customerFeedback_getItemBrowseNode. | ## Result - `data.returnTopics` — the Amazon payload (already compact ~2 KB — there is no slim mode on this operation): {browseNodeId, displayName, marketplaceId, countryCode, dateRange: {startDate, endDate}, topics: [ReturnTopic] (up to 10)}, ReturnTopic = {topic (the return-reason theme), browseNodeMetrics: {occurrencePercentage: {allProducts}} (the share of category returns that cite this reason)}. Return topics carry NO reviewSnippets and NO subtopics — unlike the review-topics operations. # customerFeedback_getBrowseNodeReturnTrends (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReturnTrends) > Month-by-month share of the category's returns that cite each return reason (past 6 months, newest first) for a browse node (US, UK, FR, IT, DE, ES, JP only) — whether a reason is Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 growing, and seasonal patterns. The last step, after customerFeedback_getBrowseNodeReturnTopics. Amazon SP-API · getBrowseNodeReturnTrends · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/trends ## Call it MCP tool call: ```json { "name": "customerFeedback_getBrowseNodeReturnTrends", "arguments": { "store": "myStore-US", "browseNodeId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getBrowseNodeReturnTrends \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","browseNodeId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `browseNodeId` | string | yes | Browse node ID from customerFeedback_getItemBrowseNode. | | `summarize` | boolean | | true returns the slim shape (~80 % smaller: flat cat_pct lists plus a computed direction and delta) — use it in AI workflows; default false returns Amazon's raw payload. | ## Result - `data.returnTrends` — the Amazon payload; the topics sit one level down under a second returnTrends key (data.returnTrends.returnTrends) in both shapes, as one flat list (NOT split positive/negative). Raw: {browseNodeId, displayName, marketplaceId, countryCode, dateRange: {startDate, endDate}, returnTrends: [TrendTopic]}, TrendTopic = {topic, trendMetrics: [Period]}, one Period per month, newest first = {dateRange, browseNodeMetrics: {occurrencePercentage: {allProducts}}}. Slim: [SlimTrend], SlimTrend = {topic, cat_pct: [float] (the reason's monthly share, newest first), direction: RISING | STABLE | FALLING | null (newest-2-month vs oldest-2-month average, ±10 %; null below 3 reported months once Amazon's zero-padded edge months are trimmed), delta: newest − oldest reported month (positive = that reason's share is growing; null below 2 reported months)}. # customerFeedback_getBrowseNodeReviewTopics (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReviewTopics) > The 10 most positive and 10 most negative review topics of a whole browse node (US, UK, FR, IT, DE, ES, JP only). Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 Call it TWICE per node — sortBy MENTIONS (recent 6 months: what customers mention most) and sortBy STAR_RATING_IMPACT (~18 months: what moves the star rating); the two datasets are complementary. Then customerFeedback_getBrowseNodeReviewTrends. Amazon SP-API · getBrowseNodeReviewTopics · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/topics ## Call it MCP tool call: ```json { "name": "customerFeedback_getBrowseNodeReviewTopics", "arguments": { "store": "myStore-US", "browseNodeId": "", "sortBy": "MENTIONS" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getBrowseNodeReviewTopics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","browseNodeId":"","sortBy":"MENTIONS"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `browseNodeId` | string | yes | from customerFeedback_getItemBrowseNode (e.g. '10671064011'). | | `sortBy` | string | yes | the metric the topics are ranked by — one per call, each described above. Allowed: MENTIONS \| STAR_RATING_IMPACT. Allowed: MENTIONS \| STAR_RATING_IMPACT. | | `summarize` | boolean | | true returns the slim shape below (~93 % smaller) — use it in AI workflows; default false returns Amazon's raw payload. | ## Result - `data.reviewTopics` — category-level — no asinMetrics or childAsinMetrics (item-only). - `data.reviewTopics.Raw` — {browseNodeId, displayName, marketplaceId, countryCode, dateRange: {startDate, endDate}, topics: {positiveTopics: [Topic], negativeTopics: [Topic]}} (up to 10 each), Topic = {topic, browseNodeMetrics: {occurrencePercentage: {allProducts, topTwentyFivePercentProducts}, starRatingImpact: {allProducts, topTwentyFivePercentProducts}}, reviewSnippets: [str] (up to 3), subtopics: [{subtopic, metrics: {occurrencePercentage}, reviewSnippets}] (up to 5)} — allProducts is the whole category, topTwentyFivePercentProducts the best-selling quartile (the leaders). Slim: {topics: {positiveTopics: [SlimTopic], negativeTopics: [SlimTopic]}}, SlimTopic = {topic, browseNodeMetrics, reviewSnippets (top 3), subtopics (top 3, {subtopic, occurrencePercentage}), leaders_pct_ratio (topTwentyFivePercentProducts ÷ allProducts, null when either is missing)} — on a NEGATIVE topic a ratio above 1 means the category leaders still suffer the issue: an unsolved category-wide gap. ## Gotchas - Some STAR_RATING_IMPACT topics have no occurrencePercentage, and Amazon may return an unresolved '$…' placeholder string there — treat a non-numeric value as absent. The browse-node subtopic metric is occurrencePercentage only (numberOfMentions is item-level, on customerFeedback_getItemReviewTopics). # customerFeedback_getBrowseNodeReviewTrends (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getBrowseNodeReviewTrends) > Month-by-month occurrence trends (past 6 months, newest first) of a browse node's top review topics — the category baseline for customerFeedback_getItemReviewTrends (US, UK, FR, IT Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 , DE, ES, JP only). Call after customerFeedback_getBrowseNodeReviewTopics (both sortBy values); then customerFeedback_getBrowseNodeReturnTopics. Amazon SP-API · getBrowseNodeReviewTrends · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/trends ## Call it MCP tool call: ```json { "name": "customerFeedback_getBrowseNodeReviewTrends", "arguments": { "store": "myStore-US", "browseNodeId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getBrowseNodeReviewTrends \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","browseNodeId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `browseNodeId` | string | yes | Browse node ID from customerFeedback_getItemBrowseNode. | | `summarize` | boolean | | true returns the slim shape (~98 % smaller, ~55 KB → ~1 KB: flat cat_pct lists, allProducts only, no topTwentyFivePercentProducts or dateRange) — use it in AI workflows; default false returns Amazon's raw payload. | ## Result - `data.reviewTrends` — the Amazon payload; the topics sit one level down under a second reviewTrends key (data.reviewTrends.reviewTrends) in both shapes. - `data.reviewTrends.Raw` — {browseNodeId, displayName, marketplaceId, countryCode, dateRange: {startDate, endDate}, reviewTrends: {positiveTopics: [TrendTopic], negativeTopics: [TrendTopic]}}, TrendTopic = {topic, trendMetrics: [Period]}, one Period per month, newest first = {dateRange, browseNodeMetrics: {occurrencePercentage: {allProducts, topTwentyFivePercentProducts}}} (category-level — no asinMetrics). Slim: {positiveTopics: [SlimTrend], negativeTopics: [SlimTrend]}, SlimTrend = {topic, cat_pct: [float] (the category's monthly allProducts occurrencePercentage, newest first)}. # customerFeedback_getItemBrowseNode (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemBrowseNode) > Get the browse node (category) ID for a specific ASIN. Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 Amazon SP-API · getItemBrowseNode · GET /customerFeedback/2024-06-01/items/{asin}/browseNode Supported marketplaces: US, UK (GB), FR, IT, DE, ES, JP only. This is Step 1 of the Browse Node Feedback workflow. The returned browseNodeId feeds the four customerFeedback_getBrowseNode* tools. ## Call it MCP tool call: ```json { "name": "customerFeedback_getItemBrowseNode", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getItemBrowseNode \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | ## Result - `data.browseNode.browseNodeId` — pass it as browseNodeId. - `data.browseNode.displayName` — human-readable category name. ## Workflow - Browse Node Feedback workflow: 1. customerFeedback_getItemBrowseNode ← you are here 2. customerFeedback_getBrowseNodeReviewTopics (MENTIONS + STAR_RATING_IMPACT) 3. customerFeedback_getBrowseNodeReviewTrends 4. customerFeedback_getBrowseNodeReturnTopics (single call — no sortBy on this operation) 5. customerFeedback_getBrowseNodeReturnTrends # customerFeedback_getItemReviewTopics (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemReviewTopics) > The 10 most positive and 10 most negative review topics of one ASIN (US, UK, FR, IT, DE, ES, JP only), each with review snippets, occurrence %, star-rating impact and the browse-no Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 de benchmark. Call it TWICE per ASIN — sortBy MENTIONS (recent ~6 months: what customers mention most) and sortBy STAR_RATING_IMPACT (~18 months: what moves the star rating). Then customerFeedback_getItemReviewTrends. Amazon SP-API · getItemReviewTopics · GET /customerFeedback/2024-06-01/items/{asin}/reviews/topics ## Call it MCP tool call: ```json { "name": "customerFeedback_getItemReviewTopics", "arguments": { "store": "myStore-US", "asin": "", "sortBy": "MENTIONS" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getItemReviewTopics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":"","sortBy":"MENTIONS"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `sortBy` | string | yes | the metric the topics are ranked by — one per call, each described above. Allowed: MENTIONS \| STAR_RATING_IMPACT. Allowed: MENTIONS \| STAR_RATING_IMPACT. | | `summarize` | boolean | | true returns the slim shape below (~90 % smaller) — use it in AI workflows; default false returns Amazon's raw payload. | ## Result - `data.reviewTopics` — raw — {asin, itemName, marketplaceId, countryCode, dateRange: {startDate, endDate}, topics: {positiveTopics: [Topic], negativeTopics: [Topic]}} (up to 10 each), Topic = {topic (e.g. 'Assembly/Installation'), asinMetrics: {numberOfMentions, occurrencePercentage (% of this ASIN's reviews mentioning it), starRatingImpact (star points the topic adds or removes)}, parentAsinMetrics (the same over the parent's children), browseNodeMetrics: {occurrencePercentage: {allProducts}, starRatingImpact: {allProducts}} (the CATEGORY benchmark), - `data.reviewTopics.childAsinMetrics` — {mostMentions: {asin, numberOfMentions}, leastMentions: {asin, numberOfMentions}}, reviewSnippets: [str], subtopics: [{subtopic, metrics: {numberOfMentions, occurrencePercentage}, reviewSnippets}]}. Slim — {topics: {positiveTopics: [SlimTopic], negativeTopics: [SlimTopic]}}, SlimTopic = {topic, asinMetrics, browseNodeMetrics, reviewSnippets (top 3), subtopics (top 3, {subtopic, occurrencePercentage}), gap_ratio (asinMetrics.occurrencePercentage ÷ the category allProducts, null when either is missing — above 1 the ASIN over-indexes; on a NEGATIVE topic that is worse than the category), gap_class CRITICAL (>2×) | HIGH (>1.5×) | MEDIUM (>1×) | LOW (≤1×) | null, or the low-sample class (fewer than 5 mentions of the topic or 10 across the ASIN — gap_ratio is then null), cat_source browse_node | item_payload (where the category figure came from)}; parentAsinMetrics, childAsinMetrics and anything beyond the top 3 are dropped. # customerFeedback_getItemReviewTrends (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_getItemReviewTrends) > Month-by-month occurrence trends (past 6 months, newest first) of one ASIN's 10 most positive and 10 most negative review topics, beside the category's — to see whether a fix impro Access: **READ** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 ved sentiment or an issue is growing (US, UK, FR, IT, DE, ES, JP only). Call after customerFeedback_getItemReviewTopics (both sortBy values). Amazon SP-API · getItemReviewTrends · GET /customerFeedback/2024-06-01/items/{asin}/reviews/trends ## Call it MCP tool call: ```json { "name": "customerFeedback_getItemReviewTrends", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_getItemReviewTrends \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `summarize` | boolean | | true returns the slim shape (~90 % smaller: flat asin_pct and cat_pct lists instead of trendMetrics, no dateRange) — use it in AI workflows; default false returns Amazon's raw payload. | ## Result - `data.reviewTrends` — the Amazon payload; the topics sit one level down under a second reviewTrends key (data.reviewTrends.reviewTrends) in both shapes. - `data.reviewTrends.Raw` — {asin, itemName, marketplaceId, countryCode, dateRange: {startDate, endDate}, reviewTrends: {positiveTopics: [TrendTopic], negativeTopics: [TrendTopic]}}, TrendTopic = {topic, trendMetrics: [Period]}, one Period per month, newest first = {dateRange, asinMetrics: {occurrencePercentage}, parentAsinMetrics: {occurrencePercentage} (null with too little data), browseNodeMetrics: {occurrencePercentage: {allProducts}}}. Trends carry occurrence percentages ONLY — numberOfMentions and starRatingImpact are on customerFeedback_getItemReviewTopics. Slim: {positiveTopics: [SlimTrend], negativeTopics: [SlimTrend]}, SlimTrend = {topic, asin_pct: [float] (this ASIN's monthly occurrencePercentage), cat_pct: [float] (the category's monthly allProducts occurrencePercentage)} — parallel, newest first (index = months ago); watch for a rising negative-topic asin_pct against cat_pct. # customerFeedback_insights_report (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_insights_report) > Buyer insights report for ONE ASIN — what buyers of this CATEGORY praise, complain about and return, turned into the questions to answer before writing listing copy. Access: **WRITE** · toolset amazon_sp · family sp.customerFeedback_2024-06-01 An async job: returns data.job_id at once; poll customerFeedback_insights_report_status every ~4 s until data.status is 'done' (the report is data.report) or 'error'; a report takes 1–3 minutes. A credits hold is taken at submit (price it with credits_quote) and settled by the worker; nothing is charged when the marketplace has no buyer-feedback data (US, UK, FR, IT, DE, ES, JP only) or the build fails; HTTP 402 with error_code insufficient_credits when the balance is short — top up at sellersheetai.com/billing. Amazon SP-API · getItemBrowseNode · GET /customerFeedback/2024-06-01/items/{asin}/browseNode Amazon SP-API · getBrowseNodeReviewTopics · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/topics Amazon SP-API · getBrowseNodeReturnTopics · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/topics Amazon SP-API · getBrowseNodeReviewTrends · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/reviews/trends Amazon SP-API · getBrowseNodeReturnTrends · GET /customerFeedback/2024-06-01/browseNodes/{browseNodeId}/returns/trends Amazon SP-API · getItemReviewTopics · GET /customerFeedback/2024-06-01/items/{asin}/reviews/topics Amazon SP-API · getItemReviewTrends · GET /customerFeedback/2024-06-01/items/{asin}/reviews/trends Amazon SP-API · searchCatalogItems · GET /catalog/2022-04-01/items ## Call it MCP tool call: ```json { "name": "customerFeedback_insights_report", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_insights_report \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `via` | string | | a store ref to VIEW through — one of the candidates a 'choose_marketplace' report returned (a US/UK/FR/IT/DE/ES/JP store). | | `listing_context` | object | | {title, bullets, description} of the hero SKU — grounds the suggested answers (truncated server-side at ~1,500 chars). | | `category` | object | | a pick from a 'no_matching_category' report's candidates — {classificationId, displayName, marketplace}, in the viewing marketplace; the report then records category_chosen_by 'operator'. | ## Result - `data.job_id` — the job; data.status 'pending'; data.credits {charged, balance}. - `data.report` — supported false means the marketplace is not covered and nothing was charged — reason choose_marketplace | no_matching_category | marketplace_unsupported, with candidates to pass as via or category. Otherwise credits {charged, balance}; category and category_chosen_by; report_version 3; tiles (the three headline - `data.report.findings` — type, topic, number, unit, chips, so_what, question n); cluster (one sentence when several topics are one fact); verdicts[] (every complaint topic: kind fix | watch | pre_empt | fine, priority, you vs category vs the top-25 % sellers as gap and gap_leaders, trend, star, category return share, subtopics with quotes, so_what — what to do in the LISTING); strengths[], pre_empt[], category_complaints[], category_praise[], returns[], star_lifters[] (the evidence tables); questions[] (one per FACT: n, group, question, why, buyers_say, example — a complete sample answer with {number} and {detail} slots — line with {answer}, listing_use, coverage from_listing | from_draft | partial (+missing) | contested (+disputed_by) | needs_you, answer, source {field, quote}); skipped[] (return reasons the product cannot have); keywords[] (buyer-language phrases). Read the tiles and so-whats, then answer the questions — a sample answer is a starting point, never a fact until confirmed. ## Params (Amazon schema; getItemBrowseNode) - asin*: string marketplaceId*: string ## Params (Amazon schema; getBrowseNodeReviewTopics) - browseNodeId*: string marketplaceId*: string sortBy*: MENTIONS | STAR_RATING_IMPACT ## Params (Amazon schema; getBrowseNodeReturnTopics) - browseNodeId*: string marketplaceId*: string ## Params (Amazon schema; getBrowseNodeReviewTrends) - browseNodeId*: string marketplaceId*: string ## Params (Amazon schema; getBrowseNodeReturnTrends) - browseNodeId*: string marketplaceId*: string ## Params (Amazon schema; getItemReviewTopics) - asin*: string marketplaceId*: string … (18 more lines; the Docs link above) # dataKiosk_cancelQuery (https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_cancelQuery) > Cancel a Data Kiosk query that is IN_QUEUE or IN_PROGRESS. Access: **READ** · toolset amazon_sp · family sp.dataKiosk_2023-11-15 Amazon SP-API · cancelQuery · DELETE /dataKiosk/2023-11-15/queries/{queryId} Only IN_QUEUE and IN_PROGRESS queries can be cancelled; re-cancelling an already-CANCELLED query is a no-op (it succeeds). DONE and FATAL queries cannot be cancelled. Cancelled queries still appear in dataKiosk_getQuery / dataKiosk_getQueries results. Cancelling is a write operation and requires SP write access. ## Call it MCP tool call: ```json { "name": "dataKiosk_cancelQuery", "arguments": { "store": "myStore-US", "queryId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/dataKiosk_cancelQuery \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","queryId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `queryId` | string | yes | Query ID to cancel. | ## Result - `data.queryId` — the cancelled query id. - `data.result` — empty — Amazon returns 204 No Content on success. # dataKiosk_createQuery (https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_createQuery) > Submit a Data Kiosk GraphQL query; returns queryId at once. Access: **READ** · toolset amazon_sp · family sp.dataKiosk_2023-11-15 Poll dataKiosk_getQuery until processingStatus is DONE — it returns the result itself (data.result.documentContent); dataKiosk_getDocument only reads a FATAL query's errorDocumentId. When the DONE query reports data.result.pagination.nextToken, resubmit the SAME query string with it as paginationToken for the next page. Requires SP write access. Amazon SP-API · createQuery · POST /dataKiosk/2023-11-15/queries ## Call it MCP tool call: ```json { "name": "dataKiosk_createQuery", "arguments": { "store": "myStore-US", "query": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/dataKiosk_createQuery \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","query":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `query` | string | yes | the GraphQL query string, ≤8,000 chars. Pick a versioned root type, then a dataset field under it — analytics_salesAndTraffic_2024_04_24 (salesAndTrafficByDate, salesAndTrafficByAsin, salesAndTrafficTrends), analytics_economics_2024_03_15 (economics, economicsPreview, economicsSimulation), analytics_vendorAnalytics_2024_09_30 (manufacturingView, sourcingView); the 2023_11_15 sales root is deprecated. Example, daily sales for one month — 'query { analytics_salesAndTraffic_2024_04_24 { salesAndTrafficByDate(aggregateBy: DAY, startDate: "2026-07-01", endDate: "2026-07-31", marketplaceIds: ["A2VIGQ35RCS4UG"]) { startDate endDate sales { orderedProductSales { amount currencyCode } unitsOrdered } traffic { sessions pageViews } } } }'. startDate is at most two years back. | | `paginationToken` | string | | the DONE query's data.result.pagination.nextToken (from dataKiosk_getQuery); omit for the first page. | ## Result - `data.queryId` — poll it with dataKiosk_getQuery. - `data.marketplaceId` — the store's marketplace id — the value the query must name. ## Gotchas - The marketplace is named INSIDE the query and the spelling differs per dataset field (a wrong one ends FATAL) — a list argument marketplaceIds: [String!]! on salesAndTrafficByDate, salesAndTrafficByAsin, economics and economicsPreview; a singular marketplaceId: String! on economicsSimulation; per filter inside filters: [MarketplaceAsinFilter!]! on salesAndTrafficTrends (no marketplaceIds argument); none at all on manufacturingView and sourcingView (args exactly aggregateBy, currencyCode, endDate, startDate). Aggregation is spelled differently per field — salesAndTrafficByDate aggregateBy DateGranularity! (DAY | WEEK | MONTH); salesAndTrafficByAsin aggregateBy AsinGranularity! (CHILD | PARENT | SKU); salesAndTrafficTrends takes asinAggregation (CHILD only) AND dateAggregation and has no aggregateBy; manufacturingView and sourcingView aggregateBy DateGranularity!; economics aggregateBy is an optional input OBJECT {date: DateGranularity, productId: ProductIdentifierGranularity} defaulting to DAY and MSKU (aggregateBy: DAY is a type error); economicsPreview likewise, its date enum EconomicsPreviewDateGranularity (RANGE only); economicsSimulation has none. Rate limit ~one submission a minute (0.0167 req/s, burst 15) — pace a pagination loop. The query and its documents are kept for the SHORTEST @resultRetention among the requested fields (commonly 30 days): download before then. # dataKiosk_getDocument (https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getDocument) > Fetch a Data Kiosk document by document ID. Access: **READ** · toolset amazon_sp · family sp.dataKiosk_2023-11-15 Amazon SP-API · getDocument · GET /dataKiosk/2023-11-15/documents/{documentId} Use this when you already have a documentId (from a completed query's dataDocumentId field — note the field is dataDocumentId, NOT dataDocument). For the typical poll-and-download flow, use dataKiosk_getQuery instead. ## Call it MCP tool call: ```json { "name": "dataKiosk_getDocument", "arguments": { "store": "myStore-US", "documentId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/dataKiosk_getDocument \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","documentId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `documentId` | string | yes | Document ID string (the dataDocumentId from a DONE query, or an errorDocumentId from a FATAL query). | | `download` | boolean | | If True (default), fetches and returns document content. | ## Result - `data.documentId` — the requested document id. - `data.result.documentId` — Amazon document id. - `data.result.documentUrl` — presigned URL to retrieve the document (expires after 5 minutes). - `data.result.document` — raw document bytes (present only when download=True). This is the actual document content. # dataKiosk_getQueries (https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getQueries) > List Data Kiosk queries for this store with optional filters. Access: **READ** · toolset amazon_sp · family sp.dataKiosk_2023-11-15 Amazon SP-API · getQueries · GET /dataKiosk/2023-11-15/queries Useful for checking query history or finding queryIds for completed queries. Read a DONE query's results with dataKiosk_getQuery. ## Call it MCP tool call: ```json { "name": "dataKiosk_getQueries", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/dataKiosk_getQueries \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `processingStatuses` | string[] | | the query statuses to keep (at least 1 value if given); omit for all. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. | | `pageSize` | integer · 1–100 | | Number of results per page (1-100; defaults to 10). | | `createdSince` | string · date-time | | Earliest query-creation time to include, ISO 8601 date time (e.g. '2026-06-01T00:00:00Z'). Defaults to 90 days ago. | | `createdUntil` | string · date-time | | Latest query-creation time to include, ISO 8601 date time. Defaults to the time of the request. | | `paginationToken` | string | | Token from a previous response (data.pagination.nextToken) for the next page. When paging, resend processingStatuses / createdSince / createdUntil unchanged (only pageSize may change). | ## Result - `data.queries` — list of query objects, each with queryId, query, processingStatus, createdTime, and (when DONE/FATAL) dataDocumentId or errorDocumentId. - `data.pagination.nextToken` — present when more results are available; pass back as paginationToken for the next page. # dataKiosk_getQuery (https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getQuery) > Poll Data Kiosk query status. Access: **READ** · toolset amazon_sp · family sp.dataKiosk_2023-11-15 Auto-downloads document when processingStatus == DONE. Amazon SP-API · getQuery · GET /dataKiosk/2023-11-15/queries/{queryId} Amazon SP-API · getDocument · GET /dataKiosk/2023-11-15/documents/{documentId} When the query is DONE, the response includes documentContent with the full result. If not yet done, call again in a few seconds. On FATAL, read the named errorDocumentId with dataKiosk_getDocument before resubmitting. ## Call it MCP tool call: ```json { "name": "dataKiosk_getQuery", "arguments": { "store": "myStore-US", "queryId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/dataKiosk_getQuery \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","queryId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `queryId` | string | yes | Query ID from dataKiosk_createQuery response. | ## Result - `data.queryId` — the polled query id. - `data.processingStatus` — CANCELLED | DONE | FATAL | IN_PROGRESS | IN_QUEUE - `data.result.dataDocumentId` — result document id (present only when DONE and the query produced data). NOTE: the field is dataDocumentId, NOT dataDocument. - `data.result.errorDocumentId` — error document id (present only when the query failed with FATAL and produced an error document). Pass it to dataKiosk_getDocument to read WHY the query failed before resubmitting — human_action names it for you on a FATAL. - `data.result.documentContent` — auto-downloaded getDocument payload — present only when DONE and a dataDocumentId existed. It is the getDocument response: {documentId, documentUrl, document}, where `document` is the raw document bytes (the actual result rows). - `data.result.pagination.nextToken` — present when the result spans multiple pages; submit a new dataKiosk_createQuery with the SAME query string plus that token (as paginationToken) to fetch the next page. # fbaInbound_cancelInboundPlan (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_cancelInboundPlan) > Cancel an FBA inbound plan. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 IRREVERSIBLE — always confirm with human before calling. Amazon SP-API · cancelInboundPlan · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/cancellation Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_cancelInboundPlan", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_cancelInboundPlan \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | ## Result - `data.cancelled` — true once the cancellation operation reached SUCCESS (a refused or FAILED cancellation raises instead). - `data.operation` — the final getInboundOperationStatus payload. ## Gotchas - Amazon may charge for a cancellation outside the void window — 24 h for Amazon-partnered small parcel, 1 h for partnered LTL; say so when asking the human. # fbaInbound_cancelSelfShipAppointment (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_cancelSelfShipAppointment) > Cancel a self-ship appointment (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · cancelSelfShipAppointment · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/selfShipAppointmentCancellation Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Only available in MX, BR, EG, SA, AE and IN. ## Call it MCP tool call: ```json { "name": "fbaInbound_cancelSelfShipAppointment", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_cancelSelfShipAppointment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `reason_comment` | string | | optional reason for the cancellation. Allowed: APPOINTMENT_REQUESTED_BY_MISTAKE \| VEHICLE_DELAY \| SLOT_NOT_SUITABLE \| OUTSIDE_CARRIER_BUSINESS_HOURS \| UNFAVOURABLE_EXTERNAL_CONDITIONS \| PROCUREMENT_DELAY \| SHIPPING_PLAN_CHANGED \| INCREASED_QUANTITY \| OTHER. Allowed: APPOINTMENT_REQUESTED_BY_MISTAKE \| VEHICLE_DELAY \| SLOT_NOT_SUITABLE \| OUTSIDE_CARRIER_BUSINESS_HOURS \| UNFAVOURABLE_EXTERNAL_CONDITIONS \| PROCUREMENT_DELAY \| SHIPPING_PLAN_CHANGED \| INCREASED_QUANTITY \| OTHER. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. # fbaInbound_confirm_plan_options (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirm_plan_options) > Confirm the human's placement option and, per shipment, the transport option (+ delivery window) in one call — after the human approved them from fbaInbound_generate_shipment_optio Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 ns. Amazon SP-API · listPlacementOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Amazon SP-API · confirmPlacementOption · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions/{placementOptionId}/confirmation Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Amazon SP-API · confirmDeliveryWindowOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions/{deliveryWindowOptionId}/confirmation Amazon SP-API · confirmTransportationOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions/confirmation Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} Amazon SP-API · listTransportationOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions Amazon SP-API · listDeliveryWindowOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions Gate: commit, choice, fee-bearing — interactive: restate the option and the amount, wait for a typed CONFIRM; autopilot: only within the seller's instruction, named rule (one option, no tie) and stated limits; otherwise ask. Mode A (plan workbook): pass sta_spreadsheet_id and the server writes the chosen options (as the dropdown texts), FBA ID, Reference ID, Warehouse ID and Status into the picked STA-Options block — the sidebar's Confirm on that tab. Mode B: omit it. Server chains confirmPlacementOption → confirmDeliveryWindowOptions (only for entries that carry deliveryWindowOptionId) → confirmTransportationOptions, polling each operation to SUCCESS. All option ids are 38 chars except deliveryWindowOptionId (36-38). ## Call it MCP tool call: ```json { "name": "fbaInbound_confirm_plan_options", "arguments": { "store": "myStore-US", "plan_id": "", "placement_option_id": "", "shipment_confirmations": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirm_plan_options \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","placement_option_id":"","shipment_confirmations":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `placement_option_id` | string | yes | the placementOptionId (from fbaInbound_listPlacementOptions). One already ACCEPTED — after fbaInbound_confirmPlacementOption, or a first run whose transport step failed — is not confirmed again; the shipment steps run. | | `shipment_confirmations` | object[] | yes | one entry per shipment in the placement option: [{shipmentId (38 chars), transportOptionId (38 chars; sent as Amazon's transportationOptionId), deliveryWindowOptionId, contactInformation}]. deliveryWindowOptionId — required when the chosen transport option's preconditions ask for a confirmed delivery window (own-carrier options do). contactInformation — {name ≤50, phoneNumber ≤20, email?}, REQUIRED for Amazon-partnered (PCP) options (Amazon: "does not support confirming PCP options without contact info"). | | `sta_spreadsheet_id` | string | | the plan workbook's spreadsheet id (mode A); omit for mode B. | ## Result - `data.confirmedShipments` — [{shipmentId, shipmentConfirmationId, fbaId, referenceId, warehouseId, status}] - `data.placementOptionId` — the confirmed option. ## Workflow - 1. Read the human's placement pick (mode A: the "2." chip's row-6 cell — the id is the text before the first space; mode B: the handover file) and, per shipment, their transport choice (+ window) from fbaInbound_generate_shipment_options. 2. Call this tool. 3. Record data.confirmedShipments as the fba-inbound skill describes (row 12, the "4." chip, Manage Shipments, _state); shipmentConfirmationId feeds fbaInbound_get_labels. ## Params (Amazon schema; listPlacementOptions) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) ## Params (Amazon schema; confirmPlacementOption) - inboundPlanId*: string (max 38 chars) placementOptionId*: string (max 38 chars) ## Params (Amazon schema; getInboundOperationStatus) - operationId*: string (max 38 chars) ## Params (Amazon schema; confirmDeliveryWindowOptions) - inboundPlanId*: string (max 38 chars) shipmentId*: string (max 38 chars) deliveryWindowOptionId*: string (max 38 chars) ## Params (Amazon schema; confirmTransportationOptions) - inboundPlanId*: string (max 38 chars) ## Params (Amazon schema; getShipment) - inboundPlanId*: string (max 38 chars) shipmentId*: string (max 38 chars) ## Params (Amazon schema; listTransportationOptions) - … (10 more lines; the Docs link above) ## Body (Amazon schema; confirmTransportationOptions): {transportationSelections - [TransportationSelection]} (min 1), each item: contactInformation: {email (max 1024 chars), name* (max 50 chars), phoneNumber* (max 20 chars)} shipmentId*: string (38–38 chars) transportationOptionId*: string (38–38 chars) # fbaInbound_confirmDeliveryWindowOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmDeliveryWindowOptions) > Confirm a delivery window option for a shipment (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · confirmDeliveryWindowOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions/{deliveryWindowOptionId}/confirmation Gate: commit, choice — interactive: restate the option, wait for a typed CONFIRM; autopilot: only within the seller's instruction, named rule (one option, no tie) and stated limits; otherwise ask. USE_YOUR_OWN_CARRIER flow. Pick a deliveryWindowOptionId from fbaInbound_listDeliveryWindowOptions, confirm it, then poll the operation. A placement option must be confirmed first; a transportation option whose preconditions ask for a confirmed delivery window can be confirmed only after this. Once confirmed, no new windows can be generated (the chosen one can still be updated before the shipment closes). ## Call it MCP tool call: ```json { "name": "fbaInbound_confirmDeliveryWindowOptions", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "delivery_window_option_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirmDeliveryWindowOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","delivery_window_option_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `delivery_window_option_id` | string | yes | the deliveryWindowOptionId (from fbaInbound_listDeliveryWindowOptions; 36–38 chars). | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. # fbaInbound_confirmPackingOption (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPackingOption) > Confirm a packing option (Amazon write — irreversible for this plan). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · confirmPackingOption · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions/{packingOptionId}/confirmation Gate: approve, choice — interactive: show the change and the option (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change, within named rule (one option, no tie); otherwise ask. After SUCCESS, call fbaInbound_setPackingInformation with one grouping per packingGroupId of the confirmed option (its packingGroups in fbaInbound_listPackingOptions), then fbaInbound_generatePlacementOptions. ## Call it MCP tool call: ```json { "name": "fbaInbound_confirmPackingOption", "arguments": { "store": "myStore-US", "plan_id": "", "packing_option_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirmPackingOption \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","packing_option_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `packing_option_id` | string | yes | packingOptionId selected from fbaInbound_listPackingOptions. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Workflow - 1. fbaInbound_generatePackingOptions completed (poll until SUCCESS) 2. fbaInbound_listPackingOptions — human or AI selects packingOptionId 3. Confirm with human before calling (this commits the packing structure) # fbaInbound_confirmPlacementOption (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPlacementOption) > Confirm one placement option of an inbound plan; the server waits until Amazon's operation finishes. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Next, generate and confirm transportation for the plan's shipments (or use fbaInbound_confirm_plan_options for placement + transport in one call). Amazon SP-API · confirmPlacementOption · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions/{placementOptionId}/confirmation Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Gate: commit, choice, fee-bearing — interactive: restate the option and the amount, wait for a typed CONFIRM; autopilot: only within the seller's instruction, named rule (one option, no tie) and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_confirmPlacementOption", "arguments": { "store": "myStore-US", "plan_id": "", "placement_option_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirmPlacementOption \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","placement_option_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `placement_option_id` | string | yes | the placementOptionId (from fbaInbound_listPlacementOptions). | ## Result - `data.inboundPlanId` — confirmed plan ID. - `data.placementOptionId` — confirmed option ID. - `data.confirmed` — true once Amazon's operation reached SUCCESS. ## Workflow - 1. The human picks one placementOptionId — from fbaInbound_listPlacementOptions, or the plan workbook's "2." chip (row 6; the id is the text before the first space). 2. Call this tool. # fbaInbound_confirmShipmentContentUpdatePreview (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmShipmentContentUpdatePreview) > Confirm a content update preview, accepting the cost change (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · confirmShipmentContentUpdatePreview · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/contentUpdatePreviews/{contentUpdatePreviewId}/confirmation Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_confirmShipmentContentUpdatePreview", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "content_update_preview_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirmShipmentContentUpdatePreview \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","content_update_preview_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `content_update_preview_id` | string | yes | the contentUpdatePreviewId (from fbaInbound_listShipmentContentUpdatePreviews); confirm before the preview's expiration. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. # fbaInbound_confirmTransportationOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmTransportationOptions) > Confirm the chosen transportation option per shipment (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Wraps confirmTransportationOptions. Amazon SP-API · confirmTransportationOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions/confirmation Gate: commit, choice, fee-bearing — interactive: restate the option and the amount, wait for a typed CONFIRM; autopilot: only within the seller's instruction, named rule (one option, no tie) and stated limits; otherwise ask. The placement option must already be confirmed. IRREVERSIBLE for the plan: once this succeeds, transportation options can no longer be generated or confirmed. The fbaInbound_confirm_plan_options compound does this step for you — use this atomic tool for the Split First flow. An option whose preconditions ask for a confirmed delivery window needs fbaInbound_confirmDeliveryWindowOptions for that shipment first. contactInformation is optional in the model but REQUIRED live for AMAZON_PARTNERED_CARRIER options — Amazon refuses with "ConfirmTransportationOptions does not support confirming PCP options without contact info". name + phoneNumber required when present. ## Call it MCP tool call: ```json { "name": "fbaInbound_confirmTransportationOptions", "arguments": { "store": "myStore-US", "plan_id": "", "transportation_selections": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_confirmTransportationOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","transportation_selections":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `transportation_selections` | object[] | yes | one entry per shipment, shaped as the Body block below — the transportationOptionId the human chose (from fbaInbound_listTransportationOptions) and, for Amazon-partnered options, contactInformation. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Body (Amazon schema): {transportationSelections: [TransportationSelection]} (min 1), each item - contactInformation: {email (max 1024 chars), name* (max 50 chars), phoneNumber* (max 20 chars)} shipmentId*: string (38–38 chars) transportationOptionId*: string (38–38 chars) # fbaInbound_create_packing_list (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_packing_list) > Packing list from Amazon's OWN box contents. Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Call AFTER fbaInbound_confirm_plan_options. Amazon SP-API · listShipmentBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/boxes For every confirmed shipment the server reads listShipmentBoxes — each box's canonical boxId (FBAxxxxxxxx, assigned only after confirmation), name, dimensions, weight and items[{msku, fnsku, asin, quantity, labelOwner}] — and returns one row per box × item. Mixed boxes and multi-shipment placements need nothing from the sheet. Never invent box IDs from STA data — always fetch from Amazon. Mode A (plan workbook): pass sta_spreadsheet_id and the server writes the sidebar's FINAL `Inbound PL` tab into it — 11 columns (Image, Box ID, Template, FNSKU, MSKU, ASIN, Quantity, Weight, Weight Unit, Dimensions, Unit of Measurement), navy header, frozen row, guide note, Image formula — and removes a stale STA-PL tab, exactly as the sidebar's Confirm does. You write nothing there. Mode B: omit it and present data.amazonBoxes in the user's preferred form with those same 11 columns (no shipment column). Box labels per shipment come from fbaInbound_get_labels; tracking numbers go to Manage Shipments. ## Call it MCP tool call: ```json { "name": "fbaInbound_create_packing_list", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_create_packing_list \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `sta_spreadsheet_id` | string | | the plan workbook (mode A) — '' in mode B. | | `confirmed_shipments` | object[] | | REQUIRED — data.confirmedShipments of fbaInbound_confirm_plan_options as is (only shipmentId is read); a list without a shipmentId is refused. | | `sta_item_rows` | object[] | | ignored since 2026-09-24 (it used to be cross-joined onto every box); kept so older callers keep working. | | `fba_spreadsheet_id` | string | | override the FBA spreadsheet whose Product Info feeds the Image column (defaults to the workspace setting). | ## Result - `data.amazonBoxes` — [{amazonBoxId, shipmentId, boxName, msku, fnsku, asin, qty, labelOwner, boxDimensions ("LxWxH"), dimUnit, boxWeight, weightUnit, itemsInBox}] — amazonBoxId is FBAxxxxxxxx; use it for fbaInbound_updateShipmentTrackingDetails. - `data.inboundPl` — {tab: 'Inbound PL', rows} — mode A only. ## Workflow - 1. fbaInbound_confirm_plan_options completed — confirmedShipments in _state / handover file ## Params (Amazon schema) - inboundPlanId*: string (max 38 chars) shipmentId*: string (max 38 chars) pageSize: integer (1–1000) paginationToken: string (max 1024 chars) # fbaInbound_createInboundPlan (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_createInboundPlan) > Create an FBA inbound plan on Amazon (single-step). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · createInboundPlan · POST /inbound/fba/2024-03-20/inboundPlans Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Use it to run the steps one by one — Split First, an India (IN) plan (fbaInbound_orchestrate_packing fails there because IN has no packing options), or a re-plan; for an ordinary Box First plan prefer fbaInbound_orchestrate_packing. Box First and Split First create the plan the same way; they differ only in the next call (Box First: fbaInbound_generatePackingOptions; Split First: fbaInbound_generatePlacementOptions). The store ref sets destinationMarketplaces. ## Call it MCP tool call: ```json { "name": "fbaInbound_createInboundPlan", "arguments": { "store": "myStore-US", "plan_name": "", "source_address": {}, "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_createInboundPlan \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_name":"","source_address":{},"items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_name` | string | yes | the plan's name, 1–40 characters. | | `source_address` | object | yes | AddressInput. Required: name, addressLine1, city, countryCode (2-char ISO 3166-1 alpha-2), postalCode, phoneNumber. Optional: addressLine2, companyName, districtOrCounty, email, stateOrProvinceCode. | | `items` | object[] | yes | list of item dicts, 1-2000 items. Each: msku (required, maxLength 255), quantity (required, 1-500000), labelOwner (required), prepOwner (required). Optional per item: expiration (YYYY-MM-DD), manufacturingLotCode. labelOwner (who applies FNSKU labels). Allowed: AMAZON \| SELLER \| NONE. prepOwner (who performs unit prep). Allowed: AMAZON \| SELLER \| NONE. prepOwner is region- and SKU-dependent live: AMAZON is refused in MENA (FBA_INB_0237 "Amazon does not provide prep service in the current region" — use SELLER), and a SKU that requires no prep refuses SELLER ("does not require prepOwner but SELLER was assigned" — use NONE). | ## Result - `data.inboundPlanId` — write this to STA sheet immediately (38-char id). - `data.operationId` — poll with fbaInbound_getInboundOperationStatus — creation is ASYNC (HTTP 202), so the plan is not usable until that operation reports SUCCESS. ## Body (Amazon schema) - destinationMarketplaces*: [string] (exactly 1) (max 20 chars) items*: [{expiration, labelOwner*: AMAZON | SELLER | NONE, manufacturingLotCode (max 256 chars), msku* (max 255 chars), prepOwner*: AMAZON | SELLER | NONE, quantity* (1–500000)}] (1–2000) name: string (max 40 chars) sourceAddress*: {addressLine1* (max 180 chars), addressLine2 (max 60 chars), city* (max 30 chars), companyName (max 50 chars), countryCode* (2–2 chars), districtOrCounty (max 50 chars), email (max 1024 chars), name* (max 50 chars), phoneNumber* (max 20 chars), postalCode* (max 32 chars), stateOrProvinceCode (max 64 chars)} # fbaInbound_createMarketplaceItemLabels (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_createMarketplaceItemLabels) > Create FNSKU item labels for a list of MSKUs (write). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · createMarketplaceItemLabels · POST /inbound/fba/2024-03-20/items/labels Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Returns download URIs for the label PDF. Unlike fbaInbound_get_labels (which prints box labels for a confirmed shipment), this prints per-unit FNSKU item labels for any MSKU. ## Call it MCP tool call: ```json { "name": "fbaInbound_createMarketplaceItemLabels", "arguments": { "store": "myStore-US", "label_type": "STANDARD_FORMAT", "msku_quantities": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_createMarketplaceItemLabels \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","label_type":"STANDARD_FORMAT","msku_quantities":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `label_type` | string | yes | the print format — label sheets or a thermal printer. Allowed: STANDARD_FORMAT \| THERMAL_PRINTING. Allowed: STANDARD_FORMAT \| THERMAL_PRINTING. | | `msku_quantities` | object[] | yes | list of {msku, quantity} (max 100; quantity 1-10000). | | `page_type` | string | | optional page layout — paper size, labels per page and, in some values, the label size in mm. Allowed: A4_21 \| A4_24 \| A4_24_64x33 \| A4_24_66x35 \| A4_24_70x36 \| A4_24_70x37 \| A4_24i \| A4_27 \| A4_40_52x29 \| A4_44_48x25 \| Letter_30. Allowed: A4_21 \| A4_24 \| A4_24_64x33 \| A4_24_66x35 \| A4_24_70x36 \| A4_24_70x37 \| A4_24i \| A4_27 \| A4_40_52x29 \| A4_44_48x25 \| Letter_30. | | `locale_code` | string | | optional locale, pattern xx_XX (e.g. 'en_US'). | | `height` | number · 25–100 | | optional label height (25-100). | | `width` | number · 25–100 | | optional label width (25-100). | ## Result - `data.documentDownloads` — list of {uri, downloadType, expiration}. ## Body (Amazon schema) - height: number (25–100) labelType*: STANDARD_FORMAT | THERMAL_PRINTING localeCode: string (default en_US) marketplaceId*: string (max 20 chars) mskuQuantities*: [{msku* (max 255 chars), quantity* (1–10000)}] (1–100) pageType: A4_21 | A4_24 | A4_24_64x33 | A4_24_66x35 | A4_24_70x36 | A4_24_70x37 | A4_24i | A4_27 | A4_40_52x29 | A4_44_48x25 | Letter_30 width: number (25–100) # fbaInbound_generate_shipment_options (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generate_shipment_options) > The transportation options + delivery windows for ONE placement option: the cheapest `limit` partnered options per shipping mode and, when named, one carrier type. Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Nothing is selected — the HUMAN picks ONE transportationOptionId per shipment (+ ONE deliveryWindowOptionId for own carrier); then fbaInbound_confirm_plan_options with those ids. 30–60 s. Amazon SP-API · listPlacementOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Amazon SP-API · generateTransportationOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Amazon SP-API · listTransportationOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} Amazon SP-API · listShipmentBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/boxes Amazon SP-API · generateDeliveryWindowOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions Amazon SP-API · listDeliveryWindowOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Mode A: pass sta_spreadsheet_id and the server fills the picked STA-Options block; mode B: omit it. The answer is a view of Amazon's list (duplicates collapsed, constant fields dropped); data.counts carries Amazon's totals. ## Call it MCP tool call: ```json { "name": "fbaInbound_generate_shipment_options", "arguments": { "store": "myStore-US", "plan_id": "", "placement_option_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generate_shipment_options \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","placement_option_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `placement_option_id` | string | yes | the placementOptionId (from fbaInbound_listPlacementOptions). | | `ship_date` | string | | REQUIRED, YYYY-MM-DD — the ready-to-ship date (sent as readyToShipWindow.start). Amazon marks windows that start before it AVAILABLE: offer only windows starting on or after it (and the delivery-window start date, when given). | | `pallet_info` | object | | freight config for FREIGHT_* modes, sent on every shipment: {freightInformation: {declaredValue: {amount: N, code: 'USD'}, freightClass: 'FC_50'}, pallets: [{dimensions: {length, width, height, unitOfMeasurement: 'IN'\|'CM'}, weight: {value, unit: 'LB'\|'KG'}, quantity: N, stackability: 'STACKABLE'\|'NON_STACKABLE'}]}. freightClass. Allowed: NONE \| FC_50 \| FC_55 \| FC_60 \| FC_65 \| FC_70 \| FC_77_5 \| FC_85 \| FC_92_5 \| FC_100 \| FC_110 \| FC_125 \| FC_150 \| FC_175 \| FC_200 \| FC_250 \| FC_300 \| FC_400 \| FC_500. | | `limit` | integer | | the cheapest partnered options per shipping mode per shipment (default 3; 0 = all); own-carrier options are never capped. For a carrier not shown, read fbaInbound_listTransportationOptions. | | `shipping_solution` | string | | ONE carrier type, or empty for both; partnered-only skips the delivery windows unless a quote requires one. Allowed: AMAZON_PARTNERED_CARRIER \| USE_YOUR_OWN_CARRIER. | | `shipping_mode` | string | | the Shipping Mode GROUP (the plan's row 9), or empty for every mode; no match → that shipment's full list, and the notification says so. Allowed: SPD \| LTL / FTL. | | `sta_spreadsheet_id` | string | | the plan workbook's spreadsheet id (mode A); omit for mode B. | ## Result - `data.placementFee / data.currency` — the picked placement's fee. - `data.shipments` — [{shipmentId, warehouseId, destination, status, totals, - `data.shipments.partnered` — [{transportationOptionId, shippingMode, carrierName, carrierCode, cost, currency, preconditions}] cheapest first; ownCarrier: [same, no cost]; deliveryWindows: [{deliveryWindowOptionId, startDate, endDate, availabilityType}] earliest first; deliveryWindowsValidUntil}]. - `data.counts` — {partnered, ownCarrier, deliveryWindows} — Amazon's totals. ## Params (Amazon schema; listPlacementOptions) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) ## Params (Amazon schema; generateTransportationOptions) - inboundPlanId*: string (max 38 chars) ## Params (Amazon schema; getInboundOperationStatus) - operationId*: string (max 38 chars) ## Params (Amazon schema; listTransportationOptions) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) placementOptionId: string (max 38 chars) shipmentId: string (max 38 chars) ## Params (Amazon schema; getShipment) - inboundPlanId*: string (max 38 chars) shipmentId*: string (max 38 chars) ## Params (Amazon schema; listShipmentBoxes) - inboundPlanId*: string (max 38 chars) … (11 more lines; the Docs link above) ## Body (Amazon schema; generateTransportationOptions) - placementOptionId*: string (38–38 chars) shipmentTransportationConfigurations*: [{contactInformation: {email, name*, phoneNumber*}, freightInformation: {declaredValue, freightClass}, pallets: [{dimensions, quantity*, stackability, weight}], readyToShipWindow*: {start*}, shipmentId* (38–38 chars)}] (min 1) shipmentTransportationConfigurations.pallets.dimensions.unitOfMeasurement: IN | CM shipmentTransportationConfigurations.pallets.stackability: STACKABLE | NON_STACKABLE shipmentTransportationConfigurations.pallets.weight.unit: LB | KG # fbaInbound_generateDeliveryWindowOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateDeliveryWindowOptions) > Start generating delivery window options for one shipment (USE_YOUR_OWN_CARRIER). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · generateDeliveryWindowOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Non-partnered carrier flow only. Amazon generates available delivery windows asynchronously — poll the returned operationId, then call fbaInbound_listDeliveryWindowOptions. Not supported in the IN marketplace ("GenerateDeliveryWindowOptions is not supported for the Indian marketplace") — on IN, confirm transportation directly without a delivery window. ## Call it MCP tool call: ```json { "name": "fbaInbound_generateDeliveryWindowOptions", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generateDeliveryWindowOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Workflow - 1. fbaInbound_generateTransportationOptions for the placement reached SUCCESS (an own-carrier option exists). 2. Call this tool per shipment, poll the operation, then fbaInbound_listDeliveryWindowOptions. 3. Confirm the window (fbaInbound_confirmDeliveryWindowOptions, after the placement is confirmed) BEFORE fbaInbound_confirmTransportationOptions. # fbaInbound_generatePackingOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePackingOptions) > Start generating packing options for a plan (async). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · generatePackingOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. After generate completes, call fbaInbound_listPackingOptions to see options. The fbaInbound_orchestrate_packing compound op does this automatically for Box First. Box First only — Split First skips packing options. Use it to run Box First step by step or to re-generate. Not supported in the IN marketplace — Amazon refuses with "GeneratePackingOptions is not supported for the Indian marketplace". For IN plans skip packing options: fbaInbound_generatePlacementOptions (with custom_placement) then fbaInbound_setPackingInformation. ## Call it MCP tool call: ```json { "name": "fbaInbound_generatePackingOptions", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generatePackingOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. # fbaInbound_generatePlacementOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePlacementOptions) > Start generating placement options for a plan (async). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · generatePlacementOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Where this sits depends on the workflow (Amazon's guides agree on both): Box First (pack first) — call AFTER fbaInbound_setPackingInformation completes; Split First (pack later) — call straight after fbaInbound_createInboundPlan, BEFORE fbaInbound_setPackingInformation. In both, the placement option is confirmed BEFORE transportation options are confirmed. Poll until SUCCESS, then call fbaInbound_get_plan_status to list the placement options. India: plans destined to the IN marketplace REQUIRE custom_placement — Amazon refuses the call without it ("CustomPlacement details are required for inbound plans with destinations in IN"). IN also has no packing-options step (generatePackingOptions is not supported there); generate placement first, then fbaInbound_setPackingInformation. ## Call it MCP tool call: ```json { "name": "fbaInbound_generatePlacementOptions", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generatePlacementOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `custom_placement` | object[] | | optional list of custom placements, REQUIRED for IN-destined plans. Each: {warehouseId (e.g. 'JPX1'), items: [{msku, quantity, labelOwner, prepOwner, expiration?, manufacturingLotCode?}]}. labelOwner/prepOwner Allowed: AMAZON \| SELLER \| NONE. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Body (Amazon schema): {customPlacement: [CustomPlacementInput]}, each item - items*: [{expiration, labelOwner*: AMAZON | SELLER | NONE, manufacturingLotCode (max 256 chars), msku* (max 255 chars), prepOwner*: AMAZON | SELLER | NONE, quantity* (1–500000)}] (1–2000) warehouseId*: string (max 1024 chars) # fbaInbound_generateSelfShipAppointmentSlots (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateSelfShipAppointmentSlots) > Generate self-ship appointment slots for a shipment (write, async). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · generateSelfShipAppointmentSlots · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/selfShipAppointmentSlots Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Self-ship (drop-off) flow. After SUCCESS, call fbaInbound_getSelfShipAppointmentSlots. Only available in MX, BR, EG, SA, AE and IN. Without the two dates Amazon picks the range. ## Call it MCP tool call: ```json { "name": "fbaInbound_generateSelfShipAppointmentSlots", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generateSelfShipAppointmentSlots \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `desired_start_date` | string · date-time | | ISO 8601 date-time (e.g. '2026-10-20T00:00:00Z'); optional — without it Amazon picks the range. | | `desired_end_date` | string · date-time | | ISO 8601 date-time (e.g. '2026-10-27T00:00:00Z'); optional — without it Amazon picks the range. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. # fbaInbound_generateShipmentContentUpdatePreviews (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateShipmentContentUpdatePreviews) > Generate content update previews for revised box content (write, async). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · generateShipmentContentUpdatePreviews · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/contentUpdatePreviews Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Use to change box contents after a shipment is created — Amazon returns previews with the resulting transportation cost change. Both lists describe the shipment AFTER the update, in full — they are not deltas, and Amazon requires both. Timing window (live rules): allowed after fbaInbound_confirmTransportationOptions and BEFORE tracking details are set — once updateShipmentTrackingDetails has run (or the void window ends), Amazon refuses with FBA_INB_0262 "Cannot add boxes because the void window has ended or the shipment is in a status that does not allow edits", even while status is WORKING. Quantity changes are capped at 5% or 6 units per SKU, whichever is greater; a SKU can be removed only if its original quantity is ≤6; the shipment cannot be emptied. ## Call it MCP tool call: ```json { "name": "fbaInbound_generateShipmentContentUpdatePreviews", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "boxes": [], "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generateShipmentContentUpdatePreviews \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","boxes":[],"items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `boxes` | object[] | yes | every box the shipment will contain after the update (1–5000), shaped as the Body block below; quantity = how many identical boxes. BOX_CONTENT_PROVIDED boxes carry their items; MANUAL_PROCESS and BARCODE_2D boxes carry none. packageId: REQUIRED to keep an existing box (from fbaInbound_listShipmentBoxes); a new box has none, and every existing box whose packageId you omit is removed. | | `items` | object[] | yes | every item the shipment will contain after the update (1–2000), shaped as the Body block below. | ## Result - `data.operationId` — poll until SUCCESS, then fbaInbound_listShipmentContentUpdatePreviews. ## Body (Amazon schema) - boxes*: [{contentInformationSource*, dimensions*: {height*, length*, unitOfMeasurement*, width*}, items: [{expiration, labelOwner*, manufacturingLotCode, msku*, prepOwner*, quantity*}], packageId (38–38 chars), quantity* (1–10000), weight*: {unit*, value*}}] (1–5000) boxes.contentInformationSource: BOX_CONTENT_PROVIDED | MANUAL_PROCESS | BARCODE_2D boxes.dimensions.unitOfMeasurement: IN | CM boxes.items.labelOwner: AMAZON | SELLER | NONE boxes.items.prepOwner: AMAZON | SELLER | NONE boxes.weight.unit: LB | KG items*: [{expiration, labelOwner*: AMAZON | SELLER | NONE, manufacturingLotCode (max 256 chars), msku* (max 255 chars), prepOwner*: AMAZON | SELLER | NONE, quantity* (1–500000)}] (1–2000) # fbaInbound_generateTransportationOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateTransportationOptions) > Start generating transportation options for a placement option (async). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Wraps generateTransportationOptions. After it completes (poll operationId), call fbaInbound_listTransportationOptions. Amazon SP-API · generateTransportationOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_generateTransportationOptions", "arguments": { "store": "myStore-US", "plan_id": "", "placement_option_id": "", "shipment_transportation_configurations": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_generateTransportationOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","placement_option_id":"","shipment_transportation_configurations":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `placement_option_id` | string | yes | the placementOptionId (from fbaInbound_listPlacementOptions). | | `shipment_transportation_configurations` | object[] | yes | one entry per shipment of the placement option (its shipmentIds), shaped as the Body block below. readyToShipWindow.start is a date-time with minutes, 'yyyy-MM-ddTHH:mmZ' (e.g. '2026-06-01T00:00Z'). contactInformation is optional. freightInformation and pallets are for freight modes only; freightClass is NONE or FC_50 … FC_500 (Amazon lists the values only in prose); declaredValue.code is ISO 4217. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Body (Amazon schema) - placementOptionId*: string (38–38 chars) shipmentTransportationConfigurations*: [{contactInformation: {email, name*, phoneNumber*}, freightInformation: {declaredValue, freightClass}, pallets: [{dimensions, quantity*, stackability, weight}], readyToShipWindow*: {start*}, shipmentId* (38–38 chars)}] (min 1) shipmentTransportationConfigurations.pallets.dimensions.unitOfMeasurement: IN | CM shipmentTransportationConfigurations.pallets.stackability: STACKABLE | NON_STACKABLE shipmentTransportationConfigurations.pallets.weight.unit: LB | KG # fbaInbound_get_labels (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_get_labels) > Download the box-label PDF of a confirmed shipment (v0 getLabels): the server fetches Amazon's downloadURL, cuts the pages to the label size and returns the PDF base64. Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInboundV0 For per-unit FNSKU item labels use fbaInbound_createMarketplaceItemLabels. Amazon SP-API · getLabels · GET /fba/inbound/v0/shipments/{shipmentId}/labels Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} ## Call it MCP tool call: ```json { "name": "fbaInbound_get_labels", "arguments": { "store": "myStore-US", "inbound_plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_get_labels \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","inbound_plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `inbound_plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). An FBA confirmation id (FBA1234ABCD) also works — Amazon keys labels on it; the server resolves it (data.shipmentConfirmationId). | | `page_type` | string | | the label sheet layout — not every layout suits every shipment (Gotchas). Default: PackageLabel_Letter_2. Allowed: PackageLabel_Letter_2 \| PackageLabel_Letter_4 \| PackageLabel_Letter_6 \| PackageLabel_Letter_6_CarrierLeft \| PackageLabel_A4_2 \| PackageLabel_A4_4 \| PackageLabel_Plain_Paper \| PackageLabel_Plain_Paper_CarrierBottom \| PackageLabel_Thermal \| PackageLabel_Thermal_Unified \| PackageLabel_Thermal_NonPCP \| PackageLabel_Thermal_No_Carrier_Rotation. Allowed: PackageLabel_Letter_2 \| PackageLabel_Letter_4 \| PackageLabel_Letter_6 \| PackageLabel_Letter_6_CarrierLeft \| PackageLabel_A4_2 \| PackageLabel_A4_4 \| PackageLabel_Plain_Paper \| PackageLabel_Plain_Paper_CarrierBottom \| PackageLabel_Thermal \| PackageLabel_Thermal_Unified \| PackageLabel_Thermal_NonPCP \| PackageLabel_Thermal_No_Carrier_Rotation. | | `label_type` | string | | the kind of label — BARCODE_2D box labels, UNIQUE for Transparency-enrolled items, PALLET for LTL/FTL (with number_of_pallets). Default: BARCODE_2D. Allowed: BARCODE_2D \| UNIQUE \| PALLET. | | `number_of_packages` | integer | | package labels to print — pass it with page_size on a Non-Partnered or LTL shipment. | | `package_labels_to_print` | object[] | | CartonIds, to reprint a subset. | | `number_of_pallets` | integer | | pallet labels; with label_type PALLET only. | | `page_size` | integer | | 1–1000; REQUIRED on Non-Partnered and LTL shipments (Amazon: "pageSize must be provided for Non-Partnered and LTL Shipments"). | | `page_start_index` | integer | | REQUIRED with page_size on Non-Partnered LTL shipments. | | `label_size` | string | | the plan workbook's "FBA Box Label Size" (row 9) — '100x150 mm', '100x100 mm' (bare WxH = mm; '4x6 in' works). Pages are CUT, never scaled: 100x150 keeps Amazon's page as is, 100x100 keeps the top square (where the label sits). Blank = Amazon's bytes untouched. | | `sta_spreadsheet_id` | string | | the plan workbook (mode A) — the server saves .pdf into the plan's Drive folder and turns three cells into links (STA-Options FBA ID, Manage Shipments fbaId and fbaLabel); you write nothing for them. Omit it in mode B and archive the PDF yourself (start_drive_upload) if the user wants it. | | `plan_folder_id` | string | | override the Drive folder (rare). | | `fba_spreadsheet_id` | string | | override the FBA spreadsheet for the Manage Shipments link (defaults to the workspace setting). | ## Result - `data.labelData` — the PDF, base64 — decode and print. - `data.labelSize / data.pageCount / data.pageType` — what was applied. - `data.downloadURL` — Amazon's presigned URL. - `data.driveUrl / data.driveFileId / data.fileName` — the saved PDF — only with sta_spreadsheet_id or plan_folder_id. - `data.planFolderId / data.links / data.skipped` — the folder, which cells became links ({staOptions, manageShipments}) and why a save was skipped. ## Gotchas - Not every page type works on every shipment — Amazon answers "Please check the parameter request or call GetValidPageTypesForShipment" when it disagrees (on a Non-Partnered shipment PackageLabel_Letter_2 is refused where PackageLabel_Plain_Paper succeeds): treat the enum as candidates and fall back to PackageLabel_Plain_Paper. # fbaInbound_get_plan_status (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_get_plan_status) > List every placement option of an inbound plan (all pages) — a quick existence and stage probe before a phase. Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 For the plan's own status and shipments use fbaInbound_getInboundPlan. Amazon SP-API · listPlacementOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Use this at the start of each phase to validate _state before taking irreversible actions. ## Call it MCP tool call: ```json { "name": "fbaInbound_get_plan_status", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_get_plan_status \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | ## Result - `data.planId` — the plan ID. - `data.placementOptions` — ALL placement options — this compound scans every page deliberately (it is an existence/state probe). For a paged read use fbaInbound_listPlacementOptions. ## Workflow - 1. Read _state tab: stage and planId 2. Call this tool with the stored planId 3. If placement options empty → plan may not exist or stage < PACKING_GENERATED 4. If API error → reconcile with human before proceeding ## Params (Amazon schema) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) # fbaInbound_getDeliveryChallanDocument (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getDeliveryChallanDocument) > Fetch the delivery challan document of an India (IN) shipment that uses Amazon-partnered (PCP) transport (read). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getDeliveryChallanDocument · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryChallanDocument ## Call it MCP tool call: ```json { "name": "fbaInbound_getDeliveryChallanDocument", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getDeliveryChallanDocument \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | ## Result - `data.document.documentDownload.uri` — the challan PDF's download URL. # fbaInbound_getInboundOperationStatus (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getInboundOperationStatus) > Poll getInboundOperationStatus for a previously started async operation. Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Every fbaInbound_* tool that answers data.operationId — fbaInbound_createInboundPlan, the generate*/confirm*/set* tools, fbaInbound_updateShipmentSourceAddress, fbaInbound_updateItemComplianceDetails, fbaInbound_cancelSelfShipAppointment — is finished only when this reports SUCCESS. operationStatus enum (exactly): 'IN_PROGRESS', 'SUCCESS', 'FAILED'. Poll every 5-10 seconds until status is not IN_PROGRESS. ## Call it MCP tool call: ```json { "name": "fbaInbound_getInboundOperationStatus", "arguments": { "store": "myStore-US", "operation_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getInboundOperationStatus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","operation_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `operation_id` | string | yes | operationId returned by a generate_*/confirm_* call (UUID, length 36-38). | ## Result - `data.status` — current operationStatus string. - `data.operationProblems` — [{code, message, severity (WARNING or ERROR), details}] — on FAILED it names the cause; the call itself still answers HTTP 200. # fbaInbound_getInboundPlan (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getInboundPlan) > Fetch the raw inbound plan object from Amazon (read-only). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getInboundPlan · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId} Use at the start of any phase to inspect plan state: status, packing and placement options, shipments. This is a fast single-call read, not a compound op. ## Call it MCP tool call: ```json { "name": "fbaInbound_getInboundPlan", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getInboundPlan \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | ## Result - `data.plan` — {inboundPlanId, name, status (ACTIVE, VOIDED, SHIPPED or ERRORED), sourceAddress, packingOptions [{packingOptionId, status}], placementOptions [{placementOptionId, status}], shipments [{shipmentId, status}]} — shipments fill in only after a placement option is confirmed. # fbaInbound_getSelfShipAppointmentSlots (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getSelfShipAppointmentSlots) > List available self-ship appointment slots (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getSelfShipAppointmentSlots · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/selfShipAppointmentSlots Call after fbaInbound_generateSelfShipAppointmentSlots completes (poll the operation). Then pick a slotId and call fbaInbound_scheduleSelfShipAppointment. Only available in MX, BR, EG, SA, AE and IN. ## Call it MCP tool call: ```json { "name": "fbaInbound_getSelfShipAppointmentSlots", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getSelfShipAppointmentSlots \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–100 | | slots per page, 1-100. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.selfShipAppointmentSlots` — list of slot objects (slotId, slotTime{startTime, endTime}). - `data.expiresAt` — when the generated slot set stops being bookable. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_getShipment (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getShipment) > Fetch a single shipment object from Amazon (read). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} Returns the full shipment: status, source/destination addresses, shipmentConfirmationId, amazonReferenceId, placementOptionId. ## Call it MCP tool call: ```json { "name": "fbaInbound_getShipment", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getShipment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | ## Result - `data.shipment` — the full shipment object. # fbaInbound_getShipmentContentUpdatePreview (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getShipmentContentUpdatePreview) > Fetch a single content update preview (read). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · getShipmentContentUpdatePreview · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/contentUpdatePreviews/{contentUpdatePreviewId} ## Call it MCP tool call: ```json { "name": "fbaInbound_getShipmentContentUpdatePreview", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "content_update_preview_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_getShipmentContentUpdatePreview \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","content_update_preview_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `content_update_preview_id` | string | yes | the contentUpdatePreviewId (from fbaInbound_listShipmentContentUpdatePreviews). | ## Result - `data.preview` — {contentUpdatePreviewId, expiration, requestedUpdates {boxes, items}, transportationOption (quote.cost is the NEW cost)}. # fbaInbound_listDeliveryWindowOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listDeliveryWindowOptions) > List delivery window options for a shipment (after generate completed). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listDeliveryWindowOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/deliveryWindowOptions Call after fbaInbound_getInboundOperationStatus returns SUCCESS for fbaInbound_generateDeliveryWindowOptions' operation. Returns ONE Amazon page — follow data.nextToken for more. ## Call it MCP tool call: ```json { "name": "fbaInbound_listDeliveryWindowOptions", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listDeliveryWindowOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–100 | | options per page, 1-100. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.deliveryWindowOptions` — [{deliveryWindowOptionId, startDate, endDate, validUntil, availabilityType (AVAILABLE, BLOCKED, CONGESTED or DISCOUNTED)}] — confirm one before validUntil. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listInboundPlanBoxes (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanBoxes) > List all boxes in an inbound plan (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listInboundPlanBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/boxes ## Call it MCP tool call: ```json { "name": "fbaInbound_listInboundPlanBoxes", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listInboundPlanBoxes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `page_size` | integer · 1–1000 | | boxes per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.boxes` — list of box objects (boxId, dimensions, weight, items). - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listInboundPlanItems (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanItems) > List the items (msku/fnsku/quantity/prep) in an inbound plan (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listInboundPlanItems · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/items ## Call it MCP tool call: ```json { "name": "fbaInbound_listInboundPlanItems", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listInboundPlanItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `page_size` | integer · 1–1000 | | items per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.items` — list of plan item objects. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listInboundPlanPallets (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlanPallets) > List all pallets in an inbound plan (read, one page; LTL/FTL freight). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listInboundPlanPallets · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/pallets ## Call it MCP tool call: ```json { "name": "fbaInbound_listInboundPlanPallets", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listInboundPlanPallets \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `page_size` | integer · 1–1000 | | pallets per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.pallets` — list of pallet objects (packageId, dimensions, weight). - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listInboundPlans (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listInboundPlans) > List inbound plans for a store (one page per call). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listInboundPlans · GET /inbound/fba/2024-03-20/inboundPlans Use to find existing plans before creating a new one or to audit plan state. For a single plan's full object use fbaInbound_getInboundPlan. Amazon's list can currently miss ACTIVE plans (seen with a ship-from address outside the marketplace country). A plan you created that is not listed is not gone: read it with fbaInbound_getInboundPlan by the id recorded at creation (the Manage Shipments row, the plan workbook). Follow nextToken until it is '' — a page can hold fewer than page_size plans while more remain. ## Call it MCP tool call: ```json { "name": "fbaInbound_listInboundPlans", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listInboundPlans \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `status` | string | | optional plan status filter. Allowed: ACTIVE \| VOIDED \| SHIPPED. Allowed: ACTIVE \| VOIDED \| SHIPPED. | | `sort_by` | string | | optional sort field. Allowed: LAST_UPDATED_TIME \| CREATION_TIME. Allowed: LAST_UPDATED_TIME \| CREATION_TIME. | | `sort_order` | string | | ASC or DESC. Allowed: ASC \| DESC. | | `page_size` | integer · 1–30 | | plans per page, 1-30. Optional (Amazon default 10). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.inboundPlans` — list of plan summaries (inboundPlanId, name, status). - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listItemComplianceDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listItemComplianceDetails) > List inbound compliance (tax) details for MSKUs (read). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listItemComplianceDetails · GET /inbound/fba/2024-03-20/items/compliance Mainly relevant for the India (IN) marketplace — the store ref names it. Missing tax details are set with fbaInbound_updateItemComplianceDetails. ## Call it MCP tool call: ```json { "name": "fbaInbound_listItemComplianceDetails", "arguments": { "store": "myStore-US", "mskus": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listItemComplianceDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","mskus":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `mskus` | string[] | yes | list of merchant SKUs (max 100). | ## Result - `data.complianceDetails` — list of compliance detail objects. # fbaInbound_listPackingGroupBoxes (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingGroupBoxes) > List boxes in a packing group (read, one page; provided via setPackingInformation). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listPackingGroupBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingGroups/{packingGroupId}/boxes ## Call it MCP tool call: ```json { "name": "fbaInbound_listPackingGroupBoxes", "arguments": { "store": "myStore-US", "plan_id": "", "packing_group_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listPackingGroupBoxes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","packing_group_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `packing_group_id` | string | yes | the packingGroupId (from fbaInbound_listPackingOptions' packingGroups). | | `page_size` | integer · 1–100 | | boxes per page, 1-100. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.boxes` — list of box objects in the packing group. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listPackingGroupItems (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingGroupItems) > List items in a packing group (read, one page; Box First). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listPackingGroupItems · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingGroups/{packingGroupId}/items ## Call it MCP tool call: ```json { "name": "fbaInbound_listPackingGroupItems", "arguments": { "store": "myStore-US", "plan_id": "", "packing_group_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listPackingGroupItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","packing_group_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `packing_group_id` | string | yes | packingGroupId from fbaInbound_listPackingOptions. | | `page_size` | integer · 1–100 | | items per page, 1-100. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.items` — list of item objects in the packing group. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listPackingOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingOptions) > List packing options after generatePackingOptions completed. Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listPackingOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions Returns ONE Amazon page — follow data.nextToken for more. Use to let a human select a packingOptionId, then call fbaInbound_confirmPackingOption. ## Call it MCP tool call: ```json { "name": "fbaInbound_listPackingOptions", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listPackingOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `page_size` | integer · 1–20 | | options per page, 1-20. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.packingOptions` — list of packing option objects each with packingOptionId and packingGroups list. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listPlacementOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPlacementOptions) > List placement options for a plan (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listPlacementOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Lighter-weight alternative to fbaInbound_get_plan_status when you only need the placement options list. Confirm one via fbaInbound_confirm_plan_options. ## Call it MCP tool call: ```json { "name": "fbaInbound_listPlacementOptions", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listPlacementOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `page_size` | integer · 1–20 | | options per page, 1-20. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.placementOptions` — list of placement option objects with fees. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listPrepDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPrepDetails) > Get preparation details + owner constraints for MSKUs (read). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listPrepDetails · GET /inbound/fba/2024-03-20/items/prepDetails Use before fbaInbound_setPrepDetails to see the current prep category, prep types, and the owner constraints: labelOwnerConstraint / prepOwnerConstraint (AMAZON_ONLY, NONE_ONLY or SELLER_ONLY) and allOwnersConstraint (MUST_MATCH). ## Call it MCP tool call: ```json { "name": "fbaInbound_listPrepDetails", "arguments": { "store": "myStore-US", "mskus": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listPrepDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","mskus":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `mskus` | string[] | yes | list of merchant SKUs (max 100). | ## Result - `data.mskuPrepDetails` — list of prep detail objects. # fbaInbound_listShipmentBoxes (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentBoxes) > List boxes in a shipment (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listShipmentBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/boxes boxId (FBAxxxxxxxx) is the box key for SPD tracking upload via fbaInbound_updateShipmentTrackingDetails; it appears only after the shipment's transportation is confirmed (before that a box has only packageId). Prefer this over fbaInbound_create_packing_list when you only need the box IDs. ## Call it MCP tool call: ```json { "name": "fbaInbound_listShipmentBoxes", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listShipmentBoxes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–1000 | | boxes per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.boxes` — list of box objects (boxId, dimensions, items). - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listShipmentContentUpdatePreviews (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentContentUpdatePreviews) > List content update previews in a shipment (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listShipmentContentUpdatePreviews · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/contentUpdatePreviews After fbaInbound_generateShipmentContentUpdatePreviews completes, list the previews, pick one, and confirm via fbaInbound_confirmShipmentContentUpdatePreview. ## Call it MCP tool call: ```json { "name": "fbaInbound_listShipmentContentUpdatePreviews", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listShipmentContentUpdatePreviews \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–20 | | previews per page, 1-20. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.contentUpdatePreviews` — [{contentUpdatePreviewId, expiration, requestedUpdates {boxes, items}, transportationOption (quote.cost is the NEW cost)}] — confirm before expiration. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listShipmentItems (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentItems) > List item packages in a shipment (read, one page). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listShipmentItems · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/items ## Call it MCP tool call: ```json { "name": "fbaInbound_listShipmentItems", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listShipmentItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–1000 | | items per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.items` — list of shipment item objects (msku/fnsku/quantity). - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listShipmentPallets (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentPallets) > List pallets in a shipment (read, one page; LTL/FTL freight). Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listShipmentPallets · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/pallets ## Call it MCP tool call: ```json { "name": "fbaInbound_listShipmentPallets", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listShipmentPallets \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–1000 | | pallets per page, 1-1000. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.pallets` — list of pallet objects. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_listTransportationOptions (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listTransportationOptions) > List transportation options after generateTransportationOptions completed. Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · listTransportationOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/transportationOptions Returns ONE Amazon page — follow data.nextToken for more. Pass placement_option_id or shipment_id — Amazon requires at least one. ## Call it MCP tool call: ```json { "name": "fbaInbound_listTransportationOptions", "arguments": { "store": "myStore-US", "plan_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_listTransportationOptions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `placement_option_id` | string | | the placementOptionId (from fbaInbound_listPlacementOptions). | | `shipment_id` | string | | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `page_size` | integer · 1–20 | | options per page, 1-20. Optional (Amazon default). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.transportationOptions` — [{transportationOptionId, shipmentId, shippingSolution (Amazon-partnered or your own carrier), shippingMode, carrier {name, alphaCode}, quote.cost (absent on own-carrier options), preconditions (a confirmed delivery window precondition means: confirm a delivery window first)}]. - `data.nextToken` — cursor for the next page; '' when this is the last. # fbaInbound_orchestrate_packing (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_orchestrate_packing) > Create an FBA inbound plan through to PLACEMENT OPTIONS and stop: setPrepDetails → createInboundPlan → generate and confirm the packing option → setPackingInformation → generatePla Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 cementOptions, each operation polled. Allow ~60 s. The human then picks a placement option for fbaInbound_generate_shipment_options. The marketplace comes from the store ref. Requires SP write access. Amazon SP-API · setPrepDetails · POST /inbound/fba/2024-03-20/items/prepDetails Amazon SP-API · createInboundPlan · POST /inbound/fba/2024-03-20/inboundPlans Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Amazon SP-API · generatePackingOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions Amazon SP-API · listPackingOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions Amazon SP-API · confirmPackingOption · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingOptions/{packingOptionId}/confirmation Amazon SP-API · setPackingInformation · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingInformation Amazon SP-API · generatePlacementOptions · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Amazon SP-API · listPlacementOptions · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/placementOptions Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} Amazon SP-API · listShipmentBoxes · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/boxes Gate: approve, choice — interactive: show the change and the option (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change, within named rule (one option, no tie); otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_orchestrate_packing", "arguments": { "store": "myStore-US", "plan_name": "", "source_address": {}, "items": [], "boxes": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_orchestrate_packing \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_name":"","source_address":{},"items":[],"boxes":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_name` | string | yes | createInboundPlan name, ≤40 chars. | | `source_address` | object | yes | {name, addressLine1, city, countryCode (ISO 3166-1 alpha-2), postalCode, phoneNumber} required; addressLine2, companyName, districtOrCounty, email, stateOrProvinceCode optional. | | `items` | object[] | yes | 1–2000 plan-level totals (not per box): [{msku (≤255), quantity (1–500000), labelOwner, prepOwner, expiration (YYYY-MM-DD, optional), manufacturingLotCode (optional, ≤256)}]. labelOwner and prepOwner: AMAZON \| SELLER \| NONE. | | `boxes` | object[] | yes | 1–5000 box specs: [{contentInformationSource, dimensions: {length, width, height, unitOfMeasurement IN \| CM}, weight: {value, unit LB \| KG}, quantity (1–10000 boxes of this spec), items: [{msku, quantity, labelOwner, prepOwner}]}]. contentInformationSource: BOX_CONTENT_PROVIDED (items required) \| MANUAL_PROCESS \| BARCODE_2D (both without items). | | `msku_prep_details` | object[] | | 1–100 of [{msku, prepCategory, prepTypes}], all three required — the prep the plan's MSKUs need (values in the setPrepDetails body below). | | `selected_packing_option_id` | string | | second call only — the human's packingOptionId from data.packingOptions, sent with plan_id and the same items and boxes; the plan is continued, never re-created. | | `plan_id` | string | | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). Second call: the first call's data.planId with selected_packing_option_id. Alone, it continues THAT plan from generatePackingOptions — a plan_id never creates a second plan. | | `sta_spreadsheet_id` | string | | the plan workbook's spreadsheet id (from fbaInbound_create_sta_sheet) — the server then renders the STA-Options tab (fee summary, one block per placement with every shipment's warehouse, status, Total QTY, Boxes, Weight and Volume); omit it and nothing touches a sheet. | ## Result - `data.planId` — the inbound plan. - `data.packingOptionId / data.packingGroupId` — the confirmed packing. - `data.requiresHumanSelection` — true when several packing options need a human choice — data.packingOptions lists them and nothing further was done. - `data.placementOptions` — [{placementOptionId, status, expiration, shipmentCount, shipmentIds, placementFee, currency, aiRank, aiRec, shipments: [{shipmentId, warehouseId}]}] ranked by fee. - `data.totalQty / data.totalBoxes` — the plan's totals. ## Params (Amazon schema; getInboundOperationStatus) - operationId*: string (max 38 chars) ## Params (Amazon schema; generatePackingOptions) - inboundPlanId*: string (max 38 chars) ## Params (Amazon schema; listPackingOptions) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) ## Params (Amazon schema; confirmPackingOption) - inboundPlanId*: string (max 38 chars) packingOptionId*: string (max 38 chars) ## Params (Amazon schema; setPackingInformation) - inboundPlanId*: string (max 38 chars) ## Params (Amazon schema; generatePlacementOptions) - inboundPlanId*: string (max 38 chars) ## Params (Amazon schema; listPlacementOptions) - inboundPlanId*: string (max 38 chars) pageSize: integer (1–20) paginationToken: string (max 1024 chars) … (8 more lines; the Docs link above) ## Body (Amazon schema; setPrepDetails) - marketplaceId*: string (max 20 chars) mskuPrepDetails*: [{msku* (max 255 chars), prepCategory*, prepTypes*}] (1–100) mskuPrepDetails.prepCategory: ADULT | BABY | FC_PROVIDED | FRAGILE | GRANULAR | HANGER | LIQUID | PERFORATED | SET | SHARP | SMALL | TEXTILE | UNKNOWN | NONE mskuPrepDetails.prepTypes: [ITEM_BLACK_SHRINKWRAP | ITEM_BLANKSTK | ITEM_BOXING | ITEM_BUBBLEWRAP | ITEM_CAP_SEALING | ITEM_DEBUNDLE | ITEM_HANG_GARMENT | ITEM_LABELING | ITEM_NO_PREP | ITEM_POLYBAGGING | ITEM_RMOVHANG | ITEM_SETCREAT | ITEM_SETSTK | ITEM_SIOC | ITEM_SUFFOSTK | ITEM_TAPING] Full schema: the Docs link above. ## Body (Amazon schema; createInboundPlan) - destinationMarketplaces*: [string] (exactly 1) (max 20 chars) items*: [{expiration, labelOwner*: AMAZON | SELLER | NONE, manufacturingLotCode (max 256 chars), msku* (max 255 chars), prepOwner*: AMAZON | SELLER | NONE, quantity* (1–500000)}] (1–2000) sourceAddress*: {addressLine1* (max 180 chars), addressLine2 (max 60 chars), city* (max 30 chars), companyName (max 50 chars), countryCode* (2–2 chars), districtOrCounty (max 50 chars), email (max 1024 chars), name* (max 50 chars), phoneNumber* (max 20 chars), postalCode* (max 32 chars), stateOrProvinceCode (max 64 chars)} + 1 more: name Full schema: the Docs link above. ## Body (Amazon schema; setPackingInformation): {packageGroupings: [PackageGroupingInput]} (min 1), each item - boxes*: [{contentInformationSource*, dimensions*: {height*, length*, unitOfMeasurement*, width*}, items: [{expiration, labelOwner*, manufacturingLotCode, msku*, prepOwner*, quantity*}], quantity* (1–10000), weight*: {unit*, value*}}] (1–5000) … (8 more lines; Full schema: the Docs link above.) ## Workflow - With a plan workbook, read the item rows (row 14 on) by the row-1 machine keys — boxNo ("1", or "2~4" for boxes 2 to 4; several rows with one boxNo share a box), msku, qtyPerBox, boxDimensions ("LxWxH"), boxWeight, labelOwner, prepOwner, prepCategory, prepTypes — never by column letter, and build items (totals) and boxes from them. Afterwards show the placement options (placementFee, shipmentCount, warehouses; aiRank 1 = lowest fee) and let the HUMAN pick; the stepper, Manage Shipments and _state cells to write are in the fba-inbound skill. ## Gotchas - A packing option with several packing groups is refused (the compound packs one group) — run fbaInbound_setPackingInformation per packingGroupId instead. # fbaInbound_scheduleSelfShipAppointment (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_scheduleSelfShipAppointment) > Book, or reschedule, a self-ship appointment on a chosen slot (write, synchronous). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · scheduleSelfShipAppointment · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/selfShipAppointmentSlots/{slotId}/schedule Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Only available in MX, BR, EG, SA, AE and IN; to reschedule call it again with the new slot_id and a reason_comment. ## Call it MCP tool call: ```json { "name": "fbaInbound_scheduleSelfShipAppointment", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "slot_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_scheduleSelfShipAppointment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","slot_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `slot_id` | string | yes | slotId from fbaInbound_getSelfShipAppointmentSlots. | | `reason_comment` | string | | why the appointment is rescheduled; pass it when rescheduling. Allowed: APPOINTMENT_REQUESTED_BY_MISTAKE \| VEHICLE_DELAY \| SLOT_NOT_SUITABLE \| OUTSIDE_CARRIER_BUSINESS_HOURS \| UNFAVOURABLE_EXTERNAL_CONDITIONS \| PROCUREMENT_DELAY \| SHIPPING_PLAN_CHANGED \| INCREASED_QUANTITY \| OTHER. Allowed: APPOINTMENT_REQUESTED_BY_MISTAKE \| VEHICLE_DELAY \| SLOT_NOT_SUITABLE \| OUTSIDE_CARRIER_BUSINESS_HOURS \| UNFAVOURABLE_EXTERNAL_CONDITIONS \| PROCUREMENT_DELAY \| SHIPPING_PLAN_CHANGED \| INCREASED_QUANTITY \| OTHER. | ## Result - `data.selfShipAppointmentDetails` — the scheduled appointment. # fbaInbound_setPackingInformation (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPackingInformation) > Set box packing information per shipment/group (Amazon write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Wraps setPackingInformation; poll the returned operationId to SUCCESS. Amazon SP-API · setPackingInformation · POST /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/packingInformation Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Each grouping keys EITHER by packingGroupId (Box First) OR shipmentId (Split First). After this completes, call fbaInbound_generatePlacementOptions. ## Call it MCP tool call: ```json { "name": "fbaInbound_setPackingInformation", "arguments": { "store": "myStore-US", "plan_id": "", "package_groupings": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_setPackingInformation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","package_groupings":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `package_groupings` | object[] | yes | 1+ groupings, shaped as the Body block below — each keyed by packingGroupId (Box First, from the confirmed packing option) OR shipmentId (Split First), with boxes: 1–5000 box specs, quantity = how many identical boxes. contentInformationSource BOX_CONTENT_PROVIDED carries the box's items; MANUAL_PROCESS and BARCODE_2D boxes carry none. | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. - `data.status` — 'IN_PROGRESS'. ## Body (Amazon schema): {packageGroupings: [PackageGroupingInput]} (min 1), each item - boxes*: [{contentInformationSource*, dimensions*: {height*, length*, unitOfMeasurement*, width*}, items: [{expiration, labelOwner*, manufacturingLotCode, msku*, prepOwner*, quantity*}], quantity* (1–10000), weight*: {unit*, value*}}] (1–5000) boxes.contentInformationSource: BOX_CONTENT_PROVIDED | MANUAL_PROCESS | BARCODE_2D boxes.dimensions.unitOfMeasurement: IN | CM boxes.items.labelOwner: AMAZON | SELLER | NONE boxes.items.prepOwner: AMAZON | SELLER | NONE boxes.weight.unit: LB | KG packingGroupId: string (38–38 chars) shipmentId: string (38–38 chars) # fbaInbound_setPrepDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPrepDetails) > Set preparation details (category + types) for MSKUs (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · setPrepDetails · POST /inbound/fba/2024-03-20/items/prepDetails Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_setPrepDetails", "arguments": { "store": "myStore-US", "msku_prep_details": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_setPrepDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","msku_prep_details":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `msku_prep_details` | object[] | yes | 1–100 entries of {msku, prepCategory, prepTypes: [...]}, all three required — the prep each MSKU needs (values in the Body block below; ITEM_SIOC = ships in its own container). | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. ## Body (Amazon schema) - marketplaceId*: string (max 20 chars) mskuPrepDetails*: [{msku* (max 255 chars), prepCategory*, prepTypes*}] (1–100) mskuPrepDetails.prepCategory: ADULT | BABY | FC_PROVIDED | FRAGILE | GRANULAR | HANGER | LIQUID | PERFORATED | SET | SHARP | SMALL | TEXTILE | UNKNOWN | NONE mskuPrepDetails.prepTypes: [ITEM_BLACK_SHRINKWRAP | ITEM_BLANKSTK | ITEM_BOXING | ITEM_BUBBLEWRAP | ITEM_CAP_SEALING | ITEM_DEBUNDLE | ITEM_HANG_GARMENT | ITEM_LABELING | ITEM_NO_PREP | ITEM_POLYBAGGING | ITEM_RMOVHANG | ITEM_SETCREAT | ITEM_SETSTK | ITEM_SIOC | ITEM_SUFFOSTK | ITEM_TAPING] # fbaInbound_sync_shipment_status (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_sync_shipment_status) > One shipment's current Amazon status plus a terminal flag — a cheap poll; for the full shipment object use fbaInbound_getShipment. Access: **READ** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Poll a shipment until data.terminal is true. Amazon SP-API · getShipment · GET /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId} ## Call it MCP tool call: ```json { "name": "fbaInbound_sync_shipment_status", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_sync_shipment_status \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | ## Result - `data.status` — current shipment status string. - `data.terminal` — true for CLOSED, CANCELLED, ABANDONED and DELETED; SHIPPED and the later in-transit, delivered, checked-in and receiving states are not terminal — poll those again later (hours, not seconds). # fbaInbound_updateInboundPlanName (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateInboundPlanName) > Rename an inbound plan (write, synchronous). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · updateInboundPlanName · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/name Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_updateInboundPlanName", "arguments": { "store": "myStore-US", "plan_id": "", "name": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_updateInboundPlanName \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","name":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `name` | string | yes | new plan name (maxLength 40). | ## Result - `data.updated` — true — Amazon applied the name synchronously; nothing to poll. # fbaInbound_updateItemComplianceDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateItemComplianceDetails) > Update India (IN) compliance tax details for MSKUs (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · updateItemComplianceDetails · PUT /inbound/fba/2024-03-20/items/compliance Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. One operation per MSKU is created; data.operations lists each. ## Call it MCP tool call: ```json { "name": "fbaInbound_updateItemComplianceDetails", "arguments": { "store": "myStore-US", "compliance_details": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_updateItemComplianceDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","compliance_details":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `compliance_details` | object[] | yes | list of {msku, taxDetails} dicts. taxDetails: {declaredValue: {amount, code (ISO 4217, 3-char)}, hsnCode, taxRates: [{cessRate, gstRate, taxType}]}. taxType. Allowed: CGST \| SGST \| IGST \| TOTAL_TAX. | ## Result - `data.operationId` — first operation id (poll each in data.operations). ## Body (Amazon schema) - msku*: string (max 255 chars) taxDetails*: {declaredValue: {amount*, code*}, hsnCode (max 1024 chars), taxRates: [{cessRate, gstRate, taxType}]} # fbaInbound_updateShipmentName (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentName) > Rename a shipment (write, synchronous). Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · updateShipmentName · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/name Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaInbound_updateShipmentName", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "name": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_updateShipmentName \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","name":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `name` | string | yes | new shipment name (maxLength 100). | ## Result - `data.updated` — true — Amazon applied the name synchronously; nothing to poll. # fbaInbound_updateShipmentSourceAddress (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentSourceAddress) > Update a shipment's source address (write, async). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · updateShipmentSourceAddress · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/sourceAddress Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Only allowed before carriers are confirmed. Existing transportation options are invalidated — regenerate them after SUCCESS. ## Call it MCP tool call: ```json { "name": "fbaInbound_updateShipmentSourceAddress", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "", "address": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_updateShipmentSourceAddress \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":"","address":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `address` | object | yes | AddressInput dict (name, addressLine1, city, countryCode, postalCode, phoneNumber required). | ## Result - `data.operationId` — poll with fbaInbound_getInboundOperationStatus until SUCCESS. ## Body (Amazon schema) - address*: {addressLine1* (max 180 chars), addressLine2 (max 60 chars), city* (max 30 chars), companyName (max 50 chars), countryCode* (2–2 chars), districtOrCounty (max 50 chars), email (max 1024 chars), name* (max 50 chars), phoneNumber* (max 20 chars), postalCode* (max 32 chars), stateOrProvinceCode (max 64 chars)} # fbaInbound_updateShipmentTrackingDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentTrackingDetails) > Upload carrier tracking for one shipment to Amazon. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentInbound_2024-03-20 Amazon SP-API · updateShipmentTrackingDetails · PUT /inbound/fba/2024-03-20/inboundPlans/{inboundPlanId}/shipments/{shipmentId}/trackingDetails Amazon SP-API · getInboundOperationStatus · GET /inbound/fba/2024-03-20/operations/{operationId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Async — the server polls the returned operationId to completion. This is the non-Amazon-partnered (USE_YOUR_OWN_CARRIER) flow. TrackingDetailsInput is a union of exactly two shapes — supply ONE. Small Parcel tracking is per BOX, so ONE call carries every box of the shipment; there is no carrier field on this operation at all. ## Call it MCP tool call: ```json { "name": "fbaInbound_updateShipmentTrackingDetails", "arguments": { "store": "myStore-US", "plan_id": "", "shipment_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_updateShipmentTrackingDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_id":"","shipment_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_id` | string | yes | the inboundPlanId (from fbaInbound_createInboundPlan or fbaInbound_listInboundPlans). | | `shipment_id` | string | yes | the shipmentId (from the placement option's shipmentIds in fbaInbound_listPlacementOptions, or fbaInbound_getInboundPlan once a placement is confirmed). | | `spd_tracking_items` | object[] | | Small Parcel (SPD) tracking, one entry per box: [{boxId, trackingId}]. boxId is the FBAxxxxxxxx ID from fbaInbound_listShipmentBoxes / fbaInbound_create_packing_list (maxLength 1024); trackingId is the carrier's number (maxLength 64). Pass exactly one of spd_tracking_items / ltl_tracking_detail — both or neither is refused. boxIds exist only after the shipment's transportation is confirmed. | | `ltl_tracking_detail` | object | | LTL/FTL freight tracking, shipment-level: {freightBillNumber: [str] (required, exactly 1), billOfLadingNumber: str (optional, ≤1024)}. | ## Result - `data.uploaded` — True once the operation reached SUCCESS. - `data.operation` — the final getInboundOperationStatus payload. ## Workflow - 1. fbaInbound_listShipmentBoxes — the boxId (FBAxxxxxxxx) of every box. 2. Call this tool once per shipment with all its boxes. ## Body (Amazon schema; updateShipmentTrackingDetails) - trackingDetails*: {ltlTrackingDetail: {billOfLadingNumber, freightBillNumber*}, spdTrackingDetail: {spdTrackingItems*}} # fbaInboundEligibility_getItemEligibilityPreview (https://sellersheetai.com/docs/mcp-api/tools/fbaInboundEligibility_getItemEligibilityPreview) > Check whether an ASIN is eligible for FBA inbound (or commingling) (read). Access: **READ** · toolset amazon_sp · family sp.fbaInbound Amazon SP-API · getItemEligibilityPreview · GET /fba/inbound/v1/eligibility/itemPreview Call before creating an inbound plan to avoid rejected items. If not eligible, data.eligibility.ineligibilityReasonList explains why. ## Call it MCP tool call: ```json { "name": "fbaInboundEligibility_getItemEligibilityPreview", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInboundEligibility_getItemEligibilityPreview \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `program` | string | | the eligibility program — INBOUND is FBA inbound, COMMINGLING is stickerless (commingled) inventory. Default: INBOUND. Used only with program INBOUND (COMMINGLING takes no marketplace). Allowed: INBOUND \| COMMINGLING. | ## Result - `data.eligibility` — {asin, program, isEligibleForProgram, ineligibilityReasonList}. # fbaInventory_getInventorySummaries (https://sellersheetai.com/docs/mcp-api/tools/fbaInventory_getInventorySummaries) > Live FBA inventory for one or a few SKUs right now (read, one page) — e.g. Access: **READ** · toolset amazon_sp · family sp.fbaInventory fulfillable and inbound counts before a decision. For all SKUs, history or trends use query_report_data on rpt_get_afn_inventory_data, which the reporting server refreshes daily — never page through the catalog here. Scope it with seller_skus or seller_sku. Amazon SP-API · getInventorySummaries · GET /fba/inventory/v1/summaries ## Call it MCP tool call: ```json { "name": "fbaInventory_getInventorySummaries", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInventory_getInventorySummaries \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `details` | boolean | | include inventoryDetails (fulfillable/inbound/reserved breakdown). | | `seller_skus` | object[] | | optional list of seller SKUs (max 50) to scope to. | | `seller_sku` | string | | optional single seller SKU; ignored when seller_skus is given. | | `start_date_time` | string · date-time | | optional ISO 8601, no earlier than 18 months ago — only summaries changed since then; overrides seller_skus / seller_sku, and changes in the inbound quantities are not detected. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.inventorySummaries` — list of per-SKU summary objects. - `data.nextToken` — cursor for the next page; '' when this is the last. ## Params (Amazon schema) - details: boolean granularityType*: Marketplace granularityId*: string startDateTime: string sellerSkus: [string] (max 50) — you may specify up to 50 SKUs sellerSku: string nextToken: string marketplaceIds*: [string] (max 1) ## Gotchas - data.nextToken expires 30 seconds after it is issued; when paging a start_date_time query, pass the same start_date_time with next_token. # feeds_cancelFeed (https://sellersheetai.com/docs/mcp-api/tools/feeds_cancelFeed) > Cancel a queued feed (cancelFeed). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.feeds_2021-06-30 Amazon write. Amazon SP-API · cancelFeed · DELETE /feeds/2021-06-30/feeds/{feedId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Only feeds with processingStatus == 'IN_QUEUE' can be cancelled — once a feed is IN_PROGRESS/DONE it is too late. A cancelled feed still appears in feeds_getFeed / feeds_getFeeds with processingStatus == 'CANCELLED'. Requires SP write access. ## Call it MCP tool call: ```json { "name": "feeds_cancelFeed", "arguments": { "store": "myStore-US", "feedId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/feeds_cancelFeed \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feedId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feedId` | string | yes | Amazon feed ID to cancel (from feeds_createFeed or feeds_getFeeds). | ## Result - `data.feedId` — same as input. - `data.cancelled` — True on success; False with a 'warning' notification when Amazon has no such feed for this store. # feeds_createFeed (https://sellersheetai.com/docs/mcp-api/tools/feeds_createFeed) > Submit a feed to Amazon (createFeedDocument upload + createFeed); returns feedId at once. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.feeds_2021-06-30 The marketplace comes from the store ref. Poll feeds_getFeed until processingStatus is DONE, FATAL or CANCELLED (FATAL/CANCELLED never becomes DONE — stop and report). Amazon SP-API · createFeedDocument · POST /feeds/2021-06-30/documents Amazon SP-API · createFeed · POST /feeds/2021-06-30/feeds Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "feeds_createFeed", "arguments": { "store": "myStore-US", "feedType": "", "feedData": "", "contentType": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/feeds_createFeed \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feedType":"","feedData":"","contentType":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feedType` | string | yes | Amazon's feed type string (100+ values; the exact string, see https://developer-docs.amazon.com/sp-api/docs/feed-type-values). Common: JSON_LISTINGS_FEED (listings — the XML/flat-file product feeds are deprecated), POST_INVENTORY_AVAILABILITY_DATA, POST_PRODUCT_PRICING_DATA, POST_PRODUCT_IMAGE_DATA, POST_ORDER_FULFILLMENT_DATA, POST_ORDER_ACKNOWLEDGEMENT_DATA, UPLOAD_VAT_INVOICE, POST_FBA_INBOUND_CARTON_CONTENTS, POST_EASYSHIP_DOCUMENTS. | | `feedData` | string | yes | the feed body, base64-encoded; decoded it must match feedType and contentType (JSON for JSON_LISTINGS_FEED, XML for POST_* feeds, PDF bytes for UPLOAD_VAT_INVOICE). A JSON_LISTINGS_FEED body is {header, messages}: header = {sellerId (the store's seller id from get_user_context), version "2.0", issueLocale, report: {includedData: ["issues", …], apiVersion "2021-08-01"}} — always include "issues" so feeds_getFeed carries per-SKU issues; add "relationships" when touching a variation group. Each message = {messageId (unique int), sku, operationType, …} with ONE of four shapes: UPDATE → productType + attributes (the full set; optional requirements LISTING \| LISTING_PRODUCT_ONLY \| LISTING_OFFER_ONLY) — creates or fully republishes a listing; PARTIAL_UPDATE → productType + attributes (only those sent are merged; no patches); PATCH → productType + patches (JSON-Patch op replace\|merge\|delete on /attributes/; no attributes); DELETE → sku only. attributes and patches are never interchangeable (a PARTIAL_UPDATE with patches 400s). Attribute values have exactly the shape listings_getListingsItem returns (e.g. item_thickness → [{decimal_value: 3.6, unit: "millimeters", marketplace_id}]): read the current ones with listings_getListingsItem(included_data=['attributes', 'productTypes']), model a new ASIN from catalogItems_getCatalogItem, or validate against productTypeDefinitions_getDefinitionsProductType. | | `contentType` | string | yes | MIME type of feedData: 'application/json; charset=UTF-8' (JSON_LISTINGS_FEED), 'text/xml; charset=UTF-8' (XML feeds), 'application/pdf' (UPLOAD_VAT_INVOICE). | | `feedOptions` | object | | feed-specific metadata; for UPLOAD_VAT_INVOICE {'metadata:orderid': '', 'metadata:invoicenumber': ''}. | ## Result - `data.feedId` — poll it with feeds_getFeed. - `data.feedDocumentId` — the uploaded document. - `data.processingStatus` — always 'IN_QUEUE' here — Amazon's createFeed carries only feedId. - `data.feedType` — as submitted. ## Body (Amazon schema; createFeedDocument) - contentType*: string ## Body (Amazon schema; createFeed) - feedType*: string marketplaceIds*: [string] (1–25) inputFeedDocumentId*: string feedOptions: object ## Gotchas - A seller with a GTIN exemption can get a NEW ASIN spun off even on a PARTIAL_UPDATE: always send externally_assigned_product_identifier [{type: "asin", value: , marketplace_id}] to keep the SKU bound to its ASIN (Amazon accepts type "asin" although the schema lists ean|gtin|upc). For Publish Queue rows use listings_submit_feed (it builds this feed from the sheet's keys). # feeds_getFeed (https://sellersheetai.com/docs/mcp-api/tools/feeds_getFeed) > Get Amazon feed processing status (getFeed). Access: **READ** · toolset amazon_sp · family sp.feeds_2021-06-30 Whenever Amazon has a result document for the feed, it is auto-fetched + decoded (getFeedDocument is folded in — the server resolves resultFeedDocumentId, downloads the presigned URL, gunzips, and decodes to text). Amazon attaches a result document to FATAL feeds too, not only DONE ones. Amazon SP-API · getFeed · GET /feeds/2021-06-30/feeds/{feedId} Amazon SP-API · getFeedDocument · GET /feeds/2021-06-30/documents/{feedDocumentId} Call this repeatedly to poll until processingStatus is terminal. Feeds typically complete within 1–5 minutes. Terminal vs retryable: 'DONE', 'FATAL' and 'CANCELLED' are terminal — polling again can never change them. Only 'IN_QUEUE' / 'IN_PROGRESS' are worth another call. ## Call it MCP tool call: ```json { "name": "feeds_getFeed", "arguments": { "store": "myStore-US", "feedId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/feeds_getFeed \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feedId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feedId` | string | yes | Amazon feed ID returned by feeds_createFeed. | ## Result - `data.feedId` — same as input. - `data.processingStatus` — Amazon enum 'IN_QUEUE' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED' | 'FATAL', plus the SellerSheet-synthetic 'NOT_FOUND' (returned as a warning when Amazon has no such feed for this store). - `data.resultFeedDocumentId` — Amazon's result-document id, whenever Amazon returned one (DONE and FATAL feeds both carry one). - `data.document` — (whenever Amazon has a result document — DONE or FATAL) Decoded string content of the feed processing report. For a JSON listings feed a JSON report {header, summary {messagesProcessed, messagesAccepted, messagesInvalid, errors, warnings}, issues [{messageId, code, severity, message, attributeName}]} — messageId n is the n-th message sent. For XML feeds an XML summary with counts of messages processed, warnings, and errors. On FATAL it says why Amazon aborted. ## Workflow - 1. Read data.processingStatus. 2. DONE: read data.document (the processing report) and report each message's issues. 3. IN_QUEUE or IN_PROGRESS: wait 2–5 minutes, then call again. 4. CANCELLED or FATAL: relay the reason; the feed was not applied. 5. NOT_FOUND: the feedId is invalid or was submitted to a different store. ## Params (Amazon schema; getFeed) - feedId*: string ## Params (Amazon schema; getFeedDocument) - feedDocumentId*: string enableContentEncodingUrlHeader: boolean # feeds_getFeeds (https://sellersheetai.com/docs/mcp-api/tools/feeds_getFeeds) > List/filter your recent feeds (getFeeds). Access: **READ** · toolset amazon_sp · family sp.feeds_2021-06-30 Read-only. Amazon SP-API · getFeeds · GET /feeds/2021-06-30/feeds Use this to find feedIds you didn't record, or to audit recent submissions and their statuses. Marketplace is derived server-side from the store — you do NOT pass a marketplace. Feeds are retained for 90 days. ## Call it MCP tool call: ```json { "name": "feeds_getFeeds", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/feeds_getFeeds \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feedTypes` | object[] | | required unless paginating with nextToken — 1–10 Amazon feed-type strings, e.g. ['JSON_LISTINGS_FEED']. Amazon REJECTS a getFeeds call with neither feedTypes nor nextToken ("required parameters missing: feedTypes"). Full list: https://developer-docs.amazon.com/sp-api/docs/feed-type-values | | `processingStatuses` | string[] | | optional list of statuses to filter by. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. | | `pageSize` | integer · 1–100 | | max feeds to return, 1–100 (Amazon default 10). | | `createdSince` | string · date-time | | ISO-8601 lower bound on feed creation. Default 90 days ago (feeds older than 90 days are purged). | | `createdUntil` | string · date-time | | ISO-8601 upper bound. Default now. | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.feeds` — list of {feedId, feedType, marketplaceIds, createdTime, processingStatus, processingStartTime, processingEndTime, resultFeedDocumentId}. - `data.count` — number of feeds in this page. - `data.nextToken` — cursor — if present, call feeds_getFeeds again with ONLY this. ## Workflow - 1. First call: pass your filters (feedTypes / processingStatuses / dates). 2. If data.nextToken is set, call again with ONLY nextToken and NOTHING else — Amazon REJECTS nextToken combined with any other filter. 3. Repeat until data.nextToken is null. # finances_listFinancialEventGroups (https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventGroups) > List Amazon financial event groups (settlement periods). Access: **READ** · toolset amazon_sp · family sp.financesV0 Amazon SP-API · listFinancialEventGroups · GET /finances/v0/financialEventGroups Amazon op: listFinancialEventGroups (Finances v0). Read-only. Each group is a settlement period. Use its FinancialEventGroupId with finances_listFinancialEventsByGroupId to drill into a settlement's events. ## Call it MCP tool call: ```json { "name": "finances_listFinancialEventGroups", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/finances_listFinancialEventGroups \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `financialEventGroupStartedAfter` | string · date-time | | ISO 8601 date-time. Groups that started on or after this date. Defaults to ~last 30 days when both bounds are omitted (Amazon rejects an empty window). Must be more than two minutes before the request time. | | `financialEventGroupStartedBefore` | string · date-time | | ISO 8601 date-time. Groups that started before (not at) this date. Must be after financialEventGroupStartedAfter and more than two minutes before the request time. A window wider than 180 days returns NO groups (an empty response, not an error) — page month by month. | | `maxResultsPerPage` | integer · 1–100 | | groups per page, 1-100 (Amazon's default is 10 — pass 100 to page less). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. Send it with the same other arguments. | ## Result - `data.result.FinancialEventGroupList` — array of groups, each with FinancialEventGroupId, ProcessingStatus (Open | Closed), FundTransferStatus, OriginalTotal, BeginningBalance, FinancialEventGroupStart / FinancialEventGroupEnd. - `data.nextToken` — the cursor for the next page (null on the last page). # finances_listFinancialEvents (https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEvents) > List Amazon financial events (charges, credits, fees, etc.) by posted-date range. Access: **READ** · toolset amazon_sp · family sp.financesV0 Amazon SP-API · listFinancialEvents · GET /finances/v0/financialEvents Amazon op: listFinancialEvents (Finances v0). Read-only. Events come grouped by type (ShipmentEventList, RefundEventList, …); for deferred/released status or a per-transaction breakdown use finances_listTransactions, and for settlement-level analysis finances_listFinancialEventGroups. ## Call it MCP tool call: ```json { "name": "finances_listFinancialEvents", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/finances_listFinancialEvents \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `postedAfter` | string · date-time | | ISO 8601 date-time (e.g. '2026-01-01T00:00:00Z'). The response includes events posted on or after this date. Must be more than two minutes before the request time. | | `postedBefore` | string · date-time | | ISO 8601 date-time. Events posted before (not on) this date. MUST be sent together with postedAfter — Amazon rejects postedBefore on its own. Must be later than postedAfter and more than two minutes before the request time. A window wider than 180 days returns an EMPTY response (not an error) — page month by month. Default when omitted: two minutes before the request. | | `maxResultsPerPage` | integer · 1–100 | | Max events per page (Amazon allows 1-100). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. Send it with the same other arguments. | ## Result - `data.result.FinancialEvents` — event lists (ShipmentEventList, RefundEventList, ServiceFeeEventList, AdjustmentEventList, etc.). - `data.nextToken` — the cursor for the next page (null on the last page). # finances_listFinancialEventsByGroupId (https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventsByGroupId) > List all financial events for a specific settlement group. Access: **READ** · toolset amazon_sp · family sp.financesV0 Amazon SP-API · listFinancialEventsByGroupId · GET /finances/v0/financialEventGroups/{eventGroupId}/financialEvents Amazon op: listFinancialEventsByGroupId (Finances v0). Read-only. Use after finances_listFinancialEventGroups to drill into one settlement. ## Call it MCP tool call: ```json { "name": "finances_listFinancialEventsByGroupId", "arguments": { "store": "myStore-US", "groupId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/finances_listFinancialEventsByGroupId \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","groupId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `groupId` | string | yes | FinancialEventGroupId from finances_listFinancialEventGroups (maps to the eventGroupId path param). | | `postedAfter` | string · date-time | | optional ISO 8601 date-time. Scope the group's events to those posted on or after this date. Must be more than two minutes before the request time. | | `postedBefore` | string · date-time | | optional ISO 8601 date-time. Posted before (not on) this date. MUST be sent together with postedAfter — Amazon rejects postedBefore on its own. Must be later than postedAfter and more than two minutes before the request time. A window wider than 180 days returns an EMPTY response (not an error) — page month by month. Default when omitted: two minutes before the request. | | `maxResultsPerPage` | integer · 1–100 | | Max events per page (Amazon allows 1-100). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. Send it with the same other arguments. | ## Result - `data.groupId` — the requested group ID. - `data.result.FinancialEvents` — detailed event lists for this settlement (same shape as finances_listFinancialEvents). - `data.nextToken` — the cursor for the next page (null on the last page). # finances_listFinancialEventsByOrderId (https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventsByOrderId) > Get all financial events for a specific Amazon order ID. Access: **READ** · toolset amazon_sp · family sp.financesV0 Amazon SP-API · listFinancialEventsByOrderId · GET /finances/v0/orders/{orderId}/financialEvents Amazon op: listFinancialEventsByOrderId (Finances v0). Read-only. Useful for per-order profitability — shows fees, credits, and charges tied to one order. ## Call it MCP tool call: ```json { "name": "finances_listFinancialEventsByOrderId", "arguments": { "store": "myStore-US", "orderId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/finances_listFinancialEventsByOrderId \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","orderId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `orderId` | string | yes | Amazon order ID (e.g. '114-1234567-1234567'). | | `maxResultsPerPage` | integer · 1–100 | | Max events per page (Amazon allows 1-100). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. Send it with the same other arguments. | ## Result - `data.orderId` — the requested order ID. - `data.result.FinancialEvents` — event lists (ShipmentEventList, RefundEventList, etc.) filtered to this order. - `data.nextToken` — the cursor for the next page (null on the last page). # finances_listTransactions (https://sellersheetai.com/docs/mcp-api/tools/finances_listTransactions) > List Amazon financial transactions by posted-date range. Access: **READ** · toolset amazon_sp · family sp.finances_2024-06-19 Amazon SP-API · listTransactions · GET /finances/2024-06-19/transactions Amazon op: listTransactions (Finances 2024-06-19, served at /finances/2024-06-19/transactions — NOT the v0 events API). Read-only. Each transaction carries transactionType, transactionStatus, totalAmount, postedDate, items, contexts, and breakdowns — useful for detailed reconciliation. Use it for deferred/released status (DEFERRED_RELEASED) and one row per transaction with breakdowns; use finances_listFinancialEvents for the v0 event lists by type. ## Call it MCP tool call: ```json { "name": "finances_listTransactions", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/finances_listTransactions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `postedAfter` | string · date-time | | ISO 8601 date-time (e.g. '2026-01-01T00:00:00Z'). Transactions posted on or after this date. REQUIRED by Amazon unless you pass relatedIdentifierName + relatedIdentifierValue. Must be more than two minutes before the request time. When you pass neither a window nor a related identifier the server defaults it to ~30 days ago. | | `postedBefore` | string · date-time | | ISO 8601 date-time. Posted before (not on) this date. Must be later than postedAfter and more than two minutes before the request time. A window wider than 180 days returns an EMPTY response (not an error) — page month by month. Default when omitted: two minutes before the request. | | `transactionStatus` | string | | optional filter. Allowed: DEFERRED (currently deferred) \| RELEASED (currently released) \| DEFERRED_RELEASED (was deferred, now released). | | `relatedIdentifierName` | string | | optional. Filter by a related identifier; must be sent together with relatedIdentifierValue. Allowed: FINANCIAL_EVENT_GROUP_ID (the settlement group ID) \| ORDER_ID (the Amazon order ID). | | `relatedIdentifierValue` | string | | optional. The value matching relatedIdentifierName (e.g. the group ID or order ID string). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. Send it with the same other arguments. | ## Result - `data.result.transactions` — array of transactions — each with transactionId, transactionType, transactionStatus, description, postedDate, totalAmount {currencyCode, currencyAmount}, marketplaceDetails, sellingPartnerMetadata, items, contexts, breakdowns[]. - `data.nextToken` — the cursor for the next page (null on the last page). # listings_deleteListingsItem (https://sellersheetai.com/docs/mcp-api/tools/listings_deleteListingsItem) > Delete this seller's listing for a SKU (offer and submitted attributes); the ASIN's catalog page stays. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.listingsItems_2021-08-01 Amazon SP-API · deleteListingsItem · DELETE /listings/2021-08-01/items/{sellerId}/{sku} Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. Account types: Seller Central + Vendor Central (vendors pass seller_id) Amazon queues the deletion (status ACCEPTED); it cannot be undone except by re-creating the listing with listings_putListingsItem. Verify the SKU with listings_getListingsItem first. FBA stock is untouched — remove it with a removal order. ## Call it MCP tool call: ```json { "name": "listings_deleteListingsItem", "arguments": { "store": "myStore-US", "sku": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_deleteListingsItem \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sku` | string | yes | Merchant SKU (msku) to delete. | | `issue_locale` | string | | locale of Amazon's issue messages (e.g. 'en_US'); defaults to the marketplace's primary language. | | `seller_id` | string | | Vendor Central accounts ONLY — pass your vendor code (e.g. 'ABCDE' from vendorOrders_getPurchaseOrders → orderDetails.sellingParty.partyId). Vendors may hold multiple codes across marketplaces/warehouses; pick the one for the marketplace you need. Do not pass this for Seller Central — the merchant token is used automatically. | ## Result - `data.status` — ACCEPTED (queued), or INVALID with data.issues [{code, message, severity}]. - `data.submissionId` — this submission. # listings_getListingsItem (https://sellersheetai.com/docs/mcp-api/tools/listings_getListingsItem) > Get the SELLER'S SUBMITTED attributes, status, and issues for a single listing SKU. Access: **READ** · toolset amazon_sp · family sp.listingsItems_2021-08-01 Amazon SP-API · getListingsItem · GET /listings/2021-08-01/items/{sellerId}/{sku} Account types: Seller Central + Vendor Central (vendors pass seller_id) This returns what the seller sent to Amazon — NOT what the detail page shows. Amazon may override these values with data from other sellers or its own sources. To see whether Amazon kept your values, compare data.attributes with catalogItems_getCatalogItem's data.item.attributes for the ASIN — a difference means Amazon chose another contribution. Use to inspect a listing before making changes, or to verify that a listings_putListingsItem / listings_patchListingsItem took effect. Fix a flagged attribute with listings_patchListingsItem on the issue's attributeNames. ## Call it MCP tool call: ```json { "name": "listings_getListingsItem", "arguments": { "store": "myStore-US", "sku": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_getListingsItem \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sku` | string | yes | Merchant SKU (msku). | | `included_data` | string[] | | datasets to return; default ['summaries', 'issues', 'attributes', 'fulfillmentAvailability']. procurement is for vendors only. Allowed: summaries \| attributes \| issues \| offers \| fulfillmentAvailability \| procurement \| relationships \| productTypes. Allowed: summaries \| attributes \| issues \| offers \| fulfillmentAvailability \| procurement \| relationships \| productTypes. | | `issue_locale` | string | | locale of Amazon's issue messages (e.g. 'en_US'); defaults to the marketplace's primary language. | | `seller_id` | string | | Vendor Central accounts ONLY — pass your vendor code (e.g. 'ABCDE' from vendorOrders_getPurchaseOrders → orderDetails.sellingParty.partyId). Vendors may hold multiple codes across marketplaces/warehouses; pick the one for the marketplace you need. Do not pass this for Seller Central — the merchant token is used automatically. | ## Result - `data` — Amazon's listing payload — the fields below. - `data.summaries[0].status` — 'BUYABLE' (active and buyable) and/or 'DISCOVERABLE' (visible). A missing BUYABLE does not by itself mean suppressed (no stock, or a vendor listing — BUYABLE never applies to vendors). - `data.summaries[0].asin` — the ASIN this SKU maps to. - `data.issues[]` — {code, message, severity ERROR | WARNING | INFO, attributeNames, enforcements}. The listing is suppressed when an issue's enforcements.actions[].action is Amazon's listing-suppressed action (the others suppress one attribute, remove the catalog item, or hide it from search). - `data.attributes` — dict of current attribute values in SP-API format. - `data.fulfillmentAvailability[]` — qty by channel: - fulfillmentChannelCode 'DEFAULT' = FBM (merchant-fulfilled) - fulfillmentChannelCode 'AMAZON_NA' / 'AMAZON_EU' = FBA # listings_getListingsRestrictions (https://sellersheetai.com/docs/mcp-api/tools/listings_getListingsRestrictions) > Check whether you are approved to sell an ASIN in a given condition. Access: **READ** · toolset amazon_sp · family sp.listingsRestrictions_2021-08-01 Amazon SP-API · getListingsRestrictions · GET /listings/2021-08-01/restrictions Account types: Seller Central only (Amazon rejects this endpoint for Vendor Central accounts with Unauthorized.) Returns list of restrictions with reasons and approval links. Use before attempting to create a listing for a new ASIN to verify eligibility. An empty data.restrictions means you may list the ASIN in that condition; otherwise follow reasons[].links[].resource to apply — no link means no self-service path. ## Call it MCP tool call: ```json { "name": "listings_getListingsRestrictions", "arguments": { "store": "myStore-US", "asin": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_getListingsRestrictions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `condition_type` | string | | the offer condition to check. Default: 'new_new'. Allowed: new_new \| new_open_box \| new_oem \| refurbished_refurbished \| used_like_new \| used_very_good \| used_good \| used_acceptable \| collectible_like_new \| collectible_very_good \| collectible_good \| collectible_acceptable \| club_club. Allowed: new_new \| new_open_box \| new_oem \| refurbished_refurbished \| used_like_new \| used_very_good \| used_good \| used_acceptable \| collectible_like_new \| collectible_very_good \| collectible_good \| collectible_acceptable \| club_club. | | `reason_locale` | string | | Locale for reason text localization (e.g. 'en_US', 'fr_CA', 'fr_FR'). Defaults to the marketplace's primary language. Falls back to 'en_US' if the requested locale is unavailable. | | `product_type` | string | | Amazon product type of the item, e.g. 'SHIRT'. With it Amazon also evaluates GTIN-exemption restrictions for that product type; without it only brand restrictions (this tool takes no brand argument). Get the value from productTypeDefinitions_searchDefinitionsProductTypes or catalogItems_getCatalogItem. | ## Result - `data.restrictions` — list of restriction objects, each with: - marketplaceId - conditionType (the condition the restriction applies to) - reasons[]: each has message, optional reasonCode ('APPROVAL_REQUIRED' | 'ASIN_NOT_FOUND' | 'NOT_ELIGIBLE'), and links[] (path-forward resources: resource URI, verb 'GET', title) — typically the approval/application link. # listings_patchListingsItem (https://sellersheetai.com/docs/mcp-api/tools/listings_patchListingsItem) > Patch attributes on an existing listing (JSON Patch) without replacing it — the tool for fixing a suppressed listing or changing price, inventory, title or images. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.listingsItems_2021-08-01 Several patches may travel in one call. Amazon SP-API · patchListingsItem · PATCH /listings/2021-08-01/items/{sellerId}/{sku} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "listings_patchListingsItem", "arguments": { "store": "myStore-US", "sku": "", "product_type": "", "patches": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_patchListingsItem \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku":"","product_type":"","patches":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sku` | string | yes | the merchant SKU of an existing listing. | | `product_type` | string | yes | the listing's productType — data.summaries[0].productType from listings_getListingsItem. | | `patches` | object[] | yes | [{op, path, value}], at least one. op: add \| replace \| merge \| delete (delete is not supported for vendors — Amazon returns 400). path: '/attributes/'. value: the attribute's value ARRAY in exactly the shape listings_getListingsItem returns under data.attributes. — read it first and patch only the paths you change; model a new attribute from catalogItems_getCatalogItem or from productTypeDefinitions_getDefinitionsProductType (the authoritative schema: enums, units, required keys). Examples — title: {"op": "replace", "path": "/attributes/item_name", "value": [{"value": "New Title", "language_tag": "en_US", "marketplace_id": "ATVPDKIKX0DER"}]}; price: path /attributes/purchasable_offer, value [{"audience": "ALL", "currency": "USD", "our_price": [{"schedule": [{"value_with_tax": 29.99}]}]}]; FBM stock: path /attributes/fulfillment_availability, value [{"fulfillment_channel_code": "DEFAULT", "quantity": 50}]; main image: path /attributes/main_product_image_locator, value [{"media_location": "https://…/img.jpg", "marketplace_id": "ATVPDKIKX0DER"}]. | | `included_data` | string[] | | datasets to return; default ['issues']; identifiers needs mode VALIDATION_PREVIEW. Allowed: identifiers \| issues. | | `mode` | string | | 'VALIDATION_PREVIEW' validates the patches without applying them (no write access needed); omit to apply. | | `issue_locale` | string | | locale of Amazon's issue messages (e.g. 'en_US'); defaults to the marketplace's primary language. | | `seller_id` | string | | Vendor Central only — the vendor code (sellingParty.partyId from vendorOrders_getPurchaseOrders); omit on a seller account. | ## Result - `data.status` — ACCEPTED (queued) | INVALID | VALID (the preview passed). - `data.submissionId` — this submission. - `data.issues` — when INVALID — [{code, message, severity ERROR | WARNING | INFO, categories, attributeNames}]: fix them and resubmit without mode. After ACCEPTED, listings_getListingsItem after ~30 s shows the result. ## Body (Amazon schema) - productType*: string patches*: [{op*: add | replace | merge | delete, path*, value: [object]}] (min 1) ## Gotchas - A delete op must carry the attribute's EXACT current array as value, copied from listings_getListingsItem — an empty, omitted or simplified value comes back INVALID. Detach a child from its variation family: three delete ops — parentage_level, child_parent_sku_relationship, variation_theme — each with its current array; confirm with listings_getListingsItem. Add a child to a family: read variation_theme[0].name on the PARENT (e.g. COLOR_NAME), then on the CHILD replace parentage_level [{"value": "child", "marketplace_id": …}], child_parent_sku_relationship [{"child_relationship_type": "variation", "parent_sku": "PARENT-SKU", "marketplace_id": …}], variation_theme [{"name": "COLOR_NAME", "marketplace_id": …}] and the themed attribute itself (color …); confirm on the parent with included_data ['relationships']. # listings_poll_feed_results (https://sellersheetai.com/docs/mcp-api/tools/listings_poll_feed_results) > Check the feeds behind the Submission Log's unfinished Submit Feed rows and get back the cells to write: Feed Status, Result, Issues, Raw Response. Access: **WRITE** · toolset amazon_sp · family sp.feeds_2021-06-30 Amazon SP-API · getFeed · GET /feeds/2021-06-30/feeds/{feedId} Amazon SP-API · getFeedDocument · GET /feeds/2021-06-30/documents/{feedDocumentId} The server touches no sheet. Read the Submission Log with read_sheet, take the rows whose Feed ID is set and whose Feed Status is not DONE / CANCELLED / FATAL, call this with their feed ids (and each row's SKUs cell, so a report's messageId maps to a SKU), then write the four cells back into each row with write_sheet. Feed Status takes Amazon's own value only; Result reads "✓/⚠/✕ n of m accepted", "⏳ Processing" or "✕ Feed not found …"; Issues is one "SKU · message" per line. The sidebar's Submission Log ▸ Refresh Status writes the same cells. Call this after listings_submit_feed (or listings_submit_feed_legacy) until no row is still ⏳ Processing. ## Call it MCP tool call: ```json { "name": "listings_poll_feed_results", "arguments": { "store": "myStore-US", "feed_ids": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_poll_feed_results \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feed_ids":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feed_ids` | object[] | yes | Amazon feed ids to check (digits), e.g. ['474419020721']. | | `skus` | object | | {feed_id: the row's SKUs cell} — one SKU per line in feed message order. Optional; without it an issue is attributed to "Message n". | ## Result - `data.results` — [{feedId, feedStatus, result, issues, rawResponse, terminal}] — the cells for that row; terminal=true means stop polling this feed. - `data.failed` — [{feedId, reason}] for feeds whose getFeed call errored (e.g. the feed belongs to another store, or Amazon 403s). ## Params (Amazon schema; getFeed) - feedId*: string ## Params (Amazon schema; getFeedDocument) - feedDocumentId*: string enableContentEncodingUrlHeader: boolean # listings_putListingsItem (https://sellersheetai.com/docs/mcp-api/tools/listings_putListingsItem) > Create a listing, or fully replace an existing one — PUT replaces every attribute, so for a targeted change use listings_patchListingsItem. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.listingsItems_2021-08-01 Requires a write-enabled store. Takes the nested Amazon shape only: for Publish Queue cells (flat-file keys) use listings_submit_items, or listings_submit_feed for large batches. Amazon SP-API · putListingsItem · PUT /listings/2021-08-01/items/{sellerId}/{sku} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "listings_putListingsItem", "arguments": { "store": "myStore-US", "sku": "", "product_type": "", "attributes": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_putListingsItem \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku":"","product_type":"","attributes":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sku` | string | yes | the merchant SKU — a new SKU creates, an existing one replaces. | | `product_type` | string | yes | the Amazon productType, e.g. 'LUGGAGE' (productTypeDefinitions_searchDefinitionsProductTypes finds it); 'PRODUCT' for LISTING_OFFER_ONLY. | | `attributes` | object | yes | {attribute_name: [value objects]} — every value is an ARRAY of objects carrying marketplace_id, text ones language_tag too, e.g. item_name [{"value": "My Product", "language_tag": "en_US", "marketplace_id": "ATVPDKIKX0DER"}]; merchant_suggested_asin [{"value": "B0XXXXXXXX", "marketplace_id": …}]; purchasable_offer [{"audience": "ALL", "currency": "USD", "our_price": [{"schedule": [{"value_with_tax": 29.99}]}]}]; fulfillment_availability [{"fulfillment_channel_code": "DEFAULT", "quantity": 10}]; main_product_image_locator [{"media_location": "https://…/img.jpg", "marketplace_id": …}]. Shapes, enums, units and required keys are productType-specific — take them from an existing listing (listings_getListingsItem returns exactly this shape), a catalog item (catalogItems_getCatalogItem) or the authoritative schema (productTypeDefinitions_getDefinitionsProductType). The marketplace id comes from get_user_context. | | `requirements` | string | | LISTING (default — product facts + sales terms) \| LISTING_OFFER_ONLY (sales terms only: condition_type, merchant_suggested_asin, purchasable_offer, fulfillment_availability, with product_type 'PRODUCT') \| LISTING_PRODUCT_ONLY (product facts only; not for vendors). Allowed: LISTING \| LISTING_PRODUCT_ONLY \| LISTING_OFFER_ONLY. | | `included_data` | string[] | | datasets to return; default ['issues']; identifiers needs mode VALIDATION_PREVIEW. Allowed: identifiers \| issues. | | `mode` | string | | 'VALIDATION_PREVIEW' validates without submitting (no write access needed); omit to submit. | | `issue_locale` | string | | locale of Amazon's issue messages (e.g. 'en_US'); defaults to the marketplace's primary language. | | `seller_id` | string | | Vendor Central only — the vendor code (sellingParty.partyId from vendorOrders_getPurchaseOrders); omit on a seller account. | ## Result - `data.status` — ACCEPTED (queued) | INVALID | VALID (the preview passed). - `data.submissionId` — this submission. - `data.issues` — when INVALID — [{code, message, severity ERROR | WARNING | INFO, categories, attributeNames}]: fix them and resubmit without mode. After ACCEPTED, listings_getListingsItem after ~30 s shows whether the listing is BUYABLE. # listings_searchListingsItems (https://sellersheetai.com/docs/mcp-api/tools/listings_searchListingsItems) > Search and filter the seller's own listings catalog — the entry point for a suppressed-listing audit (with_issue_severity ['ERROR'] and included_data ['summaries', 'issues'], then Access: **READ** · toolset amazon_sp · family sp.listingsItems_2021-08-01 listings_patchListingsItem), an active-listing inventory (with_status ['BUYABLE']), an identifier lookup, a variation family (variation_parent_sku) or recent changes (last_updated_after with sort_by lastUpdatedDate). Paginated. Amazon SP-API · searchListingsItems · GET /listings/2021-08-01/items/{sellerId} ## Call it MCP tool call: ```json { "name": "listings_searchListingsItems", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_searchListingsItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `included_data` | string[] | | datasets per item; default ['summaries']. issues carries the suppression reasons; procurement is vendor cost data. Allowed: summaries \| attributes \| issues \| offers \| fulfillmentAvailability \| procurement \| relationships \| productTypes. Allowed: summaries \| attributes \| issues \| offers \| fulfillmentAvailability \| procurement \| relationships \| productTypes. | | `identifiers` | object[] | | up to 20 identifiers; requires identifiers_type. | | `identifiers_type` | string | | the type of every value in identifiers; required with identifiers. Allowed: ASIN \| EAN \| FNSKU \| GTIN \| ISBN \| JAN \| MINSAN \| SKU \| UPC. Allowed: ASIN \| EAN \| FNSKU \| GTIN \| ISBN \| JAN \| MINSAN \| SKU \| UPC. | | `variation_parent_sku` | string | | every variation child of this parent SKU. | | `package_hierarchy_sku` | string | | listings that contain or are contained by this SKU. | | `created_after` | string · date-time | | ISO 8601 datetimes, e.g. '2024-01-01T00:00:00Z'. | | `created_before` | string · date-time | | ISO 8601 datetimes, e.g. '2024-01-01T00:00:00Z'. | | `last_updated_after` | string · date-time | | ISO 8601 datetimes, e.g. '2024-01-01T00:00:00Z'. | | `last_updated_before` | string · date-time | | ISO 8601 datetimes, e.g. '2024-01-01T00:00:00Z'. | | `with_issue_severity` | string[] | | keep listings with issues of these severities (ERROR = suppressed); INFO is not a filter value. Allowed: WARNING \| ERROR. Allowed: WARNING \| ERROR. | | `with_status` | string[] | | keep listings in these statuses. BUYABLE is not valid for vendor listings (400 'Unsupported Status Requested') — use DISCOVERABLE or omit it. Allowed: BUYABLE \| DISCOVERABLE. | | `without_status` | string[] | | exclude listings in these statuses. Allowed: BUYABLE \| DISCOVERABLE. Allowed: BUYABLE \| DISCOVERABLE. | | `sort_by` | string | | the field the page is ordered by. Default: lastUpdatedDate. Allowed: sku \| createdDate \| lastUpdatedDate. Allowed: sku \| createdDate \| lastUpdatedDate. | | `sort_order` | string | | ASC or DESC. Default: DESC. Allowed: ASC \| DESC. | | `page_size` | integer · –20 | | results per page, 1–20 (default 10). | | `page_token` | string | | data.pagination.nextToken from the previous page; omit for the first. | | `issue_locale` | string | | locale of Amazon's issue messages (e.g. 'en_US'); defaults to the marketplace's primary language. | | `seller_id` | string | | Vendor Central only — the vendor code (sellingParty.partyId from vendorOrders_getPurchaseOrders); omit on a seller account. A vendor account can hold several codes in one marketplace, each a separate catalog: group PO items by sellingParty.partyId and call once per group; a group that returns 0 items falls back to catalogItems_searchCatalogItems. | ## Result - `data.items` — [{sku, …the requested datasets}] — a vendor PO image is summaries[0].mainImage.link with included_data ['summaries', 'procurement']. - `data.numberOfResults` — total matches across all pages; Amazon caps paging at 1,000 SKUs, so a larger count means the filter must be narrowed. - `data.pagination.nextToken` — pass as page_token; absent on the last page. ## Gotchas - identifiers, variation_parent_sku and package_hierarchy_sku are mutually exclusive. # listings_submit_feed_legacy (https://sellersheetai.com/docs/mcp-api/tools/listings_submit_feed_legacy) > Legacy Create Listing flow: submit flat Create Listing rows via JSON_LISTINGS_FEED or the Listings Items API — new work uses listings_submit_feed (Publish Queue keys). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Amazon SP-API · putListingsItem · PUT /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · patchListingsItem · PATCH /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · deleteListingsItem · DELETE /listings/2021-08-01/items/{sellerId}/{sku} Amazon SP-API · createFeedDocument · POST /feeds/2021-06-30/documents Amazon SP-API · createFeed · POST /feeds/2021-06-30/feeds Gate: commit — interactive: restate exactly what will happen, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. Accepts flat {header: value} rows — same format as the Create Listing sheet. The server encodes attributes. PATCH-delete rows always use Listings Items API. ## Call it MCP tool call: ```json { "name": "listings_submit_feed_legacy", "arguments": { "store": "myStore-US", "rows": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_submit_feed_legacy \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","rows":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `rows` | object[] | yes | 2D array [[headers], [row1], ...] or list of {header: value} dicts. | | `config` | object | | Dict from sheet rows 1-2 (keys as in listings_validate_rows); omitted → asin / centimeters / kilograms / liters / count / en_US, so pass it on any non-US store. marketplace_id comes from the store. | | `mode` | string | | 'feed' (bulk JSON_LISTINGS_FEED, default) or '1by1' (Listings Items API per row). | | `debug` | boolean | | true returns the built feed as data.feed_json (with data.encode_errors, data.patch_results) without submitting (feed mode only). | ## Result - `data.feedId` — (feed mode) poll with listings_poll_feed_results. - `data.submitted / data.failed` — (1by1 mode) counts. - `data.submissionLog` — the Submission Log cells for this feed (Action, Result, SKUs in message order, Issues, Feed ID, Raw Response) — append them with write_sheet when the user keeps that tab. - `data.feedDocumentId` — (feed mode) feed document ID. - `data.rowCount` — (feed mode) rows actually written into the feed — LOWER than the rows you sent when some were excluded. - `data.results` — (1by1 mode) per-SKU status list. - `data.encode_errors` — {sku: {field: reason}} for rows that did NOT reach Amazon. A row in the split layout ('attr#n.sub' headers) is refused whole — it is not in the feed and not in rowCount, so fix it and resubmit (listings_build_payload + listings_submit_items for split rows). Other entries are per-attribute encode failures on rows that DID go. - `data.patch_results` — [{sku, status, issues}] for PATCH-delete rows, which always go via Listings Items PATCH rather than the feed. ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Params (Amazon schema; putListingsItem) - sellerId*: string sku*: string marketplaceIds*: [string] (max 1) includedData: identifiers | issues (list) mode: VALIDATION_PREVIEW issueLocale: string ## Params (Amazon schema; patchListingsItem) - sellerId*: string sku*: string … (9 more lines; the Docs link above) ## Body (Amazon schema; putListingsItem) - productType*: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY attributes*: object ## Body (Amazon schema; patchListingsItem) - productType*: string patches*: [{op*: add | replace | merge | delete, path*, value: [object]}] (min 1) ## Body (Amazon schema; createFeedDocument) - contentType*: string ## Body (Amazon schema; createFeed) - feedType*: string marketplaceIds*: [string] (1–25) inputFeedDocumentId*: string feedOptions: object ## Workflow - 1. read_sheet the Create Listing tab — config in rows 1–2, then the header row and data rows. 2. listings_validate_rows — fix all INVALID rows first. 3. Call this tool with the validated rows. 4. listings_poll_feed_results with data.feedId (and the row's SKUs) for per-SKU results. # listings_validate_rows (https://sellersheetai.com/docs/mcp-api/tools/listings_validate_rows) > Validate rows of the LEGACY Create Listing sheet (combined headers, config in rows 1–2) with Amazon's VALIDATION_PREVIEW. Access: **WRITE** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 Publish Queue rows are validated with listings_submit_items (its default mode is VALIDATION_PREVIEW) — this tool rejects them as SplitLayoutRow. Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Amazon SP-API · putListingsItem · PUT /listings/2021-08-01/items/{sellerId}/{sku} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Accepts flat rows in {header: value} format — same as the sheet rows. The server encodes attributes using the config dict (from rows 1-2). ## Call it MCP tool call: ```json { "name": "listings_validate_rows", "arguments": { "store": "myStore-US", "rows": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/listings_validate_rows \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","rows":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `rows` | object[] | yes | 2D array [[headers], [row1], ...] or list of {header: value} dicts. Each row needs: sku, operationType, productType. | | `config` | object | | Dict from sheet rows 1-2 with keys: barcode_type, unit_of_length, unit_of_weight, unit_of_capacity, unit_of_unit_count, language_local. Omitted, the tool sends asin / centimeters / kilograms / liters / count / en_US — pass the sheet's own rows 1–2 on any non-US store; marketplace_id comes from the store. | ## Result - `data.results` — one entry per input row — {sku, status, issues, row_index}, plus malformed=true when the row was rejected before reaching Amazon (missing sku or productType) and partial_update=true for partial rows. Malformed rows are reported, never dropped. - `data.valid / data.invalid / data.malformed` — counts. - `data.notes` — warnings about the batch as a whole (e.g. partial rows). - `data.submissionLog` — the Submission Log cells for this call — Action, Result ("✓/⚠/✕ n of m valid"), SKUs, Issues ("SKU · message"), Raw Response — append them with write_sheet when the user keeps that tab. ## Params (Amazon schema; getDefinitionsProductType) - productType*: string sellerId: string marketplaceIds*: [string] productTypeVersion: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY requirementsEnforced: ENFORCED | NOT_ENFORCED locale: DEFAULT | ar | ar_AE | de | … | zh_TW (38 values) parentageLevel: NONE | CHILD | PARENT ## Params (Amazon schema; putListingsItem) - sellerId*: string sku*: string marketplaceIds*: [string] (max 1) includedData: identifiers | issues (list) mode: VALIDATION_PREVIEW issueLocale: string ## Body (Amazon schema; putListingsItem) - productType*: string requirements: LISTING | LISTING_PRODUCT_ONLY | LISTING_OFFER_ONLY attributes*: object ## Gotchas - VALIDATE FULL PAYLOADS: VALIDATION_PREVIEW has no partial mode, so a PARTIAL_UPDATE / PATCH / PATCH-delete row reports every required attribute it omits as missing — expected, not a defect (data.notes says so). notification.type is 'error' when every row was malformed (nothing reached Amazon), 'warning' when some rows have issues, else 'success'. ## Workflow - 1. read_sheet the Create Listing tab — row 0 = headers, rows 1+ = data. 2. Call this tool with the rows + config from A1:G2. 3. Fix INVALID rows in the sheet, re-read, re-validate. 4. When all are ACCEPTED, submit with listings_submit_feed_legacy. # productTypeDefinitions_getDefinitionsProductType (https://sellersheetai.com/docs/mcp-api/tools/productTypeDefinitions_getDefinitionsProductType) > Retrieve an Amazon product type's definition — its attribute groups, requirements and a link to its JSON Schema. Access: **READ** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 Amazon SP-API · getDefinitionsProductType · GET /definitions/2020-09-01/productTypes/{productType} Use this to understand required and optional attributes before calling listings_putListingsItem. To compose listing rows, listings_prepare_publish_queue_template returns the same schema as sheet columns, required keys and enums. ## Call it MCP tool call: ```json { "name": "productTypeDefinitions_getDefinitionsProductType", "arguments": { "store": "myStore-US", "product_type": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productTypeDefinitions_getDefinitionsProductType \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","product_type":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `product_type` | string | yes | Amazon product type string (e.g. 'LUGGAGE'). Get from productTypeDefinitions_searchDefinitionsProductTypes. | | `include_schema` | boolean | | true downloads the full JSON Schema into data.definition.schema.content (large); leave it false unless you need the schema itself. | | `requirements` | string | | Which requirements set to retrieve. Default: LISTING (all attributes). Allowed: LISTING \| LISTING_PRODUCT_ONLY \| LISTING_OFFER_ONLY. Allowed: LISTING \| LISTING_PRODUCT_ONLY \| LISTING_OFFER_ONLY. | | `requirements_enforced` | string | | ENFORCED (strict validation, the default) or NOT_ENFORCED (partial updates). Allowed: ENFORCED \| NOT_ENFORCED. | | `product_type_version` | string | | Version to retrieve. Default: LATEST. Use RELEASE_CANDIDATE for preview versions. | | `locale` | string | | Locale for display labels in the response. Defaults to the default language of the first marketplace in the request. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. Allowed: DEFAULT \| ar \| ar_AE \| de \| de_DE \| en \| en_AE \| en_AU \| en_CA \| en_GB \| en_IN \| en_SG \| en_US \| es \| es_ES \| es_MX \| es_US \| fr \| fr_CA \| fr_FR \| it \| it_IT \| ja \| ja_JP \| nl \| nl_NL \| pl \| pl_PL \| pt \| pt_BR \| pt_PT \| sv \| sv_SE \| tr \| tr_TR \| zh \| zh_CN \| zh_TW. | | `parentage_level` | string | | Parentage level of the listing the schema is for. Amazon then resolves all conditional logic for that level and returns a smaller schema with fewer conditions — pass it when building a variation family. Allowed: NONE \| CHILD \| PARENT. Allowed: NONE \| CHILD \| PARENT. | ## Result - `data.productType` — the product type name. - `data.definition.propertyGroups` — the attribute groups. - `data.definition.schema.link.resource` — the JSON Schema's download link. - `data.definition.schema.content` — (include_schema=true) the JSON Schema itself. - `data.definition.requirements / data.definition.productTypeVersion` — what was served. ## Workflow - 1. productTypeDefinitions_searchDefinitionsProductTypes for the productType. 2. Call with requirements LISTING (and parentage_level for a variation family). 3. Read data.definition.propertyGroups; pass include_schema=true only when you need the JSON Schema itself. # productTypeDefinitions_searchDefinitionsProductTypes (https://sellersheetai.com/docs/mcp-api/tools/productTypeDefinitions_searchDefinitionsProductTypes) > Search for Amazon product types that have definitions available. Access: **READ** · toolset amazon_sp · family sp.definitionsProductTypes_2020-09-01 Amazon SP-API · searchDefinitionsProductTypes · GET /definitions/2020-09-01/productTypes Use this to find the correct productType string before calling listings_putListingsItem. Cannot use both keywords and item_name in the same call. ## Call it MCP tool call: ```json { "name": "productTypeDefinitions_searchDefinitionsProductTypes", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productTypeDefinitions_searchDefinitionsProductTypes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `keywords` | object[] | | List of keywords to search, e.g. ['luggage', 'suitcase']. Cannot combine with item_name. | | `item_name` | string | | Product title for recommendation. Cannot combine with keywords. | | `locale` | string | | locale of the display names; defaults to the marketplace's primary locale. | | `search_locale` | string | | language of keywords or item_name; defaults to the marketplace's primary locale. | ## Result - `data.productTypes` — list of product type objects, each with: - name: the productType string to use in listings_putListingsItem - displayName: human-readable name - marketplaceIds: supported marketplaces ## Workflow - 1. Search by keywords or by item_name (never both). 2. Pick the most specific data.productTypes[].name. 3. productTypeDefinitions_getDefinitionsProductType for its schema, or listings_prepare_publish_queue_template to build sheet columns. # fbaOutbound_cancelFulfillmentOrder (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_cancelFulfillmentOrder) > Cancel an MCF fulfillment order. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 IRREVERSIBLE — confirm with the human first. Amazon SP-API · cancelFulfillmentOrder · PUT /fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}/cancel Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Already-shipped orders cannot be cancelled. ## Call it MCP tool call: ```json { "name": "fbaOutbound_cancelFulfillmentOrder", "arguments": { "store": "myStore-US", "seller_fulfillment_order_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_cancelFulfillmentOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_fulfillment_order_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_fulfillment_order_id` | string | yes | the order to cancel. | ## Result - `data.sellerFulfillmentOrderId` — the order whose cancellation was requested — fbaOutbound_getFulfillmentOrder shows fulfillmentOrderStatus Cancelled once Amazon applies it. # fbaOutbound_createFulfillmentOrder (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_createFulfillmentOrder) > Create a Multi-Channel Fulfillment order — ships FBA inventory to a non-Amazon customer address. Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 IRREVERSIBLE spend: run fbaOutbound_getFulfillmentPreview first for the fees and isFulfillable, and confirm with the human before submitting. Amazon SP-API · createFulfillmentOrder · POST /fba/outbound/2020-07-01/fulfillmentOrders Gate: commit, fee-bearing — interactive: restate the amount, wait for a typed CONFIRM; autopilot: only within the seller's instruction and stated limits; otherwise ask. ## Call it MCP tool call: ```json { "name": "fbaOutbound_createFulfillmentOrder", "arguments": { "store": "myStore-US", "seller_fulfillment_order_id": "", "displayable_order_id": "", "displayable_order_date": "", "displayable_order_comment": "", "shipping_speed_category": "Standard", "destination_address": {}, "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_createFulfillmentOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_fulfillment_order_id":"","displayable_order_id":"","displayable_order_date":"","displayable_order_comment":"","shipping_speed_category":"Standard","destination_address":{},"items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_fulfillment_order_id` | string | yes | your unique order id (≤40 chars). | | `displayable_order_id` | string | yes | the customer-facing order id on the packing slip (≤40). | | `displayable_order_date` | string · date-time | yes | ISO-8601 timestamp shown to the customer. | | `displayable_order_comment` | string | yes | text on the recipient materials (≤750). | | `shipping_speed_category` | string | yes | required — the speed to ship at; ScheduledDelivery also needs delivery_window. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. | | `destination_address` | object | yes | {name, addressLine1, postalCode, countryCode (ISO alpha-2)} required, plus the usual address fields. | | `items` | object[] | yes | [{sellerSku (≤50), sellerFulfillmentOrderItemId (≤50, your own item id), quantity (int)} required; giftMessage (≤512), displayableComment (≤250), fulfillmentNetworkSku, perUnitDeclaredValue, perUnitPrice, perUnitTax (each a Money {currencyCode, value as a decimal string}) optional]. | | `fulfillment_action` | string | | ship now or hold — Hold places an order hold, released later with fbaOutbound_updateFulfillmentOrder fulfillment_action Ship; Amazon cancels a held order after 14 days. Default: Ship. Allowed: Ship \| Hold. | | `fulfillment_policy` | string | | what happens to unfulfillable items — FillOrKill cancels the order if any item is unfulfillable; FillAll ships every fulfillable item and keeps the order open until the rest ship or are cancelled (on Ship it turns Unfulfillable or CompletePartialled after 24 h); FillAllAvailable ships what is available now. Default: FillOrKill. Allowed: FillOrKill \| FillAll \| FillAllAvailable. | | `cod_settings` | object | | {isCodRequired (bool, required), codCharge, codChargeTax, shippingCharge, shippingChargeTax (each a Money)}. | | `ship_from_country_code` | string | | ISO alpha-2 origin country. | | `notification_emails` | string[] | | addresses to notify (each ≤64). | | `feature_constraints` | object[] | | [{featureName, featureFulfillmentPolicy}] — featureName: BLOCK_AMZL (no Amazon Logistics; surcharge) \| BLANK_BOX \| OVERBOX \| PACKING_SLIP \| SIGNATURE_CONFIRMATION (US only; fee) \| DELIVER_TOGETHER; featureFulfillmentPolicy: Required (reject the order if unavailable) \| NotRequired. | | `delivery_window` | object | | {startDate, endDate} for ScheduledDelivery. | | `delivery_preferences` | object | | {deliveryInstructions (≤250), dropOffLocation: {type, attributes}} — JP marketplace only, applied best-effort. | | `payment_information` | object[] | | [{paymentTransactionId, paymentMode, paymentDate (ISO-8601)}], all three required per record; required for India orders (as is items[].perUnitDeclaredValue). | ## Result - `data.sellerFulfillmentOrderId` — the order to poll with fbaOutbound_getFulfillmentOrder — Amazon returns no other payload. ## Body (Amazon schema) - marketplaceId: string sellerFulfillmentOrderId*: string (max 40 chars) displayableOrderId*: string (max 40 chars) displayableOrderDate*: string (date-time) displayableOrderComment*: string (max 750 chars) shippingSpeedCategory*: Standard | Expedited | Priority | ScheduledDelivery deliveryWindow: {startDate*, endDate*} destinationAddress*: {name*, addressLine1*, addressLine2, addressLine3, city, districtOrCounty, stateOrRegion, postalCode*, countryCode*, phone} deliveryPreferences: {deliveryInstructions (max 250 chars), dropOffLocation: {type*, attributes}} deliveryPreferences.dropOffLocation.type: FRONT_DOOR | DELIVERY_BOX | GAS_METER_BOX | BICYCLE_BASKET | GARAGE | RECEPTIONIST | FALLBACK_NEIGHBOR_DELIVERY | DO_NOT_LEAVE_UNATTENDED fulfillmentAction: Ship | Hold fulfillmentPolicy: FillOrKill | FillAll | FillAllAvailable codSettings: {isCodRequired*, codCharge: {currencyCode*, value*}, codChargeTax: {currencyCode*, value*}, shippingCharge: {currencyCode*, value*}, shippingChargeTax: {currencyCode*, value*}} shipFromCountryCode: string notificationEmails: [string] (max 64 chars) featureConstraints: [{featureName, featureFulfillmentPolicy: Required | NotRequired}] items*: [{sellerSku* (max 50 chars), sellerFulfillmentOrderItemId* (max 50 chars), quantity*, giftMessage (max 512 chars), displayableComment (max 250 chars), fulfillmentNetworkSku, perUnitDeclaredValue: {currencyCode*, value*}, perUnitPrice: {currencyCode*, value*}, perUnitTax: {currencyCode*, value*}}] paymentInformation: [{paymentTransactionId*, paymentMode*, paymentDate*}] # fbaOutbound_createFulfillmentReturn (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_createFulfillmentReturn) > Create a return for a fulfilled MCF order. Access: **WRITE** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · createFulfillmentReturn · PUT /fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId}/return Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Call fbaOutbound_listReturnReasonCodes first to get valid returnReasonCode values. ## Call it MCP tool call: ```json { "name": "fbaOutbound_createFulfillmentReturn", "arguments": { "store": "myStore-US", "seller_fulfillment_order_id": "", "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_createFulfillmentReturn \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_fulfillment_order_id":"","items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_fulfillment_order_id` | string | yes | the order being returned. | | `items` | object[] | yes | list of CreateReturnItem — each {sellerReturnItemId (your own id), sellerFulfillmentOrderItemId (the item id on the order), amazonShipmentId (fbaOutbound_getFulfillmentOrder → fulfillmentShipments[].amazonShipmentId), returnReasonCode, optional returnComment}. returnReasonCode: NOT a fixed enum — values are SKU/marketplace specific. Call fbaOutbound_listReturnReasonCodes(store, seller_sku) first and use a returnReasonCode from its data.reasonCodeDetails. | ## Result - `data.returnItems` — the items Amazon accepted. - `data.invalidReturnItems` — the items Amazon refused, each with invalidItemReason {invalidItemReasonCode, description}. - `data.returnAuthorizations` — {returnAuthorizationId, amazonRmaId, rmaPageURL (return label page), returnToAddress}. - `notification.type` — 'warning' when any item is invalid, 'error' when none were accepted — the message counts accepted items against the number requested. ## Body (Amazon schema): {items: [CreateReturnItem]}, each item - sellerReturnItemId*: string (max 80 chars) sellerFulfillmentOrderItemId*: string amazonShipmentId*: string returnReasonCode*: string returnComment: string (max 1000 chars) # fbaOutbound_deliveryOffers (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_deliveryOffers) > Get estimated delivery options (date + expiry) for a SKU to a destination. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · deliveryOffers · POST /fba/outbound/2020-07-01/deliveryOffers Non-mutating. ## Call it MCP tool call: ```json { "name": "fbaOutbound_deliveryOffers", "arguments": { "store": "myStore-US", "product": {}, "terms": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_deliveryOffers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","product":{},"terms":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `product` | object | yes | GetDeliveryOffersProduct — {productIdentifier: {merchantSku REQUIRED, maxLength 50}, optional amount {unitOfMeasure REQUIRED, value REQUIRED (decimal STRING, e.g. '1')}}. amount.unitOfMeasure. Allowed: Eaches (the only valid value — an integer count of units). | | `terms` | object | yes | GetDeliveryOffersTerms — {origin: {countryCode REQUIRED, 2-letter ISO 3166-1 alpha-2}, destination: {deliveryAddress: {postalCode REQUIRED, countryCode REQUIRED 2-letter, optional addressLine1/2/3, city, districtOrCounty, stateOrRegion}, optional ipAddress}}. NOTE: the address is nested under destination.deliveryAddress — destination itself has no postalCode/countryCode. | ## Result - `data.deliveryOffers` — list each with expiresAt and dateRange. ## Body (Amazon schema) - product*: {productIdentifier*: {merchantSku*}, amount: {unitOfMeasure*, value*}} product.amount.unitOfMeasure: Eaches terms*: {origin*: {countryCode*}, destination*: {deliveryAddress, ipAddress}} # fbaOutbound_getFeatureInventory (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatureInventory) > List inventory SKUs eligible for a given MCF feature. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Returns one page. Amazon SP-API · getFeatureInventory · GET /fba/outbound/2020-07-01/features/inventory/{featureName} ## Call it MCP tool call: ```json { "name": "fbaOutbound_getFeatureInventory", "arguments": { "store": "myStore-US", "feature_name": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getFeatureInventory \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feature_name":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feature_name` | string | yes | feature to filter by, e.g. 'BLANK_BOX' or 'BLOCK_AMZL'. Amazon publishes no enum — fbaOutbound_getFeatures is the authoritative list for the store's marketplace. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | | `query_start_date` | string · date-time | | optional ISO-8601 — only SKUs updated since then. | ## Result - `data.featureSkus` — [{sellerSku, fnSku, asin, skuCount, overlappingSkus}] — skuCount is the units available for the feature. - `data.nextToken` — pass back as next_token for the next page (if present). # fbaOutbound_getFeatures (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatures) > List MCF features available in the store's marketplace + seller enrollment. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · getFeatures · GET /fba/outbound/2020-07-01/features ## Call it MCP tool call: ```json { "name": "fbaOutbound_getFeatures", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getFeatures \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | ## Result - `data.features` — list of {featureName, sellerEligible}. # fbaOutbound_getFeatureSKU (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFeatureSKU) > Get the count of one SKU eligible for a given MCF feature. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · getFeatureSKU · GET /fba/outbound/2020-07-01/features/inventory/{featureName}/{sellerSku} ## Call it MCP tool call: ```json { "name": "fbaOutbound_getFeatureSKU", "arguments": { "store": "myStore-US", "feature_name": "", "seller_sku": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getFeatureSKU \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","feature_name":"","seller_sku":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `feature_name` | string | yes | feature to check, e.g. 'BLANK_BOX' or 'BLOCK_AMZL'. Amazon publishes no enum — fbaOutbound_getFeatures is the authoritative list for the store's marketplace. | | `seller_sku` | string | yes | the SKU to check. | ## Result - `data.isEligible` — bool — whether the SKU can use this feature. - `data.ineligibleReasons` — list of reasons when isEligible is false. - `data.skuCount` — number of units available for the feature. - `data.fnSku / data.asin` — the item's fulfillment-network SKU and ASIN. # fbaOutbound_getFulfillmentOrder (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFulfillmentOrder) > Get one MCF fulfillment order with its items and shipments. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · getFulfillmentOrder · GET /fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId} ## Call it MCP tool call: ```json { "name": "fbaOutbound_getFulfillmentOrder", "arguments": { "store": "myStore-US", "seller_fulfillment_order_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getFulfillmentOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_fulfillment_order_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_fulfillment_order_id` | string | yes | the id you assigned when creating the order. | ## Result - `data.fulfillmentOrder` — header incl. fulfillmentOrderStatus. - `data.fulfillmentOrderItems / data.fulfillmentShipments` — detail — shipment packages carry packageNumber for fbaOutbound_getPackageTrackingDetails. # fbaOutbound_getFulfillmentPreview (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getFulfillmentPreview) > Preview an MCF order's fees and fulfillability BEFORE creating it. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · getFulfillmentPreview · POST /fba/outbound/2020-07-01/fulfillmentOrders/preview Always preview first — it shows estimatedFees, isFulfillable, and available shippingSpeedCategory per option. Non-mutating. ## Call it MCP tool call: ```json { "name": "fbaOutbound_getFulfillmentPreview", "arguments": { "store": "myStore-US", "address": {}, "items": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getFulfillmentPreview \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","address":{},"items":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `address` | object | yes | Destination Address — name, addressLine1, postalCode, countryCode (ISO 3166-1 alpha-2) required; city/stateOrRegion/ phone optional. | | `items` | object[] | yes | list of preview items — each {sellerSku, quantity, sellerFulfillmentOrderItemId (your tracking id), optional perUnitDeclaredValue {currencyCode, value}}. | | `shipping_speed_categories` | string[] | | optional list of speed categories to preview; ScheduledDelivery requires include_delivery_windows here and a delivery_window on create. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. | | `include_cod` | boolean | | optional bool — include Cash-On-Delivery previews. | | `include_delivery_windows` | boolean | | optional bool — include scheduledDeliveryInfo. | | `feature_constraints` | object[] | | optional list of {featureName, featureFulfillmentPolicy} objects constraining carrier/packaging: featureName. Allowed: BLOCK_AMZL (block Amazon Logistics; surcharge) \| BLANK_BOX (non-branded packaging) \| OVERBOX \| PACKING_SLIP \| SIGNATURE_CONFIRMATION (US only; extra fee) \| DELIVER_TOGETHER (ship all items together). featureFulfillmentPolicy Required rejects the order when the feature is unavailable. | ## Result - `data.fulfillmentPreviews` — one per shippingSpeedCategory — {shippingSpeedCategory, isFulfillable, isCODCapable, estimatedFees, fulfillmentPreviewShipments, unfulfillablePreviewItems, orderUnfulfillableReasons, scheduledDeliveryInfo}; the last three say why a preview is not fulfillable or when it can arrive. ## Body (Amazon schema) - marketplaceId: string address*: {name*, addressLine1*, addressLine2, addressLine3, city, districtOrCounty, stateOrRegion, postalCode*, countryCode*, phone} items*: [{sellerSku* (max 50 chars), quantity*, perUnitDeclaredValue: {currencyCode*, value*}, sellerFulfillmentOrderItemId* (max 50 chars)}] shippingSpeedCategories: [Standard | Expedited | Priority | ScheduledDelivery] includeCODFulfillmentPreview: boolean includeDeliveryWindows: boolean featureConstraints: [{featureName, featureFulfillmentPolicy: Required | NotRequired}] # fbaOutbound_getPackageTrackingDetails (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_getPackageTrackingDetails) > Get delivery tracking details for one outbound MCF package. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · getPackageTrackingDetails · GET /fba/outbound/2020-07-01/tracking ## Call it MCP tool call: ```json { "name": "fbaOutbound_getPackageTrackingDetails", "arguments": { "store": "myStore-US", "package_number": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_getPackageTrackingDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","package_number":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `package_number` | integer | yes | integer packageNumber from a shipment package (fbaOutbound_getFulfillmentOrder → fulfillmentShipments[].fulfillmentShipmentPackage[]). | ## Result - `data.currentStatus` — Amazon's CurrentStatus (IN_TRANSIT, DELIVERED, RETURNING, UNDELIVERABLE, DELAYED, …), with currentStatusDescription. - `data.trackingNumber / data.carrierCode / data.customerTrackingLink` — the carrier and the buyer-facing tracking link. - `data.trackingEvents` — [{eventDate, eventCode, eventDescription, eventAddress}]. # fbaOutbound_listAllFulfillmentOrders (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_listAllFulfillmentOrders) > List MCF fulfillment orders. Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Returns one Amazon page (mirrors Amazon). Amazon SP-API · listAllFulfillmentOrders · GET /fba/outbound/2020-07-01/fulfillmentOrders Amazon paginates chronologically from query_start_date and may return an EMPTY page with a continuation token for a window with no orders — that is Amazon's own behavior. Pass data.nextToken back as next_token to fetch the next page; keep going until nextToken is null. ## Call it MCP tool call: ```json { "name": "fbaOutbound_listAllFulfillmentOrders", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_listAllFulfillmentOrders \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `query_start_date` | string · date-time | | optional ISO-8601 — only orders updated at/after this. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.fulfillmentOrders` — list of order summaries (may be empty). - `data.nextToken` — pass back as next_token for the next page (if present). # fbaOutbound_listReturnReasonCodes (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_listReturnReasonCodes) > List valid return reason codes for a SKU (call before fbaOutbound_createFulfillmentReturn). Access: **READ** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · listReturnReasonCodes · GET /fba/outbound/2020-07-01/returnReasonCodes ## Call it MCP tool call: ```json { "name": "fbaOutbound_listReturnReasonCodes", "arguments": { "store": "myStore-US", "seller_sku": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_listReturnReasonCodes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_sku":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_sku` | string | yes | the SKU to return. | | `seller_fulfillment_order_id` | string | | optional — scope reasons to one order. | | `language` | string | | optional language tag for translated descriptions. | ## Result - `data.reasonCodeDetails` — list of {returnReasonCode, description, translatedDescription}. # fbaOutbound_updateFulfillmentOrder (https://sellersheetai.com/docs/mcp-api/tools/fbaOutbound_updateFulfillmentOrder) > Update or request shipment for an MCF order that has an order hold. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.fulfillmentOutbound_2020-07-01 Amazon SP-API · updateFulfillmentOrder · PUT /fba/outbound/2020-07-01/fulfillmentOrders/{sellerFulfillmentOrderId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Only works on orders with status that allows updates (e.g. on Hold). Pass fulfillment_action='Ship' to release a held order. ## Call it MCP tool call: ```json { "name": "fbaOutbound_updateFulfillmentOrder", "arguments": { "store": "myStore-US", "seller_fulfillment_order_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaOutbound_updateFulfillmentOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","seller_fulfillment_order_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `seller_fulfillment_order_id` | string | yes | the order to update. | | `displayable_order_id` | string | | optional displayable field updates. | | `displayable_order_date` | string · date-time | | optional displayable field updates. | | `displayable_order_comment` | string | | optional displayable field updates. | | `shipping_speed_category` | string | | optional new speed category. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. Allowed: Standard \| Expedited \| Priority \| ScheduledDelivery. | | `destination_address` | object | | optional new Address. | | `fulfillment_action` | string | | optional — Ship releases a held order. Allowed: Ship \| Hold. Allowed: Ship \| Hold. | | `fulfillment_policy` | string | | optional — what happens to unfulfillable items: FillOrKill cancels the whole order if any item is unfulfillable; FillAll ships every fulfillable item and keeps the order open until the rest ship or are cancelled; FillAllAvailable ships what is available. Allowed: FillOrKill \| FillAll \| FillAllAvailable. | | `ship_from_country_code` | string | | optional ISO alpha-2 origin country. | | `items` | object[] | | optional list of UpdateFulfillmentOrderItem — each {sellerFulfillmentOrderItemId (REQUIRED, maxLength 50 — identifies the item to update), quantity (REQUIRED int), optional sellerSku, giftMessage (maxLength 512), displayableComment (maxLength 250), fulfillmentNetworkSku, orderItemDisposition (whether the item is sellable or unsellable — no enum in the model; Amazon's examples use 'Sellable'), perUnitDeclaredValue / perUnitPrice / perUnitTax — each a Money {currencyCode (ISO 4217), value (decimal STRING)}}. NOTE: this shape differs from create — sellerSku is optional here and sellerFulfillmentOrderItemId is the key. | | `notification_emails` | string[] | | optional list of addresses to notify. | | `feature_constraints` | object[] | | optional list of {featureName, featureFulfillmentPolicy}. featureName. Allowed: BLOCK_AMZL (block Amazon Logistics; surcharge) \| BLANK_BOX (non-branded packaging) \| OVERBOX \| PACKING_SLIP \| SIGNATURE_CONFIRMATION (US only; extra fee) \| DELIVER_TOGETHER (ship all items together). featureFulfillmentPolicy Required rejects the order when the feature is unavailable. | ## Result - `data.sellerFulfillmentOrderId` — the updated order — re-read it with fbaOutbound_getFulfillmentOrder. ## Body (Amazon schema) - marketplaceId: string displayableOrderId: string (max 40 chars) displayableOrderDate: string (date-time) displayableOrderComment: string (max 750 chars) shippingSpeedCategory: Standard | Expedited | Priority | ScheduledDelivery destinationAddress: {name*, addressLine1*, addressLine2, addressLine3, city, districtOrCounty, stateOrRegion, postalCode*, countryCode*, phone} fulfillmentAction: Ship | Hold fulfillmentPolicy: FillOrKill | FillAll | FillAllAvailable shipFromCountryCode: string notificationEmails: [string] (max 64 chars) featureConstraints: [{featureName, featureFulfillmentPolicy: Required | NotRequired}] items: [{sellerSku, sellerFulfillmentOrderItemId* (max 50 chars), quantity*, giftMessage (max 512 chars), displayableComment (max 250 chars), fulfillmentNetworkSku, orderItemDisposition, perUnitDeclaredValue: {currencyCode*, value*}, perUnitPrice: {currencyCode*, value*}, perUnitTax: {currencyCode*, value*}}] # orders_getOrder (https://sellersheetai.com/docs/mcp-api/tools/orders_getOrder) > Get one order (Orders v2026-01-01) with its line items inline (order.orderItems) and any included_data expansions. Access: **READ** · toolset amazon_sp · family sp.orders_2026-01-01 To find orders by date or status use orders_searchOrders. Amazon SP-API · getOrder · GET /orders/2026-01-01/orders/{orderId} ## Call it MCP tool call: ```json { "name": "orders_getOrder", "arguments": { "store": "myStore-US", "order_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/orders_getOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","order_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `order_id` | string | yes | e.g. '113-1234567-8901234'. | | `included_data` | string[] | | expansion selectors; omit for the order and its line items with no expansions. PROCEEDS (revenue breakdown), EXPENSE (costs), PROMOTION (discounts), CANCELLATION, FULFILLMENT (how it ships, plus per-item quantityFulfilled / quantityUnfulfilled), PACKAGES (packages and tracking), TAX, PAYMENT (payment method), FULFILLMENT_ORDERS (linked MCF orders), RECIPIENT (order.recipient.deliveryAddress — city / countryCode / postalCode). Allowed: RECIPIENT \| PROCEEDS \| EXPENSE \| PROMOTION \| CANCELLATION \| FULFILLMENT \| PACKAGES \| TAX \| PAYMENT \| FULFILLMENT_ORDERS. | ## Result - `data.order` — the order — line items at data.order.orderItems[], identifiers under - `data.order.product` — {orderItemId, quantityOrdered, product: {asin, title, sellerSku, condition, price}}. - `data.includedData` — the selectors applied. ## Gotchas - Line items are not an includedData option — they come back on every call. - Read item['product']['sellerSku'], not item['sellerSku']: the identifiers are nested under product, not flat on the item. # orders_searchOrders (https://sellersheetai.com/docs/mcp-api/tools/orders_searchOrders) > Search orders (Orders v2026-01-01): ONE Amazon page plus data.nextToken, the full v2026 filter set, and line items INLINE on each order (order.orderItems) — no separate items call. Access: **READ** · toolset amazon_sp · family sp.orders_2026-01-01 To sync a window, repeat with the same filters and pagination_token = data.nextToken until it is null; for an incremental sync pass last_updated_after = your last watermark. For one known order id use orders_getOrder. Amazon SP-API · searchOrders · GET /orders/2026-01-01/orders ## Call it MCP tool call: ```json { "name": "orders_searchOrders", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/orders_searchOrders \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `created_after` | string · date-time | | ISO 8601 with the Z suffix ('2026-04-20T00:00:00Z') — v2026 rejects a naive timestamp. Exactly ONE of created_after or last_updated_after is required (Amazon refuses none or both). | | `created_before` | string · date-time | | ISO 8601 with the Z suffix ('2026-04-20T00:00:00Z') — v2026 rejects a naive timestamp. Exactly ONE of created_after or last_updated_after is required (Amazon refuses none or both). | | `last_updated_after` | string · date-time | | the same rule; last_updated_after is the incremental-sync watermark. | | `last_updated_before` | string · date-time | | the same rule; last_updated_after is the incremental-sync watermark. | | `fulfillment_statuses` | string[] | | the fulfillment states to keep. v2026 has no orderStatuses filter and no flat orderStatus field — filter here, or pass included_data ['FULFILLMENT'] and read order.fulfillment.fulfillmentStatus. Allowed: PENDING_AVAILABILITY \| PENDING \| UNSHIPPED \| PARTIALLY_SHIPPED \| SHIPPED \| CANCELLED \| UNFULFILLABLE. Allowed: PENDING_AVAILABILITY \| PENDING \| UNSHIPPED \| PARTIALLY_SHIPPED \| SHIPPED \| CANCELLED \| UNFULFILLABLE. | | `marketplace_ids` | object[] | | OMIT it — the search is then scoped to the store ref's marketplace; a list (≤50) searches exactly those marketplaces and mixes their orders. | | `fulfilled_by` | string[] | | who fulfils the order; omit for both. Allowed: MERCHANT \| AMAZON. Allowed: MERCHANT \| AMAZON. | | `included_data` | string[] | | expansion selectors per order, as on orders_getOrder — PACKAGES carries tracking inline. Allowed (the subset that needs no Restricted Data Token): RECIPIENT \| PROCEEDS \| EXPENSE \| PROMOTION \| CANCELLATION \| FULFILLMENT \| PACKAGES \| TAX \| PAYMENT \| FULFILLMENT_ORDERS. Allowed: RECIPIENT \| PROCEEDS \| EXPENSE \| PROMOTION \| CANCELLATION \| FULFILLMENT \| PACKAGES \| TAX \| PAYMENT \| FULFILLMENT_ORDERS. | | `max_results_per_page` | integer | | 1–100 (default 100). | | `pagination_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.orders / data.count` — this page's orders (line items at order.orderItems) and how many. - `data.nextToken` — pass it as pagination_token; null on the last page. - `data.createdBefore / data.lastUpdatedBefore` — the upper bound Amazon actually applied (clamped to ~2 minutes before the request) — whichever is non-null is the "after" watermark of your next incremental sync; use it instead of your own clock or you leave a gap. ## Gotchas - Provide EXACTLY ONE of created_after or last_updated_after (the matching "before" is optional); mixing the two pairs is InvalidInput. # productFees_getMyFeesEstimateForASIN (https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimateForASIN) > Estimate Amazon fees (referral fee + FBA/MFN fees) for a single ASIN at a given price. Access: **READ** · toolset amazon_sp · family sp.productFeesV0 Amazon SP-API · getMyFeesEstimateForASIN · POST /products/fees/v0/items/{Asin}/feesEstimate Uses Product Fees v0 API. Note: ASIN-based estimates use catalog size, which may differ from actual item dimensions. For accurate FBA estimates after sending inventory, use productFees_getMyFeesEstimateForSKU instead. Net margin = price − data.totalFeesEstimate.Amount − COGS; never compute it when data.error is set. ## Call it MCP tool call: ```json { "name": "productFees_getMyFeesEstimateForASIN", "arguments": { "store": "myStore-US", "asin": "", "price": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productFees_getMyFeesEstimateForASIN \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":"","price":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `price` | number | yes | Listing price to estimate fees for (e.g. 29.99). | | `currency` | string | | ISO 4217 currency code for `price`. Omit to use the store marketplace's own currency (AE→AED, GB→GBP, JP→JPY, US→USD, …) — only pass this to override. | | `shippingPrice` | number | | Shipping price included in the estimate (MFN only). Default None. | | `isFba` | boolean | | True for FBA fee estimate, False for MFN (merchant fulfilled). Default False. | | `points` | object | | Amazon Points offered with the purchase — Japan only. Shape {PointsNumber: int, PointsMonetaryValue: {Amount: float, CurrencyCode: str}}. Points reduce the price basis the referral fee is computed on. | | `optionalFulfillmentProgram` | string | | FBA program override, only used when isFba=True; FBA_CORE is the default and FBA_SNL (Small and Light) is sunset — do not pass it. | ## Result - `data.asin` — the queried ASIN. - `data.price` — the price used for estimation. - `data.isFba` — whether FBA or MFN fees were estimated. - `data.status` — 'Success' or error status from Amazon. - `data.totalFeesEstimate` — {Amount, CurrencyCode} — total estimated fees. - `data.error` — null on success; on failure Amazon's {Type, Code, Message} saying WHY there is no estimate, and the Message is in notification.message too. A refused estimate is not zero fees — never write a blank or 0 fee to your sheet when data.error is set, because any margin computed from it is wrong. - `data.feeDetail` — list of per-fee breakdown objects, each with: - FeeType: e.g. 'ReferralFee', 'FBAFees', 'VariableClosingFee' - FeeAmount: {Amount, CurrencyCode} - FinalFee: {Amount, CurrencyCode} ## Body (Amazon schema) - FeesEstimateRequest: {MarketplaceId*, IsAmazonFulfilled, PriceToEstimateFees*: {ListingPrice*, Shipping, Points}, Identifier*, OptionalFulfillmentProgram: FBA_CORE | FBA_SNL | FBA_EFN} # productFees_getMyFeesEstimateForSKU (https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimateForSKU) > Estimate Amazon fees (referral fee + FBA/MFN fees) for a seller SKU at a given price. Access: **READ** · toolset amazon_sp · family sp.productFeesV0 Amazon SP-API · getMyFeesEstimateForSKU · POST /products/fees/v0/listings/{SellerSKU}/feesEstimate Uses Product Fees v0 API. SKU-based estimates use actual item measurements after the item has been sent to Amazon — more accurate than ASIN-based estimates for FBA sellers. Pass isFba=True for FBA items. Net margin = price − data.totalFeesEstimate.Amount − COGS; never compute it when data.error is set. ## Call it MCP tool call: ```json { "name": "productFees_getMyFeesEstimateForSKU", "arguments": { "store": "myStore-US", "sellerSku": "", "price": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productFees_getMyFeesEstimateForSKU \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sellerSku":"","price":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sellerSku` | string | yes | Seller's SKU for the item (URL encoding handled automatically). | | `price` | number | yes | Listing price to estimate fees for (e.g. 29.99). | | `currency` | string | | ISO 4217 currency code for `price`. Omit to use the store marketplace's own currency (AE→AED, GB→GBP, JP→JPY, US→USD, …) — only pass this to override. | | `shippingPrice` | number | | Shipping price included in the estimate (MFN only). Default None. | | `isFba` | boolean | | True for FBA fee estimate, False for MFN (merchant fulfilled). Default False. | | `points` | object | | Amazon Points offered with the purchase — Japan only. Shape {PointsNumber: int, PointsMonetaryValue: {Amount: float, CurrencyCode: str}}. Points reduce the price basis the referral fee is computed on. | | `optionalFulfillmentProgram` | string | | FBA program override, only used when isFba=True; FBA_CORE is the default and FBA_SNL (Small and Light) is sunset — do not pass it. | ## Result - `data.sellerSku` — the queried SKU. - `data.price` — the price used for estimation. - `data.isFba` — whether FBA or MFN fees were estimated. - `data.status` — 'Success' or error status from Amazon. - `data.totalFeesEstimate` — {Amount, CurrencyCode} — total estimated fees. - `data.error` — null on success; on failure Amazon's {Type, Code, Message} saying WHY there is no estimate, and the Message is in notification.message too. A refused estimate is not zero fees — never write a blank or 0 fee to your sheet when data.error is set, because any margin computed from it is wrong. - `data.feeDetail` — list of per-fee breakdown objects, each with: - FeeType: e.g. 'ReferralFee', 'FBAFees', 'VariableClosingFee' - FeeAmount: {Amount, CurrencyCode} - FinalFee: {Amount, CurrencyCode} ## Body (Amazon schema) - FeesEstimateRequest: {MarketplaceId*, IsAmazonFulfilled, PriceToEstimateFees*: {ListingPrice*, Shipping, Points}, Identifier*, OptionalFulfillmentProgram: FBA_CORE | FBA_SNL | FBA_EFN} # productFees_getMyFeesEstimates (https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimates) > Amazon fee estimates for a batch of items in one request (Product Fees v0) — the batch form of productFees_getMyFeesEstimateForASIN and productFees_getMyFeesEstimateForSKU. Access: **READ** · toolset amazon_sp · family sp.productFeesV0 Amazon SP-API · getMyFeesEstimates · POST /products/fees/v0/feesEstimate ## Call it MCP tool call: ```json { "name": "productFees_getMyFeesEstimates", "arguments": { "store": "myStore-US", "estimates": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productFees_getMyFeesEstimates \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","estimates":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `estimates` | object[] | yes | [{identifier (required: an ASIN or a SKU, auto-detected — an ASIN matches ^B[0-9A-Z]{9}$ — and echoed as FeesEstimateIdentifier), price (required listing price), currency (ISO 4217; defaults to the marketplace's), is_fba (true for FBA, false for MFN), shipping_price (MFN only), points (Japan only: {PointsNumber, PointsMonetaryValue: {Amount, CurrencyCode}}), marketplace_id (defaults to the store's), optional_fulfillment_program (FBA only; FBA_SNL is sunset)}], e.g. [{"identifier": "B0XXXXXXXX", "price": 29.99, "is_fba": true}]. The camelCase spellings (isFba, shippingPrice, marketplaceId, optionalFulfillmentProgram) work too; any other key is dropped. A 10-digit ISBN ASIN does not match the pattern and is sent as a SellerSKU — estimate it with productFees_getMyFeesEstimateForASIN. | ## Result - `data.ok` — the identifiers Amazon estimated. - `data.failed` — [{identifier, status, reason}] for every identifier without a usable estimate — Status not 'Success' (reason carries Amazon's Error.Code and Error.Message) or no result at all (status 'NoResponse'; an empty result list puts EVERY identifier here); notification.type is 'warning' whenever it is non-empty. Never read a missing fee as zero — a margin computed from a blank estimate is wrong. - `data.results` — [{FeesEstimateIdentifier, FeesEstimateResult: {Status, FeesEstimate: {TotalFeesEstimate: {Amount, CurrencyCode}, FeeDetailList}}}] — write TotalFeesEstimate.Amount per identifier. ## Body (Amazon schema): [FeesEstimateByIdRequest], each item - FeesEstimateRequest: {MarketplaceId*, IsAmazonFulfilled, PriceToEstimateFees*: {ListingPrice*, Shipping, Points}, Identifier*, OptionalFulfillmentProgram: FBA_CORE | FBA_SNL | FBA_EFN} IdType*: ASIN | SellerSKU IdValue*: string # productPricing_getCompetitivePricing (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getCompetitivePricing) > Get competitive pricing for up to 20 ASINs or SKUs (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getCompetitivePricing · GET /products/pricing/v0/competitivePrice Returns the competitive price (Buy Box price) and number of competing offers. More useful than productPricing_getPricing for understanding market position. ## Call it MCP tool call: ```json { "name": "productPricing_getCompetitivePricing", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getCompetitivePricing \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asins` | object[] | | List of up to 20 ASINs. Use this OR skus, not both. | | `skus` | object[] | | List of up to 20 seller SKUs. Use this OR asins, not both. | | `customerType` | string | | whose point of view the prices are from — consumer or business buyers. Omit for Amazon's default (Consumer). Allowed: Consumer \| Business. Allowed: Consumer \| Business. | ## Result - `notification.type` — 'warning' when data.failed is non-empty, else 'success'. - `data.pricing` — list of pricing objects, each with: - ASIN or SellerSKU - Product.CompetitivePricing.CompetitivePrices: list of competitive prices - Product.CompetitivePricing.NumberOfOfferListings: offer count by condition - Product.CompetitivePricing.TradeInValue (if applicable) - `data.ok` — identifiers Amazon returned a product for. - `data.failed` — [{identifier, status, reason}] for identifiers Amazon did NOT resolve. Amazon answers HTTP 200 even for a bad ASIN — it comes back as status='ClientError', as a "successful" item with no Product body, or with no envelope at all (status='NoResponse'). Either way it lands here and notification.type is 'warning', not 'success'. Never read a missing competitive price as "no competitors" without checking data.failed first. ## Workflow - 1. Call productPricing_getCompetitivePricing in batches of up to 20. 2. Compare against your current prices to identify repricing opportunities. ## Params (Amazon schema) - MarketplaceId*: string Asins: [string] (max 20) Skus: [string] (max 20) ItemType*: Asin | Sku CustomerType: Consumer | Business # productPricing_getCompetitiveSummary (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getCompetitiveSummary) > Competitive summary for 1–20 ASINs (Product Pricing v2022-05-01): featured buying options (who wins the featured offer, at what price), lowest-priced offers, reference prices and s Access: **READ** · toolset amazon_sp · family sp.productPricing_2022-05-01 imilar items, per includedData. The server fills the batch uri, method and marketplaceId — pass only asin and includedData per request. Prefer it over productPricing_getItemOffersBatch when you need who holds the featured offer per segment or reference prices (WasPrice, CompetitivePriceThreshold); getItemOffersBatch returns the v0 offer list with Buy Box prices. Amazon SP-API · getCompetitiveSummary · POST /batches/products/pricing/2022-05-01/items/competitiveSummary ## Call it MCP tool call: ```json { "name": "productPricing_getCompetitiveSummary", "arguments": { "store": "myStore-US", "requests_": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getCompetitiveSummary \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","requests_":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `requests_` | object[] | yes | 1–20 of {asin (required), includedData (required, non-empty; Allowed: featuredBuyingOptions \| referencePrices \| lowestPricedOffers \| similarItems), marketplaceId (optional; defaults to the store's), lowestPricedOffersInputs (optional, max 5, with lowestPricedOffers only: [{itemCondition New \| Used \| Collectible \| Refurbished \| Club, offerType 'Consumer'}])}, e.g. [{"asin": "B0XXXXXXXX", "includedData": ["featuredBuyingOptions"]}]. | ## Result - `data.ok` — the ASINs Amazon accepted (statusCode 200, no errors). - `data.failed` — [{identifier, status, reason}] for every ASIN that failed at the transport level — statusCode not 200, a body.errors list, or no response envelope (status 'NoResponse'); notification.type is 'warning' whenever it is non-empty. - `data.responses` — per ASIN, in request order — {status: {statusCode, reasonPhrase}, - `data.responses.body` — {asin, marketplaceId (which request this answers — competitiveSummary does not echo a request object), featuredBuyingOptions: [{buyingOptionType 'New', segmentedFeaturedOffers}], lowestPricedOffers, referencePrices: [{name, price}] (CompetitivePriceThreshold, WasPrice …), similarItems, errors}}. ## Body (Amazon schema): {requests: [CompetitiveSummaryRequest]} (1–20), each item - asin*: string marketplaceId*: string includedData*: [featuredBuyingOptions | referencePrices | lowestPricedOffers | similarItems] (min 1) lowestPricedOffersInputs: [{itemCondition*, offerType*: Consumer}] (max 5) lowestPricedOffersInputs.itemCondition: New | Used | Collectible | Refurbished | Club method*: GET | PUT | PATCH | DELETE | POST uri*: string (6–512 chars) ## Gotchas - This endpoint cannot confirm an ASIN exists: an unknown ASIN returns 200 with featuredBuyingOptions [] — byte-identical to a valid ASIN with no featured offer — so an empty list proves nothing and data.ok is not proof of validity. When identifier validity matters, productPricing_getPricing's data.failed says. # productPricing_getFeaturedOfferExpectedPriceBatch (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getFeaturedOfferExpectedPriceBatch) > Featured offer expected price (FOEP) for 1–20 seller SKUs (Product Pricing v2022-05-01) — the price at or below which each SKU is expected to win the featured offer, an input for r Access: **READ** · toolset amazon_sp · family sp.productPricing_2022-05-01 epricing (listings_patchListingsItem), not a guarantee. The server fills the batch uri, method and marketplaceId — pass only sku (and an optional segment) per request. Amazon SP-API · getFeaturedOfferExpectedPriceBatch · POST /batches/products/pricing/2022-05-01/offer/featuredOfferExpectedPrice ## Call it MCP tool call: ```json { "name": "productPricing_getFeaturedOfferExpectedPriceBatch", "arguments": { "store": "myStore-US", "requests_": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getFeaturedOfferExpectedPriceBatch \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","requests_":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `requests_` | object[] | yes | 1–20 of {sku (required), marketplaceId (optional; defaults to the store's), segment (optional location scope: {segmentDetails: {sampleLocation: {postalCode: {countryCode, value}}}})}, e.g. [{"sku": "MY-SKU-001"}]. | ## Result - `data.ok` — the SKUs Amazon accepted (statusCode 200, no errors). - `data.failed` — [{identifier, status, reason}] for transport failures — statusCode not 200 (a bogus SKU lands here: 400 with body.errors code InvalidInput), a body.errors list, or no response envelope (status 'NoResponse'); notification.type is 'warning' whenever it is non-empty. - `data.result_statuses` — [{sku, resultStatus, has_price}], one per featuredOfferExpectedPriceResults entry. featuredOfferExpectedPrice is present ONLY when resultStatus is VALID_FOEP. NO_COMPETING_OFFER is a legitimate success with no price — you hold the featured offer unopposed, and currentFeaturedOffer shows at what price; the other statuses are OFFER_NOT_ELIGIBLE, OFFER_NOT_FOUND and ASIN_NOT_ELIGIBLE. Never read a blank price as "no repricing needed" — this list says WHY there is none. - `data.responses` — per SKU — {request: {marketplaceId, sku, segment} (echoed, to map a response to its SKU), status: {statusCode, reasonPhrase}, body: {offerIdentifier: {marketplaceId, sku, asin}, featuredOfferExpectedPriceResults: [{resultStatus, - `data.responses.featuredOfferExpectedPrice` — {listingPrice: {amount, currencyCode}}, currentFeaturedOffer, competingFeaturedOffer}], errors}}. ## Body (Amazon schema): {requests: [FeaturedOfferExpectedPriceRequest]} (min 1), each item - uri*: string method*: GET | PUT | PATCH | DELETE | POST body: object headers: object marketplaceId*: string sku*: string segment: {segmentDetails: {glanceViewWeightPercentage, sampleLocation}} # productPricing_getItemOffers (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getItemOffers) > Get lowest-priced offers for a single ASIN (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getItemOffers · GET /products/pricing/v0/items/{Asin}/offers Returns the lowest-priced offers on this ASIN (data.summary.TotalOfferCount is the full count) with Buy Box prices — use it for competitive analysis across all sellers on a product; check whether you are in data.offers and how your price compares. ## Call it MCP tool call: ```json { "name": "productPricing_getItemOffers", "arguments": { "store": "myStore-US", "asin": "", "itemCondition": "New" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getItemOffers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asin":"","itemCondition":"New"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asin` | string | yes | the ASIN (e.g. 'B0XXXXXXXX'). | | `itemCondition` | string | yes | the condition of the offers returned. Allowed: New \| Used \| Collectible \| Refurbished \| Club. Allowed: New \| Used \| Collectible \| Refurbished \| Club. | | `customerType` | string | | consumer or business offers. Omit for Amazon's default (Consumer). Allowed: Consumer \| Business. Allowed: Consumer \| Business. | ## Result - `notification.type` — 'warning' when data.found is false, else 'success'. - `data.found` — false when Amazon resolved NOTHING for this ASIN (empty payload or a ClientError envelope — a typo, or an ASIN absent from this marketplace). This is NOT the same as a live ASIN with zero active offers, which returns found=true with an empty data.offers list and a real data.summary. When found is false, do not write a blank or a zero price to your sheet — check the ASIN first. - `data.asin` — the queried ASIN. - `data.summary` — offer summary including: - TotalOfferCount: total number of offers - NumberOfOffers: offer count by condition and fulfillment channel - LowestPrices: lowest prices by condition/channel - BuyBoxPrices: current Buy Box prices - BuyBoxEligibleOffers: offers eligible for Buy Box - `data.offers` — list of individual offers with price, condition, shipping, IsFeaturedMerchant. # productPricing_getItemOffersBatch (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getItemOffersBatch) > Get lowest-priced offers for a batch of ASINs in a single request (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getItemOffersBatch · POST /batches/products/pricing/v0/itemOffers More efficient than calling productPricing_getItemOffers repeatedly. Batch up to 20 ASINs. ## Call it MCP tool call: ```json { "name": "productPricing_getItemOffersBatch", "arguments": { "store": "myStore-US", "requests_": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getItemOffersBatch \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","requests_":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `requests_` | object[] | yes | List of up to 20 batch request dicts. Each must include: - uri: str — '/products/pricing/v0/items/{asin}/offers' (fill in ASIN) - method: str — 'GET' - ItemCondition: str — Allowed: New \| Used \| Collectible \| Refurbished \| Club - MarketplaceId: str (optional) — defaults to the store's marketplace; pass only to override. - CustomerType: str (optional) — Allowed: Consumer \| Business | ## Result - `notification.type` — 'warning' whenever data.failed is non-empty, else 'success'. - `data.ok` — ASINs whose request Amazon accepted (statusCode 200, no errors). - `data.failed` — [{identifier, status, reason}] for every ASIN that failed at the TRANSPORT level — statusCode != 200 (a bogus ASIN 400s here with body.errors [{code: 'InvalidInput', ...}]), a body.errors list, or no response envelope at all (status='NoResponse', including when the whole payload came back empty). Body CONTENT is never judged: a listing with a real Summary and an empty Offers list is a genuine zero-offer answer, not a failure. Note the success body nests the real payload under body.payload. Never read a missing Buy Box price as "no Buy Box" without checking data.failed first. - `data.responses` — list of per-ASIN responses, each with: - request.Asin / request.ItemCondition: the request this entry answers - status.statusCode: 200 means success - body.payload.Summary.BuyBoxPrices: current Buy Box prices - body.payload.Summary.LowestPrices: lowest prices by channel/condition - body.payload.Offers: individual offer details - body.errors: Amazon's error list when this entry failed NOTE the body.payload nesting — reading body.Summary directly is undefined. ## Workflow - 1. Build requests_ list (up to 20 ASINs per call). 2. Call productPricing_getItemOffersBatch. ## Body (Amazon schema): {requests: [ItemOffersRequest]} (1–20), each item - uri*: string method*: GET | PUT | PATCH | DELETE | POST headers: object MarketplaceId*: string ItemCondition*: New | Used | Collectible | Refurbished | Club CustomerType: Consumer | Business # productPricing_getListingOffers (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getListingOffers) > Get lowest-priced offers for a single seller SKU listing (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getListingOffers · GET /products/pricing/v0/listings/{SellerSKU}/offers Returns the lowest-priced offers from every seller on the ASIN this SKU is listed against (data.summary.TotalOfferCount is the full count), plus Buy Box prices. For an ASIN you do not list use productPricing_getItemOffers. ## Call it MCP tool call: ```json { "name": "productPricing_getListingOffers", "arguments": { "store": "myStore-US", "sellerSku": "", "itemCondition": "New" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getListingOffers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sellerSku":"","itemCondition":"New"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `sellerSku` | string | yes | Seller's SKU for the listing. | | `itemCondition` | string | yes | the condition of the offers returned. Allowed: New \| Used \| Collectible \| Refurbished \| Club. Allowed: New \| Used \| Collectible \| Refurbished \| Club. | | `customerType` | string | | consumer or business offers. Omit for Amazon's default (Consumer). Allowed: Consumer \| Business. Allowed: Consumer \| Business. | ## Result - `notification.type` — 'warning' when data.found is false, else 'success'. - `data.found` — false when Amazon resolved NOTHING for this SKU (empty payload or a ClientError envelope — a typo, or a SKU absent from this marketplace). This is NOT the same as a live listing with zero active offers, which returns found=true with an empty data.offers list and a real data.summary. When found is false, do not write a blank or a zero price to your sheet — check the SKU first. - `data.sellerSku` — the queried SKU. - `data.summary` — offer summary including: - TotalOfferCount: total number of offers - NumberOfOffers: offer count by condition and fulfillment channel - LowestPrices: lowest prices by condition/channel - BuyBoxPrices: current Buy Box prices - BuyBoxEligibleOffers: offers eligible for Buy Box - `data.offers` — list of individual offers with price, condition, shipping, seller info. # productPricing_getListingOffersBatch (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getListingOffersBatch) > Get lowest-priced offers for a batch of SKU listings in a single request (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getListingOffersBatch · POST /batches/products/pricing/v0/listingOffers More efficient than calling productPricing_getListingOffers repeatedly. Batch up to 20 SKUs. ## Call it MCP tool call: ```json { "name": "productPricing_getListingOffersBatch", "arguments": { "store": "myStore-US", "requests_": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getListingOffersBatch \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","requests_":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `requests_` | object[] | yes | List of up to 20 batch request dicts. Each must include: - uri: str — '/products/pricing/v0/listings/{sellerSku}/offers' (fill in SKU, URL-encode the SKU if it contains special characters) - method: str — 'GET' - ItemCondition: str — Allowed: New \| Used \| Collectible \| Refurbished \| Club - MarketplaceId: str (optional) — defaults to the store's marketplace; pass only to override. - CustomerType: str (optional) — Allowed: Consumer \| Business | ## Result - `notification.type` — 'warning' whenever data.failed is non-empty, else 'success'. - `data.ok` — SKUs whose request Amazon accepted (statusCode 200, no errors). - `data.failed` — [{identifier, status, reason}] for every SKU that failed at the TRANSPORT level — statusCode != 200, a body.errors list, or no response envelope at all (status='NoResponse', including when the whole payload came back empty). Body CONTENT is never judged: a listing with a real Summary and an empty Offers list is a genuine zero-offer answer, not a failure. Note the success body nests the real payload under body.payload. Never read a missing Buy Box price as "no Buy Box" without checking data.failed first. - `data.responses` — list of per-SKU responses, each with: - request.SellerSKU / request.ItemCondition: the request this entry answers - status.statusCode: 200 means success - body.payload.Summary.BuyBoxPrices: current Buy Box prices - body.payload.Summary.LowestPrices: lowest prices by channel/condition - body.payload.Offers: individual offer details - body.errors: Amazon's error list when this entry failed NOTE the body.payload nesting — reading body.Summary directly is undefined. ## Workflow - 1. Build requests_ list (up to 20 SKUs per call). 2. Call productPricing_getListingOffersBatch. ## Body (Amazon schema): {requests: [ListingOffersRequest]} (1–20), each item - uri*: string method*: GET | PUT | PATCH | DELETE | POST headers: object MarketplaceId*: string ItemCondition*: New | Used | Collectible | Refurbished | Club CustomerType: Consumer | Business # productPricing_getPricing (https://sellersheetai.com/docs/mcp-api/tools/productPricing_getPricing) > Get pricing information for up to 20 ASINs or SKUs (Product Pricing v0). Access: **READ** · toolset amazon_sp · family sp.productPricingV0 Amazon SP-API · getPricing · GET /products/pricing/v0/price Returns the seller's own listing prices. Use productPricing_getCompetitivePricing to see competitor prices, or productPricing_getItemOffers / productPricing_getListingOffers for all seller offers. ## Call it MCP tool call: ```json { "name": "productPricing_getPricing", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/productPricing_getPricing \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `asins` | object[] | | List of up to 20 ASINs. Use this OR skus, not both. | | `skus` | object[] | | List of up to 20 seller SKUs. Use this OR asins, not both. | | `itemCondition` | string | | filters the offers by condition. Allowed: New \| Used \| Collectible \| Refurbished \| Club. Allowed: New \| Used \| Collectible \| Refurbished \| Club. | | `offerType` | string | | the seller's consumer or business offer. Omit for Amazon's default (B2C). Allowed: B2C \| B2B. Allowed: B2C \| B2B. | ## Result - `data.pricing` — list of pricing objects, each with: - ASIN or SellerSKU - Product.Offers: list of offer details with BuyingPrice, RegularPrice, FulfillmentChannel - `data.ok` — identifiers Amazon returned a product for. - `data.failed` — [{identifier, status, reason}] for identifiers Amazon did NOT resolve. Amazon answers HTTP 200 even for a bad ASIN — it comes back as status='ClientError', as a "successful" item with no Product body, or with no envelope at all (status='NoResponse'; an empty payload puts EVERY requested identifier here). Either way it lands here and notification.type is 'warning', not 'success'. Never read a missing price as "no offers" without checking data.failed first. - `data.no_offers` — identifiers Amazon resolved (status Success, with a Product) but returned NO Offers for. getPricing does NOT validate ASIN existence — a bogus ASIN and a real ASIN you simply don't list look identical here, so these are reported rather than failed. Cross-check doubtful ASINs via productPricing_getCompetitivePricing, which rejects invalid ones as ClientError. ## Params (Amazon schema) - MarketplaceId*: string Asins: [string] (max 20) Skus: [string] (max 20) ItemType*: Asin | Sku ItemCondition: New | Used | Collectible | Refurbished | Club OfferType: B2C | B2B # replenishment_getSellingPartnerMetrics (https://sellersheetai.com/docs/mcp-api/tools/replenishment_getSellingPartnerMetrics) > Get aggregated, account-level Subscribe & Save replenishment metrics for the selling partner. Access: **READ** · toolset amazon_sp · family sp.replenishment-2022-11-07 Amazon SP-API · getSellingPartnerMetrics · POST /replenishment/2022-11-07/sellingPartners/metrics/search Returns program-wide numbers (active subscriptions, subscription revenue, OOS loss, retention, revenue penetration) — NOT per-offer data. For per-ASIN drill-down use replenishment_listOfferMetrics. ## Call it MCP tool call: ```json { "name": "replenishment_getSellingPartnerMetrics", "arguments": { "store": "myStore-US", "timeInterval": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/replenishment_getSellingPartnerMetrics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","timeInterval":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `timeInterval` | object | yes | {startDate, endDate}, both ISO 8601 datetimes with timezone, e.g. {"startDate": "2026-04-01T00:00:00Z", "endDate": "2026-04-30T00:00:00Z"}. | | `timePeriodType` | string | | PERFORMANCE (backward-looking; the default when omitted) or FORECAST (forward-looking projection). Allowed: PERFORMANCE \| FORECAST. | | `aggregationFrequency` | string | | how to group rows in the response. Amazon REQUIRES it when timePeriodType=PERFORMANCE (else it 400s "aggregationFrequency is required for PERFORMANCE timePeriodType"); omit it with FORECAST. startDate / endDate are widened to whole buckets (WEEK = Monday–Sunday, MONTH = the calendar month, and so on). Allowed: DAY \| WEEK \| MONTH \| QUARTER \| YEAR. Allowed: DAY \| WEEK \| MONTH \| QUARTER \| YEAR. | | `programTypes` | string[] | | omit — SUBSCRIBE_AND_SAVE, the only value, is sent for you. | | `metrics` | string[] | | optional allowlist of metric names; omit for all. Allowed: SHIPPED_SUBSCRIPTION_UNITS \| TOTAL_SUBSCRIPTIONS_REVENUE \| ACTIVE_SUBSCRIPTIONS \| NOT_DELIVERED_DUE_TO_OOS \| SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REVENUE \| LOST_REVENUE_DUE_TO_OOS \| SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REORDERS \| COUPONS_REVENUE_PENETRATION \| REVENUE_BY_DELIVERIES \| SUBSCRIBER_RETENTION \| REVENUE_PENETRATION_BY_SELLER_FUNDING \| SHARE_OF_COUPON_SUBSCRIPTIONS \| SUBSCRIBER_LIFETIME_VALUE_BY_CUSTOMER_SEGMENT \| SIGNUP_CONVERSION_BY_SELLER_FUNDING \| REVENUE_PENETRATION. Allowed: SHIPPED_SUBSCRIPTION_UNITS \| TOTAL_SUBSCRIPTIONS_REVENUE \| ACTIVE_SUBSCRIPTIONS \| NOT_DELIVERED_DUE_TO_OOS \| SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REVENUE \| LOST_REVENUE_DUE_TO_OOS \| SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REORDERS \| COUPONS_REVENUE_PENETRATION \| REVENUE_BY_DELIVERIES \| SUBSCRIBER_RETENTION \| REVENUE_PENETRATION_BY_SELLER_FUNDING \| SHARE_OF_COUPON_SUBSCRIPTIONS \| SUBSCRIBER_LIFETIME_VALUE_BY_CUSTOMER_SEGMENT \| SIGNUP_CONVERSION_BY_SELLER_FUNDING \| REVENUE_PENETRATION. | | `filters` | object | | Optional dict (each list maxItems 20, minItems 1): {"asins": [...], "skus": [...] (sellers only), "fulfillmentChannelTypes": [...] (each AMAZON \| MERCHANT; sellers only), "brandNames": [...] (US only), "productGroups": [...] (vendors only)}. | | `marketplaceId` | string | | optional Amazon marketplaceId; defaults to the store ref's marketplace. | ## Result - `data.result.metrics[]` — per-interval objects (activeSubscriptions, totalSubscriptionsRevenue, shippedSubscriptionUnits, notDeliveredDueToOOS, lostRevenueDueToOOS, subscriberRetentionFor30Days/90Days, revenuePenetration, timeInterval, currencyCode, ...). ## Body (Amazon schema) - aggregationFrequency: DAY | WEEK | MONTH | QUARTER | YEAR timeInterval*: {startDate*, endDate*} metrics: [SHIPPED_SUBSCRIPTION_UNITS | TOTAL_SUBSCRIPTIONS_REVENUE | ACTIVE_SUBSCRIPTIONS | NOT_DELIVERED_DUE_TO_OOS | SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REVENUE | LOST_REVENUE_DUE_TO_OOS | SUBSCRIBER_NON_SUBSCRIBER_AVERAGE_REORDERS | COUPONS_REVENUE_PENETRATION | REVENUE_BY_DELIVERIES | SUBSCRIBER_RETENTION | REVENUE_PENETRATION_BY_SELLER_FUNDING | SHARE_OF_COUPON_SUBSCRIPTIONS | SUBSCRIBER_LIFETIME_VALUE_BY_CUSTOMER_SEGMENT | SIGNUP_CONVERSION_BY_SELLER_FUNDING | REVENUE_PENETRATION] (min 1) filters: {asins: [string] (1–20), skus: [string] (1–20), fulfillmentChannelTypes: [AMAZON | MERCHANT] (1–2), brandNames: [string] (1–20), productGroups: [string] (1–20)} timePeriodType*: PERFORMANCE | FORECAST marketplaceId*: string programTypes*: [SUBSCRIBE_AND_SAVE] (min 1) # replenishment_listOfferMetrics (https://sellersheetai.com/docs/mcp-api/tools/replenishment_listOfferMetrics) > List Subscribe & Save replenishment metrics per offer (ASIN/SKU). Access: **READ** · toolset amazon_sp · family sp.replenishment-2022-11-07 Amazon SP-API · listOfferMetrics · POST /replenishment/2022-11-07/offers/metrics/search Drill into per-offer performance (and forecast) to see which products carry the program. Pass the filters as flat arguments; the server nests them under Amazon's filters and fills marketplaceId, programTypes and (when omitted) timePeriodType=PERFORMANCE. ## Call it MCP tool call: ```json { "name": "replenishment_listOfferMetrics", "arguments": { "store": "myStore-US", "timeInterval": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/replenishment_listOfferMetrics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","timeInterval":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `timeInterval` | object | yes | {startDate, endDate}, ISO 8601 datetimes with timezone, e.g. {"startDate": "2026-04-01T00:00:00Z", "endDate": "2026-04-15T00:00:00Z"}. | | `timePeriodType` | string | | PERFORMANCE (historical; the default when omitted) or FORECAST (fills the next30/60/90Day* fields). | | `aggregationFrequency` | string | | optional row grouping, PERFORMANCE only — omit it with FORECAST. | | `programTypes` | object[] | | omit — SUBSCRIBE_AND_SAVE, the only value, is sent for you. | | `asins` | object[] | | Filter by ASIN list. maxItems 20. | | `skus` | object[] | | Filter by SKU list (sellers only). maxItems 20. | | `fulfillmentChannelTypes` | object[] | | Filter list (sellers only), at most 2 values. | | `brandNames` | object[] | | Filter list (US marketplace only). maxItems 20. | | `productGroups` | object[] | | Filter list (vendors only). maxItems 20. | | `sort` | object | | Optional {"order": ASC or DESC, "key": one of the sort keys the Body block lists}. | | `pageSize` | integer | | Results per page → pagination.limit. 1-500; default 20. | | `offset` | integer | | Pagination offset → pagination.offset. 0-9000; default 0. | | `marketplaceId` | string | | optional Amazon marketplaceId; defaults to the store ref's marketplace. | ## Result - `data.result.offers[]` — per-offer metrics (asin, sku, fulfillmentChannelType, brandName, productGroup, activeSubscriptions, totalSubscriptionsRevenue, shippedSubscriptionUnits, notDeliveredDueToOOS, revenuePenetration, next30/60/90DayTotalSubscriptionsRevenue, next30/60/90DayShippedSubscriptionUnits, timeInterval, currencyCode, ...). - `data.result.pagination.totalResults` — total matching offers (for paging). ## Body (Amazon schema) - pagination*: {limit* (1–500), offset* (0–9000)} sort: {order*: ASC | DESC, key*} sort.key: SHIPPED_SUBSCRIPTION_UNITS | TOTAL_SUBSCRIPTIONS_REVENUE | ACTIVE_SUBSCRIPTIONS | NEXT_90DAYS_SHIPPED_SUBSCRIPTION_UNITS | NEXT_60DAYS_SHIPPED_SUBSCRIPTION_UNITS | NEXT_30DAYS_SHIPPED_SUBSCRIPTION_UNITS | NEXT_90DAYS_TOTAL_SUBSCRIPTIONS_REVENUE | NEXT_60DAYS_TOTAL_SUBSCRIPTIONS_REVENUE | NEXT_30DAYS_TOTAL_SUBSCRIPTIONS_REVENUE filters*: {aggregationFrequency: DAY | WEEK | MONTH | QUARTER | YEAR, timeInterval*: {startDate*, endDate*}, timePeriodType*: PERFORMANCE | FORECAST, marketplaceId*, programTypes*: [SUBSCRIBE_AND_SAVE] (min 1), asins: [string] (1–20), skus: [string] (1–20), fulfillmentChannelTypes: [AMAZON | MERCHANT] (1–2), brandNames: [string] (1–20), productGroups: [string] (1–20)} # replenishment_listOffers (https://sellersheetai.com/docs/mcp-api/tools/replenishment_listOffers) > List Subscribe & Save offers with eligibility, pricing, inventory, program config, and delivery forecasts. Access: **READ** · toolset amazon_sp · family sp.replenishment-2022-11-07 Amazon SP-API · listOffers · POST /replenishment/2022-11-07/offers/search Shows which products are eligible for Subscribe & Save plus per-offer config (discount funding, auto-enrollment, upcoming deliveries). Pass the filters as flat arguments; the server nests them under Amazon's filters and fills marketplaceId and programTypes. ## Call it MCP tool call: ```json { "name": "replenishment_listOffers", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/replenishment_listOffers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `programTypes` | object[] | | omit — SUBSCRIBE_AND_SAVE, the only value, is sent for you. | | `asins` | object[] | | Filter by ASIN list. maxItems 20. | | `skus` | object[] | | Filter by SKU list (sellers only). maxItems 20. | | `eligibilities` | object[] | | Filter by eligibility status (this is an ARRAY, not a single value). Allowed: ELIGIBLE \| INELIGIBLE \| SUSPENDED \| REPLENISHMENT_ONLY_ORDERING. | | `preferences` | object | | Preference filter {"autoEnrollment": [<...>]} (opted-in or opted-out offers). | | `promotions` | object | | Discount-funding percentage filters, e.g. {"sellingPartnerFundedBaseDiscount": {"percentage": [5, 10]}} — any of the four discount keys the Body block lists, each {"percentage": [int,...]} maxItems 10. | | `deliveriesConditions` | object[] | | Delivery-health filter list (next-30-day delivery conditions). | | `sort` | object | | Optional {"order": ASC or DESC, "key": one of the sort keys the Body block lists}. | | `pageSize` | integer | | Results per page → pagination.limit. 1-100; default 20. | | `offset` | integer | | Pagination offset → pagination.offset. 0-9000; default 0. | | `marketplaceId` | string | | optional Amazon marketplaceId; defaults to the store ref's marketplace. | ## Result - `data.result.offers[]` — per-offer data (sku, asin, marketplaceId, eligibility, offerProgramConfiguration.{preferences.autoEnrollment, promotions.*FundedBaseDiscount.percentage, enrollmentMethod (MANUAL|AUTOMATIC)}, programType, vendorCodes, price, priceCurrencyCode, inventory, stockRisk, deliveriesConditions[].{condition,next30DaysDeliveries}, subscriptions, fulfillmentNetworkIDType, forecastDeliveries.next15/30/60/90DaysDeliveries). - `data.result.pagination.totalResults` — total matching offers (for paging). ## Body (Amazon schema) - pagination*: {limit* (1–100), offset* (0–9000)} filters*: {marketplaceId*, skus: [string] (1–20), asins: [string] (1–20), eligibilities, preferences: {autoEnrollment}, promotions: {sellingPartnerFundedBaseDiscount, sellingPartnerFundedTieredDiscount, amazonFundedBaseDiscount, amazonFundedTieredDiscount}, programTypes*: [SUBSCRIBE_AND_SAVE] (min 1), deliveriesConditions} filters.eligibilities: [ELIGIBLE | INELIGIBLE | SUSPENDED | REPLENISHMENT_ONLY_ORDERING] filters.preferences.autoEnrollment: [OPTED_IN | OPTED_OUT] filters.deliveriesConditions: [NEXT_30_DAYS_DELIVERIES_PAUSED_PRICING | NEXT_30_DAYS_DELIVERIES_PAUSED_NON_BUYABLE | NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK_ONLY | NEXT_30_DAYS_DELIVERIES_AT_LOW_INVENTORY_RISK | NO_ISSUES_FOR_NEXT_30_DAYS_DELIVERIES] sort: {order*: ASC | DESC, key*} sort.key: ASIN | SELLING_PARTNER_FUNDED_BASE_DISCOUNT_PERCENTAGE | SELLING_PARTNER_FUNDED_TIERED_DISCOUNT_PERCENTAGE | AMAZON_FUNDED_BASE_DISCOUNT_PERCENTAGE | AMAZON_FUNDED_TIERED_DISCOUNT_PERCENTAGE | INVENTORY | PRICE | SUBSCRIPTION_COUNT | FULFILLMENT_NETWORK_ID_TYPE # reports_cancelReport (https://sellersheetai.com/docs/mcp-api/tools/reports_cancelReport) > Cancel a report Amazon has not started yet (processingStatus IN_QUEUE); an IN_PROGRESS report can no longer be cancelled. Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 Amazon SP-API · cancelReport · DELETE /reports/2021-06-30/reports/{reportId} Use this when reports_createReport was triggered with the wrong type / window and you want to stop it before it takes a rate-limit slot a corrected request needs. Confirm with reports_getReport. ## Call it MCP tool call: ```json { "name": "reports_cancelReport", "arguments": { "store": "myStore-US", "reportId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_cancelReport \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportId` | string | yes | The reportId returned by reports_createReport. | ## Result - `data.reportId` — same as input. - `data.processingStatus` — 'CANCELLED' on success. # reports_cancelReportSchedule (https://sellersheetai.com/docs/mcp-api/tools/reports_cancelReportSchedule) > Cancel a recurring report schedule. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.reports_2021-06-30 After cancellation, no further reports are created for this schedule. Reports already produced remain available. Amazon SP-API · cancelReportSchedule · DELETE /reports/2021-06-30/schedules/{reportScheduleId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "reports_cancelReportSchedule", "arguments": { "store": "myStore-US", "reportScheduleId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_cancelReportSchedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportScheduleId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportScheduleId` | string | yes | id to cancel. | ## Result - `data.reportScheduleId` — same as input. - `data.cancelled` — True on success. # reports_createReport (https://sellersheetai.com/docs/mcp-api/tools/reports_createReport) > Submit one SP-API report request; returns reportId at once. Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 Check reports_getReports first for a recent DONE report to reuse, then poll reports_getReport until processingStatus is DONE. Many report types are already synced into SellerSheet's warehouse — query_report_data answers from it without an Amazon request (list_report_syncs shows which types the store syncs); request a report only for a type or window the warehouse lacks. Amazon SP-API · createReport · POST /reports/2021-06-30/reports ## Call it MCP tool call: ```json { "name": "reports_createReport", "arguments": { "store": "myStore-US", "reportType": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_createReport \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportType":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportType` | string | yes | the SP-API reportType constant (e.g. 'GET_MERCHANT_LISTINGS_ALL_DATA') or its human-readable name ('All Listings Report'). An open set of 100+ values — pick by intent; reports_getReports shows what already exists for the store. | | `dataStartTime` | string · date-time | | ISO 8601 window ('2024-01-01T00:00:00Z'), required for date-range report types; omit for snapshot reports. | | `dataEndTime` | string · date-time | | ISO 8601 window ('2024-01-01T00:00:00Z'), required for date-range report types; omit for snapshot reports. | | `marketplaceIds` | string[] | | optional 1–25 marketplaceId strings; omit and the server uses the store's own marketplace — pass a list only to span extra marketplaces. | | `reportOptions` | object | | optional {key: value}, free-form per reportType; the known analytics and vendor types are validated before the call. Brand Analytics SEARCH_TERMS, MARKET_BASKET and REPEAT_PURCHASE require {"reportPeriod": DAY \| WEEK \| MONTH \| QUARTER} (REPEAT_PURCHASE: WEEK \| MONTH \| QUARTER) with aligned dates (WEEK = Sunday to Saturday, MONTH = 1st to last day); SEARCH_QUERY_PERFORMANCE also requires "asin"; GET_SALES_AND_TRAFFIC_REPORT takes {"dateGranularity": DAY \| WEEK \| MONTH, "asinGranularity": PARENT \| CHILD \| SKU}; vendor sales and inventory require {"reportPeriod", "distributorView": MANUFACTURING \| SOURCING, "sellingProgram": RETAIL \| BUSINESS \| FRESH}. Omit for reports without options (orders, inventory, listings …). | ## Result - `data.reportId` — poll it with reports_getReport. - `data.processingStatus` — always the literal 'IN_QUEUE' — Amazon's createReport carries only reportId; never treat it as a poll result. - `data.reportType` — the normalised constant. data.marketplaceIds: the list used. # reports_createReportSchedule (https://sellersheetai.com/docs/mcp-api/tools/reports_createReportSchedule) > Set up a recurring Amazon report. Access: **WRITE** · toolset amazon_sp · family sp.reports_2021-06-30 Replaces re-calling reports_createReport on a cron — Amazon generates one report per period automatically. An Amazon schedule only produces documents you download yourself; for a report type SellerSheet already syncs, query_report_data reads the warehouse instead. Amazon SP-API · createReportSchedule · POST /reports/2021-06-30/schedules Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "reports_createReportSchedule", "arguments": { "store": "myStore-US", "reportType": "", "period": "PT5M" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_createReportSchedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportType":"","period":"PT5M"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportType` | string | yes | SP-API reportType constant (e.g. 'GET_FBA_INVENTORY_AGED_DATA') OR human-readable name. Same value space as reports_createReport. A schedule with the same reportType and marketplaceIds REPLACES (cancels) the existing one. | | `period` | string | yes | how often Amazon generates the report, an ISO 8601 duration. Sub-daily (PT5M…PT12H) is only valid for near-real-time report types; P1D = daily, P7D = weekly, P30D/P1M = monthly. Amazon enforces which subset a given reportType accepts. Allowed: PT5M \| PT15M \| PT30M \| PT1H \| PT2H \| PT4H \| PT8H \| PT12H \| P1D \| P2D \| P3D \| PT84H \| P7D \| P14D \| P15D \| P18D \| P30D \| P1M. Allowed: PT5M \| PT15M \| PT30M \| PT1H \| PT2H \| PT4H \| PT8H \| PT12H \| P1D \| P2D \| P3D \| PT84H \| P7D \| P14D \| P15D \| P18D \| P30D \| P1M. | | `marketplaceIds` | string[] | | OPTIONAL list[str] of Amazon marketplaceId strings, 1–25 entries (e.g. ['A39IBJ37TRP1C6']). Omit to let the server derive the single marketplace from the store's country — supply a list only to schedule against extra marketplaces. | | `nextReportCreationTime` | string · date-time | | optional ISO 8601 datetime (e.g. '2024-01-01T00:00:00Z') — the first scheduled run. Omit to let Amazon pick the next period boundary. | | `reportOptions` | object | | optional dict of report-specific options (same per-type options as reports_createReport; free-form per reportType). | ## Result - `data.reportScheduleId` — Amazon schedule ID — track this in your sheet. - `data.reportType` — normalized SP-API constant. - `data.period` — the scheduled period. - `data.marketplaceIds` — the marketplace list actually used (derived from store when you omitted it). ## Gotchas - A schedule with the same reportType and marketplaceIds replaces the existing one (Amazon cancels the old schedule). ## Workflow - 1. Create the schedule (e.g. period P1D for a daily report). 2. reports_getReports with the same reportType lists the reports it produces. 3. reports_getReport downloads each. # reports_getReport (https://sellersheetai.com/docs/mcp-api/tools/reports_getReport) > Get one report's status; when DONE it returns a presigned download URL (data.documentUrl), never the rows — download and process the file yourself (no inline document, preview or s Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 heet copy), then write only the curated result with write_sheet. Reports take 1–15 minutes depending on type and date range. Amazon SP-API · getReport · GET /reports/2021-06-30/reports/{reportId} Amazon SP-API · getReportDocument · GET /reports/2021-06-30/documents/{reportDocumentId} ## Call it MCP tool call: ```json { "name": "reports_getReport", "arguments": { "store": "myStore-US", "reportId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_getReport \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportId` | string | yes | Amazon report ID returned by reports_createReport or reports_getReports. | ## Result - `data.reportId` — same as input. - `data.processingStatus` — 'IN_QUEUE' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED' | 'FATAL' - `data.reportType` — SP-API constant for this report. - `data.reportName` — human-readable report name — use it to label output. - `data.documentUrl` — (DONE) presigned S3 URL for the raw document. - `data.compressionAlgorithm` — (DONE) 'GZIP' or null — how documentUrl bytes are compressed. - `data.urlExpiresInSeconds` — (DONE) documentUrl TTL, typically 300. - `data.error_details` — (FATAL/CANCELLED) why Amazon rejected it. ## Params (Amazon schema; getReport) - reportId*: string ## Params (Amazon schema; getReportDocument) - reportDocumentId*: string enableContentEncodingUrlHeader: boolean ## Gotchas - data.compressionAlgorithm GZIP means the bytes are raw gzip (the URL forces identity encoding) — decompress them yourself. A body starting with { or [ is a JSON analytics report (Brand Analytics, Sales & Traffic) — read its dataBy… arrays; anything else is a tab-separated file with a header row. Never read a whole report into context. The URL expires after data.urlExpiresInSeconds (~300 s); call again for a fresh one. Without shell or URL access, give the user the link — the server never returns report contents. ## Workflow - 1. Read data.processingStatus. 2. DONE: download data.documentUrl yourself and analyze it. 3. IN_QUEUE or IN_PROGRESS: wait 2–5 minutes, then call again. 4. FATAL or CANCELLED: read data.error_details. A FATAL with no error document is usually Amazon's regeneration cooldown (an identical report finished recently) — reuse the newest DONE report from reports_getReports instead of re-creating it. # reports_getReports (https://sellersheetai.com/docs/mcp-api/tools/reports_getReports) > List the SP-API reports Amazon already holds for the store. Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 Call it BEFORE reports_createReport: a recent DONE report (the first entry is the newest) is fetched with reports_getReport and saves the 1–15 minute wait for a new one. Amazon SP-API · getReports · GET /reports/2021-06-30/reports ## Call it MCP tool call: ```json { "name": "reports_getReports", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_getReports \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportType` | string | | one SP-API reportType constant or human-readable name — the one-value shortcut for reportTypes. Amazon requires reportType or reportTypes unless nextToken pages an earlier result. | | `reportTypes` | object[] | | 1–10 constants or names, matched as OR (e.g. ['GET_MERCHANT_LISTINGS_ALL_DATA', 'GET_FBA_INVENTORY_AGED_DATA']) — auditing several types costs ONE call against an endpoint limited to 0.0222 req/s. Wins over reportType when both are given. | | `processingStatuses` | string[] | | the statuses to keep (e.g. ['DONE']); default all. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. Allowed: CANCELLED \| DONE \| FATAL \| IN_PROGRESS \| IN_QUEUE. | | `marketplaceIds` | object[] | | optional marketplaceId strings; omit for the store's own marketplace. Ignored with nextToken. | | `createdSince` | string · date-time | | ISO 8601 bounds on the report's creation time. | | `createdUntil` | string · date-time | | ISO 8601 bounds on the report's creation time. | | `pageSize` | integer · 1–100 | | 1–100 (default 10). | | `nextToken` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.count` — reports in this page. - `data.reports` — [{reportId (for reports_getReport), reportType, processingStatus, createdTime, dataStartTime, dataEndTime, marketplaceIds, reportScheduleId (when scheduled), reportDocumentId (when DONE)}], newest first. - `data.nextToken` — only when more pages exist — pass it back as nextToken (every other filter is then ignored). # reports_getReportSchedule (https://sellersheetai.com/docs/mcp-api/tools/reports_getReportSchedule) > Fetch one report schedule by its reportScheduleId. Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 Returns period, nextReportCreationTime, marketplaceIds, reportOptions. Amazon SP-API · getReportSchedule · GET /reports/2021-06-30/schedules/{reportScheduleId} ## Call it MCP tool call: ```json { "name": "reports_getReportSchedule", "arguments": { "store": "myStore-US", "reportScheduleId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_getReportSchedule \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportScheduleId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportScheduleId` | string | yes | id from reports_createReportSchedule or reports_getReportSchedules. | ## Result - `data.schedule` — dict with reportScheduleId, reportType, period, nextReportCreationTime (ISO 8601), marketplaceIds, reportOptions. # reports_getReportSchedules (https://sellersheetai.com/docs/mcp-api/tools/reports_getReportSchedules) > List active report schedules for one or more reportTypes. Access: **READ** · toolset amazon_sp · family sp.reports_2021-06-30 Amazon SP-API · getReportSchedules · GET /reports/2021-06-30/schedules Amazon REQUIRES at least one reportType filter — there is no "list all schedules" endpoint. To audit everything, call once per reportType you've scheduled. ## Call it MCP tool call: ```json { "name": "reports_getReportSchedules", "arguments": { "store": "myStore-US", "reportTypes": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reports_getReportSchedules \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reportTypes":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `reportTypes` | object[] | yes | list[str] of SP-API constants or human names, 1–10 entries, e.g. ['GET_FBA_INVENTORY_AGED_DATA','GET_VENDOR_REAL_TIME_INVENTORY_REPORT']. | ## Result - `data.schedules` — list[dict], each with reportScheduleId, reportType, period, nextReportCreationTime (ISO 8601), marketplaceIds, reportOptions. - `data.count` — number of schedules found. # sales_getOrderMetrics (https://sellersheetai.com/docs/mcp-api/tools/sales_getOrderMetrics) > Order metrics (units, order count, revenue) as a time series per granularity — sales trends, year-over-year comparisons, revenue reporting. Access: **READ** · toolset amazon_sp · family sp.sales Read-only. Amazon SP-API · getOrderMetrics · GET /sales/v1/orderMetrics ## Call it MCP tool call: ```json { "name": "sales_getOrderMetrics", "arguments": { "store": "myStore-US", "interval": "", "granularity": "Hour" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/sales_getOrderMetrics \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","interval":"","granularity":"Hour"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `interval` | string | yes | two ISO-8601 datetimes joined by '--', BOTH with a timezone offset ('2026-01-01T00:00:00-07:00--2026-02-01T00:00:00-07:00', or 'Z' for UTC) — a single datetime is rejected before the call, and Amazon refuses an offset-less interval even with granularity_time_zone set. Hour works only for an interval within the last 30 days; every other granularity within the last 2 years. | | `granularity` | string | yes | the bucket size of the series; Total returns one sum for the interval. Allowed: Hour \| Day \| Week \| Month \| Year \| Total. Allowed: Hour \| Day \| Week \| Month \| Year \| Total. | | `marketplace_ids` | object[] | | optional single-element override of the store's marketplace (['ATVPDKIKX0DER']) — Amazon allows EXACTLY ONE per call, so compare marketplaces one call each; omit to use the store's. | | `granularity_time_zone` | string | | IANA zone ('UTC', 'Asia/Dubai') that sets the day boundary for Day-or-longer granularity; Amazon requires it above Hour. Match it to the interval's offset (a 'Z' interval → 'UTC', '+04:00' → 'Asia/Dubai') or the buckets are re-cut in that zone with partial-day edges. | | `buyer_type` | string | | whose orders to count — business buyers, consumers or both. Default: All. Allowed: B2B \| B2C \| All. Allowed: B2B \| B2C \| All. | | `fulfillment_network` | string | | AFN (FBA) \| MFN (seller-fulfilled); omit for both. | | `first_day_of_week` | string | | the day a Week bucket starts on. Default: Monday. Allowed: Monday \| Sunday. Allowed: Monday \| Sunday. | | `asin` | string | | the ASIN (e.g. 'B0XXXXXXXX'). Mutually exclusive with sku. | | `sku` | string | | one seller SKU. Mutually exclusive with asin. | | `amazon_program` | string | | limits the metrics to one Amazon program — AmazonHaul is the low-cost storefront; omit for all programs. | ## Result - `data.granularity / data.interval` — as requested. - `data.result` — one per period — {interval, unitCount, orderItemCount, orderCount, averageUnitPrice {amount, currencyCode}, totalSales {amount, currencyCode}}. # solicitations_createProductReviewAndSellerFeedbackSolicitation (https://sellersheetai.com/docs/mcp-api/tools/solicitations_createProductReviewAndSellerFeedbackSolicitation) > Send a product review and seller feedback solicitation for an order. Access: **WRITE** · toolset amazon_sp · family sp.solicitations (Amazon operationId: createProductReviewAndSellerFeedbackSolicitation.) Amazon SP-API · createProductReviewAndSellerFeedbackSolicitation · POST /solicitations/v1/orders/{amazonOrderId}/solicitations/productReviewAndSellerFeedback Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. Sends the productReviewAndSellerFeedback solicitation — a single combined request covering both a product review and seller feedback (the only solicitation type Amazon exposes via this API). This is a real Amazon WRITE: it dispatches a request-review message to the buyer. Requires SP write access. Call solicitations_getSolicitationActionsForOrder first and send only when it lists an action — Amazon allows one productReviewAndSellerFeedback solicitation OR one free-form proactive message per order, and a second attempt returns an error. ## Call it MCP tool call: ```json { "name": "solicitations_createProductReviewAndSellerFeedbackSolicitation", "arguments": { "store": "myStore-US", "orderId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/solicitations_createProductReviewAndSellerFeedbackSolicitation \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","orderId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `orderId` | string | yes | Amazon order ID (e.g. '114-1234567-1234567'). Maps to the {amazonOrderId} path. | | `marketplaceId` | string | | optional Amazon marketplaceId; defaults to the store ref's marketplace. | ## Result - `data.orderId` — the order ID for which solicitation was sent. - `data.result` — Amazon response payload (empty on success — a 201 with no body means the solicitation was created). # solicitations_getSolicitationActionsForOrder (https://sellersheetai.com/docs/mcp-api/tools/solicitations_getSolicitationActionsForOrder) > Check which solicitation actions are available for an order. Access: **READ** · toolset amazon_sp · family sp.solicitations (Amazon operationId: getSolicitationActionsForOrder.) Amazon SP-API · getSolicitationActionsForOrder · GET /solicitations/v1/orders/{amazonOrderId} Always call this before solicitations_createProductReviewAndSellerFeedbackSolicitation to verify the action is permitted; if no action is listed, skip the order. Amazon restricts solicitations based on order age, category, and whether a solicitation was already sent. ## Call it MCP tool call: ```json { "name": "solicitations_getSolicitationActionsForOrder", "arguments": { "store": "myStore-US", "orderId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/solicitations_getSolicitationActionsForOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","orderId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `orderId` | string | yes | Amazon order ID (e.g. '114-1234567-1234567'). Maps to the {amazonOrderId} path. | | `marketplaceId` | string | | optional Amazon marketplaceId; defaults to the store ref's marketplace. | ## Result - `data.orderId` — the queried order ID. - `data.result` — HATEOAS payload. Eligible actions live under _links.actions (and _embedded.actions) — a non-empty actions list means a solicitation is permitted for this order. # vendorInvoices_submitInvoices (https://sellersheetai.com/docs/mcp-api/tools/vendorInvoices_submitInvoices) > Submit vendor invoices or credit notes to Amazon. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.vendorInvoices Amazon write; blocks until the transaction reaches Success or Failure. Amazon SP-API · submitInvoices · POST /vendor/payments/v1/invoices Amazon SP-API · getTransaction · GET /vendor/transactions/v1/transactions/{transactionId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "vendorInvoices_submitInvoices", "arguments": { "store": "myStore-US", "invoices_payload": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorInvoices_submitInvoices \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","invoices_payload":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `invoices_payload` | object | yes | {"invoices": [Invoice, …]}. Per Invoice, required: invoiceType (Invoice \| CreditNote), id (your unique invoice or credit-note number — NEVER reused), date (ISO-8601, now or earlier), remitToParty (a Party — partyId, address, taxRegistrationDetails; full shape in the Body block below), invoiceTotal (Money {currencyCode ISO-4217, amount as a decimal string}; non-zero and equal to items + charges − allowances). Optional: items: [{itemSequenceNumber (int), amazonProductIdentifier (ASIN) or vendorProductIdentifier, invoicedQuantity {amount (non-zero int), unitOfMeasure Cases \| Eaches, unitSize}, netCost (Money), purchaseOrderNumber (8-char alphanumeric; required on an Invoice), hsnCode (India, digits), taxDetails, chargeDetails, allowanceDetails, creditNoteDetails (required on a CreditNote — {referenceInvoiceNumber, returnsReferenceNumber, goodsReturnDate, rmaId, debitNoteNumber})}]; billToParty (a Party); referenceNumber (India: the mandatory government ref); shipToParty; shipFromParty (required in India and the EU); paymentTerms {type Basic \| EndOfMonth \| FixedDate \| Proximo \| PaymentDueUponReceiptOfInvoice \| LetterofCredit, discountPercent, discountDueDays, netDueDays}; taxDetails (required in India): [{taxType CGST \| SGST \| CESS \| UTGST \| IGST \| MwSt. \| PST \| TVA \| VAT \| GST \| ST \| Consumption \| MutuallyDefined \| DomesticVAT, taxRate, taxAmount, taxableAmount}]; chargeDetails: [{type Freight \| Packing \| Duty \| Service \| SmallOrder \| InsurancePlacementCost \| InsuranceFee \| SpecialHandlingService \| CollectionAndRecyclingService \| EnvironmentalProtectionService \| TaxCollectedAtSource, description, chargeAmount, taxDetails}]; allowanceDetails: [{type Discount \| DiscountIncentive \| Defective \| Promotional \| UnsaleableMerchandise \| Special, description, allowanceAmount, taxDetails}]; additionalDetails: [{type SUR \| OCR \| CartonCount, detail, languageCode}]. Full tree: https://developer-docs.amazon.com/sp-api/docs/submit-invoices | ## Result - `data.status` — SUCCESS, or Failure with data.errors [{code, message, details}] — fix them and resubmit with a NEW invoice id. - `data.transactionId / data.raw` — the finished transaction (raw on success only). ## Body (Amazon schema; submitInvoices): {invoices: [Invoice]}, each item - invoiceType*: Invoice | CreditNote id*: string date*: string (date-time) remitToParty*: {partyId*, address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalOrZipCode, countryCode*, phone}, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} invoiceTotal*: {currencyCode, amount} + 10 more: referenceNumber, shipToParty, shipFromParty, billToParty, paymentTerms, taxDetails, additionalDetails, chargeDetails, allowanceDetails, items Full schema: the Docs link above. ## Gotchas - India takes Invoice only (no CreditNote) and requires HSN, GST tax, shipFromParty and a 15-char GST id; Europe takes Invoice and CreditNote (PO number optional on a credit note) and requires VAT registration; North America takes Invoice only, tax optional. HTTP 502 = still Processing after 60 s; the error names the transactionId — check it with vendorTransactionStatus_getTransaction before resubmitting. # vendorOrders_getPurchaseOrder (https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrder) > Get full details for a single vendor purchase order. Access: **READ** · toolset amazon_sp · family sp.vendorOrders Amazon SP-API · getPurchaseOrder · GET /vendor/orders/v1/purchaseOrders/{purchaseOrderNumber} ## Call it MCP tool call: ```json { "name": "vendorOrders_getPurchaseOrder", "arguments": { "store": "myStore-US", "purchase_order_number": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorOrders_getPurchaseOrder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","purchase_order_number":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `purchase_order_number` | string | yes | 8-character alpha-numeric PO number. | ## Result - `data.order` — the PO — purchaseOrderState, orderDetails.items[] {itemSequenceNumber, amazonProductIdentifier, vendorProductIdentifier, orderedQuantity, netCost, isBackOrderAllowed}, orderDetails.shipToParty and deliveryWindow; an acknowledgement echoes these item fields. - `data.purchaseOrderNumber` — the PO number echoed back. ## Workflow - 1. Call with the purchaseOrderNumber from vendorOrders_getPurchaseOrders. 2. Review data.order for item quantities, delivery windows, and ship-to location. 3. Call vendorOrders_submitAcknowledgement with accepted/rejected items. # vendorOrders_getPurchaseOrders (https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrders) > List vendor purchase orders created or changed in a window of at most 7 days, no older than 6 months. Access: **READ** · toolset amazon_sp · family sp.vendorOrders Amazon SP-API · getPurchaseOrders · GET /vendor/orders/v1/purchaseOrders ## Call it MCP tool call: ```json { "name": "vendorOrders_getPurchaseOrders", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorOrders_getPurchaseOrders \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `created_after` | string · date-time | | ISO 8601. POs created after this time. | | `created_before` | string · date-time | | ISO 8601. POs created before this time. | | `changed_after` | string · date-time | | ISO 8601. POs changed after this time. | | `changed_before` | string · date-time | | ISO 8601. POs changed before this time. | | `purchase_order_state` | string | | keeps only POs in this state. Allowed: New \| Acknowledged \| Closed. Allowed: New \| Acknowledged \| Closed. | | `include_details` | boolean | | True = full PO body, False = PO numbers only (default True). | | `ordering_vendor_code` | string | | Filter by sellingParty.partyId value. | | `limit` | integer · 1–100 | | Max records returned, 1–100 (Amazon default 100). | | `sort_order` | string | | ASC or DESC. Allowed: ASC \| DESC. | | `po_item_state` | string | | Cancelled keeps only POs with an item Amazon cancelled (quantity now zero). | | `is_po_changed` | boolean | | True = changed POs only. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.orders` — list of purchase order dicts. - `data.count` — number of orders in this page. - `data.nextToken` — pass to next call if present. ## Workflow - 1. Call with created_after/created_before for new POs, or changed_after/changed_before for changed POs (window ≤ 7 days). 2. While data.nextToken is present, call again with it as next_token. 3. For each new PO, call vendorOrders_getPurchaseOrder for full item details. 4. Call vendorOrders_submitAcknowledgement to accept/reject items. # vendorOrders_getPurchaseOrdersStatus (https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_getPurchaseOrdersStatus) > Get purchase order status list. Access: **READ** · toolset amazon_sp · family sp.vendorOrders Date range must not exceed 7 days. Amazon SP-API · getPurchaseOrdersStatus · GET /vendor/orders/v1/purchaseOrdersStatus Useful for monitoring whether Amazon has received and accepted acknowledgements, or to check delivery/receipt status of fulfilment. ## Call it MCP tool call: ```json { "name": "vendorOrders_getPurchaseOrdersStatus", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorOrders_getPurchaseOrdersStatus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `created_after` | string · date-time | | ISO 8601 bounds on when the PO became available (window ≤ 7 days). | | `created_before` | string · date-time | | ISO 8601 bounds on when the PO became available (window ≤ 7 days). | | `updated_after` | string · date-time | | ISO 8601 — POs updated after this. | | `updated_before` | string · date-time | | ISO 8601 — POs updated before this. | | `purchase_order_number` | string | | Filter to a single PO number. | | `purchase_order_status` | string | | keeps only POs in this status. Allowed: OPEN \| CLOSED. Allowed: OPEN \| CLOSED. | | `item_confirmation_status` | string | | keeps only POs with items in this confirmation state. Allowed: ACCEPTED \| PARTIALLY_ACCEPTED \| REJECTED \| UNCONFIRMED. Allowed: ACCEPTED \| PARTIALLY_ACCEPTED \| REJECTED \| UNCONFIRMED. | | `item_receive_status` | string | | keeps only POs with items in this receive state. Allowed: NOT_RECEIVED \| PARTIALLY_RECEIVED \| RECEIVED. Allowed: NOT_RECEIVED \| PARTIALLY_RECEIVED \| RECEIVED. | | `ordering_vendor_code` | string | | Filter by vendor code. | | `ship_to_party_id` | string | | Filter by fulfilment centre ID. | | `limit` | integer · 1–100 | | Max records returned, 1–100 (Amazon default 100). | | `sort_order` | string | | ASC or DESC. Allowed: ASC \| DESC. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.ordersStatus` — list of PO status dicts. - `data.count` — number of statuses returned. - `data.nextToken` — pass to next call if present. ## Workflow - 1. Call with updated_after/updated_before to find recently changed POs. 2. Narrow with purchase_order_status, item_confirmation_status or item_receive_status. 3. While data.nextToken is present, call again with it as next_token. # vendorOrders_submitAcknowledgement (https://sellersheetai.com/docs/mcp-api/tools/vendorOrders_submitAcknowledgement) > Acknowledge (accept, backorder or reject) one or more purchase orders. Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.vendorOrders Blocks until the transaction reaches SUCCESS or FAILURE — no separate polling. Build one acknowledgement per purchaseOrderNumber from vendorOrders_getPurchaseOrder, one item per PO line. Amazon SP-API · submitAcknowledgement · POST /vendor/orders/v1/acknowledgements Amazon SP-API · getTransaction · GET /vendor/transactions/v1/transactions/{transactionId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "vendorOrders_submitAcknowledgement", "arguments": { "store": "myStore-US", "acknowledgement_payload": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorOrders_submitAcknowledgement \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","acknowledgement_payload":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `acknowledgement_payload` | object | yes | {"acknowledgements": [Acknowledgement, …]}. Per Acknowledgement, required: purchaseOrderNumber (8-char alphanumeric), acknowledgementDate (ISO-8601), sellingParty {partyId (the vendor or warehouse code) required; address: {name, addressLine1, countryCode (2 chars) required; addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, phone}; taxInfo: {taxRegistrationType VAT \| GST, taxRegistrationNumber}}, items: [{itemSequenceNumber (the PO line), amazonProductIdentifier (ASIN) or vendorProductIdentifier (one, so Amazon matches the line), orderedQuantity {amount (non-zero int), unitOfMeasure Cases \| Eaches, unitSize} required, netCost (Money {currencyCode ISO-4217, amount as a decimal string, unitOfMeasure POUNDS \| OUNCES \| GRAMS \| KILOGRAMS for items priced by weight}) required — Amazon rejects the file without it; acknowledge at a CORRECTED cost when the PO price is wrong; listPrice (Money), discountMultiplier (decimal string), itemAcknowledgements required: [{acknowledgementCode Accepted \| Backordered \| Rejected, acknowledgedQuantity {amount, unitOfMeasure, unitSize}, scheduledShipDate, scheduledDeliveryDate (ISO-8601), rejectionReason (required when Rejected: TemporarilyUnavailable \| InvalidProductIdentifier \| ObsoleteProduct)}]}]. Split a line across codes with several itemAcknowledgements whose amounts sum to orderedQuantity. Full tree: https://developer-docs.amazon.com/sp-api/docs/vendor-orders-api-v1-reference | ## Result - `data.transactionId` — the Amazon transaction, already final when this returns. - `data.status` — SUCCESS, or Failure with data.errors [{code, message, details}]. ## Body (Amazon schema; submitAcknowledgement): {acknowledgements: [OrderAcknowledgement]}, each item - purchaseOrderNumber*: string sellingParty*: {partyId*, address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, taxInfo: {taxRegistrationType*, taxRegistrationNumber*}} sellingParty.taxInfo.taxRegistrationType: VAT | GST acknowledgementDate*: string (date-time) items*: [{itemSequenceNumber, amazonProductIdentifier, vendorProductIdentifier, orderedQuantity*: {amount, unitOfMeasure, unitSize}, netCost: {currencyCode, amount, unitOfMeasure}, listPrice: {currencyCode, amount, unitOfMeasure}, discountMultiplier, itemAcknowledgements*: [{acknowledgementCode*, acknowledgedQuantity*, scheduledShipDate, scheduledDeliveryDate, rejectionReason}]}] items.orderedQuantity.unitOfMeasure: Cases | Eaches items.netCost.unitOfMeasure: POUNDS | OUNCES | GRAMS | KILOGRAMS items.listPrice.unitOfMeasure: POUNDS | OUNCES | GRAMS | KILOGRAMS items.itemAcknowledgements.acknowledgementCode: Accepted | Backordered | Rejected items.itemAcknowledgements.acknowledgedQuantity.unitOfMeasure: Cases | Eaches items.itemAcknowledgements.rejectionReason: TemporarilyUnavailable | InvalidProductIdentifier | ObsoleteProduct ## Gotchas - Backordered is accepted only on a PO line whose isBackOrderAllowed is true (vendorOrders_getPurchaseOrder). An HTTP 502 means Amazon was still Processing after 60 s — the error names the transactionId; check it with vendorTransactionStatus_getTransaction before acknowledging again. # vendorShipments_GetShipmentDetails (https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_GetShipmentDetails) > Get shipment details from Amazon with date and status filters. Access: **READ** · toolset amazon_sp · family sp.vendorShipments Amazon SP-API · GetShipmentDetails · GET /vendor/shipping/v1/shipments ## Call it MCP tool call: ```json { "name": "vendorShipments_GetShipmentDetails", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorShipments_GetShipmentDetails \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `created_after` | string · date-time | | ISO 8601 — shipment record created after. | | `created_before` | string · date-time | | ISO 8601 — shipment record created before. | | `shipment_confirmed_before` | string · date-time | | ISO 8601 — confirmed date upper bound. | | `shipment_confirmed_after` | string · date-time | | ISO 8601 — confirmed date lower bound. | | `package_label_created_before` | string · date-time | | ISO 8601 — buyer label creation date upper bound. | | `package_label_created_after` | string · date-time | | ISO 8601 — buyer label creation date lower bound. | | `shipped_before` | string · date-time | | ISO 8601 — shipped date upper bound. | | `shipped_after` | string · date-time | | ISO 8601 — shipped date lower bound. | | `estimated_delivery_before` | string · date-time | | ISO 8601 — estimated delivery upper bound. | | `estimated_delivery_after` | string · date-time | | ISO 8601 — estimated delivery lower bound. | | `shipment_delivery_before` | string · date-time | | ISO 8601 — actual delivery upper bound. | | `shipment_delivery_after` | string · date-time | | ISO 8601 — actual delivery lower bound. | | `requested_pick_up_before` | string · date-time | | ISO 8601 — requested pick-up upper bound. | | `requested_pick_up_after` | string · date-time | | ISO 8601 — requested pick-up lower bound. | | `scheduled_pick_up_before` | string · date-time | | ISO 8601 — scheduled pick-up upper bound. | | `scheduled_pick_up_after` | string · date-time | | ISO 8601 — scheduled pick-up lower bound. | | `current_shipment_status` | string | | filter by shipment status. Allowed: Created \| TransportationRequested \| CarrierAssigned \| Shipped. | | `vendor_shipment_identifier` | string | | Filter by vendor's own shipment ID. | | `buyer_reference_number` | string | | Filter by Amazon buyer reference number. | | `buyer_warehouse_code` | string | | shipToParty.partyId value from the shipment. | | `seller_warehouse_code` | string | | sellingParty.partyId value from the shipment. | | `limit` | integer · 1–50 | | Max records returned, 1–50 (Amazon default 50). | | `sort_order` | string | | ASC or DESC. Allowed: ASC \| DESC. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.shipments` — list of shipment detail dicts. - `data.count` — number of shipments returned. - `data.nextToken` — pass to next call if present. ## Workflow - 1. Call with created_after/created_before to fetch recent shipments. 2. Narrow by a date pair (shipped_*, shipment_confirmed_*, estimated_delivery_*, shipment_delivery_*, requested_pick_up_*, scheduled_pick_up_*) or an identifier (vendor_shipment_identifier, buyer_reference_number, buyer_warehouse_code, seller_warehouse_code). 3. While data.nextToken is present, call again with it as next_token. # vendorShipments_GetShipmentLabels (https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_GetShipmentLabels) > Get small parcel transport labels from Amazon. Access: **READ** · toolset amazon_sp · family sp.vendorShipments Amazon SP-API · GetShipmentLabels · GET /vendor/shipping/v1/transportLabels ## Call it MCP tool call: ```json { "name": "vendorShipments_GetShipmentLabels", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorShipments_GetShipmentLabels \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `label_created_after` | string · date-time | | ISO 8601 — labels created after this. | | `label_created_before` | string · date-time | | ISO 8601 — labels created before this. | | `buyer_reference_number` | string | | Filter by buyer reference number. | | `vendor_shipment_identifier` | string | | Filter by vendor shipment ID. | | `seller_warehouse_code` | string | | Filter by vendor warehouse (sellingParty.partyId). | | `limit` | integer · 1–50 | | Max records returned, 1–50 (Amazon default 50). | | `sort_order` | string | | ASC or DESC. Allowed: ASC \| DESC. | | `next_token` | string | | the cursor from the previous call's data.nextToken; omit for the first page. | ## Result - `data.transportLabels[]` — labelData[] {labelSequenceNumber, trackingId, carrierCode, labelFormat PDF, label (the base-64 PDF)} and shipmentInformation {buyerReferenceNumber, totalLabelCount, shipMode}. - `data.count` — number of labels returned. - `data.nextToken` — pass to next call if present. ## Workflow - 1. Call with label_created_after/label_created_before, or buyer_reference_number / vendor_shipment_identifier. 2. While data.nextToken is present, call again with it as next_token. # vendorShipments_SubmitShipmentConfirmations (https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_SubmitShipmentConfirmations) > Confirm vendor shipments AFTER dispatch (the advance notice before dispatch is vendorShipments_SubmitShipments). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.vendorShipments One or many confirmations per call. Amazon write; blocks until the transaction reaches Success or Failure. Amazon SP-API · SubmitShipmentConfirmations · POST /vendor/shipping/v1/shipmentConfirmations Amazon SP-API · getTransaction · GET /vendor/transactions/v1/transactions/{transactionId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "vendorShipments_SubmitShipmentConfirmations", "arguments": { "store": "myStore-US", "confirmations_payload": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorShipments_SubmitShipmentConfirmations \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","confirmations_payload":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `confirmations_payload` | object | yes | {"shipmentConfirmations": [Confirmation, …]}. Per Confirmation, required: shipmentIdentifier (unique, unused in the last 365 days), shipmentConfirmationType (Original \| Replace), shipmentConfirmationDate (ISO-8601), sellingParty, shipFromParty and shipToParty (each {partyId, address}), shippedItems: [{itemSequenceNumber ('001', '002', …), amazonProductIdentifier (ASIN) or vendorProductIdentifier, shippedQuantity {amount, unitOfMeasure Cases \| Eaches, unitSize, totalWeight {unitOfMeasure POUNDS \| OUNCES \| GRAMS \| KILOGRAMS, amount}}, itemDetails {purchaseOrderNumber, lotNumber, lotNumberSourceReference, lotNumberSourceType GLN \| FFRN \| USDA_E \| URL, countryOfOrigin (2-letter), regulationReferences (EUDR: dueDiligenceReference, dueDiligenceVerification, dueDiligenceInformation, dueDiligenceExemptionCode), expiry {manufacturerDate, expiryDate, expiryAfterDuration}, maximumRetailPrice {currencyCode, amount}, handlingCode Oversized \| Fragile \| Food \| HandleWithCare}}]. Optional: shippedDate and estimatedDeliveryDate (ISO-8601); shipmentType and shipmentStructure (values in the Body block); transportationDetails {carrierScac, carrierShipmentReferenceNumber, transportationMode Road \| Air \| Ocean, billOfLadingNumber}; shipmentMeasurements {grossShipmentWeight {unitOfMeasure G \| Kg \| Oz \| Lb, value}, shipmentVolume {unitOfMeasure CuFt \| CuIn \| CuM \| CuY, value}, cartonCount, palletCount}; importDetails {methodOfPayment PaidByBuyer \| CollectOnDelivery \| DefinedByBuyerAndSeller \| FOBPortOfCall \| PrepaidBySeller \| PaidBySeller, handlingInstructions Oversized \| Fragile \| Food \| HandleWithCare, route, billableWeight}; cartons (a SmallParcel shipment, one entry per carton): [{cartonSequenceNumber ('001', … — pallets reference cartons by it), cartonIdentifiers: [{containerIdentificationType SSCC \| AMZNCC \| GTIN \| BPS \| CID, containerIdentificationNumber}], trackingNumber (Amazon requires one per carton), dimensions {length, width, height, unitOfMeasure In \| Ft \| Meter \| Yard}, weight {unitOfMeasure G \| Kg \| Oz \| Lb, value}, items: [{itemReference (the itemSequenceNumber from shippedItems), shippedQuantity {amount, unitOfMeasure, unitSize}, itemDetails}] required}]; pallets (a palletized shipment): [{palletIdentifiers: [{containerIdentificationType, containerIdentificationNumber}] required, tier (layers per pallet), block (cartons per layer), dimensions, weight, cartonReferenceDetails {cartonCount (mandatory for a single-item pallet), cartonReferenceNumbers — the cartonSequenceNumbers on this pallet}, items}]. Full tree: https://developer-docs.amazon.com/sp-api/docs/vendor-shipments-api-v1-reference | ## Result - `data.transactionId` — the transaction, already final when this returns. - `data.status` — SUCCESS, or Failure with data.errors [{code, message, details}]. ## Body (Amazon schema; SubmitShipmentConfirmations): {shipmentConfirmations: [ShipmentConfirmation]}, each item - shipmentIdentifier*: string shipmentConfirmationType*: Original | Replace shipmentConfirmationDate*: string (date-time) sellingParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} shipFromParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} shipToParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} shippedItems*: [{itemSequenceNumber*, amazonProductIdentifier, vendorProductIdentifier, shippedQuantity*: {amount*, unitOfMeasure*, unitSize, totalWeight}, itemDetails: {purchaseOrderNumber, lotNumber, lotNumberSourceReference, lotNumberSourceType, countryOfOrigin, regulationReferences, expiry, maximumRetailPrice, handlingCode}}] shipmentType: TruckLoad | LessThanTruckLoad | SmallParcel shipmentStructure: PalletizedAssortmentCase | LooseAssortmentCase | PalletOfItems | PalletizedStandardCase | LooseStandardCase | MasterPallet | MasterCase + 8 more: transportationDetails, amazonReferenceNumber, shippedDate, estimatedDeliveryDate, shipmentMeasurements, importDetails, cartons, pallets Full schema: the Docs link above. ## Gotchas - HTTP 502 = still Processing after 60 s; the error names the transactionId — check it with vendorTransactionStatus_getTransaction before resubmitting. # vendorShipments_SubmitShipments (https://sellersheetai.com/docs/mcp-api/tools/vendorShipments_SubmitShipments) > Submit vendor shipment requests — the advance shipment notice, BEFORE goods ship (after dispatch use vendorShipments_SubmitShipmentConfirmations). Access: **DESTRUCTIVE** · toolset amazon_sp · family sp.vendorShipments Amazon write; blocks until the transaction reaches Success or Failure. Amazon SP-API · SubmitShipments · POST /vendor/shipping/v1/shipments Amazon SP-API · getTransaction · GET /vendor/transactions/v1/transactions/{transactionId} Gate: approve — interactive: show the change (Amazon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "vendorShipments_SubmitShipments", "arguments": { "store": "myStore-US", "shipments_payload": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorShipments_SubmitShipments \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","shipments_payload":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `shipments_payload` | object | yes | {"shipments": [Shipment, …]}. Per Shipment, required: vendorShipmentIdentifier (unique, unused in the last 365 days), transactionType (New \| Cancel), transactionDate (ISO-8601), sellingParty, shipFromParty and shipToParty — each a Party (partyId, address, taxRegistrationDetails; full shape in the Body block below). Optional: buyerReferenceNumber; currentShipmentStatus (Created \| TransportationRequested \| CarrierAssigned \| Shipped); shipmentFreightTerm (Collect \| Prepaid); shipmentMeasurements {totalCartonCount, totalPalletStackable, totalPalletNonStackable, shipmentWeight {unitOfMeasure G \| Kg \| Oz \| Lb, value}, shipmentVolume {unitOfMeasure CuFt \| CuIn \| CuM \| CuY, value}}; collectFreightPickupDetails {requestedPickUp, scheduledPickUp, carrierAssignmentDate}; purchaseOrders: [{purchaseOrderNumber, purchaseOrderDate, shipWindow, items: [{itemSequenceNumber ('001', '002', …) required, buyerProductIdentifier (ASIN) or vendorProductIdentifier, shippedQuantity {amount, unitOfMeasure Cases \| Eaches, unitSize, totalWeight {unitOfMeasure POUNDS \| OUNCES \| GRAMS \| KILOGRAMS, amount}} required, maximumRetailPrice {currencyCode, amount}}]}]; containers: [{containerType carton \| pallet, containerSequenceNumber, containerIdentifiers: [{containerIdentificationType SSCC \| AMZNCC \| GTIN \| BPS \| CID, containerIdentificationNumber}] required, trackingNumber, dimensions {length, width, height, unitOfMeasure In \| Ft \| Meter \| Yard}, weight {unitOfMeasure G \| Kg \| Oz \| Lb, value}, tier, block, innerContainersDetails, packedItems: [{itemSequenceNumber, buyerProductIdentifier or vendorProductIdentifier, packedQuantity {amount, unitOfMeasure Cases \| Eaches, unitSize}, itemDetails {purchaseOrderNumber, lotNumber, expiry}}]}]; importDetails {methodOfPayment PaidByBuyer \| CollectOnDelivery \| DefinedByBuyerAndSeller \| FOBPortOfCall \| PrepaidBySeller \| PaidBySeller, sealNumber, route {stops: [{functionCode PortOfDischarge \| FreightPayableAt \| PortOfLoading, locationIdentification, arrivalTime, departureTime}]}, importContainers (≤64 chars), billableWeight, estimatedShipByDate, handlingInstructions Oversized \| Fragile \| Food \| HandleWithCare}; transportationDetails {shipMode TruckLoad \| LessThanTruckLoad \| SmallParcel, transportationMode Road \| Air \| Ocean, shippedDate, estimatedDeliveryDate, shipmentDeliveryDate, carrierDetails {name, code (SCAC), phone, email, shipmentReferenceNumber}, billOfLadingNumber}; shipmentStatusDetails: [{shipmentStatus Created \| TransportationRequested \| CarrierAssigned \| Shipped, shipmentStatusDate}]; shipmentCreateDate, shipmentConfirmDate, packageLabelCreateDate (ISO-8601). Full tree: https://developer-docs.amazon.com/sp-api/docs/vendor-shipments-api-v1-reference | ## Result - `data.transactionId` — the transaction, already final when this returns. - `data.status` — SUCCESS, or Failure with data.errors [{code, message, details}]. ## Body (Amazon schema; SubmitShipments): {shipments: [Shipment]}, each item - vendorShipmentIdentifier*: string transactionType*: New | Cancel transactionDate*: string (date-time) sellingParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} shipFromParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} shipToParty*: {address: {name*, addressLine1*, addressLine2, addressLine3, city, county, district, stateOrRegion, postalCode, countryCode*, phone}, partyId*, taxRegistrationDetails: [{taxRegistrationType*, taxRegistrationNumber*}]} currentShipmentStatus: Created | TransportationRequested | CarrierAssigned | Shipped shipmentFreightTerm: Collect | Prepaid + 12 more: buyerReferenceNumber, currentshipmentStatusDate, shipmentStatusDetails, shipmentCreateDate, shipmentConfirmDate, packageLabelCreateDate, shipmentMeasurements, collectFreightPickupDetails, purchaseOrders, importDetails, containers, transportationDetails Full schema: the Docs link above. ## Gotchas - A Shipment has NO top-level items array — line items live under purchaseOrders[].items. The item identifier here is buyerProductIdentifier, not amazonProductIdentifier (that name belongs to the shippedItems of vendorShipments_SubmitShipmentConfirmations). HTTP 502 = still Processing after 60 s; the error names the transactionId — check it with vendorTransactionStatus_getTransaction before resubmitting. # vendorTransactionStatus_getTransaction (https://sellersheetai.com/docs/mcp-api/tools/vendorTransactionStatus_getTransaction) > Read the status of a vendor retail transaction (an invoice, acknowledgement or shipment submit). Access: **READ** · toolset amazon_sp · family sp.vendorTransactionStatus The submit tools already wait for Success or Failure, so call this after a submit answered HTTP 502 (still Processing after 60 s; the error names the id) or for a transactionId from elsewhere. Amazon SP-API · getTransaction · GET /vendor/transactions/v1/transactions/{transactionId} ## Call it MCP tool call: ```json { "name": "vendorTransactionStatus_getTransaction", "arguments": { "store": "myStore-US", "transaction_id": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/vendorTransactionStatus_getTransaction \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","transaction_id":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `-` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `transaction_id` | string | yes | the transactionId (GUID) a vendor submit returned or named in its 502 error. | ## Result - `data.status` — Amazon enum — 'Success', 'Failure', or 'Processing' (mirrors transactionStatus.status from data.raw). - `data.errors` — list of error dicts (code, message, details) if 'Failure' (may be empty). - `data.transactionId` — same as input. - `data.raw` — full Amazon transactionStatus payload. ## Workflow - 1. Pass the transactionId. 2. If status is 'Processing', wait 30–60 seconds and poll again. 3. On 'Failure': check data.errors for error codes and messages. Correct the submission payload and resubmit. # append_doc_text (https://sellersheetai.com/docs/mcp-api/tools/append_doc_text) > Append text to the end of the document body. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "append_doc_text", "arguments": { "documentId": "", "text": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/append_doc_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"","text":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `text` | string | yes | Text to append. It lands before the document's final newline, so it joins the last paragraph unless that paragraph is empty — start it with '\n' to begin a new paragraph after existing text. | ## Result - { appended: true, chars: N } # apply_doc_bullets (https://sellersheetai.com/docs/mcp-api/tools/apply_doc_bullets) > Convert paragraphs in a range into a bulleted or numbered list. Access: **WRITE** · toolset google_workspace · family null Each existing paragraph (separated by '\n') becomes one list item. To add a new list, write_doc_structured's bullets / numbered block inserts and bullets the lines in one call; use this tool on paragraphs already in the document. ## Call it MCP tool call: ```json { "name": "apply_doc_bullets", "arguments": { "documentId": "", "startIndex": 1, "endIndex": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/apply_doc_bullets \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"","startIndex":1,"endIndex":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `startIndex` | integer | yes | Range start (inclusive). | | `endIndex` | integer | yes | Range end (exclusive). | | `preset` | string | | a Docs API bulletPreset, e.g. BULLET_DISC_CIRCLE_SQUARE, BULLET_CHECKBOX, BULLET_STAR_CIRCLE_SQUARE, NUMBERED_DECIMAL_ALPHA_ROMAN, NUMBERED_DECIMAL_NESTED, NUMBERED_UPPERALPHA_ALPHA_ROMAN. Default: BULLET_DISC_CIRCLE_SQUARE. | ## Result - { bulleted: true } ## Gotchas - Leading tabs set each paragraph's nesting level and are removed by the call, so indices after the range shift — re-read with find_doc_text or get_doc before the next index-based edit. # clear_doc (https://sellersheetai.com/docs/mcp-api/tools/clear_doc) > Delete all content from the document body. Access: **DESTRUCTIVE** · toolset google_workspace · family null The final trailing newline is preserved (Docs API requirement). ## Call it MCP tool call: ```json { "name": "clear_doc", "arguments": { "documentId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/clear_doc \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | ## Result - { cleared: bool } # create_doc_footer (https://sellersheetai.com/docs/mcp-api/tools/create_doc_footer) > Create a document footer and optionally fill it with initial text. Access: **WRITE** · toolset google_workspace · family null If the document already has a default footer, returns its footerId with created=false — text is still prepended to it, so pass text only once. ## Call it MCP tool call: ```json { "name": "create_doc_footer", "arguments": { "documentId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/create_doc_footer \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `text` | string | | Optional initial footer text. | ## Result - { footerId: str, created: bool } # create_doc_header (https://sellersheetai.com/docs/mcp-api/tools/create_doc_header) > Create a document header and optionally fill it with initial text. Access: **WRITE** · toolset google_workspace · family null If the document already has a default header, returns its headerId with created=false — text is still prepended to it, so pass text only once. ## Call it MCP tool call: ```json { "name": "create_doc_header", "arguments": { "documentId": "" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/create_doc_header \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":""}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `text` | string | | Optional initial header text. | ## Result - { headerId: str, created: bool } # create_doc_in_folder (https://sellersheetai.com/docs/mcp-api/tools/create_doc_in_folder) > Create a new blank Google Doc inside a Drive folder. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "create_doc_in_folder", "arguments": { "title": "", "folderId": "<folderId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/create_doc_in_folder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title":"<title>","folderId":"<folderId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `title` | string | yes | Document title. | | `folderId` | string | yes | a Drive folder SellerSheet can write to — e.g. get_user_context's data.workspace_config.userSettingByFolder.sellerSheetFolderId (writable when data.workspace_config.sa_folder_access.ok is true). | ## Result - { documentId: str, url: str } ## Example - create_doc_in_folder(title="Q1 Brand Brief", folderId="1ABC...") # delete_doc_range (https://sellersheetai.com/docs/mcp-api/tools/delete_doc_range) > Delete a content range by index. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "delete_doc_range", "arguments": { "documentId": "<documentId>", "startIndex": 1, "endIndex": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/delete_doc_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","startIndex":1,"endIndex":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `startIndex` | integer | yes | start index, inclusive (from find_doc_text or get_doc). | | `endIndex` | integer | yes | end index, exclusive. | ## Result - { deleted: true } ## Gotchas - Docs refuses deleting the body's final newline, part of a table, or the newline before a table or section break without the element itself; a range across a paragraph end merges the two paragraphs. # doc_batch_update (https://sellersheetai.com/docs/mcp-api/tools/doc_batch_update) > Escape hatch: apply a raw Docs API batchUpdate Requests list. Access: **DESTRUCTIVE** · toolset google_workspace · family null Use it for operations no other doc tool exposes (named ranges, table-cell merges, footnotes, section styles); the list is applied atomically — one invalid request fails them all. Request shapes are documented at https://developers.google.com/docs/api/reference/rest/v1/documents/request ## Call it MCP tool call: ```json { "name": "doc_batch_update", "arguments": { "documentId": "<documentId>", "requests": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/doc_batch_update \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","requests":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `requests` | object[] | yes | List of Docs API Request objects. | ## Result - `replies` — one entry per request, in order (e.g. replies[0].createHeader.headerId); an empty requests list returns replies: [] without calling Google. # find_doc_text (https://sellersheetai.com/docs/mcp-api/tools/find_doc_text) > Find every occurrence of a text substring and return its index ranges. Access: **READ** · toolset google_workspace · family null Use this before calling update_doc_text_style to apply styles to specific words/phrases without computing indices by hand. ## Call it MCP tool call: ```json { "name": "find_doc_text", "arguments": { "documentId": "<documentId>", "needle": "<needle>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/find_doc_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","needle":"<needle>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `needle` | string | yes | Literal text to find (not regex). | | `matchCase` | boolean | | If True, case-sensitive match. | ## Result - { matches: [{startIndex, endIndex, text}, ...], count: N } ## Gotchas - Searches top-level body paragraphs one styled run at a time: text inside tables, headers or footers, or a phrase whose words carry different styles (e.g. half bold), returns no match — replace_doc_text still reaches it. # get_doc (https://sellersheetai.com/docs/mcp-api/tools/get_doc) > Get the full Docs API document resource (body, headers, styles, revisionId). Access: **READ** · toolset google_workspace · family null Use this when you need to map characters to indices — read body.content[*].startIndex/endIndex to find where a paragraph or text run begins. For plain text only, use get_doc_text instead. ## Call it MCP tool call: ```json { "name": "get_doc", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_doc \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | ## Result - The Docs API document resource (structural). # get_doc_metadata (https://sellersheetai.com/docs/mcp-api/tools/get_doc_metadata) > Get document title, revisionId, and documentStyle. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "get_doc_metadata", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_doc_metadata \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | ## Result - { documentId, title, revisionId, documentStyle } # get_doc_text (https://sellersheetai.com/docs/mcp-api/tools/get_doc_text) > Extract the plain text of the document body, table cells included (headers and footers are not). Access: **READ** · toolset google_workspace · family null Offsets in `text` are not document indices — use find_doc_text or get_doc for those. ## Call it MCP tool call: ```json { "name": "get_doc_text", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_doc_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | ## Result - { text: str, length: int } # insert_doc_heading (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_heading) > Convenience: insert a line of text and apply HEADING_{level}. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "insert_doc_heading", "arguments": { "documentId": "<documentId>", "text": "<text>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_heading \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","text":"<text>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `text` | string | yes | Heading text. A trailing newline is added automatically. | | `level` | integer | | 1..6. | | `index` | integer | | a body index at the start of a paragraph (from find_doc_text or get_doc). Omit to append — the heading then joins the last paragraph unless that paragraph is empty. | ## Result - { insertedAt: int, endIndex: int } # insert_doc_image (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_image) > Insert an inline image from a public URL. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "insert_doc_image", "arguments": { "documentId": "<documentId>", "imageUri": "<imageUri>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_image \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","imageUri":"<imageUri>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `imageUri` | string | yes | a publicly readable URL (at most 2 kB) of a PNG, JPEG or GIF under 50 MB and 25 megapixels — a .webp is refused. | | `index` | integer | | Insertion index. Omit to append. | | `widthPt` | number | | size in points, applied only when BOTH are given (one alone is ignored); the image is scaled to fit inside that box, keeping its aspect ratio. | | `heightPt` | number | | size in points, applied only when BOTH are given (one alone is ignored); the image is scaled to fit inside that box, keeping its aspect ratio. | ## Result - { inserted: true } # insert_doc_page_break (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_page_break) > Insert a page break. Access: **WRITE** · toolset google_workspace · family null Omit index to append at end of body. ## Call it MCP tool call: ```json { "name": "insert_doc_page_break", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_page_break \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `index` | integer | | Insertion index. Omit to append. | ## Result - { inserted: true } # insert_doc_section_break (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_section_break) > Insert a section break (Docs adds a newline before it; not allowed inside a table, header or footer). Access: **WRITE** · toolset google_workspace · family null Styling the new section (columns, margins) needs doc_batch_update with an updateSectionStyle request. ## Call it MCP tool call: ```json { "name": "insert_doc_section_break", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_section_break \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `sectionType` | string | | NEXT_PAGE (start on new page) or CONTINUOUS. | | `index` | integer | | Insertion index. Omit to append. | ## Result - { inserted: true } # insert_doc_table (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_table) > Insert an empty table. Access: **WRITE** · toolset google_workspace · family null Fill cells with set_doc_table_cell_text (tableIndex counts tables in document order), or create and fill a table in one call with write_doc_structured's table block. ## Call it MCP tool call: ```json { "name": "insert_doc_table", "arguments": { "documentId": "<documentId>", "rows": 1, "columns": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_table \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","rows":1,"columns":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `rows` | integer | yes | Number of rows (>=1). | | `columns` | integer | yes | Number of columns (>=1). | | `index` | integer | | Insertion index. Omit to append. | ## Result - { inserted: true } # insert_doc_text (https://sellersheetai.com/docs/mcp-api/tools/insert_doc_text) > Insert text at a specific index. Access: **WRITE** · toolset google_workspace · family null If index is null/omitted, append to end. ## Call it MCP tool call: ```json { "name": "insert_doc_text", "arguments": { "documentId": "<documentId>", "text": "<text>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_doc_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","text":"<text>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `text` | string | yes | Text to insert. Include trailing '\n' to start a new paragraph. | | `index` | integer | | a 1-based body index from find_doc_text or get_doc; it must fall inside an existing paragraph (not at a table's start index). Omit to append at the end — the same as append_doc_text. | ## Result - { inserted: true, chars: N } # remove_doc_bullets (https://sellersheetai.com/docs/mcp-api/tools/remove_doc_bullets) > Remove bullet/number glyphs from paragraphs in a range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "remove_doc_bullets", "arguments": { "documentId": "<documentId>", "startIndex": 1, "endIndex": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/remove_doc_bullets \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","startIndex":1,"endIndex":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `startIndex` | integer | yes | first body index of the range (from find_doc_text or get_doc). | | `endIndex` | integer | yes | end index of the range, exclusive. | ## Result - `bulletsRemoved` — true. # rename_doc (https://sellersheetai.com/docs/mcp-api/tools/rename_doc) > Rename a Google Doc via the Drive API. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "rename_doc", "arguments": { "documentId": "<documentId>", "newTitle": "<newTitle>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/rename_doc \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","newTitle":"<newTitle>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `newTitle` | string | yes | New title. | ## Result - { documentId, title } # replace_doc_text (https://sellersheetai.com/docs/mcp-api/tools/replace_doc_text) > Find and replace text across the entire document. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "replace_doc_text", "arguments": { "documentId": "<documentId>", "find": "<find>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/replace_doc_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","find":"<find>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `find` | string | yes | Text to find (literal, not regex). | | `replace` | string | | Replacement text. Default: empty (deletes occurrences). | | `matchCase` | boolean | | If True, match is case-sensitive. Default: False. | ## Result - { occurrencesChanged: N } # set_doc_table_cell_text (https://sellersheetai.com/docs/mcp-api/tools/set_doc_table_cell_text) > Replace the text content of a specific table cell. Access: **DESTRUCTIVE** · toolset google_workspace · family null tableIndex is 0-based across the body's top-level tables (in document order). row and column are 0-based cell coordinates. The cell's first paragraph is replaced; further paragraphs in the cell stay. ## Call it MCP tool call: ```json { "name": "set_doc_table_cell_text", "arguments": { "documentId": "<documentId>", "tableIndex": 1, "row": 1, "column": 1, "text": "<text>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/set_doc_table_cell_text \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","tableIndex":1,"row":1,"column":1,"text":"<text>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `tableIndex` | integer | yes | Which table to target (0 = first table). | | `row` | integer | yes | Cell row (0-based). | | `column` | integer | yes | Cell column (0-based). | | `text` | string | yes | Plain text to place in the cell. | ## Result - { tableIndex, row, column, chars } # style_doc_text_by_match (https://sellersheetai.com/docs/mcp-api/tools/style_doc_text_by_match) > Find every occurrence of `needle` and apply the given text style. Access: **WRITE** · toolset google_workspace · family null Combines find_doc_text + update_doc_text_style in one call. ## Call it MCP tool call: ```json { "name": "style_doc_text_by_match", "arguments": { "documentId": "<documentId>", "needle": "<needle>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/style_doc_text_by_match \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","needle":"<needle>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `needle` | string | yes | Literal text to find. | | `matchCase` | boolean | | Case-sensitive match. | | `bold` | boolean | | set true or false; omit to leave as is. | | `italic` | boolean | | set true or false; omit to leave as is. | | `underline` | boolean | | set true or false; omit to leave as is. | | `strikethrough` | boolean | | set true or false; omit to leave as is. | | `fontSize` | number | | points. | | `fontFamily` | string | | e.g. 'Arial'. | | `foregroundColor` | object[] | | [r, g, b] in 0–1. | | `backgroundColor` | object[] | | [r, g, b] in 0–1. | | `linkUrl` | string | | make every match a link to this URL. | ## Result - { matches: N } ## Example - make every occurrence of "SellerSheet" bold and blue: style_doc_text_by_match( documentId=..., needle="SellerSheet", bold=True, foregroundColor=[0.12, 0.35, 0.85], ) ## Gotchas - Matches through find_doc_text's search, so text inside tables, headers or footers, or a phrase split across differently-styled runs, is not styled (matches: 0). # update_doc_document_style (https://sellersheetai.com/docs/mcp-api/tools/update_doc_document_style) > Update document-level properties: margins, page size, background. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "update_doc_document_style", "arguments": { "documentId": "<documentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/update_doc_document_style \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `marginTopPt` | number | | Page margins. | | `marginBottomPt` | number | | Page margins. | | `marginLeftPt` | number | | Page margins. | | `marginRightPt` | number | | Page margins. | | `pageWidthPt` | number | | Page dimensions. | | `pageHeightPt` | number | | Page dimensions. | | `backgroundColor` | object[] | | RGB list 0.0–1.0 for the page background. | | `useEvenPageHeaderFooter` | boolean | | Different header/footer on even pages. | | `useFirstPageHeaderFooter` | boolean | | Different header/footer on first page. | ## Result - { styled: true } ## Gotchas - Common page sizes in points: US Letter 612 x 792 (default) A4 595 x 842 Legal 612 x 1008 Tabloid 792 x 1224 Common margins (points): 72 = 1", 54 = 0.75", 36 = 0.5". # update_doc_paragraph_style (https://sellersheetai.com/docs/mcp-api/tools/update_doc_paragraph_style) > Apply paragraph-level style to a range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "update_doc_paragraph_style", "arguments": { "documentId": "<documentId>", "startIndex": 1, "endIndex": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/update_doc_paragraph_style \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","startIndex":1,"endIndex":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `startIndex` | integer | yes | Range start (inclusive). | | `endIndex` | integer | yes | Range end (exclusive). | | `namedStyleType` | string | | NORMAL_TEXT, TITLE, SUBTITLE, HEADING_1..HEADING_6. | | `alignment` | string | | START, CENTER, END, JUSTIFIED. | | `lineSpacing` | number | | Percentage — 100 = single, 150 = 1.5x, 200 = double. | | `indentStartPt` | number | | Left indent in points. | | `indentEndPt` | number | | Right indent in points. | | `indentFirstLinePt` | number | | First-line indent (pt). Useful for indented prose. | | `spaceAbovePt` | number | | Vertical space above paragraph (pt). | | `spaceBelowPt` | number | | Vertical space below paragraph (pt). | | `keepWithNext` | boolean | | If True, keep with next paragraph on same page. | ## Result - { styled: true } # update_doc_text_style (https://sellersheetai.com/docs/mcp-api/tools/update_doc_text_style) > Apply character-level text styles to an index range (from find_doc_text or get_doc). Access: **WRITE** · toolset google_workspace · family null To style every occurrence of a word or phrase, style_doc_text_by_match finds and styles in one call. At least one style attribute must be provided. ## Call it MCP tool call: ```json { "name": "update_doc_text_style", "arguments": { "documentId": "<documentId>", "startIndex": 1, "endIndex": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/update_doc_text_style \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","startIndex":1,"endIndex":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `startIndex` | integer | yes | Range start (inclusive). | | `endIndex` | integer | yes | Range end (exclusive). | | `bold` | boolean | | boolean toggles. | | `italic` | boolean | | boolean toggles. | | `underline` | boolean | | boolean toggles. | | `strikethrough` | boolean | | boolean toggles. | | `fontSize` | number | | Point size (float). | | `fontFamily` | string | | Font family name, e.g. "Roboto". | | `foregroundColor` | object[] | | RGB list 0.0–1.0, e.g. [0.2, 0.4, 0.8]. | | `backgroundColor` | object[] | | RGB list 0.0–1.0. | | `linkUrl` | string | | URL to convert the range into a hyperlink. | ## Result - { styled: true } # write_doc_structured (https://sellersheetai.com/docs/mcp-api/tools/write_doc_structured) > Build a document from a list of semantic blocks in ONE call. Access: **DESTRUCTIVE** · toolset google_workspace · family null Use it to write a whole document or append a new section: blocks are appended at the end of the body in order (clearFirst=true replaces the body first). For edits inside existing text use the index-based doc tools. ## Call it MCP tool call: ```json { "name": "write_doc_structured", "arguments": { "documentId": "<documentId>", "blocks": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/write_doc_structured \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documentId":"<documentId>","blocks":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `documentId` | string | yes | the Google Docs document ID. | | `blocks` | object[] | yes | Ordered list of block dicts. | | `clearFirst` | boolean | | If True, clear existing body before writing. | ## Result - { blocksWritten: N } ## Gotchas - Each block is a separate write: an unknown type or a bad block fails the call (400) after the earlier blocks are already in the document — fix it and re-run with clearFirst=true. Block types and shapes: {"type": "title", "text": str} {"type": "subtitle", "text": str} {"type": "heading", "level": 1..6, "text": str, "alignment"?: "START"|"CENTER"|"END"|"JUSTIFIED"} {"type": "paragraph", "text": str, "bold"?: bool, "italic"?: bool, "underline"?: bool, "fontSize"?: float, "fontFamily"?: str, "foregroundColor"?: [r,g,b], "backgroundColor"?: [r,g,b], "alignment"?: str, "linkUrl"?: str} {"type": "bullets", "items": [str, ...], "preset"?: "BULLET_DISC_CIRCLE_SQUARE"} {"type": "numbered", "items": [str, ...], "preset"?: "NUMBERED_DECIMAL_ALPHA_ROMAN"} {"type": "table", "rows": int, "columns": int, "cells"?: [["A1","B1"], ["A2","B2"], ...]} {"type": "image", "uri": str, "widthPt"?: float, "heightPt"?: float} (size applies only when both are given) {"type": "page_break"} {"type": "section_break", "sectionType"?: "NEXT_PAGE"|"CONTINUOUS"} {"type": "horizontal_rule"} {"type": "quote", "text": str} {"type": "spacer"} ## Example - write_doc_structured(documentId=doc_id, clearFirst=True, blocks=[ {"type": "title", "text": "Q1 Brand Audit"}, {"type": "subtitle", "text": "SellerSheet — April 2026"}, {"type": "horizontal_rule"}, {"type": "heading", "level": 1, "text": "Executive Summary"}, {"type": "paragraph", "text": "Revenue grew 24% YoY..."}, {"type": "heading", "level": 2, "text": "Key Findings"}, {"type": "bullets", "items": [ "A+ content live on 82% of ASINs", "CTR up 18% after title rewrite", "Inventory cover: 45 days", ]}, {"type": "page_break"}, {"type": "heading", "level": 1, "text": "Data"}, {"type": "table", "rows": 3, "columns": 3, "cells": [ ["Metric", "Q4", "Q1"], ["Revenue", "$420k", "$521k"], ["CTR", "0.72%", "0.85%"], ]}, {"type": "quote", "text": "Numbers tell the story, design tells the truth."}, ]) # copy_drive_file (https://sellersheetai.com/docs/mcp-api/tools/copy_drive_file) > Copy a file, returns new file ID. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "copy_drive_file", "arguments": { "fileId": "<fileId>", "name": "<name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/copy_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>","name":"<name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `name` | string | yes | Name for the copied file. | | `parentId` | string | | Optional target folder ID. | | `convertTo` | string | | Optional Google Workspace target mimeType — Drive converts on copy. E.g. copy an .xlsx Drive file with convertTo='application/vnd.google-apps.spreadsheet' to get a native Google Sheet copy (the source file is untouched). | ## Result - `fileId` — New file ID. ## Example - copy_drive_file(fileId="1XYZ...", name="Copy of Report", parentId="1ABC...") copy_drive_file(fileId="<xlsx id>", name="Q3 Model", convertTo="application/vnd.google-apps.spreadsheet") # create_spreadsheet_in_folder (https://sellersheetai.com/docs/mcp-api/tools/create_spreadsheet_in_folder) > Create a new empty Google Sheet in a Drive folder — for light builds, or when you have no local filesystem. Access: **WRITE** · toolset google_workspace · family null For a multi-tab workbook (more than ~15 write/format calls), build an .xlsx locally and import it in one call with start_drive_upload (mimeType = the xlsx type, convertTo = 'application/vnd.google-apps.spreadsheet'); formulas, formats, notes, frozen panes, dropdowns and charts survive the conversion. ## Call it MCP tool call: ```json { "name": "create_spreadsheet_in_folder", "arguments": { "title": "<title>", "folderId": "<folderId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/create_spreadsheet_in_folder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title":"<title>","folderId":"<folderId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `title` | string | yes | Spreadsheet title. | | `folderId` | string | yes | Target Drive folder ID. | ## Result - `spreadsheetId` — The new spreadsheet ID. - `url` — Direct URL to the spreadsheet. ## Example - create_spreadsheet_in_folder(title="Store Reports", folderId="1ABC...") # delete_drive_file (https://sellersheetai.com/docs/mcp-api/tools/delete_drive_file) > Delete or trash a file. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "delete_drive_file", "arguments": { "fileId": "<fileId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/delete_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `permanent` | boolean | | If true, permanently delete. If false, move to trash (default false). | ## Result - `success` — Boolean indicating successful deletion. ## Example - delete_drive_file(fileId="1XYZ...") delete_drive_file(fileId="1XYZ...", permanent=True) # find_file_in_folder (https://sellersheetai.com/docs/mcp-api/tools/find_file_in_folder) > Find the first Google Sheet in a folder whose name contains a substring — only spreadsheets match; for any other file type use search_drive_files with rawQuery and parentId. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "find_file_in_folder", "arguments": { "folderId": "<folderId>", "nameContains": "<nameContains>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/find_file_in_folder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"folderId":"<folderId>","nameContains":"<nameContains>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `folderId` | string | yes | Drive folder ID to search within. | | `nameContains` | string | yes | Substring to match in file names. | ## Result - `fileId` — Spreadsheet ID of first match, or null if not found. - `found` — Boolean indicating if a match was found. ## Example - find_file_in_folder(folderId="1ABC...", nameContains="report_2026") # find_or_create_folder (https://sellersheetai.com/docs/mcp-api/tools/find_or_create_folder) > Find a subfolder by name inside parentId, or create it if missing. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "find_or_create_folder", "arguments": { "name": "<name>", "parentId": "<parentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/find_or_create_folder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"<name>","parentId":"<parentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `name` | string | yes | Folder name to find or create. | | `parentId` | string | yes | Drive folder ID to search within. | ## Result - `folderId` — The folder ID (existing or newly created). ## Example - find_or_create_folder(name="Reports", parentId="1ABC...") # get_drive_file (https://sellersheetai.com/docs/mcp-api/tools/get_drive_file) > Get file metadata. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "get_drive_file", "arguments": { "fileId": "<fileId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | ## Result - `file` — File metadata dict with id, name, mimeType, size, modifiedTime, parents, webViewLink. ## Example - get_drive_file(fileId="1XYZ...") # list_drive_files (https://sellersheetai.com/docs/mcp-api/tools/list_drive_files) > List the files directly inside a folder of your SellerSheet workspace. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "list_drive_files", "arguments": {} } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_drive_files \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `parentId` | string | | the folder to list — the SellerSheet folder the sidebar created or any folder inside it. Omitted, it covers that folder and the workspace folders in it (Listings, StoreReports, Shipments, …), direct children of each. A folder outside the workspace, or one SellerSheet cannot see, is refused. | | `max` | integer | | files to return, 1–1000 (Drive's pageSize cap); there is no next page — raise max or narrow parentId. Default: 20. | ## Result - `files` — List of file objects with id, name, mimeType, size, modifiedTime, parents. ## Example - list_drive_files(parentId="1ABC...", max=50) # list_drive_permissions (https://sellersheetai.com/docs/mcp-api/tools/list_drive_permissions) > List all permissions on a file. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "list_drive_permissions", "arguments": { "fileId": "<fileId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_drive_permissions \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | ## Result - `permissions` — List of permission objects with id, type, role, emailAddress, domain, displayName. ## Example - list_drive_permissions(fileId="1XYZ...") # move_file_to_folder (https://sellersheetai.com/docs/mcp-api/tools/move_file_to_folder) > Move a file to a new parent folder. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "move_file_to_folder", "arguments": { "fileId": "<fileId>", "newParentId": "<newParentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/move_file_to_folder \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>","newParentId":"<newParentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `newParentId` | string | yes | Target folder ID. | ## Result - `success` — Boolean indicating successful move. ## Example - move_file_to_folder(fileId="1XYZ...", newParentId="1ABC...") # rename_drive_file (https://sellersheetai.com/docs/mcp-api/tools/rename_drive_file) > Rename a file. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "rename_drive_file", "arguments": { "fileId": "<fileId>", "newName": "<newName>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/rename_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>","newName":"<newName>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `newName` | string | yes | New file name. | ## Result - `success` — Boolean indicating successful rename. ## Example - rename_drive_file(fileId="1XYZ...", newName="Updated Report 2026") # save_url_to_drive (https://sellersheetai.com/docs/mcp-api/tools/save_url_to_drive) > Save an Amazon image-CDN file (media-amazon.com, ssl-images-amazon.com and their .cn twins; at most 10 MB) straight to a Drive folder — the server streams it. Access: **WRITE** · toolset google_workspace · family null Any other host, including cdn.sellersheetai.com, is refused (403); use start_drive_upload for those. ## Call it MCP tool call: ```json { "name": "save_url_to_drive", "arguments": { "url": "<url>", "parentId": "<parentId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/save_url_to_drive \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"<url>","parentId":"<parentId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `url` | string | yes | https URL of the file (e.g. https://m.media-amazon.com/images/I/....jpg). | | `parentId` | string | yes | Target Drive folder ID. | | `name` | string | | Optional file name. Defaults to the URL's basename. | ## Result - `fileId` — the new Drive file's ID. - `name` — the name it was saved under. - `size` — bytes written. ## Example - save_url_to_drive(url="https://m.media-amazon.com/images/I/61abc.jpg", parentId="1ABC...") # search_drive_files (https://sellersheetai.com/docs/mcp-api/tools/search_drive_files) > Search files by text or raw Drive query inside your SellerSheet workspace. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "search_drive_files", "arguments": { "query": "<query>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/search_drive_files \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query":"<query>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `query` | string | yes | Search text or raw Drive query string. | | `rawQuery` | boolean | | true sends query as a Drive v3 `q` expression (e.g. "name contains 'invoice' and mimeType = 'application/pdf'") — add "and trashed = false" yourself, it is not appended. False (default) matches query against names and file content (fullText contains), trash excluded. | | `parentId` | string | | the folder to search — the SellerSheet folder the sidebar created or any folder inside it; Drive matches direct children only. Omitted, it covers that folder and the workspace folders in it. A folder outside the workspace is refused. | | `max` | integer | | Maximum number of files to return (default 20). | ## Result - `files` — List of file objects with id, name, mimeType, size, modifiedTime. ## Example - search_drive_files(query="invoice", max=10) search_drive_files(query="mimeType='application/pdf'", rawQuery=True) # share_drive_file (https://sellersheetai.com/docs/mcp-api/tools/share_drive_file) > Share a file with one person (email) or a whole domain (domain; email wins if both are passed). Access: **WRITE** · toolset google_workspace · family null Drive sends no notification email — tell the person yourself. ## Call it MCP tool call: ```json { "name": "share_drive_file", "arguments": { "fileId": "<fileId>", "role": "<role>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/share_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>","role":"<role>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `role` | string | yes | 'reader', 'commenter' or 'writer'. | | `email` | string | | Email address to share with (for user sharing). | | `domain` | string | | Domain to share with (for domain sharing). | ## Result - `permissionId` — Permission ID. ## Example - share_drive_file(fileId="1XYZ...", role="reader", email="user@example.com") share_drive_file(fileId="1XYZ...", role="reader", domain="example.com") # start_drive_upload (https://sellersheetai.com/docs/mcp-api/tools/start_drive_upload) > Begin a direct upload of LOCAL bytes to Drive. Access: **WRITE** · toolset google_workspace · family null The server returns an uploadUrl (a Google resumable session); you then PUT the file bytes DIRECTLY to that URL — the bytes never pass through the SellerSheet server. Use this for files you have on disk that are not reachable by URL (for URL sources use save_url_to_drive instead). ## Call it MCP tool call: ```json { "name": "start_drive_upload", "arguments": { "parentId": "<parentId>", "name": "<name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/start_drive_upload \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"parentId":"<parentId>","name":"<name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `parentId` | string | yes | Target Drive folder ID. | | `name` | string | yes | File name to create in Drive. | | `mimeType` | string | | Optional MIME type OF THE BYTES YOU WILL PUT (default application/octet-stream). | | `convertTo` | string | | Optional Google Workspace target type — Drive converts the uploaded bytes on arrival. E.g. upload an .xlsx (mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') with convertTo='application/vnd.google-apps.spreadsheet' and the created file is a NATIVE Google Sheet (formulas, formats, dropdowns, notes, frozen panes preserved). When converting, your PUT request's Content-Type header must equal mimeType. | ## Result - `uploadUrl` — PUT the file bytes here, e.g. `curl -X PUT -H "Content-Type: <mimeType>" --data-binary @FILE "<uploadUrl>"`. - `expiresInDays` — Session validity (7). - `howTo` — Recipe string. The PUT response body is the new file resource — read "id" from it to get the Drive fileId. ## Example - start_drive_upload(parentId="1ABC...", name="report.pdf", mimeType="application/pdf") # xlsx -> native Google Sheet import: start_drive_upload(parentId="1ABC...", name="Q3 Model", mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", convertTo="application/vnd.google-apps.spreadsheet") # unshare_drive_file (https://sellersheetai.com/docs/mcp-api/tools/unshare_drive_file) > Remove a permission from a file. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "unshare_drive_file", "arguments": { "fileId": "<fileId>", "permissionId": "<permissionId>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/unshare_drive_file \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"fileId":"<fileId>","permissionId":"<permissionId>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `fileId` | string | yes | the Drive file ID. | | `permissionId` | string | yes | Permission ID to remove. | ## Result - `success` — Boolean indicating successful removal. ## Example - unshare_drive_file(fileId="1XYZ...", permissionId="12345") # add_sheet_chart (https://sellersheetai.com/docs/mcp-api/tools/add_sheet_chart) > Insert a native Google Sheets chart over a range of data. Access: **WRITE** · toolset google_workspace · family null The first column of `data_range` is the domain (x-axis / labels). Remaining columns become series. For PIE the first column is labels and the second is values. ## Call it MCP tool call: ```json { "name": "add_sheet_chart", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "data_range": "<data_range>", "chart_type": "<chart_type>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/add_sheet_chart \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","data_range":"<data_range>","chart_type":"<chart_type>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `data_range` | string | yes | A1 range INCLUDING the header row, e.g. 'Competitors!B3:C18' or 'Budget!A10:D14'. At least 2 columns (labels + one series); PIE reads only the first two. | | `chart_type` | string | yes | BAR, COLUMN, LINE, AREA, SCATTER, COMBO, or PIE. | | `title` | string | | Chart title. | | `anchor_range` | string | | Single-cell A1 for the chart anchor (e.g. 'Competitors!H3'). Omit to place just to the right of data_range. | | `width_pixels` | integer | | chart size in pixels, default 600 × 371. | | `height_pixels` | integer | | chart size in pixels, default 600 × 371. | | `legend_position` | string | | BOTTOM_LEGEND / LEFT_LEGEND / RIGHT_LEGEND / TOP_LEGEND / NO_LEGEND. | | `x_axis_title` | string | | Axis labels. | | `y_axis_title` | string | | Axis labels. | | `stacked_type` | string | | 'STACKED' or 'PERCENT_STACKED' for bar/column/area. | ## Result - { chartId: int, sheetId: int } ## Gotchas - Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - add_sheet_chart( spreadsheet_id='1ABC...', data_range='Budget!A10:G14', chart_type='COLUMN', title='Monthly contribution', anchor_range='Budget!I10', stacked_type='STACKED', ) # add_sheet_conditional_format (https://sellersheetai.com/docs/mcp-api/tools/add_sheet_conditional_format) > Add a conditional formatting rule to a range: a boolean rule (the default) that formats the cells meeting a condition, or a 2- or 3-stop colour gradient. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "add_sheet_conditional_format", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/add_sheet_conditional_format \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with sheet name (e.g. 'VOC!C4:C18'). | | `rule_type` | string | | the boolean condition; ignored when gradient is true. Allowed: NUMBER_GREATER (default), NUMBER_GREATER_THAN_EQ, NUMBER_LESS, NUMBER_LESS_THAN_EQ, NUMBER_EQ, NUMBER_NOT_EQ, NUMBER_BETWEEN, NUMBER_NOT_BETWEEN, TEXT_CONTAINS, TEXT_NOT_CONTAINS, TEXT_STARTS_WITH, TEXT_ENDS_WITH, TEXT_EQ, BLANK, NOT_BLANK, CUSTOM_FORMULA. | | `values` | object[] | | the condition's values — one for most types, two for NUMBER_BETWEEN / NUMBER_NOT_BETWEEN, one formula ('=…') for CUSTOM_FORMULA, none for BLANK / NOT_BLANK. | | `background_color` | object[] | | the format a boolean rule applies; colours are RGB floats 0–1. | | `font_color` | object[] | | the format a boolean rule applies; colours are RGB floats 0–1. | | `bold` | boolean | | the format a boolean rule applies; colours are RGB floats 0–1. | | `gradient` | boolean | | true for a colour-scale rule instead of a boolean one. | | `min_color` | object[] | | RGB floats 0–1. min_color and max_color are required when gradient is true; mid_color adds a third stop. | | `mid_color` | object[] | | RGB floats 0–1. min_color and max_color are required when gradient is true; mid_color adds a third stop. | | `max_color` | object[] | | RGB floats 0–1. min_color and max_color are required when gradient is true; mid_color adds a third stop. | | `min_value` | string | | where each stop sits — 'MIN', 'MAX', 'NUMBER:5', 'PERCENT:50', 'PERCENTILE:90' or a plain number. mid_value defaults to 'PERCENT:50' when mid_color is given. | | `mid_value` | string | | where each stop sits — 'MIN', 'MAX', 'NUMBER:5', 'PERCENT:50', 'PERCENTILE:90' or a plain number. mid_value defaults to 'PERCENT:50' when mid_color is given. | | `max_value` | string | | where each stop sits — 'MIN', 'MAX', 'NUMBER:5', 'PERCENT:50', 'PERCENTILE:90' or a plain number. mid_value defaults to 'PERCENT:50' when mid_color is given. | ## Result - { sheetId: int, applied: true } ## Gotchas - A boolean rule needs at least one of background_color, font_color or bold, or it is refused. The rule is inserted first (index 0), above every existing rule on the tab. Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - # Green rows where rank ≤ 10 add_sheet_conditional_format( spreadsheet_id='1ABC...', range_='Competitors!A4:F18', rule_type='NUMBER_LESS_THAN_EQ', values=['10'], background_color=[0.85, 0.92, 0.83], bold=True, ) # Green (low) → yellow → red (high) on the gap_ratio column add_sheet_conditional_format( spreadsheet_id='1ABC...', range_='VOC!D4:D14', gradient=True, min_color=[0.57, 0.77, 0.49], mid_color=[1.0, 0.95, 0.6], max_color=[0.91, 0.26, 0.21], min_value='MIN', mid_value='NUMBER:5', max_value='MAX', ) # add_sheet_dropdown (https://sellersheetai.com/docs/mcp-api/tools/add_sheet_dropdown) > Set, replace or remove the dropdown on a range — the one dropdown tool. Access: **WRITE** · toolset google_workspace · family null Pass values for a fixed list, source_range for a list kept in other cells, or values=[] to remove the dropdown. The reply echoes the rule as written, in the shape get_sheet_cell reads, so no second read is needed to check it. Writing a value into a dropdown cell is write_sheet, with one of the values exactly as listed. ## Call it MCP tool call: ```json { "name": "add_sheet_dropdown", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/add_sheet_dropdown \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | the cells to put the dropdown on, an A1 range that names its tab ('Plan!D2:D100'); an open end runs to the edge ('Plan!D2:D', 'Plan!A:D'). | | `values` | object[] | | the options, in order; a number is sent as its text ('1'). values=[] removes the dropdown from range_. Pass this or source_range, not both. | | `source_range` | string | | the cells that hold the options, an A1 range that names its tab ('Lists!A2:A30'); the dropdown follows them when they change. The echo and get_sheet_cell quote a tab name that needs it ("'my-tab'!A2:A30"). | | `strict` | boolean | | True (default) = the sheet rejects a value a person types that is not an option; False = it keeps the value and marks it invalid. Neither applies to write_sheet: a written value is kept as written, so write an option verbatim. | ## Result - `data.dropdown` — the rule as written — {values, strict} or {source_range, strict}; null when the dropdown was removed. - `data.range / data.rowCount / data.colCount` — the cells it covers (a count is null on an open side). ## Example - add_sheet_dropdown("1ABC...", "Plan!D2:D100", values=["PENDING", "IN_PROGRESS", "DONE", "CANCELLED"]) add_sheet_dropdown("1ABC...", "Plan!E2:E100", source_range="Lists!A2:A30") add_sheet_dropdown("1ABC...", "Plan!D2:D100", values=[]) # remove # add_sheet_named_range (https://sellersheetai.com/docs/mcp-api/tools/add_sheet_named_range) > Add a new named range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "add_sheet_named_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "name": "<name>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/add_sheet_named_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","name":"<name>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `name` | string | yes | Name for the named range. | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:D100'). | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - add_sheet_named_range("1ABC...", "MyRange", "Sheet1!A1:D100") # add_sheet_tab (https://sellersheetai.com/docs/mcp-api/tools/add_sheet_tab) > Add a new tab to the spreadsheet. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "add_sheet_tab", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/add_sheet_tab \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | ## Result - `data.sheetId` — the new tab's integer id (what sheet_batch_update takes). - `data.sheetName` — its name. ## Example - add_sheet_tab("1ABC...", "New Tab") # append_sheet_rows (https://sellersheetai.com/docs/mcp-api/tools/append_sheet_rows) > Append rows below the last non-empty row of the columns in range_. Access: **WRITE** · toolset google_workspace · family null Writing starts at range_'s leftmost column. ## Call it MCP tool call: ```json { "name": "append_sheet_rows", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "values": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/append_sheet_rows \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","values":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | Column-only A1 notation, no row numbers ('Sheet1!A:Z', not 'Sheet1!A1:Z10' — a row-bounded range is refused with a 400). Examples: 'Sheet1!A:Z' → appends from column A 'Sheet1!C:Z' → appends from column C 'C:Z' → appends from column C of the spreadsheet's first tab | | `values` | object[] | yes | 2D list of rows to append. | ## Result - `data.appended` — the number of rows written. ## Gotchas - Cells are written RAW, not parsed: '=SUM(A:A)' lands as text and '2026-05-12' as a string. Use write_sheet at the next row when the rows carry formulas or dates. Calls that append to the same tab must run one after another: each finds the next empty row, so two at once write to the same row. The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. ## Example - # Append from column A append_sheet_rows("1ABC...", "Sheet1!A:Z", [["val1", "val2", "val3"]]) # Append from column C append_sheet_rows("1ABC...", "Sheet1!C:Z", [["c_val", "d_val"]]) # apply_sheet_table_style (https://sellersheetai.com/docs/mcp-api/tools/apply_sheet_table_style) > Style an already-written range as a table: a bold, coloured, centred header row, alternating row bands, thin grey borders and a frozen header. Access: **WRITE** · toolset google_workspace · family null Use it after writing the data; for a single fill or font change, use format_sheet_range. ## Call it MCP tool call: ```json { "name": "apply_sheet_table_style", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/apply_sheet_table_style \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with at least 2 rows, e.g. 'Summary!A1:D20'. Its first row is the header; the remaining rows get the alternating bands. | | `header_color` | object[] | | RGB floats 0–1. Defaults: [0.27, 0.45, 0.77] (blue), [1, 1, 1] (white), [0.95, 0.95, 0.95] (light grey). | | `header_text_color` | object[] | | RGB floats 0–1. Defaults: [0.27, 0.45, 0.77] (blue), [1, 1, 1] (white), [0.95, 0.95, 0.95] (light grey). | | `alt_row_color` | object[] | | RGB floats 0–1. Defaults: [0.27, 0.45, 0.77] (blue), [1, 1, 1] (white), [0.95, 0.95, 0.95] (light grey). | | `freeze_header` | boolean | | Freeze rows above + including the header row. Default True. | | `add_borders` | boolean | | Apply thin borders. Default True. | ## Result - `data.bandedRangeId` — the id of the new banding. - `data.frozeHeader / data.addedBorders` — what was applied. ## Gotchas - Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - apply_sheet_table_style("1ABC...", "Summary!A1:D10") # autofit_sheet_columns (https://sellersheetai.com/docs/mcp-api/tools/autofit_sheet_columns) > Auto-resize columns to fit their content — wraps Sheets `autoResizeDimensions`. Access: **WRITE** · toolset google_workspace · family null No more guessing pixel widths. ## Call it MCP tool call: ```json { "name": "autofit_sheet_columns", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/autofit_sheet_columns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `start_col` | integer | | 0-based start column index. Default 0 (column A). | | `end_col` | integer | | 0-based exclusive end. None = autofit every column the tab has (uses gridProperties.columnCount). | ## Result - `data.startCol / data.endCol` — the column span fitted (0-based, end exclusive). - `data.sheetId` — the tab's id. ## Example - # autofit columns A–F autofit_sheet_columns("1ABC...", "Summary", start_col=0, end_col=6) # autofit the whole tab autofit_sheet_columns("1ABC...", "Summary") # clear_sheet_range (https://sellersheetai.com/docs/mcp-api/tools/clear_sheet_range) > Clear the values in a range. Access: **DESTRUCTIVE** · toolset google_workspace · family null Formatting, notes and data validation stay. ## Call it MCP tool call: ```json { "name": "clear_sheet_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/clear_sheet_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:Z100'). | ## Result - `data.cleared` — the range that was cleared. ## Example - clear_sheet_range("1ABC...", "Sheet1!A1:Z100") # collapse_sheet_group (https://sellersheetai.com/docs/mcp-api/tools/collapse_sheet_group) > Collapse (collapsed=True) or expand the row or column groups that lie inside range_. Access: **WRITE** · toolset google_workspace · family null This flips each group's toggle and hides or shows its rows or columns. A range with no group inside is refused; to show rows hidden without a group, use hide_sheet_rows with hidden false. ## Call it MCP tool call: ```json { "name": "collapse_sheet_group", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/collapse_sheet_group \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range covering the grouped dimension. | | `dimension` | string | | 'COLUMNS' or 'ROWS'. | | `collapsed` | boolean | | True to collapse, False to expand. | ## Result - { sheetId, collapsed: bool, groups: the number of groups flipped } ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. The grouped axis needs both ends ('Tab!C:F', 'Tab!5:20'). ## Example - collapse_sheet_group("1ABC...", "Listing!F1:J1", "COLUMNS", True) # copy_sheet_format (https://sellersheetai.com/docs/mcp-api/tools/copy_sheet_format) > Copy formatting only (no values) from source range to target range. Access: **WRITE** · toolset google_workspace · family null Sheets paste-special equivalent — use this to propagate a formatted block (header style, conditional fills) to a new region without clobbering its values. ## Call it MCP tool call: ```json { "name": "copy_sheet_format", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "source_range": "<source_range>", "target_range": "<target_range>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/copy_sheet_format \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","source_range":"<source_range>","target_range":"<target_range>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `source_range` | string | yes | A1 source range (e.g. 'Template!A1:D1'). | | `target_range` | string | yes | A1 target range (e.g. 'Report!A1:D1'). | ## Result - `data.sourceSheetId / data.targetSheetId` — the tabs involved. ## Gotchas - A target that is a multiple of the source's height or width repeats the format, so one header row's style fills 'Report!A2:D500' in one call. A smaller target still receives the whole source. Source and target must be in the same spreadsheet. Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - copy_sheet_format("1ABC...", "Template!A1:D1", "Q1 Report!A1:D1") # copy_sheet_tab (https://sellersheetai.com/docs/mcp-api/tools/copy_sheet_tab) > Copy a tab, with all its formatting, into another spreadsheet (or the same one). Access: **WRITE** · toolset google_workspace · family null Its main use is restoring a broken SellerSheet tab (wrong columns, deleted headers, corrupted formatting) from the master template. ## Call it MCP tool call: ```json { "name": "copy_sheet_tab", "arguments": { "source_spreadsheet_id": "<source_spreadsheet_id>", "sheet_name": "<sheet_name>", "dest_spreadsheet_id": "<dest_spreadsheet_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/copy_sheet_tab \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"source_spreadsheet_id":"<source_spreadsheet_id>","sheet_name":"<sheet_name>","dest_spreadsheet_id":"<dest_spreadsheet_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `source_spreadsheet_id` | string | yes | Spreadsheet ID to copy from — the SellerSheet master template is 1BVm1knCy_9DZGtCsaD9dKjvRVBMnF2_Vj7kyRiENF40. | | `sheet_name` | string | yes | the tab name. | | `dest_spreadsheet_id` | string | yes | Spreadsheet ID to copy into. | | `keep_rows` | integer | | after copying, clear the cell values below this row (formats stay). Omit it, or pass 0, to keep everything. E.g. 3 keeps rows 1–3. | ## Result - `data.sheetId` — the copy's tab id. - `data.sheetName` — its final name — the source name when copying across spreadsheets, 'Copy of <name>' within one. ## Workflow - 1. Read data.workspace_config.userSettingBySpreadsheet.storeReportsSpreadsheetId from get_user_context. 2. Call this tool with the master template as source and that id as dest. ## Gotchas - Across spreadsheets, a tab with the same name in dest is replaced, data included, once the copy has landed, so the fresh copy keeps the name; a failed copy leaves dest as it was. Within one spreadsheet nothing is deleted and Google names the copy 'Copy of <name>' — rename it with rename_sheet_tab. Google's copy (sheets.copyTo) keeps formatting, frozen panes, column widths and hidden rows — unlike read + write. Pass a hyphenated tab name ('STA-BoxFirst') bare — the server quotes it. The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. # create_sheet_filter (https://sellersheetai.com/docs/mcp-api/tools/create_sheet_filter) > Create a filter view on a range: a named, saved filter anyone can open from Data > Filter views without touching the tab's one basic filter (set_sheet_basic_filter sets that). Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "create_sheet_filter", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "title": "<title>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/create_sheet_filter \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","title":"<title>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range, header row included (e.g. 'Sheet1!A1:D100'). | | `title` | string | yes | the filter view's name. | ## Result - `data.filterViewId` — the new filter view's id. - `data.title` — its name. ## Gotchas - The view starts with no criteria; set them, or delete the view, with sheet_batch_update (updateFilterView / deleteFilterView with data.filterViewId). Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - create_sheet_filter("1ABC...", "Sheet1!A1:D100", "My Filter") # delete_sheet_named_range (https://sellersheetai.com/docs/mcp-api/tools/delete_sheet_named_range) > Delete a named range. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "delete_sheet_named_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "name": "<name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/delete_sheet_named_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","name":"<name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `name` | string | yes | Name of the named range to delete. | ## Result - Success confirmation. ## Example - delete_sheet_named_range("1ABC...", "MyRange") # delete_sheet_tab (https://sellersheetai.com/docs/mcp-api/tools/delete_sheet_tab) > Delete a tab from the spreadsheet. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "delete_sheet_tab", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/delete_sheet_tab \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | ## Result - Success confirmation. ## Example - delete_sheet_tab("1ABC...", "Old Tab") # find_replace_in_sheet (https://sellersheetai.com/docs/mcp-api/tools/find_replace_in_sheet) > Find and replace text in a sheet. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "find_replace_in_sheet", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "find": "<find>", "replace": "<replace>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/find_replace_in_sheet \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","find":"<find>","replace":"<replace>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `find` | string | yes | Text to find. | | `replace` | string | yes | Replacement text. | | `sheet_name` | string | | the tab name. Omit it to search every tab. | | `match_case` | boolean | | Match case (default: False). | | `match_entire` | boolean | | Match entire cell (default: False). | | `regex` | boolean | | Use regex (default: False). | | `include_formulas` | boolean | | Also search and replace inside formula strings (default: False). Use this to update IMPORTRANGE spreadsheet IDs in formula cells. | ## Result - `data.occurrencesChanged` — the number of replacements (0 = nothing matched). - `data.valuesChanged / data.formulasChanged / data.rowsChanged / data.sheetsChanged` — Google's per-kind counts. ## Example - find_replace_in_sheet("1ABC...", "old", "new", "Sheet1", match_case=True) find_replace_in_sheet("1ABC...", "oldSheetId", "newSheetId", include_formulas=True) # format_sheet_range (https://sellersheetai.com/docs/mcp-api/tools/format_sheet_range) > Set the fill colour, font colour, bold and font size of a range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "format_sheet_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/format_sheet_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation with sheet name, e.g. 'SP Campaigns!A2:AA2'. | | `background_color` | object[] | | RGB floats 0–1, e.g. [0.0589, 0.6197, 0.4393] (#0F9E70). On its own it changes only the fill. | | `font_color` | object[] | | bold true/false; font colour as RGB floats 0–1 (e.g. [1, 1, 1] for white); size in points. Each one you pass is set; one you leave out keeps its current value. | | `bold` | boolean | | bold true/false; font colour as RGB floats 0–1 (e.g. [1, 1, 1] for white); size in points. Each one you pass is set; one you leave out keeps its current value. | | `font_size` | integer | | bold true/false; font colour as RGB floats 0–1 (e.g. [1, 1, 1] for white); size in points. Each one you pass is set; one you leave out keeps its current value. | ## Result - Success confirmation. ## Gotchas - The API truncates each colour channel to a byte, so compute R/255 and round up at the 4th decimal (#28334F → [0.1569, 0.2, 0.3099]). Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. The yellow / light-yellow / gray header fills and green label row of older SellerSheet guides are retired; SellerSheet tabs use one navy header band whose font colour marks required, optional and auto columns. ## Example - format_sheet_range("1ABC...", "Sheet1!A1:D1", font_color=[1, 1, 1], bold=True, font_size=10) # freeze_sheet_panes (https://sellersheetai.com/docs/mcp-api/tools/freeze_sheet_panes) > Freeze rows and/or columns in a sheet. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "freeze_sheet_panes", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/freeze_sheet_panes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `rows` | integer | | the rows to freeze from the top / the columns to freeze from the left. Omit one to keep its current count; pass 0 to unfreeze it. | | `cols` | integer | | the rows to freeze from the top / the columns to freeze from the left. Omit one to keep its current count; pass 0 to unfreeze it. | ## Result - `data.rows / data.cols` — the frozen counts after the call. ## Example - freeze_sheet_panes("1ABC...", "Sheet1", rows=2, cols=1) # get_sheet_cell (https://sellersheetai.com/docs/mcp-api/tools/get_sheet_cell) > Read everything about a cell or a small range in one call: value, formula, format, note, hyperlink and dropdown. Access: **READ** · toolset google_workspace · family null Replaces read_sheet + read_sheet_format + get_sheet_notes when the AI needs a cell's complete state. To pick a dropdown value: read the cell's dropdown here, then write one of its values exactly as listed with write_sheet — a write is not checked against the list (even a strict one): any other value is kept and only marked invalid on the sheet. ## Call it MCP tool call: ```json { "name": "get_sheet_cell", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_sheet_cell \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range, e.g. 'Summary!A1' or 'Summary!A1:C10'. A multi-cell range returns every cell in data.cells. A range of more than 500 cells is refused; use read_sheet or read_sheet_format for larger ranges. | | `include` | object[] | | the groups to read; omit for all. Allowed: value \| format \| note \| hyperlink \| dropdown. Ask only for what you need — format is about 1 KB a cell, so checking dropdowns on a row is include=['value', 'dropdown']. | ## Result - `data.cells[r][c]` — one dict per cell, padded to the full range, with the fields of the groups asked for — value: {value, formatted_value, formula, effective_value} (value is what was entered, a formula cell gives its formula; effective_value is the computed result); format: {user_entered_format, effective_format}; note; hyperlink; dropdown: {values, strict} for a list, {source_range, strict} for a list fed by a range, or null — the same shape add_sheet_dropdown writes and echoes. - `data.rows / data.cols` — the grid size. - `data.row / data.col` — the 0-based origin of the top-left cell. The top-left cell's fields also appear flat on data. ## Example - get_sheet_cell("1ABC...", "Summary!B5") get_sheet_cell("1ABC...", "Plan!K9:N9", include=["value", "dropdown"]) # get_sheet_links (https://sellersheetai.com/docs/mcp-api/tools/get_sheet_links) > Get hyperlinks from a range. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "get_sheet_links", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_sheet_links \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:D100'). | ## Result - `data.links[]` — {sheet, row, col, text, url} for each cell in range_ with a hyperlink, in reading order; text is the displayed text, row and col are 0-based (A1 = 0, 0). - `data.count` — the number of links. ## Example - get_sheet_links("1ABC...", "Sheet1!A1:D100") # get_sheet_metadata (https://sellersheetai.com/docs/mcp-api/tools/get_sheet_metadata) > Get the spreadsheet's metadata: title, locale, time zone and every tab's properties. Access: **READ** · toolset google_workspace · family null For tab names and sheetIds only, list_sheet_tabs is much smaller. ## Call it MCP tool call: ```json { "name": "get_sheet_metadata", "arguments": { "spreadsheet_id": "<spreadsheet_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_sheet_metadata \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | ## Result - `data.properties` — title, locale, timeZone. - `data.sheets[]` — each tab's properties (sheetId, title, index, gridProperties rowCount / columnCount / frozenRowCount) plus its protectedRanges, merges, basicFilter, charts and conditionalFormats. - `data.namedRanges[] / data.spreadsheetUrl` — the named ranges and the URL. ## Gotchas - The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. ## Example - get_sheet_metadata("1ABC...") # get_sheet_named_range (https://sellersheetai.com/docs/mcp-api/tools/get_sheet_named_range) > Get a specific named range. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "get_sheet_named_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "name": "<name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_sheet_named_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","name":"<name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `name` | string | yes | Name of the named range. | ## Result - `data.namedRange` — {namedRangeId, name, range}. range is a GridRange (0-based, exclusive ends). An unknown name is refused (HTTP 404). ## Example - get_sheet_named_range("1ABC...", "MyRange") # get_sheet_notes (https://sellersheetai.com/docs/mcp-api/tools/get_sheet_notes) > Get notes from a range. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "get_sheet_notes", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_sheet_notes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:D100'). | ## Result - `data.notes[]` — {sheet, row, col, note} for each cell in range_ that has a note, in reading order; row and col are 0-based (A1 = 0, 0). - `data.count` — the number of notes. ## Example - get_sheet_notes("1ABC...", "Sheet1!A1:D100") # group_sheet_rows_cols (https://sellersheetai.com/docs/mcp-api/tools/group_sheet_rows_cols) > Group rows or columns (creates a collapsible [+] toggle in the sheet). Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "group_sheet_rows_cols", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/group_sheet_rows_cols \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with sheet name, e.g. 'Listing!F1:J1'. | | `dimension` | string | | 'COLUMNS' or 'ROWS'. | ## Result - { sheetId, grouped: true } ## Gotchas - Only the relevant axis of the range is used, and it needs both ends: dimension='COLUMNS': 'Sheet1!C1:F1' or 'Sheet1!C:F' groups columns C-F. dimension='ROWS': 'Sheet1!A5:A20' or 'Sheet1!5:20' groups rows 5-20. Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. Groups can be nested (up to 8 levels). To nest, group a subset of an already-grouped range. ## Example - group_sheet_rows_cols("1ABC...", "Listing!F1:J1", "COLUMNS") # hide_sheet_rows (https://sellersheetai.com/docs/mcp-api/tools/hide_sheet_rows) > Hide rows in a sheet, or show hidden rows again. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "hide_sheet_rows", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>", "start_row": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/hide_sheet_rows \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>","start_row":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `start_row` | integer | yes | First row to hide (1-based). | | `end_row` | integer | | Last row to hide inclusive (1-based). Defaults to start_row. | | `hidden` | boolean | | true (default) hides the rows; false shows them again. | ## Result - `data.startRow / data.endRow / data.hidden` — the rows changed and their new state. ## Example - hide_sheet_rows("1ABC...", "SP Campaigns", 1) # Hide row 1 (machine names) hide_sheet_rows("1ABC...", "SP Campaigns", 1, hidden=False) # Show it again # import_sheet_tsv (https://sellersheetai.com/docs/mcp-api/tools/import_sheet_tsv) > Server-side parse + write of TSV (tab-separated) text. Access: **DESTRUCTIVE** · toolset google_workspace · family null Use this to dump SP-API report previews, clipboard pastes, or any raw TSV blob directly into a sheet without pre-splitting on the client. The server splits on newlines then tabs, trims trailing empty rows, and writes every cell as text (RAW): '14' stays the string "14" and formulas are not evaluated. Use write_sheet when the values must be numbers, dates or formulas. ## Call it MCP tool call: ```json { "name": "import_sheet_tsv", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "tsv_text": "<tsv_text>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/import_sheet_tsv \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","tsv_text":"<tsv_text>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | the top-left anchor cell, e.g. 'Sheet1!A1'. The block expands right and down. | | `tsv_text` | string | yes | Raw TSV text. Lines separated by \n (or \r\n); cells separated by \t. Empty trailing lines are ignored. | ## Result - `data.rowCount / data.colCount` — the size of the block written (colCount = the widest row). - `data.written` — rows written (0 for empty text). ## Example - import_sheet_tsv("1ABC...", "Inventory!A1", "sku\tasin\tqty\nA001\tB000ABC\t14\nA002\tB000DEF\t7") # insert_sheet_rows_cols (https://sellersheetai.com/docs/mcp-api/tools/insert_sheet_rows_cols) > Insert rows or columns in a sheet. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "insert_sheet_rows_cols", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>", "dimension": "<dimension>", "start_index": 1, "end_index": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_sheet_rows_cols \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>","dimension":"<dimension>","start_index":1,"end_index":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `dimension` | string | yes | 'ROWS' or 'COLUMNS'. | | `start_index` | integer | yes | Start index (0-based). | | `end_index` | integer | yes | End index (exclusive). | ## Result - Success confirmation. ## Example - insert_sheet_rows_cols("1ABC...", "Sheet1", "ROWS", 5, 10) # Insert 5 rows at index 5 # insert_sheet_sparkline (https://sellersheetai.com/docs/mcp-api/tools/insert_sheet_sparkline) > Insert an in-cell SPARKLINE chart by writing the formula for you. Access: **WRITE** · toolset google_workspace · family null Sheets SPARKLINEs are tiny inline charts — use them in dashboard rows (one per metric) instead of full add_sheet_chart calls. Much smaller footprint, much faster. ## Call it MCP tool call: ```json { "name": "insert_sheet_sparkline", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "target_cell": "<target_cell>", "data_range": "<data_range>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/insert_sheet_sparkline \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","target_cell":"<target_cell>","data_range":"<data_range>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `target_cell` | string | yes | A1 target cell to host the sparkline (e.g. 'Dash!F2'). | | `data_range` | string | yes | the data series as it would appear in a formula, without '=' (e.g. 'Sales!B2:G2'). Pass the tab name bare ('STA-BoxFirst!B2:G2'); the server quotes it. | | `sparkline_type` | string | | 'line' (default) \| 'column' \| 'winloss'. | | `color` | string | | Optional. Either a Sheets color name string ('red', 'blue', etc.) OR an RGB list [r,g,b] floats 0–1 which is converted to a #RRGGBB hex literal. | | `line_width` | integer | | Optional integer (only applies to 'line' type). | ## Result - `data.formula` — the SPARKLINE formula written to data.targetCell. ## Example - insert_sheet_sparkline("1ABC...", "Dash!F1", "Dash!A1:E1", sparkline_type="line", color="red") # Column type with explicit RGB green insert_sheet_sparkline("1ABC...", "Dash!F2", "Dash!A2:E2", sparkline_type="column", color=[0.0, 0.8, 0.0]) # list_sheet_named_ranges (https://sellersheetai.com/docs/mcp-api/tools/list_sheet_named_ranges) > List all named ranges in the spreadsheet. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "list_sheet_named_ranges", "arguments": { "spreadsheet_id": "<spreadsheet_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_sheet_named_ranges \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | ## Result - `data.namedRanges[]` — {namedRangeId, name, range}. range is a GridRange {sheetId, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex}: 0-based, with exclusive ends, not A1. - `data.count` — the number of named ranges. ## Example - list_sheet_named_ranges("1ABC...") # list_sheet_tabs (https://sellersheetai.com/docs/mcp-api/tools/list_sheet_tabs) > List all tabs in the spreadsheet. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "list_sheet_tabs", "arguments": { "spreadsheet_id": "<spreadsheet_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_sheet_tabs \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | ## Result - `data.tabs[]` — {title, sheetId, index, gridProperties (rowCount, columnCount, frozenRowCount…)}. sheetId is the integer id that sheet_batch_update takes. - `data.count` — the number of tabs. ## Gotchas - The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. ## Example - list_sheet_tabs("1ABC...") # merge_sheet_cells (https://sellersheetai.com/docs/mcp-api/tools/merge_sheet_cells) > Merge cells in a range. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "merge_sheet_cells", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/merge_sheet_cells \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:B2'). | | `merge_type` | string | | MERGE_ALL (one merged cell, the default), MERGE_COLUMNS (one merge per column) or MERGE_ROWS (one merge per row). | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - merge_sheet_cells("1ABC...", "Sheet1!A1:B2", "MERGE_ALL") # paste_sheet_with_format (https://sellersheetai.com/docs/mcp-api/tools/paste_sheet_with_format) > Write values AND apply uniform format to the same range — saves a round-trip vs calling write_sheet then format_sheet_range. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "paste_sheet_with_format", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "values": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/paste_sheet_with_format \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","values":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | the whole target block with its tab name ('Summary!A1:D10'). The format lands on exactly this range, so an anchor cell formats only that cell. A range the format step cannot use is refused before anything is written. | | `values` | object[] | yes | 2D list of values to write. Formulas allowed (USER_ENTERED). | | `background_color` | object[] | | RGB list 0.0–1.0, e.g. [1.0, 0.898, 0.4]. | | `font_color` | object[] | | bold true/false; font colour as RGB floats 0–1; size in points. Each one you pass is set; one you leave out keeps its current value. | | `bold` | boolean | | bold true/false; font colour as RGB floats 0–1; size in points. Each one you pass is set; one you leave out keeps its current value. | | `font_size` | integer | | bold true/false; font colour as RGB floats 0–1; size in points. Each one you pass is set; one you leave out keeps its current value. | | `number_format_type` | string | | 'NUMBER' \| 'CURRENCY' \| 'PERCENT' \| 'DATE' \| 'TIME' \| 'DATE_TIME' \| 'TEXT' \| 'SCIENTIFIC'. Optional. | | `number_format_pattern` | string | | Sheets pattern string (e.g. '#,##0.00', '$#,##0.00', '0.00%'). Optional. | ## Result - `data.rowsWritten` — the rows written. - `data.formatApplied` — false when no format argument was given. ## Gotchas - Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - Write 3 currency cells, formatted as bold USD currency. paste_sheet_with_format("1ABC...", "Summary!B2:B4", [[1234.5], [678.9], [42.0]], bold=True, number_format_type="CURRENCY", number_format_pattern="$#,##0.00", ) # protect_sheet_range (https://sellersheetai.com/docs/mcp-api/tools/protect_sheet_range) > Protect a range from editing. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "protect_sheet_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/protect_sheet_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with sheet name, e.g. 'KPIs!A1:E20'. | | `description` | string | | Label shown when a non-editor tries to edit. | | `warning_only` | boolean | | If True, show a warning but don't block. | | `editors` | object[] | | email addresses allowed to edit. Hard lock only: Google does not support editors when warning_only is true. | ## Result - { protectedRangeId: int, sheetId: int } ## Gotchas - warning_only=False (default): hard-lock. Only editors can modify. warning_only=True: shows a warning dialog, but anyone can proceed. Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. If editors is not provided, only the spreadsheet owner can edit the protected range. ## Example - protect_sheet_range( "1ABC...", "KPIs!A1:E20", description="KPI targets - do not edit", editors=["admin@example.com"], ) # read_sheet (https://sellersheetai.com/docs/mcp-api/tools/read_sheet) > Read cell values from a range. Access: **READ** · toolset google_workspace · family null To get the formulas, formats, notes and links of a few cells in one call, use get_sheet_cell. ## Call it MCP tool call: ```json { "name": "read_sheet", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/read_sheet \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation, e.g. 'Store Reports!A1:I100'. For tab names with hyphens / spaces / parens (e.g. 'STA-BoxFirst!A1'), pass the bare name — the MCP layer single-quotes it internally where the Google Sheets API requires (otherwise the API parses 'STA-BoxFirst' as a subtraction and returns 400 once the tab has formula content). | | `value_render_option` | string | | How to render cell values. Default: 'FORMATTED_VALUE'. 'FORMATTED_VALUE' — display values (what users see). Default. 'FORMULA' — raw formulas, e.g. '=IMAGE("url")' or '=SUM(A1:A10)'. Use this to read URLs from =IMAGE() formula cells. 'UNFORMATTED_VALUE' — raw numbers/dates without formatting. Note: =IMAGE() cells read back as '' under the default FORMATTED_VALUE (the image has no display text) — pass value_render_option='FORMULA' to see the underlying URL. Note: written datetimes read back as the sheet's DISPLAYED format (locale-dependent) under FORMATTED_VALUE — use 'UNFORMATTED_VALUE' to get the raw date serial for math/sorting. | ## Result - `values` — the rows, at the top level (not under data). Google leaves out trailing empty rows and cells, so pad a short row before you map columns by position. - `rowCount` — the number of rows returned, up to the last non-empty row (not the height of the range). ## Gotchas - The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. # read_sheet_format (https://sellersheetai.com/docs/mcp-api/tools/read_sheet_format) > Read cell formatting from a range. Access: **READ** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "read_sheet_format", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/read_sheet_format \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:D100'). | ## Result - `data.formats[]` — {sheet, row, col, value, format} per cell. row and col are 0-based (A1 = 0, 0). format is the userEnteredFormat (what was set on the cell), not the effective look after conditional formatting; get_sheet_cell returns both. ## Example - read_sheet_format("1ABC...", "Sheet1!A1:D100") # rename_sheet_tab (https://sellersheetai.com/docs/mcp-api/tools/rename_sheet_tab) > Rename an existing tab. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "rename_sheet_tab", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "old_name": "<old_name>", "new_name": "<new_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/rename_sheet_tab \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","old_name":"<old_name>","new_name":"<new_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `old_name` | string | yes | Current tab name. | | `new_name` | string | yes | New tab name. | ## Result - Success confirmation. ## Example - rename_sheet_tab("1ABC...", "Old Name", "New Name") # resize_sheet_columns (https://sellersheetai.com/docs/mcp-api/tools/resize_sheet_columns) > Resize columns in a sheet. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "resize_sheet_columns", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>", "start_col": 1, "end_col": 1, "width": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/resize_sheet_columns \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>","start_col":1,"end_col":1,"width":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `start_col` | integer | yes | Start column index (0-based). | | `end_col` | integer | yes | End column index (exclusive). | | `width` | integer | yes | Width in pixels. | ## Result - Success confirmation. ## Example - resize_sheet_columns("1ABC...", "Sheet1", 0, 3, 150) # resize_sheet_rows (https://sellersheetai.com/docs/mcp-api/tools/resize_sheet_rows) > Resize rows in a sheet. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "resize_sheet_rows", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>", "start_row": 1, "end_row": 1, "height": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/resize_sheet_rows \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>","start_row":1,"end_row":1,"height":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `start_row` | integer | yes | Start row index (0-based). | | `end_row` | integer | yes | End row index (exclusive). | | `height` | integer | yes | Height in pixels. | ## Result - Success confirmation. ## Example - resize_sheet_rows("1ABC...", "Sheet1", 0, 10, 30) # set_sheet_basic_filter (https://sellersheetai.com/docs/mcp-api/tools/set_sheet_basic_filter) > Set a basic filter (column dropdown arrows) on a header row range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "set_sheet_basic_filter", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/set_sheet_basic_filter \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation with sheet name covering the header row, e.g. 'SP Campaigns!A4:AA4'. | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - set_sheet_basic_filter("1ABC...", "SP Campaigns!A4:AA4") # set_sheet_borders (https://sellersheetai.com/docs/mcp-api/tools/set_sheet_borders) > Add cell borders to a range. Access: **WRITE** · toolset google_workspace · family null Each side is set independently; a side you leave out keeps its current border. ## Call it MCP tool call: ```json { "name": "set_sheet_borders", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/set_sheet_borders \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with sheet name, e.g. 'Summary!A1:D5'. | | `top` | object | | {style, color} for the outer edges; omit a side to leave it unchanged. | | `bottom` | object | | {style, color} for the outer edges; omit a side to leave it unchanged. | | `left` | object | | {style, color} for the outer edges; omit a side to leave it unchanged. | | `right` | object | | {style, color} for the outer edges; omit a side to leave it unchanged. | | `inner_horizontal` | object | | the lines between rows / between columns, same shape. style: SOLID (default, 1 px), SOLID_MEDIUM (2 px), SOLID_THICK (3 px), DASHED, DOTTED, DOUBLE, or NONE (clears that side). color: RGB floats 0–1, default black. | | `inner_vertical` | object | | the lines between rows / between columns, same shape. style: SOLID (default, 1 px), SOLID_MEDIUM (2 px), SOLID_THICK (3 px), DASHED, DOTTED, DOUBLE, or NONE (clears that side). color: RGB floats 0–1, default black. | ## Result - `data.sides` — the sides written (camelCase, e.g. innerHorizontal). ## Gotchas - At least one side is required. Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - set_sheet_borders("1ABC...", "Summary!A1:C3", top={"style": "SOLID_THICK", "color": [1.0, 0.0, 0.0]}, bottom={"style": "SOLID_THICK", "color": [1.0, 0.0, 0.0]}, left={"style": "SOLID_THICK", "color": [1.0, 0.0, 0.0]}, right={"style": "SOLID_THICK", "color": [1.0, 0.0, 0.0]}, ) # set_sheet_number_format (https://sellersheetai.com/docs/mcp-api/tools/set_sheet_number_format) > Set number format for a range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "set_sheet_number_format", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "format_type": "<format_type>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/set_sheet_number_format \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","format_type":"<format_type>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:A100'). | | `format_type` | string | yes | NUMBER, CURRENCY, PERCENT, DATE, TIME, DATE_TIME, SCIENTIFIC or TEXT. | | `pattern` | string | | optional custom pattern (e.g. '#,##0.00'); omit it to use the spreadsheet locale's default for the type. | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - set_sheet_number_format("1ABC...", "Sheet1!A1:A100", "CURRENCY", "$#,##0.00") # setup_sheet (https://sellersheetai.com/docs/mcp-api/tools/setup_sheet) > Create a tab if it is missing, write a key row and a label row, and format them. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "setup_sheet", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "sheet_name": "<sheet_name>", "headers": [], "labels": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/setup_sheet \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","sheet_name":"<sheet_name>","headers":[],"labels":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `sheet_name` | string | yes | the tab name. | | `headers` | object[] | yes | Row 1 key names, e.g. ['storeName', 'reportId', 'processingStatus']. | | `labels` | object[] | yes | Row 2 display labels, e.g. ['Store Name', 'Report ID', 'Status']. | | `header_row_color` | object[] | | RGB list 0.0–1.0 for the default row 2 background. Default: [0.204, 0.659, 0.325] (Google green). Override per-column with format_sheet_range after setup. | | `hide_row1` | boolean | | Hide the key-name row. Default: true. | | `freeze_rows` | integer | | Number of rows to freeze from top. Default: 2. | ## Result - { sheetId: N, created: bool, formatted: true } ## Gotchas - Writes `headers` to row 1 and `labels` to row 2 as plain text (no formula parsing), hides row 1 when hide_row1 is set, freezes freeze_rows rows, and paints row 2 bold white on header_row_color. An existing tab is reused (created false) and nothing below row 2 is cleared. No cell notes are written; add them with update_sheet_note. The yellow / light-yellow / gray header fills and green label row of older SellerSheet guides are retired; SellerSheet tabs use one navy header band whose font colour marks required, optional and auto columns. # sheet_batch_update (https://sellersheetai.com/docs/mcp-api/tools/sheet_batch_update) > Apply several raw Sheets API v4 requests (spreadsheets.batchUpdate) in one call. Access: **DESTRUCTIVE** · toolset google_workspace · family null Use it for 3+ structural operations at once (write values + format header + autofit columns + freeze panes); a single operation reads better through its dedicated tool (write_sheet, format_sheet_range), because the raw request shape is verbose. ## Call it MCP tool call: ```json { "name": "sheet_batch_update", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "requests": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/sheet_batch_update \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","requests":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `requests` | object[] | yes | a non-empty list of Sheets v4 Request objects, e.g. updateCells, repeatCell, updateBorders, mergeCells, addBanding, autoResizeDimensions, updateSheetProperties, updateDimensionProperties, insertDimension, deleteDimension, addProtectedRange. Ranges are GridRange objects: the integer sheetId (list_sheet_tabs), a 0-based start*Index and an exclusive end*Index. Colours are {red, green, blue} floats 0–1. | ## Result - `data.replies` — one reply per request, in order; requests that return nothing get an empty reply, and addSheet's reply carries the new sheetId. - `data.requestCount` — the number of requests applied. ## Gotchas - Google applies the requests in order, as one unit: one invalid request fails the whole call and nothing is applied. Request reference: https: //developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate ## Example - Bold a header row and autofit two columns in one call. sheet_batch_update("1ABC...", [ {"repeatCell": { "range": {"sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 4}, "cell": {"userEnteredFormat": {"textFormat": {"bold": True}}}, "fields": "userEnteredFormat.textFormat.bold", }}, {"autoResizeDimensions": { "dimensions": {"sheetId": 0, "dimension": "COLUMNS", "startIndex": 0, "endIndex": 4}, }}, ]) # sort_sheet_range (https://sellersheetai.com/docs/mcp-api/tools/sort_sheet_range) > Sort a range by specified columns. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "sort_sheet_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "sort_specs": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/sort_sheet_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","sort_specs":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A2:D100'). | | `sort_specs` | object[] | yes | [{dimensionIndex, sortOrder}]. dimensionIndex is a 0-based column index (A=0, B=1, …); sortOrder is ASCENDING or DESCENDING. Every row of range_ moves, so start range_ below the header row (e.g. 'Sheet1!A2:D100'). | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - sort_sheet_range("1ABC...", "Sheet1!A2:D100", [{'dimensionIndex': 0, 'sortOrder': 'ASCENDING'}]) # ungroup_sheet_rows_cols (https://sellersheetai.com/docs/mcp-api/tools/ungroup_sheet_rows_cols) > Remove a row/column group (ungroup). Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "ungroup_sheet_rows_cols", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/ungroup_sheet_rows_cols \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 range with sheet name. | | `dimension` | string | | 'COLUMNS' or 'ROWS'. | ## Result - { sheetId, ungrouped: true } ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. The grouped axis needs both ends ('Tab!C:F', 'Tab!5:20'). ## Example - ungroup_sheet_rows_cols("1ABC...", "Listing!F1:J1", "COLUMNS") # unmerge_sheet_cells (https://sellersheetai.com/docs/mcp-api/tools/unmerge_sheet_cells) > Unmerge cells in a range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "unmerge_sheet_cells", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/unmerge_sheet_cells \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 notation range (e.g. 'Sheet1!A1:B2'). | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. ## Example - unmerge_sheet_cells("1ABC...", "Sheet1!A1:B2") # unprotect_sheet_range (https://sellersheetai.com/docs/mcp-api/tools/unprotect_sheet_range) > Remove protection from a range. Access: **WRITE** · toolset google_workspace · family null Take the protectedRangeId from protect_sheet_range, or for an older protection from get_sheet_metadata data.sheets[].protectedRanges[].protectedRangeId. ## Call it MCP tool call: ```json { "name": "unprotect_sheet_range", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "protected_range_id": 1 } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/unprotect_sheet_range \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","protected_range_id":1}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `protected_range_id` | integer | yes | The ID returned by protect_sheet_range. | ## Result - { deleted: true } ## Example - unprotect_sheet_range("1ABC...", 123456) # update_sheet_note (https://sellersheetai.com/docs/mcp-api/tools/update_sheet_note) > Update note on a cell or range. Access: **WRITE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "update_sheet_note", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/update_sheet_note \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | 'Tab!A1', or a block 'Tab!A1:C3' in which every cell gets the same note. | | `note` | string | | Note text (empty string to clear). | ## Result - Success confirmation. ## Gotchas - Every range here must name its tab; an open end is allowed ('Tab!C7:C' runs to the bottom, 'Tab!A:D' is whole columns); a range without a tab ('A1:D10') is refused. ## Example - update_sheet_note("1ABC...", "Sheet1!A1", "This is a note") # write_sheet (https://sellersheetai.com/docs/mcp-api/tools/write_sheet) > Write a 2D block of values to a range; every cell is parsed as if typed (USER_ENTERED). Access: **DESTRUCTIVE** · toolset google_workspace · family null Use it for any block whose cells differ — mixed values and formulas, or a full table. To fill ONE formula down a bounded range (relative references shift per row), write_sheet_formula does it in one call. ## Call it MCP tool call: ```json { "name": "write_sheet", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "values": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/write_sheet \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","values":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | A1 target. The top-left cell ('Sheet1!A1') is enough — the block expands right and down; a multi-cell range must be at least as large as `values`. | | `values` | object[] | yes | 2D list, one inner list per row. Cells can be strings (incl. "=formulas", date strings, number strings), numbers, booleans, or null for blank. A dropdown cell is not checked against its list — write one of the options get_sheet_cell's dropdown.values lists, verbatim. | ## Result - `written` — the number of rows written (top level, not under data). ## Gotchas - How Sheets parses a string cell (USER_ENTERED): - "=SUM(B:B)" → a live formula - "2026-05-12" → date serial (sortable, DATEVALUE-able) - "2026-05-12 14:30:00" → datetime serial - "1234.56" → number 1234.56 - "15%" → 0.15 with percent display - "Plain text" → string (unchanged) - "'=literal text" → literal string (apostrophe escapes the leading =) - "'07023" → string "07023" with the leading zero kept The spreadsheet must be shared with SellerSheet's Google service account as Editor (workbooks set up by the SellerSheet sidebar already are); a permission error means the user has to share it. ## Example - # Mixed values + formula in one call: write_sheet("1ABC", "Sheet1!A1:B3", [ ["Month", "Sales"], ["Jan", 1000], ["Total", "=SUM(B2:B2)"] ]) # Bulk-write 76 IMAGE formulas in one call: pass a 76×1 `values` list # (one formula string per row) to 'Sheet1!A2:A77'. # Force a literal "=SUM" as text: write_sheet("1ABC", "Sheet1!A1", [["'=SUM(B:B)"]]) # write_sheet_formula (https://sellersheetai.com/docs/mcp-api/tools/write_sheet_formula) > Fill one formula into a cell — or across EVERY cell of a range. Access: **DESTRUCTIVE** · toolset google_workspace · family null ## Call it MCP tool call: ```json { "name": "write_sheet_formula", "arguments": { "spreadsheet_id": "<spreadsheet_id>", "range_": "<range_>", "formula": "<formula>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/write_sheet_formula \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"spreadsheet_id":"<spreadsheet_id>","range_":"<range_>","formula":"<formula>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `spreadsheet_id` | string | yes | the spreadsheet ID (from its URL or get_sheet_metadata). | | `range_` | string | yes | a single cell ('Sheet1!A1'), or a block that names its tab and both row ends ('Sheet1!A2:A45'). 'A2:A45' and 'A2:A' are refused. | | `formula` | string \| object[] | yes | Formula string starting with '='. Also accepts a 2D list of formula strings (one per cell) — in that mode it behaves exactly like write_sheet (no fan-out; each cell gets its own literal formula), kept for compatibility. | ## Result - `data.cellCount` — the cells filled. - `data.multiCell` — true when one formula was fanned out across the range (string mode only). ## Gotchas - Pass a bare formula string and the target range: - Single cell ('Sheet1!A1') → written via values.update (USER_ENTERED). - Multi-cell range ('_raw_ppc!J2:J45') → the SAME formula is filled into every cell via one batchUpdate.repeatCell call, and Google increments the relative references per cell (so '=B2*C2' in row 2 becomes '=B3*C3' in row 3, and so on). The success message reports the real filled extent, e.g. "Formula filled across _raw_ppc!J2:J45 (44 cells, relative references adjusted per cell)". Use write_sheet directly when: - Mixing values and formulas in the same block - Each cell needs a DIFFERENT formula (pass an explicit 2D list) - You want explicit 2D shape control This is a real fan-out: unlike write_sheet with a 1-row 2D list, it does NOT leave J3:J45 empty. Every range here must name its tab and both ends ('Tab!A1:D10'); a range without a tab ('A1:D10') or with an open end ('Tab!A:D') is refused. A single cell is exempt. ## Example - write_sheet_formula("1ABC", "Sheet1!A1", "=SUM(B:B)") write_sheet_formula("1ABC", "Inventory!Q9", "=SPARKLINE(_raw_woc!C2:P2)") # Same formula fanned across a bounded range — relative refs adjust per row: write_sheet_formula("1ABC", "_raw_ppc!J2:J45", "=IF(G2>0,F2/G2,\"\")") # noon_catalog_BarcodeSkuMap (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_BarcodeSkuMap) > Map existing partner SKUs to barcodes (UPC/EAN/ISBN) on noon, synchronously, so warehouse systems know what a scanned barcode is; a new barcode is created. Access: **DESTRUCTIVE** · toolset noon · family noon For a bulk load use noon_catalog_CreateBarcodeImport (async; inline rows or a file). noon API · CatplatService_SkuBarcodeMap · POST /catplat/v1/barcode/map Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-sku-barcode-map Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_catalog_BarcodeSkuMap", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_BarcodeSkuMap \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to map (required) — barcode and partner_sku (an SKU already in your catalog), each at most 100 characters; force_map true overrides any existing mapping between the same barcode and partner_sku. | ## Result - `data.items[]` — barcode, partner_sku, status {status_code, message}; rows succeed or fail independently. ## Body (noon schema): {items: [item]}, each item - barcode*: string partner_sku*: string force_map: boolean # noon_catalog_ChildSkuDelete (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_ChildSkuDelete) > DELETE child (sellable variant) SKUs from the noon catalog — DESTRUCTIVE, irreversible. Access: **DESTRUCTIVE** · toolset noon · family noon Use it to retire one size or variation; to remove a whole product and every variation under it, use noon_catalog_ParentSkuDelete (cascades). noon API · CatplatService_ChildSkuDelete · POST /catplat/v1/sku/child/delete Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-child-sku-delete Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_catalog_ChildSkuDelete", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_ChildSkuDelete \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to delete (required), each with EXACTLY ONE identifier — partner_sku (the child SKU) or zsku_child (noon's child ZSKU). A row with both, or neither, is refused: noon's identifier is a oneof, although the schema below marks both required. | ## Result - `data.items[]` — partner_sku, zsku_child, status {status_code, message}; rows can fail independently. ## Body (noon schema): {items: [item]}, each item - partner_sku*: string zsku_child*: string # noon_catalog_CreateBarcodeImport (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_CreateBarcodeImport) > Create an ASYNCHRONOUS bulk barcode-to-partner_sku import on noon — for mapping barcodes in bulk. Access: **DESTRUCTIVE** · toolset noon · family noon It returns a reference at once; poll noon_catalog_GetImportStatus for the outcome. Pass EXACTLY ONE data source — file_url, bq_table or items (the schema below marks all three required; noon takes one). noon API · CatplatService_CreateBarcodeImport · POST /catplat/v1/import/barcode Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-create-barcode-import Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_catalog_CreateBarcodeImport", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_CreateBarcodeImport \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `file_url` | string | | an HTTP/HTTPS or GCS path to a CSV, TSV, XLSX, JSON or Parquet file (e.g. one uploaded through noon_catalog_GenerateImportSignedUrl). | | `bq_table` | string | | a BigQuery table reference. | | `items` | object[] | | inline rows, at most 10,000 — a plain list of {partner_sku, barcode, force_sync} (the server wraps it in data); partner_sku must already exist in the catalog, force_sync true overrides an existing mapping of that barcode and SKU. | | `config` | object | | optional {is_notification_required (default false — a WHIP notification on completion), force_sync (overwrite existing mappings for the whole request)}. | | `client_reference` | string | | optional id of your own — unique, at most 100 characters; noon_catalog_GetImportStatus accepts it in place of import_reference. | ## Result - `data.import_reference` — poll it with noon_catalog_GetImportStatus. - `data.client_reference` — your id, echoed. ## Body (noon schema) - file_url*: string bq_table*: string items*: {data*: [{partner_sku*, barcode*, force_sync*}]} config*: {is_notification_required*, force_sync*} client_reference*: string # noon_catalog_GenerateImportSignedUrl (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_GenerateImportSignedUrl) > Get a short-lived GCS signed URL to upload a barcode-import file to noon — step 1 of a file-based import, for more rows than is practical inline (over 10,000; smaller batches go in Access: **READ** · toolset noon · family noon line on noon_catalog_CreateBarcodeImport). No SellerSheet tool uploads the file: the operator's own script POSTs it to data.url with data.fields; then create the import with noon_catalog_CreateBarcodeImport. noon API · CatplatService_GenerateImportSignedUrl · POST /catplat/v1/import/generate-import-signed-url Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-generate-import-signed-url ## Call it MCP tool call: ```json { "name": "noon_catalog_GenerateImportSignedUrl", "arguments": { "store": "myStore-US", "file_type": "<file_type>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_GenerateImportSignedUrl \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","file_type":"<file_type>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `file_type` | string | yes | the file's format — a value from the Body block except FILE_TYPE_UNSPECIFIED, which is refused. | ## Result - `data.url` — the signed POST endpoint. - `data.fields` — the GCS policy form fields to send with the file in a multipart POST. - `data.identifier` — noon's reference for the uploaded file. # noon_catalog_GetImportStatus (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_GetImportStatus) > Poll a noon bulk import until it is final, then read which rows were rejected and why. Access: **READ** · toolset noon · family noon noon API · CatplatService_GetImportStatus · GET /catplat/v1/import/status/{reference} Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-get-import-status ## Call it MCP tool call: ```json { "name": "noon_catalog_GetImportStatus", "arguments": { "store": "myStore-US", "reference": "<reference>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_GetImportStatus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","reference":"<reference>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `reference` | string | yes | the import_reference from noon_catalog_CreateBarcodeImport, or the client_reference you set on it (required). | ## Result - `data.import_status` — IMPORT_STATUS_PENDING, IMPORT_STATUS_PROCESSING, IMPORT_STATUS_COMPLETED, IMPORT_STATUS_FAILED or IMPORT_STATUS_PARTIAL (noon's model) — keep polling until it is COMPLETED, FAILED or PARTIAL, which are final. - `data.report.fields.failed_count / data.report.fields.error_summary` — the rejected rows and why ([{count, status_message}]). - `data.report.fields.report_url` — GCS link to the full per-row report. # noon_catalog_ParentSkuDelete (https://sellersheetai.com/docs/mcp-api/tools/noon_catalog_ParentSkuDelete) > DELETE parent SKUs from the noon catalog — DESTRUCTIVE and CASCADES: the non-sellable base product and every child SKU under it are removed. Access: **DESTRUCTIVE** · toolset noon · family noon Use it to remove an entire product; confirm intent first — it is irreversible. noon API · CatplatService_ParentSkuDelete · POST /catplat/v1/sku/parent/delete Docs: https://noon-docs.noonpartners.dev/docs/api-reference/catalog/catplat-service-parent-sku-delete Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_catalog_ParentSkuDelete", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_catalog_ParentSkuDelete \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to delete (required), each with EXACTLY ONE identifier — parent_partner_sku (the parent/base SKU) or zsku_parent (noon's parent ZSKU). A row with both, or neither, is refused: noon's identifier is a oneof, although the schema below marks both required. | ## Result - `data.items[]` — parent_partner_sku, zsku_parent, variants[] {partner_sku, zsku_child} removed by the cascade, status {status_code, message}. ## Body (noon schema): {items: [item]}, each item - parent_partner_sku*: string zsku_parent*: string # noon_content_draft_from_amazon_asin (https://sellersheetai.com/docs/mcp-api/tools/noon_content_draft_from_amazon_asin) > Turn one of your Amazon listings into a noon listing draft in SellerSheet. Access: **WRITE** · toolset noon · family noon The draft holds the product of the listing's colour with every size, a ranked noon category, Amazon's English (and Arabic) copy, its images and the attributes that map exactly. Nothing is sent to noon and no AI runs (free). Review the draft with the user; create a new listing from data.drafts[].upsert with noon_content_UpsertProduct, or on the SellerSheet web app. A draft whose partner SKU already exists on noon (its existing list: live or not, or held by SellerSheet) gets no upsert: sending its fields would UPDATE that listing — only on the user's explicit word. Drafts after the third come back as summaries: open them on the SellerSheet web app (noon Catalog → Drafts) — converting the same colour again makes another draft. noon API · ContentService_ListCategories · POST /content/v1/categories/list noon API · ContentService_ListCategoryAttributes · POST /content/v1/categories/attributes/list Amazon SP-API · getCatalogItem · GET /catalog/2022-04-01/items/{asin} Amazon SP-API · searchCatalogItems · GET /catalog/2022-04-01/items Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-list-categories Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-list-category-attributes ## Call it MCP tool call: ```json { "name": "noon_content_draft_from_amazon_asin", "arguments": { "store": "myStore-US", "amazon_store": "<amazon_store>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_draft_from_amazon_asin \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","amazon_store":"<amazon_store>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. Its marketplace is the draft's noon marketplace; owner or admin of the organization only. | | `amazon_store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. The Amazon store the listing is on. | | `asin` | string | | the ASIN (e.g. 'B0XXXXXXXX'). The Amazon listing — pass it or seller_sku, not both; a variation parent ASIN drafts every colour of its family. | | `seller_sku` | string | | your Amazon seller SKU of the listing, instead of asin. | | `include_facts` | boolean | | true adds data.facts — Amazon's trimmed attributes of the first draft, the evidence for filling the category's other attributes. Default false. | ## Result - `data.draft_id` — the draft of the listing's colour (the first when several were made). - `data.drafts[]` — one per colour drafted. The first 3 in full — draft_id, group (the colour), partner_skus, category, existing (partner SKUs that already exist on noon), asins, alternatives [{code, score}] (the next best noon categories), skus [{partner_sku, size}] (partner_sku = your Amazon SKU, blank for an ASIN you do not list), notes (what to check), missing_required (category attributes still empty) and upsert (the UpsertProduct body) — or, when upsert is null, attributes {row-5 - `data.drafts[].key` — value}, copy {en, ar} and images [{url, sort}] instead. Every further draft only as {draft_id, group, partner_skus, category, existing}; data.summarised counts them. - `data.family` — the Amazon family's ASINs that were read; data.groups: its colour count. - `data.facts` — only with include_facts. ## Params (Amazon schema; getCatalogItem) - asin*: string marketplaceIds*: [string] includedData: attributes | classifications | dimensions | identifiers | images | productTypes | relationships | salesRanks | summaries | vendorDetails (list) locale: string ## Params (Amazon schema; searchCatalogItems) - identifiers: [string] (max 20) identifiersType: ASIN | EAN | GTIN | ISBN | JAN | MINSAN | SKU | UPC marketplaceIds*: [string] (max 1) includedData: attributes | classifications | dimensions | identifiers | images | productTypes | relationships | salesRanks | summaries | vendorDetails (list) locale: string sellerId: string keywords: [string] (max 20) brandNames: [string] classificationIds: [string] pageSize: integer (max 20) pageToken: string keywordsLocale: string ## Body (Amazon schema; ContentService_ListCategoryAttributes) - category_code*: string ## Gotchas - upsert is also null while a partner SKU, a size or the category is missing. # noon_content_GetContent (https://sellersheetai.com/docs/mcp-api/tools/noon_content_GetContent) > Fetch a noon product's stored content, images and per-language completeness / QC status — to check whether a listing is complete and approved. Access: **READ** · toolset noon · family noon It is active only when completeness is 100 and QC is QC_STATUS_APPROVED. noon API · ContentService_GetContent · POST /content/v1/product/content/get Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-get-content ## Call it MCP tool call: ```json { "name": "noon_content_GetContent", "arguments": { "store": "myStore-US", "sku_parent": "<sku_parent>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_GetContent \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku_parent":"<sku_parent>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `sku_parent` | string | yes | the sku_parent noon_content_UpsertProduct returned (required). | ## Result - `data.attributes` — the stored content, attribute_code -> {values: [{value, language, sort}]}. - `data.images[]` — url, sort, visibility, review_status (REVIEW_STATUS_VALID, _PENDING or _INVALID), issues[] {code, message}. - `data.statuses[]` — per language (LANGUAGE_EN or LANGUAGE_AR) — content {completeness '0'–'100', missing_attributes, invalid_attributes}; qc {status QC_STATUS_NOT_ELIGIBLE, QC_STATUS_PENDING, QC_STATUS_APPROVED or QC_STATUS_REJECTED, rejection_reasons, comment}; overall_status OVERALL_STATUS_ACTIVE or OVERALL_STATUS_INACTIVE; errors[] {code, message}. # noon_content_ListCategories (https://sellersheetai.com/docs/mcp-api/tools/noon_content_ListCategories) > List every product category code in the noon catalog — to choose a new product's category before creating it; then read its fields with noon_content_ListCategoryAttributes. Access: **READ** · toolset noon · family noon noon API · ContentService_ListCategories · POST /content/v1/categories/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-list-categories ## Call it MCP tool call: ```json { "name": "noon_content_ListCategories", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_ListCategories \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `filters` | object | | optional dict sent verbatim as the request body — noon documents no filter fields, so omit it for the full list. | ## Result - `data.categories` — unique codes, each the full path 'family-type-subtype' of a product type — pass one as category to noon_content_UpsertProduct and as category_code to noon_content_ListCategoryAttributes. # noon_content_ListCategoryAttributes (https://sellersheetai.com/docs/mcp-api/tools/noon_content_ListCategoryAttributes) > Get the attribute schema a product in one category must satisfy — read it before building the attributes of noon_content_UpsertProduct: every is_mandatory attribute needs a value m Access: **READ** · toolset noon · family noon atching its attribute_type and allowed values. noon API · ContentService_ListCategoryAttributes · POST /content/v1/categories/attributes/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-list-category-attributes ## Call it MCP tool call: ```json { "name": "noon_content_ListCategoryAttributes", "arguments": { "store": "myStore-US", "category_code": "<category_code>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_ListCategoryAttributes \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","category_code":"<category_code>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `category_code` | string | yes | a category code from noon_content_ListCategories (required). | ## Result - `data.attributes[]` — attribute_code, is_mandatory, attribute_type (ATTRIBUTE_TYPE_TEXT, _SELECT, _NUMERIC, _METRIC, _BOOL, _DATETIME, _FILE or _JSONDICT), is_localizable (one value per language), is_multivalued / max_values, min_characters / max_characters, attribute_options (the allowed SELECT values), attribute_metric_units (the allowed METRIC units); the other validation limits (number_min / number_max, date_min / date_max, size in kilobytes, allowed_mimetypes, additional_validation_regex) as noon returns them. # noon_content_load_publish_queue_content (https://sellersheetai.com/docs/mcp-api/tools/noon_content_load_publish_queue_content) > Load an existing noon product into a noon Publish Queue sheet for editing — one GetContent shaped onto the sheet's row-5 keys, with the columns the sheet still lacks and the produc Access: **READ** · toolset noon · family null t's category. Write data.cells by key, append data.new_columns at the right end, then change the product with noon_content_UpsertProduct. noon returns no child SKUs. ## Call it MCP tool call: ```json { "name": "noon_content_load_publish_queue_content", "arguments": { "store": "myStore-US", "sku_parent": "<sku_parent>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_load_publish_queue_content \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","sku_parent":"<sku_parent>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `sku_parent` | string | yes | the product's noon id (Z…), the sheet's Parent Group Key (required). | | `keys` | object[] | | the sheet's row-5 keys in column order (read_sheet row 5); omitted = every attribute comes back as a new column. | | `language` | string | | the sheet's Language cell — 'en' or 'en_ar'; a new localizable column gets `_en` only, or `_en` and `_ar`. | ## Result - `data.cells` — {row-5 key: cell text} — several values one per line, images by slot. - `data.new_columns` — [{key, name, guide, attribute_code, language, multivalued}] — attributes noon holds that the sheet has no column for. - `data.category_code` — the product's category, derived from noon's own data ('' when noon's data is incomplete). - `data.content` — GetContent's response — sku_parent, attributes, images, statuses. # noon_content_prepare_publish_queue_template (https://sellersheetai.com/docs/mcp-api/tools/noon_content_prepare_publish_queue_template) > Build the ordered column spec for a noon Publish Queue sheet by merging noon's attribute schema for every category the sheet holds — call it before writing or extending the sheet. Access: **READ** · toolset noon · family null Category is per family (a column), not sheet-wide, so pass every distinct category code. ## Call it MCP tool call: ```json { "name": "noon_content_prepare_publish_queue_template", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_prepare_publish_queue_template \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `category_code` | string | | a single code (legacy) — only when you have exactly one and no list. | | `language` | string | | 'en' (default) \| 'en_ar' — the latter emits paired _en/_ar columns for every localizable attribute. | | `image_columns` | integer | | main_image_url + image_url_2..N (default 8). | | `category_codes` | object[] | | all distinct category codes on the sheet, one per product family (from noon_content_ListCategories); preferred over category_code and wins when both are given. One of the two is required. | ## Result - `data.category_codes` — every code merged, in request order; data.category_code: the same codes comma-joined. - `data.language / data.image_columns` — as requested. - `data.columns` — [{key (row 5), name (row 6), guide (row 4), required (gold name), tier formula | identity | mandatory | facet | optional, type TEXT | SELECT | NUMERIC | METRIC | UNIT | BOOL | DATETIME | FILE | JSONDICT | null, language 'en' | 'ar' | null, attribute_code, options, units, multivalued, max_values, min_characters, max_characters, categories (codes the column belongs to — empty = every family), mandatory_for (codes that require it)}]. ## Gotchas - The sheet is the Amazon Publish Queue's layout: row 1 banner, row 2 labels Store ✎ | Language ✎ | Last Result, row 3 their values, row 4 guides, row 5 keys (hidden), row 6 names, rows 7+ one row per SKU. Columns A–F are imagePreview, Partner SKU, Parent Group Key, Parent Child Variation, Size Variation, Category Code (noon's own bulk-template trio for variations); Brand, images and attributes follow. A row-5 key is `<attribute_code>[_en|_ar][#*]`: `_en`/`_ar` = the value's language, `#*` = several values in one cell, one per line (line order = sort); `main_image_url` / `image_url_<n>` = image slot n. Rows sharing a Parent Group Key are one product, each row one size with its own Partner SKU and Size Variation; the row marked Parent holds the product details (category, brand, images, attributes), Child rows only add sizes. A product without sizes is one row with the trio blank. # noon_content_UpsertProduct (https://sellersheetai.com/docs/mcp-api/tools/noon_content_UpsertProduct) > Create or update a product listing on noon — new partner_skus create a product, known ones update the product they belong to. Access: **DESTRUCTIVE** · toolset noon · family noon Read noon_content_ListCategoryAttributes for the category first; save data.sku_parent and poll noon_content_GetContent until completeness reaches 100. noon API · ContentService_UpsertProduct · POST /content/v1/product/upsert Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-upsert-product Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_content_UpsertProduct", "arguments": { "store": "myStore-US", "skus": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_UpsertProduct \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","skus":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `skus` | object[] | yes | the variations (required, non-empty) — partner_sku, unique across all your products, and size, required when there is more than one SKU (e.g. 'Large', '42', 'S'); on update every SKU must belong to the same parent product. | | `brand` | string | | the product's brand name. | | `category` | string | | a category code from noon_content_ListCategories. | | `images` | object[] | | optional [{url (a direct public URL), sort (1-based slot)}] — each sort is a slot: an image replaces that slot, a slot you leave out keeps noon's image. | | `attributes` | object | | optional attribute_code -> {values: [{value, language, sort}]} — language is noon's English or Arabic language value, as noon_content_GetContent lists it (one value per language on a localizable attribute), sort orders a multivalued list; a METRIC attribute travels with its '<code>_unit' attribute in the same call. An attribute you leave out keeps its value on noon — nothing is removed. A number may be sent as text. | ## Result - `data.sku_parent` — the product's id — save it; noon_content_GetContent takes it. - `data.variants[]` — every variant of the product (also those not sent) — sku, partner_sku, psku_code, size. - `data.status` — {status_code, message}. ## Body (noon schema) - skus*: [{partner_sku*, size}] brand*: string category*: string images*: [{url*, sort*}] attributes*: object ## Gotchas - noon refuses an unknown attribute or a value outside its options as an error naming it. A missing is_mandatory attribute is NOT refused: noon saves the product and lists it in noon_content_GetContent's missing_attributes once it has processed the content. # noon_inbound_CreateShipment (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_CreateShipment) > Create an FBN inbound shipment (ASN) header in CREATED status with no items — step 2, after noon_inbound_ListEligibleItems. Access: **WRITE** · toolset noon · family noon Idempotent: the same exref_nr + shipment_type returns the existing ASN instead of a duplicate. noon API · AsnService_CreateShipment · POST /fbn/inbound/v1/shipment/create Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-create-shipment Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_CreateShipment", "arguments": { "store": "myStore-US", "exref_nr": "<exref_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_CreateShipment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","exref_nr":"<exref_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `exref_nr` | string | yes | your external reference (e.g. a PO number) — required, unique per shipment_type within the account. | | `country_code` | string | | the destination country code (e.g. AE, SA); omit it to use the store ref's marketplace. | | `shipment_type` | string | | the ASN's shipment type — SHIPMENT_TYPE_FBN_GLOBAL is noon's only usable value, and the one sent when this is omitted. Allowed: SHIPMENT_TYPE_UNSPECIFIED \| SHIPMENT_TYPE_FBN_GLOBAL. Allowed: SHIPMENT_TYPE_UNSPECIFIED \| SHIPMENT_TYPE_FBN_GLOBAL. | ## Result - `data.shipment.asn_nr` — the new ASN — pass it as asn_nr to noon_inbound_UpdateShipmentItems. - `data.shipment.status` — ASN_STATUS_CREATED (the header shape of noon_inbound_GetShipment). ## Workflow - 1. noon_inbound_UpdateShipmentItems — add the lines. 2. noon_inbound_UpdateShipmentStatus with action SEAL. 3. noon_inbound_GetSlotAvailability, then noon_inbound_ScheduleShipment. # noon_inbound_DeleteShipmentItems (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_DeleteShipmentItems) > Remove items from a CREATED noon ASN, at most 1000 per call — to fix a draft before sealing; to change a quantity use noon_inbound_UpdateShipmentItems. Access: **DESTRUCTIVE** · toolset noon · family noon Removing every item is allowed (the ASN stays CREATED); nothing can be removed after sealing. noon API · AsnService_DeleteShipmentItems · POST /fbn/inbound/v1/shipment/items/delete Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-delete-shipment-items Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_DeleteShipmentItems", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_DeleteShipmentItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | | `partner_skus` | object[] | | the partner_sku values to remove (required). | ## Result - `data.shipment` — the refreshed ASN header (as noon_inbound_GetShipment) — expected_qty and total_sku_count reflect the removal. # noon_inbound_GetShipment (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetShipment) > Get one noon ASN's header (no items) — its lifecycle status and receiving progress, at any time. Access: **READ** · toolset noon · family noon noon API · AsnService_GetShipment · GET /fbn/inbound/v1/shipment/{asn_nr} Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-get-shipment ## Call it MCP tool call: ```json { "name": "noon_inbound_GetShipment", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_GetShipment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | ## Result - `data.shipment.status` — ASN_STATUS_CREATED, ASN_STATUS_SEALED, ASN_STATUS_SCHEDULED, ASN_STATUS_RECEIVING, ASN_STATUS_INBOUNDED, ASN_STATUS_CANCELED or ASN_STATUS_EXPIRED. - `data.shipment.dst_warehouse_code / schedule_date / schedule_slot / delivery_type` — null until scheduled. - `data.shipment.expected_qty / qty_received / qty_putaway / total_sku_count` — planned, received and put-away units; distinct SKUs. # noon_inbound_GetSlotAvailability (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetSlotAvailability) > Get the destination warehouses and check-in days / time slots open to a SEALED noon ASN — after sealing it with noon_inbound_UpdateShipmentStatus, before noon_inbound_ScheduleShipm Access: **READ** · toolset noon · family noon ent. Only future dates with remaining capacity are returned. noon API · AsnService_GetSlotAvailability · GET /fbn/inbound/v1/shipment/{asn_nr}/schedule/slot_availability Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-get-slot-availability ## Call it MCP tool call: ```json { "name": "noon_inbound_GetSlotAvailability", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_GetSlotAvailability \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | ## Result - `data.warehouses[]` — at most 100 — warehouse {warehouse_code, name, address, city, location}, days[] (at most 30) {date YYYY-MM-DD, slots[] (at most 8) {start, end} as HH:MM}; pass warehouse_code, one date and one slot to noon_inbound_ScheduleShipment. # noon_inbound_ListEligibleItems (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListEligibleItems) > List the catalog SKUs noon accepts on an FBN inbound shipment (ASN), with their storage_type — step 1 of an ASN. Access: **READ** · toolset noon · family noon Only active items with a mapped barcode, a title and an uploaded image are returned. noon API · AsnService_ListEligibleItems · GET /fbn/inbound/v1/catalog/items Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-list-eligible-items ## Call it MCP tool call: ```json { "name": "noon_inbound_ListEligibleItems", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_ListEligibleItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `partner_sku` | string | | optional filter by your SKU (partial match; sent as search.partner_sku). | | `page_size` | integer | | items per page; noon's default 100, max 1000. | | `next_token` | string | | the cursor from the previous call's data.next_token; omit for the first page. | ## Result - `data.items[]` — partner_sku, sku (noon SKU), title, image_url, storage_type (STORAGE_TYPE_STANDARD, STORAGE_TYPE_OVERSIZE or STORAGE_TYPE_BULKY; STORAGE_TYPE_UNSPECIFIED when not yet classified) — pass storage_type unchanged to noon_inbound_UpdateShipmentItems. - `data.next_token` — '' when there are no more pages. # noon_inbound_ListShipmentItems (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipmentItems) > List the items on a noon ASN in any status, with product details (paginated) — to verify a draft or sealed ASN's contents. Access: **READ** · toolset noon · family noon noon API · AsnService_ListShipmentItems · GET /fbn/inbound/v1/shipment/{asn_nr}/items Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-list-shipment-items ## Call it MCP tool call: ```json { "name": "noon_inbound_ListShipmentItems", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_ListShipmentItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | | `page_size` | integer | | items per page; noon's default and maximum are 1000. | | `next_token` | string | | the cursor from the previous call's data.next_token; omit for the first page. | ## Result - `data.items[]` — partner_sku, sku (noon SKU), title, qty, image_url, storage_type. - `data.total_sku_count` — distinct SKUs on the ASN, across all pages. - `data.next_token` — pass it back for the next page; '' on the last page. # noon_inbound_ListShipments (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipments) > List noon ASN headers (no items), optionally by status or destination country — to find a draft or audit history (paginated). Access: **READ** · toolset noon · family noon noon API · AsnService_ListShipments · GET /fbn/inbound/v1/shipment/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-list-shipments ## Call it MCP tool call: ```json { "name": "noon_inbound_ListShipments", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_ListShipments \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `status` | string | | filter by ASN status, sent verbatim as noon's filter.status; omit it to list every status. Allowed: ASN_STATUS_UNSPECIFIED \| ASN_STATUS_CREATED \| ASN_STATUS_SEALED \| ASN_STATUS_SCHEDULED \| ASN_STATUS_RECEIVING \| ASN_STATUS_INBOUNDED \| ASN_STATUS_CANCELED \| ASN_STATUS_EXPIRED. Allowed: ASN_STATUS_UNSPECIFIED \| ASN_STATUS_CREATED \| ASN_STATUS_SEALED \| ASN_STATUS_SCHEDULED \| ASN_STATUS_RECEIVING \| ASN_STATUS_INBOUNDED \| ASN_STATUS_CANCELED \| ASN_STATUS_EXPIRED. | | `country_code` | string | | filter by destination country (e.g. AE, SA). | | `page_size` | integer | | shipments per page; noon's default 50, max 200. | | `next_token` | string | | the cursor from the previous call's data.next_token; omit for the first page. | ## Result - `data.shipments[]` — ASN headers, each the shape of noon_inbound_GetShipment's data.shipment. - `data.total_count` — noon's total number of shipments for the account. - `data.next_token` — pass it back for the next page; '' on the last page. # noon_inbound_ScheduleShipment (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ScheduleShipment) > Book a SEALED noon ASN for inbound delivery at a warehouse, date and time slot from noon_inbound_GetSlotAvailability — the final step; it also assigns the destination warehouse (SE Access: **WRITE** · toolset noon · family noon ALED -> SCHEDULED). Refused when the warehouse is ineligible, the slot is gone or the date is past. noon API · AsnService_ScheduleShipment · POST /fbn/inbound/v1/shipment/schedule Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-schedule-shipment Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_ScheduleShipment", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>", "dst_warehouse_code": "<dst_warehouse_code>", "schedule_date": "<schedule_date>", "schedule_slot": {} } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_ScheduleShipment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>","dst_warehouse_code":"<dst_warehouse_code>","schedule_date":"<schedule_date>","schedule_slot":{}}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | | `dst_warehouse_code` | string | yes | a warehouse_code from noon_inbound_GetSlotAvailability (required). | | `schedule_date` | string | yes | one of that warehouse's dates, 'YYYY-MM-DD' (required). | | `schedule_slot` | object | yes | one of that day's slots, {start: 'HH:MM', end: 'HH:MM'} (required). | ## Result - `data.shipment` — now ASN_STATUS_SCHEDULED, with dst_warehouse_code, schedule_date and schedule_slot set. ## Body (noon schema) - asn_nr*: string dst_warehouse_code*: string schedule_date*: string schedule_slot*: {start*, end*} # noon_inbound_UpdateShipment (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipment) > Set free-form metadata (misc, e.g. Access: **DESTRUCTIVE** · toolset noon · family noon 3PL flags) on a noon ASN in CREATED, SEALED or SCHEDULED status — refused once inbound has started or the ASN is EXPIRED or CANCELED. Not for items (noon_inbound_UpdateShipmentItems) or status (noon_inbound_UpdateShipmentStatus). noon API · AsnService_UpdateShipment · POST /fbn/inbound/v1/shipment/update Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-update-shipment Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_UpdateShipment", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_UpdateShipment \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | | `misc` | object | | the metadata object (required); noon has not finalized its schema, so it is a free-form dict. | ## Result - `data.shipment` — the updated ASN header (as noon_inbound_GetShipment). # noon_inbound_UpdateShipmentItems (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentItems) > Add items to, or change quantities on, a CREATED noon ASN — upsert by partner_sku (an existing SKU's qty is overwritten), at most 1000 per call; then SEAL it with noon_inbound_Upda Access: **DESTRUCTIVE** · toolset noon · family noon teShipmentStatus. Items cannot change after sealing. noon API · AsnService_UpdateShipmentItems · POST /fbn/inbound/v1/shipment/items/update Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-update-shipment-items Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_UpdateShipmentItems", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_UpdateShipmentItems \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). Right after noon_inbound_CreateShipment it is data.shipment.asn_nr. | | `items` | object[] | | the lines (required) — partner_sku, qty (units) and storage_type: the full value (e.g. STORAGE_TYPE_STANDARD), sent verbatim — copy it from noon_inbound_ListEligibleItems. | ## Result - `data.shipment` — the refreshed ASN header (as noon_inbound_GetShipment) — expected_qty and total_sku_count reflect the upsert; noon returns no per-item status. ## Body (noon schema) - asn_nr*: string items*: [{partner_sku*, qty*, storage_type*}] items.storage_type: STORAGE_TYPE_UNSPECIFIED | STORAGE_TYPE_STANDARD | STORAGE_TYPE_OVERSIZE | STORAGE_TYPE_BULKY # noon_inbound_UpdateShipmentStatus (https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentStatus) > Seal, cancel or reschedule a noon ASN. Access: **DESTRUCTIVE** · toolset noon · family noon SEAL once the items are set, then noon_inbound_GetSlotAvailability and noon_inbound_ScheduleShipment; RESCHEDULE frees a booked slot so it can be booked again; CANCEL aborts. noon API · AsnService_UpdateShipmentStatus · POST /fbn/inbound/v1/shipment/status/update Docs: https://noon-docs.noonpartners.dev/docs/api-reference/inbound/asn-service-update-shipment-status Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_inbound_UpdateShipmentStatus", "arguments": { "store": "myStore-US", "asn_nr": "<asn_nr>", "action": "<action>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_inbound_UpdateShipmentStatus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","asn_nr":"<asn_nr>","action":"<action>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `asn_nr` | string | yes | the noon ASN number (from noon_inbound_ListShipments). | | `action` | string | yes | SEAL, CANCEL or RESCHEDULE — any case, the STATUS_ACTION_ prefix optional; STATUS_ACTION_UNSPECIFIED is refused. SEAL finalizes a draft with at least one item (CREATED -> SEALED); CANCEL works from CREATED, SEALED or SCHEDULED (-> CANCELED); RESCHEDULE moves a SCHEDULED ASN back to SEALED. | ## Result - `data.shipment.status` — the new status. # noon_offer_GetProductOffers (https://sellersheetai.com/docs/mcp-api/tools/noon_offer_GetProductOffers) > Get a partner SKU's offers in every country and why any is not buyable — the check to run when a SKU shows live but does not sell (noon_status='live' does not mean purchasable). Access: **READ** · toolset noon · family noon noon API · OfferService_GetProductOffers · GET /offer/v1/product/{partner_sku} Docs: https://noon-docs.noonpartners.dev/docs/api-reference/offer/offer-service-get-product-offers ## Call it MCP tool call: ```json { "name": "noon_offer_GetProductOffers", "arguments": { "store": "myStore-US", "partner_sku": "<partner_sku>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_offer_GetProductOffers \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","partner_sku":"<partner_sku>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `partner_sku` | string | yes | your own SKU for the product. | ## Result - `data.offer.offers[]` — offer_code, country_code, business_model, price {amount, currency}, is_active (enabled for this business model and country), active_net_stock, live_status (buyable on the storefront right now), offer_issues[] {reason, subreason, description} — the blocker (e.g. price, stock, compliance) on an offer whose live_status is false; empty when the offer is healthy. - `data.offer.sku / data.offer.title / data.offer.brand` — noon's SKU and listing. # noon_pricing_BatchGetPricing (https://sellersheetai.com/docs/mcp-api/tools/noon_pricing_BatchGetPricing) > Read the current price, msrp and is_active noon holds for a batch of partner SKUs — the authoritative state before repricing, or to confirm an upsert took effect. Access: **READ** · toolset noon · family noon noon API · PricingService_BatchGetPricing · POST /pricing/v1/pricing/get Docs: https://noon-docs.noonpartners.dev/docs/api-reference/pricing/pricing-service-batch-get-pricing ## Call it MCP tool call: ```json { "name": "noon_pricing_BatchGetPricing", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_pricing_BatchGetPricing \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to read (required) — partner_sku, your own SKU, and country_code 'ae', 'sa' or 'eg' in any case (the server lowercases it); omit country_code to use the store ref's marketplace. | ## Result - `data.items[]` — partner_sku, country_code, price, msrp (the crossed-out list price), is_active, status {status_code, message} (the per-row result). ## Body (noon schema): {items: [item]}, each item - partner_sku*: string country_code*: string # noon_pricing_BatchUpsertPricing (https://sellersheetai.com/docs/mcp-api/tools/noon_pricing_BatchUpsertPricing) > Create or update price, msrp and is_active for a batch of partner SKUs; only the fields you pass change. Access: **DESTRUCTIVE** · toolset noon · family noon Check each row's status, then confirm with noon_pricing_BatchGetPricing. noon API · PricingService_BatchUpsertPricing · POST /pricing/v1/pricing/upsert Docs: https://noon-docs.noonpartners.dev/docs/api-reference/pricing/pricing-service-batch-upsert-pricing Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_pricing_BatchUpsertPricing", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_pricing_BatchUpsertPricing \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to write (required) — partner_sku; country_code 'ae', 'sa' or 'eg' in any case (the server lowercases it; omit it to use the store ref's marketplace); price, the selling price; msrp, the crossed-out list price; is_active, false stops the item selling on noon. Blank optional fields are dropped. | ## Result - `data.items[]` — partner_sku, country_code, status {status_code, message} — the per-row write result; no prices are echoed. ## Body (noon schema): {items: [item]}, each item - partner_sku*: string country_code*: string price: number msrp: number is_active: boolean # noon_impex_CreateExport (https://sellersheetai.com/docs/mcp-api/tools/noon_impex_CreateExport) > Start a noon export (a report file) and return its export_code at once; noon builds the file asynchronously. Access: **READ** · toolset noon · family noon noon API · ImpexService_CreateExport · POST /impex/v1/export/create Docs: https://noon-docs.noonpartners.dev/docs/api-reference/impex/impex-service-create-export ## Call it MCP tool call: ```json { "name": "noon_impex_CreateExport", "arguments": { "store": "myStore-US", "exportCategoryCode": "<exportCategoryCode>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_impex_CreateExport \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","exportCategoryCode":"<exportCategoryCode>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `exportCategoryCode` | string | yes | a code from noon_impex_GetExportCategoryList (a known code the list omits is still sent as-is and noon decides), e.g. 'fbn_inventoryv2_aging' (no params), 'noon_noonoms_ordersexport' (params.from_date + params.to_date), 'noon_catalog_catalogexport' (params.noon_status 'live' or 'not_live'). | | `params` | object | | the category's params (names from noon_impex_GetExportCategoryList). Dates are 'YYYY-MM-DD'. `country` / `country_code` is filled from the store ref (lowercased where noon needs it) and `lang` defaults to 'en' when the category takes them — pass them only to override. | ## Result - `data.export_code` — pass it as exportCode to noon_impex_GetExportStatus. ## Workflow - 1. noon_impex_GetExportCategoryList — pick a code and its required params. 2. This tool. 3. noon_impex_GetExportStatus until export_status is COMPLETE, then noon_impex_download_export. # noon_impex_download_export (https://sellersheetai.com/docs/mcp-api/tools/noon_impex_download_export) > Download and parse a COMPLETE noon export; the full file is also saved to the operator's Drive when a reports folder is configured. Access: **WRITE** · toolset noon · family null ## Call it MCP tool call: ```json { "name": "noon_impex_download_export", "arguments": { "store": "myStore-US", "exportCode": "<exportCode>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_impex_download_export \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","exportCode":"<exportCode>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `exportCode` | string | yes | data.export_code from noon_impex_CreateExport, once export_status is COMPLETE. | ## Result - `data.columns` — the CSV header. - `data.preview` — the first 20 rows, each an array aligned to columns — never the full file. - `data.row_count / data.hasMore` — total rows; true when the preview is not the whole file. - `data.download_url` — the full CSV (a public signed URL). - `data.drive_url` — the Drive copy, only when a reports folder is configured. - `data.oversize` — true when the file is over 5 MB — only its first rows were read, row_count is null and nothing was saved to Drive; fetch download_url for the rest. ## Gotchas - Before COMPLETE the call is refused (HTTP 400 naming the status) — poll noon_impex_GetExportStatus first. # noon_impex_GetExportCategoryList (https://sellersheetai.com/docs/mcp-api/tools/noon_impex_GetExportCategoryList) > List the noon export categories this account can request, each with its required and optional params — call it before noon_impex_CreateExport. Access: **READ** · toolset noon · family noon noon API · ImpexService_GetExportCategoryList · GET /impex/v1/export/category/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/impex/impex-service-get-export-category-list ## Call it MCP tool call: ```json { "name": "noon_impex_GetExportCategoryList", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_impex_GetExportCategoryList \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | ## Result - `data.categories` — [{code, required[], optional[]}] — pass code as exportCategoryCode and every required name in params. # noon_impex_GetExportStatus (https://sellersheetai.com/docs/mcp-api/tools/noon_impex_GetExportStatus) > Poll a noon export by its export_code; when it is COMPLETE, call noon_impex_download_export. Access: **READ** · toolset noon · family noon noon API · ImpexService_GetExportStatus · POST /impex/v1/export/status Docs: https://noon-docs.noonpartners.dev/docs/api-reference/impex/impex-service-get-export-status ## Call it MCP tool call: ```json { "name": "noon_impex_GetExportStatus", "arguments": { "store": "myStore-US", "exportCode": "<exportCode>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_impex_GetExportStatus \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","exportCode":"<exportCode>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `exportCode` | string | yes | data.export_code from noon_impex_CreateExport. | ## Result - `data.export_status` — PENDING | QUEUE | RUNNING | COMPLETE | ERROR — poll again every 30–60 s while PENDING, QUEUE or RUNNING; ERROR is final (create a new export). - `data.download_url` — a public signed URL, present only when COMPLETE. # noon_returns_ListReturnReferences (https://sellersheetai.com/docs/mcp-api/tools/noon_returns_ListReturnReferences) > Look up the purchased items being returned that match a scanned barcode, across the merchants you can access, with every barcode reference on each — when a return arrives and you n Access: **READ** · toolset noon · family noon eed the SKU and purchase it belongs to. noon API · ReturnReferenceService_ListReturnReferences · POST /returns/v1/return-references/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/returns/return-reference-service-list-return-references ## Call it MCP tool call: ```json { "name": "noon_returns_ListReturnReferences", "arguments": { "store": "myStore-US", "barcode": "<barcode>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_returns_ListReturnReferences \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","barcode":"<barcode>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `barcode` | string | yes | the barcode to look up (required). | | `merchant_codes` | object[] | | optional merchant codes to scope the search to (at most 200, ones you can access); omit it to scope to the account's default project. | ## Result - `data.items[]` — at most 200 — mp_code (marketplace), purchase_item_nr (the purchased item being returned), partner_sku, merchant_code, references[] {barcode, barcode_type: awb_nr or rms_barcode}. # noon_stock_GetStock (https://sellersheetai.com/docs/mcp-api/tools/noon_stock_GetStock) > Read the stock quantity noon holds for each (warehouse_code, partner_sku) pair — before a restock or reprice; change quantities with noon_stock_UpdateStock. Access: **READ** · toolset noon · family noon noon API · StockService_GetStock · POST /stock/v1/stock-list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/stock/stock-service-get-stock ## Call it MCP tool call: ```json { "name": "noon_stock_GetStock", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_stock_GetStock \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the pairs to read (required) — warehouse_code, a warehouse_code from noon_warehouse_platform_ListWarehouses, and partner_sku, your own SKU. | ## Result - `data.items[]` — one per pair — warehouse_code, partner_sku, qty (the total available stock last pushed to noon), processing_time, stock_updated_at, status {status_code, message} (the per-row result). ## Body (noon schema): {items: [item]}, each item - warehouse_code*: string partner_sku*: string # noon_stock_UpdateStock (https://sellersheetai.com/docs/mcp-api/tools/noon_stock_UpdateStock) > Overwrite the available stock (and optionally processing_time) noon holds per warehouse_code + partner_sku; check each row's status, then re-read with noon_stock_GetStock. Access: **DESTRUCTIVE** · toolset noon · family noon noon API · StockService_UpdateStock · POST /stock/v1/stock-update Docs: https://noon-docs.noonpartners.dev/docs/api-reference/stock/stock-service-update-stock Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_stock_UpdateStock", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_stock_UpdateStock \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to write (required) — warehouse_code, a warehouse_code from noon_warehouse_platform_ListWarehouses; partner_sku; qty, the new total available stock; processing_time, the new handling time. Blank optional fields are dropped. | ## Result - `data.items[]` — warehouse_code, partner_sku, status {status_code, message}; rows pass or fail independently. ## Body (noon schema): {items: [item]}, each item - warehouse_code*: string partner_sku*: string qty: integer processing_time: string # noon_warehouse_platform_ListWarehouses (https://sellersheetai.com/docs/mcp-api/tools/noon_warehouse_platform_ListWarehouses) > List the warehouses on the noon partner account, up to 500 per page — to find the warehouse_code the stock tools take. Access: **READ** · toolset noon · family noon noon API · WarehousePlatformService_ListWarehouses · POST /warehouse-platform/v1/warehouses/list Docs: https://noon-docs.noonpartners.dev/docs/api-reference/warehouse_platform/warehouse-platform-service-list-warehouses ## Call it MCP tool call: ```json { "name": "noon_warehouse_platform_ListWarehouses", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_warehouse_platform_ListWarehouses \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `next_token` | string | | the cursor from the previous call's data.next_token; omit for the first page. | | `filters` | object | | optional {fulfillment_system_code} to restrict to one fulfillment system; keep the same filters on every page of one cursor. | ## Result - `data.warehouses[]` — warehouse_code (pass it to the stock tools), display_name, fulfillment_system_code, is_active (usable for fulfillment). - `data.next_token` — pass it back for the next page; '' on the last page. ## Body (noon schema) - next_token: string filters: {fulfillment_system_code} # noon_xborder_pricing_BatchGetTransferPrice (https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchGetTransferPrice) > Read the cross-border USD transfer price, MSRP and active state noon holds for up to 1000 partner SKUs — check them before noon_xborder_pricing_BatchUpsertTransferPrice. Access: **READ** · toolset noon · family noon noon API · XborderPricingService_BatchGetTransferPrice · POST /xborder-pricing/v1/transfer-price/get Docs: https://noon-docs.noonpartners.dev/docs/api-reference/xborder-pricing/xborder-pricing-service-batch-get-transfer-price ## Call it MCP tool call: ```json { "name": "noon_xborder_pricing_BatchGetTransferPrice", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_xborder_pricing_BatchGetTransferPrice \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the SKUs to read (required), at most 1000 per call. | ## Result - `data.items[]` — partner_sku, transfer_price_usd, msrp_usd, is_active, status {status_code, message} (the per-row result). ## Body (noon schema): {items: [item]}, each item - partner_sku*: string # noon_xborder_pricing_BatchUpsertProduct (https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchUpsertProduct) > Create or update the cross-border product record noon needs to ship a SKU cross-border (dimensions, weights, HS code) — when onboarding a new cross-border SKU, before its noon_xbor Access: **DESTRUCTIVE** · toolset noon · family noon der_pricing_BatchUpsertTransferPrice takes effect, or when its size, weight or HS code changes. noon API · XborderPricingService_BatchUpsertProduct · POST /xborder-pricing/v1/product/upsert Docs: https://noon-docs.noonpartners.dev/docs/api-reference/xborder-pricing/xborder-pricing-service-batch-upsert-product Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_xborder_pricing_BatchUpsertProduct", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_xborder_pricing_BatchUpsertProduct \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to write (required), at most 1000 per call — partner_sku plus the fields to set: dimensions in cm (all three when given), vm_weight_cm (the volumetric weight, as noon's schema names it), actual_weight_kg in kg, hs_code (the Harmonized System customs code). Rows are sent as given. | ## Result - `data.items[]` — partner_sku, status {status_code, message} — the per-row create/update result. ## Body (noon schema): {items: [item]}, each item - partner_sku*: string dimensions_cm: {length*, width*, height*} vm_weight_cm: number actual_weight_kg: number hs_code: string # noon_xborder_pricing_BatchUpsertTransferPrice (https://sellersheetai.com/docs/mcp-api/tools/noon_xborder_pricing_BatchUpsertTransferPrice) > Set or change the USD transfer price and MSRP noon uses to list a SKU cross-border, or toggle it active, for a batch of SKUs. Access: **DESTRUCTIVE** · toolset noon · family noon Run noon_xborder_pricing_BatchUpsertProduct first for a brand-new cross-border item (its dimensions and weight must exist). noon API · XborderPricingService_BatchUpsertTransferPrice · POST /xborder-pricing/v1/transfer-price/upsert Docs: https://noon-docs.noonpartners.dev/docs/api-reference/xborder-pricing/xborder-pricing-service-batch-upsert-transfer-price Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask. ## Call it MCP tool call: ```json { "name": "noon_xborder_pricing_BatchUpsertTransferPrice", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_xborder_pricing_BatchUpsertTransferPrice \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. | | `items` | object[] | | the rows to write (required), at most 1000 per call — partner_sku plus the fields to set (is_active true = Active, false = Inactive); blank fields are dropped. | ## Result - `data.items[]` — partner_sku, status {status_code, message} — the per-row write result; no prices are echoed. ## Body (noon schema): {items: [item]}, each item - partner_sku*: string transfer_price_usd: number msrp_usd: number is_active: boolean # list_amc_templates (https://sellersheetai.com/docs/mcp-api/tools/list_amc_templates) > The AMC queries SellerSheet runs for every store whose AMC is on, and the warehouse table each one fills. Access: **READ** · toolset sellersheet · family null Read this before writing your own AMC SQL: the answer may already be synced — query its table with query_report_data (get_table_schema gives the columns) instead of running ads_create_workflow_execution. ## Call it MCP tool call: ```json { "name": "list_amc_templates", "arguments": {} } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_amc_templates \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `key` | string | | one template, e.g. 'AMC_NTB_BY_CAMPAIGN'; omit for all of them. | ## Result - `data.templates[]` — {key, version, question, how_to_read, sql, data_sources, mode, cadence, period_days, synced_table, dimensions, metrics, hidden_column, enabled_by_default, notes}. - `data.templates[].synced_table` — the rpt_amc_* table; one row per store, country, period_start and group of dimensions. - `data.templates[].how_to_read` — units and caveats — read it before quoting a number. ## Gotchas - Each period has ONE row with hidden=true: everything AMC suppressed under its privacy floor, summed. Totals include it; per-group answers leave it out. period_start is the first marketplace-local day of the period (7 or 28 days, period_days), not a day of activity. mode scheduled = Amazon runs it weekly; on_demand = every 4 weeks, 15 days after the period ends (attribution settles). A template with enabled_by_default false is not synced unless turned on. # credits_quote (https://sellersheetai.com/docs/mcp-api/tools/credits_quote) > Price ONE paid action for this user, on their model route, before spending — quote data.credits to the user, never a number from memory. Access: **READ** · toolset sellersheet · family null If data.sufficient is false, tell the user to top up at get_user_context's data.credits.topup_url (amounts in data.credits.rates.topup_usd). The route itself is changed only by the user, in the Dashboard credits card. ## Call it MCP tool call: ```json { "name": "credits_quote", "arguments": { "meter": "<meter>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/credits_quote \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"meter":"<meter>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `meter` | string | yes | 'image' (generate_image / edit_image; size picks the band) \| 'image.1k' \| 'image.2k' \| 'copy' (listing copy, per language) \| 'text' (reverse_prompt, small text calls) \| 'insights' (customerFeedback_insights_report). | | `units` | integer | | how many images / reports / calls this action makes, 1–50. Default 1. | | `languages` | integer | | for meter='copy', how many languages one call covers, 1–16. | | `size` | string | | for meter='image', the requested canvas ('1024x1024', '1536x1024', '2K', 'auto'). Decides the image band (up to 1024 px on the longer side, or above). | | `both` | boolean | | for meter='image', provider='both' renders twice — doubles it. | | `provider` | string | | for meter='image', the provider the image call will use ('openai' \| 'nanobanana' \| 'both'). 'nanobanana' renders its ~1K canvas whatever size is asked, so it prices the 1K band; omit and the requested size is priced. | | `store` | string | | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Optional: pass the store the action will name — its organization pays, at its route, so the quote equals the charge; omit for an action that names no store. | ## Result - `data.credits` — what this user pays for the action — show this; the hold takes exactly this. - `data.sufficient / data.balance` — whether the balance covers it. - `data.meter` — the meter priced ('image' resolves to image.1k / image.2k). - `data.route / data.multiplier / data.official_credits` — their route and its price against Official. # list_report_syncs (https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) > List a store's report sync schedules — check sync health before trusting rpt_* data. Access: **READ** · toolset sellersheet · family null Syncs start automatically when a store (SP reports) or its Ads account (Ads reports) is authorized. The report-data skill says what to tell the user for each disabled_reason; never enable, trigger or disable a sync yourself (admin-only). ## Call it MCP tool call: ```json { "name": "list_report_syncs", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_report_syncs \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `report_type` | string | | optional — return only this report type's schedule (exact name, case-insensitive, e.g. 'GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL'). Omit for every schedule. | | `target_table` | string | | optional — return only the schedules that feed this rpt_* table (e.g. 'rpt_orders'), the way to check one table's freshness before querying it. | ## Result - `data.schedules` — one row per report type — report_type, is_enabled, cron_expression, last_run_at, next_run_at, consecutive_failures (auto-disabled at a threshold), target_table (the rpt_* table to query with query_report_data; null when unmapped), lookback_days, chunk_days, disabled_reason (null | 'auth_revoked' | 'auto_disabled:<category>' | 'amazon_refused' | 'no_brand_registry' | 'unsupported' | 'backfill_complete' | 'paused_by_parent' | 'pending_delete' | 'force_cancelled_by_delete' | 'scheduler_tick_error:<exception>'; legacy rows: 'consecutive_failures'), disabled_marketplaces (marketplaces being skipped), disabled_message. # customerFeedback_insights_report_status (https://sellersheetai.com/docs/mcp-api/tools/customerFeedback_insights_report_status) > Poll a Buyer insights job submitted by customerFeedback_insights_report — every ~4 s until status is done or error. Access: **READ** · toolset sellersheet · family null ## Call it MCP tool call: ```json { "name": "customerFeedback_insights_report_status", "arguments": { "job_id": "<job_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/customerFeedback_insights_report_status \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"job_id":"<job_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `job_id` | string | yes | the job id customerFeedback_insights_report returned. | ## Result - `data.status` — 'pending' | 'processing' | 'done' | 'error'. An unknown job_id, or another user's job, is refused (HTTP 400). - `data.report` — the full report — see customerFeedback_insights_report's Returns; data.supported mirrors data.report.supported. - `data.error` — one sentence; nothing was charged. # get_table_schema (https://sellersheetai.com/docs/mcp-api/tools/get_table_schema) > Return the schema for one rpt_* table — column names, types, unique key. Access: **READ** · toolset sellersheet · family null Cheaper than loading the full report-data skill when you already know which table you need and just want column names to build a query. For business-question → table mapping (e.g. "what table answers 'restock needs'?"), per-column gotchas, calibration notes, or the cross-table workflow (manual create-poll-download, disabled_reason decoding) — load the 'report-data' skill instead. This tool returns the schema only; it does NOT teach which table to use. ## Call it MCP tool call: ```json { "name": "get_table_schema", "arguments": { "table_name": "<table_name>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_table_schema \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"table_name":"<table_name>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `table_name` | string | yes | physical rpt_* table (e.g. 'rpt_orders'), a friendly alias ('rpt_listings' → rpt_get_merchant_listings_all_data), OR an Amazon report-type name ('GET_FBA_MYI_ALL_INVENTORY_DATA', 'spCampaigns' — case-insensitive). Resolved server-side. | ## Result - `data.table_name` — the resolved physical table. - `data.resolved_from` — the ref you passed, when it differed (else null). - `data.columns` — [{name, type, nullable, default, note}] — note is a per-column trap (e.g. the days_of_supply NULL-sort trap) or null. - `data.unique_constraint` — the dedup key; on a snapshot/roster table its marketplace column (country_code, country, marketplace_id, profile_id) is what report_date='latest' resolves one date per. - `data.indexes / data.fed_by_report_types / data.notes` — indexes ({name, columns, unique}), the Amazon report types that feed the table, and table-level warnings (PII-blocked, schema-variant, retired/aliased; empty when healthy). ## Gotchas - 400 — ref not resolvable to an allow-listed table. The error carries the full available_tables list + a fuzzy suggestion; a retired report-type name names its replacement. # query_report_data (https://sellersheetai.com/docs/mcp-api/tools/query_report_data) > Query the synced report warehouse (rpt_* tables) — rows without calling Amazon. Access: **READ** · toolset sellersheet · family null Table and column names: the report-data skill, or get_table_schema(table); a wrong column is a 400 naming the valid ones. `tables` takes the physical name (rpt_get_merchant_listings_all_data), an alias (rpt_listings) or the report-type name (GET_MERCHANT_LISTINGS_ALL_DATA, spCampaigns); data.resolved_tables says what was rewritten. ## Call it MCP tool call: ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [], "columns": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/query_report_data \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","tables":[],"columns":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. rpt_noon_* tables: the noon ref `<account>-<CC>` (e.g. 'myNoon-AE'), never a bare name. | | `tables` | object[] | yes | table refs; the first is the primary table. | | `columns` | object[] | yes | 'table.column' strings; '*' = every column of the primary, 'tbl.*' of tbl. Ignored when aggregations is set. | | `filters` | object[] | | [{column: 'table.col', op, value}]. Allowed op: eq, neq, gt, lt, gte, lte, contains (case-insensitive), in (a list), not_null, is_null (no value). | | `joins` | object[] | | [{table: 'rpt_x', on: {primary_col: joined_col}}] — LEFT JOIN on bare column names. | | `order_by` | object[] | | [{column: 'table.col' \| aggregation alias, dir: 'asc'\|'desc'}]. DESC sorts NULLs last. Required whenever offset > 0, or pages overlap. | | `limit` | integer | | rows per page, 1–1000 (default 100). Every row enters your context. | | `offset` | integer | | pass data.next_offset from the previous page. | | `report_date` | string | | 'latest' \| 'all' \| 'YYYY-MM-DD'. Omitted → 'latest' (each marketplace's newest snapshot; data.stale_partitions flags a lagging one) on snapshot/roster tables, 'all' on daily-fact and ledger tables (data.report_date_note says which). A date-column filter makes 'latest' act as 'all'. Unbounded 'all' stops at offset 20000: add a date or eq/in filter, or aggregate. | | `aggregations` | object[] | | [{column: 'table.col', op: 'sum'\|'count'\|'avg'\|'min'\|'max', alias}] — the key is op; sort groups with order_by on the alias. | | `group_by` | object[] | | ['table.col', 'rpt_orders.purchase_date:month'] — ':day\|week\|month\|quarter\|year' buckets a date; total_count is then the group count. | | `having` | object[] | | [{column: '<aggregation alias>', op, value}]; op: eq, neq, gt, lt, gte, lte, in. | ## Result - data.rows, data.columns: the page; columns are 'table.column' under the physical name. - `data.total_count` — the full match count, on page 1 only (null later). data.truncated, next_offset, page, total_pages: paging. data.report_date, data.report_date_span, data.stale_partitions, data.report_date_note. - `data.time_zone` — the times' zone. ## Gotchas - Ads (rpt_sp_* / rpt_sb_* / rpt_sd_*) and Data Kiosk (rpt_dk_*) tables are one row per entity per DAY: an explicit 'latest' is one scalar date there, often a partial day — add a date filter for any range or ranking; only campaigns that delivered on a day appear, so for a campaign inventory use ads_query_campaign. rpt_get_fba_inventory_planning_data.days_of_supply is NULL for SKUs with no recent sales — filter days_of_supply > 0 for a lowest-cover ranking. Times and days are the store ref's marketplace's ('YYYY-MM-DD HH:MM:SS'). PII blocked. # fbaInbound_create_sta_sheet (https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_sta_sheet) > Create the plan workbook for an FBA inbound plan — the SAME workbook the sidebar's "Create STA SS" builds, so the sidebar buttons can continue any step: the stepper tab (STA-BoxFir Access: **WRITE** · toolset sellersheet · family null st / STA-SplitFirst) copied from the master template into a workbook named after the plan in its own folder under Shipments/<store>/<CC>/<yyyy>/<MM>/; the Product Info IMPORTRANGE re-targeted to the FBA spreadsheet, row 9 filled by label, MSKUs from row 14, a _state tab (STA_CREATED). The human clicks the STA tab's D3 cell once ("Allow access" — the server cannot grant it), then fills Box No. (column A) per item row — Split First: Total Qty (column F) — before fbaInbound_orchestrate_packing. ## Call it MCP tool call: ```json { "name": "fbaInbound_create_sta_sheet", "arguments": { "store": "myStore-US", "plan_name": "<plan_name>", "skus": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/fbaInbound_create_sta_sheet \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","plan_name":"<plan_name>","skus":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. | | `plan_name` | string | yes | the plan name (the plan's Manage Shipments row). | | `skus` | object[] | yes | the plan's MSKUs (the Manage Shipments SKUs cell, newline-split). | | `case_packed` | string | | 'YES' (default) \| 'NO'. | | `pallet_packed` | string | | 'YES' \| 'NO' (default). | | `shipping_mode` | string | | the row-9 Shipping Mode GROUP (narrows the transport dropdown later); empty = every mode. Allowed: SPD \| LTL / FTL. | | `shipping_solution` | string | | the row-9 Shipping Solution; empty = both. Allowed: AMAZON_PARTNERED_CARRIER \| USE_YOUR_OWN_CARRIER. | | `preferred_carrier` | string | | e.g. 'DHL', 'UPS'; default 'Other'. | | `fulfillment_split` | string | | text containing 'Split First' picks STA-SplitFirst, anything else STA-BoxFirst (default 'Box First, Split Later'). | | `ship_date` | string | | ISO dates (e.g. '2026-04-07'). | | `delivery_window_start_date` | string | | ISO dates (e.g. '2026-04-07'). | | `unit_of_weight` | string | | the row-9 units; defaults 'KG' and 'CM'. | | `unit_of_dimension` | string | | the row-9 units; defaults 'KG' and 'CM'. | | `fnsku_label_size` | string | | the row-9 label sizes; defaults '50x30 mm' and '100x100 mm'. | | `fba_box_label_size` | string | | the row-9 label sizes; defaults '50x30 mm' and '100x100 mm'. | | `warehouse_code` | string | | the Shipment Setting row's code (e.g. 'CN'); row 9 gets the key '<store>-<CC>-<code>' the sidebar resolves to the address. Refused before anything is created when that key is not a complete Shipment Setting row — the refusal lists the codes that exist. | | `fba_spreadsheet_id` | string | | the user's SellerSheet FBA spreadsheet (defaults to the workspace setting) — the Product Info donor and Manage Shipments. | | `parent_folder_id` | string | | Drive folder override. | | `source_spreadsheet_id` | string | | older name for fba_spreadsheet_id (that one wins). | ## Result - `data.staSpreadsheetId / data.spreadsheetUrl / data.tabName / data.gid` — the new workbook and its stepper tab. - `data.planFolderId / data.planFolderUrl / data.planFolderName` — the plan's Drive folder. - `data.importrangeGranted` — always false here (the D3 click above). - `data.addressKeyKnown` — false only when no warehouse_code was given or Shipment Setting could not be read — the human fills Send From Address (D9). - `data.manageShipmentsFormulas` — {planFolder, planName} — write both into the plan's Manage Shipments row (columns by row-1 key) so the sidebar finds the workbook. # check_image_job (https://sellersheetai.com/docs/mcp-api/tools/check_image_job) > Poll an async image job (edit_image). Access: **READ** · toolset sellersheet · family null Call every ~15–30s until status='done' or 'error'. The deliverable is cdn_url. For a multi-turn refine chain, read cdn_url from the done payload and pass it as the next edit_image's image_sources. ## Call it MCP tool call: ```json { "name": "check_image_job", "arguments": { "job_id": "<job_id>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/check_image_job \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"job_id":"<job_id>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `job_id` | string | yes | id returned by edit_image. | ## Result - `data.status` — 'pending' | 'processing' | 'done' | 'error'. - `data.progress` — human-readable status string. - `data.elapsed_s` — seconds since the worker started (null before); use it to estimate the time left (elapsed 30 s on a typical 90 s job → ~60 s more). - `data.queue_wait_s` — seconds from submit to worker pickup. - `data.cdn_url` — the saved image — the input for the next refine turn. A job that names a store and SKU reads 'done' only once its image is saved, so cdn_url is set; if the save fails the job ends 'error', nothing is charged and no image is attached. A job without a store and SKU saves nothing: its image comes back as an inline image block and cdn_url stays null. - `data.error` — the error message when status is 'error'. - `data.revised_prompt` — how the model rewrote the prompt — mention it so the user can spot drift; relay data.background_note when set. - `data.mask` — 'mask' (a real mask was applied) | 'described' (the box was written into the instruction — check the edit stayed inside it) | null. ## Gotchas - Poll every ~20 s for nanobanana jobs (~15–30 s total), every ~30 s for OpenAI jobs (~60–120 s). There is no client timeout: a long 'processing' (edit up to ~2 min, compose ~5 min) is normal — never resubmit it (that rebills and duplicates); only 'error' warrants a fresh edit_image. Status is dropped ~15 min after submit — read cdn_url before then. # check_image_jobs (https://sellersheetai.com/docs/mcp-api/tools/check_image_jobs) > Batch-poll multiple async image jobs in one call. Access: **READ** · toolset sellersheet · family null Use this when you have submitted several edit_image jobs in parallel (e.g. a family-recolor fan-out) — avoids N separate round trips per polling cycle. Rows stay small (~1 KB per job) and carry no image. Each row already carries cdn_url; call check_image_job only for a 'done' job whose cdn_url is still null. ## Call it MCP tool call: ```json { "name": "check_image_jobs", "arguments": { "job_ids": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/check_image_jobs \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"job_ids":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `job_ids` | object[] | yes | up to 20 job_ids from edit_image; ids past the 20th are dropped without notice. | ## Result - `data.jobs` — one row per id, in input order — id, status ('pending' | 'processing' | 'done' | 'error' | 'not_found' = unknown or past its ~15-minute retention), progress, elapsed_s, queue_wait_s, cdn_url, error. - `data.done / data.pending / data.error` — counts — poll until data.pending is 0. ## Workflow - 1. Submit N jobs via edit_image → collect job_ids 2. Poll check_image_jobs(job_ids) every 20–30s 3. When data.pending is 0, read cdn_url from each 'done' row. ## Gotchas - Successes = data.done (or cdn_url); failures = data.error only, not slow jobs. Re-submit only 'error' jobs, never a 'pending'/'processing' one (that duplicates and rebills). # edit_image (https://sellersheetai.com/docs/mcp-api/tools/edit_image) > Edit one image, or compose 2–10 into one, from a text instruction (1 input = revise, 2 or more = compose): background swaps, style transfer, object add/remove, composites. Access: **WRITE** · toolset sellersheet · family null Returns a job receipt — poll check_image_job until status is 'done', then read cdn_url and revised_prompt (the drift signal). Priced per delivered image (credits_quote gives the number; HTTP 402 with error_code insufficient_credits when the balance is short — top up at sellersheetai.com/billing); a failure is refunded. ## Call it MCP tool call: ```json { "name": "edit_image", "arguments": { "prompt": "<prompt>", "image_sources": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/edit_image \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"<prompt>","image_sources":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `prompt` | string | yes | the edit or composition instruction; for a restyle, the adapted json_prompt from reverse_prompt, stringified. Restate the preserve-list every turn ("change only X; keep geometry, branding, text and camera identical") and index several inputs ("Image 1 = master, Image 2 = colour reference only"). | | `image_sources` | object[] | yes | 1–10 sources — a public URL (a Drive link must be shared 'anyone with the link') or base64; for a refinement turn, the previous turn's cdn_url. | | `provider` | string | | 'openai' (default; up to 10 inputs + mask) \| 'nanobanana' (first image only; priced at its ~1K canvas) \| 'both'. | | `size` | string | | '2048x2048' (default; best for Amazon zoom) \| '1536x1536' \| '1024x1024' \| '1024x1536' \| '1536x1024'. | | `quality` | string | | 'low' \| 'medium' \| 'high' (default). | | `mask_source` | string | | optional PNG mask (transparent = edit area). Applied as a real mask only when the user's model route has a mask-capable model (get_user_context data.credits.routes[key = data.credits.route].answers.image_mask non-null); otherwise the server describes the painted box in the instruction and runs the edit unmasked (check_image_job's data.mask = 'described' — check the result stayed inside the area), and a route that cannot edit at all is refused before billing. For exact masked edits switch route on Billing & Credits. | | `output_format` | string | | 'png' \| 'jpeg' \| 'webp'; omit and the server decides (currently jpeg). | | `synthetic_performer` | boolean | | Amazon's contains-synthetic-performer disclosure (XMP metadata in the upload); omit and the server infers it from the prompt; true or false overrides. set_synthetic_performer toggles it later without regenerating. | | `store` | string | | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Required. | | `parent_sku` | string | | the family SKU; defaults to sku. | | `sku` | string | | the child SKU. Required. | | `slot` | string | | the Image Library slot: 's0'–'s8' (PDP) or 'a1'–'a5' / 'p1'–'p5' (A+). Required. | | `filename_prefix` | string | | upload filename prefix. | ## Result - `data.job_id` — the receipt — poll check_image_job. ## Gotchas - store, sku and slot are required — a call missing one is refused (400) before anything is charged. A single edit takes ~60–120 s (openai) or ~10–30 s (nanobanana), a compose 2–5 minutes. Never resubmit a 'processing' job (a resubmit is a new, billed job); re-run only on status 'error'. # generate_image (https://sellersheetai.com/docs/mcp-api/tools/generate_image) > Generate images from a text prompt — listing photos, A+ banners, lifestyle and infographic shots, icons. Access: **WRITE** · toolset sellersheet · family null Priced per delivered image (credits_quote gives the number; HTTP 402 with error_code insufficient_credits when the balance is short — top up at sellersheetai.com/billing); a failure is refunded. ## Call it MCP tool call: ```json { "name": "generate_image", "arguments": { "prompt": "<prompt>" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/generate_image \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt":"<prompt>"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `prompt` | string | yes | the image description. | | `provider` | string | | 'openai' (default; gpt-image-2 — precise, legible text) \| 'nanobanana' (Gemini — fast, search-grounded; renders and is priced at the default canvas, so size, quality and background apply to openai only) \| 'both'. | | `size` | string | | '1024x1024' (default, the same canvas Studio uses) \| '2048x2048' (Amazon zoom headroom; costs more) \| '1024x1536' \| '1536x1024' \| 'auto'. | | `quality` | string | | 'low' \| 'medium' \| 'high' (default) \| 'auto'. | | `n` | integer | | variations, 1–4 (default 1). | | `background` | string | | 'auto' (default) \| 'opaque'. gpt-image-2 has no transparent background — 'transparent' is treated as 'auto' and the response carries background_note; generate opaque and remove the background downstream. | | `output_format` | string | | 'png' \| 'jpeg' \| 'webp'; omit and the server decides (currently jpeg). | | `use_search_grounding` | boolean | | Google Search grounding (nanobanana); default false. | | `synthetic_performer` | boolean | | Amazon's contains-synthetic-performer disclosure (XMP metadata in the upload); omit and the server infers it from the prompt; true or false overrides. set_synthetic_performer toggles it later without regenerating. | | `store` | string | | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Required. | | `parent_sku` | string | | the family SKU; defaults to sku. | | `sku` | string | | the child SKU. Required. | | `slot` | string | | the Image Library slot: 's0'–'s8' (PDP) or 'a1'–'a5' / 'p1'–'p5' (A+). Required — a call missing store, sku or slot is refused (400) before billing. | | `filename_prefix` | string | | upload filename prefix. | ## Result - `data.images` — one entry per image — cdn_url (saved at store/parent_sku/sku/slot), thumbnail_url, provider, model, revised_prompt (how the model rewrote the prompt — mention it), background_note (relay it when set), or error. An entry with r2_upload_error has no cdn_url; its image arrives as an inline image block. - `data.credits.charged / data.credits.balance` — this call's cost and what is left. # list_generated_images (https://sellersheetai.com/docs/mcp-api/tools/list_generated_images) > List images already generated and saved for a store — newest first. Access: **READ** · toolset sellersheet · family null Use this to FIND an image you or the user made earlier instead of regenerating it (a regeneration is billed again and returns a different image; the library is free and returns the exact one). Also the way to answer "what images do we have for this SKU?". ## Call it MCP tool call: ```json { "name": "list_generated_images", "arguments": { "store": "myStore-US" } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/list_generated_images \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US"}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Required. | | `parent_sku` | string | | narrow to one product family. | | `sku` | string | | narrow to one SKU — matches parent OR child, so pass whichever you have. | | `slot` | string | | narrow to one position ('s0'-'s8', 'a1'-'a5', 'p1'-'p5'). | | `limit` | integer | | page size, 1-200 (default 50). Above 200 is REJECTED (422), not clamped — ask for 200 and page with before_id. | | `before_id` | integer | | paging cursor — pass the previous response's `next_before_id`. Do NOT compute an offset: rows are keyset- paged by id, so an offset would skip or repeat images when new ones land while you page. | ## Result - `data.images` — newest first; each carries id (pass it to set_synthetic_performer), parent_sku, child_sku, slot, version, lang, cdn_url, thumbnail_url, source, created_at and synthetic_performer. - `data.next_before_id` — pass as before_id for the next page; null on the last page — stop there. # reverse_prompt (https://sellersheetai.com/docs/mcp-api/tools/reverse_prompt) > Describe reference image(s) as a structured English prompt — step 1 of a restyle: adapt the fields to your product (subject, colors and materials stay faithful; swap scene, lightin Access: **WRITE** · toolset sellersheet · family null g and camera), stringify it and pass it as edit_image's prompt with your product photos as image_sources. Billed per call on the text meter, refunded on failure; synchronous, ~5–30 s. Then write the adapted prompt yourself: edit data.json_prompt so subject, details_appearance, colors and materials are YOUR product (exact geometry, proportions and label text kept; nothing of the reference product leaks in); set intended_use to the target slot (an Amazon main image is pure white, product only, no text); borrow only the look — environment_background, lighting_atmosphere, style_camera, composition, aspect_ratio; put the invariants in `constraints` (no watermark, no extra text, no new objects; 'photorealistic' for a photo; literal copy in straight quotes, brand names spelled letter by letter); one tight phrase per field, the stringified prompt under 2,500 characters. Then json.dumps it and pass it as edit_image's prompt with the product photos as image_sources and quality='high'. ## Call it MCP tool call: ```json { "name": "reverse_prompt", "arguments": { "images": [] } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/reverse_prompt \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"images":[]}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `images` | object[] | yes | 1+ sources — a public URL (a Drive link must be shared 'anyone with the link') or base64; for a restyle, the reference shot. Required. | | `vision_provider` | string | | 'auto' (OpenAI→Gemini) \| 'openai' \| 'gemini'. Default 'auto'. | ## Result - `data.json_prompt` — field dict (subject, action_pose, environment_background, lighting_atmosphere, style_camera, colors, materials, aspect_ratio, …). - `data.style_tags / data.analysis / data.confidence / data.vision_provider` — supporting detail and which model answered. # set_synthetic_performer (https://sellersheetai.com/docs/mcp-api/tools/set_synthetic_performer) > Toggle Amazon's contains-synthetic-performer disclosure tag on an already-saved image, without regenerating it. Access: **DESTRUCTIVE** · toolset sellersheet · family null Set value=True when the image depicts an AI-generated person (Amazon requires the disclosure); set False to remove a tag that was added in error. Rewrites the R2 file in place — same cdn_url and version, only the embedded XMP metadata changes (webp is not yet supported: the tag needs a png/jpeg container). ## Call it MCP tool call: ```json { "name": "set_synthetic_performer", "arguments": { "store": "myStore-US", "id": 1, "value": true } } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/set_synthetic_performer \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"store":"myStore-US","id":1,"value":true}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `store` | string | yes | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Required — authorizes the image. | | `id` | integer | yes | the canonical_images row id — read it from a list_generated_images row (NOT the job_id from generate_image / edit_image). | | `value` | boolean | yes | True to add the disclosure tag, False to remove it. | ## Result - `data.id / data.synthetic_performer` — the image and its flag as now stored. # get_user_context (https://sellersheetai.com/docs/mcp-api/tools/get_user_context) > Get the user's plan, stores, workspace folders, permissions, credits and the skills catalog. Access: **READ** · toolset sellersheet · family null Call it first in every session; every other tool takes one of its store_refs. ## Call it MCP tool call: ```json { "name": "get_user_context", "arguments": {} } ``` Tool API (early access — contact us): ```bash curl -X POST https://api.sellersheetai.com/api/v1/tools/get_user_context \ -H "Authorization: Bearer $SELLERSHEET_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` ## Arguments | Name | Type | Required | Description | |---|---|---|---| | `installed_skills_version` | string | | the `version:` of any installed SellerSheet SKILL.md (one bundle version for all), so data.skills_update is computed here. Omit if you cannot read local files. | ## Result - `data.canUseMcp` — false when no tool can run — relay data.message, stop. - `mcp_server_version` — changed mid-session → ask the user to reconnect. - `data.workspace` — {org_id, name, slug, role, is_personal, reach} — the key's home - `data.workspace.org` — pays calls naming no store; the limits and credits below are its. reach 'all': every organization below (a store's calls bill its own); 'org': this one only. - `data.organizations` — [{org_id, name, role, plan, credits_balance, note}] — all of the user's; relay note. - `data.ownedStoreInfo` — stores the user manages; each store carries organization. - `data.ownedStoreInfo.max_stores` — the plan's store cap. - `data.ownedStoreInfo.number_of_stores_used` — stores counted against it. - `data.ownedStoreInfo.owned_stores` — [{store_name, country_code, region_code, seller_id, store_id, store_refs, enabled_marketplaces, available_marketplaces, sync_status, paused_reason, store_auth_time, ads_auth_time, profile_ids, amc}]. amc: AMC per Ads country, {CC: {status: on|creating|failed, instance_id}}; none = off. - `data.ownedStoreInfo.data.ownedStoreInfo.owned_stores.store_refs` — one `<store>-<CC>` per marketplace, passed verbatim; a CC in available_marketplaces is not activated and is refused — ask which enabled one to target. sync_status 'paused': the plan no longer covers the store — reports frozen, every call refused; relay paused_reason, do not retry. - `data.sharedStoreInfo.shared_stores` — granted stores (no sync_status, marketplaces) - `data.noonAccountInfo.accounts` — [{account_name, noon_account_id, project_code, region_code, marketplaces, store_refs, status, auth_error_code}] — noon tools take one of these store_refs (`<account>-<CC>`) verbatim. - `data.subscriptionInfo` — {plan, max_stores, max_orders, effective_plan, ops, limits, orders}. orders.status 'approaching' or 'over' → tell the user to upgrade at https://sellersheetai.com/billing (refused only when the order gate is on: order_quota_exceeded). limits.concurrent_calls: the in-flight ceiling (null = none; above it concurrency_limit_exceeded + retry_after — run calls in turn). - `data.subscriptionInfo.ops.mcp_ops_used / mcp_ops_limit` — the Free monthly pool. - `data.workspace_config` — Drive ids — userSettingByFolder {sellerSheetFolderId, storeReportsFolderId, adsReportsFolderId, imagesFolderId, listingsFolderId, shipmentsFolderId, invoicesFolderId}; userSettingBySpreadsheet {salesSpreadsheetId, catalogSpreadsheetId, fbaSpreadsheetId, aplusSpreadsheetId, storeReportsSpreadsheetId, adsReportsSpreadsheetId, fbaInventorySpreadsheetId}; sa_folder_access {folder_id, ok, checked_at, error} (ok: the AI can write there). - `data.mcpAccessInfo` — {mcp_mode 'open' | 'restricted', mcp_permissions: [{store_id, store_name, marketplace, sp_access, ads_access}]} — effective access ('none' | 'read' | 'write'); a member gets the lower of key and grant. - `data.credits` — {balance, rates, route, routes, topup_url}. Check balance before a paid tool (empty → 402; credits_quote prices a call). rates is the Official card — this workspace pays routes[key = route].rates; quote those or credits_quote, never compute. Only its owner or an admin switches the route (Billing & Credits). - `data.skills_catalog` — the public skills and their install commands. - `data.skills_update` — {installed, latest, update_available, message, commands} — when update_available is true relay message and ask before running the agent's update command (never auto-update); false → say nothing; null → you passed no version. # rpt_dk_sales_traffic_by_asin (https://sellersheetai.com/docs/data/rpt_dk_sales_traffic_by_asin) > Seller reports (SP-API) · DK_SALES_TRAFFIC_BY_ASIN · Daily at 01:19 marketplace local time - Family: seller - Report type: `DK_SALES_TRAFFIC_BY_ASIN` - How fresh: Daily — Daily at 01:19 marketplace local time - Need it right now: [`sales_getOrderMetrics`](https://sellersheetai.com/docs/mcp-api/tools/sales_getOrderMetrics) (sales, not traffic) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `marketplace_id` | VARCHAR(20) | | | `currency_code` | VARCHAR(8) | | | `parent_asin` | VARCHAR(20) | | | `child_asin` | VARCHAR(20) | key | | `sku` | VARCHAR(200) | key | | `ordered_product_sales` | NUMERIC(16, 2) | | | `ordered_product_sales_b2b` | NUMERIC(16, 2) | | | `units_ordered` | INTEGER | | | `units_ordered_b2b` | INTEGER | | | `total_order_items` | INTEGER | | | `browser_sessions` | INTEGER | | | `mobile_app_sessions` | INTEGER | | | `sessions` | INTEGER | | | `browser_session_percentage` | NUMERIC(8, 4) | | | `mobile_app_session_percentage` | NUMERIC(8, 4) | | | `session_percentage` | NUMERIC(8, 4) | | | `browser_page_views` | INTEGER | | | `mobile_app_page_views` | INTEGER | | | `page_views` | INTEGER | | | `browser_page_views_percentage` | NUMERIC(8, 4) | | | `mobile_app_page_views_percentage` | NUMERIC(8, 4) | | | `page_views_percentage` | NUMERIC(8, 4) | | | `buy_box_percentage` | NUMERIC(8, 4) | | | `unit_session_percentage` | NUMERIC(8, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_dk_sales_traffic_by_asin" ], "columns": [ "rpt_dk_sales_traffic_by_asin.date", "rpt_dk_sales_traffic_by_asin.country_code", "rpt_dk_sales_traffic_by_asin.child_asin", "rpt_dk_sales_traffic_by_asin.sku" ], "order_by": [ { "column": "rpt_dk_sales_traffic_by_asin.date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_dk_sales_traffic_by_date (https://sellersheetai.com/docs/data/rpt_dk_sales_traffic_by_date) > Seller reports (SP-API) · DK_SALES_TRAFFIC_BY_DATE · Daily at 01:18 marketplace local time - Family: seller - Report type: `DK_SALES_TRAFFIC_BY_DATE` - How fresh: Daily — Daily at 01:18 marketplace local time - Need it right now: [`sales_getOrderMetrics`](https://sellersheetai.com/docs/mcp-api/tools/sales_getOrderMetrics) (sales, not traffic) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `marketplace_id` | VARCHAR(20) | | | `currency_code` | VARCHAR(8) | | | `ordered_product_sales` | NUMERIC(16, 2) | | | `ordered_product_sales_b2b` | NUMERIC(16, 2) | | | `average_sales_per_order_item` | NUMERIC(16, 2) | | | `average_selling_price` | NUMERIC(16, 2) | | | `average_units_per_order_item` | NUMERIC(12, 4) | | | `shipped_product_sales` | NUMERIC(16, 2) | | | `claims_amount` | NUMERIC(16, 2) | | | `claims_granted` | INTEGER | | | `units_ordered` | INTEGER | | | `units_ordered_b2b` | INTEGER | | | `total_order_items` | INTEGER | | | `total_order_items_b2b` | INTEGER | | | `units_refunded` | INTEGER | | | `refund_rate` | NUMERIC(8, 4) | | | `units_shipped` | INTEGER | | | `orders_shipped` | INTEGER | | | `browser_page_views` | INTEGER | | | `mobile_app_page_views` | INTEGER | | | `page_views` | INTEGER | | | `browser_sessions` | INTEGER | | | `mobile_app_sessions` | INTEGER | | | `sessions` | INTEGER | | | `buy_box_percentage` | NUMERIC(8, 4) | | | `order_item_session_percentage` | NUMERIC(8, 4) | | | `unit_session_percentage` | NUMERIC(8, 4) | | | `average_offer_count` | INTEGER | | | `average_parent_items` | INTEGER | | | `feedback_received` | INTEGER | | | `negative_feedback_received` | INTEGER | | | `received_negative_feedback_rate` | NUMERIC(8, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_dk_sales_traffic_by_date" ], "columns": [ "rpt_dk_sales_traffic_by_date.date", "rpt_dk_sales_traffic_by_date.country_code" ], "order_by": [ { "column": "rpt_dk_sales_traffic_by_date.date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_afn_inventory_data (https://sellersheetai.com/docs/data/rpt_get_afn_inventory_data) > Seller reports (SP-API) · GET_AFN_INVENTORY_DATA · Every 6 hours, on the hour (marketplace local time) - Family: seller - Report type: `GET_AFN_INVENTORY_DATA` - How fresh: Several times a day — Every 6 hours, on the hour (marketplace local time) - Need it right now: [`fbaInventory_getInventorySummaries`](https://sellersheetai.com/docs/mcp-api/tools/fbaInventory_getInventorySummaries) (one or a few SKUs) - Grain: account · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `seller_sku` | VARCHAR(200) | | | `fnsku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `condition_type` | VARCHAR(50) | key | | `warehouse_condition_code` | VARCHAR(50) | key | | `quantity_available` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_afn_inventory_data" ], "columns": [ "rpt_get_afn_inventory_data.snapshot_date", "rpt_get_afn_inventory_data.fnsku", "rpt_get_afn_inventory_data.condition_type", "rpt_get_afn_inventory_data.warehouse_condition_code" ], "order_by": [ { "column": "rpt_get_afn_inventory_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_afn_inventory_data_by_country (https://sellersheetai.com/docs/data/rpt_get_afn_inventory_data_by_country) > Seller reports (SP-API) · GET_AFN_INVENTORY_DATA_BY_COUNTRY · Every 6 hours, on the hour (marketplace local time) - Family: seller - Report type: `GET_AFN_INVENTORY_DATA_BY_COUNTRY` - How fresh: Several times a day — Every 6 hours, on the hour (marketplace local time) - Need it right now: [`fbaInventory_getInventorySummaries`](https://sellersheetai.com/docs/mcp-api/tools/fbaInventory_getInventorySummaries) (one or a few SKUs) - Grain: account · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `seller_sku` | VARCHAR(200) | | | `fnsku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `condition_type` | VARCHAR(50) | key | | `country` | VARCHAR(2) | key | | `quantity_for_local_fulfillment` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_afn_inventory_data_by_country" ], "columns": [ "rpt_get_afn_inventory_data_by_country.snapshot_date", "rpt_get_afn_inventory_data_by_country.fnsku", "rpt_get_afn_inventory_data_by_country.condition_type", "rpt_get_afn_inventory_data_by_country.country" ], "order_by": [ { "column": "rpt_get_afn_inventory_data_by_country.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_estimated_fba_fees_txt_data (https://sellersheetai.com/docs/data/rpt_get_fba_estimated_fba_fees_txt_data) > Seller reports (SP-API) · GET_FBA_ESTIMATED_FBA_FEES_TXT_DATA · Daily at 01:08 marketplace local time - Family: seller - Report type: `GET_FBA_ESTIMATED_FBA_FEES_TXT_DATA` - How fresh: Daily — Daily at 01:08 marketplace local time - Need it right now: [`productFees_getMyFeesEstimateForSKU`](https://sellersheetai.com/docs/mcp-api/tools/productFees_getMyFeesEstimateForSKU) (one SKU at a price) - Grain: account · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | | | `asin` | VARCHAR(20) | key | | `amazon_store` | VARCHAR(50) | key | | `product_name` | TEXT | | | `product_group` | VARCHAR(100) | | | `brand` | VARCHAR(100) | | | `fulfilled_by` | VARCHAR(50) | | | `your_price` | NUMERIC(12, 2) | | | `sales_price` | NUMERIC(12, 2) | | | `longest_side` | NUMERIC(12, 4) | | | `median_side` | NUMERIC(12, 4) | | | `shortest_side` | NUMERIC(12, 4) | | | `length_and_girth` | NUMERIC(12, 4) | | | `unit_of_dimension` | VARCHAR(20) | | | `item_package_weight` | NUMERIC(12, 4) | | | `unit_of_weight` | VARCHAR(20) | | | `currency` | VARCHAR(10) | | | `estimated_fee_total` | NUMERIC(12, 2) | | | `estimated_referral_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_fixed_closing_fee` | NUMERIC(12, 2) | | | `estimated_pick_pack_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_weight_handling_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_variable_closing_fee` | NUMERIC(12, 2) | | | `estimated_order_handling_fee_per_order` | NUMERIC(12, 2) | | | `expected_domestic_fulfilment_fee_per_unit` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_uk` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_de` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_fr` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_it` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_es` | NUMERIC(12, 2) | | | `expected_efn_fulfilment_fee_per_unit_se` | NUMERIC(12, 2) | | | `has_local_inventory` | VARCHAR(20) | | | `product_size_weight_band` | VARCHAR(50) | | | `estimated_delivery_services_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_future_fee` | NUMERIC(12, 2) | | | `estimated_future_pick_pack_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_future_weight_handling_fee_per_unit` | NUMERIC(12, 2) | | | `estimated_future_order_handling_fee_per_order` | NUMERIC(12, 2) | | | `expected_fulfillment_fee_per_unit` | NUMERIC(12, 2) | | | `expected_future_fulfillment_fee_per_unit` | NUMERIC(12, 2) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_estimated_fba_fees_txt_data" ], "columns": [ "rpt_get_fba_estimated_fba_fees_txt_data.snapshot_date", "rpt_get_fba_estimated_fba_fees_txt_data.sku", "rpt_get_fba_estimated_fba_fees_txt_data.asin", "rpt_get_fba_estimated_fba_fees_txt_data.amazon_store" ], "order_by": [ { "column": "rpt_get_fba_estimated_fba_fees_txt_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_fulfillment_customer_returns_data (https://sellersheetai.com/docs/data/rpt_get_fba_fulfillment_customer_returns_data) > Seller reports (SP-API) · GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA · Daily at 01:02 marketplace local time - Family: seller - Report type: `GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA` - How fresh: Daily — Daily at 01:02 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `return_date` | TIMESTAMP WITH TIME ZONE | key | | `order_id` | VARCHAR(50) | key | | `sku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `fnsku` | VARCHAR(200) | | | `product_name` | TEXT | | | `fulfillment_center_id` | VARCHAR(50) | key | | `detailed_disposition` | VARCHAR(100) | | | `reason` | VARCHAR(200) | | | `license_plate_number` | VARCHAR(100) | | | `customer_comments` | TEXT | | | `quantity` | INTEGER | | | `status` | VARCHAR(100) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_fulfillment_customer_returns_data" ], "columns": [ "rpt_get_fba_fulfillment_customer_returns_data.return_date", "rpt_get_fba_fulfillment_customer_returns_data.order_id", "rpt_get_fba_fulfillment_customer_returns_data.sku", "rpt_get_fba_fulfillment_customer_returns_data.fulfillment_center_id" ], "order_by": [ { "column": "rpt_get_fba_fulfillment_customer_returns_data.return_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_fulfillment_longterm_storage_fee_charges_data (https://sellersheetai.com/docs/data/rpt_get_fba_fulfillment_longterm_storage_fee_charges_data) > Seller reports (SP-API) · GET_FBA_FULFILLMENT_LONGTERM_STORAGE_FEE_CHARGES_DATA · Daily at 01:07 marketplace local time - Family: seller - Report type: `GET_FBA_FULFILLMENT_LONGTERM_STORAGE_FEE_CHARGES_DATA` - How fresh: Daily — Daily at 01:07 marketplace local time - Need it right now: synced only - Grain: account · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | key | | `snapshot_date` | TIMESTAMP WITH TIME ZONE | | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | key | | `per_unit_volume` | NUMERIC(12, 4) | | | `currency` | VARCHAR(10) | | | `volume_unit` | VARCHAR(20) | | | `country` | VARCHAR(10) | key | | `qty_charged` | INTEGER | | | `amount_charged` | NUMERIC(12, 2) | | | `surcharge_age_tier` | VARCHAR(100) | | | `rate_surcharge` | NUMERIC(12, 4) | | | `qty_charged_long_time_range` | INTEGER | | | `long_time_range_fee` | NUMERIC(12, 2) | | | `qty_charged_short_time_range` | INTEGER | | | `short_time_range_fee` | NUMERIC(12, 2) | | | `enrolled_in_small_and_light` | VARCHAR(10) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data" ], "columns": [ "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data.report_date", "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data.sku", "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data.fnsku", "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data.condition" ], "order_by": [ { "column": "rpt_get_fba_fulfillment_longterm_storage_fee_charges_data.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_fulfillment_removal_order_detail_data (https://sellersheetai.com/docs/data/rpt_get_fba_fulfillment_removal_order_detail_data) > Seller reports (SP-API) · GET_FBA_FULFILLMENT_REMOVAL_ORDER_DETAIL_DATA · Daily at 01:03 marketplace local time - Family: seller - Report type: `GET_FBA_FULFILLMENT_REMOVAL_ORDER_DETAIL_DATA` - How fresh: Daily — Daily at 01:03 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `request_date` | TIMESTAMP WITH TIME ZONE | | | `order_id` | VARCHAR(50) | key | | `order_source` | TEXT | | | `order_type` | VARCHAR(50) | | | `service_speed` | VARCHAR(50) | | | `order_status` | VARCHAR(50) | | | `last_updated_date` | TIMESTAMP WITH TIME ZONE | | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | | | `disposition` | VARCHAR(50) | key | | `requested_quantity` | INTEGER | | | `cancelled_quantity` | INTEGER | | | `disposed_quantity` | INTEGER | | | `shipped_quantity` | INTEGER | | | `in_process_quantity` | INTEGER | | | `removal_fee` | NUMERIC(12, 2) | | | `currency` | VARCHAR(10) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_fulfillment_removal_order_detail_data" ], "columns": [ "rpt_get_fba_fulfillment_removal_order_detail_data.order_id", "rpt_get_fba_fulfillment_removal_order_detail_data.sku", "rpt_get_fba_fulfillment_removal_order_detail_data.disposition" ], "order_by": [ { "column": "rpt_get_fba_fulfillment_removal_order_detail_data.request_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_fulfillment_removal_shipment_detail_data (https://sellersheetai.com/docs/data/rpt_get_fba_fulfillment_removal_shipment_detail_data) > Seller reports (SP-API) · GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA · Daily at 01:11 marketplace local time - Family: seller - Report type: `GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA` - How fresh: Daily — Daily at 01:11 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `country_code` | VARCHAR(16) | | | `request_date` | TIMESTAMP WITH TIME ZONE | | | `order_id` | VARCHAR(64) | key | | `shipment_date` | TIMESTAMP WITH TIME ZONE | key | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | | | `disposition` | VARCHAR(50) | | | `shipped_quantity` | INTEGER | | | `carrier` | VARCHAR(100) | | | `tracking_number` | VARCHAR(128) | key | | `shipment_status` | VARCHAR(50) | | | `removal_order_type` | VARCHAR(50) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_fulfillment_removal_shipment_detail_data" ], "columns": [ "rpt_get_fba_fulfillment_removal_shipment_detail_data.order_id", "rpt_get_fba_fulfillment_removal_shipment_detail_data.shipment_date", "rpt_get_fba_fulfillment_removal_shipment_detail_data.sku", "rpt_get_fba_fulfillment_removal_shipment_detail_data.tracking_number" ], "order_by": [ { "column": "rpt_get_fba_fulfillment_removal_shipment_detail_data.shipment_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_inventory_planning_data (https://sellersheetai.com/docs/data/rpt_get_fba_inventory_planning_data) > Seller reports (SP-API) · GET_FBA_INVENTORY_PLANNING_DATA · Every 6 hours, at minute 5 (marketplace local time) - Family: seller - Report type: `GET_FBA_INVENTORY_PLANNING_DATA` - How fresh: Several times a day — Every 6 hours, at minute 5 (marketplace local time) - Need it right now: synced only - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `country` | VARCHAR(20) | | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | key | | `supplier` | VARCHAR(200) | | | `currency_code` | VARCHAR(10) | | | `price` | NUMERIC(12, 2) | | | `sales_last_30_days` | NUMERIC(12, 2) | | | `total_units` | INTEGER | | | `inbound` | INTEGER | | | `available` | INTEGER | | | `fc_transfer` | INTEGER | | | `fc_processing` | INTEGER | | | `customer_order` | INTEGER | | | `unfulfillable` | INTEGER | | | `working` | INTEGER | | | `shipped` | INTEGER | | | `receiving` | INTEGER | | | `fulfilled_by` | VARCHAR(50) | | | `total_days_of_supply_including_units_from_open_shipments` | NUMERIC(12, 2) | | | `days_of_supply_at_amazon_fulfillment_network` | NUMERIC(12, 2) | | | `alert` | VARCHAR(200) | | | `weeks_of_cover` | NUMERIC(8, 2) | | | `units_sold_last_30_days` | INTEGER | | | `recommended_replenishment_qty` | INTEGER | | | `unit_storage_size` | VARCHAR(50) | | | `pending_removal_quantity` | INTEGER | | | `your_price` | NUMERIC(12, 2) | | | `sales_price` | NUMERIC(12, 2) | | | `lowest_price_new_plus_shipping` | NUMERIC(12, 2) | | | `lowest_price_used` | NUMERIC(12, 2) | | | `featuredoffer_price` | NUMERIC(12, 2) | | | `recommended_action` | VARCHAR(100) | | | `healthy_inventory_level` | INTEGER | | | `recommended_sales_price` | NUMERIC(12, 2) | | | `recommended_sale_duration_days` | INTEGER | | | `recommended_removal_quantity` | INTEGER | | | `estimated_cost_savings_of_recommended_actions` | NUMERIC(12, 2) | | | `sell_through` | NUMERIC(10, 4) | | | `item_volume` | NUMERIC(12, 4) | | | `volume_unit_measurement` | VARCHAR(20) | | | `storage_type` | VARCHAR(50) | | | `storage_volume` | NUMERIC(12, 4) | | | `marketplace` | VARCHAR(50) | | | `product_group` | VARCHAR(100) | | | `sales_rank` | INTEGER | | | `days_of_supply` | NUMERIC(10, 2) | | | `estimated_excess_quantity` | INTEGER | | | `weeks_of_cover_t30` | NUMERIC(10, 2) | | | `weeks_of_cover_t90` | NUMERIC(10, 2) | | | `estimated_storage_cost_next_month` | NUMERIC(12, 2) | | | `is_seasonal_in_next_3_months` | VARCHAR(20) | | | `units_shipped_t7` | INTEGER | | | `units_shipped_t30` | INTEGER | | | `units_shipped_t60` | INTEGER | | | `units_shipped_t90` | INTEGER | | | `sales_shipped_last_7_days` | NUMERIC(12, 2) | | | `sales_shipped_last_30_days` | NUMERIC(12, 2) | | | `sales_shipped_last_60_days` | NUMERIC(12, 2) | | | `sales_shipped_last_90_days` | NUMERIC(12, 2) | | | `inbound_quantity` | INTEGER | | | `inbound_working` | INTEGER | | | `inbound_shipped` | INTEGER | | | `inbound_received` | INTEGER | | | `unfulfillable_quantity` | INTEGER | | | `total_reserved_quantity` | INTEGER | | | `reserved_fc_transfer` | INTEGER | | | `reserved_fc_processing` | INTEGER | | | `reserved_customer_order` | INTEGER | | | `inv_age_0_to_90_days` | INTEGER | | | `inv_age_91_to_180_days` | INTEGER | | | `inv_age_181_to_270_days` | INTEGER | | | `inv_age_271_to_365_days` | INTEGER | | | `inv_age_366_to_455_days` | INTEGER | | | `inv_age_456_plus_days` | INTEGER | | | `inv_age_0_to_30_days` | INTEGER | | | `inv_age_31_to_60_days` | INTEGER | | | `inv_age_61_to_90_days` | INTEGER | | | `inv_age_181_to_330_days` | INTEGER | | | `inv_age_331_to_365_days` | INTEGER | | | `inventory_age_snapshot_date` | DATE | | | `historical_days_of_supply` | NUMERIC(10, 2) | | | `last_updated_for_historical_days_of_supply` | DATE | | | `short_term_historical_days_of_supply` | NUMERIC(10, 2) | | | `long_term_historical_days_of_supply` | NUMERIC(10, 2) | | | `recommended_ship_in_quantity` | INTEGER | | | `recommended_ship_in_date` | DATE | | | `inventory_supply_at_fba` | INTEGER | | | `recommended_order_quantity` | INTEGER | | | `recommended_order_date` | DATE | | | `weeks_of_cover_estimated_excess_quantity` | INTEGER | | | `season_name` | VARCHAR(50) | | | `qty_to_be_charged_ltsf_6_mo` | INTEGER | | | `projected_ltsf_6_mo` | NUMERIC(12, 2) | | | `qty_to_be_charged_ltsf_12_mo` | INTEGER | | | `estimated_ltsf_next_charge` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_241_270_days` | INTEGER | | | `estimated_ais_241_270_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_271_300_days` | INTEGER | | | `estimated_ais_271_300_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_301_330_days` | INTEGER | | | `estimated_ais_301_330_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_331_365_days` | INTEGER | | | `estimated_ais_331_365_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_366_455_days` | INTEGER | | | `estimated_ais_366_455_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_456_plus_days` | INTEGER | | | `estimated_ais_456_plus_days` | NUMERIC(12, 2) | | | `restock_plus_seller_eligible` | VARCHAR(20) | | | `restock_plus_seller_opted` | VARCHAR(20) | | | `restock_plus_suggested_weeks_of_cover` | NUMERIC(8, 2) | | | `restock_plus_storage_incentives` | NUMERIC(12, 2) | | | `restock_plus_total_incentives` | NUMERIC(12, 2) | | | `inv_age_365_plus_days` | INTEGER | | | `inv_age_91_to_150_days` | INTEGER | | | `inv_age_151_to_180_days` | INTEGER | | | `qty_to_be_charged_ais_181_210_days` | INTEGER | | | `estimated_ais_181_210_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_211_240_days` | INTEGER | | | `estimated_ais_211_240_days` | NUMERIC(12, 2) | | | `qty_to_be_charged_ais_365_plus_days` | INTEGER | | | `estimated_ais_365_plus_days` | NUMERIC(12, 2) | | | `projected_ltsf_5_mo` | NUMERIC(12, 2) | | | `qty_to_be_charged_ltsf_5_mo` | INTEGER | | | `low_inventory_level_fee_exempted` | VARCHAR(20) | | | `low_inventory_level_fee_applied` | VARCHAR(20) | | | `reserved_staging` | INTEGER | | | `fba_inventory_level_health_status` | VARCHAR(50) | | | `fba_minimum_inventory_level` | INTEGER | | | `no_sale_last_6_months` | VARCHAR(20) | | | `fulfillment_service_and_programs` | VARCHAR(50) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_inventory_planning_data" ], "columns": [ "rpt_get_fba_inventory_planning_data.snapshot_date", "rpt_get_fba_inventory_planning_data.country_code", "rpt_get_fba_inventory_planning_data.sku", "rpt_get_fba_inventory_planning_data.fnsku" ], "order_by": [ { "column": "rpt_get_fba_inventory_planning_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_myi_all_inventory_data (https://sellersheetai.com/docs/data/rpt_get_fba_myi_all_inventory_data) > Seller reports (SP-API) · GET_FBA_MYI_ALL_INVENTORY_DATA · Every 6 hours, at minute 15 (marketplace local time) - Family: seller - Report type: `GET_FBA_MYI_ALL_INVENTORY_DATA` - How fresh: Several times a day — Every 6 hours, at minute 15 (marketplace local time) - Need it right now: [`fbaInventory_getInventorySummaries`](https://sellersheetai.com/docs/mcp-api/tools/fbaInventory_getInventorySummaries) (one or a few SKUs) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `sku` | VARCHAR(200) | key | | `fnsku` | VARCHAR(200) | | | `asin` | VARCHAR(20) | | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | key | | `your_price` | NUMERIC(12, 2) | | | `inbound_working` | INTEGER | | | `inbound_shipped` | INTEGER | | | `inbound_receiving` | INTEGER | | | `total_units` | INTEGER | | | `afn_fulfillable_quantity` | INTEGER | | | `afn_unsellable_quantity` | INTEGER | | | `afn_reserved_quantity` | INTEGER | | | `afn_researching_quantity` | INTEGER | | | `afn_warehouse_quantity` | INTEGER | | | `afn_reserved_future_supply` | INTEGER | | | `afn_future_supply_buyable` | INTEGER | | | `afn_fulfillable_quantity_local` | INTEGER | | | `afn_fulfillable_quantity_remote` | INTEGER | | | `mfn_listing_exists` | VARCHAR(10) | | | `afn_listing_exists` | VARCHAR(10) | | | `per_unit_volume` | NUMERIC(12, 4) | | | `mfn_fulfillable_quantity` | INTEGER | | | `afn_fc_transfer_quantity` | INTEGER | | | `afn_onhand_buyable_quantity` | INTEGER | | | `amazon_store` | VARCHAR(50) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_myi_all_inventory_data" ], "columns": [ "rpt_get_fba_myi_all_inventory_data.snapshot_date", "rpt_get_fba_myi_all_inventory_data.country_code", "rpt_get_fba_myi_all_inventory_data.sku", "rpt_get_fba_myi_all_inventory_data.condition" ], "order_by": [ { "column": "rpt_get_fba_myi_all_inventory_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_reimbursements_data (https://sellersheetai.com/docs/data/rpt_get_fba_reimbursements_data) > Seller reports (SP-API) · GET_FBA_REIMBURSEMENTS_DATA · Daily at 01:04 marketplace local time - Family: seller - Report type: `GET_FBA_REIMBURSEMENTS_DATA` - How fresh: Daily — Daily at 01:04 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `approval_date` | TIMESTAMP WITH TIME ZONE | | | `reimbursement_id` | VARCHAR(100) | key | | `case_id` | VARCHAR(100) | key | | `amazon_order_id` | VARCHAR(50) | | | `reason` | VARCHAR(200) | | | `sku` | VARCHAR(200) | | | `fnsku` | VARCHAR(200) | | | `asin` | VARCHAR(20) | | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | | | `currency_unit` | VARCHAR(10) | | | `amount_per_unit` | NUMERIC(12, 2) | | | `amount_total` | NUMERIC(12, 2) | | | `quantity_reimbursed_cash` | INTEGER | | | `quantity_reimbursed_inventory` | INTEGER | | | `quantity_reimbursed_total` | INTEGER | | | `original_reimbursement_id` | VARCHAR(100) | | | `original_reimbursement_type` | VARCHAR(100) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_reimbursements_data" ], "columns": [ "rpt_get_fba_reimbursements_data.reimbursement_id", "rpt_get_fba_reimbursements_data.case_id" ], "order_by": [ { "column": "rpt_get_fba_reimbursements_data.approval_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_fba_storage_fee_charges_data (https://sellersheetai.com/docs/data/rpt_get_fba_storage_fee_charges_data) > Seller reports (SP-API) · GET_FBA_STORAGE_FEE_CHARGES_DATA · Daily at 01:06 marketplace local time - Family: seller - Report type: `GET_FBA_STORAGE_FEE_CHARGES_DATA` - How fresh: Daily — Daily at 01:06 marketplace local time - Need it right now: synced only - Grain: account · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | key | | `month_of_charge` | VARCHAR(20) | key | | `charge_month` | DATE | | | `asin` | VARCHAR(20) | key | | `fnsku` | VARCHAR(200) | key | | `product_name` | TEXT | | | `fulfillment_center` | VARCHAR(50) | key | | `country_code` | VARCHAR(10) | | | `longest_side` | NUMERIC(12, 4) | | | `median_side` | NUMERIC(12, 4) | | | `shortest_side` | NUMERIC(12, 4) | | | `measurement_units` | VARCHAR(20) | | | `weight` | NUMERIC(12, 4) | | | `weight_units` | VARCHAR(20) | | | `item_volume` | NUMERIC(12, 4) | | | `volume_units` | VARCHAR(20) | | | `product_size_tier` | VARCHAR(50) | | | `average_quantity_on_hand` | NUMERIC(12, 4) | | | `average_quantity_pending_removal` | NUMERIC(12, 4) | | | `estimated_total_item_volume` | NUMERIC(12, 4) | | | `storage_rate` | NUMERIC(10, 4) | | | `currency` | VARCHAR(10) | | | `estimated_monthly_storage_fee` | NUMERIC(12, 2) | | | `dangerous_goods_storage_type` | VARCHAR(100) | | | `eligible_for_inventory_discount` | BOOLEAN | | | `qualifies_for_inventory_discount` | BOOLEAN | | | `total_incentive_fee_amount` | NUMERIC(12, 2) | | | `breakdown_incentive_fee_amount` | VARCHAR(100) | | | `incentive_program` | VARCHAR(100) | | | `incentive_amount` | NUMERIC(12, 4) | | | `average_quantity_customer_orders` | NUMERIC(12, 4) | | | `avg_qty_for_sus` | NUMERIC(12, 4) | | | `est_vol_for_sus` | NUMERIC(12, 4) | | | `est_base_msf` | NUMERIC(12, 2) | | | `est_sus` | NUMERIC(12, 2) | | | `category` | VARCHAR(100) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_fba_storage_fee_charges_data" ], "columns": [ "rpt_get_fba_storage_fee_charges_data.report_date", "rpt_get_fba_storage_fee_charges_data.month_of_charge", "rpt_get_fba_storage_fee_charges_data.asin", "rpt_get_fba_storage_fee_charges_data.fnsku" ], "order_by": [ { "column": "rpt_get_fba_storage_fee_charges_data.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_flat_file_returns_data_by_return_date (https://sellersheetai.com/docs/data/rpt_get_flat_file_returns_data_by_return_date) > Seller reports (SP-API) · GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATE · Daily at 01:01 marketplace local time - Family: seller - Report type: `GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATE` - How fresh: Daily — Daily at 01:01 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | key | | `order_id` | VARCHAR(50) | key | | `order_date` | DATE | | | `return_request_date` | DATE | | | `return_request_status` | VARCHAR(100) | | | `amazon_rma_id` | VARCHAR(100) | key | | `merchant_rma_id` | VARCHAR(100) | | | `label_type` | VARCHAR(50) | | | `label_cost` | NUMERIC(12, 2) | | | `currency_code` | VARCHAR(10) | | | `return_carrier` | VARCHAR(100) | | | `tracking_id` | VARCHAR(100) | | | `label_to_be_paid_by` | VARCHAR(50) | | | `a_to_z_claim` | VARCHAR(50) | | | `is_prime` | VARCHAR(50) | | | `asin` | VARCHAR(20) | | | `merchant_sku` | VARCHAR(200) | key | | `item_name` | TEXT | | | `return_quantity` | INTEGER | | | `return_reason` | VARCHAR(200) | | | `in_policy` | VARCHAR(50) | | | `return_type` | VARCHAR(100) | | | `resolution` | VARCHAR(100) | | | `invoice_number` | VARCHAR(100) | | | `return_delivery_date` | DATE | | | `order_amount` | NUMERIC(12, 2) | | | `order_quantity` | INTEGER | | | `safet_action_reason` | TEXT | | | `safet_claim_id` | VARCHAR(100) | | | `safet_claim_state` | VARCHAR(100) | | | `safet_claim_creation_time` | DATE | | | `safet_claim_creation_time_raw` | VARCHAR(100) | | | `safet_claim_reimbursement_amount` | NUMERIC(12, 2) | | | `refunded_amount` | NUMERIC(12, 2) | | | `category` | VARCHAR(100) | | | `order_item_id` | VARCHAR(100) | | | `vat_amount` | NUMERIC(12, 2) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_flat_file_returns_data_by_return_date" ], "columns": [ "rpt_get_flat_file_returns_data_by_return_date.report_date", "rpt_get_flat_file_returns_data_by_return_date.order_id", "rpt_get_flat_file_returns_data_by_return_date.amazon_rma_id", "rpt_get_flat_file_returns_data_by_return_date.merchant_sku" ], "order_by": [ { "column": "rpt_get_flat_file_returns_data_by_return_date.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_ledger_detail_view_data (https://sellersheetai.com/docs/data/rpt_get_ledger_detail_view_data) > Seller reports (SP-API) · GET_LEDGER_DETAIL_VIEW_DATA · Daily at 01:00 marketplace local time - Family: seller - Report type: `GET_LEDGER_DETAIL_VIEW_DATA` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `date` | DATE | key | | `date_and_time` | TIMESTAMP WITH TIME ZONE | | | `fnsku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `msku` | VARCHAR(200) | | | `title` | TEXT | | | `event_type` | VARCHAR(100) | key | | `reference_id` | VARCHAR(100) | key | | `fulfillment_center` | VARCHAR(50) | key | | `disposition` | VARCHAR(50) | | | `reason` | VARCHAR(200) | | | `country` | VARCHAR(10) | | | `quantity` | INTEGER | | | `reconciled_quantity` | INTEGER | | | `unreconciled_quantity` | INTEGER | | | `amazon_store` | VARCHAR(50) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_ledger_detail_view_data" ], "columns": [ "rpt_get_ledger_detail_view_data.date", "rpt_get_ledger_detail_view_data.fnsku", "rpt_get_ledger_detail_view_data.event_type", "rpt_get_ledger_detail_view_data.reference_id" ], "order_by": [ { "column": "rpt_get_ledger_detail_view_data.date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_merchant_listings_all_data (https://sellersheetai.com/docs/data/rpt_get_merchant_listings_all_data) > Seller reports (SP-API) · GET_MERCHANT_LISTINGS_ALL_DATA · Daily at 01:05 marketplace local time - Family: seller - Report type: `GET_MERCHANT_LISTINGS_ALL_DATA` - How fresh: Daily — Daily at 01:05 marketplace local time - Need it right now: [`listings_searchListingsItems`](https://sellersheetai.com/docs/mcp-api/tools/listings_searchListingsItems) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `seller_sku` | VARCHAR(200) | key | | `item_description` | TEXT | | | `listing_id` | VARCHAR(200) | | | `asin1` | VARCHAR(20) | | | `asin2` | VARCHAR(20) | | | `asin3` | VARCHAR(20) | | | `item_name` | TEXT | | | `item_condition` | VARCHAR(50) | key | | `open_date` | TIMESTAMP WITH TIME ZONE | | | `image_url` | TEXT | | | `item_is_marketplace` | VARCHAR(20) | | | `product_id_type` | VARCHAR(100) | | | `zshop_shipping_fee` | NUMERIC(12, 2) | | | `item_note` | TEXT | | | `zshop_category1` | VARCHAR(200) | | | `zshop_browse_path` | TEXT | | | `zshop_storefront_feature` | VARCHAR(50) | | | `will_ship_internationally` | VARCHAR(20) | | | `expedited_shipping` | VARCHAR(20) | | | `zshop_boldface` | VARCHAR(20) | | | `product_id` | VARCHAR(100) | | | `bid_for_featured_placement` | NUMERIC(12, 2) | | | `add_delete` | VARCHAR(20) | | | `fulfillment_channel` | VARCHAR(20) | | | `optional_payment_type_exclusion` | VARCHAR(100) | | | `status` | VARCHAR(50) | | | `merchant_shipping_group` | VARCHAR(100) | | | `price` | NUMERIC(12, 2) | | | `quantity` | INTEGER | | | `pending_quantity` | INTEGER | | | `points` | INTEGER | | | `maximum_retail_price` | NUMERIC(12, 2) | | | `sell_remainder` | VARCHAR(20) | | | `minimum_order_quantity` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_merchant_listings_all_data" ], "columns": [ "rpt_get_merchant_listings_all_data.snapshot_date", "rpt_get_merchant_listings_all_data.country_code", "rpt_get_merchant_listings_all_data.seller_sku", "rpt_get_merchant_listings_all_data.item_condition" ], "order_by": [ { "column": "rpt_get_merchant_listings_all_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_merchants_listings_fyp_report (https://sellersheetai.com/docs/data/rpt_get_merchants_listings_fyp_report) > Seller reports (SP-API) · GET_MERCHANTS_LISTINGS_FYP_REPORT · Daily at 01:09 marketplace local time - Family: seller - Report type: `GET_MERCHANTS_LISTINGS_FYP_REPORT` - How fresh: Daily — Daily at 01:09 marketplace local time - Need it right now: [`listings_searchListingsItems`](https://sellersheetai.com/docs/mcp-api/tools/listings_searchListingsItems) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `country_code` | VARCHAR(16) | key | | `issue_key` | VARCHAR(16) | key | | `status` | VARCHAR(100) | | | `reason` | VARCHAR(200) | | | `sku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | key | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | key | | `status_change_date` | DATE | | | `issue_description` | TEXT | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_merchants_listings_fyp_report" ], "columns": [ "rpt_get_merchants_listings_fyp_report.snapshot_date", "rpt_get_merchants_listings_fyp_report.country_code", "rpt_get_merchants_listings_fyp_report.issue_key", "rpt_get_merchants_listings_fyp_report.sku" ], "order_by": [ { "column": "rpt_get_merchants_listings_fyp_report.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_stranded_inventory_ui_data (https://sellersheetai.com/docs/data/rpt_get_stranded_inventory_ui_data) > Seller reports (SP-API) · GET_STRANDED_INVENTORY_UI_DATA · Every 6 hours, at minute 30 (marketplace local time) - Family: seller - Report type: `GET_STRANDED_INVENTORY_UI_DATA` - How fresh: Several times a day — Every 6 hours, at minute 30 (marketplace local time) - Need it right now: synced only - Grain: account · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `snapshot_date` | DATE | key | | `primary_action` | VARCHAR(100) | | | `date_stranded` | DATE | | | `date_to_take_auto_removal` | DATE | | | `status_primary` | VARCHAR(100) | | | `status_secondary` | VARCHAR(100) | | | `error_message` | TEXT | | | `sku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `image` | TEXT | | | `fnsku` | VARCHAR(200) | key | | `product_name` | TEXT | | | `condition` | VARCHAR(50) | key | | `fulfilled_by` | VARCHAR(50) | | | `fulfillable_qty` | INTEGER | | | `unfulfillable_qty` | INTEGER | | | `reserved_quantity` | INTEGER | | | `inbound_shipped_qty` | INTEGER | | | `fulfillment_center_id` | VARCHAR(50) | | | `stranded_reason` | VARCHAR(200) | key | | `quantity` | INTEGER | | | `days_in_stranded_inventory` | INTEGER | | | `estimated_removal_cost` | NUMERIC(12, 2) | | | `your_price` | NUMERIC(12, 2) | | | `program` | VARCHAR(50) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_stranded_inventory_ui_data" ], "columns": [ "rpt_get_stranded_inventory_ui_data.snapshot_date", "rpt_get_stranded_inventory_ui_data.sku", "rpt_get_stranded_inventory_ui_data.fnsku", "rpt_get_stranded_inventory_ui_data.condition" ], "order_by": [ { "column": "rpt_get_stranded_inventory_ui_data.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_v2_seller_performance_report (https://sellersheetai.com/docs/data/rpt_get_v2_seller_performance_report) > Seller reports (SP-API) · GET_V2_SELLER_PERFORMANCE_REPORT · Daily at 01:10 marketplace local time - Family: seller - Report type: `GET_V2_SELLER_PERFORMANCE_REPORT` - How fresh: Daily — Daily at 01:10 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `marketplace_id` | VARCHAR(20) | key | | `snapshot_date` | DATE | key | | `account_status` | VARCHAR(50) | | | `account_health_rating` | VARCHAR(50) | | | `ahr_status` | VARCHAR(50) | | | `order_defect_rate` | NUMERIC(8, 4) | | | `afn_order_defect_rate` | NUMERIC(8, 4) | | | `mfn_order_defect_rate` | NUMERIC(8, 4) | | | `pre_fulfillment_cancel_rate` | NUMERIC(8, 4) | | | `late_shipment_rate` | NUMERIC(8, 4) | | | `valid_tracking_rate` | NUMERIC(8, 4) | | | `invoice_defect_rate` | NUMERIC(8, 4) | | | `on_time_delivery_rate` | NUMERIC(8, 4) | | | `unit_on_time_delivery_rate` | NUMERIC(8, 4) | | | `chargeback_claim_rate` | NUMERIC(8, 4) | | | `ahr_score` | NUMERIC(8, 2) | | | `late_shipment_count` | INTEGER | | | `late_shipment_order_count` | INTEGER | | | `missing_invoice_count` | INTEGER | | | `late_invoice_count` | INTEGER | | | `invoice_defect_order_count` | INTEGER | | | `afn_order_count` | INTEGER | | | `afn_claims_count` | INTEGER | | | `afn_chargebacks_count` | INTEGER | | | `afn_negative_feedback_count` | INTEGER | | | `mfn_order_count` | INTEGER | | | `mfn_claims_count` | INTEGER | | | `mfn_chargebacks_count` | INTEGER | | | `mfn_negative_feedback_count` | INTEGER | | | `on_time_delivery_count` | INTEGER | | | `unit_on_time_delivery_count` | INTEGER | | | `total_unit_count` | INTEGER | | | `valid_tracking_count` | INTEGER | | | `pre_fulfillment_cancel_count` | INTEGER | | | `listing_policy_violations` | INTEGER | | | `product_authenticity_complaints` | INTEGER | | | `product_condition_complaints` | INTEGER | | | `product_safety_complaints` | INTEGER | | | `received_ip_complaints` | INTEGER | | | `restricted_product_violations` | INTEGER | | | `suspected_ip_violations` | INTEGER | | | `food_and_product_safety_issues` | INTEGER | | | `customer_product_reviews_violations` | INTEGER | | | `other_policy_violations` | INTEGER | | | `document_requests` | INTEGER | | | `policy_violation_warnings` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_v2_seller_performance_report" ], "columns": [ "rpt_get_v2_seller_performance_report.marketplace_id", "rpt_get_v2_seller_performance_report.snapshot_date" ], "order_by": [ { "column": "rpt_get_v2_seller_performance_report.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_get_v2_settlement_report_data_flat_file_v2 (https://sellersheetai.com/docs/data/rpt_get_v2_settlement_report_data_flat_file_v2) > Seller reports (SP-API) · GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2 · Every 12 hours, at minute 17 (marketplace local time) - Family: seller - Report type: `GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2` - How fresh: Several times a day — Every 12 hours, at minute 17 (marketplace local time) - Need it right now: [`finances_listFinancialEventGroups`](https://sellersheetai.com/docs/mcp-api/tools/finances_listFinancialEventGroups) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `settlement_id` | VARCHAR(100) | key | | `settlement_start_date` | TIMESTAMP WITH TIME ZONE | | | `settlement_end_date` | TIMESTAMP WITH TIME ZONE | | | `deposit_date` | TIMESTAMP WITH TIME ZONE | | | `total_amount` | NUMERIC(14, 2) | | | `currency` | VARCHAR(10) | | | `transaction_type` | VARCHAR(100) | | | `order_id` | VARCHAR(50) | key | | `merchant_order_id` | VARCHAR(50) | | | `adjustment_id` | VARCHAR(100) | | | `shipment_id` | VARCHAR(100) | | | `marketplace_name` | VARCHAR(100) | | | `amount_type` | VARCHAR(100) | key | | `amount_description` | VARCHAR(200) | key | | `amount` | NUMERIC(14, 2) | | | `fulfillment_id` | VARCHAR(100) | | | `posted_date` | DATE | key | | `posted_date_time` | VARCHAR(100) | | | `posted_at` | TIMESTAMP WITH TIME ZONE | | | `order_item_code` | VARCHAR(100) | | | `merchant_order_item_id` | VARCHAR(100) | | | `merchant_adjustment_item_id` | VARCHAR(100) | | | `sku` | VARCHAR(200) | | | `quantity_purchased` | INTEGER | | | `promotion_id` | VARCHAR(100) | | | `item_related_fee_type` | VARCHAR(100) | | | `item_related_fee_amount` | NUMERIC(14, 2) | | | `promotion_type` | VARCHAR(100) | | | `promotion_amount` | NUMERIC(14, 2) | | | `other_amount` | NUMERIC(14, 2) | | | `other_fee_amount` | NUMERIC(14, 2) | | | `other_fee_reason_description` | TEXT | | | `price_type` | VARCHAR(100) | | | `price_amount` | NUMERIC(14, 2) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_get_v2_settlement_report_data_flat_file_v2" ], "columns": [ "rpt_get_v2_settlement_report_data_flat_file_v2.settlement_id", "rpt_get_v2_settlement_report_data_flat_file_v2.order_id", "rpt_get_v2_settlement_report_data_flat_file_v2.amount_type", "rpt_get_v2_settlement_report_data_flat_file_v2.amount_description" ], "order_by": [ { "column": "rpt_get_v2_settlement_report_data_flat_file_v2.posted_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_orders (https://sellersheetai.com/docs/data/rpt_orders) > Seller reports (SP-API) · GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL|GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL · Every hour, on the hour - Family: seller - Report type: `GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL|GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL` - How fresh: Hourly — Every hour, on the hour - Need it right now: [`orders_searchOrders`](https://sellersheetai.com/docs/mcp-api/tools/orders_searchOrders) - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `report_date` | DATE | | | `amazon_order_id` | VARCHAR(50) | key | | `merchant_order_id` | VARCHAR(50) | | | `purchase_date` | TIMESTAMP WITH TIME ZONE | | | `last_updated_date` | TIMESTAMP WITH TIME ZONE | | | `order_status` | VARCHAR(50) | | | `fulfillment_channel` | VARCHAR(20) | | | `sales_channel` | VARCHAR(100) | | | `order_channel` | VARCHAR(100) | | | `ship_service_level` | VARCHAR(50) | | | `product_name` | TEXT | | | `sku` | VARCHAR(200) | key | | `asin` | VARCHAR(20) | | | `item_status` | VARCHAR(50) | | | `ship_city` | VARCHAR(100) | | | `ship_state` | VARCHAR(100) | | | `ship_postal_code` | VARCHAR(20) | | | `ship_country` | VARCHAR(10) | | | `quantity` | INTEGER | | | `currency` | VARCHAR(10) | | | `item_price` | NUMERIC(12, 2) | | | `item_tax` | NUMERIC(12, 2) | | | `shipping_price` | NUMERIC(12, 2) | | | `shipping_tax` | NUMERIC(12, 2) | | | `gift_wrap_price` | NUMERIC(12, 2) | | | `gift_wrap_tax` | NUMERIC(12, 2) | | | `item_promotion_discount` | NUMERIC(12, 2) | | | `ship_promotion_discount` | NUMERIC(12, 2) | | | `promotion_ids` | TEXT | | | `is_business_order` | VARCHAR(10) | | | `number_of_items` | INTEGER | | | `price_designation` | VARCHAR(50) | | | `buyer_company_name` | VARCHAR(200) | | | `purchase_order_number` | VARCHAR(100) | | | `buyer_tax_registration_country` | VARCHAR(10) | | | `buyer_tax_registration_type` | VARCHAR(50) | | | `tax_collection_model` | VARCHAR(50) | | | `tax_collection_responsible_party` | VARCHAR(50) | | | `is_exchange_order` | VARCHAR(10) | | | `is_replacement_order` | VARCHAR(10) | | | `is_transparency` | VARCHAR(10) | | | `payment_method_details` | TEXT | | | `item_amazon_funded_promotion` | VARCHAR(10) | | | `amazon_programs` | TEXT | | | `fulfilled_by` | VARCHAR(50) | | | `is_iba` | VARCHAR(10) | | | `is_buyer_requested_cancellation` | VARCHAR(10) | | | `buyer_requested_cancel_reason` | VARCHAR(255) | | | `signature_confirmation_recommended` | VARCHAR(10) | | | `order_item_id` | VARCHAR(50) | key | | `is_prime` | VARCHAR(10) | | | `is_amazon_invoiced` | VARCHAR(10) | | | `vat_exclusive_item_price` | NUMERIC(12, 2) | | | `vat_exclusive_shipping_price` | NUMERIC(12, 2) | | | `vat_exclusive_giftwrap_price` | NUMERIC(12, 2) | | | `item_total` | NUMERIC(12, 2) | | | `amount_paid_by_buyer` | NUMERIC(12, 2) | | | `original_order_id` | VARCHAR(50) | | | `ioss_number` | VARCHAR(50) | | | `address_type` | VARCHAR(50) | | | `is_heavy_or_bulky` | VARCHAR(10) | | | `license_expiration_date` | DATE | | | `license_state` | VARCHAR(50) | | | `order_kind` | VARCHAR(10) | | | `marketplace` | VARCHAR(10) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_orders" ], "columns": [ "rpt_orders.amazon_order_id", "rpt_orders.sku", "rpt_orders.order_item_id" ], "order_by": [ { "column": "rpt_orders.purchase_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_ad_groups (https://sellersheetai.com/docs/data/rpt_ads_ad_groups) > Amazon Ads reports · ads-roster/ad-groups · Daily at 01:41 marketplace local time - Family: ads - Report type: `ads-roster/ad-groups` - How fresh: Daily — Daily at 01:41 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `store_id` | VARCHAR(36) | key | | `ad_group_id` | VARCHAR(64) | key | | `campaign_id` | TEXT | | | `name` | TEXT | | | `state` | TEXT | | | `default_bid` | NUMERIC(18, 4) | | | `id` | BIGINT | | | `country_code` | VARCHAR(8) | key | | `ad_product` | VARCHAR(32) | key | | `profile_id` | VARCHAR(32) | | | `first_seen_on` | DATE | | | `last_seen_on` | DATE | | | `attributes` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_ad_groups" ], "columns": [ "rpt_ads_ad_groups.ad_group_id", "rpt_ads_ad_groups.country_code", "rpt_ads_ad_groups.ad_product" ], "order_by": [ { "column": "rpt_ads_ad_groups.last_seen_on", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_ads (https://sellersheetai.com/docs/data/rpt_ads_ads) > Amazon Ads reports · ads-roster/ads · Daily at 01:43 marketplace local time - Family: ads - Report type: `ads-roster/ads` - How fresh: Daily — Daily at 01:43 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `store_id` | VARCHAR(36) | key | | `ad_id` | VARCHAR(64) | key | | `campaign_id` | TEXT | | | `ad_group_id` | TEXT | | | `name` | TEXT | | | `state` | TEXT | | | `asin` | TEXT | | | `sku` | TEXT | | | `id` | BIGINT | | | `country_code` | VARCHAR(8) | key | | `ad_product` | VARCHAR(32) | key | | `profile_id` | VARCHAR(32) | | | `first_seen_on` | DATE | | | `last_seen_on` | DATE | | | `attributes` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_ads" ], "columns": [ "rpt_ads_ads.ad_id", "rpt_ads_ads.country_code", "rpt_ads_ads.ad_product" ], "order_by": [ { "column": "rpt_ads_ads.last_seen_on", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_campaign_daily (https://sellersheetai.com/docs/data/rpt_ads_campaign_daily) > Amazon Ads reports · ads-performance-v1/campaign-daily · Delivered by Amazon Marketing Stream, hourly - Family: ads - Report type: `ads-performance-v1/campaign-daily` - How fresh: Hourly — Delivered by Amazon Marketing Stream, hourly - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `report_date` | DATE | key | | `ad_product` | VARCHAR(64) | key | | `campaign_id` | VARCHAR(64) | key | | `time_zone` | TEXT | | | `currency` | TEXT | | | `advertiser_account_id` | TEXT | | | `profile_id` | TEXT | | | `attribution_window_days` | SMALLINT | | | `extra` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `impressions` | NUMERIC(18, 8) | | | `invalid_impressions` | NUMERIC(18, 8) | | | `main_imdb_ad_impressions` | NUMERIC(18, 8) | | | `clicks` | NUMERIC(18, 8) | | | `gross_clicks` | NUMERIC(18, 8) | | | `invalid_clicks` | NUMERIC(18, 8) | | | `main_imdb_ad_clicks` | NUMERIC(18, 8) | | | `measurable_impressions` | NUMERIC(18, 8) | | | `viewable_impressions` | NUMERIC(18, 8) | | | `supply_cost` | NUMERIC(18, 8) | | | `total_cost` | NUMERIC(18, 8) | | | `interactive_impressions` | NUMERIC(18, 8) | | | `notification_opens` | NUMERIC(18, 8) | | | `notification_clicks` | NUMERIC(18, 8) | | | `starts_video_ad` | NUMERIC(18, 8) | | | `first_quartile_video_ad` | NUMERIC(18, 8) | | | `midpoint_video_ad` | NUMERIC(18, 8) | | | `third_quartile_video_ad` | NUMERIC(18, 8) | | | `complete_views_video_ad` | NUMERIC(18, 8) | | | `pauses_video_ad` | NUMERIC(18, 8) | | | `resumes_video_ad` | NUMERIC(18, 8) | | | `mutes_video_ad` | NUMERIC(18, 8) | | | `starts_audio_ad` | NUMERIC(18, 8) | | | `unmutes_video_ad` | NUMERIC(18, 8) | | | `first_quartile_audio_ad` | NUMERIC(18, 8) | | | `replays_video_ad` | NUMERIC(18, 8) | | | `midpoint_audio_ad` | NUMERIC(18, 8) | | | `skips_back_video_ad` | NUMERIC(18, 8) | | | `skips_forward_video_ad` | NUMERIC(18, 8) | | | `third_quartile_audio_ad` | NUMERIC(18, 8) | | | `complete_listens_audio_ad` | NUMERIC(18, 8) | | | `impressions_video_ad` | NUMERIC(18, 8) | | | `five_second_views_video_ad` | NUMERIC(18, 8) | | | `pauses_audio_ad` | NUMERIC(18, 8) | | | `resumes_audio_ad` | NUMERIC(18, 8) | | | `mutes_audio_ad` | NUMERIC(18, 8) | | | `unmutes_audio_ad` | NUMERIC(18, 8) | | | `rewinds_audio_ad` | NUMERIC(18, 8) | | | `skips_audio_ad` | NUMERIC(18, 8) | | | `impressions_audio_ad` | NUMERIC(18, 8) | | | `plays_audio_ad` | NUMERIC(18, 8) | | | `progress_audio_ad` | NUMERIC(18, 8) | | | `purchases` | NUMERIC(18, 8) | | | `sales` | NUMERIC(18, 8) | | | `units_sold` | NUMERIC(18, 8) | | | `purchases_from_clicks` | NUMERIC(18, 8) | | | `sales_from_clicks` | NUMERIC(18, 8) | | | `units_sold_from_clicks` | NUMERIC(18, 8) | | | `purchases_from_views` | NUMERIC(18, 8) | | | `sales_from_views` | NUMERIC(18, 8) | | | `units_sold_from_views` | NUMERIC(18, 8) | | | `purchases_promoted` | NUMERIC(18, 8) | | | `sales_promoted` | NUMERIC(18, 8) | | | `units_sold_promoted` | NUMERIC(18, 8) | | | `purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `purchases_from_views_promoted` | NUMERIC(18, 8) | | | `sales_from_views_promoted` | NUMERIC(18, 8) | | | `units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `purchases_halo` | NUMERIC(18, 8) | | | `sales_halo` | NUMERIC(18, 8) | | | `units_sold_halo` | NUMERIC(18, 8) | | | `purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `sales_from_clicks_halo` | NUMERIC(18, 8) | | | `units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `purchases_from_views_halo` | NUMERIC(18, 8) | | | `sales_from_views_halo` | NUMERIC(18, 8) | | | `units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases` | NUMERIC(18, 8) | | | `new_to_brand_sales` | NUMERIC(18, 8) | | | `new_to_brand_units_sold` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views` | NUMERIC(18, 8) | | | `new_to_brand_purchases_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_halo` | NUMERIC(18, 8) | | | `detail_page_views` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `detail_page_views_from_views` | NUMERIC(18, 8) | | | `detail_page_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `add_to_cart` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `add_to_cart_from_views` | NUMERIC(18, 8) | | | `add_to_cart_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `add_to_cart_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_views_halo` | NUMERIC(18, 8) | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_campaign_daily" ], "columns": [ "rpt_ads_campaign_daily.country_code", "rpt_ads_campaign_daily.report_date", "rpt_ads_campaign_daily.ad_product", "rpt_ads_campaign_daily.campaign_id" ], "order_by": [ { "column": "rpt_ads_campaign_daily.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_campaign_hourly (https://sellersheetai.com/docs/data/rpt_ads_campaign_hourly) > Amazon Ads reports · ads-performance-v1/campaign-hourly · Delivered by Amazon Marketing Stream, hourly - Family: ads - Report type: `ads-performance-v1/campaign-hourly` - How fresh: Hourly — Delivered by Amazon Marketing Stream, hourly - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `report_date` | DATE | key | | `hour` | SMALLINT | key | | `ad_product` | VARCHAR(64) | key | | `campaign_id` | VARCHAR(64) | key | | `time_zone` | TEXT | | | `currency` | TEXT | | | `advertiser_account_id` | TEXT | | | `profile_id` | TEXT | | | `window_start_utc` | TIMESTAMP WITH TIME ZONE | | | `weekday` | SMALLINT | | | `utc_offset_minutes` | SMALLINT | | | `attribution_window_days` | SMALLINT | | | `extra` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `impressions` | NUMERIC(18, 8) | | | `invalid_impressions` | NUMERIC(18, 8) | | | `main_imdb_ad_impressions` | NUMERIC(18, 8) | | | `clicks` | NUMERIC(18, 8) | | | `gross_clicks` | NUMERIC(18, 8) | | | `invalid_clicks` | NUMERIC(18, 8) | | | `main_imdb_ad_clicks` | NUMERIC(18, 8) | | | `measurable_impressions` | NUMERIC(18, 8) | | | `viewable_impressions` | NUMERIC(18, 8) | | | `supply_cost` | NUMERIC(18, 8) | | | `total_cost` | NUMERIC(18, 8) | | | `interactive_impressions` | NUMERIC(18, 8) | | | `notification_opens` | NUMERIC(18, 8) | | | `notification_clicks` | NUMERIC(18, 8) | | | `starts_video_ad` | NUMERIC(18, 8) | | | `first_quartile_video_ad` | NUMERIC(18, 8) | | | `midpoint_video_ad` | NUMERIC(18, 8) | | | `third_quartile_video_ad` | NUMERIC(18, 8) | | | `complete_views_video_ad` | NUMERIC(18, 8) | | | `pauses_video_ad` | NUMERIC(18, 8) | | | `resumes_video_ad` | NUMERIC(18, 8) | | | `mutes_video_ad` | NUMERIC(18, 8) | | | `starts_audio_ad` | NUMERIC(18, 8) | | | `unmutes_video_ad` | NUMERIC(18, 8) | | | `first_quartile_audio_ad` | NUMERIC(18, 8) | | | `replays_video_ad` | NUMERIC(18, 8) | | | `midpoint_audio_ad` | NUMERIC(18, 8) | | | `skips_back_video_ad` | NUMERIC(18, 8) | | | `skips_forward_video_ad` | NUMERIC(18, 8) | | | `third_quartile_audio_ad` | NUMERIC(18, 8) | | | `complete_listens_audio_ad` | NUMERIC(18, 8) | | | `impressions_video_ad` | NUMERIC(18, 8) | | | `five_second_views_video_ad` | NUMERIC(18, 8) | | | `pauses_audio_ad` | NUMERIC(18, 8) | | | `resumes_audio_ad` | NUMERIC(18, 8) | | | `mutes_audio_ad` | NUMERIC(18, 8) | | | `unmutes_audio_ad` | NUMERIC(18, 8) | | | `rewinds_audio_ad` | NUMERIC(18, 8) | | | `skips_audio_ad` | NUMERIC(18, 8) | | | `impressions_audio_ad` | NUMERIC(18, 8) | | | `plays_audio_ad` | NUMERIC(18, 8) | | | `progress_audio_ad` | NUMERIC(18, 8) | | | `purchases` | NUMERIC(18, 8) | | | `sales` | NUMERIC(18, 8) | | | `units_sold` | NUMERIC(18, 8) | | | `purchases_from_clicks` | NUMERIC(18, 8) | | | `sales_from_clicks` | NUMERIC(18, 8) | | | `units_sold_from_clicks` | NUMERIC(18, 8) | | | `purchases_from_views` | NUMERIC(18, 8) | | | `sales_from_views` | NUMERIC(18, 8) | | | `units_sold_from_views` | NUMERIC(18, 8) | | | `purchases_promoted` | NUMERIC(18, 8) | | | `sales_promoted` | NUMERIC(18, 8) | | | `units_sold_promoted` | NUMERIC(18, 8) | | | `purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `purchases_from_views_promoted` | NUMERIC(18, 8) | | | `sales_from_views_promoted` | NUMERIC(18, 8) | | | `units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `purchases_halo` | NUMERIC(18, 8) | | | `sales_halo` | NUMERIC(18, 8) | | | `units_sold_halo` | NUMERIC(18, 8) | | | `purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `sales_from_clicks_halo` | NUMERIC(18, 8) | | | `units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `purchases_from_views_halo` | NUMERIC(18, 8) | | | `sales_from_views_halo` | NUMERIC(18, 8) | | | `units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases` | NUMERIC(18, 8) | | | `new_to_brand_sales` | NUMERIC(18, 8) | | | `new_to_brand_units_sold` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views` | NUMERIC(18, 8) | | | `new_to_brand_purchases_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_halo` | NUMERIC(18, 8) | | | `detail_page_views` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `detail_page_views_from_views` | NUMERIC(18, 8) | | | `detail_page_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `add_to_cart` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `add_to_cart_from_views` | NUMERIC(18, 8) | | | `add_to_cart_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `add_to_cart_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_views_halo` | NUMERIC(18, 8) | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_campaign_hourly" ], "columns": [ "rpt_ads_campaign_hourly.country_code", "rpt_ads_campaign_hourly.report_date", "rpt_ads_campaign_hourly.hour", "rpt_ads_campaign_hourly.ad_product" ], "order_by": [ { "column": "rpt_ads_campaign_hourly.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_campaigns (https://sellersheetai.com/docs/data/rpt_ads_campaigns) > Amazon Ads reports · ads-roster/campaigns · Daily at 01:40 marketplace local time - Family: ads - Report type: `ads-roster/campaigns` - How fresh: Daily — Daily at 01:40 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `store_id` | VARCHAR(36) | key | | `campaign_id` | VARCHAR(64) | key | | `name` | TEXT | | | `state` | TEXT | | | `budget` | NUMERIC(18, 4) | | | `budget_type` | TEXT | | | `portfolio_id` | TEXT | | | `targeting_type` | TEXT | | | `start_date` | TEXT | | | `end_date` | TEXT | | | `id` | BIGINT | | | `country_code` | VARCHAR(8) | key | | `ad_product` | VARCHAR(32) | key | | `profile_id` | VARCHAR(32) | | | `first_seen_on` | DATE | | | `last_seen_on` | DATE | | | `attributes` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_campaigns" ], "columns": [ "rpt_ads_campaigns.campaign_id", "rpt_ads_campaigns.country_code", "rpt_ads_campaigns.ad_product" ], "order_by": [ { "column": "rpt_ads_campaigns.last_seen_on", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_converted_product_daily (https://sellersheetai.com/docs/data/rpt_ads_converted_product_daily) > Amazon Ads reports · ads-converted-product-v1 · Delivered by Amazon Marketing Stream, hourly - Family: ads - Report type: `ads-converted-product-v1` - How fresh: Hourly — Delivered by Amazon Marketing Stream, hourly - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `report_date` | DATE | key | | `record_key` | CHAR(32) | key | | `dims_key` | CHAR(32) | | | `stream_version` | BIGINT | | | `is_tombstone` | BOOLEAN | | | `time_zone` | TEXT | | | `currency` | TEXT | | | `advertiser_account_id` | TEXT | | | `profile_id` | TEXT | | | `ad_product` | TEXT | | | `campaign_id` | TEXT | | | `ad_group_id` | TEXT | | | `ad_id` | TEXT | | | `advertised_asin` | TEXT | | | `advertised_sku` | TEXT | | | `advertised_marketplace` | TEXT | | | `converted_asin` | TEXT | | | `converted_marketplace` | TEXT | | | `product_relevance` | TEXT | | | `attribution_window_days` | SMALLINT | | | `dims_extra` | JSONB | | | `extra` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `purchases` | NUMERIC(18, 8) | | | `sales` | NUMERIC(18, 8) | | | `units_sold` | NUMERIC(18, 8) | | | `purchases_from_clicks` | NUMERIC(18, 8) | | | `sales_from_clicks` | NUMERIC(18, 8) | | | `units_sold_from_clicks` | NUMERIC(18, 8) | | | `purchases_from_views` | NUMERIC(18, 8) | | | `sales_from_views` | NUMERIC(18, 8) | | | `units_sold_from_views` | NUMERIC(18, 8) | | | `purchases_promoted` | NUMERIC(18, 8) | | | `sales_promoted` | NUMERIC(18, 8) | | | `units_sold_promoted` | NUMERIC(18, 8) | | | `purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `purchases_from_views_promoted` | NUMERIC(18, 8) | | | `sales_from_views_promoted` | NUMERIC(18, 8) | | | `units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `purchases_halo` | NUMERIC(18, 8) | | | `sales_halo` | NUMERIC(18, 8) | | | `units_sold_halo` | NUMERIC(18, 8) | | | `purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases` | NUMERIC(18, 8) | | | `new_to_brand_sales` | NUMERIC(18, 8) | | | `new_to_brand_units_sold` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views` | NUMERIC(18, 8) | | | `new_to_brand_purchases_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `detail_page_views_from_views` | NUMERIC(18, 8) | | | `detail_page_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `add_to_cart` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `add_to_cart_from_views` | NUMERIC(18, 8) | | | `add_to_cart_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `add_to_cart_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_views_halo` | NUMERIC(18, 8) | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_converted_product_daily" ], "columns": [ "rpt_ads_converted_product_daily.country_code", "rpt_ads_converted_product_daily.report_date", "rpt_ads_converted_product_daily.record_key" ], "order_by": [ { "column": "rpt_ads_converted_product_daily.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_performance_daily (https://sellersheetai.com/docs/data/rpt_ads_performance_daily) > Amazon Ads reports · ads-performance-v1/daily · Delivered by Amazon Marketing Stream, hourly - Family: ads - Report type: `ads-performance-v1/daily` - How fresh: Hourly — Delivered by Amazon Marketing Stream, hourly - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `report_date` | DATE | key | | `dims_key` | CHAR(32) | key | | `time_zone` | TEXT | | | `currency` | TEXT | | | `advertiser_account_id` | TEXT | | | `profile_id` | TEXT | | | `ad_product` | TEXT | | | `campaign_id` | TEXT | | | `ad_group_id` | TEXT | | | `ad_id` | TEXT | | | `target_id` | TEXT | | | `search_term` | TEXT | | | `search_term_key` | CHAR(32) | | | `placement` | TEXT | | | `advertised_asin` | TEXT | | | `advertised_sku` | TEXT | | | `advertised_marketplace` | TEXT | | | `conversion_source` | TEXT | | | `conversion_source_owner` | TEXT | | | `conversion_source_scaled` | TEXT | | | `conversion_attribution_type` | TEXT | | | `site_app` | TEXT | | | `attribution_window_days` | SMALLINT | | | `dims_extra` | JSONB | | | `extra` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `impressions` | NUMERIC(18, 8) | | | `invalid_impressions` | NUMERIC(18, 8) | | | `main_imdb_ad_impressions` | NUMERIC(18, 8) | | | `clicks` | NUMERIC(18, 8) | | | `gross_clicks` | NUMERIC(18, 8) | | | `invalid_clicks` | NUMERIC(18, 8) | | | `main_imdb_ad_clicks` | NUMERIC(18, 8) | | | `measurable_impressions` | NUMERIC(18, 8) | | | `viewable_impressions` | NUMERIC(18, 8) | | | `supply_cost` | NUMERIC(18, 8) | | | `total_cost` | NUMERIC(18, 8) | | | `interactive_impressions` | NUMERIC(18, 8) | | | `notification_opens` | NUMERIC(18, 8) | | | `notification_clicks` | NUMERIC(18, 8) | | | `starts_video_ad` | NUMERIC(18, 8) | | | `first_quartile_video_ad` | NUMERIC(18, 8) | | | `midpoint_video_ad` | NUMERIC(18, 8) | | | `third_quartile_video_ad` | NUMERIC(18, 8) | | | `complete_views_video_ad` | NUMERIC(18, 8) | | | `pauses_video_ad` | NUMERIC(18, 8) | | | `resumes_video_ad` | NUMERIC(18, 8) | | | `mutes_video_ad` | NUMERIC(18, 8) | | | `starts_audio_ad` | NUMERIC(18, 8) | | | `unmutes_video_ad` | NUMERIC(18, 8) | | | `first_quartile_audio_ad` | NUMERIC(18, 8) | | | `replays_video_ad` | NUMERIC(18, 8) | | | `midpoint_audio_ad` | NUMERIC(18, 8) | | | `skips_back_video_ad` | NUMERIC(18, 8) | | | `skips_forward_video_ad` | NUMERIC(18, 8) | | | `third_quartile_audio_ad` | NUMERIC(18, 8) | | | `complete_listens_audio_ad` | NUMERIC(18, 8) | | | `impressions_video_ad` | NUMERIC(18, 8) | | | `five_second_views_video_ad` | NUMERIC(18, 8) | | | `pauses_audio_ad` | NUMERIC(18, 8) | | | `resumes_audio_ad` | NUMERIC(18, 8) | | | `mutes_audio_ad` | NUMERIC(18, 8) | | | `unmutes_audio_ad` | NUMERIC(18, 8) | | | `rewinds_audio_ad` | NUMERIC(18, 8) | | | `skips_audio_ad` | NUMERIC(18, 8) | | | `impressions_audio_ad` | NUMERIC(18, 8) | | | `plays_audio_ad` | NUMERIC(18, 8) | | | `progress_audio_ad` | NUMERIC(18, 8) | | | `purchases` | NUMERIC(18, 8) | | | `sales` | NUMERIC(18, 8) | | | `units_sold` | NUMERIC(18, 8) | | | `purchases_from_clicks` | NUMERIC(18, 8) | | | `sales_from_clicks` | NUMERIC(18, 8) | | | `units_sold_from_clicks` | NUMERIC(18, 8) | | | `purchases_from_views` | NUMERIC(18, 8) | | | `sales_from_views` | NUMERIC(18, 8) | | | `units_sold_from_views` | NUMERIC(18, 8) | | | `purchases_promoted` | NUMERIC(18, 8) | | | `sales_promoted` | NUMERIC(18, 8) | | | `units_sold_promoted` | NUMERIC(18, 8) | | | `purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `purchases_from_views_promoted` | NUMERIC(18, 8) | | | `sales_from_views_promoted` | NUMERIC(18, 8) | | | `units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `purchases_halo` | NUMERIC(18, 8) | | | `sales_halo` | NUMERIC(18, 8) | | | `units_sold_halo` | NUMERIC(18, 8) | | | `purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `sales_from_clicks_halo` | NUMERIC(18, 8) | | | `units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `purchases_from_views_halo` | NUMERIC(18, 8) | | | `sales_from_views_halo` | NUMERIC(18, 8) | | | `units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases` | NUMERIC(18, 8) | | | `new_to_brand_sales` | NUMERIC(18, 8) | | | `new_to_brand_units_sold` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views` | NUMERIC(18, 8) | | | `new_to_brand_purchases_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_halo` | NUMERIC(18, 8) | | | `detail_page_views` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `detail_page_views_from_views` | NUMERIC(18, 8) | | | `detail_page_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `add_to_cart` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `add_to_cart_from_views` | NUMERIC(18, 8) | | | `add_to_cart_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `add_to_cart_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_views_halo` | NUMERIC(18, 8) | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_performance_daily" ], "columns": [ "rpt_ads_performance_daily.country_code", "rpt_ads_performance_daily.report_date", "rpt_ads_performance_daily.dims_key" ], "order_by": [ { "column": "rpt_ads_performance_daily.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_performance_hourly (https://sellersheetai.com/docs/data/rpt_ads_performance_hourly) > Amazon Ads reports · ads-performance-v1 · Delivered by Amazon Marketing Stream, hourly - Family: ads - Report type: `ads-performance-v1` - How fresh: Hourly — Delivered by Amazon Marketing Stream, hourly - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `report_date` | DATE | key | | `hour` | SMALLINT | key | | `record_key` | CHAR(32) | key | | `dims_key` | CHAR(32) | | | `stream_version` | BIGINT | | | `is_tombstone` | BOOLEAN | | | `time_zone` | TEXT | | | `currency` | TEXT | | | `advertiser_account_id` | TEXT | | | `profile_id` | TEXT | | | `ad_product` | TEXT | | | `campaign_id` | TEXT | | | `ad_group_id` | TEXT | | | `ad_id` | TEXT | | | `target_id` | TEXT | | | `search_term` | TEXT | | | `search_term_key` | CHAR(32) | | | `placement` | TEXT | | | `advertised_asin` | TEXT | | | `advertised_sku` | TEXT | | | `advertised_marketplace` | TEXT | | | `conversion_source` | TEXT | | | `conversion_source_owner` | TEXT | | | `conversion_source_scaled` | TEXT | | | `conversion_attribution_type` | TEXT | | | `site_app` | TEXT | | | `window_start_utc` | TIMESTAMP WITH TIME ZONE | | | `weekday` | SMALLINT | | | `utc_offset_minutes` | SMALLINT | | | `attribution_window_days` | SMALLINT | | | `dims_extra` | JSONB | | | `extra` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `impressions` | NUMERIC(18, 8) | | | `invalid_impressions` | NUMERIC(18, 8) | | | `main_imdb_ad_impressions` | NUMERIC(18, 8) | | | `clicks` | NUMERIC(18, 8) | | | `gross_clicks` | NUMERIC(18, 8) | | | `invalid_clicks` | NUMERIC(18, 8) | | | `main_imdb_ad_clicks` | NUMERIC(18, 8) | | | `measurable_impressions` | NUMERIC(18, 8) | | | `viewable_impressions` | NUMERIC(18, 8) | | | `supply_cost` | NUMERIC(18, 8) | | | `total_cost` | NUMERIC(18, 8) | | | `interactive_impressions` | NUMERIC(18, 8) | | | `notification_opens` | NUMERIC(18, 8) | | | `notification_clicks` | NUMERIC(18, 8) | | | `starts_video_ad` | NUMERIC(18, 8) | | | `first_quartile_video_ad` | NUMERIC(18, 8) | | | `midpoint_video_ad` | NUMERIC(18, 8) | | | `third_quartile_video_ad` | NUMERIC(18, 8) | | | `complete_views_video_ad` | NUMERIC(18, 8) | | | `pauses_video_ad` | NUMERIC(18, 8) | | | `resumes_video_ad` | NUMERIC(18, 8) | | | `mutes_video_ad` | NUMERIC(18, 8) | | | `starts_audio_ad` | NUMERIC(18, 8) | | | `unmutes_video_ad` | NUMERIC(18, 8) | | | `first_quartile_audio_ad` | NUMERIC(18, 8) | | | `replays_video_ad` | NUMERIC(18, 8) | | | `midpoint_audio_ad` | NUMERIC(18, 8) | | | `skips_back_video_ad` | NUMERIC(18, 8) | | | `skips_forward_video_ad` | NUMERIC(18, 8) | | | `third_quartile_audio_ad` | NUMERIC(18, 8) | | | `complete_listens_audio_ad` | NUMERIC(18, 8) | | | `impressions_video_ad` | NUMERIC(18, 8) | | | `five_second_views_video_ad` | NUMERIC(18, 8) | | | `pauses_audio_ad` | NUMERIC(18, 8) | | | `resumes_audio_ad` | NUMERIC(18, 8) | | | `mutes_audio_ad` | NUMERIC(18, 8) | | | `unmutes_audio_ad` | NUMERIC(18, 8) | | | `rewinds_audio_ad` | NUMERIC(18, 8) | | | `skips_audio_ad` | NUMERIC(18, 8) | | | `impressions_audio_ad` | NUMERIC(18, 8) | | | `plays_audio_ad` | NUMERIC(18, 8) | | | `progress_audio_ad` | NUMERIC(18, 8) | | | `purchases` | NUMERIC(18, 8) | | | `sales` | NUMERIC(18, 8) | | | `units_sold` | NUMERIC(18, 8) | | | `purchases_from_clicks` | NUMERIC(18, 8) | | | `sales_from_clicks` | NUMERIC(18, 8) | | | `units_sold_from_clicks` | NUMERIC(18, 8) | | | `purchases_from_views` | NUMERIC(18, 8) | | | `sales_from_views` | NUMERIC(18, 8) | | | `units_sold_from_views` | NUMERIC(18, 8) | | | `purchases_promoted` | NUMERIC(18, 8) | | | `sales_promoted` | NUMERIC(18, 8) | | | `units_sold_promoted` | NUMERIC(18, 8) | | | `purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `purchases_from_views_promoted` | NUMERIC(18, 8) | | | `sales_from_views_promoted` | NUMERIC(18, 8) | | | `units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `purchases_halo` | NUMERIC(18, 8) | | | `sales_halo` | NUMERIC(18, 8) | | | `units_sold_halo` | NUMERIC(18, 8) | | | `purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `sales_from_clicks_halo` | NUMERIC(18, 8) | | | `units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `purchases_from_views_halo` | NUMERIC(18, 8) | | | `sales_from_views_halo` | NUMERIC(18, 8) | | | `units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases` | NUMERIC(18, 8) | | | `new_to_brand_sales` | NUMERIC(18, 8) | | | `new_to_brand_units_sold` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views` | NUMERIC(18, 8) | | | `new_to_brand_purchases_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_purchases_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_purchases_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_sales_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_units_sold_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `new_to_brand_add_to_cart_from_views_halo` | NUMERIC(18, 8) | | | `detail_page_views` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks` | NUMERIC(18, 8) | | | `detail_page_views_from_views` | NUMERIC(18, 8) | | | `detail_page_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_promoted` | NUMERIC(18, 8) | | | `detail_page_views_from_views_promoted` | NUMERIC(18, 8) | | | `detail_page_views_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_clicks_halo` | NUMERIC(18, 8) | | | `detail_page_views_from_views_halo` | NUMERIC(18, 8) | | | `add_to_cart` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks` | NUMERIC(18, 8) | | | `add_to_cart_from_views` | NUMERIC(18, 8) | | | `add_to_cart_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_promoted` | NUMERIC(18, 8) | | | `add_to_cart_from_views_promoted` | NUMERIC(18, 8) | | | `add_to_cart_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_clicks_halo` | NUMERIC(18, 8) | | | `add_to_cart_from_views_halo` | NUMERIC(18, 8) | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_performance_hourly" ], "columns": [ "rpt_ads_performance_hourly.country_code", "rpt_ads_performance_hourly.report_date", "rpt_ads_performance_hourly.hour", "rpt_ads_performance_hourly.record_key" ], "order_by": [ { "column": "rpt_ads_performance_hourly.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_ads_targets (https://sellersheetai.com/docs/data/rpt_ads_targets) > Amazon Ads reports · ads-roster/targets · Daily at 01:42 marketplace local time - Family: ads - Report type: `ads-roster/targets` - How fresh: Daily — Daily at 01:42 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `store_id` | VARCHAR(36) | key | | `target_id` | VARCHAR(64) | key | | `campaign_id` | TEXT | | | `ad_group_id` | TEXT | | | `target_kind` | TEXT | | | `keyword_text` | TEXT | | | `match_type` | TEXT | | | `expression` | JSONB | | | `expression_type` | TEXT | | | `bid` | NUMERIC(18, 4) | | | `state` | TEXT | | | `id` | BIGINT | | | `country_code` | VARCHAR(8) | key | | `ad_product` | VARCHAR(32) | key | | `profile_id` | VARCHAR(32) | | | `first_seen_on` | DATE | | | `last_seen_on` | DATE | | | `attributes` | JSONB | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_ads_targets" ], "columns": [ "rpt_ads_targets.target_id", "rpt_ads_targets.country_code", "rpt_ads_targets.ad_product" ], "order_by": [ { "column": "rpt_ads_targets.last_seen_on", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_atc_by_search_term (https://sellersheetai.com/docs/data/rpt_amc_atc_by_search_term) > Amazon Ads reports · AMC_ATC_BY_SEARCH_TERM · Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Family: ads - Report type: `AMC_ATC_BY_SEARCH_TERM` - How fresh: Several times a day — Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `customer_search_term` | TEXT | | | `clickers` | BIGINT | | | `added_to_cart` | BIGINT | | | `ordered` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_atc_by_search_term" ], "columns": [ "rpt_amc_atc_by_search_term.country_code", "rpt_amc_atc_by_search_term.period_start", "rpt_amc_atc_by_search_term.dims_key", "rpt_amc_atc_by_search_term.hidden" ], "order_by": [ { "column": "rpt_amc_atc_by_search_term.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_campaign_overlap (https://sellersheetai.com/docs/data/rpt_amc_campaign_overlap) > Amazon Ads reports · AMC_CAMPAIGN_OVERLAP · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_CAMPAIGN_OVERLAP` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `campaign_a` | TEXT | | | `campaign_b` | TEXT | | | `shared_shoppers` | BIGINT | | | `reach_a` | BIGINT | | | `reach_b` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_campaign_overlap" ], "columns": [ "rpt_amc_campaign_overlap.country_code", "rpt_amc_campaign_overlap.period_start", "rpt_amc_campaign_overlap.dims_key", "rpt_amc_campaign_overlap.hidden" ], "order_by": [ { "column": "rpt_amc_campaign_overlap.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_cross_sell_next_purchase (https://sellersheetai.com/docs/data/rpt_amc_cross_sell_next_purchase) > Amazon Ads reports · AMC_CROSS_SELL_NEXT_PURCHASE · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_CROSS_SELL_NEXT_PURCHASE` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `first_asin` | TEXT | | | `next_asin` | TEXT | | | `shoppers` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_cross_sell_next_purchase" ], "columns": [ "rpt_amc_cross_sell_next_purchase.country_code", "rpt_amc_cross_sell_next_purchase.period_start", "rpt_amc_cross_sell_next_purchase.dims_key", "rpt_amc_cross_sell_next_purchase.hidden" ], "order_by": [ { "column": "rpt_amc_cross_sell_next_purchase.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_first_vs_attributed_term (https://sellersheetai.com/docs/data/rpt_amc_first_vs_attributed_term) > Amazon Ads reports · AMC_FIRST_VS_ATTRIBUTED_TERM · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_FIRST_VS_ATTRIBUTED_TERM` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `first_term` | TEXT | | | `last_term` | TEXT | | | `buyers` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_first_vs_attributed_term" ], "columns": [ "rpt_amc_first_vs_attributed_term.country_code", "rpt_amc_first_vs_attributed_term.period_start", "rpt_amc_first_vs_attributed_term.dims_key", "rpt_amc_first_vs_attributed_term.hidden" ], "order_by": [ { "column": "rpt_amc_first_vs_attributed_term.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_hour_of_day (https://sellersheetai.com/docs/data/rpt_amc_hour_of_day) > Amazon Ads reports · AMC_HOUR_OF_DAY · Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Family: ads - Report type: `AMC_HOUR_OF_DAY` - How fresh: Several times a day — Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `click_hour` | INTEGER | | | `clicks` | BIGINT | | | `spend_microcents` | BIGINT | | | `purchases` | BIGINT | | | `sales` | NUMERIC(20, 4) | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_hour_of_day" ], "columns": [ "rpt_amc_hour_of_day.country_code", "rpt_amc_hour_of_day.period_start", "rpt_amc_hour_of_day.dims_key", "rpt_amc_hour_of_day.hidden" ], "order_by": [ { "column": "rpt_amc_hour_of_day.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_impressions_per_shopper (https://sellersheetai.com/docs/data/rpt_amc_impressions_per_shopper) > Amazon Ads reports · AMC_IMPRESSIONS_PER_SHOPPER · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_IMPRESSIONS_PER_SHOPPER` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `impressions_per_shopper` | TEXT | | | `shoppers` | BIGINT | | | `buyers` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_impressions_per_shopper" ], "columns": [ "rpt_amc_impressions_per_shopper.country_code", "rpt_amc_impressions_per_shopper.period_start", "rpt_amc_impressions_per_shopper.dims_key", "rpt_amc_impressions_per_shopper.hidden" ], "order_by": [ { "column": "rpt_amc_impressions_per_shopper.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_keyword_halo (https://sellersheetai.com/docs/data/rpt_amc_keyword_halo) > Amazon Ads reports · AMC_KEYWORD_HALO · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_KEYWORD_HALO` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `targeting` | TEXT | | | `match_type` | TEXT | | | `purchases` | BIGINT | | | `halo_purchases` | BIGINT | | | `total_purchases` | BIGINT | | | `sales` | NUMERIC(20, 4) | | | `halo_sales` | NUMERIC(20, 4) | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_keyword_halo" ], "columns": [ "rpt_amc_keyword_halo.country_code", "rpt_amc_keyword_halo.period_start", "rpt_amc_keyword_halo.dims_key", "rpt_amc_keyword_halo.hidden" ], "order_by": [ { "column": "rpt_amc_keyword_halo.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_ntb_by_campaign (https://sellersheetai.com/docs/data/rpt_amc_ntb_by_campaign) > Amazon Ads reports · AMC_NTB_BY_CAMPAIGN · Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Family: ads - Report type: `AMC_NTB_BY_CAMPAIGN` - How fresh: Several times a day — Weekly (Amazon schedule, Monday 00:00 in the marketplace zone) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `campaign` | TEXT | | | `purchases` | BIGINT | | | `ntb_purchases` | BIGINT | | | `sales` | NUMERIC(20, 4) | | | `ntb_sales` | NUMERIC(20, 4) | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_ntb_by_campaign" ], "columns": [ "rpt_amc_ntb_by_campaign.country_code", "rpt_amc_ntb_by_campaign.period_start", "rpt_amc_ntb_by_campaign.dims_key", "rpt_amc_ntb_by_campaign.hidden" ], "order_by": [ { "column": "rpt_amc_ntb_by_campaign.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_ntb_gateway_asins (https://sellersheetai.com/docs/data/rpt_amc_ntb_gateway_asins) > Amazon Ads reports · AMC_NTB_GATEWAY_ASINS · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_NTB_GATEWAY_ASINS` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `tracked_asin` | TEXT | | | `purchases` | BIGINT | | | `ntb_purchases` | BIGINT | | | `sales` | NUMERIC(20, 4) | | | `ntb_sales` | NUMERIC(20, 4) | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_ntb_gateway_asins" ], "columns": [ "rpt_amc_ntb_gateway_asins.country_code", "rpt_amc_ntb_gateway_asins.period_start", "rpt_amc_ntb_gateway_asins.dims_key", "rpt_amc_ntb_gateway_asins.hidden" ], "order_by": [ { "column": "rpt_amc_ntb_gateway_asins.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_path_to_conversion (https://sellersheetai.com/docs/data/rpt_amc_path_to_conversion) > Amazon Ads reports · AMC_PATH_TO_CONVERSION · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_PATH_TO_CONVERSION` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `campaigns_clicked` | TEXT | | | `buyers` | BIGINT | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_path_to_conversion" ], "columns": [ "rpt_amc_path_to_conversion.country_code", "rpt_amc_path_to_conversion.period_start", "rpt_amc_path_to_conversion.dims_key", "rpt_amc_path_to_conversion.hidden" ], "order_by": [ { "column": "rpt_amc_path_to_conversion.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_amc_time_to_conversion (https://sellersheetai.com/docs/data/rpt_amc_time_to_conversion) > Amazon Ads reports · AMC_TIME_TO_CONVERSION · Every 4 weeks (on demand, 15 days after the 28-day period ends) - Family: ads - Report type: `AMC_TIME_TO_CONVERSION` - How fresh: Weekly — Every 4 weeks (on demand, 15 days after the 28-day period ends) - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | BIGINT | | | `store_id` | VARCHAR(36) | key | | `country_code` | VARCHAR(8) | key | | `period_start` | DATE | key | | `period_days` | INTEGER | | | `dims_key` | VARCHAR(40) | key | | `hidden` | BOOLEAN | key | | `lag_bucket` | TEXT | | | `purchases` | BIGINT | | | `sales` | NUMERIC(20, 4) | | | `template_version` | INTEGER | | | `workflow_execution_id` | VARCHAR(64) | | | `extra` | JSON | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_amc_time_to_conversion" ], "columns": [ "rpt_amc_time_to_conversion.country_code", "rpt_amc_time_to_conversion.period_start", "rpt_amc_time_to_conversion.dims_key", "rpt_amc_time_to_conversion.hidden" ], "order_by": [ { "column": "rpt_amc_time_to_conversion.period_start", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_ad_groups (https://sellersheetai.com/docs/data/rpt_sb_ad_groups) > Amazon Ads reports · sbAdGroups · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbAdGroups` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_status` | VARCHAR(50) | | | `campaign_status` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_purchases_rate` | NUMERIC(10, 4) | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage` | NUMERIC(10, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_units_sold_percentage` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_views_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_ad_groups" ], "columns": [ "rpt_sb_ad_groups.profile_id", "rpt_sb_ad_groups.report_date", "rpt_sb_ad_groups.campaign_id", "rpt_sb_ad_groups.ad_group_id" ], "order_by": [ { "column": "rpt_sb_ad_groups.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_advertised_products (https://sellersheetai.com/docs/data/rpt_sb_advertised_products) > Amazon Ads reports · sbAdvertisedProduct · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbAdvertisedProduct` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_id` | VARCHAR(100) | key | | `advertised_asin` | VARCHAR(20) | | | `campaign_status` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_purchases_rate` | NUMERIC(10, 4) | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage` | NUMERIC(10, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_units_sold_percentage` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_views_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_advertised_products" ], "columns": [ "rpt_sb_advertised_products.profile_id", "rpt_sb_advertised_products.report_date", "rpt_sb_advertised_products.campaign_id", "rpt_sb_advertised_products.ad_group_id" ], "order_by": [ { "column": "rpt_sb_advertised_products.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_campaigns (https://sellersheetai.com/docs/data/rpt_sb_campaigns) > Amazon Ads reports · sbCampaigns · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbCampaigns` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_campaigns_budget_usage`](https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) (today's budget use) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_status` | VARCHAR(50) | | | `campaign_budget` | NUMERIC(12, 2) | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_rule_based_budget_amount` | NUMERIC(14, 4) | | | `cost_type` | VARCHAR(50) | | | `bid_optimization` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `top_of_search_impression_share` | NUMERIC(10, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted` | NUMERIC(14, 4) | | | `attributed_sales_same_sku` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_purchases_rate` | NUMERIC(10, 4) | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage` | NUMERIC(10, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_units_sold_percentage` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_views_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_campaigns" ], "columns": [ "rpt_sb_campaigns.profile_id", "rpt_sb_campaigns.report_date", "rpt_sb_campaigns.campaign_id" ], "order_by": [ { "column": "rpt_sb_campaigns.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_keywords (https://sellersheetai.com/docs/data/rpt_sb_keywords) > Amazon Ads reports · sbKeywords · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbKeywords` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (current bids and state) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `match_type` | VARCHAR(100) | key | | `campaign_status` | VARCHAR(50) | | | `keyword_status` | VARCHAR(50) | | | `keyword_bid` | NUMERIC(10, 4) | | | `keyword_type` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `top_of_search_impression_share` | NUMERIC(10, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_purchases_rate` | NUMERIC(10, 4) | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage` | NUMERIC(10, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_units_sold_percentage` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_views_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_keywords" ], "columns": [ "rpt_sb_keywords.profile_id", "rpt_sb_keywords.report_date", "rpt_sb_keywords.campaign_id", "rpt_sb_keywords.ad_group_id" ], "order_by": [ { "column": "rpt_sb_keywords.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_negative_keywords (https://sellersheetai.com/docs/data/rpt_sb_negative_keywords) > Amazon Ads reports · sbNegativeKeywords · Daily at 01:17 marketplace local time - Family: ads - Report type: `sbNegativeKeywords` - How fresh: Daily — Daily at 01:17 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `keyword_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(50) | | | `keyword_text` | TEXT | | | `match_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_negative_keywords" ], "columns": [ "rpt_sb_negative_keywords.profile_id", "rpt_sb_negative_keywords.snapshot_date", "rpt_sb_negative_keywords.keyword_id" ], "order_by": [ { "column": "rpt_sb_negative_keywords.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_purchased_products (https://sellersheetai.com/docs/data/rpt_sb_purchased_products) > Amazon Ads reports · sbPurchasedProduct · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbPurchasedProduct` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | | | `target_id` | VARCHAR(100) | | | `purchased_asin` | VARCHAR(20) | key | | `orders_14d` | INTEGER | | | `sales_14d` | NUMERIC(14, 4) | | | `units_sold_14d` | INTEGER | | | `new_to_brand_orders_14d` | INTEGER | | | `new_to_brand_orders_percentage_14d` | NUMERIC(10, 4) | | | `new_to_brand_purchases_14d` | INTEGER | | | `new_to_brand_purchases_percentage_14d` | NUMERIC(10, 4) | | | `new_to_brand_sales_14d` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage_14d` | NUMERIC(10, 4) | | | `new_to_brand_units_sold_14d` | INTEGER | | | `new_to_brand_units_sold_percentage_14d` | NUMERIC(10, 4) | | | `attribution_type` | VARCHAR(50) | | | `budget_currency` | VARCHAR(10) | | | `product_category` | VARCHAR(100) | | | `product_name` | TEXT | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_purchased_products" ], "columns": [ "rpt_sb_purchased_products.profile_id", "rpt_sb_purchased_products.report_date", "rpt_sb_purchased_products.campaign_id", "rpt_sb_purchased_products.ad_group_id" ], "order_by": [ { "column": "rpt_sb_purchased_products.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_search_terms (https://sellersheetai.com/docs/data/rpt_sb_search_terms) > Amazon Ads reports · sbSearchTerm · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbSearchTerm` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `keyword_bid` | NUMERIC(10, 4) | | | `match_type` | VARCHAR(100) | | | `target_id` | VARCHAR(100) | key | | `targeting_text` | TEXT | | | `search_term` | TEXT | key | | `campaign_status` | VARCHAR(50) | | | `keyword_status` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `ad_keyword_status` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `purchases_clicks` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_search_terms" ], "columns": [ "rpt_sb_search_terms.profile_id", "rpt_sb_search_terms.report_date", "rpt_sb_search_terms.campaign_id", "rpt_sb_search_terms.ad_group_id" ], "order_by": [ { "column": "rpt_sb_search_terms.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sb_targets (https://sellersheetai.com/docs/data/rpt_sb_targets) > Amazon Ads reports · sbTargets · Daily at 01:00 marketplace local time - Family: ads - Report type: `sbTargets` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (current bids and state) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `target_id` | VARCHAR(100) | key | | `targeting_expression` | TEXT | | | `targeting_text` | TEXT | | | `targeting_type` | VARCHAR(100) | | | `match_type` | VARCHAR(100) | | | `target_status` | VARCHAR(50) | | | `bid` | NUMERIC(10, 4) | | | `campaign_status` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `top_of_search_impression_share` | NUMERIC(10, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_purchases_rate` | NUMERIC(10, 4) | | | `new_to_brand_purchases_percentage` | NUMERIC(10, 4) | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_sales_percentage` | NUMERIC(10, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_units_sold_percentage` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_views_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_5_second_views` | INTEGER | | | `video_5_second_view_rate` | NUMERIC(10, 4) | | | `video_unmutes` | INTEGER | | | `viewable_impressions` | INTEGER | | | `viewability_rate` | NUMERIC(10, 4) | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sb_targets" ], "columns": [ "rpt_sb_targets.profile_id", "rpt_sb_targets.report_date", "rpt_sb_targets.campaign_id", "rpt_sb_targets.ad_group_id" ], "order_by": [ { "column": "rpt_sb_targets.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sd_ad_groups (https://sellersheetai.com/docs/data/rpt_sd_ad_groups) > Amazon Ads reports · sdAdGroups · Daily at 01:00 marketplace local time - Family: ads - Report type: `sdAdGroups` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_group_status` | VARCHAR(50) | | | `default_bid` | NUMERIC(10, 4) | | | `bid_optimization` | VARCHAR(50) | | | `impressions` | INTEGER | | | `impressions_frequency_average` | NUMERIC(10, 4) | | | `impressions_views` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `cumulative_reach` | INTEGER | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `add_to_cart_views` | INTEGER | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `branded_searches_views` | INTEGER | | | `branded_search_rate` | NUMERIC(10, 4) | | | `e_cp_brand_search` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted_clicks` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted_clicks` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `view_impressions` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_view_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_view_views` | INTEGER | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_unmutes` | INTEGER | | | `view_attributed_conversions` | INTEGER | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `viewability_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sd_ad_groups" ], "columns": [ "rpt_sd_ad_groups.profile_id", "rpt_sd_ad_groups.report_date", "rpt_sd_ad_groups.campaign_id", "rpt_sd_ad_groups.ad_group_id" ], "order_by": [ { "column": "rpt_sd_ad_groups.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sd_advertised_products (https://sellersheetai.com/docs/data/rpt_sd_advertised_products) > Amazon Ads reports · sdAdvertisedProduct · Daily at 01:00 marketplace local time - Family: ads - Report type: `sdAdvertisedProduct` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_id` | VARCHAR(100) | key | | `asin` | VARCHAR(20) | | | `sku` | VARCHAR(200) | | | `bid_optimization` | VARCHAR(50) | | | `impressions` | INTEGER | | | `impressions_frequency_average` | NUMERIC(10, 4) | | | `impressions_views` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `cumulative_reach` | INTEGER | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `add_to_cart_views` | INTEGER | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `branded_searches_views` | INTEGER | | | `branded_search_rate` | NUMERIC(10, 4) | | | `e_cp_brand_search` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted_clicks` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted_clicks` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_view_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_view_views` | INTEGER | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_unmutes` | INTEGER | | | `view_attributed_conversions` | INTEGER | | | `view_impressions` | INTEGER | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `viewability_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sd_advertised_products" ], "columns": [ "rpt_sd_advertised_products.profile_id", "rpt_sd_advertised_products.report_date", "rpt_sd_advertised_products.campaign_id", "rpt_sd_advertised_products.ad_group_id" ], "order_by": [ { "column": "rpt_sd_advertised_products.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sd_campaigns (https://sellersheetai.com/docs/data/rpt_sd_campaigns) > Amazon Ads reports · sdCampaigns · Daily at 01:00 marketplace local time - Family: ads - Report type: `sdCampaigns` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_campaigns_budget_usage`](https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) (today's budget use) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_status` | VARCHAR(50) | | | `campaign_budget` | NUMERIC(12, 2) | | | `campaign_budget_type` | VARCHAR(50) | | | `delivery_profile` | VARCHAR(50) | | | `cost_type` | VARCHAR(50) | | | `impressions` | INTEGER | | | `impressions_frequency_average` | NUMERIC(10, 4) | | | `impressions_views` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `cumulative_reach` | INTEGER | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `add_to_cart_views` | INTEGER | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `branded_searches_views` | INTEGER | | | `branded_search_rate` | NUMERIC(10, 4) | | | `e_cp_brand_search` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted_clicks` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted_clicks` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_view_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_view_views` | INTEGER | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_unmutes` | INTEGER | | | `view_attributed_conversions` | INTEGER | | | `view_impressions` | INTEGER | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `viewability_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sd_campaigns" ], "columns": [ "rpt_sd_campaigns.profile_id", "rpt_sd_campaigns.report_date", "rpt_sd_campaigns.campaign_id" ], "order_by": [ { "column": "rpt_sd_campaigns.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sd_negative_targets (https://sellersheetai.com/docs/data/rpt_sd_negative_targets) > Amazon Ads reports · sdNegativeTargets · Daily at 01:18 marketplace local time - Family: ads - Report type: `sdNegativeTargets` - How fresh: Daily — Daily at 01:18 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `target_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(50) | | | `targeting_expression` | TEXT | | | `expression_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sd_negative_targets" ], "columns": [ "rpt_sd_negative_targets.profile_id", "rpt_sd_negative_targets.snapshot_date", "rpt_sd_negative_targets.target_id" ], "order_by": [ { "column": "rpt_sd_negative_targets.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sd_targets (https://sellersheetai.com/docs/data/rpt_sd_targets) > Amazon Ads reports · sdTargets · Daily at 01:00 marketplace local time - Family: ads - Report type: `sdTargets` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (current bids and state) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `target_id` | VARCHAR(100) | key | | `targeting_expression` | TEXT | | | `targeting_text` | TEXT | | | `resolved_targeting_expression` | TEXT | | | `target_status` | VARCHAR(50) | | | `bid` | NUMERIC(10, 4) | | | `impressions` | INTEGER | | | `impressions_views` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `detail_page_views` | INTEGER | | | `detail_page_views_clicks` | INTEGER | | | `add_to_cart` | INTEGER | | | `add_to_cart_clicks` | INTEGER | | | `add_to_cart_rate` | NUMERIC(10, 4) | | | `add_to_cart_views` | INTEGER | | | `e_cp_add_to_cart` | NUMERIC(14, 4) | | | `branded_searches` | INTEGER | | | `branded_searches_clicks` | INTEGER | | | `branded_searches_views` | INTEGER | | | `branded_search_rate` | NUMERIC(10, 4) | | | `e_cp_brand_search` | NUMERIC(14, 4) | | | `purchases` | INTEGER | | | `purchases_same_sku` | INTEGER | | | `purchases_clicks` | INTEGER | | | `purchases_promoted_clicks` | INTEGER | | | `sales` | NUMERIC(14, 4) | | | `sales_clicks` | NUMERIC(14, 4) | | | `sales_promoted_clicks` | NUMERIC(14, 4) | | | `units_sold` | INTEGER | | | `units_sold_clicks` | INTEGER | | | `new_to_brand_purchases` | INTEGER | | | `new_to_brand_purchases_clicks` | INTEGER | | | `new_to_brand_sales` | NUMERIC(14, 4) | | | `new_to_brand_sales_clicks` | NUMERIC(14, 4) | | | `new_to_brand_units_sold` | INTEGER | | | `new_to_brand_units_sold_clicks` | INTEGER | | | `new_to_brand_detail_page_views` | INTEGER | | | `new_to_brand_detail_page_view_clicks` | INTEGER | | | `new_to_brand_detail_page_view_rate` | NUMERIC(10, 4) | | | `new_to_brand_detail_page_view_views` | INTEGER | | | `new_to_brand_e_cp_detail_page_view` | NUMERIC(14, 4) | | | `video_complete_views` | INTEGER | | | `video_midpoint_views` | INTEGER | | | `video_first_quartile_views` | INTEGER | | | `video_third_quartile_views` | INTEGER | | | `video_unmutes` | INTEGER | | | `view_attributed_conversions` | INTEGER | | | `view_impressions` | INTEGER | | | `view_click_through_rate` | NUMERIC(10, 4) | | | `viewability_rate` | NUMERIC(10, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sd_targets" ], "columns": [ "rpt_sd_targets.profile_id", "rpt_sd_targets.report_date", "rpt_sd_targets.campaign_id", "rpt_sd_targets.ad_group_id" ], "order_by": [ { "column": "rpt_sd_targets.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_ad_groups (https://sellersheetai.com/docs/data/rpt_sp_ad_groups) > Amazon Ads reports · spAdGroups · Daily at 01:00 marketplace local time - Family: ads - Report type: `spAdGroups` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_bidding_strategy` | VARCHAR(100) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_status` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `spend` | NUMERIC(14, 4) | | | `purchases_14d` | INTEGER | | | `sales_14d` | NUMERIC(14, 4) | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_status` | VARCHAR(50) | | | `campaign_rule_based_budget_amount` | NUMERIC(14, 4) | | | `campaign_applicable_budget_rule_id` | VARCHAR(100) | | | `campaign_applicable_budget_rule_name` | TEXT | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `units_sold_clicks_14d` | INTEGER | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_ad_groups" ], "columns": [ "rpt_sp_ad_groups.profile_id", "rpt_sp_ad_groups.report_date", "rpt_sp_ad_groups.campaign_id", "rpt_sp_ad_groups.ad_group_id" ], "order_by": [ { "column": "rpt_sp_ad_groups.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_advertised_products (https://sellersheetai.com/docs/data/rpt_sp_advertised_products) > Amazon Ads reports · spAdvertisedProduct · Daily at 01:00 marketplace local time - Family: ads - Report type: `spAdvertisedProduct` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_status` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `ad_id` | VARCHAR(100) | key | | `advertised_asin` | VARCHAR(20) | | | `advertised_sku` | VARCHAR(200) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `spend` | NUMERIC(14, 4) | | | `purchases_14d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `sales_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `units_sold_clicks_14d` | INTEGER | | | `top_of_search_impression_share` | NUMERIC(8, 4) | | | `search_impression_share` | NUMERIC(8, 4) | | | `acos_clicks_14d` | NUMERIC(10, 4) | | | `acos_clicks_7d` | NUMERIC(10, 4) | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `roas_clicks_14d` | NUMERIC(14, 4) | | | `roas_clicks_7d` | NUMERIC(14, 4) | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `sales_other_sku_7d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_other_sku_7d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_advertised_products" ], "columns": [ "rpt_sp_advertised_products.profile_id", "rpt_sp_advertised_products.report_date", "rpt_sp_advertised_products.campaign_id", "rpt_sp_advertised_products.ad_group_id" ], "order_by": [ { "column": "rpt_sp_advertised_products.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_campaign_negative_keywords (https://sellersheetai.com/docs/data/rpt_sp_campaign_negative_keywords) > Amazon Ads reports · spCampaignNegativeKeywords · Daily at 01:14 marketplace local time - Family: ads - Report type: `spCampaignNegativeKeywords` - How fresh: Daily — Daily at 01:14 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `keyword_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `keyword_text` | TEXT | | | `match_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `locale` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_campaign_negative_keywords" ], "columns": [ "rpt_sp_campaign_negative_keywords.profile_id", "rpt_sp_campaign_negative_keywords.snapshot_date", "rpt_sp_campaign_negative_keywords.keyword_id" ], "order_by": [ { "column": "rpt_sp_campaign_negative_keywords.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_campaign_negative_targets (https://sellersheetai.com/docs/data/rpt_sp_campaign_negative_targets) > Amazon Ads reports · spCampaignNegativeTargets · Daily at 01:16 marketplace local time - Family: ads - Report type: `spCampaignNegativeTargets` - How fresh: Daily — Daily at 01:16 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `target_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `targeting_expression` | TEXT | | | `expression_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_campaign_negative_targets" ], "columns": [ "rpt_sp_campaign_negative_targets.profile_id", "rpt_sp_campaign_negative_targets.snapshot_date", "rpt_sp_campaign_negative_targets.target_id" ], "order_by": [ { "column": "rpt_sp_campaign_negative_targets.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_campaign_placement (https://sellersheetai.com/docs/data/rpt_sp_campaign_placement) > Amazon Ads reports · spCampaignsByPlacement · Daily at 01:00 marketplace local time - Family: ads - Report type: `spCampaignsByPlacement` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `placement_classification` | VARCHAR(50) | key | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost` | NUMERIC(14, 4) | | | `spend` | NUMERIC(14, 4) | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `sales_14d` | NUMERIC(14, 4) | | | `purchases_14d` | INTEGER | | | `units_sold_clicks_14d` | INTEGER | | | `acos_clicks_14d` | NUMERIC(10, 6) | | | `roas_clicks_14d` | NUMERIC(10, 4) | | | `top_of_search_impression_share` | NUMERIC(10, 6) | | | `currency` | VARCHAR(10) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_campaign_placement" ], "columns": [ "rpt_sp_campaign_placement.profile_id", "rpt_sp_campaign_placement.report_date", "rpt_sp_campaign_placement.campaign_id", "rpt_sp_campaign_placement.placement_classification" ], "order_by": [ { "column": "rpt_sp_campaign_placement.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_campaigns (https://sellersheetai.com/docs/data/rpt_sp_campaigns) > Amazon Ads reports · spCampaigns · Daily at 01:00 marketplace local time - Family: ads - Report type: `spCampaigns` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_campaigns_budget_usage`](https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) (today's budget use) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_status` | VARCHAR(50) | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_bidding_strategy` | VARCHAR(100) | | | `campaign_rule_based_budget_amount` | NUMERIC(14, 4) | | | `campaign_applicable_budget_rule_id` | VARCHAR(100) | | | `campaign_applicable_budget_rule_name` | TEXT | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `spend` | NUMERIC(14, 4) | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_14d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_14d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_14d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `top_of_search_impression_share` | NUMERIC(8, 4) | | | `search_impression_share` | NUMERIC(8, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_campaigns" ], "columns": [ "rpt_sp_campaigns.profile_id", "rpt_sp_campaigns.report_date", "rpt_sp_campaigns.campaign_id" ], "order_by": [ { "column": "rpt_sp_campaigns.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_keywords (https://sellersheetai.com/docs/data/rpt_sp_keywords) > Amazon Ads reports · spKeywords · Daily at 01:00 marketplace local time - Family: ads - Report type: `spKeywords` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (current bids and state) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_status` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `ad_keyword_status` | VARCHAR(50) | | | `keyword_bid` | NUMERIC(10, 4) | | | `keyword_type` | VARCHAR(50) | | | `match_type` | VARCHAR(100) | key | | `targeting` | TEXT | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_14d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_14d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `sales_other_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_14d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `units_sold_other_sku_7d` | INTEGER | | | `acos_clicks_14d` | NUMERIC(10, 4) | | | `acos_clicks_7d` | NUMERIC(10, 4) | | | `roas_clicks_14d` | NUMERIC(14, 4) | | | `roas_clicks_7d` | NUMERIC(14, 4) | | | `top_of_search_impression_share` | NUMERIC(8, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_keywords" ], "columns": [ "rpt_sp_keywords.profile_id", "rpt_sp_keywords.report_date", "rpt_sp_keywords.campaign_id", "rpt_sp_keywords.ad_group_id" ], "order_by": [ { "column": "rpt_sp_keywords.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_negative_keywords (https://sellersheetai.com/docs/data/rpt_sp_negative_keywords) > Amazon Ads reports · spNegativeKeywords · Daily at 01:13 marketplace local time - Family: ads - Report type: `spNegativeKeywords` - How fresh: Daily — Daily at 01:13 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `keyword_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(50) | | | `keyword_text` | TEXT | | | `match_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `locale` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_negative_keywords" ], "columns": [ "rpt_sp_negative_keywords.profile_id", "rpt_sp_negative_keywords.snapshot_date", "rpt_sp_negative_keywords.keyword_id" ], "order_by": [ { "column": "rpt_sp_negative_keywords.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_negative_targets (https://sellersheetai.com/docs/data/rpt_sp_negative_targets) > Amazon Ads reports · spNegativeTargets · Daily at 01:15 marketplace local time - Family: ads - Report type: `spNegativeTargets` - How fresh: Daily — Daily at 01:15 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `snapshot_date` | DATE | key | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `target_id` | VARCHAR(50) | key | | `campaign_id` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(50) | | | `targeting_expression` | TEXT | | | `expression_type` | VARCHAR(40) | | | `state` | VARCHAR(20) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_negative_targets" ], "columns": [ "rpt_sp_negative_targets.profile_id", "rpt_sp_negative_targets.snapshot_date", "rpt_sp_negative_targets.target_id" ], "order_by": [ { "column": "rpt_sp_negative_targets.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_purchased_products (https://sellersheetai.com/docs/data/rpt_sp_purchased_products) > Amazon Ads reports · spPurchasedProduct|spPurchasedProductBackfill · Daily at 01:00 marketplace local time - Family: ads - Report type: `spPurchasedProduct|spPurchasedProductBackfill` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `keyword_type` | VARCHAR(50) | | | `match_type` | VARCHAR(100) | | | `target_id` | VARCHAR(100) | key | | `targeting_text` | TEXT | | | `advertised_asin` | VARCHAR(20) | | | `advertised_sku` | VARCHAR(200) | | | `purchased_asin` | VARCHAR(20) | key | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_14d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `purchases_other_sku_1d` | INTEGER | | | `purchases_other_sku_7d` | INTEGER | | | `purchases_other_sku_14d` | INTEGER | | | `purchases_other_sku_30d` | INTEGER | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_14d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `sales_other_sku_1d` | NUMERIC(14, 4) | | | `sales_other_sku_7d` | NUMERIC(14, 4) | | | `sales_other_sku_14d` | NUMERIC(14, 4) | | | `sales_other_sku_30d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_14d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_other_sku_1d` | INTEGER | | | `units_sold_other_sku_7d` | INTEGER | | | `units_sold_other_sku_14d` | INTEGER | | | `units_sold_other_sku_30d` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_purchased_products" ], "columns": [ "rpt_sp_purchased_products.profile_id", "rpt_sp_purchased_products.report_date", "rpt_sp_purchased_products.campaign_id", "rpt_sp_purchased_products.ad_group_id" ], "order_by": [ { "column": "rpt_sp_purchased_products.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_search_terms (https://sellersheetai.com/docs/data/rpt_sp_search_terms) > Amazon Ads reports · spSearchTerm · Daily at 01:00 marketplace local time - Family: ads - Report type: `spSearchTerm` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_status` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `keyword_bid` | NUMERIC(10, 4) | | | `keyword_type` | VARCHAR(50) | | | `match_type` | VARCHAR(100) | | | `target_id` | VARCHAR(100) | key | | `targeting` | TEXT | | | `targeting_expression` | TEXT | | | `targeting_type` | VARCHAR(50) | | | `search_term` | TEXT | key | | `ad_keyword_status` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `spend` | NUMERIC(14, 4) | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_14d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `sales_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `units_sold_clicks_14d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `sales_other_sku_7d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_other_sku_7d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `acos_clicks_14d` | NUMERIC(10, 4) | | | `acos_clicks_7d` | NUMERIC(10, 4) | | | `roas_clicks_14d` | NUMERIC(14, 4) | | | `roas_clicks_7d` | NUMERIC(14, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_search_terms" ], "columns": [ "rpt_sp_search_terms.profile_id", "rpt_sp_search_terms.report_date", "rpt_sp_search_terms.campaign_id", "rpt_sp_search_terms.ad_group_id" ], "order_by": [ { "column": "rpt_sp_search_terms.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_sp_targets (https://sellersheetai.com/docs/data/rpt_sp_targets) > Amazon Ads reports · spTargets · Daily at 01:00 marketplace local time - Family: ads - Report type: `spTargets` - How fresh: Daily — Daily at 01:00 marketplace local time - Need it right now: [`ads_query_target`](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) (current bids and state) - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `store_id` | VARCHAR(36) | key | | `profile_id` | VARCHAR(50) | key | | `country_code` | VARCHAR(16) | | | `report_date` | DATE | key | | `start_date` | DATE | | | `end_date` | DATE | | | `ingested_at` | TIMESTAMP WITH TIME ZONE | | | `currency_code` | VARCHAR(10) | | | `portfolio_id` | VARCHAR(100) | | | `campaign_id` | VARCHAR(100) | key | | `campaign_name` | TEXT | | | `campaign_budget_type` | VARCHAR(50) | | | `campaign_budget_amount` | NUMERIC(12, 2) | | | `campaign_status` | VARCHAR(50) | | | `ad_group_id` | VARCHAR(100) | key | | `ad_group_name` | TEXT | | | `target_id` | VARCHAR(100) | key | | `keyword_id` | VARCHAR(100) | key | | `keyword` | TEXT | | | `keyword_bid` | NUMERIC(10, 4) | | | `keyword_type` | VARCHAR(50) | | | `match_type` | VARCHAR(100) | key | | `targeting` | TEXT | | | `ad_keyword_status` | VARCHAR(50) | | | `impressions` | INTEGER | | | `clicks` | INTEGER | | | `cost_per_click` | NUMERIC(14, 4) | | | `click_through_rate` | NUMERIC(10, 6) | | | `cost` | NUMERIC(14, 4) | | | `purchases_1d` | INTEGER | | | `purchases_7d` | INTEGER | | | `purchases_14d` | INTEGER | | | `purchases_30d` | INTEGER | | | `purchases_same_sku_1d` | INTEGER | | | `purchases_same_sku_7d` | INTEGER | | | `purchases_same_sku_14d` | INTEGER | | | `purchases_same_sku_30d` | INTEGER | | | `sales_1d` | NUMERIC(14, 4) | | | `sales_7d` | NUMERIC(14, 4) | | | `sales_14d` | NUMERIC(14, 4) | | | `sales_30d` | NUMERIC(14, 4) | | | `sales_other_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_1d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_7d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_14d` | NUMERIC(14, 4) | | | `attributed_sales_same_sku_30d` | NUMERIC(14, 4) | | | `units_sold_clicks_1d` | INTEGER | | | `units_sold_clicks_7d` | INTEGER | | | `units_sold_clicks_14d` | INTEGER | | | `units_sold_clicks_30d` | INTEGER | | | `units_sold_same_sku_1d` | INTEGER | | | `units_sold_same_sku_7d` | INTEGER | | | `units_sold_same_sku_14d` | INTEGER | | | `units_sold_same_sku_30d` | INTEGER | | | `units_sold_other_sku_7d` | INTEGER | | | `acos_clicks_14d` | NUMERIC(10, 4) | | | `acos_clicks_7d` | NUMERIC(10, 4) | | | `roas_clicks_14d` | NUMERIC(10, 4) | | | `roas_clicks_7d` | NUMERIC(10, 4) | | | `top_of_search_impression_share` | NUMERIC(8, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myStore-US", "tables": [ "rpt_sp_targets" ], "columns": [ "rpt_sp_targets.profile_id", "rpt_sp_targets.report_date", "rpt_sp_targets.campaign_id", "rpt_sp_targets.ad_group_id" ], "order_by": [ { "column": "rpt_sp_targets.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_catalog (https://sellersheetai.com/docs/data/rpt_noon_catalog) > noon reports · NOON_CATALOG · Daily at 05:00 UTC - Family: noon - Report type: `NOON_CATALOG` - How fresh: Daily — Daily at 05:00 UTC - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | | | `report_date` | DATE | | | `partner_sku` | VARCHAR(200) | key | | `sku` | VARCHAR(200) | key | | `title` | TEXT | | | `storage_type` | VARCHAR(40) | | | `image_url` | TEXT | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_catalog" ], "columns": [ "rpt_noon_catalog.project_code", "rpt_noon_catalog.partner_sku", "rpt_noon_catalog.sku" ], "order_by": [ { "column": "rpt_noon_catalog.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_catalog_export (https://sellersheetai.com/docs/data/rpt_noon_catalog_export) > noon reports · NOON_CATALOG_EXPORT · Daily at 03:00 UTC - Family: noon - Report type: `NOON_CATALOG_EXPORT` - How fresh: Daily — Daily at 03:00 UTC - Need it right now: synced only - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | key | | `report_date` | DATE | key | | `country_code` | VARCHAR(8) | key | | `partner_sku` | VARCHAR(128) | key | | `psku_code` | VARCHAR(64) | | | `id_partner` | VARCHAR(50) | | | `family_code` | VARCHAR(120) | | | `brand_code` | VARCHAR(120) | | | `partner_barcodes` | TEXT | | | `sku_child` | VARCHAR(80) | | | `noon_title` | TEXT | | | `noon_brand` | VARCHAR(200) | | | `active_price` | NUMERIC(12, 2) | | | `msrp` | NUMERIC(12, 2) | | | `price` | NUMERIC(12, 2) | | | `sale_price` | NUMERIC(12, 2) | | | `noon_price_min` | NUMERIC(12, 2) | | | `noon_price_max` | NUMERIC(12, 2) | | | `seller_price_min` | NUMERIC(12, 2) | | | `seller_price_max` | NUMERIC(12, 2) | | | `price_engine_min` | NUMERIC(12, 2) | | | `price_engine_max` | NUMERIC(12, 2) | | | `sale_start_date` | DATE | | | `sale_end_date` | DATE | | | `is_active` | BOOLEAN | | | `warranty` | VARCHAR(80) | | | `stock_fbn_net` | INTEGER | | | `stock_xdock_gross` | INTEGER | | | `stock_xdock_net` | INTEGER | | | `mp_code` | VARCHAR(40) | | | `offer_status_reason` | TEXT | | | `noon_status` | VARCHAR(16) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_catalog_export" ], "columns": [ "rpt_noon_catalog_export.project_code", "rpt_noon_catalog_export.marketplace", "rpt_noon_catalog_export.report_date", "rpt_noon_catalog_export.country_code" ], "order_by": [ { "column": "rpt_noon_catalog_export.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_fbn_aging (https://sellersheetai.com/docs/data/rpt_noon_fbn_aging) > noon reports · NOON_FBN_AGING · Twice a day, at 04:00 and 16:00 UTC - Family: noon - Report type: `NOON_FBN_AGING` - How fresh: Several times a day — Twice a day, at 04:00 and 16:00 UTC - Need it right now: synced only - Grain: per_mkt · sync: snapshot ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | | | `report_date` | DATE | | | `snapshot_date` | DATE | key | | `country_code` | VARCHAR(8) | key | | `sku` | VARCHAR(200) | key | | `partner_sku` | VARCHAR(200) | | | `partner_barcode` | VARCHAR(80) | key | | `inventory_condition` | VARCHAR(40) | key | | `qc_fail_item_identifier` | VARCHAR(80) | key | | `first_received_date` | DATE | | | `last_movement_date` | DATE | | | `gross_quantity` | INTEGER | | | `quantity_0_30d` | INTEGER | | | `quantity_31_60d` | INTEGER | | | `quantity_61_90d` | INTEGER | | | `quantity_91_180d` | INTEGER | | | `quantity_181_365d` | INTEGER | | | `quantity_366d` | INTEGER | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_fbn_aging" ], "columns": [ "rpt_noon_fbn_aging.project_code", "rpt_noon_fbn_aging.snapshot_date", "rpt_noon_fbn_aging.country_code", "rpt_noon_fbn_aging.sku" ], "order_by": [ { "column": "rpt_noon_fbn_aging.snapshot_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_finance (https://sellersheetai.com/docs/data/rpt_noon_finance) > noon reports · NOON_FINANCE · Twice a day, at 04:00 and 16:00 UTC - Family: noon - Report type: `NOON_FINANCE` - How fresh: Several times a day — Twice a day, at 04:00 and 16:00 UTC - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | | | `report_date` | DATE | | | `contract` | VARCHAR(80) | | | `contract_title` | VARCHAR(255) | | | `reference_nr` | VARCHAR(80) | key | | `order_nr` | VARCHAR(80) | | | `item_nr` | VARCHAR(80) | key | | `order_date` | DATE | | | `transaction_date` | DATE | | | `title` | TEXT | | | `skus` | VARCHAR(200) | | | `partner_skus` | VARCHAR(200) | | | `transaction_type` | VARCHAR(80) | key | | `currency` | VARCHAR(8) | | | `country_code` | VARCHAR(8) | | | `net_proceeds` | NUMERIC(16, 2) | | | `referral_fee` | NUMERIC(16, 2) | | | `fulfillment_logistics_fees` | NUMERIC(16, 2) | | | `shipping_credits` | NUMERIC(16, 2) | | | `other_order_fees` | NUMERIC(16, 2) | | | `order_subsidies` | NUMERIC(16, 2) | | | `non_order_fees` | NUMERIC(16, 2) | | | `non_order_subsidies` | NUMERIC(16, 2) | | | `others` | NUMERIC(16, 2) | | | `total` | NUMERIC(16, 2) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_finance" ], "columns": [ "rpt_noon_finance.project_code", "rpt_noon_finance.reference_nr", "rpt_noon_finance.item_nr", "rpt_noon_finance.transaction_type" ], "order_by": [ { "column": "rpt_noon_finance.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_orders (https://sellersheetai.com/docs/data/rpt_noon_orders) > noon reports · NOON_ORDERS_EXPORT · Twice a day, at 04:00 and 16:00 UTC - Family: noon - Report type: `NOON_ORDERS_EXPORT` - How fresh: Several times a day — Twice a day, at 04:00 and 16:00 UTC - Need it right now: synced only - Grain: region · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | key | | `report_date` | DATE | | | `id_partner` | VARCHAR(50) | | | `partner_name` | VARCHAR(255) | | | `market_place` | VARCHAR(40) | | | `order_nr` | VARCHAR(80) | | | `market_place_country_code` | VARCHAR(8) | | | `destination_country_code` | VARCHAR(8) | | | `item_nr` | VARCHAR(80) | key | | `sku` | VARCHAR(200) | | | `warehouse_code` | VARCHAR(40) | | | `order_placed_at` | TIMESTAMP WITH TIME ZONE | | | `min_expected_delivery_at` | TIMESTAMP WITH TIME ZONE | | | `max_expected_delivery_at` | TIMESTAMP WITH TIME ZONE | | | `item_status` | VARCHAR(40) | | | `shipment_nr` | VARCHAR(80) | | | `awb_nr` | VARCHAR(80) | | | `is_fulfilled_by_noon` | BOOLEAN | | | `delivered_at` | TIMESTAMP WITH TIME ZONE | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_orders" ], "columns": [ "rpt_noon_orders.project_code", "rpt_noon_orders.marketplace", "rpt_noon_orders.item_nr" ], "order_by": [ { "column": "rpt_noon_orders.report_date", "dir": "desc" } ], "limit": 100 } } ``` # rpt_noon_product_views (https://sellersheetai.com/docs/data/rpt_noon_product_views) > noon reports · NOON_PRODUCT_VIEWS · Twice a day, at 04:00 and 16:00 UTC - Family: noon - Report type: `NOON_PRODUCT_VIEWS` - How fresh: Several times a day — Twice a day, at 04:00 and 16:00 UTC - Need it right now: synced only - Grain: per_mkt · sync: incremental ## Columns | Column | Type | Key | |---|---|---| | `id` | INTEGER | | | `project_code` | VARCHAR(50) | key | | `marketplace` | VARCHAR(16) | | | `report_date` | DATE | | | `visit_date` | DATE | key | | `partner_sku` | VARCHAR(200) | | | `mp_code` | VARCHAR(40) | | | `sku_config` | VARCHAR(200) | | | `sku` | VARCHAR(200) | key | | `family` | VARCHAR(200) | | | `product_type` | VARCHAR(120) | | | `product_subtype` | VARCHAR(120) | | | `brand` | VARCHAR(200) | | | `currency_code` | VARCHAR(8) | | | `product_title` | TEXT | | | `country_code` | VARCHAR(8) | key | | `your_visitors` | NUMERIC(16, 2) | | | `total_visitors` | NUMERIC(16, 2) | | | `gross_units` | NUMERIC(16, 2) | | | `shipped_units` | NUMERIC(16, 2) | | | `cancelled_units` | NUMERIC(16, 2) | | | `revenue_shipped` | NUMERIC(16, 2) | | | `buy_box_visitor_percentage` | NUMERIC(8, 4) | | | `conversion_visitors_percentage` | NUMERIC(8, 4) | | | `asp_shipped` | NUMERIC(16, 4) | | | `extra` | JSON | | ## Query it ```json { "name": "query_report_data", "arguments": { "store": "myNoon-AE", "tables": [ "rpt_noon_product_views" ], "columns": [ "rpt_noon_product_views.project_code", "rpt_noon_product_views.visit_date", "rpt_noon_product_views.sku", "rpt_noon_product_views.country_code" ], "order_by": [ { "column": "rpt_noon_product_views.visit_date", "dir": "desc" } ], "limit": 100 } } ``` # sellersheet-sheets (https://sellersheetai.com/docs/skills/sellersheet-sheets) > Use whenever Google Sheets is the deliverable surface and SellerSheet MCP is the tool for sheet I/O. - Effect: Writes a sheet - Job: Sheets and dashboards · works in Your AI, Google Sheets - Say this to your AI: "Pull the last 7 days of orders for myStore-US into a sheet, totalled by SKU — units and sales." - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/sellersheet-sheets - 中文: 写入 Google 表格、生成报表、看板、财务模型、表格格式化、数字格式、图表、条件格式、下拉菜单、状态标签、SQL() 实时数据。 ## Tools it uses - [add_sheet_chart](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_chart) - [add_sheet_conditional_format](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_conditional_format) - [add_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_tab) - [autofit_sheet_columns](https://sellersheetai.com/docs/mcp-api/tools/autofit_sheet_columns) - [copy_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/copy_sheet_tab) - [format_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/format_sheet_range) - [freeze_sheet_panes](https://sellersheetai.com/docs/mcp-api/tools/freeze_sheet_panes) - [get_sheet_cell](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_cell) - [get_sheet_metadata](https://sellersheetai.com/docs/mcp-api/tools/get_sheet_metadata) - [list_sheet_tabs](https://sellersheetai.com/docs/mcp-api/tools/list_sheet_tabs) - [protect_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/protect_sheet_range) - [read_sheet](https://sellersheetai.com/docs/mcp-api/tools/read_sheet) - [read_sheet_format](https://sellersheetai.com/docs/mcp-api/tools/read_sheet_format) - [resize_sheet_columns](https://sellersheetai.com/docs/mcp-api/tools/resize_sheet_columns) - [set_sheet_basic_filter](https://sellersheetai.com/docs/mcp-api/tools/set_sheet_basic_filter) - [set_sheet_number_format](https://sellersheetai.com/docs/mcp-api/tools/set_sheet_number_format) - [setup_sheet](https://sellersheetai.com/docs/mcp-api/tools/setup_sheet) - [start_drive_upload](https://sellersheetai.com/docs/mcp-api/tools/start_drive_upload) - [write_sheet](https://sellersheetai.com/docs/mcp-api/tools/write_sheet) - [write_sheet_formula](https://sellersheetai.com/docs/mcp-api/tools/write_sheet_formula) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) # sellersheet-dashboard (https://sellersheetai.com/docs/skills/sellersheet-dashboard) > Use when building or maintaining an Amazon operator dashboard on Google Sheets via SellerSheet MCP — multi-tab status views for inventory, PPC, account health, listings, profit/margin, returns, buy box, cash conversion. Triggers on phrases like "build a dashboard", "operator dashboard", "FBA dashboard", "PPC dashboard", "Amazon overview sheet", "seller dashboard", and on follow-ups like "refresh the dashboard", "add an insight", "the freshness is wrong". Composes the tab plan, applies SellerSheet brand visuals, wires `rpt_*` warehouse data → `_raw_*` tabs → `SQL()` spill → visible tabs with thumbnails, and instruments each cell with provenance + freshness so the dashboard self-explains. Builds on `sellersheet-sheets` (sheet primitives + brand palette + SQL() patterns) and `report-data` (rpt_* tables). Do NOT use for one-off reports — use `sellersheet-sheets` directly for those. - Effect: Writes a sheet - Job: Sheets and dashboards · works in Your AI, Google Sheets - Say this to your AI: "Build an operator dashboard in a new Google Sheet from my synced reports — inventory, ads and listings tabs." - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/sellersheet-dashboard - 中文: 运营看板、亚马逊仪表盘、库存/广告/账户健康/listing/利润/退货/Buy Box 看板、刷新看板、新增洞察、数据新鲜度。 ## Tools it uses - [format_sheet_range](https://sellersheetai.com/docs/mcp-api/tools/format_sheet_range) - [list_sheet_tabs](https://sellersheetai.com/docs/mcp-api/tools/list_sheet_tabs) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) - [list_report_syncs](https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # report-data (https://sellersheetai.com/docs/skills/report-data) > Use when working with Amazon SP-API reports — querying synced report data, checking sync schedules, requesting on-demand reports, polling for completion, downloading a finished report document from its presigned URL, or analyzing any report table. Covers inventory, listings, orders, financial, and ad report (SP/SB/SD) tables; Brand Analytics has no synced table, so request it on-demand (schemas in amazon-report). Do NOT use for noon.com data (use noon-report-data) or when you don't yet know a report's exact schema — read amazon-report or data-kiosk first, then come back here for the sync/poll/download mechanics. - Effect: Writes a sheet - Job: Report and analyze · works in Your AI, Google Sheets - Say this to your AI: "From the synced inventory reports, find stock that hasn't sold in over 90 days." - Prefer to click: https://sellersheetai.com/help/sheets/sellers/store-reports - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/report-data - 中文: 亚马逊报告数据、库存报告、补货需求、订单、退货、结算、搜索词、listing 状态、rpt_ 数据仓库查询、报告同步计划、按需报告下载。 ## Tools it uses - [ads_query_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_query_campaign) - [reports_createReport](https://sellersheetai.com/docs/mcp-api/tools/reports_createReport) - [reports_getReport](https://sellersheetai.com/docs/mcp-api/tools/reports_getReport) - [reports_getReports](https://sellersheetai.com/docs/mcp-api/tools/reports_getReports) - [read_sheet](https://sellersheetai.com/docs/mcp-api/tools/read_sheet) - [write_sheet](https://sellersheetai.com/docs/mcp-api/tools/write_sheet) - [get_table_schema](https://sellersheetai.com/docs/mcp-api/tools/get_table_schema) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) - [list_report_syncs](https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # image-gen (https://sellersheetai.com/docs/skills/image-gen) > Use when creating or optimizing Amazon product listing images or A+ Content for a store SKU or a whole variation family — learns mature competitors' image style, generates/recolors product-faithful images with gpt-image-2 via the connected image MCP tools, enforces Amazon main-image compliance, builds A+ modules, scores them, builds review previews, and records into the operator's 'Images Generation' Google Sheet. Triggers: "make/optimize listing images", "main/hero image", "A+ content", "A+模块/品牌故事", "competitor image style", "出主图/副图/套图", "recolor variants", "image-gen on the row", "学竞品风格生成产品图", "keep this scene / swap my product in". Default provider openai; gated phases (operator approves before spend). Do NOT use for non-Amazon image edits — for that call the MCP image tools directly. - Effect: Uses credits - Job: Make listing content · works in Your AI, Google Sheets, Web app - Say this to your AI: "Make a white-background main image of my product in the style of this competitor shot." - Prefer to click: https://sellersheetai.com/help/sheets/sellers/images - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/image-gen - 中文: 亚马逊产品图生成、listing 图片优化、主图/副图/套图、A+ 页面、学习竞品风格、改色变体图、图片合规检查。 ## Tools it uses - [catalogItems_searchCatalogItems](https://sellersheetai.com/docs/mcp-api/tools/catalogItems_searchCatalogItems) - [listings_searchListingsItems](https://sellersheetai.com/docs/mcp-api/tools/listings_searchListingsItems) - [edit_image](https://sellersheetai.com/docs/mcp-api/tools/edit_image) - [generate_image](https://sellersheetai.com/docs/mcp-api/tools/generate_image) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) - [list_generated_images](https://sellersheetai.com/docs/mcp-api/tools/list_generated_images) - [reverse_prompt](https://sellersheetai.com/docs/mcp-api/tools/reverse_prompt) # noon-report-data (https://sellersheetai.com/docs/skills/noon-report-data) > Use when working with noon.com (noon Partners) report data that SellerSheet ingests on a schedule — querying noon orders, finance transactions (Transaction View Report, Item Level), FBN inventory aging, product views & sales, the full noon catalog (every listing's prices, stock and live / not-live status) or the FBN catalog (titles and images) for a connected noon store. Covers the 6 rpt_noon_* warehouse tables, the store-ref rule (always myStore-AE), schedules, grain and the query nuances. Do NOT use for Amazon SP-API or Ads report data — use report-data / amazon-report / amazon-ads instead. - Effect: Read-only - Job: Report and analyze · works in Your AI, Google Sheets - Say this to your AI: "Which of my noon SKUs have FBN stock older than 90 days?" - Prefer to click: https://sellersheetai.com/help/sheets/noon/reports - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/noon-report-data - 中文: noon 订单、noon 财务/交易明细、FBN 库存账龄、noon 商品浏览与销量、noon 商品目录(价格/库存/在售状态)、noon 店铺报表。 ## Tools it uses - [get_table_schema](https://sellersheetai.com/docs/mcp-api/tools/get_table_schema) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # amazon-report (https://sellersheetai.com/docs/skills/amazon-report) > Use when requesting or parsing an Amazon SP-API on-demand report document — Brand Analytics (search query performance, search terms, search catalog performance, market basket, repeat purchase), Sales & Traffic, Promotion/Coupon performance, Vendor (sales, traffic, inventory, forecasting, net pure product margin, real-time), B2B product opportunities, marketplace ASIN page-view, end-user data, account health. Provides the exact reportType, required reportOptions enums, and the full JSON field tree of the returned document so you don't guess field names. Do NOT use for the synced rpt_* warehouse — use report-data instead. - Effect: Read-only - Job: Report and analyze · works in Your AI, Google Sheets - Say this to your AI: "Pull the Brand Analytics search query performance report — what's my click share on these terms?" - Prefer to click: https://sellersheetai.com/help/sheets/sellers/store-reports - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/amazon-report - 中文: 亚马逊按需报告、品牌分析报告(搜索词、搜索查询表现、购物篮、复购)、销售与流量报告、促销/优惠券报告、Vendor 报告、报告字段结构。 ## Tools it uses - [reports_getReports](https://sellersheetai.com/docs/mcp-api/tools/reports_getReports) - [list_report_syncs](https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # data-kiosk (https://sellersheetai.com/docs/skills/data-kiosk) > Use when authoring or running an Amazon SP-API Data Kiosk GraphQL query — Sales & Traffic (by date / by ASIN / trends), Economics (per-unit fees, cost, margin, preview, simulation), or Vendor Analytics (manufacturing/sourcing view). Provides the exact versioned root query type, dataset fields, required arguments, enums (DateGranularity/AsinGranularity), and per-field @resultRetention so you write a valid query instead of guessing. Do NOT use for the synced rpt_dk_* warehouse — use report-data instead. - Effect: Read-only - Job: Report and analyze · works in Your AI, Google Sheets - Say this to your AI: "Run a Data Kiosk sales and traffic query by ASIN for last month and write it into my sheet." - Prefer to click: https://sellersheetai.com/help/sheets/sellers/data-kiosk - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/data-kiosk - 中文: Data Kiosk、GraphQL 查询、销售与流量数据、经济性数据(费用、成本、利润)、Vendor 分析。 ## Tools it uses - [dataKiosk_cancelQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_cancelQuery) - [dataKiosk_createQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_createQuery) - [dataKiosk_getDocument](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getDocument) - [dataKiosk_getQuery](https://sellersheetai.com/docs/mcp-api/tools/dataKiosk_getQuery) - [list_report_syncs](https://sellersheetai.com/docs/mcp-api/tools/list_report_syncs) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # amazon-ads (https://sellersheetai.com/docs/skills/amazon-ads) > Guide for managing Amazon Advertising (SP, SB, SD) using SellerSheet MCP tools. - Effect: Changes Amazon, Writes a sheet - Job: Run ads · works in Your AI, Google Sheets - Say this to your AI: "Raise these keyword bids 10% toward the suggested bid — write them to the sheet first, I'll confirm before you submit." - Prefer to click: https://sellersheetai.com/help/sheets/ads/sp - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/amazon-ads - 中文: 亚马逊广告、SP/SB/SD 广告活动、广告组、关键词与投放、竞价、预算、否定词、批量创建广告、广告数据导出、变更历史、广告账户与发票。 ## Tools it uses - [ads_ad_export](https://sellersheetai.com/docs/mcp-api/tools/ads_ad_export) - [ads_ad_group_export](https://sellersheetai.com/docs/mcp-api/tools/ads_ad_group_export) - [ads_apply_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_apply_recommendations) - [ads_associate_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_associate_accounts) - [ads_associate_optimization_rules_to_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_associate_optimization_rules_to_campaign) - [ads_campaign_export](https://sellersheetai.com/docs/mcp-api/tools/ads_campaign_export) - [ads_campaigns_budget_usage](https://sellersheetai.com/docs/mcp-api/tools/ads_campaigns_budget_usage) - [ads_create_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad) - [ads_create_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_association) - [ads_create_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ad_group) - [ads_create_ads_account](https://sellersheetai.com/docs/mcp-api/tools/ads_create_ads_account) - [ads_create_associated_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_create_associated_budget_rules_for_campaigns) - [ads_create_async_report](https://sellersheetai.com/docs/mcp-api/tools/ads_create_async_report) - [ads_create_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_create_budget_rules_for_campaigns) - [ads_create_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_create_campaign) - [ads_create_manager_account](https://sellersheetai.com/docs/mcp-api/tools/ads_create_manager_account) - [ads_create_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_create_optimization_rule) - [ads_create_portfolio](https://sellersheetai.com/docs/mcp-api/tools/ads_create_portfolio) - [ads_create_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_create_stream_subscription) - [ads_create_target](https://sellersheetai.com/docs/mcp-api/tools/ads_create_target) - [ads_delete_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad) - [ads_delete_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_association) - [ads_delete_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_ad_group) - [ads_delete_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign) - [ads_delete_campaign_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_campaign_optimization_rule) - [ads_delete_target](https://sellersheetai.com/docs/mcp-api/tools/ads_delete_target) - [ads_disassociate_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_accounts) - [ads_disassociate_associated_budget_rule_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_disassociate_associated_budget_rule_for_campaigns) - [ads_dsp_advertisers](https://sellersheetai.com/docs/mcp-api/tools/ads_dsp_advertisers) - [ads_generate_brand_metrics_report](https://sellersheetai.com/docs/mcp-api/tools/ads_generate_brand_metrics_report) - [ads_get_ads_account](https://sellersheetai.com/docs/mcp-api/tools/ads_get_ads_account) - [ads_get_asin_engagement_for_store](https://sellersheetai.com/docs/mcp-api/tools/ads_get_asin_engagement_for_store) - [ads_get_async_report](https://sellersheetai.com/docs/mcp-api/tools/ads_get_async_report) - [ads_get_bids_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_bids_recommendations) - [ads_get_brand_metrics_report](https://sellersheetai.com/docs/mcp-api/tools/ads_get_brand_metrics_report) - [ads_get_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_get_brands) - [ads_get_budget_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_recommendation) - [ads_get_budget_rule_by_rule_id_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rule_by_rule_id_for_campaigns) - [ads_get_budget_rules_for_advertiser](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_for_advertiser) - [ads_get_budget_rules_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_budget_rules_recommendation) - [ads_get_campaign_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaign_optimization_rule) - [ads_get_campaigns_associated_with_budget_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_associated_with_budget_rule) - [ads_get_campaigns_validation_configs](https://sellersheetai.com/docs/mcp-api/tools/ads_get_campaigns_validation_configs) - [ads_get_category_recommendations_for_asins](https://sellersheetai.com/docs/mcp-api/tools/ads_get_category_recommendations_for_asins) - [ads_get_export](https://sellersheetai.com/docs/mcp-api/tools/ads_get_export) - [ads_get_history](https://sellersheetai.com/docs/mcp-api/tools/ads_get_history) - [ads_get_insights_for_store_api](https://sellersheetai.com/docs/mcp-api/tools/ads_get_insights_for_store_api) - [ads_get_invoice](https://sellersheetai.com/docs/mcp-api/tools/ads_get_invoice) - [ads_get_keyword_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_keyword_recommendations) - [ads_get_localized_currencies](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_currencies) - [ads_get_localized_keywords](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_keywords) - [ads_get_localized_products](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_products) - [ads_get_localized_targeting_expression](https://sellersheetai.com/docs/mcp-api/tools/ads_get_localized_targeting_expression) - [ads_get_manager_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_get_manager_accounts) - [ads_get_negative_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_get_negative_brands) - [ads_get_optimization_rule_eligibility](https://sellersheetai.com/docs/mcp-api/tools/ads_get_optimization_rule_eligibility) - [ads_get_ranked_keyword_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_get_ranked_keyword_recommendation) - [ads_get_refinements_for_category](https://sellersheetai.com/docs/mcp-api/tools/ads_get_refinements_for_category) - [ads_get_rule_notification](https://sellersheetai.com/docs/mcp-api/tools/ads_get_rule_notification) - [ads_get_sd_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_sd_budget_recommendations) - [ads_get_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_get_stream_subscription) - [ads_get_target_bid_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_bid_recommendations) - [ads_get_target_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_get_target_recommendations) - [ads_get_targeting_clauses_validation_configs](https://sellersheetai.com/docs/mcp-api/tools/ads_get_targeting_clauses_validation_configs) - [ads_get_theme_based_bid_recommendation_for_ad_group_v1](https://sellersheetai.com/docs/mcp-api/tools/ads_get_theme_based_bid_recommendation_for_ad_group_v1) - [ads_insights_get_audiences_overlapping_audiences](https://sellersheetai.com/docs/mcp-api/tools/ads_insights_get_audiences_overlapping_audiences) - [ads_list_ads_accounts](https://sellersheetai.com/docs/mcp-api/tools/ads_list_ads_accounts) - [ads_list_assets](https://sellersheetai.com/docs/mcp-api/tools/ads_list_assets) - [ads_list_associated_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_list_associated_budget_rules_for_campaigns) - [ads_list_invoices](https://sellersheetai.com/docs/mcp-api/tools/ads_list_invoices) - [ads_list_portfolios](https://sellersheetai.com/docs/mcp-api/tools/ads_list_portfolios) - [ads_list_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_list_recommendations) - [ads_list_stream_subscriptions](https://sellersheetai.com/docs/mcp-api/tools/ads_list_stream_subscriptions) - [ads_portfolio_budget_usage](https://sellersheetai.com/docs/mcp-api/tools/ads_portfolio_budget_usage) - [ads_product_metadata](https://sellersheetai.com/docs/mcp-api/tools/ads_product_metadata) - [ads_query_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad) - [ads_query_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_association) - [ads_query_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_query_ad_group) - [ads_query_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_query_campaign) - [ads_query_target](https://sellersheetai.com/docs/mcp-api/tools/ads_query_target) - [ads_sb_get_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sb_get_budget_recommendations) - [ads_search_brands](https://sellersheetai.com/docs/mcp-api/tools/ads_search_brands) - [ads_search_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_search_optimization_rules) - [ads_sp_bulk_create](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_bulk_create) - [ads_sp_create_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_create_optimization_rules) - [ads_sp_get_budget_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_budget_recommendations) - [ads_sp_get_product_recommendations](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_get_product_recommendations) - [ads_sp_update_optimization_rules](https://sellersheetai.com/docs/mcp-api/tools/ads_sp_update_optimization_rules) - [ads_target_export](https://sellersheetai.com/docs/mcp-api/tools/ads_target_export) - [ads_update_ad](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad) - [ads_update_ad_association](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_association) - [ads_update_ad_group](https://sellersheetai.com/docs/mcp-api/tools/ads_update_ad_group) - [ads_update_budget_rules_for_campaigns](https://sellersheetai.com/docs/mcp-api/tools/ads_update_budget_rules_for_campaigns) - [ads_update_campaign](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign) - [ads_update_campaign_budget](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_budget) - [ads_update_campaign_state](https://sellersheetai.com/docs/mcp-api/tools/ads_update_campaign_state) - [ads_update_optimization_rule](https://sellersheetai.com/docs/mcp-api/tools/ads_update_optimization_rule) - [ads_update_portfolio](https://sellersheetai.com/docs/mcp-api/tools/ads_update_portfolio) - [ads_update_recommendation](https://sellersheetai.com/docs/mcp-api/tools/ads_update_recommendation) - [ads_update_stream_subscription](https://sellersheetai.com/docs/mcp-api/tools/ads_update_stream_subscription) - [ads_update_target](https://sellersheetai.com/docs/mcp-api/tools/ads_update_target) - [ads_update_target_bid](https://sellersheetai.com/docs/mcp-api/tools/ads_update_target_bid) - [read_sheet](https://sellersheetai.com/docs/mcp-api/tools/read_sheet) - [write_sheet](https://sellersheetai.com/docs/mcp-api/tools/write_sheet) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) - [query_report_data](https://sellersheetai.com/docs/mcp-api/tools/query_report_data) # fba-inbound (https://sellersheetai.com/docs/skills/fba-inbound) > Use when a user wants stock sent to Amazon FBA — "create FBA shipment", "inbound plan", "send to Amazon", "restock FBA", "STA sheet", "placement options", "transport options", "FBA box labels", "packing list", "upload tracking", "shipment status", "cancel plan", "get a US-West warehouse" — whether or not they use the SellerSheet FBA spreadsheet, including "just do the whole thing" and "pick the cheapest for me" requests. Do NOT use for Amazon Advertising campaigns or budgets (use amazon-ads) or for warehouse-synced inventory/order reporting (use report-data). - Effect: Changes Amazon, Writes a sheet - Job: Ship stock · works in Your AI, Google Sheets - Say this to your AI: "Build an FBA shipment from the box sizes in my sheet: packing, placement, confirm, then download the box labels." - Prefer to click: https://sellersheetai.com/help/sheets/sellers/fba - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/fba-inbound - 中文: 创建FBA货件、入库计划、发货到亚马逊、补货、STA表、分仓方案、运输方案、箱标、装箱单、上传物流单号、货件状态、取消计划、刷美西仓(刷仓换低运费)——无论是否使用 SellerSheet FBA 表格。 ## Tools it uses - [fbaInbound_cancelInboundPlan](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_cancelInboundPlan) - [fbaInbound_confirmDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmDeliveryWindowOptions) - [fbaInbound_confirmPackingOption](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPackingOption) - [fbaInbound_confirmPlacementOption](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmPlacementOption) - [fbaInbound_confirmTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirmTransportationOptions) - [fbaInbound_confirm_plan_options](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_confirm_plan_options) - [fbaInbound_createInboundPlan](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_createInboundPlan) - [fbaInbound_create_packing_list](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_packing_list) - [fbaInbound_generateDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateDeliveryWindowOptions) - [fbaInbound_generatePackingOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePackingOptions) - [fbaInbound_generatePlacementOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generatePlacementOptions) - [fbaInbound_generateTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generateTransportationOptions) - [fbaInbound_generate_shipment_options](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_generate_shipment_options) - [fbaInbound_getInboundOperationStatus](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getInboundOperationStatus) - [fbaInbound_getShipment](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_getShipment) - [fbaInbound_get_labels](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_get_labels) - [fbaInbound_listDeliveryWindowOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listDeliveryWindowOptions) - [fbaInbound_listPackingOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPackingOptions) - [fbaInbound_listPlacementOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listPlacementOptions) - [fbaInbound_listShipmentBoxes](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listShipmentBoxes) - [fbaInbound_listTransportationOptions](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_listTransportationOptions) - [fbaInbound_orchestrate_packing](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_orchestrate_packing) - [fbaInbound_setPackingInformation](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPackingInformation) - [fbaInbound_setPrepDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_setPrepDetails) - [fbaInbound_sync_shipment_status](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_sync_shipment_status) - [fbaInbound_updateShipmentTrackingDetails](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_updateShipmentTrackingDetails) - [add_sheet_tab](https://sellersheetai.com/docs/mcp-api/tools/add_sheet_tab) - [read_sheet](https://sellersheetai.com/docs/mcp-api/tools/read_sheet) - [start_drive_upload](https://sellersheetai.com/docs/mcp-api/tools/start_drive_upload) - [write_sheet](https://sellersheetai.com/docs/mcp-api/tools/write_sheet) - [fbaInbound_create_sta_sheet](https://sellersheetai.com/docs/mcp-api/tools/fbaInbound_create_sta_sheet) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) # fbn-inbound (https://sellersheetai.com/docs/skills/fbn-inbound) > Use when a user wants stock sent into noon's fulfilment centres (FBN, Fulfilled by noon) — "create a noon ASN", "FBN inbound shipment", "send stock to noon", "which SKUs can go to FBN", "add items to the ASN", "seal the ASN", "book a noon delivery slot", "reschedule the noon slot", "cancel the ASN", "where is my noon shipment". Runs noon's inbound flow with the SellerSheet MCP tools only — no spreadsheet is read or written during the steps. Do NOT use for Amazon FBA shipments (use fba-inbound) or for noon report data such as orders, finance or FBN inventory aging (use noon-report-data). - Effect: Changes noon - Job: Ship stock · works in Your AI, Google Sheets - Say this to your AI: "Which of my SKUs can go to noon FBN, and how far along are my open ASNs?" - Prefer to click: https://sellersheetai.com/help/sheets/noon/fbn - Already in your plugin: the SellerSheet plugin installs every skill at once - Version: 0.17.7 - Source: https://github.com/sellersheetai/sellersheet-skills/tree/v0.17.7/plugin/skills/fbn-inbound - 中文: noon 入仓、FBN 发货、创建 ASN、加商品到 ASN、封箱、预约送仓时段、重新预约、取消 ASN、noon 货件状态。 ## Tools it uses - [noon_inbound_CreateShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_CreateShipment) - [noon_inbound_DeleteShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_DeleteShipmentItems) - [noon_inbound_GetShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetShipment) - [noon_inbound_GetSlotAvailability](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_GetSlotAvailability) - [noon_inbound_ListEligibleItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListEligibleItems) - [noon_inbound_ListShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipmentItems) - [noon_inbound_ListShipments](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ListShipments) - [noon_inbound_ScheduleShipment](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_ScheduleShipment) - [noon_inbound_UpdateShipmentItems](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentItems) - [noon_inbound_UpdateShipmentStatus](https://sellersheetai.com/docs/mcp-api/tools/noon_inbound_UpdateShipmentStatus) - [get_user_context](https://sellersheetai.com/docs/mcp-api/tools/get_user_context) # Sidebar buttons (https://sellersheetai.com/help/sheets/buttons) > All 263 buttons of the Google Sheets add-on, by tab and panel. ## Sellers › sales (https://sellersheetai.com/help/sheets/buttons#sellers-sales) | Button | 中文 | What it does | |---|---|---| | Sync Orders | 同步订单 | Syncs new and changed orders into the Orders sheet, continuing where the last run stopped, then keeps itself running about every 2 hours. Only the spreadsheet's owner syncs. | | Re-sync | 重新同步 | Clears this tab and reads the ticked stores again from scratch, as far back as First sync reads. | | Update Order | 更新订单 | Click the Amazon Order ID cell of an order first, then this refreshes that row from Amazon. | | Clear Orders | 清空订单 | Clears ALL data rows from the Orders sheet (headers kept). Ctrl+Z to undo right after. | | Order Details | 获取订单明细 | Fetches line items of the selected order from Amazon. | | Create Invoices | 生成发票 | On the Invoices sheet: generates a PDF invoice in Drive for every row with Store + Order ID and no link yet (order must be Shipped; company info from Store Info sheet). | ## Vendors › vendors (https://sellersheetai.com/help/sheets/buttons#vendors-vendors) | Button | 中文 | What it does | |---|---|---| | Sync Vendor Orders | 同步供应商订单 | Fetch vendor POs from Amazon using the row-4 filters; defaults to the last 7 days. | | Load PO Items | 加载 PO 商品 | Loads the clicked PO row's line items into the Vendor PO Items sheet and auto-fills product images (thumbnails in column A, URL in the last column). | | Clear Table | 清空表格 | Clear data rows; headers, filters and dropdowns stay. Ctrl+Z to undo. | | Acknowledge PO | 确认接单(PO) | Submit PO acknowledgements to Amazon — every row needs Ack Code 1; Backordered needs a Ship Date, Rejected needs a Reason. | | Clear Table | 清空表格 | Clear data rows; image formula, headers and dropdowns stay. Ctrl+Z to undo. | | Refresh PO Status | 刷新 PO 状态 | Refresh item-level PO status using the row-4 filters (defaults to the last 7 days) and auto-fill product images for new rows. | | Clear Table | 清空表格 | Clear data rows; image formula, headers and filters stay. Ctrl+Z to undo. | ## Sellers › catalogs (https://sellersheetai.com/help/sheets/buttons#sellers-catalogs) | Button | 中文 | What it does | |---|---|---| | Sync Catalog | 同步商品目录 | Pulls every SKU of the ONE store typed in A4 (e.g. myStore-US) from the SellerSheet warehouse into the Catalog tab, with thumbnails. Filter afterwards with the row-5 column filter. | | Fetch by SKU | 按 SKU 获取 | Fetches your own listing (what you submitted) for rows with Store + SKU and an empty JSON cell; fills the ASIN too. Clear a row's JSON cell to re-fetch it. A row that fails shows the reason in its Image cell. | | Fetch by ASIN | 按 ASIN 获取 | Fetches Amazon's catalog page (what shoppers see) for rows with Store + ASIN, NO SKU and an empty JSON cell — yours or a competitor's. Put the same product on a SKU row and an ASIN row to compare the copy. | | Fetch Catalog Data | 获取目录数据 | Fills every competitor row with Store + ASIN (rows 5+) from the Amazon catalog: content, BSR, Buy Box, FBA/MFC offers, fee estimate, margin, and your own SKU if already listed. The winner row (4) is never overwritten. | | Discover by Keyword | 按关键词发现 | Searches Amazon by keyword and appends up to 10 new competitor ASINs as fully filled rows. | | Set as Winner | 设为最佳 | Copies the clicked competitor row into the winner row (row 4) as your listing starting point. | | Copy Winner to Drafts | 将最佳复制到草稿 | Sends the winner row (row 4) — identity, image and combined listing copy — to Listing Drafts for AI optimization. | | Send to Restriction Check | 发送至限制检查 | Adds the selected rows' Store + ASIN to the Restriction Check sheet to verify you can list them. | | Fetch by ASIN | 按 ASIN 获取 | Fills draft rows from the reference ASIN's catalog data (rows with Store + ASIN and an empty Image). | | Fetch by SKU | 按 SKU 获取 | Fills draft rows from YOUR OWN live listing by SKU — refurbish an existing listing (rows with Store + SKU and an empty Image). | | Image → Listing (AI) | 图片 → Listing(AI) | Sends the row's Image photo(s) + Instructions + Draft Keywords (each queued keyword MUST appear in the copy) to AI, which writes a complete listing into the AI columns: Item Name, Item Highlight, 5 Bullet Points, Description, backend Generic Keywords (fills Amazon's 250-byte budget) and PPC keyword ideas, plus A+ / image ideas. Lengths follow Settings → AI Length Preferences. | | Optimize Listing (AI) | 优化 Listing(AI) | Sends the row's Image + Instructions + Draft Listing + Draft Keywords to AI, which rewrites everything into the AI columns: Item Name, Item Highlight, Bullets, Description, backend Generic Keywords (fills Amazon's 250-byte budget) and PPC ideas, plus A+ / image ideas — facts are kept, only the copy improves. Lengths follow Settings → AI Length Preferences. | | Optimize Title (AI) | 优化标题(AI) | Sends Instructions + the row's copy (the AI columns, or Draft Listing when they are empty) + Draft Keywords + Image; AI rewrites ONLY the AI Item Name (kept under 75 characters so Amazon shows the Highlight) and the AI Item Highlight — bullets, description and keywords stay untouched. | | Translate Listing (AI) | 翻译 Listing(AI) | Target languages are set in the 'Listing Drafts · Translations' tab: add one row per language — same store NAME + SKU (the country code may differ: draft myStore-US matches translation row myStore-DE) + Locale (e.g. de_DE), Status left empty. One click sends the row's AI columns (fallback: Draft Listing) and translates ALL pending locales in a single AI call, marking each row OK. To redo one language, clear its Status. | | Send to Publish Queue | 发送至发布队列 | Copies the clicked draft row's SKU, Product Type and AI copy into the first empty Publish Queue row (ASIN → Merchant Suggested ASIN) and marks the draft SENT. On the Translations tab it sends the translated copy; the row's Locale must match the Publish Queue Listing Locale (B3). Needs SKU + Product Type + Item Name, and the Store must match Publish Queue A3. Run Get Template for that product type FIRST — only columns already on the Publish Queue receive copy. Choose the Operation Type there. | | Fetch ASIN Info | 获取 ASIN 信息 | One click fetches listing info (image, brand) plus buy box price, rank and offer counts for rows with Store + ASIN; rows whose Image is already filled are skipped — clear Image to refresh. | | Get Restrictions | 获取限制 | Check selling restrictions for every row with Store + ASIN. | | Get Template | 获取模板 | Builds attribute columns (F+) with guides from Amazon's schema, for the product types in D7:D. Rows 1-3 and columns A-E are kept — safe to re-run. | | Fetch by ASIN | 按 ASIN 获取 | Rewrites each row from the Amazon catalog (what shoppers see) for the ASIN in the Merchant Suggested ASIN column: every attribute column is refilled and a column the catalog lacks is cleared, so no stale value survives. Only rows whose Item Name is empty run — clear the title to re-fetch. A failed ASIN keeps its values and gets ⚠ in Brand; new attributes append at the right. | | Fetch by SKU | 按 SKU 获取 | Rewrites each row from YOUR submitted listing (SKU in column B): every attribute column is refilled and a column the listing lacks is cleared, so no stale value survives. Only rows whose Item Name (row 6) is empty run — a filled title means done; clear it to re-fetch. A row Amazon fails keeps its values and gets ⚠ in Brand. Also step 1 of PATCH-DELETE: fetch, keep only the cells to delete. | | Fill from JSON | 从 JSON 填充 | Rewrites each row from the JSON pasted in Attributes JSON (col E, e.g. from Listing Snapshot): every attribute column is refilled from it and a column the JSON lacks is cleared (the summary counts them), so no stale value survives. Only rows whose Item Name is empty run — clear the title to re-fill; the blob and columns A-E stay. Invalid JSON or a failed parse leaves the row untouched and is listed. Fill productType (col D) first. | | Validate (Preview) | 校验(预览) | Step 1 for every change: checks rows against Amazon WITHOUT publishing (max 20; DELETE has no preview and is skipped here). Issues land in Submission Log — fix, then publish with Create/Replace/Delete (≤20, instant) or Submit Feed (bulk). | | Create/Replace/Del. | 创建/替换/删除 | Create / Replace / Delete — LIVE, runs each row by its operationType, instant per-SKU results (max 20): UPDATE creates or fully replaces the SKU; PARTIAL_UPDATE / PATCH-DELETE change or delete only the listed attributes; DELETE removes the SKU from Amazon — irreversible, no preview exists. | | Submit Feed | 提交 Feed | LIVE — publishes ALL rows (any operationType) as one bulk feed, up to 25,000 rows; results appear in Submission Log. | | Backup | 备份 | Snapshots this tab into your Listing Log spreadsheet (named by SKU + timestamp) and records the link. | | Refresh Status | 刷新状态 | Asks Amazon about every Submit Feed row that is not finished yet and fills Feed Status, Result and Issues. | ## Sellers › FBA (https://sellersheetai.com/help/sheets/buttons#sellers-fba) | Button | 中文 | What it does | |---|---|---| | Refresh Data | 刷新数据 | Refresh the hidden data layer from the SellerSheet database — stores picked in the Stores filter (A4); the live table re-queries instantly. No Amazon call. Runs on the Inventory Health sheet — clicked elsewhere it jumps there (creating the tab if needed) so you can run it again. | | Create STA SS | 创建 STA 表格 | Create an STA spreadsheet for the active row’s shipment. | | Refresh Shipment | 刷新货件 | Refresh status for every non-terminal shipment on this sheet from Amazon. | | Initiate Plan | 创建入库计划 | Creates the inbound plan from row 9 and the box lines (row 14+) and lists Amazon's packing options; a single packing group is confirmed with its box info at once (1a–1c DONE). Several groups mean the items cannot ship together: the error lists each group's SKUs below the items — cancel, keep one group's SKUs and run again. | | Confirm Pack | 确认装箱 | Re-confirms the packing option ID in the stepper's 1b cell (1b DONE); Initiate Plan normally does this for you. | | Set Box Info | 填写箱子信息 | Re-sends every box line's dimensions and weight (row 14+, units in H9/I9) for the packing group in the stepper's 1c cell — after you edit the box lines (1c DONE); refused once the shipment is confirmed. | | Gen Placement Opts. | 生成分仓方案 | Fetches Amazon's placement options and fees; each shipment's warehouse, weight and volume land in STA-Options, where Rate/kg ✎ or Rate/m³ ✎ prices your own carrier. Pick one in the stepper's 2 cell. Click again to refresh from Amazon (rates carry over by warehouse). | | Gen Trans. Opts. | 生成运输方案 | Fetches carrier options (cost, mode, partnered or own) for every placement's shipments into the STA-Options Transportation dropdowns and rebuilds STA-PL; pick per shipment there (3 DONE). | | Match Carriers | 匹配承运商 | Run on the STA-Options tab: for every placement with 2+ shipments, shipment 1's picked Transportation Option fills the rest with the same carrier (SPD / LTL partnered rules). | | Gen Delivery Window | 生成送达时间窗 | Own-carrier shipments only: fetches delivery windows for the picked placement's shipments (every placement when none is picked) into the STA-Options Delivery Window dropdowns (3b DONE). | | Confirm Shipment | 确认货件 | Confirms the placement picked in the stepper's 2 cell and each shipment's Transportation + Delivery Window from STA-Options — books on Amazon. FBA ID, Reference ID and warehouse land in row 12, STA-Options (the FBA ID becomes the label link when Amazon returns labels) and Manage Shipments (2 and 4 DONE). | | Get Ref. ID | 获取参考 ID | Re-reads each confirmed shipment from Amazon: status, Reference ID and warehouse refresh in STA-Options and row 12; the Reference ID is mirrored to Manage Shipments. | | Get FBA Box Labels | 获取 FBA 箱标 | Fetches Amazon box labels for the picked placement's shipments whose FBA ID in STA-Options is not a link yet (page count from that row; cut to the FBA Box Label Size you chose in row 9 — required: 100x150 as is, 100x100 top square). Saves the PDF to the plan folder, turns the FBA ID into its link and mirrors it to Manage Shipments. Remove a link to fetch again. | | Get FNSKU Labels | 获取 FNSKU 标签 | Builds FNSKU item labels from the items table — one per unit (Qty/Box × Boxes), at the FNSKU Label Size you chose in row 9 (required) — and opens them in a print dialog; nothing is written to the sheet. | | Cancel Plan | 取消计划 | Cancels the inbound plan on Amazon; every stepper step and the Status cell become CANCELLED. | | Initiate Plan | 创建入库计划 | Creates the inbound plan from row 9 and the item lines (row 14+) and lists Amazon's placement options in STA-Options and the stepper's 2 dropdown (1 DONE). | | Confirm Placement | 确认分仓 | Confirms the placement picked in the stepper's 2 cell with Amazon and builds STA-Pack, one box block per shipment (2 DONE). | | Set Box Info | 填写箱子信息 | Sends STA-Pack's box rows (dimensions + weight per shipment, units in H9/I9) to Amazon as packing information; needs 2 DONE (3 DONE). | | Gen Trans. Opts. | 生成运输方案 | Fetches carrier options (cost, mode, partnered or own) for the confirmed placement's shipments into the STA-Options Transportation dropdowns; needs Ship Date and 3 DONE (4 DONE). | | Gen Delivery Window | 生成送达时间窗 | Own-carrier shipments only: fetches delivery windows for the confirmed placement's shipments into the STA-Options Delivery Window dropdowns (5 DONE). | | Confirm Shipment | 确认货件 | Confirms each shipment's Transportation + Delivery Window from STA-Options — books on Amazon. FBA ID, Reference ID and warehouse land in row 12, STA-Options (the FBA ID becomes the label link when Amazon returns labels) and Manage Shipments (6 DONE). | | Get FBA Box Labels | 获取 FBA 箱标 | Fetches Amazon box labels for the picked placement's shipments whose FBA ID in STA-Options is not a link yet (page count from that row; cut to the FBA Box Label Size you chose in row 9 — required: 100x150 as is, 100x100 top square). Saves the PDF to the plan folder, turns the FBA ID into its link and mirrors it to Manage Shipments. Remove a link to fetch again. | | Get FNSKU Labels | 获取 FNSKU 标签 | Builds FNSKU item labels from the items table — one per unit (Qty/Box × Boxes), at the FNSKU Label Size you chose in row 9 (required) — and opens them in a print dialog; nothing is written to the sheet. | | Cancel Plan | 取消计划 | Cancels the inbound plan on Amazon; every stepper step and the Status cell become CANCELLED. | | List Inbound Plans | 列出入库计划 | List your inbound plans (last 365 days) using the row-4 filters; newest first. | | Setup Sheet | 设置表格 | Create or reset the Search Inbound Plans sheet header block. | ## Sellers › store-reports (https://sellersheetai.com/help/sheets/buttons#sellers-store-reports) | Button | 中文 | What it does | |---|---|---| | Create Reports | 创建报告 | Request Amazon reports from rows 4+ (Store, Report Type, dates); the Report ID fills in automatically. | | Get Reports | 获取报告 | Poll pending reports; finished ones download to Drive and link in the row. | | Clear Table | 清空表格 | Clear data rows; headers and dropdowns stay. Ctrl+Z to undo. | | Search Reports | 搜索报告 | Search past Amazon reports using the row-4 filters. | | Clear Table | 清空表格 | Clear result rows; headers and filters stay. Ctrl+Z to undo. | ## Sellers › A+ (https://sellersheetai.com/help/sheets/buttons#sellers-a-plus) | Button | 中文 | What it does | |---|---|---| | Load Hints | 加载提示 | Sets up / refreshes the sheet: headers, dropdowns, per-module color hints and the Example column. Run after picking module types. | | Load Images (Drive) | 加载图片(Drive) | Fill image URLs from the Drive folder set in E4. | | Create & Submit | 创建并提交 | LIVE: creates a NEW A+ document on Amazon (Content Document JSON if present, else the module rows), applies the ASINs (G4) and submits for approval. Amazon-hosted images are reused directly; Drive/other image URLs are uploaded. | | Load A+ | 加载 A+ | Loads the existing A+ document whose key is in the Content Reference Key config cell (H4): modules into rows, module JSON into Content Document, ASINs into G4 — edit it, or change name/store to copy it. | | Update A+ | 更新 A+ | LIVE: full-replace update of the EXISTING document whose key is in Content Reference Key (H4) — load it with Load A+, edit, then update; ASINs re-applied and approval resubmitted. | | Revise A+ ASINs | 修订 ASIN | Replace the ASIN set on an existing A+ document and resubmit for approval. | | List A+ | 列出 A+ | List all A+ documents for the store in A3; details fill 25 rows per click. | | Load A+ | 加载 A+ | Loads the clicked result row's A+ document into the Create A+ sheet as an editable copy (JSON saved in its Content Document cell). | ## Sellers › images (https://sellersheetai.com/help/sheets/buttons#sellers-images) | Button | 中文 | What it does | |---|---|---| | Fetch Images | 获取图片 | Reads Store (A4) and SKU / parent SKU (B4) from the Image Library sheet and rebuilds the grid: one column per image slot, s0-s8 first (the Publish Queue block), A+/other slots appended. Each child SKU gets two rows — plain CDN URLs, then an =IMAGE() preview row to confirm, delete, and paste the rest into Publish Queue. | | Fetch by SKU | 按 SKU 获取 | Your OWN listed product: AI-summarized title+bullets → Product Context, main image → Sample 1, every listing image URL → the SKU cell's note. | | Fetch by ASIN | 按 ASIN 获取 | Reads the Ref ASIN in column D (competitor / reference listing) and writes its images into each S-slot's Ref cell BY POSITION (main→S0, PT01→S1 …) as STYLE references only. A+ block refs: paste manually. | | Preview Images | 预览图片 | Slideshow modal of the images on the current selection (the Useful-Tools previewer). | | Reverse Prompt | 反推提示词 | Click a REFERENCE image first (a block's Ref cell, or Ref A-C) — a vision model reverses it into a structured prompt, written to the block's Reversed Prompt (Ref A-C target the Scope slots above). | | Optimize Prompt | 优化提示词 | Adapts each Scope slot's Reversed Prompt to YOUR product: keeps the reference's style/composition, swaps the product for the Scope-selected Sample(s) + Product Context → slot Prompt (previous kept in the cell note). Prefer the reversed prompt as-is? Just copy it into the Prompt cell. | | Generate | 生成 | Runs the Scope-selected slots from each slot's Prompt. A slot's own Ref attaches as a STYLE anchor only when it has NO Reversed Prompt — an optimized Prompt already carries the ref's style as text. Samples selected → EDIT (product identical to samples) · neither samples nor ref → text-to-image. To keep a Ref's exact scene, use Swap Product In. Files are saved as SKU_S0 / SKU_S0_V2 / SKU_A1 … in Images/<store>/<sku>. Edit jobs finish in the background and save automatically (~5 min — keep the sidebar open). | | Swap Product In | ⇄ 场景换品 | Keeps each Scope slot's Ref image as the EXACT scene and replaces only the product with the Scope-selected Sample(s) — one edit call per slot, Ref goes first, no Prompt cell needed. Slots without a Ref are skipped (BLOCKED). The optional Instruction is appended to the swap prompt. Results queue and save automatically like Generate. | | Score Results | 评分 | Queued jobs save automatically (~5 min, keep the sidebar open). This button AI-rates each Scope slot's V1-V3 against its prompt + Amazon main-image compliance → Scores column. | ## Sellers › data-kiosk (https://sellersheetai.com/help/sheets/buttons#sellers-data-kiosk) | Button | 中文 | What it does | |---|---|---| | Create Queries | 创建查询 | Sheet: Data Kiosk. Submit a query per ready row (rows 4+, empty Query ID) — pick report type, aggregate and dates, or paste custom GraphQL. | | Get Results | 获取结果 | Poll pending queries; finished ones download to a Drive sheet linked in the Report Sheet column. | | Clear Table | 清空表格 | Clear data rows; headers and dropdowns stay. Ctrl+Z to undo. | | Search Queries | 搜索查询 | Search past Data Kiosk queries using the row-4 filters (Store required); all pages load in one click. | | Clear Table | 清空表格 | Clear result rows; headers and filters stay. Ctrl+Z to undo. | ## Sellers › dropbox (https://sellersheetai.com/help/sheets/buttons#sellers-dropbox) | Button | 中文 | What it does | |---|---|---| | Fetch Image URLs | 获取图片链接 | Fetch image URLs for the rows on this sheet. | | Refresh Access | 刷新授权 | Refresh access token. | ## Sellers › shipments (https://sellersheetai.com/help/sheets/buttons#sellers-shipments) | Button | 中文 | What it does | |---|---|---| | Create B2B Order | 创建 B2B 订单 | Creates a B2B shipping order for the clicked Shipment row. | | Get Tracking Status | 获取追踪状态 | Refreshes tracking status for the shipments on this sheet. | | Create PL SS | 创建装箱单表格 | Creates the packing list from this sheet's rows. | | Fill PL | 填写装箱单 | Active spreadsheet. Fill packing list. | ## Ads › ads-sp (https://sellersheetai.com/help/sheets/buttons#ads-ads-sp) | Button | 中文 | What it does | |---|---|---| | Setup Tabs | 1 · 初始化标签页 | Create the 5 Campaign Builder tabs (Campaigns / Targets / Bidding Adjustment / Negatives / Bulk Sheet). | | Get Suggestions | 获取建议 | Amazon ranked keyword recommendations with suggested bids for every manual ad group's products — written to Builder · Suggestions for review. | | Add Selected to Targets | 3 · 将所选加入投放 | Append the ticked suggestion rows to Builder · Targets with their suggested bids. | | Validate All | 4 · 全部校验 | Validate the whole Builder workbook — joins, enums, budgets, naming, and live name-collision check. Problems land in the Status columns and the Bulk Sheet tab. | | Launch | 5 · 启动 | Validate, then create the whole structure on Amazon (campaigns → ad groups → ads → targets → negatives); IDs and per-row statuses are written back. Rows that already have IDs are skipped. | | List SP campaigns | 列出 | Fetch SP campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SP Ad Groups sheet to that campaign and lists them. | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SP Targets sheet to that campaign and lists them. | | Create SP campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SP campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SP campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SP campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SP ad groups | 列出 | Fetch SP ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SP Ads sheet to that ad group and lists them. | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SP Targets sheet to that ad group and lists them. | | Create SP ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SP ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SP ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SP ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SP ads | 列出 | Fetch SP ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Create SP ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SP ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SP ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SP ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SP targets | 列出 | Fetch SP BIDDING targets using the row-4 filters (positives only — negatives are on SP Negatives). Default shows active (ENABLED+PAUSED). | | Create SP targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SP targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SP targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SP targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SP negatives | 列出 | Pull ALL negatives (keyword · product · brand, both levels) for the store, filtered by the row-4 Campaign / State. Names resolved from Ads Names. | | Create SP negatives | 创建 | Create from rows with NO Target ID. Per-type gate runs first (⚠️ reasons). KEYWORD→keyword+match; PRODUCT→ASIN; BRAND→brand id; Level CAMPAIGN omits the ad group. | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows whose Brand cell is a plain name, look the brand up via Amazon's brand search and rewrite it as 'Name (id)'. | | Edit SP negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes to Amazon for ticked rows (negatives have no bid). | | Delete SP negatives | 删除所选 | PERMANENTLY archive the ticked negatives — v1 delete = archive, cannot be undone. | | Setup SP Negatives Sheet | 设置表格 | Create or reset the SP Negatives tab (data rows untouched). | | Get Suggestions | 获取建议 | Fetch suggestions per the row-4 controls (Source, ASINs / Campaign+Ad Group names, Suggestion Type). Keyword bids are already decimal currency. NOTE: negative-KEYWORD suggestions have no Amazon endpoint — mine the SP Search Terms report instead. | | Search-Term Negatives | 搜索词否定 | NOT an Amazon suggestion — Amazon has no negative-keyword recommendation endpoint. Mines YOUR SP Search Terms report (rpt_sp_search_terms) for search terms with ≥ Min Clicks (J4) and ZERO orders over the Window (K4), writing MINED rows into the grid. Campaign (C4) scopes it; blank = whole account. Tick rows and Send Selected as Negatives. | | Send Selected to SP Targets | 将所选发送 → SP 投放 | Stage the ticked suggestions into SP Targets (PAUSED, empty ID, Select ticked) — review there, then Create. Duplicates already on SP Targets are SKIPPED. | | Send Selected as Negatives | 将所选发送为否定投放 | Stage the ticked rows into SP Targets with Negative=TRUE (keyword negatives; brand rows stage as PRODUCT_CATEGORY brand refinements). | | Setup SP Suggestions Sheet | 初始化表格 | Create or reset the SP Suggestions tab (data rows untouched). | | Analyze Campaign | 分析广告活动 | Read-only: pull the campaign's targets, bid recs per ad group, suggested budget (with the missed-opportunity WINDOW dates — they can be years old) and Amazon's campaign recommendations. Ad groups without servable ads show 'not delivering' (Amazon 422 — normal). | | Apply Selected Bids | 应用所选竞价 | MUTATES Amazon: bulk-update the ticked targets' bids per the Apply Mode (MEDIAN / HIGH / CUSTOM New Bid). | | Apply Suggested Budget | 应用建议预算 | MUTATES Amazon: set the campaign's daily budget to the analyzed Suggested Budget (D4). | | Setup Bid Optimizer Sheet | 初始化表格 | Create or reset the Bid Optimizer tab. | | List Portfolios | 列出 | Fetch all portfolios with budgets into the Portfolios sheet. | | Create Portfolios | 创建 | Create portfolios from rows with a name and NO Portfolio ID; new IDs are written back. | | Edit Selected | 编辑所选 | Push changes to Amazon — ONLY for Select-ticked rows. Portfolios cannot be archived via the API. | | Setup Sheet | 设置表格 | Create or reset the Portfolios sheet header block. | | Setup Sheet | 设置表格 | Create or reset the Ads Export sheet. | | Submit Export | 提交导出 | Submit ads entity export requests. | | Get Export Result | 获取导出结果 | Poll pending exports and download completed files. | | Setup Sheet | 设置表格 | Create or reset the Ads History sheet. | | Get History | 获取历史 | Fetch ads change history for a date range and entity type. | | Setup Sheet | 设置表格 | Create or reset the Ads Recommendations sheet. | | List Recommendations | 列出 | Fetch Amazon’s automated ads recommendations. | | Apply Recommendations | 应用所选 | Apply the selected recommendations to your account. | ## Ads › ads-sb (https://sellersheetai.com/help/sheets/buttons#ads-ads-sb) | Button | 中文 | What it does | |---|---|---| | List SB campaigns | 列出 | Fetch SB campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SB Ad Groups sheet to that campaign and lists them. | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SB Targets sheet to that campaign and lists them. | | Create SB campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SB campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SB campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SB campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SB ad groups | 列出 | Fetch SB ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SB Ads sheet to that ad group and lists them. | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SB Targets sheet to that ad group and lists them. | | Create SB ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SB ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SB ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SB ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SB ads | 列出 | Fetch SB ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ad Associations | 加载广告关联 | Drill down: click a ad row first — this filters the SB Ad Associations sheet to that ad and lists them. | | Create SB ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SB ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SB ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SB ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SB targets | 列出 | Fetch SB targets using the row-4 filters. Default shows active only (ENABLED+PAUSED). Use the Negative filter (TRUE/FALSE/ALL) to split negatives from bidding targets. | | Create SB targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SB targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SB targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SB targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SB negatives | 列出 | Pull ALL SB negatives (keyword · product · brand, ad-group level) for the store, filtered by row-4 Campaign / State. Names from Ads Names. | | Create SB negatives | 创建 | Create from rows with NO Target ID. Per-type gate first; SB is ad-group level only (Level=AD_GROUP + an Ad Group required). | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows with a plain name, look up the brand via Amazon and rewrite as 'Name (id)'. | | Edit SB negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes for ticked rows. | | Delete SB negatives | 删除所选 | PERMANENTLY archive ticked negatives — v1 delete = archive. | | Setup SB Negatives Sheet | 设置表格 | Create or reset the SB Negatives tab. | | List SB ad associations | 列出 | Fetch SB ad associations using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Create SB ad associations | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SB ad associations | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SB ad associations | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SB Associations Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | ## Ads › ads-sd (https://sellersheetai.com/help/sheets/buttons#ads-ads-sd) | Button | 中文 | What it does | |---|---|---| | List SD campaigns | 列出 | Fetch SD campaigns using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ad Groups | 加载广告组 | Drill down: click a campaign row first — this filters the SD Ad Groups sheet to that campaign and lists them. | | Load Targets | 加载投放 | Drill down: click a campaign row first — this filters the SD Targets sheet to that campaign and lists them. | | Create SD campaigns | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SD campaigns | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SD campaigns | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SD campaigns Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SD ad groups | 列出 | Fetch SD ad groups using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Load Ads | 加载广告 | Drill down: click a ad group row first — this filters the SD Ads sheet to that ad group and lists them. | | Load Targets | 加载投放 | Drill down: click a ad group row first — this filters the SD Targets sheet to that ad group and lists them. | | Create SD ad groups | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SD ad groups | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SD ad groups | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SD ad groups Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SD ads | 列出 | Fetch SD ads using the row-4 filters. Default shows active only (ENABLED+PAUSED). | | Create SD ads | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SD ads | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SD ads | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SD ads Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SD targets | 列出 | Fetch SD targets using the row-4 filters. Default shows active only (ENABLED+PAUSED). Use the Negative filter (TRUE/FALSE/ALL) to split negatives from bidding targets. | | Create SD targets | 创建 | Create from rows with the required ✎ fields filled and an EMPTY ID column; new IDs are written back. | | Edit SD targets | 编辑所选 | Push your changes to Amazon — ONLY for rows whose Select box is ticked. | | Delete SD targets | 删除所选 | PERMANENTLY archive the ticked rows on Amazon — v1 delete = archive, it cannot be undone. | | Setup SD targets Sheet | 设置表格 | Create or reset the sheet header block (data rows untouched). | | List SD negatives | 列出 | Pull ALL SD negatives (product · brand, ad-group level) for the store, filtered by row-4 Campaign / State. | | Create SD negatives | 创建 | Create from rows with NO Target ID. SD is PRODUCT/BRAND only, ad-group level only (keyword is not offered). | | Resolve Brand IDs | 解析品牌 ID | For ticked BRAND rows with a plain name, look up the brand via Amazon and rewrite as 'Name (id)'. | | Edit SD negatives | 编辑所选 | Push State (ENABLED/PAUSED) changes for ticked rows. | | Delete SD negatives | 删除所选 | PERMANENTLY archive ticked negatives — v1 delete = archive. | | Setup SD Negatives Sheet | 设置表格 | Create or reset the SD Negatives tab. | ## Ads › ads-reports (https://sellersheetai.com/help/sheets/buttons#ads-ads-reports) | Button | 中文 | What it does | |---|---|---| | Create Reports | 创建报告 | Submit ads report requests from the sheet rows. | | Get Reports | 获取报告 | Poll pending report rows and download completed reports. | | Refresh Report Types | 刷新报告类型 | Regenerate the Ads Report Type catalog tab from the latest report definitions. | ## noon › noon-listings (https://sellersheetai.com/help/sheets/buttons#noon-noon-listings) | Button | 中文 | What it does | |---|---|---| | Get Template | 获取模板 | Builds the columns (G+) with guides for every category in Category Code (F7:F); a product whose Parent Group Key is a noon id (Z…) and whose Category Code is blank gets its category from noon. Starts fresh: columns G onward are rebuilt empty; rows 1-3 and columns A-F are kept. | | Fetch by SKU | 按 SKU 获取 | Fills the Parent row of each product whose Parent Group Key is a noon id (Z…) from noon — one call per product. Only a Parent row whose Product Title is empty runs — clear the title to fetch again; columns G onward are rewritten from noon. A column the template lacks is added at the right; a product noon cannot return keeps its row and gets ⚠ in Brand. Sizes are yours to add: a Child row per size. | | Create / Update Listing | 创建/更新商品 | LIVE — sends every product to noon, one call per product, built from the sheet alone: the rows sharing a Parent Group Key are one product, its Parent row gives the details and every row gives its Partner SKU and Size Variation. noon keeps any value you leave blank, and each image column is one image slot. noon answers at once: the result is final in the noon Submission Log, and a saved product gets its noon id (Z…) in Parent Group Key and is added to noon Content QC — run Get QC Status there for noon's content check (missing required attributes, QC). noon has no preview, so there is no Validate. | | Clear Row 7+ | 清空第 7 行及以下 | Empties your product rows (row 7 down) from column B and keeps the template — ready for the next batch. Nothing is sent to noon. | | Fetch by SKU | 按 SKU 获取 | Rows with Store+SKU Parent set, Fetched At empty. Clear Fetched At to redo. | | Fetch by SKU | 按 SKU 获取 | Rows with Store+SKU Parent set, Draft Listing empty. | | Image → Listing (AI) | 图片 → Listing(AI) | Writes bilingual AI copy from the row's image + Instructions. | | Optimize Listing (AI) | 优化 Listing(AI) | AI rewrites the row's bilingual copy — facts kept. AI | | Send to Publish Queue | 发送至发布队列 | Copies the row into the noon Publish Queue (existing columns only) and marks it SENT. | | Get QC Status | 获取质检状态 | Fetch content status (attribute/image/live) per sku_parent × language. List sku_parents in column A of the noon Content QC tab first. | | Delete SKUs | 删除 SKU ⚠ | DESTRUCTIVE: delete ticked child/parent SKUs on noon. Parent deletes cascade to every variant. | | Get Pricing | 获取定价 | Read price / msrp / is_active per partner_sku. | | Update Pricing | 更新定价 | Push price / msrp / is_active to noon. | | Get Transfer Price | 获取调拨价 | Read USD cross-border transfer prices per partner_sku. | | Update Transfer Price | 更新调拨价 | Push USD transfer_price / msrp / is_active to noon. | | Get Offers | 获取报价 | Look up noon sku / title / brand / per-country offers for each partner_sku. | | Get Stock | 获取库存 | Read current available qty for each (warehouse_code, partner_sku) row. | | Update Stock | 更新库存 | Push the qty column to noon for each row. | | Map Barcodes | 映射条码 | Connect each partner_sku to its barcode (UPC/EAN/ISBN) on noon. | | Create Import | 创建导入 | Submit the barcode rows as an async import; writes an import reference. | | Refresh Status | 刷新状态 | Poll the import status/report for the saved reference. | | List Warehouses | 列出仓库 | Load the partner warehouses for the Store in A4. | | List Categories | 列出类目 | List noon catalog categories (codes used by noon Publish Queue). | | Lookup Returns | 查询退货 | List noon return items + barcode references matching a barcode. | ## noon › noon-fbn (https://sellersheetai.com/help/sheets/buttons#noon-noon-fbn) | Button | 中文 | What it does | |---|---|---| | List Eligible Items | 列出可入库商品 | Load FBN-eligible SKUs (with images) into the FBN Product tab, then copy the ones to ship into the items table. | | Create Shipment | 创建货件 | Create an ASN from Store (A9) + Ext Ref (B9); the ASN number lands in C9. | | Update Items | 更新商品 | Push the items table (partner_sku, qty, storage_type) to the ASN. | | Load existing items | 加载现有商品 | Pull the current ASN items back into the table to review or edit. | | Seal Shipment | 封箱发运 | Lock the ASN (SEAL) so it can be scheduled — items can no longer change. | | Get Slot Availability | 获取时段可用性 | List destination warehouses + delivery slots for the SEALED ASN into the slots table. | | Schedule Shipment | 预约送仓 | Tick ONE slot row in the table, then book it for the ASN. | | Refresh Status | 刷新状态 | Re-fetch the ASN header + status from noon. | | Reschedule Shipment | 重新预约送仓 | Release the booked slot of a SCHEDULED ASN (back to SEALED), then Get Slot Availability and Schedule again. | | Delete selected item(s) | 删除所选条目 | Remove the ticked item rows from the ASN (before Seal). | | Cancel Shipment | 取消货件 | Cancel the whole ASN on noon. | | Clear Data (new ASN) | 清空数据(新 ASN) | Wipe this ASN data and reset the sheet to a blank template for the next shipment — keeps the Store. Nothing is sent to noon. | | List Shipments | 列出货件 | Enter Store in A4, then list all ASNs for the Store into the noon Shipments tab. | | List Shipment Items | 列出货件商品 | Loads the clicked ASN row's items (with images) into the noon Shipment Items tab. | ## noon › noon-reports (https://sellersheetai.com/help/sheets/buttons#noon-noon-reports) | Button | 中文 | What it does | |---|---|---| | Create Reports | 创建报告 | Request noon exports from rows 4+ (Report Type + params); the Export Code fills in automatically. | | Get Reports | 获取报告 | Poll pending exports; finished ones download to Drive (SellerSheet/NoonReports) and link in the row. | # Changelog (https://sellersheetai.com/docs/changelog) > What changed for MCP and API users, newest first. ## 2026-10-09 — One dropdown tool, and get_sheet_cell reads dropdowns _changed_ `add_sheet_dropdown` is now the one tool for dropdowns: `values` for a fixed list, `source_range` for a list kept in other cells, `values: []` to remove one. Its reply echoes the rule as written. `add_sheet_data_validation` is removed; its old name answers with the replacement for 90 days. `get_sheet_cell` returns each cell's `dropdown` in the same shape and takes `include` to read only the groups you need (value, format, note, hyperlink, dropdown). ## 2026-10-07 — catalogItems_listCatalogCategories retired — Amazon shut down Catalog Items v0 _removed_ Amazon retired the Catalog Items v0 API for sellers on 2026-03-31, so `catalogItems_listCatalogCategories` answered 403 on every call. The tool is removed; its old name answers with the replacement for 90 days. Read the category hierarchy with `catalogItems_getCatalogItem` and `includedData: ["classifications"]`: each node carries `classificationId`, `displayName` and a nested `parent`. ## 2026-10-06 — Listings tools: the store ref alone names the marketplace; schema errors say why; Fill from JSON never waits on a schema _changed_ The nine `listings_*` Publish Queue tools no longer take `countryCode` — the `<store>-<CC>` ref already names the marketplace, and a stray value is ignored (Ads tools keep it: it selects the Ads profile). A product type Amazon does not know now answers HTTP 400 naming the type; a schema Amazon could not serve answers 502 with `Retry-After` and is asked again on the next call (no five-minute lock-out). `listings_parse_payload`, `listings_parse_asin_to_cells` and the two bulk fetches parse from the JSON alone when the schema is unavailable and say so in `data.notes` / a row `note`; submit and validate still need the schema. Guide text served over MCP no longer carries sidebar-button tips. ## 2026-10-06 — Tool names: Amazon's name for an Amazon endpoint; SellerSheet workflows share the namespace _action_ Tool names now follow two rules. A tool that wraps one Amazon endpoint takes Amazon's name even when it also polls that operation or downloads its document: `get_feed` → `feeds_getFeed`; `submit_feed` → `feeds_createFeed`; `sp_api_get_report` → `reports_getReport`; `get_data_kiosk_query` → `dataKiosk_getQuery`; `cancel_inbound_plan` → `fbaInbound_cancelInboundPlan`; `confirm_placement_option` → `fbaInbound_confirmPlacementOption`; `update_shipment_tracking_details` → `fbaInbound_updateShipmentTrackingDetails`; `vendor_retail_submit_acknowledgement` → `vendorOrders_submitAcknowledgement`; `vendor_retail_submit_invoices` → `vendorInvoices_submitInvoices`; `vendor_retail_submit_shipments` → `vendorShipments_SubmitShipments`; `vendor_retail_submit_shipment_confirmations` → `vendorShipments_SubmitShipmentConfirmations`. The unpolled single-item `vendorShipments_SubmitShipmentConfirmations` is retired; the polled batch now carries that name. A SellerSheet workflow over several operations keeps the namespace of the Amazon API area it serves and takes a snake_case tail — no Amazon operation name has an underscore, so the tail alone tells you it is SellerSheet's own: `create_and_publish_aplus` → `aplusContent_create_and_publish`; `list_aplus_sheet_rows` → `aplusContent_list_documents_detailed`; `build_listing_payload` → `listings_build_payload`; `parse_listing_amazon` → `listings_parse_payload`; `parse_asin_to_sheet_format` → `listings_parse_asin_to_cells`; `fetch_listing_attrs_by_asins` → `listings_fetch_attributes_by_asins`; `fetch_listing_attrs_by_skus` → `listings_fetch_attributes_by_skus`; `get_listing_attribute_guide` → `listings_get_attribute_guide`; `prepare_publish_queue_template` → `listings_prepare_publish_queue_template`; `submit_listing_feed` → `listings_submit_feed`; `submit_listing_payload` → `listings_submit_items`; `submit_listings_feed` → `listings_submit_feed_legacy`; `validate_listings` → `listings_validate_rows`; `poll_feed_status` → `listings_poll_feed_results`; `confirm_fba_placement` → `fbaInbound_confirm_plan_options`; `create_fba_packing_list` → `fbaInbound_create_packing_list`; `generate_shipment_transport_options` → `fbaInbound_generate_shipment_options`; `get_fba_plan_status` → `fbaInbound_get_plan_status`; `get_labels` → `fbaInbound_get_labels`; `orchestrate_fba_packing` → `fbaInbound_orchestrate_packing`; `sync_fba_shipment_status` → `fbaInbound_sync_shipment_status`; `create_sta_sheet` → `fbaInbound_create_sta_sheet`; `insights_report` → `customerFeedback_insights_report`; `insights_report_status` → `customerFeedback_insights_report_status`; `noon_download_export` → `noon_impex_download_export`; `noon_prepare_publish_queue_template` → `noon_content_prepare_publish_queue_template`; `noon_load_publish_queue_content` → `noon_content_load_publish_queue_content`. An old name answers with its replacement for 90 days. `listings_poll_feed_results` also changed shape: it takes the feed ids (and each row's SKUs cell) and returns the Submission Log cells for you to write — the server no longer reads or writes the sheet; likewise `listings_validate_rows` and `listings_submit_feed_legacy` return the row in `data.submissionLog` instead of appending it. ## 2026-10-06 — human_action is for you; a refused call is an error on every route _changed_ A result's `human_action` now appears only when there is something you yourself must do (approve, pick an option, fix an input). What the AI should call next is in each tool's description instead, so those hints no longer go stale when a tool is renamed. Eleven more routes that used to answer a refused call as a success carrying an error message now answer with the proper status: an empty validation or a patch without patches (400), an unknown copy-generation or Buyer-insights job (400), an image that belongs to another store on confirm (403), and a job that could not be queued or a copy model that is not configured (502, nothing charged). The catalog on this page now carries each tool's toolset (Amazon SP-API, Amazon Ads, noon, Google Workspace, SellerSheet) and vendor family. ## 2026-10-06 — noon tools renamed to noon's own operation names _action_ Every one-operation noon tool is now named `noon_<section>_<Operation>`, in the words noon's own API reference uses — the section from the page address and the operation exactly as noon writes it (for example `noon_stock_GetStock`). The three workflow tools keep their names. An old name answers with its replacement for 90 days. Renamed: `noon_barcode_sku_map` → `noon_catalog_BarcodeSkuMap`; `noon_batch_get_pricing` → `noon_pricing_BatchGetPricing`; `noon_batch_get_transfer_price` → `noon_xborder_pricing_BatchGetTransferPrice`; `noon_batch_upsert_pricing` → `noon_pricing_BatchUpsertPricing`; `noon_batch_upsert_product` → `noon_xborder_pricing_BatchUpsertProduct`; `noon_batch_upsert_transfer_price` → `noon_xborder_pricing_BatchUpsertTransferPrice`; `noon_child_sku_delete` → `noon_catalog_ChildSkuDelete`; `noon_create_barcode_import` → `noon_catalog_CreateBarcodeImport`; `noon_create_export` → `noon_impex_CreateExport`; `noon_generate_import_signed_url` → `noon_catalog_GenerateImportSignedUrl`; `noon_get_content` → `noon_content_GetContent`; `noon_get_export_category_list` → `noon_impex_GetExportCategoryList`; `noon_get_export_status` → `noon_impex_GetExportStatus`; `noon_get_import_status` → `noon_catalog_GetImportStatus`; `noon_get_product_offers` → `noon_offer_GetProductOffers`; `noon_get_stock` → `noon_stock_GetStock`; `noon_inbound_create_shipment` → `noon_inbound_CreateShipment`; `noon_inbound_delete_shipment_items` → `noon_inbound_DeleteShipmentItems`; `noon_inbound_get_shipment` → `noon_inbound_GetShipment`; `noon_inbound_get_slot_availability` → `noon_inbound_GetSlotAvailability`; `noon_inbound_list_eligible_items` → `noon_inbound_ListEligibleItems`; `noon_inbound_list_shipment_items` → `noon_inbound_ListShipmentItems`; `noon_inbound_list_shipments` → `noon_inbound_ListShipments`; `noon_inbound_schedule_shipment` → `noon_inbound_ScheduleShipment`; `noon_inbound_update_shipment` → `noon_inbound_UpdateShipment`; `noon_inbound_update_shipment_items` → `noon_inbound_UpdateShipmentItems`; `noon_inbound_update_shipment_status` → `noon_inbound_UpdateShipmentStatus`; `noon_list_categories` → `noon_content_ListCategories`; `noon_list_category_attributes` → `noon_content_ListCategoryAttributes`; `noon_list_return_references` → `noon_returns_ListReturnReferences`; `noon_list_warehouses` → `noon_warehouse_platform_ListWarehouses`; `noon_parent_sku_delete` → `noon_catalog_ParentSkuDelete`; `noon_update_stock` → `noon_stock_UpdateStock`; `noon_upsert_product` → `noon_content_UpsertProduct`. ## 2026-10-06 — Failed calls are reported as errors; an invalid key is refused with 401 _changed_ A call that could not be carried out — a noon outage, a missing argument, a product type Amazon does not know — now comes back as a tool error instead of a normal result that only said so in its text, and Amazon's full error list comes with it. An API key that was deleted is refused with HTTP 401, so your client asks you to reconnect instead of failing on every call. Results are sent as compact JSON, which uses fewer tokens. ## 2026-09-29 — Three narrow Ads writes: campaign budget, campaign state, target bid _new_ `ads_update_campaign_budget`, `ads_update_campaign_state` and `ads_update_target_bid` change one thing on one campaign or target, under the same names Amazon Ads' own MCP uses. Use them for the three changes sellers make most; the general update tools still cover everything else. ## 2026-09-29 — SP-API tools renamed to Amazon's Selling Partner connector names _action_ Every one-operation SP-API tool is now named `<namespace>_<operationId>`, the same names Amazon's own Selling Partner connector uses (for example `fbaInbound_createInboundPlan`). Workflow tools keep their names. An old name answers with its replacement for 90 days. Renamed: `cancel_data_kiosk_query` → `dataKiosk_cancelQuery`; `cancel_feed` → `feeds_cancelFeed`; `cancel_fulfillment_order` → `fbaOutbound_cancelFulfillmentOrder`; `cancel_self_ship_appointment` → `fbaInbound_cancelSelfShipAppointment`; `check_listing_restrictions` → `listings_getListingsRestrictions`; `confirm_delivery_window_options` → `fbaInbound_confirmDeliveryWindowOptions`; `confirm_packing_option` → `fbaInbound_confirmPackingOption`; `confirm_shipment_content_update_preview` → `fbaInbound_confirmShipmentContentUpdatePreview`; `confirm_transportation_options` → `fbaInbound_confirmTransportationOptions`; `create_data_kiosk_query` → `dataKiosk_createQuery`; `create_fulfillment_order` → `fbaOutbound_createFulfillmentOrder`; `create_fulfillment_return` → `fbaOutbound_createFulfillmentReturn`; `create_inbound_plan` → `fbaInbound_createInboundPlan`; `create_marketplace_item_labels` → `fbaInbound_createMarketplaceItemLabels`; `create_solicitation` → `solicitations_createProductReviewAndSellerFeedbackSolicitation`; `delete_listing` → `listings_deleteListingsItem`; `delivery_offers` → `fbaOutbound_deliveryOffers`; `estimate_fees_batch` → `productFees_getMyFeesEstimates`; `estimate_fees_for_asin` → `productFees_getMyFeesEstimateForASIN`; `estimate_fees_for_sku` → `productFees_getMyFeesEstimateForSKU`; `generate_delivery_window_options` → `fbaInbound_generateDeliveryWindowOptions`; `generate_packing_options` → `fbaInbound_generatePackingOptions`; `generate_placement_options` → `fbaInbound_generatePlacementOptions`; `generate_self_ship_appointment_slots` → `fbaInbound_generateSelfShipAppointmentSlots`; `generate_shipment_content_update_previews` → `fbaInbound_generateShipmentContentUpdatePreviews`; `generate_transportation_options` → `fbaInbound_generateTransportationOptions`; `get_browse_node_return_topics` → `customerFeedback_getBrowseNodeReturnTopics`; `get_browse_node_return_trends` → `customerFeedback_getBrowseNodeReturnTrends`; `get_browse_node_review_topics` → `customerFeedback_getBrowseNodeReviewTopics`; `get_browse_node_review_trends` → `customerFeedback_getBrowseNodeReviewTrends`; `get_catalog_item` → `catalogItems_getCatalogItem`; `get_competitive_pricing` → `productPricing_getCompetitivePricing`; `get_competitive_summary` → `productPricing_getCompetitiveSummary`; `get_content_document` → `aplusContent_getContentDocument`; `get_data_kiosk_document` → `dataKiosk_getDocument`; `get_data_kiosk_queries` → `dataKiosk_getQueries`; `get_delivery_challan_document` → `fbaInbound_getDeliveryChallanDocument`; `get_feature_inventory` → `fbaOutbound_getFeatureInventory`; `get_feature_sku` → `fbaOutbound_getFeatureSKU`; `get_featured_offer_expected_price` → `productPricing_getFeaturedOfferExpectedPriceBatch`; `get_features` → `fbaOutbound_getFeatures`; `get_feeds` → `feeds_getFeeds`; `get_financial_events_for_order` → `finances_listFinancialEventsByOrderId`; `get_fulfillment_order` → `fbaOutbound_getFulfillmentOrder`; `get_fulfillment_preview` → `fbaOutbound_getFulfillmentPreview`; `get_inbound_operation_status` → `fbaInbound_getInboundOperationStatus`; `get_inbound_plan` → `fbaInbound_getInboundPlan`; `get_inventory_summaries` → `fbaInventory_getInventorySummaries`; `get_item_browse_node` → `customerFeedback_getItemBrowseNode`; `get_item_eligibility_preview` → `fbaInboundEligibility_getItemEligibilityPreview`; `get_item_offers` → `productPricing_getItemOffers`; `get_item_offers_batch` → `productPricing_getItemOffersBatch`; `get_item_review_topics` → `customerFeedback_getItemReviewTopics`; `get_item_review_trends` → `customerFeedback_getItemReviewTrends`; `get_listing` → `listings_getListingsItem`; `get_listing_offers` → `productPricing_getListingOffers`; `get_listing_offers_batch` → `productPricing_getListingOffersBatch`; `get_order` → `orders_getOrder`; `get_order_metrics` → `sales_getOrderMetrics`; `get_package_tracking_details` → `fbaOutbound_getPackageTrackingDetails`; `get_pricing` → `productPricing_getPricing`; `get_product_type` → `productTypeDefinitions_getDefinitionsProductType`; `get_self_ship_appointment_slots` → `fbaInbound_getSelfShipAppointmentSlots`; `get_selling_partner_metrics` → `replenishment_getSellingPartnerMetrics`; `get_shipment` → `fbaInbound_getShipment`; `get_shipment_content_update_preview` → `fbaInbound_getShipmentContentUpdatePreview`; `get_solicitation_actions` → `solicitations_getSolicitationActionsForOrder`; `list_all_fulfillment_orders` → `fbaOutbound_listAllFulfillmentOrders`; `list_catalog_categories` → `catalogItems_listCatalogCategories`; `list_content_document_asin_relations` → `aplusContent_listContentDocumentAsinRelations`; `list_delivery_window_options` → `fbaInbound_listDeliveryWindowOptions`; `list_financial_event_groups` → `finances_listFinancialEventGroups`; `list_financial_events` → `finances_listFinancialEvents`; `list_financial_events_by_group` → `finances_listFinancialEventsByGroupId`; `list_financial_transactions` → `finances_listTransactions`; `list_inbound_plan_boxes` → `fbaInbound_listInboundPlanBoxes`; `list_inbound_plan_items` → `fbaInbound_listInboundPlanItems`; `list_inbound_plan_pallets` → `fbaInbound_listInboundPlanPallets`; `list_inbound_plans` → `fbaInbound_listInboundPlans`; `list_item_compliance_details` → `fbaInbound_listItemComplianceDetails`; `list_offer_metrics` → `replenishment_listOfferMetrics`; `list_offers` → `replenishment_listOffers`; `list_packing_group_boxes` → `fbaInbound_listPackingGroupBoxes`; `list_packing_group_items` → `fbaInbound_listPackingGroupItems`; `list_packing_options` → `fbaInbound_listPackingOptions`; `list_placement_options` → `fbaInbound_listPlacementOptions`; `list_prep_details` → `fbaInbound_listPrepDetails`; `list_return_reason_codes` → `fbaOutbound_listReturnReasonCodes`; `list_shipment_boxes` → `fbaInbound_listShipmentBoxes`; `list_shipment_content_update_previews` → `fbaInbound_listShipmentContentUpdatePreviews`; `list_shipment_items` → `fbaInbound_listShipmentItems`; `list_shipment_pallets` → `fbaInbound_listShipmentPallets`; `list_transportation_options` → `fbaInbound_listTransportationOptions`; `patch_listing` → `listings_patchListingsItem`; `post_content_document_approval_submission` → `aplusContent_postContentDocumentApprovalSubmission`; `post_content_document_asin_relations` → `aplusContent_postContentDocumentAsinRelations`; `post_content_document_suspend_submission` → `aplusContent_postContentDocumentSuspendSubmission`; `put_listing` → `listings_putListingsItem`; `schedule_self_ship_appointment` → `fbaInbound_scheduleSelfShipAppointment`; `search_catalog_items` → `catalogItems_searchCatalogItems`; `search_content_documents` → `aplusContent_searchContentDocuments`; `search_content_publish_records` → `aplusContent_searchContentPublishRecords`; `search_listings_items` → `listings_searchListingsItems`; `search_orders` → `orders_searchOrders`; `search_product_types` → `productTypeDefinitions_searchDefinitionsProductTypes`; `set_packing_information` → `fbaInbound_setPackingInformation`; `set_prep_details` → `fbaInbound_setPrepDetails`; `sp_api_cancel_report` → `reports_cancelReport`; `sp_api_cancel_report_schedule` → `reports_cancelReportSchedule`; `sp_api_create_report` → `reports_createReport`; `sp_api_create_report_schedule` → `reports_createReportSchedule`; `sp_api_get_report_schedule` → `reports_getReportSchedule`; `sp_api_list_report_schedules` → `reports_getReportSchedules`; `sp_api_search_reports` → `reports_getReports`; `update_content_document` → `aplusContent_updateContentDocument`; `update_fulfillment_order` → `fbaOutbound_updateFulfillmentOrder`; `update_inbound_plan_name` → `fbaInbound_updateInboundPlanName`; `update_item_compliance_details` → `fbaInbound_updateItemComplianceDetails`; `update_shipment_name` → `fbaInbound_updateShipmentName`; `update_shipment_source_address` → `fbaInbound_updateShipmentSourceAddress`; `validate_content_document_asin_relations` → `aplusContent_validateContentDocumentAsinRelations`; `vendor_retail_get_purchase_order` → `vendorOrders_getPurchaseOrder`; `vendor_retail_get_purchase_orders` → `vendorOrders_getPurchaseOrders`; `vendor_retail_get_purchase_orders_status` → `vendorOrders_getPurchaseOrdersStatus`; `vendor_retail_get_shipment_details` → `vendorShipments_GetShipmentDetails`; `vendor_retail_get_shipment_labels` → `vendorShipments_GetShipmentLabels`; `vendor_retail_get_transaction` → `vendorTransactionStatus_getTransaction`; `vendor_retail_submit_shipment_confirmation` → `vendorShipments_SubmitShipmentConfirmations`. ## 2026-09-29 — Every Ads tool renamed to match Amazon's own operation names _action_ Every Ads MCP tool is now named after the Amazon Advertising API operation it calls (`ads_` + the operation, or Amazon Ads' own MCP name where one wraps the same call) instead of a generic entity+action shape. A retired name still answers for 90 days with its replacement(s), then it is unknown — update any saved workflows now. v1 entities (each follows query/create/update/delete): `ads_campaigns`→`ads_query_campaign`, `ads_campaigns_create`→`ads_create_campaign`, `ads_campaigns_update`→`ads_update_campaign`, `ads_campaigns_delete`→`ads_delete_campaign`; `ads_ad_groups`→`ads_query_ad_group`, `ads_ad_groups_create`→`ads_create_ad_group`, `ads_ad_groups_update`→`ads_update_ad_group`, `ads_ad_groups_delete`→`ads_delete_ad_group`; `ads_ads`→`ads_query_ad`, `ads_ads_create`→`ads_create_ad`, `ads_ads_update`→`ads_update_ad`, `ads_ads_delete`→`ads_delete_ad`; `ads_targets`→`ads_query_target`, `ads_targets_create`→`ads_create_target`, `ads_targets_update`→`ads_update_target`, `ads_targets_delete`→`ads_delete_target`; `ads_ad_associations`→`ads_query_ad_association`, `ads_ad_associations_create`→`ads_create_ad_association`, `ads_ad_associations_update`→`ads_update_ad_association`, `ads_ad_associations_delete`→`ads_delete_ad_association`. Account & admin: `ads_brand_home`→`ads_get_brands`; `ads_invoices`→`ads_list_invoices`, `ads_get_invoice`; `ads_localization`→`ads_get_localized_currencies`, `ads_get_localized_products`, `ads_get_localized_keywords`, `ads_get_localized_targeting_expression`; `ads_metadata`→`ads_product_metadata`; `ads_store_insights`→`ads_get_asin_engagement_for_store`, `ads_get_insights_for_store_api`; `ads_stores`→`ads_list_assets`; `ads_validation_configs`→`ads_get_campaigns_validation_configs`, `ads_get_targeting_clauses_validation_configs`; `ads_account`→`ads_list_ads_accounts`, `ads_get_ads_account`; `ads_account_create`→`ads_create_ads_account`; `ads_manager_accounts`→`ads_get_manager_accounts`; `ads_manager_accounts_create`→`ads_create_manager_account`; `ads_manager_accounts_associate`→`ads_associate_accounts`; `ads_manager_accounts_disassociate`→`ads_disassociate_accounts`; `ads_streams`→`ads_list_stream_subscriptions`, `ads_get_stream_subscription`; `ads_streams_create`→`ads_create_stream_subscription`; `ads_streams_update`→`ads_update_stream_subscription`. Budgets: `ads_budget_rules_recommendation`→`ads_get_budget_rules_recommendation`; `ads_sb_budget_recommendations`→`ads_sb_get_budget_recommendations`; `ads_sp_initial_budget_recommendation`→`ads_get_budget_recommendation`; `ads_budget_rules`→`ads_get_budget_rules_for_advertiser`, `ads_get_budget_rule_by_rule_id_for_campaigns`, `ads_get_campaigns_associated_with_budget_rule`, `ads_list_associated_budget_rules_for_campaigns`; `ads_budget_rules_create`→`ads_create_budget_rules_for_campaigns`; `ads_budget_rules_update`→`ads_update_budget_rules_for_campaigns`; `ads_budget_rules_associate`→`ads_create_associated_budget_rules_for_campaigns`; `ads_budget_rules_disassociate`→`ads_disassociate_associated_budget_rule_for_campaigns`; `ads_budget_usage`→`ads_campaigns_budget_usage`, `ads_portfolio_budget_usage`. Reports: `ads_create_report`→`ads_create_async_report`; `ads_get_report`→`ads_get_async_report` (the bare names are reserved for a future contract). SB/SD recommendations: `ads_sb_bid_recommendations`→`ads_get_bids_recommendations`; `ads_sb_keyword_recommendations`→`ads_get_keyword_recommendations`; `ads_sd_bid_recommendations`→`ads_get_target_bid_recommendations`; `ads_sd_budget_recommendations`→`ads_get_sd_budget_recommendations`; `ads_sd_targeting_recommendations`→`ads_get_target_recommendations`. SP analytics: `ads_sp_brand_metrics`→`ads_generate_brand_metrics_report`, `ads_get_brand_metrics_report`; `ads_sp_export`→`ads_campaign_export`, `ads_ad_group_export`, `ads_target_export`, `ads_ad_export`, `ads_get_export`; `ads_sp_history`→`ads_get_history`; `ads_sp_insights`→`ads_insights_get_audiences_overlapping_audiences`; `ads_sp_rule_events`→`ads_sp_get_all_rule_events`; `ads_sp_bid_rules`→`ads_search_optimization_rules`; `ads_sp_bid_rules_create`→`ads_sp_create_optimization_rules`; `ads_sp_bid_rules_update`→`ads_sp_update_optimization_rules`; `ads_sp_bid_rules_pause`→`ads_sp_update_optimization_rules` (send `status: PAUSED` yourself); `ads_sp_bid_rules_associate`→`ads_associate_optimization_rules_to_campaign`; `ads_sp_campaign_optimization`→`ads_get_optimization_rule_eligibility`, `ads_get_rule_notification`, `ads_get_campaign_optimization_rule`; `ads_sp_campaign_optimization_create`→`ads_create_optimization_rule`; `ads_sp_campaign_optimization_update`→`ads_update_optimization_rule`; `ads_sp_campaign_optimization_delete`→`ads_delete_campaign_optimization_rule`; `ads_sp_campaign_recommendations`→`ads_list_recommendations`; `ads_sp_campaign_recommendations_apply`→`ads_apply_recommendations`; `ads_sp_campaign_recommendations_update`→`ads_update_recommendation`. SP campaigns: `ads_sp_bid_recommendations`→`ads_get_theme_based_bid_recommendation_for_ad_group_v1`; `ads_sp_budget_recommendations`→`ads_sp_get_budget_recommendations`; `ads_sp_category_refinements`→`ads_get_refinements_for_category`; `ads_sp_category_suggestions`→`ads_get_category_recommendations_for_asins`; `ads_sp_product_suggestions`→`ads_sp_get_product_recommendations`; `ads_sp_recommendations`→`ads_get_ranked_keyword_recommendation`; `ads_sp_negative_brands`→`ads_get_negative_brands`, `ads_search_brands`; `ads_sp_portfolios`→`ads_list_portfolios`; `ads_sp_portfolios_create`→`ads_create_portfolio`; `ads_sp_portfolios_update`→`ads_update_portfolio`. ## 2026-09-10 — One Credits pool for every AI action; credits_quote; the model route is set on the Dashboard _changed_ Images, listing copy, small text calls and Buyer insights are all paid from one prepaid Credits balance (1 credit = $1): an image costs 0.5 credits up to 1024 px and 1 above, listing copy 0.1 per language, a small text call 0.1, a Buyer insights report 0.5 — held before the call and refunded whenever it fails. New `credits_quote` returns the price of an action on your current model route before you run it, and `get_user_context.credits` carries the balance, the route and its rate card. The route itself is chosen once on the Dashboard and every surface follows it: `set_llm_route` and the per-call `route` argument are gone. ## 2026-08-07 — Ads entity management is now v1-only; 21 legacy tools retired _changed_ Campaigns, ad groups, ads, and targets (keywords, product targets, and every negative flavor) are managed exclusively through the unified v1 tools — `ads_campaigns`, `ads_ad_groups`, `ads_ads`, `ads_targets` — one consistent shape across SP/SB/SD. The 21 per-product CRUD tools (`ads_sp_campaigns`, `ads_sb_keywords`, `ads_sd_targets`, …) are retired. `ads_sp_bulk_create` now takes a v1-native spec with strict validation: a malformed payload is rejected whole with the exact field path before anything is created, and duplicate campaign names or unresolvable ASINs reject the request before any mutation. ## 2026-08-06 — Budget tools: live usage, rules automation, smarter recommendations _new_ Four new tools complete the Budgets family. `ads_budget_rules` automates daily-budget raises for SP/SB/SD — on a schedule, during Amazon shopping events, or while a performance metric beats a threshold. `ads_budget_rules_recommendation` lists upcoming events with a suggested increase, `ads_sb_budget_recommendations` adds SB missed-opportunity estimates, and `ads_sp_initial_budget_recommendation` suggests a starting budget before a campaign exists. Pair them with `ads_budget_usage` to see intraday consumption before touching any budget. ## 2026-08-05 — MCP SDK 2.0 & per-key scopes _changed_ The server now speaks MCP protocol revisions 2025-11-25 and 2026-07-28. API keys carry their own scope — open or restricted store lists, plus SP/Ads read-vs-write — and `get_user_context` reports `scope_source` and `api_key_name` so your AI knows exactly what the acting key can do. ## 2026-08-02 — Store references now require a marketplace _action_ Pass `MYSTORE-AE`, not `MYSTORE`. A bare store name is rejected — the error lists every ref that would have worked, so your AI self-corrects in one step. `get_user_context` returns ready-made `store_refs`; pass one verbatim. Stores whose every marketplace is inactive on your plan are refused with clear remedies instead of answering from frozen data. ## 2026-07-27 — Image Library _new_ Browse confirmed and staged AI images per store at /studio/library — parent-SKU folders, version history, and inline assign-to-slot for staged drafts. ## 2026-07-26 — Generated images delivered via CDN _changed_ `generate_image` / `edit_image` now deliver to `cdn.sellersheetai.com` and return a `cdn_url`. Google Drive delivery is retired. `store`, `sku` and `slot` are required so every image lands in your store's library. ## 2026-07-22 — noon.com toolset _new_ 36 tools for selling on noon (UAE, Saudi Arabia, Egypt): catalog & content, pricing, stock, FBN inbound shipments, reports and cross-border — the same natural-language workflow as Amazon. ## 2026-07-17 — SellerSheet Skills plugin _new_ One plugin install for Claude Code and Codex registers the MCP server automatically (browser OAuth, no key) and adds nine production skills — sheet building, operator dashboards, report querying, listing images, Amazon Ads, Data Kiosk, and noon reports. `/plugin marketplace add sellersheetai/sellersheet-skills` — see the repo. ## 2026-06-25 — sync_listings removed _removed_ Use `search_listings_items` + `get_listing` instead — same data, clearer semantics. # Send to Amazon from Google Sheets: an FBA shipment, plan to box labels (https://sellersheetai.com/blog/fba-send-to-amazon-in-google-sheets) > Walk one Send-to-Amazon inbound shipment through Google Sheets with the SellerSheet sidebar — set up addresses and products once, create the plan, compare placement and carrier quotes, confirm, print box and FNSKU labels, and track it to check-in. Both Box First and Split First. Creating an FBA inbound shipment in Seller Central takes a tour of pages: the ship-from address, products one by one, box dimensions, a carrier, then the labels. The next shipment, you do it all again. SellerSheet runs the whole **Send to Amazon (STA)** workflow in Google Sheets. Addresses and products are entered once; after that every plan is: add a row → click a button → compare the quotes in the sheet → confirm. This post walks one shipment through in order: set up the address and products → create the plan → compare placement and carrier quotes → confirm → get box and FNSKU labels → track it. ## First, pick a mode: box first or split first [#first-pick-a-mode-box-first-or-split-first] The mode is the **Fulfillment Split** dropdown on Manage Shipments. It cannot be changed afterwards — a wrong pick means Cancel Plan and a new row. | Mode (as in the dropdown) | For | You do first | Amazon does first | Tab / sidebar menu | | ------------------------------------ | -------------------------------------- | ------------------------------- | ------------------------------------------------------ | ------------------ | | **Box First, Split Later** | Small parcel (SPD), box contents known | Enter each box | Then splits the boxes across fulfillment centers | `STA-BoxFirst` | | **Split First (Only for truckload)** | LTL / FTL freight | Enter each SKU's total quantity | Splits the goods into shipments; you pack per shipment | `STA-SplitFirst` | **Each sidebar menu's buttons run only on the tab of the same name**: an `STA-BoxFirst` button clicked on an `STA-SplitFirst` tab is refused, and the message says which menu and tab to use. ## Input rules that prevent half the errors [#input-rules-that-prevent-half-the-errors] The sheet is read by a program, so **type every symbol with a half-width (English) keyboard**. | Input | Write it as | Common mistakes | If it's wrong | | ----------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | Box Dimensions | `50x30x30` (lowercase `x`, L×W×H) | full-width digits, `50cm x 30 x 30`, only two parts | `"Box Dimensions" must be LxWxH …`. Uppercase `X`, `×` and `*` are accepted too, but digits must be half-width | | Box No. | `1`, `1~5` (half-width `~`) | full-width `~`, `1-5` | `Invalid box number format` | | Dates | `2026-09-25` (`YYYY-MM-DD`), or a date cell the sheet recognizes | `2026.09.25` | `… is not a valid date`; a past date gets no transportation options from Amazon | | Store | `myStore-US` (store name - country code) | `myStore_US`, `myStore US` | `Store not found` | | Declared Value (pallets only) | `1000` (a plain number, USD) | `$1000`, `1000 USD`, `1,000` | `Declared Value must be a plain number in USD` | | Pallet Info (pallets only) | one pallet per line: `100x100x150x300x1 STACKABLE` (LxWxHxWeightxQty + `STACKABLE` / `NON_STACKABLE`) | `×` separators, missing `STACKABLE` | `expected LxWxHxWeightxQty …` | | Dropdown cells | Pick from the dropdown | typing `yes`, a misspelled code | a red warning corner; Amazon may reject the value | <Callout title="In one line"> Lowercase `x` in dimensions, `~` for box ranges, `YYYY-MM-DD` for dates, plain numbers for money. </Callout> ## Setup: one workbook, four tabs [#setup-one-workbook-four-tabs] Before you start: your store is connected to SellerSheet, the SellerSheet sidebar is installed in Google Sheets (Extensions → SellerSheet → Open Sidebar), and the seller account has FBA. The first time the sidebar opens, SellerSheet creates the **FBA workbook** (`SellerSheet FBA`) in Drive › `SellerSheet` › `Shipment`. Under **FBA & Logistics** (the truck icon) the sidebar has four menus: **Inventory Health**, **Manage Shipments**, **STA-BoxFirst** and **STA-SplitFirst**; Resources at the top links the FBA workbook and the Drive shipment folder. Hover any button and its tooltip says what it reads, where it writes and what it needs first. <img alt="The FBA workbook's Manage Shipments tab with the sidebar's FBA & Logistics panel; a red arrow points at Create STA SS" src="__img0" /> <p className="blog-caption"> Manage Shipments is the register across plans: every plan starts as a row here. </p> | Tab | What it holds | How often | | -------------------- | ------------------------------------------------------------------------------------------------ | ------------------- | | **Shipment Setting** | Ship-from address book, one warehouse per row; its **Warehouse Code** (e.g. `CN-WH1`) is the key | Once per warehouse | | **Product Info** | Product catalog: SKU, FNSKU, Qty/Box, box dimensions, box weight, prep defaults, image URL | Once per SKU | | **Inventory Health** | FBA inventory health | Refresh when needed | | **Manage Shipments** | One row per shipment | A new row per plan | **Fill Product Info fast:** on Inventory Health, pick the store in A4 and click Inventory Health › **Refresh Data** in the sidebar — every active SKU's image, SKU, FNSKU, ASIN and title land in the sheet. Copy them to Product Info and add the box details. Write Image URL as a plain `https://` link, not `=IMAGE()`. ## Create a plan [#create-a-plan] Add a row on Manage Shipments and fill the ✎ columns: * **Store** (`myStore-US`), **Warehouse Code** (already in Shipment Setting), **Plan Name** (shown in Seller Central; the plan workbook is named after it). * **MSKUs**: the SKUs to send, **one per line** in the cell (Alt+Enter). * **Fulfillment Split**: the mode, above. * **Case Packed**: `YES` = factory cartons; `NO` = mixed or uneven boxes. * **Ship Date** (today or later) and **Delivery Window Start Date**, both `YYYY-MM-DD`. Plan Folder, Plan ID, Shipment ID, FBA ID and the other columns are written by SellerSheet — leave them empty. Select the row and click **Manage Shipments › Create STA SS**. SellerSheet: 1. Checks the required fields and that every MSKU has a Product Info row (Box First also needs complete box details), and tells you what is missing. 2. Copies the `STA-BoxFirst` or `STA-SplitFirst` template into a new **plan workbook** named after the Plan Name. 3. Creates `SellerSheet › Shipment › store › country › year › month › plan folder` in Drive and puts the workbook there; box-label PDFs go there later. 4. Turns **Plan Folder** into a link to that folder and **Plan Name** into a link to the workbook, then opens it (if the browser blocks the pop-up, click **Open STA** in the notification). Every later button is clicked on the plan workbook's STA tab. Clicking Create STA SS again on the same row does not create a second workbook. ### The STA tab [#the-sta-tab] <img alt="The STA-BoxFirst tab: the progress bar with all four steps DONE, the plan parameters on row 9, status and totals on row 12, the boxes from row 14" src="__img1" /> <p className="blog-caption"> A confirmed STA-BoxFirst: progress, plan parameters, automatic totals and the boxes, each in its own band. </p> * **PROGRESS (rows 4–6)**: the step names, their state (green `DONE` / yellow `READY` / red `CANCELLED`) and the Amazon ID each step produced; when you need to choose, row 6 shows a dropdown. * **① PLAN ✎ and ② LOGISTICS & PACKING ✎ (row 9)**: store, plan name, ship date, ship-from address (a warehouse-code dropdown), Case Packed, Pallet Packed, units, preferred carrier, and the two label sizes — **L9 FNSKU label** (`30x40 mm` / `50x30 mm` / `60x40 mm`) and **M9 box label** (`100x150 mm` = Amazon's page as is; `100x100 mm` = just the square at the top of each page, complete and never scaled). * **③ STATUS & TOTALS (row 12, automatic)**: status, FBA ID, reference ID, destination, total units, boxes, weight and volume. * **Detail (from row 14)**: boxes for Box First, SKU totals for Split First. ## Mode A: box first (STA-BoxFirst) [#mode-a-box-first-sta-boxfirst] ### Enter the boxes [#enter-the-boxes] One row per box group × product: **Box No.**, **MSKU** (image, FNSKU, title and ASIN fill in), **Qty/Box**, **Box Dimension**, **Box Weight**; the box count and total units are computed. **Case Packed (F9)** decides where the last three come from: with `YES` they come from Product Info; with `NO` you type what is actually in each box. Either way, **rows that share a box number must carry the same dimensions and weight** — those describe the whole box. The rule: **a box range means those boxes are identical; several rows with one box number mean that box holds several products**. Number boxes from 1 to the last one without gaps. Three examples: **Example 1 · one product per box (Case Packed = YES)**: box 1 holds SKU1, boxes 2–5 hold SKU2. | Box No. | MSKU | Qty/Box | Box Dimension | Box Weight | Boxes (auto) | Total QTY (auto) | | ------- | ---- | ------- | ------------- | ---------- | ------------ | ---------------- | | `1` | SKU1 | 40 | 50x50x40 | 15 | 1 | 40 | | `2~5` | SKU2 | 30 | 40x40x40 | 10 | 4 | 120 | **Example 2 · two products per box, every box the same (Case Packed = YES)**: five boxes of SKU1 ×20 + SKU2 ×10. One row per product, both with box number `1~5` and the whole box's dimensions and weight. | Box No. | MSKU | Qty/Box | Box Dimension | Box Weight | Boxes (auto) | Total QTY (auto) | | ------- | ---- | ------- | ------------- | ---------- | ------------ | ---------------- | | `1~5` | SKU1 | 20 | 40x40x30 | 12 | 5 | 100 | | `1~5` | SKU2 | 10 | 40x40x30 | 12 | 5 | 50 | **Example 3 · every box different (Case Packed = NO)**: boxes 1–2 mixed, box 3 a single product, boxes 4–5 another, box 6 the remainder. | Box No. | MSKU | Qty/Box | Box Dimension | Box Weight | Boxes (auto) | Total QTY (auto) | | ------- | ---- | ------- | ------------- | ---------- | ------------ | ---------------- | | `1~2` | SKU1 | 30 | 50x50x40 | 20 | 2 | 60 | | `1~2` | SKU2 | 20 | 50x50x40 | 20 | 2 | 40 | | `3` | SKU1 | 40 | 50x50x50 | 24 | 1 | 40 | | `4~5` | SKU2 | 30 | 30x30x40 | 9 | 2 | 60 | | `6` | SKU1 | 12 | 50x50x40 | 7 | 1 | 12 | ### Click the buttons in order [#click-the-buttons-in-order] | Step | Button | What it does | | -------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | **Initiate Plan** | Creates the inbound plan from row 9 and the boxes, and fetches the packing options; a single option is confirmed at once. With several, pick one in progress cell 1b and click **Confirm Pack** | | 2 | **Gen Placement Opts.** | Fetches Amazon's placement options and fees into **STA-Options**; pick one in the dropdown of progress cell 2 | | 3 | **Gen Trans. Opts.** | Fetches transportation options (partnered or your own carrier) for every option's shipments into STA-Options; **pick one per shipment there**. Pallets need their three fields first — see below | | 3b | **Gen Delivery Window** | Only with your own carrier: fetches delivery windows; pick one per shipment in STA-Options | | 4 | **Confirm Shipment** | **Books the shipment with Amazon.** FBA ID, reference ID and destination are written back to the STA tab and STA-Options, Manage Shipments gets one row per shipment, and the final packing list **Inbound PL** is created | | 5 | **Get Ref. ID** / **Get FBA Box Labels** / **Get FNSKU Labels** | Refresh reference IDs (they can take 5–10 minutes after confirming); fetch box-label PDFs into the plan folder; build FNSKU item labels and open them for printing | | Any time | **Cancel Plan** | Cancels the plan with Amazon and marks the steps `CANCELLED`; the same workbook can take the next plan | In step 2 each dropdown item reads "option ID (placement fee · destination)": <img alt="The placement dropdown in progress cell 2: four options, each with its placement fee and destination" src="__img2" /> <p className="blog-caption"> Placement fees run from 0 to 300 USD; the free option usually means more destinations. </p> ## Mode B: split first (STA-SplitFirst, truckload) [#mode-b-split-first-sta-splitfirst-truckload] <img alt="The STA-SplitFirst tab: all six steps DONE, and a detail table of only MSKU and Total Qty" src="__img3" /> <p className="blog-caption"> Split First takes only each SKU's total; packing comes after Amazon has split the shipments. </p> The detail table takes just **MSKU** and **Total Qty** (plus expiration and label / prep owners when needed). The buttons, in order: 1. **Initiate Plan**: creates the plan and fetches the placement options **right away** into STA-Options and progress cell 2. 2. **Confirm Placement**: confirms the option you picked and creates **STA-Pack**, one packing block per shipment. 3. Pack in STA-Pack, then click **Set Box Info** to send the boxes. 4. **Gen Trans. Opts.**: transportation options for the confirmed option's shipments (pallets: fill the three fields first). 5. **Gen Delivery Window**: only with your own carrier. 6. **Confirm Shipment**: books it. Labels, FNSKU labels and Cancel Plan work as in Box First. ### Filling STA-Pack [#filling-sta-pack] <img alt="STA-Pack: the per-shipment × SKU allocation and the per-SKU check on top, the box entry below" src="__img4" /> <p className="blog-caption"> Packed Qty turns green when exactly packed, yellow when short, red when over. </p> * **① ALLOCATION (automatic)**: one row per shipment × MSKU, with destination, planned and packed quantities. * **② PER-SKU CHECK (automatic)**: each SKU's planned and packed totals. * **③ BOX ENTRY**: yours to fill. One row per shipment × MSKU is ready; **Box No** starts at 1 within each shipment (e.g. `1~2`), and you can insert rows for other box types. Rows with `Case Packed = NO` also need Qty/Box, dimensions and weight. When everything is green, click Set Box Info. ## Compare prices in STA-Options [#compare-prices-in-sta-options] STA-Options is the comparison page for both modes: a summary with one row per placement option on top, then one block per option with a row per shipment. A placement option uses one kind of carrier, so each option gets two comparable totals instead of one mixed number: * **Total (Partnered)** = placement fee + the Amazon-partnered (`AMAZON_PARTNERED_CARRIER`) fees you **picked** on its shipment rows. * **Total (Own)** = placement fee + your own freight estimate (`USE_YOUR_OWN_CARRIER`). The lowest cell in each column turns green: compare across options, and within one option whether Amazon's carrier or your own is cheaper. <img alt="The STA-Options summary: four placement options with placement fee, transportation fee, own-freight estimate and the two totals, lowest in green" src="__img5" /> <p className="blog-caption"> With Amazon's carriers option 2 is cheapest (1,017); with your own freight, option 4 — five destinations — wins (508). </p> **Partnered quotes are in the dropdown.** After Gen Trans. Opts., each item in a shipment row's **Transportation Option** dropdown reads "option ID (carrier type - mode - carrier - price USD)". The one you pick becomes the Transportation Fee and adds up into Total (Partnered). <img alt="The Transportation Option dropdown: one own-carrier item, then Amazon-partnered air small-parcel and ocean LCL quotes" src="__img6" /> <p className="blog-caption"> For one shipment, partnered air small-parcel and ocean LCL quotes sit in a single dropdown. </p> **Your own freight takes a rate.** Own-carrier items carry no price: type your forwarder's **Rate/kg ✎** (or **Rate/m³ ✎**) on the shipment row and **Est.** computes the freight from that row's weight or volume, adding up into Total (Own). A few rules: * **Small parcel with Amazon's carrier needs one carrier for every shipment in the option**: pick the first shipment's, then click **Match Carriers** to align the rest. With your own carrier, shipments may differ. * **Your own carrier also needs a delivery window** (click Gen Delivery Window first), or Confirm is refused. * Once decided, pick the option in progress cell 2, choose the matching transportation option on each of its shipment rows, and click Confirm Shipment. ### Pallets: three fields before the quotes [#pallets-three-fields-before-the-quotes] With **Pallet Packed = YES** on row 9, fill three fields on every STA-Options shipment row **before** Gen Trans. Opts., or Amazon returns only parcel-style options and no LTL / FTL quote: | Column | Format | Example | | -------------- | -------------------------------------------------------------------------------------------------- | ----------------------------- | | Declared Value | A plain number (USD) | `1000` | | Freight Class | Dropdown `FC_50` … `FC_500` (NMFC class: the lower the density, the higher the class and the rate) | `FC_50` | | Pallet Info | One pallet per line: `LxWxHxWeightxQty STACKABLE` or `NON_STACKABLE` | `100x100x150x300x1 STACKABLE` | All three or none on a row. ### The destination you want isn't offered? [#the-destination-you-want-isnt-offered] Placement options **expire** (the date is in the note on step 2 of the STA tab). Before then, Gen Placement Opts. returns the same set and no new destinations. For a new set, **Cancel Plan** and start again: Box First is Initiate Plan → Gen Placement Opts.; Split First is just Initiate Plan. ## After confirming: labels, packing list, tracking [#after-confirming-labels-packing-list-tracking] Once you click Confirm Shipment: * **Box labels**: when Amazon returns them at once, the **FBA ID in STA-Options becomes a link to the PDF**; otherwise click **Get FBA Box Labels**. The PDF is cropped to M9's size and saved to the plan folder. Only shipments without a link are fetched — to fetch again, delete the link and click. * **FNSKU labels**: **Get FNSKU Labels** makes one per unit (Qty/Box × boxes) at L9's size. * **Inbound PL**: the final packing list, one row per box × SKU with image, box ID, FNSKU, MSKU, ASIN, quantity, weight and dimensions — for packing and the warehouse hand-off. <img alt="Inbound PL: five boxes, one row each, with box ID, FNSKU, MSKU, ASIN, quantity, weight and dimensions" src="__img7" /> <p className="blog-caption"> Inbound PL is sorted by box ID, ready to print for the warehouse. </p> Back on the FBA workbook's **Manage Shipments**, your row is shipment 1 and each further shipment gets its own row, with Plan Folder, Plan ID, Shipment ID, FBA Label (the PDF) and FBA ID filled in. **Carrier** is filled from the chosen option and can be edited for your own carrier; **Tracking** takes the tracking numbers in box order, comma-separated. <img alt="Manage Shipments after confirming: two plans with plan folder, plan ID, shipment ID, box-label PDF link and FBA ID" src="__img8" /> <p className="blog-caption"> A box-first and a split-first plan, both confirmed, in one register. </p> Then **Manage Shipments › Refresh Shipment** pulls the status of every open shipment from Amazon and colors it: `UNCONFIRMED → WORKING → READY_TO_SHIP → SHIPPED → IN_TRANSIT → DELIVERED → CHECKED_IN → RECEIVING → CLOSED` (or `CANCELLED` / `ABANDONED` / `DELETED`). ## Messages you may see [#messages-you-may-see] | Message | Why | What to do | | ---------------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------- | | `This button belongs to the STA-BoxFirst menu …` | A button from the other mode's menu | Switch to the matching tab, or use the matching menu | | `Pick a placement first …` | No placement option chosen in step 2 | Pick one in the dropdown on progress row 6 | | `Run "3b. Gen Delivery Window" first …` | Own carrier chosen, no delivery window yet | Click Gen Delivery Window, then pick a window in STA-Options | | `Transportation option is required for shipment …` | A shipment has no transportation option | Pick one on that STA-Options row, or use Match Carriers | | `Pallet Packed is YES — fill Declared Value + Freight Class + Pallet Info …` | A pallet plan missing its three fields | Fill them on every shipment row, then Gen Trans. Opts. | | `Ship Date … is in the past …` | The ship date has passed | Use today or later | | `Invalid box number format: …` | A full-width `~` or a `-` in a box number | Use a half-width `~`, e.g. `1~5` | | `All N shipment(s) … already have a label link …` | Every label is already fetched | To fetch again, delete that FBA ID link and click | | `Labels fetched … saved to Drive for 0/N` | Labels came back but could not be saved to the plan folder | Check the plan workbook is in its Drive folder and you can write there | | `Can't confirm again` / `Shipment has status CANCELLED` | The plan is already confirmed or cancelled | Start a new plan (in the same workbook, Cancel Plan first) | | `Store not found` | Store not connected, or written wrong | Use `store-country code` and check the connection | From plan to box labels, every choice and every quote stays in the sheet: the next shipment is a copied row with new quantities and the same buttons. The column-by-column reference is in the guide below. # Let AI manage every dollar of ad budget (https://sellersheetai.com/blog/amazon-ads-budget-tools) > Check live Amazon ad budget consumption, get Amazon's own budget recommendations, and set rules that raise budgets automatically for Prime Day or when performance is good — run by an AI assistant, reviewed in your Google Sheet. SellerSheet's budget tools let your AI assistant see how much of today's budget is already spent, pull Amazon's own budget recommendations, and set rules that raise budgets automatically during shopping events or while performance stays good. You don't learn any API — you say what you want in plain language, and every change is written to your Google Sheet for you to approve. Works with **SP · SB · SD** — Sponsored Products · Brands · Display. [Read the step-by-step guide](/guides/automate-amazon-ads-budgets-in-google-sheets) · [Connect your AI client](/guides/connect-sellersheet-mcp) ## Five tools, one job each [#five-tools-one-job-each] Each tool shows the ad types it supports and the access it needs. ### Live budget usage [#live-budget-usage] `ads_campaigns_budget_usage` / `ads_portfolio_budget_usage` — SP · SB · SD · Portfolios — **Read-only** How much of today's budget is already spent, and which campaigns are about to stop serving. This is live intraday data that daily reports cannot give you — check it before you touch any budget. * Up to 100 campaigns (or portfolios) per check. * Returns the percentage consumed, the budget it is measured against, and the time Amazon last evaluated it — the figure is fresh, not second-by-second. * A portfolio only reports a meaningful percentage when it has a budget cap. <img alt="An AI assistant checks today's budget usage for myStore-US: three campaigns are above 88 % at 2:40 pm, next to Amazon's suggested budget and the sales they missed in the last 7 days" src="__img0" /> <p className="blog-caption"> One question, two read-only calls: live usage for 42 campaigns and Amazon's own suggestion for the six that are running hot. </p> ### Budget rules (automatic increases) [#budget-rules-automatic-increases] `ads_get_budget_rules_for_advertiser` / `ads_create_budget_rules_for_campaigns` — SP · SB · SD — **Changes need write access** Set a rule that raises a campaign's daily budget by a percentage — over a date range, during an official Amazon shopping event, or while a performance metric beats your threshold. One rule can serve many campaigns, and the budget reverts on its own when the window closes. * Viewing rules needs read access; creating, changing or attaching them needs Ads write access. * Up to 25 rules per request; increases are percentages only. * Amazon has no delete — to stop a rule, pause it or detach it from the campaign. ### Shopping-event suggestions [#shopping-event-suggestions] `ads_get_budget_rules_recommendation` — SP · SB — **Read-only** Amazon lists the shopping events coming up for your campaign — the event, its dates, and the increase it suggests. Turn a suggestion straight into a rule and your budget is ready before the traffic arrives. * One campaign per request; the event it returns plugs directly into a new rule. * Sponsored Display has no event suggestions — Amazon does not offer them. For Sponsored Brands they work in the US but are not yet available in some marketplaces (we have confirmed UAE and Australia are not supported). * An empty list simply means no events are coming up — that is normal, not an error. ### Suggested budgets and missed opportunity [#suggested-budgets-and-missed-opportunity] `ads_sp_get_budget_recommendations` / `ads_sb_get_budget_recommendations` / `ads_get_sd_budget_recommendations` — SP · SB · SD — **Read-only** Amazon's own estimate of the impressions, clicks and sales you are forfeiting at your current budget, together with the budget it suggests instead. There is one tool per ad type and the AI picks the right one. * Up to 100 campaigns per request. * Read it next to live usage: a campaign that never reaches its cap does not need a raise, however large the suggestion. ### Starting budget for a new campaign [#starting-budget-for-a-new-campaign] `ads_get_budget_recommendation` — SP — **Read-only** Before the campaign exists, describe the products and targeting and Amazon returns a daily budget that should not throttle delivery in week one — so a new campaign is not starved before it has data. * Sponsored Products only. * Use it as the create-time budget, then watch live usage once delivery starts. ## What works where [#what-works-where] ✓ supported · ◐ some marketplaces only · — not offered by Amazon | Tool | SP | SB | SD | Portfolios | Access | Timing | | ---------------------------------- | -- | -- | -- | ---------- | ------------ | ----------------------------------------- | | Live budget usage | ✓ | ✓ | ✓ | ✓ | Read | Today, live | | Budget rules | ✓ | ✓ | ✓ | — | Read / Write | Starts when its window opens | | Shopping-event suggestions | ✓ | ◐ | — | — | Read | Brands: US yes, UAE and Australia not yet | | Suggested budgets | ✓ | ✓ | ✓ | — | Read | Based on recent delivery | | Starting budget for a new campaign | ✓ | — | — | — | Read | Before you create the campaign | ## Two kinds of rule [#two-kinds-of-rule] Tell the AI which one you want — the difference is what triggers the increase. ### By date or event — `SCHEDULE` [#by-date-or-event--schedule] "From December 1 to 15, raise budget 50%." Or "during Prime Day, raise it 80%." Made for peak season, official events and weekend traffic — the date arrives, the budget goes up, the window ends, it goes back. Works on all three ad types. Event-based rules get their dates from Amazon's shopping-event suggestions. <img alt="A Prime Day rule on one campaign: the daily budget steps from $40 to $72 on July 14 and 15, then returns to $40; below, the rule goes Pending, Active, Ended, Logged" src="__img1" /> <p className="blog-caption"> A schedule rule waits as Pending, raises the budget for the event window only, and hands back the original budget when the window closes. </p> ### By performance — `PERFORMANCE` [#by-performance--performance] "While ACOS stays under 20%, raise budget 25%." The campaign earns its extra budget: when the metric stops qualifying, the increase stops. Amazon measures it over the last 7 days for sellers. Available metrics differ by ad type — Products and Display: ACOS, click-through rate, conversion rate, ROAS. Brands: top-of-search impression share, new-to-brand share, ROAS. ## The routine that works [#the-routine-that-works] Look at the data, then the recommendations, and only then change a budget — the AI follows this order for you. 1. **Check live usage** — find the campaigns about to hit their cap, and the ones that cannot spend what they have. 2. **Compare with Amazon's numbers** — how much is being missed, and what budget does Amazon suggest instead? 3. **Write the plan to your sheet** — the AI writes what it intends to change, and waits for your approval. 4. **Set the rules** — hand the recurring increases (events, peak season, performance thresholds) to budget rules instead of watching them yourself. 5. **Check again while the rule runs** — confirm the extra budget is actually turning into impressions and sales. <img alt="The Budget plan tab of a Google Sheet: the AI's proposed budgets and rules per campaign, Approve checkboxes ticked on three rows marked Waiting for you, and the AI's note explaining a performance rule" src="__img2" /> <p className="blog-caption"> Step 3 in practice: the plan lands in your sheet first. Nothing changes on Amazon until you tick Approve. </p> ## Just say it like this [#just-say-it-like-this] Copy a prompt and swap in your own store — the format is store name and marketplace, like `myStore-US`. <Callout title="Daily check"> "Check today's budget usage for every campaign in myStore-US, flag the ones about to run out, and suggest adjustments using the last 7 days of spend and sales." </Callout> <Callout title="Event prep"> "Which official shopping events are coming up for myStore-US? Using Amazon's suggested percentage, create a budget rule for each of my main campaigns and attach it — write the plan to my sheet first." </Callout> <Callout title="Reward the winners"> "For my bedding Sponsored Products campaigns in myStore-US, add a performance rule: raise budget 25% while ACOS stays under 20%. Show me the plan before you create it." </Callout> <Callout title="New product"> "I'm about to launch an auto-targeting Sponsored Products campaign for B0XXXXXXXX — ask Amazon what daily budget it recommends to start with." </Callout> <Callout title="Is a raise worth it?"> "If I raised budgets on my Sponsored Brands campaigns in myStore-US, how many more impressions and sales would I get? Put each campaign's suggested budget and missed opportunity in a table." </Callout> ## Good to know [#good-to-know] * **Rules only ever raise, never lower.** A rule adds a percentage inside the window you set. Outside that window your original budget applies, untouched — nothing is permanently changed. * **You approve before anything changes.** Viewing usage and recommendations needs only read access. Creating or changing a rule needs Ads write access, and the AI writes its plan to your sheet for approval first. * **A new rule waits — that is normal.** A rule shows as pending until its window opens, and in our live testing it took a few hours past midnight in the marketplace's own timezone to become active. Do not re-create a rule that has not turned active yet on event morning — you would end up with two, and their increases add together. * **A wrong request fails cleanly.** If the AI sends something malformed it is refused before anything changes, with the exact field named — so it corrects itself and retries, instead of leaving a half-applied change on your account. * **Rules are attached one campaign at a time.** Amazon's bulk-attach shortcut is not open to third-party tools — we tested it across three ad accounts and marketplaces. The AI attaches each campaign individually and the result is identical. * **Everything runs on the marketplace's clock.** Budgets reset and rules are evaluated at the start of the day in the ad profile's own timezone — not yours. Worth remembering when you sell in a marketplace hours away from where you sit. ## Put it to work this week [#put-it-to-work-this-week] Connect Claude, ChatGPT or any MCP client to your Amazon account, then ask it to check today's budget usage. The [step-by-step guide](/guides/automate-amazon-ads-budgets-in-google-sheets) walks through every workflow on this page.