{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook Page Post Tracker: AI Winning Posts & Offers",
    "description": "First 25 posts free. Facebook page post tracker: pay per qualified post. Monitor competitor Facebook pages, find top performing Facebook posts by engagement, track promotions, launches with AI analysis. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.1",
    "x-build-id": "ujac9httnWprH1qYY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~fb-page-post-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-fb-page-post-tracker",
        "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~fb-page-post-tracker/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-fb-page-post-tracker",
        "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~fb-page-post-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-fb-page-post-tracker",
        "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": {
          "pageUrls": {
            "title": "Facebook page links",
            "type": "array",
            "description": "Public Facebook page links, one per line, e.g. <code>https://www.facebook.com/brightsidecoffee</code>. Each post is compared with <b>its own page's</b> median. Typing links starts the live search: it runs a Store Actor on your Apify plan, spend-capped below (no such plan: paste posts in list mode). Empty = free demo; only a goal = keywords derived from it.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords (find buying-intent posts)",
            "type": "array",
            "description": "Search public Facebook posts by keyword, e.g. <code>kids balance bike</code>, one per line — finds people asking where to buy. Used when no page links are given. Affects what you pay: each post bills $0.006 on your Apify account, up to <b>Posts per page or keyword</b> per line. The live search runs a Store Actor on your Apify plan.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "What are you looking for?",
            "type": "string",
            "description": "Describe the ideal post in plain words (an offer, a launch, someone asking where to buy). The AI scores every post against this and explains why; empty = the posts that beat their page's usual engagement. Non-English pages: leave the AI on — the free rules read English, Spanish, Portuguese, French and German."
          },
          "preset": {
            "title": "Start from a ready niche search (one click)",
            "enum": [
              "custom",
              "competitor-offers",
              "buying-intent",
              "launch-watch"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it fills the search fields you left empty and runs the live search — each preset's first scan is capped at $0.15 of source spend (8–10 posts per page or keyword) until its yield is measured. Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Score each post against your goal, explain why and write a takeaway. <b>On = $0.01 per qualified post + AI tokens (≈ $0.013 incl. tokens); off = $0.0043</b> (rule-based flags and scores only). Your first 5 posts get live AI verdicts on any plan; every one with Apify model access or a paid own key. Non-English pages: leave it on.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new posts (optional)",
            "type": "string",
            "description": "After every run with at least one new post, the run's digest (how many are new, the top 10 with links) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly (Actions → Schedule) and only the new posts come to your inbox — no Slack or Zapier needed. Never sent for the free demo."
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: posts scoring below this are discarded and <b>not charged</b> — except a post of one of your post types, which always qualifies. A post at twice its page's median scores about 55. Raise it to pay only for the strongest, lower it to see more.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max qualified posts 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.0043 with AI off), e.g. 100 × $0.01; the source's own spend has its cap right below. The best-scoring posts are output first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the source Actor run 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 bigger searches.",
            "default": 0.5
          },
          "pageIds": {
            "title": "Facebook page IDs",
            "type": "array",
            "description": "Numeric page or profile IDs, one per line (the source's <code>profile_posts</code> endpoint) — the same as page links when you only have the IDs. Used when no page links are given. The live search runs a Store Actor on your Apify plan.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerPage": {
            "title": "Posts per page or keyword",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many of the latest posts the source reads per page link, ID or keyword. Affects what you pay: each post bills about $0.006 on your Apify account, so 20 posts × 5 pages ≈ $0.60 (capped by <b>Max source spend</b>). The page's baseline is the median of these posts — below 5 posts a page has a weak baseline and no outliers.",
            "default": 20
          },
          "startDate": {
            "title": "Only posts since (date)",
            "type": "string",
            "description": "<code>YYYY-MM-DD</code>. Passed to the source (it bills fewer rows) and applied as a free filter. The page's baseline is then built from the posts inside the window. Empty = the latest posts."
          },
          "endDate": {
            "title": "Only posts until (date)",
            "type": "string",
            "description": "<code>YYYY-MM-DD</code>. Same as above for the end of the window. Empty = up to today."
          },
          "postTypes": {
            "title": "Always qualify these post types",
            "type": "array",
            "description": "Pick the types that always qualify, whatever their score — e.g. <b>Buying intent</b> to never miss someone asking where to buy. Empty = the score and outliers decide. Over the API send the values (<code>promo</code>, <code>buying_intent</code> …); an unknown one stops the run with the list.",
            "items": {
              "type": "string",
              "enum": [
                "promo",
                "launch",
                "hiring",
                "event",
                "complaint",
                "question",
                "buying_intent",
                "other"
              ],
              "enumTitles": [
                "Promotion (discount, sale, coupon)",
                "Launch (new product, new arrival)",
                "Hiring",
                "Event (opening, webinar, workshop)",
                "Complaint",
                "Question",
                "Buying intent (asking where to buy / who to recommend)",
                "Other"
              ]
            }
          },
          "onlyOutliers": {
            "title": "Only outlier posts",
            "type": "boolean",
            "description": "On: drop every post that does not beat its page's median engagement by the multiple below — before any AI or charge. Off (default): the score decides.",
            "default": false
          },
          "outlierMultiple": {
            "title": "Outlier multiple (×)",
            "minimum": 1,
            "maximum": 50,
            "type": "number",
            "description": "A post is an outlier when its engagement (reactions + 2 × comments + 3 × shares) is at least this many times its page's median — and the page has 5 or more posts.",
            "default": 2
          },
          "minReactions": {
            "title": "Min reactions",
            "minimum": 0,
            "type": "integer",
            "description": "Free filter: drop posts with fewer reactions. 0 = off.",
            "default": 0
          },
          "skipReshares": {
            "title": "Skip reshares without own text",
            "type": "boolean",
            "description": "On (default): a reshare that carries no text of its own is dropped for free — it is someone else's post.",
            "default": true
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver posts that have at least one of these flags, and rank those with more of them higher. Leave empty to keep everything. Over the API send the flag names, e.g. <code>offer_detected</code> (<code>offerDetected</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "outlier_post",
                "weak_baseline",
                "promo_post",
                "launch_post",
                "hiring_post",
                "event_post",
                "complaint_post",
                "question_post",
                "buying_intent",
                "offer_detected",
                "external_link",
                "video_post"
              ],
              "enumTitles": [
                "Winner — beats its page's median by the outlier multiple",
                "Weak baseline (page has fewer than 5 posts)",
                "Promotion",
                "Launch",
                "Hiring",
                "Event",
                "Complaint",
                "Question",
                "Buying intent",
                "Names an offer (discount, price, deadline, code)",
                "Links outside Facebook",
                "Video post"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Names, URLs or ids to never output. Suppressed posts are skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "includeAds": {
            "title": "Add each page's longest-running ads (competitor brief)",
            "type": "boolean",
            "description": "Off by default. On: the same pages are also checked in the Meta Ad Library (our Facebook Ad Library Winning Ads Finder, rules only) and each page's top 3 running ads join the REPORT next to its winning posts. Page links only, live search only. Affects what you pay: <b>$0.10 per page with ads found</b> (competitor-brief) + the ad search on your account, capped at $0.30.",
            "default": false
          },
          "insights": {
            "title": "What wins in your niche (insights)",
            "type": "boolean",
            "description": "Off by default. On: the REPORT and <code>OUTPUT.insights</code> compare the winners with the rest by media type, weekday, hour, post length and post type — the pattern behind the winners. Affects what you pay: <b>$0.05 per run</b> (niche-insights), only when at least 10 posts were read and 3 winners found.",
            "default": false
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few posts per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline posts retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every post.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</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> — left empty there, your key's vendor picks it (a Gemini key: <code>google:gemini-3.5-flash-lite</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) (API only)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. How many of the best rule-scored candidates get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "sendAlertsTo": {
            "title": "Send alerts to (Slack, Discord, Teams, Google Chat, Telegram or webhook)",
            "type": "string",
            "description": "Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot&lt;token&gt;/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets the posts as JSON. After every run with at least one new post, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Webhook headers, batching and signing are API-only inputs (<code>webhookHeaders</code>, <code>webhookBatchSize</code>, <code>webhookSecret</code>)."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same post twice",
            "type": "boolean",
            "description": "Remembers every post you were charged for (in a named key-value store on your account) and skips it in future runs.",
            "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 and search terms): rewording <code>goalDescription</code> keeps it, so a scheduled run never re-delivers what you already have, and another search starts its own list. Running it for several clients on one account, type one name per client.",
            "default": "fb-page-post-tracker-seen"
          },
          "dedupeTtlDays": {
            "title": "Deliver a post again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered post stays remembered. 0 = never deliver or charge it again. A number of days lets a post that comes back (a seasonal peak, a relisted item) reach you again after that many days — charged again as a new post.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>fb-page-post-tracker-seen-log</code>) and every run appends its new posts with the date to that named dataset on your account — one list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the posts come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — run <code>cleansyntax/facebook-profile-posts-scraper</code> on your account, billed separately. <b>dataset</b> — an existing Apify dataset. <b>list</b> — records you paste in. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — the source Actor is never run. The mode you choose always runs as chosen; only the untouched sample records next to a search 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 search next to the sample starts the live search",
            "type": "boolean",
            "description": "On (default): search terms typed next to the untouched sample records start the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the terms it did not search. 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. Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "Posts to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of Facebook posts, one object each, with at least <code>post_id</code> (or <code>url</code> or <code>message</code>) and ideally <code>message</code>, <code>timestamp</code>, <code>reactions_count</code>, <code>comments_count</code>, <code>reshare_count</code> and <code>author</code> (<code>name</code>, <code>url</code>) — the fields <code>cleansyntax/facebook-profile-posts-scraper</code> returns. Pasted posts are compared with the other posts of their page, so paste several per page."
          },
          "discoveryActorId": {
            "title": "Source Actor (advanced)",
            "type": "string",
            "description": "Actor used in <b>actor</b> mode. Any Actor whose output has the fields listed in the README works.",
            "default": "cleansyntax/facebook-profile-posts-scraper"
          },
          "discoveryInput": {
            "title": "Source Actor input (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Only for <b>actor</b> mode. Extra input passed to the source Actor as-is, field by field over what the form fields above build (<code>endpoint</code>, <code>urls_text</code>, <code>ids_text</code>, <code>keywords_text</code>, <code>max_posts</code>, <code>start_date</code>, <code>end_date</code>). See the source Actor's input schema. The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own records in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have from another account or tool."
          },
          "maxToProcess": {
            "title": "Max candidates to process (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many posts are scored in one run (controls run time). Default = 3 × max qualified."
          },
          "webhookUrl": {
            "title": "Webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Qualified posts are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "webhookHeaders": {
            "title": "Webhook headers (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted by Apify, never logged."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size (API only)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per post the moment it is ready. Higher = one POST per N posts.",
            "default": 1
          },
          "webhookSecret": {
            "title": "Webhook signing secret (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Any random string. Every webhook POST then carries <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body with this secret&gt;</code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged."
          },
          "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": "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}