{
  "openapi": "3.0.1",
  "info": {
    "title": "Spotify Artist Scout – Monthly Listeners, Play Counts, AI Score",
    "description": "First 25 artists free. Spotify artist scout, pay per qualified artist - junk never charged by us: monthly listeners, listener growth, signing status, AI scouting note, from Spotify Play Count Scraper. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.3",
    "x-build-id": "kAbmGftbeYL2JnCcd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~spotify-artist-scout-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-spotify-artist-scout-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~spotify-artist-scout-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-spotify-artist-scout-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~spotify-artist-scout-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-spotify-artist-scout-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",
        "required": [
          "sourceMode"
        ],
        "properties": {
          "seedArtistUrls": {
            "title": "Artists like… (Spotify artist links)",
            "type": "array",
            "description": "Paste 1–5 Spotify artists whose fans you want. Their 'Fans also like' artists are found, scanned and scored; the seeds themselves are not charged. The live search runs on your Apify plan; typing here next to the free demo starts it.",
            "items": {
              "type": "string"
            }
          },
          "sourceMode": {
            "title": "Where do the artists come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — live scout through two Store Actors on your account (seeds, a watchlist or just your brief). <b>dataset</b> — score an existing artist dataset. <b>list</b> — score records you paste. <code>{}</code> runs the free demo. The mode you choose always runs as chosen; only the untouched sample next to a typed seed switches to the live scout (spend-capped). <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"
          },
          "preset": {
            "title": "Start from a ready niche scout (one click)",
            "enum": [
              "custom",
              "booking-agent",
              "indie-label-uk",
              "playlist-curator"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it fills the search fields and filters you left empty (seeds, Viral 50 charts, listener band, brief) and runs the live scout on your Apify plan, spend-capped by <code>maxDiscoveryChargeUsd</code>. Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "scoutBrief": {
            "title": "What are you scouting for?",
            "type": "string",
            "description": "Genre, scene, stage and market in plain words — the AI scores every artist against it (fitScore) and explains why. No seeds? With the live scout picked, the brief alone starts it: markets it names (UK, Dublin, afrobeats) become Viral 50 charts, artists named after “like” are searched."
          },
          "minScore": {
            "title": "Minimum scout score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: artists scoring below this are dropped and <b>not charged</b>. 75+ = hot, 50+ = warm.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max qualified artists to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.01 with AI on (× $0.004 with AI off), e.g. 100 × $0.01 = $1. The source spend has its own cap right below. Best scores first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the two Spotify Store Actors may charge your account per run (≈ $0.004 per scanned artist, $0.001 per discovery row) — $0.50 in the form and for an API call that leaves it out. Raise it for bigger scouts.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI scouting note & pitch line",
            "type": "boolean",
            "description": "Adds the AI verdict per artist: fit to your brief, career stage, bio facts quoted from Spotify, a 2-sentence scouting note and a pitch line. <b>On = $0.01 per qualified artist + AI tokens; off = $0.004</b> (rule score and template note only).",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new artists (optional)",
            "type": "string",
            "description": "After every run with at least one new artist, the digest (how many are new, growth alerts, the top 10 with links) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly and only new or fast-growing artists reach your inbox. Never sent for the free demo."
          },
          "artistUrls": {
            "title": "Watchlist — scan exactly these artists",
            "type": "array",
            "description": "Spotify artist links, <code>spotify:artist:</code> URIs or IDs scanned as they are (no discovery cost). On a weekly schedule an artist already delivered comes back only as a growth alert. Track / album / playlist links are skipped with a note. The live search runs on your Apify plan; typing here next to the free demo starts it.",
            "items": {
              "type": "string"
            }
          },
          "playlistUrls": {
            "title": "Playlists to mine for artists",
            "type": "array",
            "description": "Spotify playlist links (e.g. an editorial new-music playlist or an indie curator's list). Every credited artist on the playlist is scanned. The live search runs on your Apify plan; typing here next to the free demo starts it.",
            "items": {
              "type": "string"
            }
          },
          "viralChartCountries": {
            "title": "Spotify Viral 50 charts",
            "type": "array",
            "description": "Countries whose Viral 50 chart feeds the scout — the artists behind the tracks going viral there. The live search runs on your Apify plan; typing here next to the free demo starts it.",
            "items": {
              "type": "string",
              "enum": [
                "GLOBAL",
                "US",
                "GB",
                "IE",
                "CA",
                "AU",
                "NZ",
                "DE",
                "AT",
                "CH",
                "FR",
                "BE",
                "NL",
                "LU",
                "ES",
                "PT",
                "IT",
                "SE",
                "NO",
                "DK",
                "FI",
                "IS",
                "PL",
                "CZ",
                "SK",
                "HU",
                "RO",
                "BG",
                "GR",
                "UA",
                "TR",
                "IL",
                "AE",
                "SA",
                "EG",
                "MA",
                "NG",
                "GH",
                "KE",
                "ZA",
                "BR",
                "MX",
                "AR",
                "CL",
                "CO",
                "PE",
                "EC",
                "UY",
                "DO",
                "PR",
                "JP",
                "KR",
                "TW",
                "HK",
                "IN",
                "PK",
                "ID",
                "PH",
                "TH",
                "VN",
                "MY",
                "SG"
              ],
              "enumTitles": [
                "Global (worldwide chart)",
                "United States",
                "United Kingdom",
                "Ireland",
                "Canada",
                "Australia",
                "New Zealand",
                "Germany",
                "Austria",
                "Switzerland",
                "France",
                "Belgium",
                "Netherlands",
                "Luxembourg",
                "Spain",
                "Portugal",
                "Italy",
                "Sweden",
                "Norway",
                "Denmark",
                "Finland",
                "Iceland",
                "Poland",
                "Czechia",
                "Slovakia",
                "Hungary",
                "Romania",
                "Bulgaria",
                "Greece",
                "Ukraine",
                "Turkey",
                "Israel",
                "United Arab Emirates",
                "Saudi Arabia",
                "Egypt",
                "Morocco",
                "Nigeria",
                "Ghana",
                "Kenya",
                "South Africa",
                "Brazil",
                "Mexico",
                "Argentina",
                "Chile",
                "Colombia",
                "Peru",
                "Ecuador",
                "Uruguay",
                "Dominican Republic",
                "Puerto Rico",
                "Japan",
                "South Korea",
                "Taiwan",
                "Hong Kong",
                "India",
                "Pakistan",
                "Indonesia",
                "Philippines",
                "Thailand",
                "Vietnam",
                "Malaysia",
                "Singapore"
              ]
            }
          },
          "artistSearchTerms": {
            "title": "Artist names to search",
            "type": "array",
            "description": "Spotify's artist search matches artist <b>names</b> (not genres): each term returns the 10 best-matching artists. The live search runs on your Apify plan; typing here next to the free demo starts it.",
            "items": {
              "type": "string"
            }
          },
          "minMonthlyListeners": {
            "title": "Min monthly listeners",
            "minimum": 0,
            "type": "integer",
            "description": "Artists below this are dropped before any charge.",
            "default": 1000
          },
          "maxMonthlyListeners": {
            "title": "Max monthly listeners",
            "minimum": 0,
            "type": "integer",
            "description": "Artists above this are dropped before any charge (already too big to scout). 0 = no upper limit — big artists then carry the <code>already_big</code> flag.",
            "default": 500000
          },
          "releasedWithinDays": {
            "title": "Released something in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Drops artists whose newest album or single is older than this. 0 = off.",
            "default": 365
          },
          "targetCountries": {
            "title": "Audience in these countries",
            "type": "array",
            "description": "Keep only artists with at least one of their top-5 listener cities in these countries (the booker's and the label's home market). Empty = any country.",
            "items": {
              "type": "string",
              "enum": [
                "US",
                "GB",
                "IE",
                "CA",
                "AU",
                "NZ",
                "DE",
                "AT",
                "CH",
                "FR",
                "BE",
                "NL",
                "LU",
                "ES",
                "PT",
                "IT",
                "SE",
                "NO",
                "DK",
                "FI",
                "IS",
                "PL",
                "CZ",
                "SK",
                "HU",
                "RO",
                "BG",
                "GR",
                "UA",
                "TR",
                "IL",
                "AE",
                "SA",
                "EG",
                "MA",
                "NG",
                "GH",
                "KE",
                "ZA",
                "BR",
                "MX",
                "AR",
                "CL",
                "CO",
                "PE",
                "EC",
                "UY",
                "DO",
                "PR",
                "JP",
                "KR",
                "TW",
                "HK",
                "IN",
                "PK",
                "ID",
                "PH",
                "TH",
                "VN",
                "MY",
                "SG"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Ireland",
                "Canada",
                "Australia",
                "New Zealand",
                "Germany",
                "Austria",
                "Switzerland",
                "France",
                "Belgium",
                "Netherlands",
                "Luxembourg",
                "Spain",
                "Portugal",
                "Italy",
                "Sweden",
                "Norway",
                "Denmark",
                "Finland",
                "Iceland",
                "Poland",
                "Czechia",
                "Slovakia",
                "Hungary",
                "Romania",
                "Bulgaria",
                "Greece",
                "Ukraine",
                "Turkey",
                "Israel",
                "United Arab Emirates",
                "Saudi Arabia",
                "Egypt",
                "Morocco",
                "Nigeria",
                "Ghana",
                "Kenya",
                "South Africa",
                "Brazil",
                "Mexico",
                "Argentina",
                "Chile",
                "Colombia",
                "Peru",
                "Ecuador",
                "Uruguay",
                "Dominican Republic",
                "Puerto Rico",
                "Japan",
                "South Korea",
                "Taiwan",
                "Hong Kong",
                "India",
                "Pakistan",
                "Indonesia",
                "Philippines",
                "Thailand",
                "Vietnam",
                "Malaysia",
                "Singapore"
              ]
            }
          },
          "minGrowthPct": {
            "title": "Min monthly-listener growth since the last run (%)",
            "minimum": 0,
            "type": "number",
            "description": "From the second run on (the history is kept per artist): drops artists that grew less. 0 = off.",
            "default": 0
          },
          "alertGrowthPct": {
            "title": "Growth alert threshold (%)",
            "minimum": 0,
            "type": "number",
            "description": "An artist you already received comes back (and is charged once more) only when its monthly listeners grew at least this much since the last snapshot — <code>isGrowthAlert: true</code>. 0 = never re-deliver.",
            "default": 20
          },
          "requireSocialLink": {
            "title": "Only artists with an Instagram / TikTok / website",
            "type": "boolean",
            "description": "Drops artists without any social link on their Spotify page — nobody to DM.",
            "default": false
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver artists with 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 (<code>growthAlert</code> works too); an unknown name stops the run with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "independent",
                "growth_alert",
                "recent_release",
                "high_momentum",
                "one_hit",
                "stale",
                "inflated_listeners",
                "no_socials",
                "already_big"
              ],
              "enumTitles": [
                "Independent — no label (self-released / distributor)",
                "Growth alert — listeners jumped since the last run",
                "Recent release — in the last 30 days",
                "High momentum — listeners ≥ 5 × followers",
                "Risk: one-hit — one track carries ≥ 80 % of streams",
                "Risk: stale — no release in the window",
                "Risk: inflated listeners — playlist spike or bought streams",
                "Risk: no socials on the Spotify page",
                "Risk: already big — above 500,000 listeners"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Artist names, Spotify links or IDs to never output (your roster, artists you passed on). Skipped before the scan, never charged.",
            "items": {
              "type": "string"
            }
          },
          "yourOffer": {
            "title": "Who you are and what you offer",
            "type": "string",
            "description": "One line about you (label, manager, promoter, playlist). The pitch line names it exactly as written — never an invented deal."
          },
          "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 artists per run — expect 1–3 AI checks (measured 2026-09-27: ≈ 40.2 s per artist with a free google:gemini-3.6-flash key, 2 of 6 assessed); the AI stops after 2 minutes of rate-limit waiting and the rest keep their rule score, so the run stays short. A paid Groq / Gemini key (billing on) assesses every artist. README → “How long does a run take?” gives the <code>timeoutSecs</code> per mode.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>google/gemini-2.5-flash-lite</code>). 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 candidate pool (× max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. The best rule-scored artists get the AI pass, up to this multiple of <b>Max qualified</b> — the AI can lift a borderline artist over <b>Minimum scout score</b> or drop it. Higher = more thorough, 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 artists as JSON. After every run with at least one new artist, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo."
          },
          "dedupeAcrossRuns": {
            "title": "Remember artists across runs (growth + no repeats)",
            "type": "boolean",
            "description": "Keeps every delivered artist and a monthly-listener snapshot per artist in a named key-value store on your account: the next run skips what you already have (never charged twice) and computes growth since the last run.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Deliver an artist again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "API only — hidden on the form. How long a delivered artist stays remembered. 0 = never deliver or charge it again (a growth alert still re-delivers an artist whose listeners jump). A number of days lets an artist you passed on reach you again after that many days — charged again as a new artist.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "API only — hidden on the form. Type a name (e.g. <code>spotify-artist-scout-ai-log</code>) and every run appends its new artists with the date to that named dataset on your account — one scouting list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "followReleases": {
            "title": "Read every release (label + streams per release)",
            "type": "boolean",
            "description": "Also scrapes each album and single: the record label (independent vs signed from the distributor) and the newest release's streams per day. Each release is one more $0.004 source row on your account — off by default.",
            "default": false
          },
          "maxArtistsToScan": {
            "title": "Max artists to scan",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper bound on artists sent to the source per run (≈ $0.004 each on your account); discovered artists beyond it, and ones you already received, are never scanned.",
            "default": 200
          },
          "autoSwitchToLive": {
            "title": "Typed artists next to the sample start the live scout",
            "type": "boolean",
            "description": "API only — hidden on the form. On (default): artists, playlists or charts typed next to the untouched sample records start the live scout (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 fields 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 Spotify Play Count Scraper, automation-lab/spotify-scraper (artist items) or eduair94/spotify-scraper (artist_play_counts). Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "Artists to score",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of artist objects in the Spotify Play Count Scraper shape (at least <code>name</code> and <code>monthlyListeners</code>; README → List-mode rows). Prefilled with 8 fictional sample artists — the free demo."
          },
          "discoveryActorId": {
            "title": "Source Actor (advanced)",
            "type": "string",
            "description": "API only — hidden on the form. Actor used for the artist scan in <b>actor</b> mode. Any Actor with the Spotify Play Count Scraper input (<code>urls</code>) and artist output works.",
            "default": "beatanalytics/spotify-play-count-scraper"
          },
          "discoveryInput": {
            "title": "Source Actor input (advanced)",
            "type": "object",
            "description": "API only — hidden on the form. Only for <b>actor</b> mode. Extra input merged into the source run as-is (its <code>urls</code> are scanned too). The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, use <b>dataset</b> mode."
          },
          "maxToProcess": {
            "title": "Max candidates to score",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many loaded artists are scored in one run (controls run time). Default = 3 × max qualified."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified artists are POSTed here as JSON (Zapier, Make, n8n, your CRM or A&R sheet). Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "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 delivered-artist memory is kept per source mode and filter set (target countries, flags): rewording <code>scoutBrief</code> or adding a seed, playlist, chart or name keeps it — an artist is the same artist whichever seed finds it. Scouting for several clients on one account? Type one name per client.",
            "default": "spotify-artist-scout-ai-seen"
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "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",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per artist the moment it is ready. Higher = one POST per N artists.",
            "default": 1
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long each source Store Actor run may take before its partial results are used. Raise it 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}