{
  "openapi": "3.0.1",
  "info": {
    "title": "1688 Supplier Finder: Find Suppliers in China, AI-Vetted",
    "description": "First 25 products free. 1688 supplier finder in English, pay per qualified product: trusted factories, supplier score, landed cost and margin at your quantity, a bilingual RFQ and the shop link. Free demo on any plan; live search on any Store-Actor plan.",
    "version": "0.1",
    "x-build-id": "c5kbt81RUn5nZ3ScM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~1688-supplier-finder-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-1688-supplier-finder-ai",
        "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/rich_minds~1688-supplier-finder-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-1688-supplier-finder-ai",
        "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/rich_minds~1688-supplier-finder-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-1688-supplier-finder-ai",
        "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",
        "properties": {
          "queries": {
            "title": "Search 1688 for",
            "type": "array",
            "description": "What to source, one product per line — English or Chinese (<code>silicone phone case</code>, <code>硅胶手机壳</code>); English is searched in Chinese. Typing a search next to the free sample starts the live search on your Apify account (a plan that runs Store Actors). <b>Affects what you pay</b>: 100 listings ≈ $0.20, capped by <b>Max source spend</b>.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "Your product brief",
            "type": "string",
            "description": "Describe what you are sourcing in plain words (product, models, material, where you sell it, your price). The AI judges every listing against it, drops a search term's second meaning (felt <i>sheet</i> vs felt <i>bag</i>) and writes the supplier message from it. Rewording it never resets the weekly memory."
          },
          "preset": {
            "title": "Start from a ready niche search (one click)",
            "enum": [
              "custom",
              "fba-phone-accessories",
              "pet-supplies",
              "yoga-fitness",
              "eu-amazon-seller",
              "agency-roster"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it fills the search fields you left empty (searches, brief, order quantity, sell price) and runs the live 1688 search (spend-capped by <b>Max source spend</b>). Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "minScore": {
            "title": "Minimum supplier score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: products whose supplier score (1688 service scores, years, factory inspection, manufacturer vs trader, repeat buyers, orders — AI-adjusted by at most 15 points) is below this are skipped and <b>not charged</b>. 60 keeps solid suppliers; 75+ keeps only the strongest.",
            "default": 60
          },
          "orderQuantity": {
            "title": "Your order quantity (pieces)",
            "minimum": 1,
            "maximum": 10000000,
            "type": "integer",
            "description": "How many pieces you plan to order. The unit cost is read from the price tier that holds this quantity; a quantity below the supplier's MOQ is costed at the MOQ tier and marked <code>below_moq</code>.",
            "default": 100
          },
          "maxQualified": {
            "title": "Max qualified products to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.015 with AI on (× $0.006 with AI off), e.g. 50 × $0.015 = $0.75; the source's own spend has its cap right below. The best products are output first.",
            "default": 50
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the 1688 scraper run may charge your account in the live search — $0.50 in the form and for an API or agent call that leaves it out (≈ 250 listings at $0.002), so a first real search can never cost more. Raise it for bigger searches. <b>Affects what you pay.</b>",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "English title, relevance check, sourcing note with risk flags, bilingual supplier message. <b>On = $0.015 per qualified product + AI tokens; off = $0.006</b> (rule score, costs, glossary title, template message). First 5 products: live AI verdicts on any plan; all 25 free ones with Apify model access or a paid own key.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new products (optional)",
            "type": "string",
            "description": "After every run with at least one new product, the digest (how many are new, the top 10 with verdict, supplier score and landed cost) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly (Actions → Schedule) and only new suppliers reach your inbox — no Slack or Zapier needed. Never sent for the free demo."
          },
          "targetSellPriceUsd": {
            "title": "Your sell price (in your sell currency)",
            "minimum": 0,
            "type": "number",
            "description": "What you will sell one piece for (Amazon / Shopify / TikTok Shop price), in the <b>Sell currency</b> below (USD unless you pick EUR or GBP; the field keeps its 0.1 name). With it every product gets <code>marginPct</code> = (sell price − landed cost) ÷ sell price. Empty = no margin."
          },
          "minMarginPct": {
            "title": "Minimum margin (%)",
            "minimum": 0,
            "maximum": 99,
            "type": "number",
            "description": "Skip products whose margin at your sell price is below this — free, never charged. 0 = off. Needs <b>Your sell price</b>.",
            "default": 0
          },
          "freightUsdPerKg": {
            "title": "Freight (USD per kg)",
            "minimum": 0,
            "maximum": 1000,
            "type": "number",
            "description": "Your shipping rate China → your warehouse, per kg. Default 7 = an estimate for consolidated air / express from South China (2026-10 quotes ≈ $6–8; sea LCL ≈ $1–2) — every row labels it an estimate in <code>costAssumptions.freightSource</code>. Landed cost adds rate × unit weight; set your forwarder's rate.",
            "default": 7
          },
          "dutyPct": {
            "title": "Import duty (%)",
            "minimum": 0,
            "maximum": 300,
            "type": "number",
            "description": "Duty and tariffs on the unit cost, in %. Default 15 = a rough estimate for US imports of consumer goods from China (2026-10), labelled an estimate in <code>costAssumptions.dutySource</code> — set your product's real rate (0 for none).",
            "default": 15
          },
          "sellCurrency": {
            "title": "Sell currency",
            "enum": [
              "USD",
              "EUR",
              "GBP"
            ],
            "type": "string",
            "description": "The currency you sell in: <code>landedCost</code>, <code>marginPct</code> and <b>Your sell price</b> use it (<code>landedCostUsd</code> stays in USD). EU / UK sellers: pick EUR or GBP and set <b>Import VAT</b> and your duty rate. CNY rates: dated 2026-10 estimates (<code>advancedOptions.fxCnyEur</code> 0.12, <code>fxCnyGbp</code> 0.105 replace them).",
            "default": "USD"
          },
          "importVatPct": {
            "title": "Import VAT (%)",
            "minimum": 0,
            "maximum": 50,
            "type": "number",
            "description": "Import VAT added on top of goods, freight and duty in <code>landedCost</code> — e.g. 19 (Germany), 20 (UK, France). Leave 0 when you reclaim it or sell in the US.",
            "default": 0
          },
          "targetFlags": {
            "title": "Only products with any of these flags",
            "type": "array",
            "description": "Only deliver products that carry at least one of these flags (manufacturer, factory inspected, Super Factory, trust badge, high repeat buyers, best seller, dropshipping, customisation …). Empty = keep everything. An API call passes the names from the README's flag table, e.g. <code>factory_inspected</code> (<code>factoryInspected</code> works too); an unknown name stops the run at once with the list.",
            "items": {
              "type": "string",
              "enum": [
                "manufacturer",
                "factory_inspected",
                "super_factory",
                "trust_badge",
                "high_repurchase",
                "best_seller",
                "dropshipping",
                "customisation",
                "trader_not_factory",
                "moq_above_order",
                "low_goods_score",
                "low_logistics_score",
                "nominal_price",
                "no_inspection",
                "new_supplier",
                "margin_below_target"
              ],
              "enumTitles": [
                "The supplier is a manufacturer (生产厂家), not a trader",
                "1688 inspected the factory (验厂)",
                "1688 Super Factory (超级工厂)",
                "Carries a trust badge (认证工厂, 实力商家, 源头工厂 …)",
                "Repeat-buyer rate of 20 % or more",
                "500+ orders in the last 30 days",
                "Offers single-piece dropshipping (一件代发)",
                "Offers customisation / OEM (支持定制)",
                "The supplier is a trader or wholesaler (经销批发), not the factory",
                "The MOQ is above your order quantity",
                "Goods-quality score below 3 of 5",
                "Logistics score below 3 of 5",
                "The listed price is a nominal ¥1 placeholder — ask for the real quote",
                "No 1688 factory inspection",
                "Less than 2 years on 1688",
                "Margin below your minimum margin (30 % when none is set)"
              ]
            }
          },
          "excludeTerms": {
            "title": "Exclude listings whose title contains",
            "type": "array",
            "description": "Words that mark the wrong product, English or Chinese (<code>包</code> to drop felt bags from a felt-sheet search). Badge phrases like 包邮 are ignored when matching.",
            "items": {
              "type": "string"
            }
          },
          "advancedOptions": {
            "title": "Advanced options (JSON)",
            "type": "object",
            "description": "The knobs few buyers set, as JSON keys — all optional. Filters: <code>factoryOnly</code> (<code>true</code> = manufacturers only, skip traders 经销批发 — or pick the <i>manufacturer</i> flag above), <code>maxMoq</code>, <code>minYearsOnPlatform</code>, <code>minCompositeScore</code> (0–5), <code>minMonthlyOrders</code>, <code>minRepurchasePct</code>, <code>provinces</code> (<code>[\"Guangdong\", \"Yiwu\"]</code>), <code>priceMinCny</code> / <code>priceMaxCny</code>, <code>maxUnitCostUsd</code>, <code>bestOfferPerSupplier</code>, <code>verdicts</code> (<code>[\"shortlist\"]</code>). Search: <code>sortType</code> (best_selling, relevance, price_asc, price_desc). Costs: <code>fxCnyUsd</code> (0.14), <code>fxCnyEur</code> (0.12), <code>fxCnyGbp</code> (0.105), <code>defaultUnitWeightKg</code> (0.3). Message: <code>buyerName</code>, <code>company</code>. The 0.1 top-level names (<code>maxMoq</code>, <code>provinces</code>, <code>fxCnyUsd</code> …) still work; an unknown key stops the run with the list.",
            "default": {}
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Offer ids, product URLs, supplier names or member ids to never output (suppliers you already work with). Skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "writeRfq": {
            "title": "Write a supplier message",
            "type": "boolean",
            "description": "For every shortlisted product, a polite RFQ / sample request in Chinese (to paste into 1688 chat, 旺旺) with its English translation — quantity, target price and the listing only. The Actor never contacts suppliers.",
            "default": true
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few products per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline products retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every product. Own-key pace measured 2026-10-15: ≈ 47.2 s per product with a free google:gemini-3.6-flash key — pass a run timeout of ≈ 2540 s for 50 products.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default: <code>google/gemini-2.5-flash-lite</code> in Apify mode; in own-key mode your key's vendor model (a Gemini or unrecognised key → <code>google:gemini-3.6-flash</code>, Anthropic → <code>anthropic:claude-haiku-4-5-20251001</code>, OpenAI → <code>openai:gpt-4.1-mini</code>, Groq → <code>groq:openai/gpt-oss-20b</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "sendAlertsTo": {
            "title": "Send alerts to (Slack, Discord, Teams, Google Chat, Telegram or webhook)",
            "type": "string",
            "description": "Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot&lt;token&gt;/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets the products as JSON. After every run with at least one new product, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. API callers can also send <code>slackWebhookUrl</code>, <code>discordWebhookUrl</code>, <code>teamsWebhookUrl</code>, <code>googleChatWebhookUrl</code>, <code>telegramUrl</code>, <code>webhookUrl</code> with <code>webhookHeaders</code>, <code>webhookBatchSize</code> and <code>webhookSecret</code> (signed body) — see the README's Integrations section."
          },
          "clients": {
            "title": "Agency clients — one run for all (optional)",
            "type": "array",
            "description": "Sourcing for several clients? One entry per client — <code>name</code>, <code>queries</code> (what to source for them, English or Chinese) and optionally <code>goalDescription</code>, <code>orderQuantity</code>, <code>targetSellPriceUsd</code>, <code>minMarginPct</code>, <code>notifyEmail</code>, <code>logoUrl</code>. Each client gets its own 1688 search, its own memory (only new products), its own DIGEST and a REPORT page with the client's name — the filters, AI and caps above apply to all; <b>Send alerts to</b> gets every client's digest, named. Affects what you pay: each client's search is a live search on your Apify plan (capped by Max source spend per client) and its qualified products are charged as usual. The two examples are never searched unless you pick the <i>Sourcing agency</i> preset — replace them with your clients."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same product twice",
            "type": "boolean",
            "description": "Remembers every 1688 offer you were charged for (in a named key-value store on your account) and skips it in future runs — a weekly schedule delivers and charges only new products.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Deliver a product again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered product stays remembered. 0 = never deliver or charge it again. A number of days lets a product that comes back (a seasonal peak, a relisted item) reach you again after that many days — charged again as a new product.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>1688-sourcing-log</code>) and every run appends its new products with the date to that named dataset on your account — one list across months to connect to Google Sheets once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the products come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — search 1688 live with the source scraper on your account, billed separately. <b>dataset</b> — an existing dataset of either 1688 scraper. <b>list</b> — 1688 rows you paste in. <b>Bring your own data:</b> rows or a dataset ID — no scraper runs, so our per-product charge is the whole bill. The mode you choose always runs as chosen; only the untouched sample records next to a search you typed switch to the live search (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.",
            "default": "actor"
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live search",
            "type": "boolean",
            "description": "On (default): search terms typed next to the untouched sample records start the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the terms it did not search. API pipelines that must never start a paid read on their own: send <code>false</code>.",
            "default": true
          },
          "discoveryActorId": {
            "title": "1688 scraper for the live search",
            "enum": [
              "devcake/1688-com-products-scraper",
              "zen-studio/1688-wholesale-scraper"
            ],
            "type": "string",
            "description": "<b>devcake</b> (default): $0.002 per listing + $0.00005 per run, 0.5 % failed runs, no Free-plan cap. <b>zen-studio</b>: 50+ fields incl. unit weight, $0.00499 per listing + $0.0049 per run; its Free plan returns at most 20 results per run (its README). Both run on your Apify account.",
            "default": "devcake/1688-com-products-scraper"
          },
          "maxProductsPerQuery": {
            "title": "Listings per search",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many 1688 listings the scraper reads per search. <b>Affects what you pay</b> on your account: 100 × $0.002 = $0.20 per search with devcake (× $0.00499 with zen-studio). A scheduled run of a search reads 2× when you leave it at 100.",
            "default": 100
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset of devcake/1688-com-products-scraper or zen-studio/1688-wholesale-scraper (either schema is detected). Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "1688 products to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of 1688 offers in either scraper's format — at least <code>title</code> and <code>offer_id</code> (or <code>offerId</code> / a <code>detail_url</code>) plus a price; the README's List-mode rows table names every field read. Prefilled with 6 fictional sample offers (the free demo, <code>\"sample\": true</code>): their rows link to the live 1688 search for the product instead of a listing that does not exist."
          },
          "discoveryInput": {
            "title": "Scraper input (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Only for the live search. Extra keys passed to the 1688 scraper as-is (they win over the form), e.g. <code>{\"maxProducts\": 200}</code>. Leave empty — <b>Search 1688 for</b> fills the scraper's own <code>queries</code> / <code>keywords</code>. The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste 1688 rows in <b>list</b> mode (any plan)."
          },
          "maxToProcess": {
            "title": "Max candidates to process (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many products are scored in one run (controls run time). Default = 3 × max qualified."
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for the cross-run memory. Left at the default, the memory is kept per search (source and scraper; adding a search term keeps it): rewording the brief keeps it, so a scheduled run never re-delivers what you already have. Sourcing for several clients on one account: type one name per client.",
            "default": "1688-supplier-finder-seen"
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long the 1688 scraper may run before its partial results are used. Raise it when the status says the source stopped early.",
            "default": 3600
          },
          "aiCandidateMultiplier": {
            "title": "AI candidates per qualified product (API only)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. How many rule-ranked products the AI reads per product you asked for (<b>Max qualified</b>). 1 = only the rule shortlist (fewer tokens on your bill).",
            "default": 1
          },
          "webhookUrl": {
            "title": "Webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Any https URL that gets each product as JSON."
          },
          "webhookHeaders": {
            "title": "Webhook headers (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size (API only)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per product; more = one POST per batch.",
            "default": 1
          },
          "webhookSecret": {
            "title": "Webhook signing secret (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Signs every POST: <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body&gt;</code>."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Slack incoming-webhook URL for the digest."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Discord channel webhook URL for the digest."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Google Chat space webhook URL for the digest."
          },
          "telegramUrl": {
            "title": "Telegram sendMessage link (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. The bot's sendMessage link with its chat_id."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}