Skip to content

Instantly share code, notes, and snippets.

@wv-jessejjohnson
Created July 8, 2026 05:46
Show Gist options
  • Select an option

  • Save wv-jessejjohnson/85e517f8f6e038e9fd75adc2ede0946f to your computer and use it in GitHub Desktop.

Select an option

Save wv-jessejjohnson/85e517f8f6e038e9fd75adc2ede0946f to your computer and use it in GitHub Desktop.
scrape request schema proposal with examples
{
"schemaVersion":"1.0",
"envelope":{
"requestId":"7f3c2a1e-9b4d-4c8a-a2f1-6e5d3b8c9a01",
"correlationId":"txn-price-refresh-2026-07-07",
"traceId":"4bf92f3577b34da6a3ce929d0e0e4736",
"source":"scheduler",
"type":"scrape.request.v1",
"createdAt":"2026-07-07T06:00:00Z",
"tenant":{
"tenantId":"acme-brands",
"apiKeyHash":"sha256:9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d",
"plan":"standard"
},
"priority":"bulk"
},
"request":{
"url":"https://www.example-retailer.com/products/wireless-headphones-wh1000",
"method":"GET",
"headers":{
"Accept-Language":"en-US,en;q=0.9"
},
"callbackUrl":"https://ingest.wayvia.com/v1/scrape-results",
"tags":[
"price-monitoring",
"electronics",
"daily-refresh"
]
},
"actions":[
{
"id":"nav-pdp",
"action":"navigate",
"description":"Load product detail page",
"url":"https://www.example-retailer.com/products/wireless-headphones-wh1000",
"waitUntil":"domcontentloaded",
"timeout":20000
},
{
"id":"extract-pdp",
"action":"extract",
"description":"Extract core PDP fields",
"fields":{
"title":{
"selector":"h1.product-title",
"type":"text",
"transform":"trim"
},
"price":{
"selector":"span.price-now",
"type":"text",
"transform":"parseFloat"
},
"currency":{
"selector":"meta[itemprop=priceCurrency]",
"type":"attribute",
"attribute":"content"
},
"availability":{
"xpath":"//div[@id='stock-status']",
"type":"text",
"transform":"lowercase"
}
},
"outputAs":"pdpData"
}
],
"flowControl":{
"retry":{
"maxAttempts":3,
"backoff":{
"strategy":"exponential",
"baseDelayMs":5000,
"maxDelayMs":300000,
"multiplier":2
},
"retryableStatusCodes":[
429,
500,
502,
503,
504
]
},
"proxy":{
"enabled":true,
"provider":"datacenter",
"country":"US"
},
"timeout":{
"totalMs":60000,
"navigationMs":20000,
"actionMs":10000
},
"costCategory":"standard",
"browser":{
"engine":"chromium",
"headless":true,
"viewport":{
"width":1280,
"height":720
},
"stealth":true
}
},
"results":[
]
}
{
"schemaVersion":"1.0",
"envelope":{
"requestId":"c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"correlationId":"txn-portal-orders-q3",
"causationId":"a0b1c2d3-e4f5-4a6b-8c7d-9e0f1a2b3c4d",
"traceId":"00f067aa0ba902b7a3ce929d0e0e4736",
"source":"api-gateway",
"type":"scrape.request.v1",
"createdAt":"2026-07-07T14:22:31Z",
"tenant":{
"tenantId":"northwind-retail",
"apiKeyHash":"sha256:1f2e3d4c5b6a79880706f5e4d3c2b1a0",
"plan":"enterprise"
},
"priority":"high"
},
"request":{
"url":"https://portal.example-supplier.com/login",
"method":"GET",
"headers":{
"Accept-Language":"en-GB,en;q=0.8"
},
"callbackUrl":"https://ingest.wayvia.com/v1/scrape-results",
"tags":[
"supplier-portal",
"order-history",
"authenticated"
]
},
"actions":[
{
"id":"nav-login",
"action":"navigate",
"url":"https://portal.example-supplier.com/login",
"waitUntil":"networkidle",
"timeout":30000
},
{
"id":"fill-user",
"action":"fill",
"selector":"#username",
"value":"{{credentials.username}}"
},
{
"id":"fill-pass",
"action":"fill",
"selector":"#password",
"value":"{{credentials.password}}"
},
{
"id":"submit-login",
"action":"click",
"selector":"button[type=submit]",
"button":"left",
"clickCount":1,
"retry":{
"maxAttempts":2,
"backoff":{
"strategy":"fixed",
"baseDelayMs":3000
}
}
},
{
"id":"wait-dashboard",
"action":"waitForSelector",
"selector":"nav.account-menu",
"state":"visible",
"timeout":15000
},
{
"id":"check-cookie-banner",
"action":"conditional",
"description":"Dismiss cookie consent if shown",
"condition":{
"type":"elementVisible",
"selector":"#cookie-consent-dialog"
},
"then":[
{
"id":"dismiss-cookies",
"action":"click",
"selector":"#cookie-consent-dialog button.accept-all",
"continueOnError":true
}
],
"else":[
]
},
{
"id":"nav-orders",
"action":"navigate",
"url":"https://portal.example-supplier.com/orders?range=90d",
"waitUntil":"load"
},
{
"id":"paginate-orders",
"action":"loop",
"description":"Extract all order pages, max 25",
"loopType":"pagination",
"maxIterations":25,
"breakCondition":{
"type":"elementExists",
"selector":"a.next-page[disabled]"
},
"steps":[
{
"id":"extract-orders-page",
"action":"extract",
"append":true,
"outputAs":"orders",
"fields":{
"orders":{
"selector":"table.orders tbody tr",
"type":"list",
"fields":{
"orderId":{
"selector":"td.order-id",
"type":"text",
"transform":"trim"
},
"placedAt":{
"selector":"td.date",
"type":"text",
"transform":"parseDate"
},
"total":{
"selector":"td.total",
"type":"text",
"transform":"parseFloat"
},
"itemCount":{
"selector":"td.items",
"type":"text",
"transform":"parseInt"
},
"detailUrl":{
"selector":"td.order-id a",
"type":"attribute",
"attribute":"href"
}
}
}
}
},
{
"id":"next-page",
"action":"click",
"selector":"a.next-page",
"continueOnError":false
},
{
"id":"wait-table-reload",
"action":"waitForSelector",
"selector":"table.orders tbody tr",
"state":"attached"
}
]
},
{
"id":"session-fingerprint",
"action":"evaluate",
"script":"JSON.stringify({ userId: window.__APP_STATE__.user.id, pages: window.__APP_STATE__.pagination.total })",
"outputAs":"sessionMeta",
"continueOnError":true
}
],
"flowControl":{
"retry":{
"maxAttempts":2,
"backoff":{
"strategy":"linear",
"baseDelayMs":10000,
"maxDelayMs":60000,
"multiplier":1
},
"retryableStatusCodes":[
429,
502,
503
]
},
"proxy":{
"enabled":true,
"provider":"residential",
"country":"GB",
"sessionId":"sticky-nw-orders-c1d2e3f4"
},
"timeout":{
"totalMs":600000,
"navigationMs":30000,
"actionMs":15000,
"networkIdleMs":5000
},
"circuitBreaker":{
"targetHost":"portal.example-supplier.com",
"maxFailures":5,
"cooldownMs":120000,
"state":"closed"
},
"costCategory":"premium",
"browser":{
"engine":"firefox",
"headless":true,
"viewport":{
"width":1920,
"height":1080
},
"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"stealth":true
}
},
"results":[
],
"extensions":{
"x_credentials_vault_ref":"vault://tenants/northwind-retail/portal-supplier",
"x_sla_deadline":"2026-07-07T15:00:00Z"
}
}
{
"schemaVersion":"1.0",
"envelope":{
"requestId":"e9d8c7b6-a5f4-4e3d-9c2b-1a0f9e8d7c6b",
"correlationId":"txn-search-results-capture-8841",
"causationId":"b2a1908f-7e6d-4c5b-8a39-2817f6e5d4c3",
"traceId":"d4cda95b652f4a1592b449d5929fda1b",
"source":"search-capture-service",
"type":"scrape.request.v1",
"createdAt":"2026-07-07T09:15:00Z",
"tenant":{
"tenantId":"globex-cpg",
"plan":"enterprise"
},
"priority":"critical"
},
"request":{
"url":"https://www.example-marketplace.de/api/search",
"method":"POST",
"headers":{
"Content-Type":"application/json",
"Accept":"application/json",
"X-Client-Version":"web-2.14.0"
},
"body":"{\"query\":\"protein riegel\",\"page\":1,\"pageSize\":48,\"sort\":\"relevance\",\"filters\":{\"category\":\"sports-nutrition\"}}",
"callbackUrl":"https://ingest.wayvia.com/v1/scrape-results",
"tags":[
"share-of-search",
"de-market",
"sports-nutrition"
]
},
"actions":[
{
"id":"nav-serp",
"action":"navigate",
"url":"https://www.example-marketplace.de/s?q=protein+riegel",
"waitUntil":"networkidle",
"timeout":25000
},
{
"id":"wait-grid",
"action":"waitForSelector",
"selector":"div.search-grid article.product-card",
"state":"visible"
},
{
"id":"extract-serp",
"action":"extract",
"outputAs":"serpResults",
"fields":{
"products":{
"selector":"article.product-card",
"type":"list",
"fields":{
"asin":{
"selector":"article",
"type":"attribute",
"attribute":"data-asin"
},
"name":{
"selector":"h2 span",
"type":"text",
"transform":"trim"
},
"price":{
"selector":".price-whole",
"type":"text",
"transform":"parseFloat"
},
"sponsored":{
"selector":".sponsored-label",
"type":"text"
}
}
},
"resultCount":{
"selector":"span.result-count",
"type":"text",
"transform":"parseInt"
},
"rawGridHtml":{
"selector":"div.search-grid",
"type":"html"
}
}
},
{
"id":"capture-evidence",
"action":"screenshot",
"description":"Full-page evidence capture for share-of-search audit",
"fullPage":true,
"format":"jpeg",
"quality":80,
"continueOnError":true
}
],
"flowControl":{
"retry":{
"maxAttempts":5,
"backoff":{
"strategy":"exponential",
"baseDelayMs":2000,
"maxDelayMs":120000,
"multiplier":2.5
},
"retryableStatusCodes":[
429,
500,
502,
503,
504,
522,
524
]
},
"proxy":{
"enabled":true,
"provider":"custom",
"country":"DE",
"url":"http://user-globex:pass@proxy-pool-eu.internal:8080"
},
"timeout":{
"totalMs":180000,
"navigationMs":25000,
"actionMs":15000,
"networkIdleMs":8000
},
"circuitBreaker":{
"targetHost":"www.example-marketplace.de",
"maxFailures":10,
"cooldownMs":60000,
"state":"half_open"
},
"costCategory":"dedicated",
"browser":{
"engine":"webkit",
"headless":false,
"viewport":{
"width":1440,
"height":900
},
"stealth":true
}
},
"results":[
{
"actionId":"nav-serp",
"status":"success",
"timestamp":"2026-07-07T09:15:04Z",
"durationMs":3812,
"metrics":{
"bytesDownloaded":2847331,
"requestCount":94,
"statusCode":200
}
},
{
"actionId":"wait-grid",
"status":"success",
"timestamp":"2026-07-07T09:15:05Z",
"durationMs":640
},
{
"actionId":"extract-serp",
"status":"success",
"timestamp":"2026-07-07T09:15:07Z",
"durationMs":1105,
"output":{
"resultCount":1247,
"productsExtracted":48
},
"claimCheck":{
"storage":"s3",
"bucket":"wayvia-scrape-results-eu",
"key":"globex-cpg/2026/07/07/e9d8c7b6/serp-results.json.gz",
"contentType":"application/json",
"contentEncoding":"gzip",
"sizeBytes":184223,
"checksumSha256":"3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
"expiresAt":"2026-08-06T09:15:07Z"
}
},
{
"actionId":"capture-evidence",
"status":"failure",
"timestamp":"2026-07-07T09:15:22Z",
"durationMs":15003,
"error":{
"code":"SCREENSHOT_TIMEOUT",
"message":"Full-page screenshot exceeded action timeout during lazy-load settle",
"retryable":true,
"stack":"TimeoutError: screenshot timeout of 15000ms exceeded\n at Page.screenshot (worker/browser.ts:412)"
}
}
],
"validation":{
"status":"partial",
"rules":[
{
"ruleId":"serp-min-products",
"field":"serpResults.products",
"check":"range",
"passed":true,
"expected":">= 20",
"actual":48,
"message":"Extracted product count within expected range"
},
{
"ruleId":"price-format",
"field":"serpResults.products[].price",
"check":"format",
"passed":true,
"expected":"float",
"actual":"float"
},
{
"ruleId":"evidence-screenshot",
"field":"capture-evidence",
"check":"required",
"passed":false,
"expected":"claimCheck present",
"actual":null,
"message":"Screenshot step failed — evidence artifact missing"
}
],
"validatedAt":"2026-07-07T09:15:23Z"
},
"extensions":{
"x_billing_job_id":"bill-2026-07-e9d8c7b6",
"x_replay_of":null,
"x_worker_pool":"eu-central-dedicated-03"
}
}
{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://schemas.wayvia.com/v1/data-acquisition/scrape-request.json",
"type":"object",
"required":[
"schemaVersion",
"envelope",
"request",
"actions",
"flowControl",
"results"
],
"properties":{
"schemaVersion":{
"type":"string",
"const":"1.0",
"description":"Schema version — breaking changes increment major"
},
"envelope":{
"$ref":"#/$defs/Envelope"
},
"request":{
"$ref":"#/$defs/Request"
},
"actions":{
"type":"array",
"items":{
"$ref":"#/$defs/Action"
},
"minItems":1,
"description":"Ordered action sequence — immutable after creation"
},
"flowControl":{
"$ref":"#/$defs/FlowControl"
},
"results":{
"type":"array",
"items":{
"$ref":"#/$defs/StepResult"
},
"default":[
],
"description":"Append-only — each stage adds its output here"
},
"validation":{
"$ref":"#/$defs/ValidationOutput"
},
"extensions":{
"type":"object",
"additionalProperties":true,
"description":"Open extension point for forward compatibility"
}
},
"unevaluatedProperties":false,
"$defs":{
"Envelope":{
"type":"object",
"required":[
"requestId",
"source",
"type",
"createdAt"
],
"properties":{
"requestId":{
"type":"string",
"format":"uuid",
"description":"Globally unique request identifier"
},
"correlationId":{
"type":"string",
"description":"Links all messages in a business transaction"
},
"causationId":{
"type":"string",
"description":"The requestId of the message that triggered this one"
},
"traceId":{
"type":"string",
"description":"W3C Trace Context / OpenTelemetry trace ID"
},
"source":{
"type":"string",
"description":"Originating service — e.g. 'api-gateway', 'scheduler'"
},
"type":{
"type":"string",
"description":"Message type for routing — e.g. 'scrape.request.v1'"
},
"createdAt":{
"type":"string",
"format":"date-time"
},
"tenant":{
"type":"object",
"properties":{
"tenantId":{
"type":"string"
},
"apiKeyHash":{
"type":"string"
},
"plan":{
"enum":[
"standard",
"enterprise"
]
}
},
"required":[
"tenantId"
]
},
"priority":{
"enum":[
"critical",
"high",
"normal",
"low",
"bulk"
],
"default":"normal"
}
}
},
"Request":{
"type":"object",
"required":[
"url"
],
"properties":{
"url":{
"type":"string",
"format":"uri"
},
"method":{
"enum":[
"GET",
"POST"
],
"default":"GET"
},
"headers":{
"type":"object",
"additionalProperties":{
"type":"string"
}
},
"body":{
"type":"string"
},
"callbackUrl":{
"type":"string",
"format":"uri"
},
"tags":{
"type":"array",
"items":{
"type":"string"
},
"default":[
]
}
}
},
"Action":{
"type":"object",
"required":[
"action"
],
"properties":{
"id":{
"type":"string",
"description":"Step ID for result correlation"
},
"action":{
"type":"string"
},
"description":{
"type":"string"
},
"timeout":{
"type":"integer",
"default":30000
},
"continueOnError":{
"type":"boolean",
"default":false
},
"outputAs":{
"type":"string",
"description":"Store result as named variable"
},
"retry":{
"$ref":"#/$defs/RetryPolicy"
}
},
"allOf":[
{
"if":{
"properties":{
"action":{
"const":"navigate"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"url":{
"type":"string"
},
"waitUntil":{
"enum":[
"load",
"domcontentloaded",
"networkidle"
],
"default":"load"
}
},
"required":[
"url"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"click"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"selector":{
"type":"string"
},
"button":{
"enum":[
"left",
"right",
"middle"
],
"default":"left"
},
"clickCount":{
"type":"integer",
"default":1
},
"position":{
"type":"object",
"properties":{
"x":{
"type":"number"
},
"y":{
"type":"number"
}
}
}
},
"required":[
"selector"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"fill"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"selector":{
"type":"string"
},
"value":{
"type":"string",
"description":"Supports {{variable}} interpolation"
}
},
"required":[
"selector",
"value"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"extract"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"fields":{
"$ref":"#/$defs/ExtractionSpec"
},
"append":{
"type":"boolean",
"default":false
}
},
"required":[
"fields"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"waitForSelector"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"selector":{
"type":"string"
},
"state":{
"enum":[
"visible",
"hidden",
"attached",
"detached"
],
"default":"visible"
}
},
"required":[
"selector"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"evaluate"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"script":{
"type":"string",
"description":"JavaScript expression"
}
},
"required":[
"script"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"screenshot"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"fullPage":{
"type":"boolean",
"default":false
},
"format":{
"enum":[
"png",
"jpeg"
],
"default":"png"
},
"quality":{
"type":"integer",
"minimum":0,
"maximum":100
}
}
}
},
{
"if":{
"properties":{
"action":{
"const":"loop"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"loopType":{
"enum":[
"pagination",
"count",
"whileExists"
]
},
"maxIterations":{
"type":"integer",
"default":50
},
"steps":{
"type":"array",
"items":{
"$ref":"#/$defs/Action"
}
},
"breakCondition":{
"$ref":"#/$defs/Condition"
}
},
"required":[
"steps"
]
}
},
{
"if":{
"properties":{
"action":{
"const":"conditional"
}
},
"required":[
"action"
]
},
"then":{
"properties":{
"condition":{
"$ref":"#/$defs/Condition"
},
"then":{
"type":"array",
"items":{
"$ref":"#/$defs/Action"
}
},
"else":{
"type":"array",
"items":{
"$ref":"#/$defs/Action"
},
"default":[
]
}
},
"required":[
"condition",
"then"
]
}
}
]
},
"ExtractionSpec":{
"type":"object",
"additionalProperties":{
"type":"object",
"properties":{
"selector":{
"type":"string"
},
"xpath":{
"type":"string"
},
"type":{
"enum":[
"text",
"html",
"attribute",
"list",
"table",
"evaluate"
]
},
"attribute":{
"type":"string"
},
"transform":{
"enum":[
"trim",
"parseFloat",
"parseInt",
"parseDate",
"lowercase"
]
},
"fields":{
"$ref":"#/$defs/ExtractionSpec"
}
},
"required":[
"type"
]
}
},
"Condition":{
"type":"object",
"required":[
"type"
],
"properties":{
"type":{
"enum":[
"elementExists",
"elementVisible",
"urlMatches",
"variableEquals",
"javascript"
]
},
"selector":{
"type":"string"
},
"pattern":{
"type":"string"
},
"variable":{
"type":"string"
},
"value":{
},
"expression":{
"type":"string"
}
}
},
"StepResult":{
"type":"object",
"required":[
"actionId",
"status",
"timestamp"
],
"properties":{
"actionId":{
"type":"string",
"description":"Matches Action.id"
},
"status":{
"enum":[
"success",
"failure",
"skipped",
"timeout"
]
},
"timestamp":{
"type":"string",
"format":"date-time"
},
"durationMs":{
"type":"integer"
},
"output":{
"description":"Inline result — use for small data only",
"type":"object"
},
"claimCheck":{
"description":"Reference to external storage for large results",
"$ref":"#/$defs/ClaimCheck"
},
"error":{
"type":"object",
"properties":{
"code":{
"type":"string"
},
"message":{
"type":"string"
},
"retryable":{
"type":"boolean"
},
"stack":{
"type":"string"
}
}
},
"metrics":{
"type":"object",
"properties":{
"bytesDownloaded":{
"type":"integer"
},
"requestCount":{
"type":"integer"
},
"statusCode":{
"type":"integer"
}
}
}
}
},
"ClaimCheck":{
"type":"object",
"required":[
"storage",
"key"
],
"properties":{
"storage":{
"enum":[
"s3",
"minio",
"redis",
"gcs"
]
},
"bucket":{
"type":"string"
},
"key":{
"type":"string"
},
"contentType":{
"type":"string"
},
"contentEncoding":{
"type":"string"
},
"sizeBytes":{
"type":"integer"
},
"checksumSha256":{
"type":"string"
},
"expiresAt":{
"type":"string",
"format":"date-time"
}
}
},
"ValidationOutput":{
"type":"object",
"properties":{
"status":{
"enum":[
"passed",
"failed",
"partial"
]
},
"rules":{
"type":"array",
"items":{
"type":"object",
"properties":{
"ruleId":{
"type":"string"
},
"field":{
"type":"string"
},
"check":{
"enum":[
"required",
"format",
"range",
"regex",
"custom"
]
},
"passed":{
"type":"boolean"
},
"expected":{
},
"actual":{
},
"message":{
"type":"string"
}
}
}
},
"validatedAt":{
"type":"string",
"format":"date-time"
}
}
},
"FlowControl":{
"type":"object",
"properties":{
"retry":{
"$ref":"#/$defs/RetryPolicy"
},
"proxy":{
"type":"object",
"properties":{
"enabled":{
"type":"boolean",
"default":true
},
"provider":{
"enum":[
"brightdata",
"residential",
"datacenter",
"custom"
]
},
"country":{
"type":"string",
"pattern":"^[A-Z]{2}$"
},
"sessionId":{
"type":"string",
"description":"Sticky session for multi-step flows"
},
"url":{
"type":"string",
"format":"uri",
"description":"Custom proxy URL"
}
}
},
"timeout":{
"type":"object",
"properties":{
"totalMs":{
"type":"integer",
"default":120000
},
"navigationMs":{
"type":"integer",
"default":30000
},
"actionMs":{
"type":"integer",
"default":15000
},
"networkIdleMs":{
"type":"integer",
"default":5000
}
}
},
"circuitBreaker":{
"type":"object",
"properties":{
"targetHost":{
"type":"string"
},
"maxFailures":{
"type":"integer",
"default":10
},
"cooldownMs":{
"type":"integer",
"default":60000
},
"state":{
"enum":[
"closed",
"open",
"half_open"
]
}
}
},
"costCategory":{
"enum":[
"standard",
"premium",
"dedicated"
],
"default":"standard",
"description":"Routes to appropriate worker pool / proxy tier"
},
"browser":{
"type":"object",
"properties":{
"engine":{
"enum":[
"chromium",
"firefox",
"webkit"
],
"default":"chromium"
},
"headless":{
"type":"boolean",
"default":true
},
"viewport":{
"type":"object",
"properties":{
"width":{
"type":"integer",
"default":1280
},
"height":{
"type":"integer",
"default":720
}
}
},
"userAgent":{
"type":"string"
},
"stealth":{
"type":"boolean",
"default":true
}
}
}
}
},
"RetryPolicy":{
"type":"object",
"properties":{
"maxAttempts":{
"type":"integer",
"default":3,
"minimum":0,
"maximum":10
},
"backoff":{
"type":"object",
"properties":{
"strategy":{
"enum":[
"fixed",
"exponential",
"linear"
],
"default":"exponential"
},
"baseDelayMs":{
"type":"integer",
"default":5000
},
"maxDelayMs":{
"type":"integer",
"default":300000
},
"multiplier":{
"type":"number",
"default":2
}
}
},
"retryableStatusCodes":{
"type":"array",
"items":{
"type":"integer"
},
"default":[
429,
500,
502,
503,
504,
522,
524
]
}
}
},
"extensions":{
"type":"object",
"patternProperties":{
"^x_[a-z][a-z0-9_]*$":{
}
},
"additionalProperties":false,
"description":"Namespaced extensions — keys must match ^x_[a-z]..."
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment