# Amazon Listing Optimizer - Audit Score, Keyword Gaps & Rewrites (`doesaiknow/amazon-listing-optimizer`) Actor

Paste an ASIN, get a 0-100 listing audit: score with title/bullets/keywords/images breakdown, the high-volume keywords you're missing (with real search volume), a rewritten title and bullets inside Amazon's limits, and the top 3 fixes. One row per ASIN, up to 50 per run. Pay per ASIN, no seat.

- **URL**: https://apify.com/doesaiknow/amazon-listing-optimizer.md
- **Developed by:** [David S](https://apify.com/doesaiknow) (community)
- **Categories:** E-commerce, SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / lite listing audit (per asin)

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Amazon Listing Optimizer / Audit — Score, Keyword Gaps & Rewrites 🛒

**Paste an ASIN and get back a decision, not a data dump: a 0–100 audit score with a
title / bullets / keywords / images breakdown, the high-volume keywords your listing is
missing (with real monthly search volume), a rewritten title and bullet points inside
Amazon's character limits, and the top 3 things to fix first.** One dataset row per ASIN,
up to 50 ASINs per run. Works with n8n, Make, Zapier and AI agents (Claude, ChatGPT)
through the Apify API and MCP.

Most Amazon tools hand you keyword lists or raw scrapes and leave the thinking to you. This
one answers the question a seller actually has: **how good is this listing, what is it
missing, and what exact copy should replace it?**

---

### What you get per ASIN

One dataset row per ASIN. Here is a real one, trimmed for readability:

```json
{
  "asin": "B09B8V1LZ3",
  "marketplace": "amazon.com",
  "mode": "audit",
  "status": "ok",
  "source": "primary",

  "audit_score": 72,
  "audit_breakdown": { "title": 78, "bullets": 65, "keywords": 60, "images": 85 },

  "keyword_gaps": [
    { "keyword": "hot pot electric", "volume": 31000 },
    { "keyword": "phone case magsafe", "volume": 93000 },
    { "keyword": "google home compatible", "volume": 105000 }
  ],

  "current_title": "Electric Hot Pot, 1.5L Portable Non-Stick Cooker",
  "rewritten_title": "Electric Hot Pot 1.5L - Portable Non-Stick Cooker for Ramen, Soup & Pasta, Dual Power, Rapid Boil, Dorm & Travel",

  "current_bullets": [
    "1.5L capacity",
    "Non-stick coating"
  ],
  "rewritten_bullets": [
    "1.5L CAPACITY, COOKS FOR TWO - enough for ramen, soup, oatmeal or pasta without a stove; ideal for a dorm, office or RV.",
    "NON-STICK & EASY TO CLEAN - PFOA-free coating wipes clean in seconds; no scrubbing, no stuck-on residue."
  ],

  "top_actions": [
    "Add 'electric' and capacity to the title - 31k/mo of demand your title never names.",
    "Rewrite bullets as benefit-led lines with keywords; current bullets are 2-4 words each.",
    "Target 'google home compatible' (105k/mo) in bullets or backend if the product qualifies."
  ],

  "cached": false,
  "fetched_at": "2026-07-21T12:00:00Z"
}
````

Field by field:

| Field | What it means |
|---|---|
| `audit_score` | Overall listing quality, **0–100**. A single number to sort a catalogue by |
| `audit_breakdown` | The score split into `title`, `bullets`, `keywords`, `images` — so you know *where* the points are being lost |
| `keyword_gaps[]` | High-demand keywords your listing does not use, each with **real monthly Amazon search volume** (not a guess). Sorted by volume |
| `current_title` / `current_bullets` | What is live on the listing right now |
| `rewritten_title` | A drop-in replacement, **always ≤ 200 characters** (Amazon's title limit) |
| `rewritten_bullets` | Benefit-led bullet points, **each ≤ 250 characters** (Amazon's bullet limit) |
| `top_actions` | Exactly **3** ranked fixes — the highest-leverage changes first |
| `source` | `primary` or `fallback` — which data path answered |
| `status` | `ok`, or `not_found` when the ASIN has no live listing (still a delivered answer) |
| `cached` | `true` when served from the 24-hour cache at no per-row charge |

Every field is present on every row. A `not_found` row carries the same keys with empty
values, so your downstream parser never has to special-case it.

***

### Two modes — full audit and lite

You choose how much to pay per ASIN with the `mode` field.

| | `audit` (default) | `audit_lite` |
|---|---|---|
| Keyword gaps | From our Amazon keyword dataset, **with real search volume** | From your own `keywords` list or Amazon autocomplete (`volume: 0`) |
| Best for | Finding demand you did not know existed | Scoring & rewriting against keywords you already have |
| Price (FREE tier) | **$0.40 / ASIN** | **$0.08 / ASIN** |
| Everything else | Score, breakdown, rewrites, top-3 actions — **identical** | Score, breakdown, rewrites, top-3 actions — **identical** |

Use **`audit`** when you want the tool to discover the high-volume keywords a listing is
missing. Use **`audit_lite`** — about **5× cheaper** — when you already have your keyword
set and just want the score, the rewrites and the priority list. In lite mode the volume
field is `0`, because neither your list nor autocomplete carries volume; everything else is
the same audit.

***

### Pricing — flat per ASIN, not per keyword or per field

| Event | Price (FREE tier) | When it fires |
|---|---|---|
| Actor start | **$0.00**, once per run | Run starts; covers validation and the cache check |
| Audit (full) | **$0.40 per ASIN** | Once per delivered `audit` row |
| Audit (lite) | **$0.08 per ASIN** | Once per delivered `audit_lite` row |

Tiered by your Apify Store tier:

| | FREE | BRONZE | SILVER | GOLD+ |
|---|---|---|---|---|
| Audit (full) | $0.40 | $0.38 | $0.35 | **$0.32** |
| Audit (lite) | $0.08 | $0.075 | $0.07 | **$0.06** |

The score, the full breakdown, every keyword gap, both rewrites and the top-3 actions are
**all included in that one price**. There is no per-keyword fee and no per-field charge.

**You are never charged for:** ASINs that fail upstream · rows served from the 24-hour
cache · runs that stop at your plan's charge cap before doing any paid work. Those cost the
start fee only (which is $0.00).

**You are charged for** an ASIN that returns `not_found`, because "this listing does not
exist / could not be read" is a delivered answer.

#### What it actually costs

| Who | Setup | Runs/month | Monthly total |
|---|---|---|---|
| Single seller | 20 ASINs audited monthly | 1 | **$8.00** |
| Seller, re-audit after edits | 20 ASINs, twice | 2 | **$16.00** |
| Agency, lite scan | 50 ASINs, `audit_lite`, weekly | 4 | **$16.00** |
| Catalogue sweep | 50 ASINs, full audit | 1 | **$20.00** |

There is no seat and no subscription. A one-off catalogue audit of 50 ASINs is a **$20**
line item, not a **$99/month** commitment.

#### How it compares

| | This Actor | Helium 10 | CopyMonkey |
|---|---|---|---|
| Price | **from $0.06 / ASIN** | $99/mo+ (Platinum) | $49–99/mo |
| Commitment | **none — pay per ASIN** | monthly seat | monthly seat |
| Audit score + breakdown | **included** | Listing Analyzer | ✗ |
| Keyword gaps with volume | **included** | Cerebro (separate) | limited |
| Title + bullet rewrites | **included** | Frankenstein/Scribbles | ✓ |
| Output | JSON / CSV / API, schedulable | dashboard-first | dashboard-first |
| Seats | **none — API keyed to your account** | per seat | per seat |

If you live in a suite all day, a subscription is a reasonable purchase. If you want a
listing audit **in your own pipeline** — a sheet, a database, an LLM report, a Slack
message — paying $99/month for a UI you open twice is the expensive option.

***

### How the audit is built (honest scope)

Every audit is grounded in the **live listing fetched at run time** and real keyword
demand — nothing is invented.

- **The listing is read fresh.** `current_title` and `current_bullets` come from the live
  Amazon product page at run time. `fetched_at` records when.
- **Keyword volumes are real, not modelled.** In `audit` mode every `keyword_gaps` entry
  carries an actual monthly Amazon search volume (measured examples from live runs: an
  electric hot pot keyword at **31,000/mo**, a phone-case keyword at **93,000/mo**, a smart-
  home keyword at **105,000/mo**). In `audit_lite` the volume is `0` by design — see above.
- **The score and rewrites come from a language model** reading the listing and the keyword
  gaps. The rewrites are validated against Amazon's limits **on every row**: title ≤ 200
  characters, each bullet ≤ 250 characters, and always exactly 3 `top_actions`.
- **A `not_found` is an answer.** If an ASIN has no readable live listing, the row says
  `status: "not_found"` rather than failing silently. It is delivered and billed like any
  other answer.
- **`source: fallback`.** If the primary data path fails during a run, a secondary one takes
  over so you still get a row. The row records which path answered via `source`.

#### Scope limits in this version

- Up to **50 ASINs per run**.
- `audit` keyword gaps carry real volume; `audit_lite` gaps are `volume: 0`.
- The score is a **relative quality signal**, not a ranking guarantee — use it to
  prioritise which listings to fix, then verify the rewrites before publishing.
- Rewrites are suggestions. **Review them before you paste them into Seller Central** — you
  know your brand voice and compliance constraints; the model does not.

***

### Input

| Field | Required | Default | Notes |
|---|---|---|---|
| `asins` | ✅ | — | Up to 50. 10 characters, e.g. `B08N5WRWNW`. Invalid ones are reported and skipped before anything is billed |
| `mode` | | `audit` | `audit` (full, keyword gaps with volume) or `audit_lite` (cheaper, your keywords / autocomplete) |
| `keywords` | | — | Up to 100. Used only in `audit_lite`; ignored in `audit` |
| `amazonDomain` | | `amazon.com` | Marketplace the listing is scored against |

Minimal input:

```json
{
  "asins": ["B08N5WRWNW"]
}
```

Lite mode with your own keywords:

```json
{
  "asins": ["B08N5WRWNW", "B09B8V1LZ3"],
  "mode": "audit_lite",
  "keywords": ["electric hot pot", "portable cooker", "ramen cooker"]
}
```

***

### Quick start

#### 1. Gather your ASINs

An ASIN is the 10-character identifier in any Amazon product URL:

```
https://www.amazon.com/dp/B08N5WRWNW
                          ^^^^^^^^^^
```

Add up to 50 under **ASINs**. Invalid entries (a full URL, an SKU, a typo) are reported and
skipped — the run does not spend anything on them.

#### 2. Pick a mode

- **`audit`** — the tool finds the high-volume keywords your listing is missing. Start here
  if you want discovery.
- **`audit_lite`** — about 5× cheaper. Supply your own `keywords`; the tool scores and
  rewrites against them. Start here for a bulk quality sweep of a catalogue.

#### 3. Run, read the top 3, act

Each row's `top_actions` lists the three highest-leverage fixes in order. Do those first,
re-run to confirm the score moved, and move to the next listing.

#### 4. Schedule re-audits (optional)

Add an **Apify Schedule** — a monthly cadence matches how often listings meaningfully
change. Re-audit after you edit a listing to confirm the score improved.

***

### Use with AI agents & LLM workflows

The output is shaped for software, not just for reading.

**n8n / Make / Zapier**

1. Trigger → run this Actor with a list of your ASINs
2. Read the dataset
3. Branch on `audit_score < 60` → open a task, or append `top_actions` to a Google Sheet

**AI agents (Claude, ChatGPT) via Apify MCP**

Connect the Apify MCP server and ask directly:

> "Audit these 10 ASINs, then give me only the ones scoring under 60 and their top 3 fixes,
> sorted by how much search volume they're leaving on the table."

Because each row carries `audit_score`, `audit_breakdown` and `keyword_gaps` with volumes,
an agent can prioritise your catalogue **without you writing that logic**.

**LLM reporting**

Feed the dataset to a model and ask for a per-listing action plan. `top_actions` and
`rewritten_*` are already written for exactly that — you can lift them straight into a client
deck.

***

### Recipes

#### Run it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/doesaiknow~amazon-listing-optimizer/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "asins": ["B08N5WRWNW", "B09B8V1LZ3"], "mode": "audit" }'
```

Fetch the results:

```bash
curl "https://api.apify.com/v2/acts/doesaiknow~amazon-listing-optimizer/runs/last/dataset/items?token=$APIFY_TOKEN&format=json"
```

Add `&format=csv` for a spreadsheet, or `&clean=true` to drop empty fields.

#### Flag the listings worth fixing first

```js
const items = await fetch(datasetUrl).then(r => r.json());

const worst = items
  .filter(r => r.status === "ok" && r.audit_score < 60)
  .sort((a, b) => a.audit_score - b.audit_score)
  .map(r => `${r.asin} scored ${r.audit_score}: ${r.top_actions[0]}`);

if (worst.length) await notifySlack(worst.join("\n"));
```

#### Total the demand you are missing

```python
import requests

items = requests.get(DATASET_URL).json()

for row in items:
    if row["status"] != "ok":
        continue
    missed = sum(g["volume"] for g in row["keyword_gaps"])
    print(f'{row["asin"]}  score {row["audit_score"]:>3}  '
          f'missing {missed:,}/mo across {len(row["keyword_gaps"])} keywords')
```

***

### Troubleshooting

**"Skipping N invalid ASIN(s)"**
An ASIN is exactly 10 characters, letters and digits, found after `/dp/` in a product URL.
Pasted a full URL or an SKU? It is skipped before anything is spent.

**A row came back `not_found`**
The ASIN has no readable live listing at that marketplace — discontinued, region-locked, or
mistyped. It is a delivered answer and is billed as one.

**Keyword gaps show `volume: 0`**
You ran `audit_lite`. That mode uses your own keywords or autocomplete, neither of which
carries search volume. Switch to `audit` for gaps with real monthly volume.

**Results came back cached and I wanted fresh ones**
Identical runs within 24 hours are served from cache at no per-row charge. Wait out the
24-hour window or change the input to force a fresh audit.

**The run stopped early with a charge-limit message**
Your Apify plan's per-run charge cap was reached. The Actor stops **before** doing any paid
work it could not bill, so you are never charged for uncounted rows. Upgrade the plan or
reduce the number of ASINs, then re-run.

***

### FAQ

**How is this different from Helium 10 or CopyMonkey?**
Price model and delivery. They sell a monthly seat and a dashboard; this sells per ASIN
audited, with output landing in your systems via API, JSON or CSV. A one-off audit of 50
ASINs is about $20 here versus a $49–99/month subscription there. If you want a full suite
and a UI, buy the suite — this is for people who want the audit in a pipeline.

**Is the search volume Amazon's own data?**
It is a monthly search-volume estimate for Amazon, not a figure Amazon publishes. Use it to
prioritise which keyword gaps to close, not as a precise traffic forecast.

**Can I trust the rewrites enough to paste them straight in?**
Treat them as a strong first draft. They are always inside Amazon's character limits and
built from your live listing plus real demand, but you should review brand voice and any
category compliance rules before publishing. That final check is yours.

**What is the difference between `audit` and `audit_lite`?**
`audit` finds the high-volume keywords your listing is missing (real volumes) and costs
about 5× more. `audit_lite` scores and rewrites against keywords you already supply (or
autocomplete), with `volume: 0`. The score, breakdown, rewrites and top-3 actions are
identical between the two.

**Do I get charged if an ASIN is invalid or not found?**
Invalid ASINs are skipped **before** any spend. A `not_found` ASIN **is** billed, because a
definitive "no live listing" is a delivered answer. Upstream failures and cache hits are
never billed.

**How many ASINs can I audit at once?**
Up to 50 per run. There is no limit on how many runs you make, so split larger catalogues
across several runs or scheduled tasks.

**Can I export to CSV or Google Sheets?**
Yes. Every Apify dataset exports to CSV, JSON, Excel and more, through the UI or the API,
and integrates with n8n, Make and Zapier.

**Does it change my listing for me?**
No. It reads the public listing and returns suggested copy and actions. Applying them in
Seller Central is a deliberate step you take, so nothing is edited on your account.

***

### Legal & compliance

This Actor reads **publicly available Amazon product pages** — the same pages any visitor
sees without logging in.

- **No login, no account access, no gated content.** Nothing behind authentication is
  touched. It does not connect to Seller Central and does not change your listings.
- **No personal data.** Output contains product listing content — titles, bullet points,
  keywords and a generated audit. No customer names, reviewer identities or contact details
  are collected.
- **Public data only.** Product pages and search-volume estimates are derived from public
  web content.
- **Suggestions, not actions.** Rewrites and recommendations are drafts for you to review;
  the Actor never publishes anything to Amazon.

You are responsible for using the output in line with Amazon's terms and any laws that apply
to you, and for reviewing suggested copy before you publish it.

***

### Related actors

- **[Amazon Keyword Research](https://apify.com/doesaiknow/amazon-keyword-research-tool-volume-reverse-asin)**
  — search volume and reverse-ASIN. Find the keywords worth targeting, then audit the
  listings that should rank for them.
- **[Amazon Rank Tracker](https://apify.com/doesaiknow/amazon-rank-tracker)** — once you have
  fixed a listing, track where its ASIN actually ranks for the keywords that matter.
- **[Amazon Bestseller Radar](https://apify.com/doesaiknow/amazon-bestseller-radar)** — watch
  what is winning in a category and reverse-engineer why.

***

### Support & feedback

Found a bug, need another marketplace, or want a field that is not here? Open an issue on the
Actor's page. Bug reports get fixed; feature requests shape the roadmap — a competitor-
comparison mode and non-`.com` volume coverage are the two most requested so far.

If the Actor is useful, a review or bookmark on the Store page helps other sellers find it. </parameter>

# Actor input Schema

## `asins` (type: `array`):

Amazon ASINs to audit (10 alphanumeric characters each, e.g. B0BSHF7WHW). Up to 50 per run; each ASIN yields one result row.

## `mode` (type: `string`):

audit — full audit with reverse-ASIN keyword gaps and real Amazon search volumes. audit\_lite — cheaper mode using your keywords or Amazon autocomplete (no volume data).

## `keywords` (type: `array`):

Optional keywords used in audit\_lite mode (max 100). Ignored in full audit mode.

## `amazonDomain` (type: `string`):

Marketplace the listing is audited against.

## Actor input object example

```json
{
  "asins": [
    "B0BSHF7WHW"
  ],
  "mode": "audit",
  "amazonDomain": "amazon.com"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "asins": [
        "B0BSHF7WHW"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("doesaiknow/amazon-listing-optimizer").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "asins": ["B0BSHF7WHW"] }

# Run the Actor and wait for it to finish
run = client.actor("doesaiknow/amazon-listing-optimizer").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "asins": [
    "B0BSHF7WHW"
  ]
}' |
apify call doesaiknow/amazon-listing-optimizer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=doesaiknow/amazon-listing-optimizer",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Amazon Listing Optimizer - Audit Score, Keyword Gaps & Rewrites",
        "description": "Paste an ASIN, get a 0-100 listing audit: score with title/bullets/keywords/images breakdown, the high-volume keywords you're missing (with real search volume), a rewritten title and bullets inside Amazon's limits, and the top 3 fixes. One row per ASIN, up to 50 per run. Pay per ASIN, no seat.",
        "version": "0.1",
        "x-build-id": "eMjU0TS8VBYicy1ED"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/doesaiknow~amazon-listing-optimizer/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-doesaiknow-amazon-listing-optimizer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/doesaiknow~amazon-listing-optimizer/runs": {
            "post": {
                "operationId": "runs-sync-doesaiknow-amazon-listing-optimizer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/doesaiknow~amazon-listing-optimizer/run-sync": {
            "post": {
                "operationId": "run-sync-doesaiknow-amazon-listing-optimizer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "asins"
                ],
                "properties": {
                    "asins": {
                        "title": "ASINs",
                        "maxItems": 50,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Amazon ASINs to audit (10 alphanumeric characters each, e.g. B0BSHF7WHW). Up to 50 per run; each ASIN yields one result row.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "mode": {
                        "title": "Audit mode",
                        "enum": [
                            "audit",
                            "audit_lite"
                        ],
                        "type": "string",
                        "description": "audit — full audit with reverse-ASIN keyword gaps and real Amazon search volumes. audit_lite — cheaper mode using your keywords or Amazon autocomplete (no volume data).",
                        "default": "audit"
                    },
                    "keywords": {
                        "title": "Keywords (audit_lite only)",
                        "maxItems": 100,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional keywords used in audit_lite mode (max 100). Ignored in full audit mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "amazonDomain": {
                        "title": "Amazon domain",
                        "enum": [
                            "amazon.com",
                            "amazon.co.uk",
                            "amazon.de",
                            "amazon.fr",
                            "amazon.es",
                            "amazon.it"
                        ],
                        "type": "string",
                        "description": "Marketplace the listing is audited against.",
                        "default": "amazon.com"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
