{
  "openapi": "3.0.1",
  "info": {
    "title": "US Importers Finder: ImportYeti Alternative for US Customs Data",
    "description": "First 25 US importers free. US importers finder: pay per qualified US importer, junk never charged by us — buyers of your product ranked from US customs records, with their suppliers, ports and the pitch to send. MCP & AI agents ready. Free demo on any plan. An ImportGenius alternative.",
    "version": "0.1",
    "x-build-id": "rLYOi4IsmbpyoIlj4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~us-importer-finder-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-us-importer-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~us-importer-finder-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-us-importer-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~us-importer-finder-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-us-importer-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": {
          "preset": {
            "title": "Start from a ready US-importer search (one click)",
            "enum": [
              "custom",
              "india-cotton-tshirts",
              "vietnam-wooden-furniture",
              "turkey-bath-towels",
              "india-basmati-rice",
              "india-ceramic-tiles",
              "india-china-plus-one-apparel",
              "vietnam-china-plus-one-furniture",
              "mexico-china-plus-one-auto-parts",
              "bangladesh-china-plus-one-apparel",
              "india-home-textiles-basket",
              "logistics-savannah-la-furniture"
            ],
            "type": "string",
            "description": "Pick a ready search and press Start: it <b>replaces the free sample</b>, fills the product, HS code, country and brief you left empty, and runs the live search capped at $0.15 and 20 profiles until its yield is measured. Your own values win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "products": {
            "title": "Your product (keywords)",
            "type": "array",
            "description": "Your product (<code>cotton t-shirts</code>, <code>basmati rice</code>), up to 5 — typing one starts the live search on your Apify plan; a plan that cannot run Store Actors gets the free sample scored on your product. Affects what you pay: one scan per product term (5 terms = 5 scans sharing the scan size), $0.005 start fee each.",
            "items": {
              "type": "string"
            }
          },
          "originCountry": {
            "title": "Your country (where you export from)",
            "enum": [
              "IN",
              "BD",
              "PK",
              "LK",
              "NP",
              "VN",
              "CN",
              "TW",
              "HK",
              "ID",
              "TH",
              "MY",
              "PH",
              "KH",
              "JP",
              "KR",
              "TR",
              "EG",
              "MA",
              "KE",
              "ET",
              "ZA",
              "MX",
              "CA",
              "GT",
              "HN",
              "CO",
              "PE",
              "BR",
              "CL",
              "DE",
              "IT",
              "ES",
              "PT",
              "FR",
              "GB",
              "NL",
              "PL",
              "IL",
              "AE",
              "AU"
            ],
            "type": "string",
            "description": "Each importer's <b>origin share</b> is the part of its supplier shipments that already comes from this country: above 0 % = it already buys there (pitch: be its next supplier), 0 % = it buys only from your rivals' countries (pitch: switch / second source).",
            "default": "IN"
          },
          "goalDescription": {
            "title": "Who is your ideal buyer? (optional)",
            "type": "string",
            "description": "Describe the US buyer you want in plain words, e.g. <i>US apparel brands and retailers that import cotton knit t-shirts (HS 6109) in volume and could add an Indian supplier</i>. The AI scores every importer against it, explains why and writes the first e-mail; empty = the AI judges each importer as a buyer of your product."
          },
          "notifyEmail": {
            "title": "E-mail me the new US importers (optional)",
            "type": "string",
            "description": "After every run with at least one new US importer, the run's digest (how many are new, by type, how many already buy from your country, the top 10 with links) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly (Actions → Schedule) and only new importers come to your inbox. Never sent for the free demo."
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: US importers scoring below this are discarded and <b>not charged</b>. Raise it to pay only for the strongest buyers, lower it to see more.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max qualified US importers 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 the US importers scanned or this many, whichever is smaller, × $0.01 with AI on (× $0.005 with AI off) — $0.30 on the default scan of 30; the source's own spend has its cap right below. The best-scoring importers are output first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Affects what you pay: hard cap on what the ImportYeti source run may charge your Apify account in the live search — $0.50 in the form and over the API. A failed first source leaves the rest of this cap to the fallback; a scheduled run that doubles the scan doubles it too.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Fit score quoting the bills of lading, company type, pitch, first e-mail, LinkedIn note, day-5 follow-up. <b>On = $0.01 per qualified US importer + ≈ $0.0004 of AI tokens; off = $0.005</b>. No key with model access (Apify Starter plan and up; not measured on the platform yet) — else your own key (free key: 1–3 verdicts a run).",
            "default": true
          },
          "hsCodes": {
            "title": "HS codes (optional)",
            "type": "array",
            "description": "Harmonized System codes of your product, 2–10 digits: <code>6109</code> (t-shirts), <code>610910</code> (cotton t-shirts), <code>9403</code> (furniture). Next to a product term they filter and score only (never a second scan — the scans stay one per product term). Alone they start the live search on memo23's HS-code pages — one run for all your codes ($0.0008 a row + $0.02 a run on your Apify plan), never a text query of the digits. A plan that cannot run Store Actors gets the free sample scored on your codes (or paste rows into <code>itemsList</code>).",
            "items": {
              "type": "string"
            }
          },
          "mostRecentWithinMonths": {
            "title": "Last arrival within (months)",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "Only importers whose last shipment arrived within this many months — active buyers, not old records. 0 = any date. Filtered importers are free.",
            "default": 6
          },
          "minShipments12m": {
            "title": "Min shipments in the last 12 months",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only importers with at least this many shipments in the last 12 months (a regular buyer, not a one-off). Filtered importers are free.",
            "default": 3
          },
          "excludeForwarders": {
            "title": "Drop freight forwarders and logistics companies",
            "type": "boolean",
            "description": "On (default): consignees that are plainly forwarders, customs brokers or logistics companies (unambiguous name tokens such as logistics, freight, NVOCC, 3PL, or consolidated-cargo goods; and the AI's company type when it is on) are dropped free — they ship for others and do not buy your product. An ambiguous name (Express, … Shipping Co) is kept with the <code>forwarder</code> flag for the AI to decide; every dropped name is listed in <code>OUTPUT.skips</code>, and <b>Always keep</b> forces one back in.",
            "default": true
          },
          "entryPorts": {
            "title": "US entry ports (lane filter, optional)",
            "type": "array",
            "description": "Only importers whose goods land at one of these US ports — part of the port's name, one per line: <code>savannah</code>, <code>los angeles</code>, <code>long beach</code>, <code>newark</code>, <code>houston</code>. For forwarders, 3PLs and customs brokers selling a lane. Filtered importers are free; empty = every port.",
            "items": {
              "type": "string"
            }
          },
          "minTeu12m": {
            "title": "Min containers (TEU) in the last 12 months",
            "minimum": 0,
            "maximum": 1000000,
            "type": "number",
            "description": "Only importers moving at least this many TEU a year — the volume a forwarder or NVOCC quotes for. 0 = any. An importer whose TEU the source does not report is kept. Filtered importers are free.",
            "default": 0
          },
          "maxImporters": {
            "title": "US importers to scan per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Affects what you pay: how many importer profiles the ImportYeti source reads in one run, all your terms together — ≈ 30 × $0.00699 + $0.005 per term ≈ $0.22 on your Apify account with the default source, capped by <b>Max source spend</b>. A scheduled run doubles it when left at the default.",
            "default": 30
          },
          "unitValueUsdPerKg": {
            "title": "Your price benchmark, US$ per kg (optional)",
            "minimum": 0,
            "maximum": 100000,
            "type": "number",
            "description": "US bills of lading carry no price. Give a benchmark (e.g. the unit value per kg from UN Comtrade for your HS code and country) and each row gets <b>estValueUsd12m</b> = its 12-month weight × this price, labelled an estimate. Empty = no value estimate."
          },
          "unitValueSource": {
            "title": "Where the benchmark comes from (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Shown in each row's <b>valueBasis</b>, e.g. <i>UN Comtrade 2025, HS 6109 India → USA</i>.",
            "default": ""
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver US importers that have at least one of these flags, and rank those with more of them higher. Leave empty to keep everything. An API call passes the flag names from the README's flag table, e.g. <code>buys_from_origin</code> (<code>buysFromOrigin</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "hs_match",
                "keyword_match",
                "buys_from_origin",
                "only_rival_origins",
                "growing",
                "active_recently",
                "high_volume",
                "has_contact",
                "forwarder",
                "china_plus_one",
                "uflpa_exposed"
              ],
              "enumTitles": [
                "Imports one of your HS codes",
                "Its goods mention your product",
                "Already buys from your country",
                "Buys only from other countries (switch pitch)",
                "Shipments up 20 % or more",
                "Last arrival within 90 days",
                "100+ shipments in 12 months",
                "Website or phone shown",
                "Looks like a forwarder",
                "Buys half or more from China (China-plus-one pitch)",
                "UFLPA exposure flagged by the source"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Importer names, ImportYeti URLs or websites to never output (your current customers). Suppressed importers are skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "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 (not measured on the platform yet — the first platform run is dated in the README's Coming next). <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few US importers per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline US importers retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every US importer. Measured 2026-10-23 / 2026-10-24: ≈ 1–8 s per US importer with a free google:gemini-3.5-flash-lite key (1 s, 1.6 s and 8 s on the platform, 1.4–2.2 s locally) — size a 50-importer own-key run's timeout at ≈ 580 s.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Leave empty for the default: <code>google/gemini-2.5-flash-lite</code> through Apify's model access; with your own key the key's provider picks it (a Gemini key → <code>google:gemini-3.5-flash-lite</code>, an Anthropic key → <code>anthropic:claude-haiku-4-5-20251001</code>, Groq → <code>groq:openai/gpt-oss-20b</code>, OpenAI → <code>openai:gpt-4.1-mini</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."
          },
          "aiCandidateMultiplier": {
            "title": "AI shortlist size, × max qualified (API only)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. How many of the best rule-scored US importers get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "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 US importers as JSON. After every run with at least one new US importer, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same US importer twice",
            "type": "boolean",
            "description": "Remembers every US importer you were charged for (by its ImportYeti company page, in a named key-value store on your account) and skips it in future runs of this search.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Deliver an importer again after (days) (API only)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "API only — hidden on the form. How long a delivered importer stays remembered. 0 = never deliver or charge it again. A number of days lets an importer you already have come back (e.g. 180 to re-check last year's buyers) — charged again as a new US importer.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>us-importers-log</code>) and every run appends its new US importers with the date to that named dataset on your account — one list across months to connect to Google Sheets or your CRM once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "enrichContacts": {
            "title": "Find the e-mail to write to (contact add-on)",
            "type": "boolean",
            "description": "On: the best hot / warm importers with a website go to our <b>Company Contact Finder</b> (<code>rich_minds/company-contact-finder-ai</code>) inside this run — its checked e-mail and the named person fill <code>contactEmail</code> / <code>contactName</code>, and the Outreach view opens with them. Affects what you pay: ≈ $0.0075 per importer with an e-mail found, billed by that Actor on your Apify account (its first contacts free; a plan that runs Store Actors). Off: the website stays the contact route.",
            "default": false
          },
          "enrichContactsMax": {
            "title": "Contacts to look up per run (API only)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "API only — hidden on the form. Affects what you pay: at most this many hot / warm importers go to the contact add-on — worst case 10 × $0.0075 = $0.075 a run at the default, hard-capped at $1.",
            "default": 10
          },
          "sourceMode": {
            "title": "Where do the US importers come from?",
            "enum": [
              "live",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<code>{}</code> over the API runs the free demo — nothing charged, whatever the declared default says; any product or HS code you send runs the live search. The mode that runs = this field, except <code>{}</code> = the free demo. <b>live</b> — run the ImportYeti Store Actors on your account (<code>zen-studio/importyeti-scraper</code> for product terms, <code>memo23/importyeti-scraper</code> for HS codes alone, falling back once to the next in <b>Fallback sources</b>), billed separately. <b>dataset</b> — an existing dataset of any of the three ImportYeti Actors. <b>list</b> — importer rows you paste in. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — no source is run. The mode you choose always runs as chosen; only the untouched sample records next to a product you typed on the Console form switch to the live search (spend-capped).",
            "default": "live"
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live search (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. On (default, Console runs only): 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. Over the API the mode you send is always the mode that runs.",
            "default": true
          },
          "failOnSourceError": {
            "title": "Fail the run when no US importer could be loaded (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Off (default): a plan that cannot run the source Store Actor ends SUCCEEDED with 0 rows and <code>OUTPUT.ok: false</code>. On: the same run ends FAILED with the same message, so a schedule's or an API pipeline's failed-run alert fires. Send it on every schedule.",
            "default": false
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset of <code>zen-studio/importyeti-scraper</code>, <code>memo23/importyeti-scraper</code> or <code>scrapesage/importyeti-scraper</code> (its BOL, lane and supplier rows are skipped). Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "US importers to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of importer rows with at least <code>name</code> and the ImportYeti <code>url</code>; optional <code>shipments12m</code>, <code>lastArrival</code>, <code>hsCodes</code>, <code>topSuppliers</code> (name, country, shipments12m), <code>goodsDescriptions</code>, <code>entryPorts</code>, <code>teu12m</code> … (README → List-mode rows). Rows of the three ImportYeti Actors work as they are. The prefilled ten are the free demo's sample importers (five niches)."
          },
          "discoveryActorId": {
            "title": "First source (advanced)",
            "enum": [
              "zen-studio/importyeti-scraper",
              "memo23/importyeti-scraper",
              "scrapesage/importyeti-scraper"
            ],
            "type": "string",
            "description": "The ImportYeti Store Actor the live search runs first for product terms. When it fails, returns no importer or a changed format, the next one in <b>Fallback sources</b> runs once — never more than one extra source per run. HS codes without a product term always go to memo23 (the HS-code source), whatever is picked here.",
            "default": "zen-studio/importyeti-scraper"
          },
          "discoveryInput": {
            "title": "First source's raw input (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Only for the live search. Extra input passed as-is to the first source Actor (it overrides what the Actor builds from your product and filters) — see that Actor's input schema. The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, a run from this form scores the free sample against your product instead (nothing charged), and you can paste your own rows in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have from another account or tool."
          },
          "maxToProcess": {
            "title": "Max US importers to score per run (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many US importers are scored in one run (controls run time). Default = 3 × max qualified."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified US importers are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "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 by Apify, never logged."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size (API only)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per US importer the moment it is ready. Higher = one POST per N US importers.",
            "default": 1
          },
          "webhookSecret": {
            "title": "Webhook signing secret (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Any random string. Every webhook POST then carries <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body with this secret&gt;</code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged."
          },
          "dedupeStoreName": {
            "title": "Dedupe store name (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source and search terms): rewording <code>goalDescription</code> keeps it, so a scheduled run never re-delivers what you already have, and another search starts its own list. Running it for several clients on one account, type one name per client.",
            "default": "us-importer-finder-ai-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 source Store Actor may run before its partial results are used — never more than 60 % of the run's time left, so the AI, the charges and the digest keep the rest. Raise it (and the run timeout) when the status says the source stopped early.",
            "default": 3600
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}