query_report_data

Query the synced report warehouse (rpt_* tables) — rows without calling Amazon.

readSellerSheet

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

In an AI client (MCP)

tools/call
{
  "name": "query_report_data",
  "arguments": {
    "store": "myStore-US",
    "tables": [],
    "columns": []
  }
}

From code (Tool API)

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":[]}'
Early access — the Tool API is open on request, contact us.

Arguments

NameTypeDescription
storerequiredstringthe 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.
tablesrequiredobject[]table refs; the first is the primary table.
columnsrequiredobject[]'table.column' strings; '*' = every column of the primary, 'tbl.*' of tbl. Ignored when aggregations is set.
filtersobject[][{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).
joinsobject[][{table: 'rpt_x', on: {primary_col: joined_col}}] — LEFT JOIN on bare column names.
order_byobject[][{column: 'table.col' | aggregation alias, dir: 'asc'|'desc'}]. DESC sorts NULLs last. Required whenever offset > 0, or pages overlap.
limitintegerrows per page, 1–1000 (default 100). Every row enters your context.Default: 100
offsetintegerpass data.next_offset from the previous page.Default: 0
report_datestring'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.
aggregationsobject[][{column: 'table.col', op: 'sum'|'count'|'avg'|'min'|'max', alias}] — the key is op; sort groups with order_by on the alias.
group_byobject[]['table.col', 'rpt_orders.purchase_date:month'] — ':day|week|month|quarter|year' buckets a date; total_count is then the group count.
havingobject[][{column: '<aggregation alias>', op, value}]; op: eq, neq, gt, lt, gte, lte, in.

Result

Every tool answers {notification, data, human_action}; data carries:

  • 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.

On this page

Actions

View as Markdown

Ask an assistant

Ask ChatGPTAsk Claude