{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"At a Glance","description":"Empower your business with AI-driven insights on creator compliance and brand safety through VwD's comprehensive API."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We're rolling out a major update to the VwD Public API that introduces a flexible, usage-based ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["token model"]}," for creator scans, three new endpoints, and richer responses on the endpoints you already use. This post lays out ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["what's changing, what (if anything) will break, and how to migrate"]}," before the production cutover."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status:"]}," these changes are live for early integration on QA (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.qa.vwd.ai/api/public/v1/"]},"). A production rollout date will be announced ahead of cutover."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"at-a-glance"},"children":["At a Glance"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Token-based pricing"]}," for creator scans, re-scans, and monitoring. Plan-based seat limits no longer govern the API."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3 new endpoints"]}," for budget discovery, scan catalogs, and re-scanning."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3 breaking changes"]}," — quota error shape, bulk-create semantics, and an explicit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}," default. Details below."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?dry_run=true"]}]}," lets you preview the token cost and outcome of any billable action without side effects."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New response fields"]}," that surface scan depth, visibility windows, and pipeline state. Additive — safe for existing clients."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"breaking-changes"},"children":["Breaking Changes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There is no backward-compatibility shim — these are a hard cutover. Update before the production rollout."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1.-quota-errors-return-402-payment-required--not-403-quota-exceeded"},"children":["1. Quota errors return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["402 Payment Required"]},", not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403 Quota exceeded"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Endpoints that previously rejected quota-exhausted requests with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403"]}," now return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["402"]}," with a standardized envelope."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Before:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"HTTP/1.1 403 Forbidden\n{\n  \"detail\": \"Quota exceeded\",\n  \"limit\": 100,\n  \"used\": 100,\n  \"remaining\": 0,\n  \"reason_code\": \"QUOTA_EXCEEDED\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["After:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"HTTP/1.1 402 Payment Required\n{\n  \"type\": \"client_error\",\n  \"errors\": [\n    { \"code\": \"insufficient_tokens\", \"detail\": \"...\", \"attr\": null }\n  ],\n  \"required\": 3,\n  \"available\": 1,\n  \"is_admin\": null\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The body has three variants keyed by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errors[0].code"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"code"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Meaning"},"children":["Meaning"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Extra fields"},"children":["Extra fields"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["insufficient_tokens"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not enough tokens for this action. Top up to retry."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["required"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["available"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_admin"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api_disabled"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your organization's API token limit is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]},". Contact support."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason_code: \"API_DISABLED\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api_budget_exhausted"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Lifetime API budget reached. Does not reset. Contact support."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason_code"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["consumed"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["requested"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do:"]}," any client branching on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403 Quota exceeded"]}," must re-route to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["402"]}," and parse the new body shape."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2.-bulk-create-is-all-or-nothing-at-the-budget-gate"},"children":["2. Bulk create is all-or-nothing at the budget gate"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/"]}," with a top-level ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["items"]}," array previously created creators up to your remaining allowance and reported per-item ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"quota_exceeded\""]},". It now performs a single up-front budget check: ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["if you cannot afford the whole batch, the entire request returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["402"]}," and nothing is created or charged"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Per-row save failures ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["after"]}," the budget gate (rare race conditions, integrity errors) now appear as a new row status:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{ \"index\": 5, \"status\": \"failed\", \"errors\": { \"_\": \"<server-side message>\" } }\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Rows with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"failed\""]}," are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," charged, and the rest of the batch continues normally."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The top-level ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quota"]}," object and the per-item ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"quota_exceeded\""]}," status have been removed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do:"]}," anyone switching on the row ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," field with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["default → error"]}," branch should add the new ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"failed\""]}," case alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"created\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"duplicate_requires_confirmation\""]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"invalid\""]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3.-scan_type-is-validated-defaults-to-scan_full"},"children":["3. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}," is validated, defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_full"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/"]}," now accepts and validates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}," request field. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If omitted, the default is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_full"]}," (3 tokens, full history)."]}," Invalid slugs return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"POST /creators/\n{\n  \"name\": \"Jane Doe\",\n  \"social_profiles\": [{ \"platform\": \"instagram\", \"profile_url\": \"...\" }],\n  \"scan_type\": \"scan_1y\",\n  \"monitoring\": true\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do:"]}," clients that previously omitted ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}," will now be charged 3 tokens per creator. Pick a cheaper tier (e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_1y"]}," for 1 token) by passing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}," explicitly. The authoritative list of valid slugs and costs is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /scan-catalog/"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"whats-new"},"children":["What's New"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"new-endpoints"},"children":["New endpoints"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Endpoint"},"children":["Endpoint"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Purpose"},"children":["Purpose"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /account/usage/"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your current token balance, lifetime limit, and budget state (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NORMAL"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LOW"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CRITICAL"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EMPTY"]},")."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /scan-catalog/"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The live list of scan tiers, re-scan tiers, and per-action costs. Always read this rather than hard-coding tiers."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/{id}/rescan/"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Deepen or refresh an already-added creator. Token-gated."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"request-features"},"children":["Request features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?dry_run=true"]}]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/"]}," (single and bulk) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/{id}/monitor/"]}," previews token cost and outcome without creating anything or debiting tokens. Returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ dry_run, token_cost, available, would_succeed, reason }"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["monitoring: true"]}]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /creators/"]}," enables monitoring at creation time (+1 token), saving a follow-up call."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"response-fields"},"children":["Response fields"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deepest_scan"]}]}," — on creator list and search responses. The deepest scan tier your organization has purchased for this creator (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," if none)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_statuses[]"]}]}," — on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /creators/{id}/"]},". Per-scan state, including freshness, pipeline stage, and available re-scan options."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["visibility{}"]}]}," — on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /creators/{id}/"]},". Declares the date range of historical data visible to your organization for this creator, whether deeper coverage is purchasable, and which scan tier would unlock it."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All additions are backward-compatible; existing clients will ignore them safely."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"new-concepts"},"children":["New Concepts"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"prepaid-tokens"},"children":["Prepaid tokens"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Billable actions (new scans, re-scans, monitoring) consume tokens from your organization's API budget. Token balance is visible at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /account/usage/"]},". Token purchasing happens outside the API — contact your account manager."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scan-tiers"},"children":["Scan tiers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A scan tier determines how much of a creator's history is analyzed. Current seeded defaults (admin-configurable; always check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /scan-catalog/"]}," for live values):"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Tier"},"children":["Tier"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Slug"},"children":["Slug"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Tokens"},"children":["Tokens"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Coverage"},"children":["Coverage"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Lite"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_1y"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 year"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Medium"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_2y"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2 years"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Comprehensive"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_full"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Full history"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Re-scan tiers (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rescan_lite"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rescan_mild"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rescan_full"]},") follow the same cost structure and refresh an already-added creator. Note that re-scan slugs use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rescan_*"]}," namespace — do not pass them where an initial-scan slug is expected."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"data-visibility-windows"},"children":["Data visibility windows"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For creators added under the new token model, historical sub-resources (posts, timeline, brands, compliance) are scoped to the time range covered by the scan tier your organization purchased. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["visibility{}"]}," block on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /creators/{id}/"]}," tells you the exact range and whether a deeper scan is available. Creators added before this update remain unrestricted."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-to-prepare"},"children":["How to Prepare"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Audit your error handling"]}," for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403 Quota exceeded"]}," — re-route to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["402"]}," and parse the new envelope."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Update bulk-create row-status logic"]}," to include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"failed\""]}," as a non-charging failure case."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Choose an explicit default ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_type"]}]}," for your integration so you don't unintentionally pay for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scan_full"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Adopt ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?dry_run=true"]}]}," in any flow that surfaces cost to end users."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wire ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /account/usage/"]}]}," into your dashboards if you display VwD usage."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Test against QA"]}," at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.qa.vwd.ai/api/public/v1/"]}," before the production cutover."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"questions"},"children":["Questions?"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reach out to ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"mailto:support@vwd.ai"},"children":["support@vwd.ai"]}," for early-access keys, migration assistance, or to schedule a walkthrough with our team."]}]},"headings":[{"value":"At a Glance","id":"at-a-glance","depth":2},{"value":"Breaking Changes","id":"breaking-changes","depth":2},{"value":"1. Quota errors return 402 Payment Required , not 403 Quota exceeded","id":"1.-quota-errors-return-402-payment-required--not-403-quota-exceeded","depth":3},{"value":"2. Bulk create is all-or-nothing at the budget gate","id":"2.-bulk-create-is-all-or-nothing-at-the-budget-gate","depth":3},{"value":"3. scan_type is validated, defaults to scan_full","id":"3.-scan_type-is-validated-defaults-to-scan_full","depth":3},{"value":"What's New","id":"whats-new","depth":2},{"value":"New endpoints","id":"new-endpoints","depth":3},{"value":"Request features","id":"request-features","depth":3},{"value":"Response fields","id":"response-fields","depth":3},{"value":"New Concepts","id":"new-concepts","depth":2},{"value":"Prepaid tokens","id":"prepaid-tokens","depth":3},{"value":"Scan tiers","id":"scan-tiers","depth":3},{"value":"Data visibility windows","id":"data-visibility-windows","depth":3},{"value":"How to Prepare","id":"how-to-prepare","depth":2},{"value":"Questions?","id":"questions","depth":2}],"frontmatter":{"title":"PLG launch: token-based pricing for the VwD API","description":"Three breaking changes, three new endpoints, and a migration checklist for the upcoming token-based pricing model.","publishedDate":"2026-05-27","seo":{"title":"At a Glance"}},"lastModified":"2026-05-27T11:13:15.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/coming-next/2026-05-27-plg-token-model","userData":{"isAuthenticated":false,"teams":["anonymous"]}}