{
  "openapi": "3.0.1",
  "info": {
    "title": "Container Tracking: MSC, Maersk Cargo Updates, Demurrage Alerts",
    "description": "First 25 container updates free. Container tracking for any carrier, pay per qualified container update — junk never charged by us. Where is my container, container status alerts and ETA slips in one format. Free demo on any plan. Replaces 15 single-carrier scrapers; MCP-ready.",
    "version": "0.1",
    "x-build-id": "2C7c21KL1V1LpPjaD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~multi-carrier-tracking-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-multi-carrier-tracking-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~multi-carrier-tracking-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-multi-carrier-tracking-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~multi-carrier-tracking-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-multi-carrier-tracking-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 search (one click)",
            "enum": [
              "custom",
              "forwarder-morning-table",
              "importer-arrival-alerts",
              "tms-webhook-feed"
            ],
            "type": "string",
            "description": "Pick a ready set-up and press Start: it replaces the sample search (the untouched prefill counts as empty), fills the fields you left empty (a value you typed always wins) and tracks its example numbers live, spend-capped by <code>Max source spend</code>. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "trackingNumbers": {
            "title": "Container, B/L or booking numbers",
            "type": "array",
            "description": "One per line — container, B/L or booking (<code>12345678, Maersk, PO-4411, 5</code> = carrier, reference, free days), or a pasted e-mail. Typed next to the free demo they start the live lookup — <b>affects what you pay</b>: one Store Actor lookup each on your Apify plan; a plan that cannot run Store Actors gets the free sample.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "What matters to you? (optional, AI)",
            "type": "string",
            "description": "In plain words, what needs your attention — e.g. 'flag anything late into Rotterdam by 2+ days'. The AI weighs each update against it; container numbers written here are tracked when the list above is empty."
          },
          "notifyEmail": {
            "title": "E-mail me the changes (optional)",
            "type": "string",
            "description": "The digest of every run with a change (counts, ETA slips, demurrage risks, the top 10 with links) is e-mailed here. Sent by Apify's send-mail Actor, so it needs a plan that runs Store Actors — on other plans put a Slack / Teams / Telegram link in <b>Send alerts to</b> (any plan). Never sent for the free demo."
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "0 = every new or changed container is delivered (recommended). Higher = only the updates that need attention (an ETA slip, an arrival, a discharge score 70+); updates below it are dropped and <b>not charged</b> — affects what you pay.",
            "default": 0
          },
          "maxQualified": {
            "title": "Max container updates 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.0092 with AI on (+ ≈ $0.0011 of AI tokens each), × $0.0037 with AI off. Worst case at the default 100: $0.92 here + ≈ $0.11 tokens + your $0.50 lookup cap. The updates that need attention are output first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the carrier tracking Actors may charge your account for the lookups — $0.50, also for an API call that leaves it out (≈ 45 numbers at ≈ $0.011 each: $0.01 a result + $0.001 a run). Split over your carriers; numbers the cap cannot cover get free `lookupFailed` rows. Affects what you pay.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "AI codes for unmapped carrier texts, the status note and, for a box at demurrage risk, the extension / pickup request. <b>On = $0.0092 per container update + ≈ $0.0011 AI tokens; off = $0.0037</b>. Apify's model access (Starter and up) runs google/gemini-3.5-flash-lite — measured with an own key, not measured on the platform yet.",
            "default": true
          },
          "freeTimeDays": {
            "title": "Free time at the port (days, demurrage alerts)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Your free days at the port of discharge. Each discharged box then gets its <code>lastFreeDay</code>, and 3 days before it the <code>dd_risk</code> flag ranks it first with the pickup / extension request — demurrage runs $75–300 a day after it. A line's own 4th part wins (<code>MSCU0203658, MSC, PO-1, 7</code>). 0 = off.",
            "default": 0
          },
          "demurrageRatePerDay": {
            "title": "Demurrage per box per day (USD)",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Your line's demurrage rate. A box at demurrage risk gets <code>demurrageAtRiskUsd</code> = (days past its last free day + 3) × this rate, and the digest opens with the total at risk (\"≈ $1,350 at risk, 3 boxes\"). Typical $75–300; 0 = off. Changes no price.",
            "default": 150
          },
          "numbersSheetUrl": {
            "title": "Your container list as a Google Sheet (optional)",
            "type": "string",
            "description": "A Google Sheet shared as 'Anyone with the link' (or any CSV link), read on every run: columns <code>number</code>, <code>carrier</code>, <code>reference</code>, <code>freeDays</code> (or the number in the first column). Its numbers are tracked next to the ones above — the sheet stays your list. <b>Affects what you pay:</b> one lookup per number on your Apify plan; a plan that cannot run Store Actors gets the free sample instead."
          },
          "targetFlags": {
            "title": "Only these changes (any of)",
            "type": "array",
            "description": "Deliver only the updates with at least one of these flags — e.g. ETA slipped + arrived for a consignee alert. Leave empty to keep everything. An API call passes the flag names from the README's flag table, e.g. <code>eta_slipped</code> (<code>etaSlipped</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "dd_risk",
                "eta_slipped",
                "eta_earlier",
                "arrived",
                "departed",
                "milestone_changed",
                "first_seen",
                "no_eta",
                "unmapped_events",
                "not_tracked"
              ],
              "enumTitles": [
                "Demurrage risk: discharged, the last free day ≤ 3 days away or past",
                "The ETA moved later by at least etaSlipAlertDays since the last run",
                "The ETA moved earlier by at least etaSlipAlertDays since the last run",
                "Reached the port of discharge (arrived, discharged, delivered or empty returned)",
                "The last milestone is a load or a vessel departure",
                "A new milestone since the last run",
                "The first time this container is tracked in this monitor",
                "The carrier shows no ETA for it",
                "An event the rule table could not map to a DCSA code (kept as OTHER with its text)",
                "Not looked up or not answered: invalid number, unknown carrier or a failed lookup (free)"
              ]
            }
          },
          "etaSlipAlertDays": {
            "title": "Flag an ETA move of at least (days)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "An ETA that moved later (or earlier) by at least this many days since the last check gets the <code>eta_slipped</code> / <code>eta_earlier</code> flag, ranks first and is counted in the digest. 1 = every slip of a day or more.",
            "default": 1
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Names, URLs or ids to never output. Suppressed container updates are skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — your OpenAI / Anthropic / Gemini / Groq key instead. Measured 2026-10-24 with a free google:gemini-3.5-flash-lite key: ≈ 2.7–12.2 s per container update (2.7 s locally; 4.6, 7.3 and 12.2 s on Apify) — set the timeout from the slowest: 50 updates ≈ 790 s. With a free-tier key expect 1–3 AI checks per run (the rest keep their rule score); a paid Groq / Gemini key (billing on) assesses every container update.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default: <code>google/gemini-3.5-flash-lite</code> through Apify (the model measured with an own key; not measured on the platform yet), <code>google:gemini-3.5-flash-lite</code> with your own key (measured). Apify mode takes an OpenRouter slug; own-key mode takes <code>provider:model</code>."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "aiCandidateMultiplier": {
            "title": "AI shortlist size, × max qualified (API only)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. How many of the best rule-scored container updates 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 container updates as JSON. After every run with at least one new container update, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>."
          },
          "dedupeAcrossRuns": {
            "title": "Only changes — skip unchanged containers",
            "type": "boolean",
            "description": "The monitor: on means a container is skipped only while it is unchanged — every new milestone or ETA move is delivered. remembers each container's last state (status, milestone, ETA) in a named key-value store on your account; a container in the same state as last run is skipped and <b>not charged</b>, a changed one comes back with <code>changeType</code> and the ETA slip in days.",
            "default": true
          },
          "monitorStoreName": {
            "title": "Monitor name (one per client, optional)",
            "type": "string",
            "description": "Names the monitor's memory — the last known state of every container — on your Apify account. Empty = one memory per list of numbers (adding a number keeps it). Running it for several clients, type one name per client so their containers never mix.",
            "default": ""
          },
          "clientName": {
            "title": "Client name on the report (optional)",
            "type": "string",
            "description": "White-label: \"Container updates for <client>\" heads the forwardable REPORT page and the digest. Running it for several clients, save one task per client with its numbers, this name and its own <b>Monitor name</b>.",
            "default": ""
          },
          "brandName": {
            "title": "Your company name on the report (optional)",
            "type": "string",
            "description": "White-label: \"by <your company>\" next to the client name on the REPORT page and the digest your client receives.",
            "default": ""
          },
          "includeEvents": {
            "title": "Include the full event list",
            "type": "boolean",
            "description": "Every row carries all its events in one format (DCSA code, text, place, UN/LOCODE, time, actual or estimated, vessel). Off = only the last milestone — smaller rows for a TMS webhook.",
            "default": true
          },
          "pollPolicy": {
            "title": "Which numbers to look up each run",
            "enum": [
              "smart",
              "every"
            ],
            "type": "string",
            "description": "<b>Smart</b> (default): a delivered or empty-returned box is checked once more, then never looked up again; a box in the ocean with its ETA more than 7 days out is looked up every 3rd run — the lookups you pay the carrier Actors for drop by about half on a daily schedule. <b>Every run</b>: every number, every time. Affects what you pay.",
            "default": "smart"
          },
          "dedupeTtlDays": {
            "title": "Send an unchanged container again after (days) (API only)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "API only — hidden on the form. 0 = a container in the same state is never sent again. A number of days re-sends an unchanged container after that many days (a weekly 'still in transit' line) — charged again as a new update.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>multi-carrier-tracking-ai-seen-log</code>) and every run appends its new container updates 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 numbers or results come from?",
            "enum": [
              "live",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "The mode that runs = this field, except <code>{}</code> over the API = the free demo (nothing charged). <b>live</b> — look up <code>trackingNumbers</code> with each carrier's Store tracking Actor on your account, billed separately. <b>dataset</b> — an existing Apify dataset of carrier results or of numbers. <b>list</b> — carrier results (or numbers) you paste in, no lookup, any plan. The mode you choose always runs as chosen; only the untouched sample next to numbers you typed on the Console form switches to the live lookup (spend-capped).",
            "default": "live"
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live search (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. On (default, Console runs only): 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. Over the API the mode you send is always the mode that runs.",
            "default": true
          },
          "failOnSourceError": {
            "title": "Fail the run when no container update could be loaded",
            "type": "boolean",
            "description": "Off (default): a plan that cannot run the source Store Actor ends SUCCEEDED with 0 rows and <code>OUTPUT.ok: false</code>. On: the same run ends FAILED with the same message, so a schedule's or an API pipeline's failed-run alert fires. Turn it on for every schedule.",
            "default": false
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode. Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "Carrier results or numbers to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. A JSON array: carrier tracking results in any carrier Actor's shape (MSC, Maersk, CMA CGM / DCSA, or a flat <code>events</code> list — README → List-mode rows), or rows with only <code>trackingNumber</code> (+ <code>carrier</code>, <code>reference</code>), which are looked up like <code>trackingNumbers</code>."
          },
          "discoveryInput": {
            "title": "Extra carrier Actor input (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Extra fields passed to every carrier tracking Actor next to <code>trackingNumbers</code>; leave it empty."
          },
          "maxToProcess": {
            "title": "Max container updates to check per run (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many container updates are scored in one run (controls run time). Default = 3 × max output."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified container updates 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 (optional) (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 container update the moment it is ready. Higher = one POST per N container updates.",
            "default": 1
          },
          "webhookSecret": {
            "title": "Webhook signing secret (optional) (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Any random string. Every webhook POST then carries <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body with this secret&gt;</code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged."
          },
          "dedupeStoreName": {
            "title": "Dedupe store name (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source and search terms): rewording <code>goalDescription</code> keeps it, so a scheduled run never re-delivers what you already have, and another search starts its own list. Running it for several clients on one account, type one name per client.",
            "default": "multi-carrier-tracking-ai-seen"
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long the source Store Actor may run before its partial results are used — never more than 60 % of the run's time left, so the AI, the charges and the digest keep the rest. Raise it (and the run timeout) 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}