Install
openclaw skills install @apiclaw/amazon-keyword-traffic-analysisUse when user asks for keyword expansion or ad keyword filtering; single keyword analysis or keyword deep dive; whether a keyword is worth bidding on; which keywords drive traffic to an ASIN; ASIN keyword health, keyword traffic changes, or why an ASIN changed under a keyword. Supports batch keyword snapshot, multidimensional market profile, trend, and ASIN-keyword timeline workflows. Requires ZOODATA_API_KEY.
openclaw skills install @apiclaw/amazon-keyword-traffic-analysisAmazon keyword research and traffic analysis. Respond in user's language.
| File | Purpose |
|---|---|
{skill_base_dir}/references/reference.md | Load before tool selection; authoritative live-vs-planned endpoint status, batch contracts, exact parameters, response fields, and metric boundaries |
{skill_base_dir}/references/execution-guide.md | Load before any full-mode task — contains input-to-endpoint routing, Evidence Capability Matrix, and full execution protocol |
{skill_base_dir}/references/scenarios-expand.md | Load for keyword expansion output template |
{skill_base_dir}/references/scenarios-keyword-analysis.md | Load for single-keyword analysis output template |
{skill_base_dir}/references/scenarios-reverse-asin.md | Load for reverse ASIN output template |
{skill_base_dir}/references/scenarios-keyword-traffic-diagnosis.md | Load for keyword traffic diagnosis output template |
Required: ZOODATA_API_KEY. Get free key at zoodata.ai/api-keys.
User typically provides one of:
If marketplace is omitted, default to US. Keyword endpoints are keyword-query workflows: treat user-provided terms as search queries/keywords, not category paths or product search substitutes. If a keyword request requires date or dateTo, prefer T-1 or earlier instead of the current date; only use the current date when the user explicitly asks for today's data. In user-facing updates, state the selected marketplace/date without extra rationale unless the user asks why that date was selected.
Keyword demand and ABA-share fields come from Amazon Brand Analytics-derived snapshots; SERP, listing, placement, and ASIN traffic fields come from ZooData observations built around those keywords. Coverage is limited to observed keywords and ASIN placements. An item with status=empty means no matching observation in that snapshot/window, not proven low demand and not an API failure.
ZooData keyword endpoints provide search-demand, SERP, rank, and estimated-impression signals. They do not provide the seller's own ABA Search Query Performance conversion funnel, including ASIN-specific impressions, clicks, cart adds, purchases, conversion rate, or sales share. Therefore, keyword value judgments from this skill are directional prioritization, not 100% proof of commercial value.
ABA-SQP backend location: Brand Analytics -> Search Analytics -> Search Query Performance -> Brand View
Recommended ABA-SQP data provision method:
[Search Funnel - Impressions](https://sellercentral.amazon.com/brand-analytics/metric-glossary?linkedFrom=query-performance-brand-report-table-qp-impressions-group) -> Brand Count, then provide a screenshotBefore writing traffic-related conclusions, identify the current evidence level and keep the reply inside that level:
GO / NO-GO, or profitability claims before the required seller-real evidence is present.current evidence-level conclusion + unresolved decision + required next evidence. Do not surface unrelated unresolved branches merely because later evidence could theoretically enrich them.Use one short, localized Data Notes section near the top to name the current evidence level and conclusion boundary. Do not repeat it near the end and do not scatter the same caveat through individual findings. Use the scenario file to select the next evidence request; do not expose every possible future input at once.
When seller-private ABA-SQP data is present, name the provided fields used, such as impressions, clicks, cart adds, purchases, click share, purchase share, or conversion rate. Avoid deficit-framed wording; describe the next evidence level as the way to make the next decision more product-specific.
Use python {skill_base_dir}/scripts/zoodata.py as the default execution entry.
MANDATORY — tool selection and capability claims must follow this gate:
references/reference.md plus zoodata.py --help / subcommand help| HTTP endpoint path | CLI subcommand | Draft MCP tool name |
|---|---|---|
/openapi/v2/keywords/detail | keyword-detail | mcp__zoodata__openapi_v2_keyword_detail |
/openapi/v2/keywords/market-profile | keyword-market-profile | mcp__zoodata__openapi_v2_keyword_market_profile |
/openapi/v2/keywords/trend-profile | keyword-trend-profile | mcp__zoodata__openapi_v2_keyword_trend_profile |
/openapi/v2/keywords/trend | keyword-trend | mcp__zoodata__openapi_v2_keyword_trend |
/openapi/v2/keywords/extends | keyword-extends | mcp__zoodata__openapi_v2_keyword_extends |
/openapi/v2/keywords/search-results | keyword-search-results | mcp__zoodata__openapi_v2_keyword_search_results |
/openapi/v2/keywords/competitor-product-keywords | keyword-competitor-product-keywords | mcp__zoodata__openapi_v2_keyword_competitor_product_keywords |
/openapi/v2/keywords/product-traffic-terms | keyword-product-traffic-terms | mcp__zoodata__openapi_v2_keyword_product_traffic_terms |
/openapi/v2/keywords/product-traffic-terms-overview | product-traffic-terms-overview | mcp__zoodata__openapi_v2_product_traffic_terms_overview |
/openapi/v2/keywords/product-traffic-terms-timeline | product-traffic-terms-timeline | mcp__zoodata__openapi_v2_product_traffic_terms_timeline |
detail, trend, extends, search-results, both ASIN traffic-list endpoints, and product-traffic-terms-timeline as data endpoints: preserve their items[], rows[], or series[] evidence.market-profile explicitly as a metric-layer endpoint derived from the same weekly snapshot source as the data-layer detail endpoint. Preserve context, per-item status, unavailableReason, marketProfile, and context.scoringSpec; never present scores without the returned scoring model/version/range/reference scope. Current item statuses are available and not_found. Check every scored dimension's supported, calculationStatus, unsupportedReason, level, and levelEvidence.score.{value,direction} independently—there is no aggregate calculationCoverage object. marketCharacteristics.volatility and marketCharacteristics.annualSeasonality are independent evidence objects and must not overwrite each other.trend-profile as the metric layer for weekly demand and ABA-rank trend judgments. Preserve each keyword's rows[] by requested window, status, rowContext, both profile dimensions, and every trendEvidence.value / direction pair. Rows can be available, unavailable, or not_found; do not invent a reason when unavailableReason is null.product-traffic-terms-overview as an aggregate endpoint. The live response is currently the legacy flat overview object with current and *Prev impression points plus first-3-page keyword entry/exit lists; do not assume the planned grouped metric objects exist.search-results-metrics, root-aggregate, product-traffic-term-changes, and product-traffic-terms-timeline-review. These are planned metric endpoints, not currently callable on the verified production surface. Do not invent a separate detail-metrics; market-profile is the metric-layer profile sourced from detail-family snapshot data.trendMetrics, demandLifecycle, competitionMetrics, keywordChanges, or timelineReview as API-returned objects.nextBestCalls, and recommended actions in the Agent/skill layer. Never claim that an API returned a root cause or strategy recommendation.Keep these concepts separate:
market-profile, require status=available before interpreting the profile; status=not_found means the keyword was not observed, not low demand.empty, or a dimension is unsupported, unknown, or unavailable. First determine whether the data layer contains additional—not merely identical upstream—evidence.Apply this gate after endpoint/layer selection:
data.items[] back into global input order.status, retain empty/error items, and continue with successful items.keyword-detail: pass exactly one of --keyword or --keywords "term one,term two"; API fields are keyword / keywords[].keyword-market-profile: use the same single-or-batch subject contract as keyword-detail; up to 20 keywords share the snapshot date, marketplace, and weekly granularity.keyword-trend-profile: use exactly one of --keyword or --keywords plus --date and --window-periods; up to 20 keywords share 1–4 unique windows selected from 4,8,12,26, marketplace, and weekly granularity.keyword-trend: pass exactly one of --keyword or --keywords; all items share dateFrom, dateTo, marketplace, and weekly granularity.product-traffic-terms-timeline: pass one ASIN and exactly one of --keyword or --keywords; up to 20 keywords share the same range and 7-day rolling window.data.items[] input order. Read each item's identity, status, emptyReason, errorCode, errorMessage, and evidence object independently; outer success=true does not mean every item succeeded.status=ok; empty and error items are not billed. Use returned meta.creditsConsumed, never infer charges.If the live session exposes a different name, use that name exactly.
PROHIBITED — never do any of the following:
zoodata.py, and then the live tool surface/schema if neededproducts/search as a substitute for keyword endpoints and label its results as keyword traffic evidencewebtools_search, as a keyword-intelligence endpointCapability signals in live schema: If a tool exposes fields such as estimateSearchCountWeekly, estimateSearchCount, keywordEstimateSearchCount, or abaRank, treat it as having keyword-volume capability even if its name is not explicit.
Tool boundary rules (CRITICAL — do not misclassify):
| Tool | Role | NEVER use it as |
|---|---|---|
/openapi/v2/keywords/* | Keyword intelligence (snapshot, trend, SERP, ASIN traffic) | — |
products/search | Product-database snapshot — broader catalog winners, price-band structure, variant distribution | Keyword SERP evidence, keyword demand proof, or a front-end search interface |
/openapi/v2/webtools/scrape and /scrape-interactive | ZooData page extraction, including rendered or interaction-dependent page content | Keyword snapshot, trend, observed Amazon SERP, traffic, or seller-private data |
/openapi/v2/webtools/search (webtools_search when exposed under that callable name) | ZooData web-search and optional result-page extraction | Keyword snapshot, trend, observed Amazon SERP, traffic, or seller-private data |
ZooData data APIs and ZooData crawler/retrieval APIs are the authorized acquisition channels for this skill. Tool choice may move between these channel types according to the evidence required, but it must not bypass ZooData and access a browser, Amazon page, or public web-search tool directly.
realtime/product for live ASIN/product fields and /openapi/v2/keywords/* for keyword evidence./scrape; use /scrape-interactive only when rendering or page actions are required. Use WebTools /search only when the URL itself must first be discovered. Label all three as crawler/retrieval evidence and keep them within their evidence boundary.These constraints are higher priority than any suggested workflow wording in reference files.
products/search must not be used as a substitute for keyword snapshot, keyword trend, keyword SERP, or reverse-ASIN traffic evidence/openapi/v2/keywords/* endpointkeywords/detail and keywords/search-results must not be used to fabricate reverse-ASIN traffic-source maps when neither ASIN traffic-list endpoint is availablekeywords/trend must not be treated as daily history; keywords/search-results and ASIN keyword endpoints must not be treated as long-retention weekly trend seriesData-backed conclusions require direct support from the endpoint actually designed for that evidence typeInferred conclusions require multiple supporting fields that materially discriminate the explanation from alternatives and must stay within the endpoint boundaryDirectional conclusions may frame validation or monitoring advice, but they do not authorize an action that fails the Evidence-to-Action Authorization Gate and must not be phrased as proven causalityApply this gate to every diagnosis, regardless of scenario or evidence level:
observed fact → identified problem → unresolved question → required discriminating evidence → evidence acquisition → evidence-supported explanation → authorized action
Hard rules:
identified problem + unresolved question + minimum next evidence + decision that remains unresolved. When it is not necessary, answer the supported decision and omit the unresolved explanation.The specificity and consequence of an action must not exceed the specificity and strength of its evidence. Apply this gate separately from confidence labels; cautious wording does not authorize an unsupported action.
Before proposing an action, identify the exact target, whether that target was directly observed at sufficient fidelity, the specific defect signal, material alternative explanations, available validation, and the action's reversibility/impact.
Inspect: allowed when a broad signal identifies a relevant problem domain.Diagnose: allowed when evidence supports multiple bounded hypotheses; retain alternatives and do not select an unproven root cause.Test: requires direct observation of the target, a specific defect hypothesis, a reversible test, and predefined success/failure criteria.Change: requires direct target evidence and stronger validation that distinguishes it from material alternatives.Scale / Stop: requires seller-real outcome evidence and decision thresholds proportionate to the financial impact.Hard rules:
Inspect for that target.consider, possibly, and directionally do not upgrade authorization.observed fact → identified problem → unresolved question → discriminating evidence → evidence-supported explanation → authorized action; never skip evidence acquisition or replace it with generic candidate causes.See references/execution-guide.md § Evidence-to-Action Protocol for the operational checklist and examples.
API Usage; do not omit it even when the user did not ask for it explicitly_query.endpoint and _query.params when returned; otherwise record the ZooData endpoint and request parameters actually invoked. Read meta.creditsConsumed and meta.creditsRemaining when present.API Usage, use a markdown table, not a bullet list; aggregate calls and meta.creditsConsumed by endpoint; include a final Total row that sums calls and credits; use the latest returned meta.creditsRemaining for credits remainingmeta.creditsConsumed or meta.creditsRemaining, write not returned for that field rather than dropping the usage sectionData Notes section near the top that names the evidence level and conclusion boundary. Do not add a duplicated end reminder.keywords/extends uses query, not keywordkeywords/detail resolves to the nearest available weekly snapshot at or before the requested date. keywords/extends uses the latest available weekly snapshot; legacy date is optional and ignored by the service.keyword or query, use the Amazon search query / keyword phrase being analyzeddate or dateTo, prefer T-1 or earlier and avoid using the current date unless the user explicitly asks for today's lookup; do not proactively explain the reason unless askedkeywords/trend is weekly time series, not daily. CLI usage must use full ISO dates with these exact flags: keyword-trend --keyword "small baskets for organizing" --date-from 2026-04-01 --date-to 2026-07-02 --marketplace US; never send truncated dates, ellipses, natural-language dates, reversed ranges, or ranges longer than 93 days.keywords/search-results and ASIN keyword endpoints are recent lately_day observations with lookbackDays=7, not long-retention history. keyword-trend accepts up to 93 days; product-traffic-terms-timeline accepts up to 61 days.keywords/detail returns data.context + data.items[]; an unmatched keyword is an item with status=empty and emptyReason, not a top-level API failure.keywords/market-profile returns data.context + data.items[]; use its server-calculated dimensions as snapshot evidence only. Require status=available, read context.scoringSpec, and inspect each dimension's supported, calculationStatus, unsupportedReason, level, and levelEvidence.score.{value,direction} independently. Treat any unavailable signal as a conclusion boundary. The endpoint does not provide history, recommendations, root cause, or seller-private conversion data. It is currently pre-release on localhost; check the live surface before calling it elsewhere.keywords/extends returns data.context + data.rows[]; an empty rows[] is valid. Try both queryType=phrase and queryType=fuzzy before concluding low expandability.trafficShare is an observed share within the endpoint's sampled window; do not present it as exact Amazon share of voiceexploreType: ORG vs SP vs SB vs SBV vs SPR/openapi/v2/keywords/search-results already returns listing-level product fields and should be the default source for "what products appear on page 1 for this keyword"keywords/market-profile uses marketCharacteristics. Scored dimensions expose levelEvidence.score.value and .direction. Treat volatility.type and annualSeasonality.classification as separate results; never invent peak periods or collapse them into one seasonality label.market-profile batch HTTP 500 is a service failure, not not_found. Do not automatically retry every subject individually. At most one diagnostic split is allowed when isolating the failing subject is necessary; otherwise stop at the failed metric request and report the missing judgment.products/search by default when the user's question is only about the observed keyword SERP; use it only as an optional broader-market supplementproducts/search is our own product-database query result, not Amazon live search results, so never present it as evidence of current SERP ordering/scrape for a known page URL, /scrape-interactive only when rendering/actions are necessary, and /search only to discover URLs; never treat any of them as a substitute for keyword snapshot, trend, observed Amazon SERP, traffic, or seller-private evidence.keywords/product-traffic-terms-overview returns weekly all-keyword impression traffic changes under one ASIN versus the previous period, with placement-level *ImpressionPoint fields and matching *Prev baselines; first3PagesNewOrganicKeywords lists keywords newly entering ORG first three pages, and first3PagesLostOrganicKeywords lists keywords that dropped out; do not treat it as per-keyword daily rank historykeywords/product-traffic-terms-overview, display the returned periodStartDate / periodEndDate as the overview period; do not use the request date or an inferred date range as the period shown in the reportkeywords/product-traffic-terms-timeline returns data.context + data.items[].series[]; interpret each series point's nested groups separately:
keywordMetrics belongs to metricWindow.keywordPeriodStartDate/keywordPeriodEndDateasinSnapshot is the product/listing/rank snapshot on series[].datetraffic, placement, and adActivity describe the 7-day rolling window ending on series[].dateYYYY-MM-DD date strings, required fields, date range order, and endpoint-specific range limits.When ZOODATA_API_KEY is not set, verify with python {skill_base_dir}/scripts/zoodata.py check (credentials-only, no endpoint calls or credit usage; exits non-zero if no key is found in the supported config locations). Then STOP before any endpoint call, direct the user to https://zoodata.ai/en/api-keys, and do not substitute public knowledge, web search, or a boundary-labeled "partial analysis" for missing ZooData evidence.
When the API returns code 401: stop further calls, tell the user the key was rejected, and direct them to https://zoodata.ai/en/api-keys. Do not fabricate missing data.
When the API returns code 402: stop further calls, report partial findings already gathered, estimate remaining credits needed, and direct the user to https://zoodata.ai/en/pricing. Do not fabricate missing data.
Judge each candidate keyword on four dimensions:
| Dimension | What to look at | Interpretation |
|---|---|---|
| Demand | snapshotData.estimateSearchCount, trend series[].estimateSearchCount, ABA rank | Higher demand is better, but only if stable enough |
| Competition | marketProfile difficulty/saturation/ad dimensions when covered; otherwise adCount, adCampaignCount, SERP ad density, head ASIN concentration | Higher competition raises bid difficulty |
| Relevance | seed relation, relevanceScore, SERP title/brand fit | High relevance means better listing/ad fit |
| Accessibility | organic entry room, ad crowding, whether current leaders are entrenched | Indicates whether traffic is realistically capturable |
Important boundary:
These are candidate-validation labels only. They rank which terms deserve seller-funnel validation and must not be presented as final expansion or spend decisions.
Priority test — good balance of demand, relevance, and manageable competitionSelective test — deserves narrow seller-funnel validation; this label does not select an ad group or match typeHarvest — lower demand but strong product relevance; deserves controlled long-tail validation without prescribing bids or match typeObserve only — interesting but not ready for budget allocationAvoid — weak relevance, poor market structure, or no credible entry pathDefend — observed defend posture because the term is already meaningful for traffic or position; not permission to change bids/budgetsExpand — observed expansion-candidate posture with room to improve visibility; not permission to scaleObserve — potentially useful but weak, unstable, or incompleteAvoid — low fit, weak position, or crowded without a clear pathUse the stage-specific structure in execution-guide.md § Evidence-Level Progression and the active scenario's journey/template. Do not force later-stage sections into an earlier-stage reply. Any report that used live API data must still end with API Usage.
Output language MUST match the user's input language. Technical field names and endpoint names may remain in English.
Data is based on ZooData keyword snapshots as of [date]. Weekly search and traffic metrics are sampled observations, not exact Amazon Ads billing data. This analysis is for reference only and should not be the sole basis for business decisions.
Quick-mode lookups follow execution-guide.md § Quick Mode Output and may use a concise inline source/date note instead of this block.
For keyword-value reports, add this note:
ZooData provides estimated exposure/search/visibility signals. State the current evidence level and keep conclusions within that boundary; use the next-step request defined by the conversational evidence ladder.
Rules:
For API Usage format and credit tracking rules, see execution-guide.md § Usage Accounting Rule.
This skill does not provide:
Use the outputs as directional research and combine with ad account data and/or ABA Search Query Performance before final budget decisions.