{
  "openapi": "3.0.1",
  "info": {
    "title": "Threads Brand Monitoring: AI Sentiment & Mention Alerts",
    "description": "First 25 mentions free. Threads brand monitoring: Threads mentions ranked with AI sentiment, priority and a reply draft — off-topic posts never billed by us. Spot Threads buying signals; MCP-ready. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.1",
    "x-build-id": "unhwTvuo4VUyAu4RV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~threads-brand-monitoring-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-threads-brand-monitoring-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~threads-brand-monitoring-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-threads-brand-monitoring-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~threads-brand-monitoring-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-threads-brand-monitoring-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": {
          "brandTerms": {
            "title": "Your brand, product or domain names",
            "type": "array",
            "description": "The names to watch on Threads, e.g. <code>Acme</code> — searched and required in the post. Your brand replaces the sample: a live search on your account, capped at $0.50 (Max source spend), on any Apify plan that runs Store Actors — otherwise paste your posts under <b>Other sources</b>. Left as the sample, Start runs the free demo.",
            "items": {
              "type": "string"
            }
          },
          "preset": {
            "title": "Start from a ready niche search (one click)",
            "enum": [
              "custom",
              "saas-brand-watch",
              "support-complaint-queue",
              "competitor-buying-intent",
              "agency-watchlists",
              "busy-brand-daily",
              "crisis-watch",
              "competitor-leads"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it fills the fields you left empty and runs the live search (spend-capped by <code>maxDiscoveryChargeUsd</code>). Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "brandBrief": {
            "title": "What is your brand? (one line, optional)",
            "type": "string",
            "description": "What the brand is, its products and its voice. The AI uses it to tell your brand from a homonym and to write reply drafts in your voice — only facts from here are ever used."
          },
          "minScore": {
            "title": "Minimum relevance (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: mentions scoring below this relevance are discarded and <b>not charged</b>. Raise it to pay only for posts clearly about you.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max mentions 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.009 with AI on (× $0.0035 with AI off), e.g. 100 × $0.009 = $0.90; the source's own spend has its cap right below. The best mentions are delivered first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the Threads search may charge your account in <b>actor</b> mode — $0.50 in the form and for an API or agent call that leaves it out, so a first real search can never cost more. Raise it for more terms.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "The AI confirms each mention is about you, labels sentiment and type, quotes the proof and drafts a reply. <b>On = $0.009 per qualified mention + AI tokens; off = $0.0035</b> (rule-based relevance, sentiment, type and priority).",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new mentions (optional)",
            "type": "string",
            "description": "After every run with at least one new mention, the digest (counts, share of voice, the 3 to act on first, links) is e-mailed here. Schedule it weekly and only new mentions reach your inbox. Never sent for the free demo."
          },
          "competitorTerms": {
            "title": "Competitor names",
            "type": "array",
            "description": "Competitors to watch too — searched like your brand. Their unhappy or shopping users become <code>sales_follow_up</code> mentions; the digest shows share of voice. Searched live on your Apify plan (the demo does not search it).",
            "items": {
              "type": "string"
            }
          },
          "handles": {
            "title": "Threads handles to watch",
            "type": "array",
            "description": "Your accounts, e.g. <code>@acme</code> — posts that @-tag them are mentions even when the brand name is not written out. Searched live on your Apify plan (the demo does not search it).",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags to watch",
            "type": "array",
            "description": "Campaign or brand hashtags, e.g. <code>#acmelaunch</code>. Searched live on your Apify plan (the demo does not search it).",
            "items": {
              "type": "string"
            }
          },
          "negativeTerms": {
            "title": "Exclude phrases (homonyms)",
            "type": "array",
            "description": "A post containing one of these is dropped free — e.g. <code>notion of</code>, <code>linear algebra</code> for a brand that is also a common word.",
            "items": {
              "type": "string"
            }
          },
          "contextTerms": {
            "title": "Product words (raise relevance)",
            "type": "array",
            "description": "Words that show a post is about your product, e.g. <code>app</code>, <code>template</code>, <code>workspace</code> — each adds relevance.",
            "items": {
              "type": "string"
            }
          },
          "mentionTypes": {
            "title": "Only these mention types",
            "type": "array",
            "description": "Keep only these types (empty = all): <code>complaint</code>, <code>question</code>, <code>buying_intent</code>, <code>praise</code>, <code>comparison</code>, <code>feature_request</code>, <code>news_share</code>, <code>other</code>.",
            "items": {
              "type": "string",
              "enum": [
                "complaint",
                "question",
                "buying_intent",
                "praise",
                "comparison",
                "feature_request",
                "news_share",
                "other"
              ],
              "enumTitles": [
                "Complaint",
                "Question",
                "Buying intent",
                "Praise",
                "Comparison",
                "Feature request",
                "News share",
                "Other"
              ]
            }
          },
          "sentiments": {
            "title": "Only these sentiments",
            "type": "array",
            "description": "Keep only these sentiments toward your brand (empty = all).",
            "items": {
              "type": "string",
              "enum": [
                "positive",
                "neutral",
                "negative",
                "mixed"
              ],
              "enumTitles": [
                "Positive",
                "Neutral",
                "Negative",
                "Mixed"
              ]
            }
          },
          "minPriority": {
            "title": "Minimum priority",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "type": "string",
            "description": "Keep mentions at or above this priority (type + sentiment + reach + recency).",
            "default": "low"
          },
          "languages": {
            "title": "Only these languages",
            "type": "array",
            "description": "Keep posts in these languages (empty = all). A post whose language the source did not report is kept.",
            "items": {
              "type": "string",
              "enum": [
                "en",
                "es",
                "pt",
                "fr",
                "de",
                "it",
                "nl",
                "ja",
                "ko",
                "zh",
                "hi",
                "id",
                "tr",
                "pl"
              ],
              "enumTitles": [
                "English",
                "Spanish",
                "Portuguese",
                "French",
                "German",
                "Italian",
                "Dutch",
                "Japanese",
                "Korean",
                "Chinese",
                "Hindi",
                "Indonesian",
                "Turkish",
                "Polish"
              ]
            }
          },
          "maxAgeDays": {
            "title": "Only posts from the last N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Date window of the live search and the dataset (0 = no window). A scheduled run widens it to the days since its last run. Pasted posts are never dropped by it.",
            "default": 7
          },
          "postedAfter": {
            "title": "Only posts after this date (optional)",
            "type": "string",
            "description": "A fixed start date (YYYY-MM-DD) instead of the rolling window; applies to pasted posts too."
          },
          "minAuthorFollowers": {
            "title": "Minimum author followers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop posts from accounts with fewer followers (0 = keep all). An author whose follower count is unknown is kept.",
            "default": 0
          },
          "excludeReposts": {
            "title": "Skip reposts",
            "type": "boolean",
            "description": "Reposts repeat someone else's post — skipped free.",
            "default": true
          },
          "excludeReplies": {
            "title": "Skip replies",
            "type": "boolean",
            "description": "Keep only top-level posts.",
            "default": false
          },
          "excludeOwnHandles": {
            "title": "Your own accounts (skip their posts)",
            "type": "array",
            "description": "Posts BY these accounts are not mentions — e.g. <code>@acme</code>, <code>@acme_support</code>.",
            "items": {
              "type": "string"
            }
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver mentions that have at least one of these flags (empty = keep everything). An API call passes the flag names from the README's flag table, e.g. <code>complaint</code>, <code>high_reach</code> (<code>highReach</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "complaint",
                "question",
                "buying_intent",
                "comparison",
                "feature_request",
                "praise",
                "news_share",
                "negative",
                "competitor_mentioned",
                "brand_tagged",
                "links_to_brand",
                "high_reach",
                "verified_author",
                "recent",
                "unanswered",
                "ambiguous_term"
              ],
              "enumTitles": [
                "Complaint",
                "Question",
                "Buying intent (looking to buy / switch)",
                "Comparison (X vs Y)",
                "Feature request",
                "Praise / recommendation",
                "News share",
                "Negative toward the brand",
                "Names a competitor",
                "Brand @-tagged or #hashtag",
                "Links to your domain",
                "High reach (≥ 10,000 views)",
                "Verified author",
                "Posted in the last 24 h",
                "No replies yet",
                "Common-word brand, no product context"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Post URLs, post ids or author handles to never output. Skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "includeReplyDraft": {
            "title": "Draft a reply (AI)",
            "type": "boolean",
            "description": "For complaints, questions, buying-intent posts and comparisons the AI drafts a reply (≤ 280 characters) in your brand voice — from your brief only, never posted for you.",
            "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> — your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few mentions per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline mentions retried one by one) — and the rest keep their rule score; measured 2026-09-28: ≈ 12.9–62 s per mention (free Gemini key ≈ 12.9–39.6 s, free Groq openai/gpt-oss-120b key ≈ 62 s), so give 50 own-key mentions a <code>timeoutSecs</code> of ≈ 3300; a paid Groq / Gemini key (billing on) assesses every mention.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>google/gemini-2.5-flash-lite</code> on Apify's model access, <code>google:gemini-3.5-flash-lite</code> with your own key — paste a Gemini key and leave this empty). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code> — set it for any other key, e.g. <code>anthropic:claude-haiku-4-5-20251001</code> or <code>groq:openai/gpt-oss-120b</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 candidate pool (× max mentions)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "The best rule-scored candidates get the AI pass, best first, up to this multiple of <b>Max mentions to deliver</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "watchlists": {
            "title": "Watchlists — several brands / clients in one run",
            "type": "array",
            "description": "For agencies: one entry per client, e.g. <code>[{\"name\": \"Client A\", \"brandTerms\": [\"Acme\"], \"competitorTerms\": [\"Globex\"], \"negativeTerms\": [], \"brandBrief\": \"Acme — …\", \"webhookUrl\": \"https://…\", \"logoUrl\": \"https://…/logo.png\"}]</code>. Each gets its own digest record, webhook and memory; every post goes to the watchlist whose brand it names. Searched live on your Apify plan (the demo does not search it)."
          },
          "clientReports": {
            "title": "White-label report per client ($0.05 each)",
            "type": "boolean",
            "description": "On = every watchlist with new mentions gets its own client-ready page (<code>REPORT-&lt;client&gt;</code>: the client's name and <code>logoUrl</code>, counts, share of voice, negative spike, the 3 to act on first, the mentions — no Apify branding) to forward, <b>$0.05 per client per run with new mentions</b>. Off = one DIGEST per client, free. The free demo shows a sample (<code>REPORT-sample-client</code>).",
            "default": false
          },
          "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 mentions as JSON. After every run with at least one new mention, the digest (how many are new, share of voice, the top 10 with links) is posted to a chat; a webhook gets each mention at or above <b>Alert priority</b> as JSON the moment it is ready. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>."
          },
          "alertMinPriority": {
            "title": "Alert priority",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "type": "string",
            "description": "Which mentions the webhook receives: <b>high</b> (default) = urgent ones only, <b>low</b> = every delivered mention.",
            "default": "high"
          },
          "dedupeAcrossRuns": {
            "title": "Never deliver the same mention twice",
            "type": "boolean",
            "description": "Remembers every mention you received (in a named key-value store on your account) and skips it in future runs — never re-delivered, never re-charged.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Deliver a mention again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered mention stays remembered. 0 (default) = never deliver or charge the same post again. A number of days lets a long-running thread you were sent come back after that many days — charged again as a new mention. Affects what you pay.",
            "default": 0
          },
          "resetState": {
            "title": "Forget earlier runs (rebuild the baseline)",
            "type": "boolean",
            "description": "On = this run forgets the mentions this search already delivered and delivers (and charges) them again. Leave off for schedules.",
            "default": false
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>threads-mentions-log</code>) and every run appends its new mentions with the date to that named dataset on your account — one list across months for Google Sheets or your BI tool. Empty = off.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the posts come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — search Threads live on your account. <b>dataset</b> — an existing post dataset. <b>list</b> — posts you paste in. The mode you choose always runs as chosen; only the untouched sample posts next to a brand you typed switch to the live search (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — the source Actor is never run.",
            "default": "actor"
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live search",
            "type": "boolean",
            "description": "On (default): a brand 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
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset of Threads posts from any of the three sources, or X / Reddit / Instagram posts. Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "Posts to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of posts with at least <code>url</code> and <code>text</code>, optionally <code>author</code>, <code>created_at</code>, <code>like_count</code>, <code>reply_count</code>, <code>view_count</code>, <code>follower_count</code> (see the README's List-mode rows)."
          },
          "discoveryActorId": {
            "title": "Threads source",
            "enum": [
              "automation-lab/threads-scraper",
              "watcher.data/search-threads-by-keywords",
              "futurizerush/meta-threads-scraper"
            ],
            "type": "string",
            "description": "The Store Actor that searches Threads in <b>actor</b> mode, on your account: <b>automation-lab Threads Scraper</b> (default — $0.005 per post + $0.02 per run, 0 % failed runs), <b>Search Threads by Keywords</b> (deep search — $0.008 per post, no start fee, up to 2,000 posts per keyword) or <b>futurizerush Threads Scraper</b> ($0.0025 per post + $0.02 per run — cheapest per post, 3 % failed runs). All three map to the same output.",
            "default": "automation-lab/threads-scraper"
          },
          "maxPostsPerTerm": {
            "title": "Posts to scan per term",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "How many posts the source returns per watch term — the main driver of the source cost (terms × posts × its price per post: 1 term × 80 on the default source ≈ $0.42, under the $0.50 spend cap, ≈ 27 qualified mentions — past your 25 free ones). A scheduled run doubles it unless you set it; a run that fills it says so (schedule it daily).",
            "default": 80
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "recent",
              "top"
            ],
            "type": "string",
            "description": "<b>recent</b> — the newest posts (monitoring); <b>top</b> — the most relevant / popular.",
            "default": "recent"
          },
          "discoveryInput": {
            "title": "Source Actor input (advanced)",
            "type": "object",
            "description": "Only for <b>actor</b> mode: extra input for the source Actor, merged over the fields built from your watch terms (e.g. <code>{\"maxPosts\": 150}</code>). Runs on your Apify plan — if your plan cannot run Store Actors, paste your own posts in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have."
          },
          "maxToProcess": {
            "title": "Max candidates to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many posts are scored in one run (controls run time). Default = 3 × max mentions."
          },
          "webhookUrl": {
            "title": "Alert webhook URL (optional)",
            "type": "string",
            "description": "A second way to set the webhook: mentions at or above <b>Alert priority</b> are POSTed here as JSON the moment they are ready (Zapier, Make, n8n, your helpdesk or CRM). A webhook URL in <i>Send alerts to</i> fills this field. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted by Apify, never logged."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1 = one POST per mention the moment it is ready. Higher = one POST per N mentions.",
            "default": 1
          },
          "webhookSecret": {
            "title": "Webhook signing secret (optional)",
            "type": "string",
            "description": "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": "Memory store name",
            "type": "string",
            "description": "Key-value store for the cross-run memory. Left at the default, the memory is kept per watch term: adding a competitor or a handle to a scheduled search keeps every other term's memory (the new term starts its own, <code>OUTPUT.dedupeStore.newTerms</code>), and rewording <code>brandBrief</code> keeps it. Several clients on one account: use <code>watchlists</code>, or type one name per client.",
            "default": "threads-brand-monitoring-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. Raise it when the status says the source stopped early.",
            "default": 3600
          },
          "slackWebhookUrl": {
            "title": "Post the digest to Slack (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": "Post the digest to Discord (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": "Post the digest to Microsoft Teams (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest (an Adaptive Card)."
          },
          "googleChatWebhookUrl": {
            "title": "Post the digest to Google Chat (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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}