Created
July 8, 2026 05:46
-
-
Save wv-jessejjohnson/85e517f8f6e038e9fd75adc2ede0946f to your computer and use it in GitHub Desktop.
scrape request schema proposal with examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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":[ | |
| ] | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "$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