{
  "openapi": "3.0.1",
  "info": {
    "title": "Company Contact Finder: Name to Website, Emails and Phones",
    "description": "First 25 company contacts free. Company contact finder: type company names, get the official website and the checked email to write to — pay per qualified company contact, junk never charged by us. Find company email by name, verify company email, phones. MCP-ready. Free demo on any plan.",
    "version": "0.1",
    "x-build-id": "IbdLGwZBpk1IwWzeu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~company-contact-finder-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-company-contact-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~company-contact-finder-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-company-contact-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~company-contact-finder-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-company-contact-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 list (one click)",
            "enum": [
              "custom",
              "steel-buyers",
              "coffee-importers",
              "agency-crm-cleanup",
              "textile-importers-search",
              "machine-builders-directory"
            ],
            "type": "string",
            "description": "Pick a ready list and press Start: it <b>replaces the free sample</b> with 5 real companies for that trade and runs the live search on any Apify plan (the untouched sample counts as empty); a value you typed yourself always wins. <b>Custom</b> = type your own companies below.",
            "default": "custom"
          },
          "companies": {
            "title": "Companies to find",
            "type": "array",
            "description": "One per line: name, 2-letter country — <code>Hamburg Textil Import GmbH, DE</code>; add the website: <code>…, DE, hamburg-textil.de</code>. Typing here replaces the demo and starts the live search. Affects what you pay: only companies with a checked contact. Any Apify plan; a plan that cannot run Store Actors only skips the fallback.",
            "items": {
              "type": "string"
            }
          },
          "searchQuery": {
            "title": "No list? Find companies by keyword",
            "type": "string",
            "description": "One search per line: what the companies do, 2-letter country — <code>textile importers, DE</code>. The company sites Google lists become the companies (directories and 'top 10' articles skipped), each row naming its search in <code>foundBy</code>. Affects what you pay: only companies with a checked contact. Any plan; a plan that cannot run Store Actors only skips the fallback."
          },
          "goalDescription": {
            "title": "What will you write to them about? (optional)",
            "type": "string",
            "description": "One sentence about your offer, e.g. <i>We sell organic cotton jersey to EU textile importers</i>. The AI uses it for the first line of your e-mail; the rules ignore it."
          },
          "notifyEmail": {
            "title": "E-mail me the new company contacts (optional)",
            "type": "string",
            "description": "After every run with at least one new company contact, the digest (found / not found, the inbox per company, the top 10 with their address) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly and only new companies arrive. 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: company contacts scoring below this are discarded and <b>not charged</b>. The score is contact quality: an ok address on the company's own domain in your preferred role on a sure website scores 80–100; only a risky or free-mail address 30–60. Companies with no usable address are never charged, whatever this says.",
            "default": 30
          },
          "maxQualified": {
            "title": "Max company contacts to deliver",
            "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.02 with AI on (× $0.0075 with AI off), e.g. 100 × $0.02 = $2.00 plus AI tokens. The best contacts are delivered first; the rest are counted, not charged. Affects what you pay.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max fallback spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Only used when Google or a company's site refuses this Actor: <code>apify/google-search-scraper</code> (website) or <code>vdrmota/contact-info-scraper</code> (contacts) then runs for those companies on your account, capped here — $0.50 in the form and for an API or agent call that leaves it out. Normal runs read everything themselves and spend nothing here. Affects what you pay.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI contact check",
            "type": "boolean",
            "description": "Picks the right same-name website, the named people, the address to write to and your first line. <b>On = $0.02 per company contact + AI tokens; off = $0.0075</b>. Needs Apify's model access (paid plans) or your own Gemini / Groq key (section 4). Apify's model access: not measured on the platform yet (dated 2026-10-30).",
            "default": true
          },
          "companiesFileUrl": {
            "title": "Companies from a file (CSV, Excel or Google Sheet URL)",
            "type": "string",
            "description": "A link to a .csv / .xlsx file or a Google Sheet shared 'anyone with the link': the columns <code>name</code> / <code>company</code>, <code>country</code>, <code>website</code> / <code>domain</code>, <code>city</code> are found by their header (CRM exports work as they are). Added to the companies of section 1. Affects what you pay: each company with a checked contact. Runs on any Apify plan — a plan that cannot run Store Actors only skips the fallback."
          },
          "listPageUrl": {
            "title": "Companies from a directory page (exhibitor or member list URL)",
            "type": "string",
            "description": "An exhibitor list or member directory URL: the websites it links become the companies, or the names on its profile pages. A page behind a login or JavaScript is refused with the reason. Affects what you pay: only companies with a checked contact. Any Apify plan; a plan that cannot run Store Actors only skips the fallback."
          },
          "maxSearchResults": {
            "title": "Companies per keyword search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "At most this many company websites per line of <b>Find companies by keyword</b> (10 per Google page). Affects what you pay: worst case this × $0.02 per search with AI on.",
            "default": 20
          },
          "domainOnly": {
            "title": "Website only (company name → domain, $0.002)",
            "type": "boolean",
            "description": "On: each row is the company's official website with its confidence and evidence — Google's best match, no page read, no e-mails — at <b>$0.002 per website found</b> (event <code>website-found</code>). Off (default): the full company contact. AI and the add-ons are off in this mode. Affects what you pay.",
            "default": false
          },
          "preferRoles": {
            "title": "Inbox to write to, in order of preference",
            "type": "array",
            "description": "The address picked as <b>bestEmail</b> is the first of these roles with a checked address (an ok check first, the company's own domain before free-mail). Default: purchasing, export, sales, general.",
            "items": {
              "type": "string",
              "enum": [
                "purchasing",
                "export",
                "sales",
                "general",
                "support",
                "hr",
                "person",
                "other"
              ],
              "enumTitles": [
                "Purchasing / procurement",
                "Export / import / international",
                "Sales",
                "General (info@, office@)",
                "Support / service",
                "HR / careers",
                "A named person's own address",
                "Other (press, accounting, legal …)"
              ]
            },
            "default": [
              "purchasing",
              "export",
              "sales",
              "general"
            ]
          },
          "pagesPerSite": {
            "title": "Pages to read per website (API only)",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "API only — hidden on the form. The home page plus up to this many − 1 pages found by link text: contact, imprint / legal, about, team, sales / export. More pages find more named people and take longer; not what you pay.",
            "default": 6
          },
          "includePhones": {
            "title": "Include phone numbers (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Phones printed on the company's pages, as E.164 with the country's code (<code>+4940300000</code>), each with the page it was on.",
            "default": true
          },
          "includeSocials": {
            "title": "Include social profiles (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. The company's LinkedIn, Facebook, Instagram, X and YouTube pages linked from its own site.",
            "default": true
          },
          "skipRoleOnly": {
            "title": "Only companies with a named person's address (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Off (default): a company whose only addresses are role inboxes (info@, sales@ …) is delivered. On: those are skipped, free.",
            "default": false
          },
          "includeNotFound": {
            "title": "Also list companies with nothing found (free)",
            "type": "boolean",
            "description": "Off (default): companies without a website or without a usable address are counted in the run summary only. On: they are delivered as <code>notFound</code> rows with the reason — never charged.",
            "default": false
          },
          "derivePersonEmails": {
            "title": "Add named people's e-mails from the company's own pattern ($0.01 each)",
            "type": "boolean",
            "description": "Needs the AI check. For each person named on the team page without a printed address, the address is built from the pattern of a colleague's printed one (m.brandt@ → f.last), MX-checked and labelled <code>pattern-derived</code> — never a guess without that example. <b>$0.01 per derived address</b> (<code>named-person-email</code>). Affects what you pay.",
            "default": false
          },
          "verifyMailbox": {
            "title": "Check the mailbox itself (SMTP, $0.002 + $0.00089)",
            "type": "boolean",
            "description": "On: each delivered company's <b>bestEmail</b> is SMTP-checked by bounceverify on your account ($0.00089 each), then <code>mailboxStatus</code> says valid / invalid / catch_all — <b>$0.002 per checked company here</b> (<code>mailbox-verified</code>). Off (default): the MX check only (the domain takes mail). Needs a plan that runs Store Actors. Affects what you pay.",
            "default": false
          },
          "useStoreFallback": {
            "title": "Use Store Actors when Google or a site refuses (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. On (default): for a company whose Google search or website refused this Actor, <code>apify/google-search-scraper</code> or <code>vdrmota/contact-info-scraper</code> runs on your account for that company only, capped by <b>Max fallback spend</b>; the row says so in <code>sourcePath</code>. Off: those companies stay not found. Affects what you pay.",
            "default": true
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver company contacts 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>purchasing_contact</code> (<code>purchasingContact</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "purchasing_contact",
                "export_contact",
                "sales_contact",
                "named_person",
                "own_domain_email",
                "free_mail_only",
                "role_only",
                "risky_email",
                "phone_found",
                "contact_form",
                "linkedin_found",
                "website_doubtful",
                "website_given",
                "typo_suspected",
                "store_fallback",
                "not_found"
              ],
              "enumTitles": [
                "A purchasing / procurement inbox is on the company's pages",
                "An export / import / international inbox is on the company's pages",
                "A sales inbox is on the company's pages",
                "A named person's address is on the company's pages",
                "The address to write to is on the company's own domain",
                "The address to write to is a free-mail address (gmail, yahoo …)",
                "Only generic role inboxes (info@, office@ …), no named person",
                "The address to write to has no MX record — mail may bounce",
                "A phone number is on the company's pages",
                "The site has a contact form",
                "The company's LinkedIn page is linked from its site",
                "The website choice is uncertain (confidence below 0.6)",
                "The website came from your input",
                "An address on the pages looks like a domain typo",
                "Found through a Store Actor fallback, billed on your Apify account",
                "No website or no usable address — a free notFound row"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Company names, domains (<code>acme.de</code>) or addresses to never output — your existing customers, say. Skipped before any search 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. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few company contacts per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline company contacts retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every company contact. Own-key pace measured 2026-10-23: ≈ 1.0–11.2 s per company contact (11.2 s on the latest run) with a free google:gemini-3.5-flash-lite key. timeoutSecs = 240 + 30 s × companies (the search plus a rate-limited own key's worst case): 50 companies → 1740, 100 → 3240.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Leave empty for the default (<code>anthropic/claude-haiku-4.5</code> via Apify; <code>google:gemini-3.5-flash-lite</code> with your own key). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</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 company contacts 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 company contacts as JSON. After every run with at least one new company contact, 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 company contact twice",
            "type": "boolean",
            "description": "Remembers every company you were charged for, by its domain (in a named key-value store on your account), and skips it in future runs — before any search. Adding companies to the list keeps the memory of the others.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Re-check my company contacts every … days (0 = off)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Contacts go stale — about 20–30 % a year. 0 (default) = a delivered company is never delivered or charged again. <b>90</b> = a quarterly CRM refresh, <b>180</b> = twice a year: after that many days the company is looked up again and, with a checked contact, delivered and charged as a new company contact. Affects what you pay.",
            "default": 0
          },
          "hubspotToken": {
            "title": "HubSpot private-app token (push every new company)",
            "type": "string",
            "description": "Each delivered company is upserted into HubSpot by its domain, with <b>bestEmail</b> as a contact (upserted by e-mail) associated to it — no Make / n8n. Create a private app with the scopes crm.objects.companies.write and crm.objects.contacts.write. Never used for the free demo. Stored encrypted."
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>company-contact-finder-ai-seen-log</code>) and every run appends its new company contacts with the date to that named dataset on your account — one list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the companies come from?",
            "enum": [
              "live",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "The mode that runs = this field, except <code>{}</code> over the API = the free demo. <b>live</b> — the companies of section 1 (or the file of section 3): Google, the companies' own pages and the e-mail check are read by this Actor (any plan). <b>dataset</b> — an Apify dataset of companies (<code>name</code> / <code>companyName</code> / <code>consigneeName</code>, <code>country</code>, <code>website</code>). <b>list</b> — records you paste into <code>itemsList</code>. The mode you choose always runs as chosen; only in the Console do the untouched sample records next to companies you typed switch to the live search.",
            "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. Console runs only: companies typed next to the untouched sample records start the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Over the API the mode you send is always the mode that runs, whatever this says. Off: the sample stays the free demo in the Console too.",
            "default": true
          },
          "failOnSourceError": {
            "title": "Fail the run when no company contact could be loaded (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Off (default): a run that could load no company ends with <code>OUTPUT.ok: false</code> and the reason. On: the same run ends FAILED, so a schedule's or an API pipeline's failed-run alert fires. Turn it on for every schedule.",
            "default": false
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode. Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "Company records (list mode)",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of objects with at least <code>name</code> and optionally <code>country</code>, <code>website</code>, <code>city</code> — or rows that already carry <code>emails</code> (checked, not crawled again). The prefilled 4 are the free demo's fictional samples (precomputed, labelled <code>sample</code>)."
          },
          "discoveryActorId": {
            "title": "Store contact scraper (advanced) (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Runs on your account only with a raw <b>discoveryInput</b> (API) or when a company's site refuses this Actor (<b>Use Store Actors when Google or a site refuses</b>), capped by <b>Max fallback spend</b>. Its page rows are merged per domain and every address is checked here.",
            "default": "vdrmota/contact-info-scraper"
          },
          "discoveryInput": {
            "title": "Store contact scraper input (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Raw input for <code>discoveryActorId</code> (e.g. <code>{\"startUrls\": [{\"url\": \"https://acme.de\"}]}</code>): the Store scraper reads those sites on your account instead of this Actor's own reader; <code>maxRequestsPerStartUrl</code> defaults to <b>Pages to read per website</b>. The live search runs that Store Actor on your Apify plan — on a plan that cannot, a Console run scores the free sample instead; paste rows into <code>itemsList</code> (<b>list</b> mode, any plan)."
          },
          "maxToProcess": {
            "title": "Max companies to look up per run (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many companies are looked up in one run (controls run time). Default = 3 × max company contacts."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified company contacts 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 company contact the moment it is ready. Higher = one POST per N company contacts.",
            "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": "company-contact-finder-ai-seen"
          },
          "discoveryTimeoutSecs": {
            "title": "Store fallback timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long a Store fallback run may take before its partial results are used — never more than 60 % of the run's time left.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}