{
  "openapi": "3.0.1",
  "info": {
    "title": "Xiaohongshu KOL Finder: RedNote Influencers Scored by AI",
    "description": "First 25 creators free. Xiaohongshu KOL finder, pay per qualified creator: your niche in English → vetted RedNote creators, AI brand fit and a Chinese DM. Pugongying alternative for MCP & AI agents. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.1",
    "x-build-id": "KaqK8rmrAFa8Xi8oW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~xiaohongshu-kol-finder-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-xiaohongshu-kol-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~xiaohongshu-kol-finder-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-xiaohongshu-kol-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~xiaohongshu-kol-finder-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-xiaohongshu-kol-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 niche search (one click)",
            "enum": [
              "custom",
              "clean-skincare",
              "specialty-coffee",
              "travel-tourism",
              "study-abroad",
              "pet-food",
              "agency-multi-niche",
              "vet-my-list"
            ],
            "type": "string",
            "description": "One click: pick a niche and press Start — it fills the search fields you left empty and runs the live search (spend-capped below). Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "nicheKeywords": {
            "title": "Your niche, in English (or Chinese)",
            "type": "array",
            "description": "What your brand sells or what creators post about, e.g. <code>camping gear</code> — the AI adds the Chinese terms creators search. Typed next to the sample, it starts the live search (spend-capped below). The full live search needs a paid Apify plan; a plan that refuses it gets ≤ 5 real creators from zen-studio's scraper.",
            "items": {
              "type": "string"
            }
          },
          "brandBrief": {
            "title": "Your brand brief",
            "type": "string",
            "description": "Brand, product, price point, target audience and campaign goal in plain words. The AI scores every creator's brand fit against it and writes the first DM from it — only facts you write here go into the DM (no invented fees or free products)."
          },
          "maxQualified": {
            "title": "Max qualified creators to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Affects what you pay: the ceiling of what <b>this Actor</b> charges — at most this many × $0.02 with AI on (× $0.0077 with AI off), e.g. 50 × $0.02 = $1.00; the source's own spend has its cap right below. The best-scoring creators are output first.",
            "default": 50
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Affects what you pay: hard cap on what the RedNote source runs may charge your account in <b>actor</b> mode (searches + profile lookups, estimated from the source's row price) — $1.00 in the form and for an API call that leaves it out.",
            "default": 1
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Brand-fit score with reasons, English summary, translated note titles, risk and sponsored-post signals, and a Chinese DM with English gloss. <b>On = $0.02 per qualified creator + AI tokens (≈ $0.009 measured); off = $0.0077</b>. Your first 5 creators get live AI verdicts on any plan; all 25 free creators with Apify model access or a paid own key.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new creators (optional)",
            "type": "string",
            "description": "The digest of each run with new creators (how many are new, the 5 to contact first, the top 10 with links), e-mailed here via Apify's send-mail Actor. Schedule the run weekly and only new creators reach your inbox. Never sent for the free demo. A delivered digest is one $0.05 event per run — your first 4 are free."
          },
          "minScore": {
            "title": "Minimum fit score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Affects what you pay: creators scoring below this are discarded and <b>not charged</b>. With AI on it is the AI brand-fit score, otherwise the rule fit score. Raise it to pay only for the strongest matches. (Called <code>minFitScore</code> in the first draft.)",
            "default": 50
          },
          "minFollowers": {
            "title": "Min followers",
            "minimum": 0,
            "type": "integer",
            "description": "Creators with fewer followers are dropped free, after the profile lookup. 1,000 keeps out empty accounts; 0 keeps every KOC.",
            "default": 1000
          },
          "maxFollowers": {
            "title": "Max followers",
            "minimum": 0,
            "type": "integer",
            "description": "Creators above this are dropped free — 500,000 keeps out head KOLs whose rates are out of a seeding budget.",
            "default": 500000
          },
          "tiers": {
            "title": "Follower tiers",
            "type": "array",
            "description": "Only these tiers (the 素人 / 初级 / 腰部 / 头部 convention). Empty = every tier inside the follower range.",
            "items": {
              "type": "string",
              "enum": [
                "koc",
                "junior",
                "mid",
                "head"
              ],
              "enumTitles": [
                "KOC (< 5k)",
                "Junior (5k–50k)",
                "Mid-tier (50k–500k)",
                "Head (500k+)"
              ]
            },
            "default": []
          },
          "minEngagementRate": {
            "title": "Min engagement rate (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Median likes + collects + comments of the creator's matching notes ÷ followers. 0 = off. A creator whose rate is unknown fails a threshold above 0.",
            "default": 0
          },
          "locations": {
            "title": "Locations (IP location)",
            "type": "array",
            "description": "Keep creators whose RedNote IP location contains one of these, e.g. <code>上海</code>, <code>广东</code>, <code>浙江</code>. Empty = anywhere.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "accountTypes": {
            "title": "Account types",
            "type": "array",
            "description": "Creator accounts only by default — brand official accounts, stores and media accounts are dropped free.",
            "items": {
              "type": "string",
              "enum": [
                "creator",
                "brand_official",
                "store",
                "media",
                "unknown"
              ],
              "enumTitles": [
                "Creator",
                "Brand official account",
                "Store / shop",
                "Media / magazine",
                "Unknown"
              ]
            },
            "default": [
              "creator"
            ]
          },
          "requireBusinessContact": {
            "title": "Only creators with a contact in the bio",
            "type": "boolean",
            "description": "Keep only creators who print a collaboration contact (合作 / 商务 / 📮 / vx / e-mail) in their public bio.",
            "default": false
          },
          "excludeUserIds": {
            "title": "Exclude creators",
            "type": "array",
            "description": "RedNote user ids or profile URLs never to deliver (your own account, competitors, creators you already work with) — dropped before the paid profile lookup.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver creators with at least one of these flags, e.g. <code>business_contact</code>, <code>high_engagement</code>, <code>sponsored_experience</code>, <code>mcn_signed</code> (<code>businessContact</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Chinese search terms (as typed)",
            "type": "array",
            "description": "Extra search terms searched exactly as typed, e.g. <code>露营装备</code> — added to the terms the AI builds from your niche. The live search runs a Store Actor on your Apify plan — on any plan, paste rows in <b>list</b> mode instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "localiseKeywords": {
            "title": "Translate my niche into Chinese search terms",
            "type": "boolean",
            "description": "On: the AI turns each niche keyword into the Chinese phrases creators type (needs AI on). Off: your keywords are searched exactly as typed.",
            "default": true
          },
          "termsPerKeyword": {
            "title": "Search terms per keyword (1–5)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Affects what you pay: searches per niche keyword, your keyword included (3 = your keyword + 2 Chinese phrases). Each one reads up to <b>Notes per search term</b> notes.",
            "default": 3
          },
          "topicUrls": {
            "title": "Topic pages",
            "type": "array",
            "description": "RedNote topic (话题) page URLs whose hot notes are read too — default source only. The live search runs a Store Actor on your Apify plan — on any plan, paste rows in <b>list</b> mode instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "profileUrls": {
            "title": "Vet known creators (profile URLs)",
            "type": "array",
            "description": "RedNote profile URLs or user ids to vet directly — no search, straight to the profile lookup and the same scoring. The live search runs a Store Actor on your Apify plan — on any plan, paste rows in <b>list</b> mode instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "notesPerKeyword": {
            "title": "Notes per search term",
            "minimum": 10,
            "maximum": 500,
            "type": "integer",
            "description": "Affects what you pay: notes read per search term (the source bills each note row, ≈ $0.005). 30 finds ≈ 15–25 authors per term.",
            "default": 30
          },
          "sortBy": {
            "title": "Sort notes by",
            "enum": [
              "general",
              "like_count_descending",
              "collect_count_descending",
              "comment_count_descending",
              "time_descending"
            ],
            "type": "string",
            "description": "RedNote's own sort for the search.",
            "default": "general"
          },
          "noteType": {
            "title": "Note type",
            "enum": [
              "all",
              "image",
              "video"
            ],
            "type": "string",
            "description": "Image notes, video notes or both.",
            "default": "all"
          },
          "publishedWithin": {
            "title": "Published within",
            "enum": [
              "all",
              "day",
              "week",
              "half_year"
            ],
            "type": "string",
            "description": "Only notes from this window count as matching notes (a source filter and a free filter).",
            "default": "half_year"
          },
          "minMatchingNotes": {
            "title": "Min matching notes per creator",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Authors with fewer matching notes in the search are dropped free, before the paid profile lookup.",
            "default": 1
          },
          "minNoteLikes": {
            "title": "Min median likes per note",
            "minimum": 0,
            "type": "integer",
            "description": "Median likes of the author's matching notes — below it the author is dropped free, before the paid profile lookup.",
            "default": 50
          },
          "maxProfilesToCheck": {
            "title": "Max profiles to look up",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Affects what you pay: cap of paid profile lookups per run (≈ $0.005 each on the default source) — the authors with the best median engagement × matching notes first.",
            "default": 25
          },
          "recentNotesPerCreator": {
            "title": "Recent notes per creator",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Affects what you pay: 0 = off. Reads this many of each profiled creator's latest notes for posting cadence (<code>postsPerWeek</code>) and sponsored share — ≈ +$0.05 per creator at 10 notes.",
            "default": 0
          },
          "includeOutreachDm": {
            "title": "Write a first DM in Chinese",
            "type": "boolean",
            "description": "A polite first outreach DM in Simplified Chinese (≤ 300 characters) with an English gloss, from your brief and the creator's own note titles.",
            "default": true
          },
          "sourceActor": {
            "title": "RedNote data source",
            "enum": [
              "socialdatax",
              "zen-studio"
            ],
            "type": "string",
            "description": "<b>socialdatax</b> — <code>socialdatax/socialdatax-xhs-data-api</code>, $0.00499 per row, one Actor for search and profiles, cookie-free (default). <b>zen-studio</b> — <code>zen-studio/rednote-search-scraper</code> + <code>zen-studio/rednote-user-profile-scraper</code>: batch profiles with MCN agency tags, $0.05 start + $0.0299 per profile. Both run on your Apify account.",
            "default": "socialdatax"
          },
          "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 creators per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline creators retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every creator. Measured ≈ 4–9.1 s per creator with a Groq key (openai/gpt-oss-120b: 4 s on 2026-09-30, 9.1 s on 2026-09-29) — size a 50-creator timeout at ≈ 635 s.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>, strong on Simplified Chinese). 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": "How many of the best rule-scored creators get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "slackWebhookUrl": {
            "title": "Post the new creators to Slack (optional)",
            "type": "string",
            "description": "A Slack incoming-webhook URL (<code>https://hooks.slack.com/services/…</code>). After every run with at least one new creator, the digest (how many are new, the 5 to contact first, the top 10 with links) is posted to that channel as a readable message — not raw JSON. Never sent for the free demo."
          },
          "discordWebhookUrl": {
            "title": "Post the new creators to Discord (optional)",
            "type": "string",
            "description": "A Discord channel webhook URL (<code>https://discord.com/api/webhooks/…</code>). After every run with at least one new creator, the same digest as Slack is posted to that channel. Never sent for the free demo."
          },
          "teamsWebhookUrl": {
            "title": "Post the new creators to Microsoft Teams (optional)",
            "type": "string",
            "description": "A Teams Workflows webhook URL (in the channel: ⋯ → Workflows → <i>Post to a channel when a webhook request is received</i>). The same digest as Slack, posted as a card. Never sent for the free demo."
          },
          "googleChatWebhookUrl": {
            "title": "Post the new creators to Google Chat (optional)",
            "type": "string",
            "description": "A Google Chat space webhook URL (<code>https://chat.googleapis.com/v1/spaces/…</code>). The same digest as Slack, posted to that space. Never sent for the free demo."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified creators are POSTed here as JSON (Zapier, Make, n8n, your CRM) — profile URL, contact hint and DM included. 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 creator the moment it is ready. Higher = one POST per N creators.",
            "default": 1
          },
          "alertMinFitScore": {
            "title": "Webhook only from this score up",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Per-creator webhook alerts only for creators scoring at least this (e.g. 75 = the top picks to your CRM at once). 0 = every delivered creator. The digest always covers every creator.",
            "default": 0
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same creator twice",
            "type": "boolean",
            "description": "Remembers every creator you received (in a named key-value store on your account) and skips it in future runs — checked before the paid profile lookup, so a repeat costs nothing at all.",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source mode and niche / search terms): rewording <code>brandBrief</code> keeps it, adding a term starts a new memory. Running it for several clients on one account, type one name per client.",
            "default": "xiaohongshu-kol-finder-ai-seen"
          },
          "dedupeTtlDays": {
            "title": "Deliver a creator again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered creator stays remembered. 0 = never deliver or charge it again. A number of days lets a creator reach you again after that many days (for a new campaign) — charged again as a new creator.",
            "default": 0
          },
          "resetState": {
            "title": "Forget the creators of this search",
            "type": "boolean",
            "description": "On: this run forgets every creator remembered for this search and may deliver (and charge) them again — for a new campaign on the same niche. Leave off for weekly runs.",
            "default": false
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>rednote-kol-log</code>) and every run appends its new creators with the date to that named dataset on your account — one list across campaigns to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the creators come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — search RedNote live with the source Actor on your account, billed by the source. <b>dataset</b> — an existing Apify dataset of RedNote notes / profiles. <b>list</b> — rows you paste in. The mode you choose always runs as chosen; only the untouched sample records next to a niche you typed switch to the live search (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.",
            "default": "actor"
          },
          "autoSwitchToLive": {
            "title": "Typed niche next to the sample starts the live search",
            "type": "boolean",
            "description": "On (default): a niche typed next to the untouched sample rows starts the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names it). 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 of notes / profiles",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset from either RedNote source (search / topic / creator notes, or profiles). Pick it so the Actor is granted read access."
          },
          "profileDatasetId": {
            "title": "Dataset of profiles (optional)",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset of <code>get_user_info</code> / profile rows for the note authors."
          },
          "lookupMissingProfiles": {
            "title": "Look up authors without a profile row",
            "type": "boolean",
            "description": "Dataset mode: authors without a profile row are looked up with the source Actor (billed by the source, capped by the source spend cap). Off: they are scored on note data with <code>followers: null</code>.",
            "default": false
          },
          "itemsList": {
            "title": "Rows to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of RedNote notes (<code>note_id</code>, <code>title</code>, <code>author_user_id</code>, <code>author_name</code>, <code>like_count</code> …) and / or profiles (<code>user_id</code>, <code>name</code>, <code>bio</code>, <code>follower_count</code> …, optionally with their <code>notes</code>) — either source's field names work. Any plan, no source cost: fill the README's list template from a Pugongying / Qiangua export or your own spreadsheet."
          },
          "discoveryInput": {
            "title": "Extra source input (advanced)",
            "type": "object",
            "description": "Only for <b>actor</b> mode: fields merged into every search call of the source Actor as-is (see its input schema). The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own rows in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have from another account or tool."
          },
          "sourceConcurrency": {
            "title": "Source runs at once",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many source runs (searches, profile lookups) run in parallel on your account.",
            "default": 4
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout (seconds)",
            "minimum": 60,
            "maximum": 3600,
            "type": "integer",
            "description": "Each source run stops after this many seconds; what it returned by then is used.",
            "default": 600
          },
          "maxToProcess": {
            "title": "Max creators to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many profiled creators are scored in one run (controls run time). Default = 3 × max qualified."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}