{"openapi": "3.1.0", "info": {"title": "Dolihi Preflight", "version": "0.4.9", "description": "Diagnose a public HTTPS JSON API before integration: access, HTTP method, response format, required fields, JSON Pointer types, bounded JSON schema and advertised payment requirements. Also supports supplied sample path/type drift, declared OpenAPI response changes, duplicate JSON keys, UTF-8 CSV column/type checks and actionable findings. Returns evidence and a next step. Does not pay the inspected API or verify settlement. No semantic or full compatibility certification."}, "servers": [{"url": "https://dolihi-preflight.onrender.com"}], "security": [], "paths": {"/v1/preflight/paid": {"post": {"operationId": "dolihi_preflight", "summary": "Check a public HTTPS JSON API before integration", "description": "Diagnose a public HTTPS JSON API before integration: access, HTTP method, response format, required fields, JSON Pointer types, bounded JSON schema and advertised payment requirements. Also supports supplied sample path/type drift, declared OpenAPI response changes, duplicate JSON keys, UTF-8 CSV column/type checks and actionable findings. Returns evidence and a next step. Does not pay the inspected API or verify settlement. No semantic or full compatibility certification. Inspected targets are GET-only. No account or API key is required for this paid route.", "security": [], "x-payment-info": {"protocols": ["x402"], "price": {"mode": "fixed", "currency": "USD", "amount": "0.02"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["url"], "additionalProperties": false, "properties": {"geojson_check": {"type": "boolean", "description": "Check bounded GeoJSON structure, coordinates and ring closure."}, "url": {"type": "string", "description": "Public HTTPS endpoint; no credentials."}, "method": {"type": "string", "enum": ["GET"], "default": "GET"}, "expected_fields": {"type": "array", "maxItems": 20, "items": {"type": "string"}, "description": "Required top-level JSON keys."}, "expected_paths": {"type": "object", "maxProperties": 30, "description": "JSON Pointer to expected type, e.g. /Results/0/Make: string."}, "expected_status": {"type": "integer", "minimum": 100, "maximum": 599, "description": "Expected HTTP status for this response."}, "expected_content_type": {"type": "string", "description": "Expected media type without parameters, e.g. application/json."}, "openapi_spec": {"type": "object", "description": "Inline JSON OpenAPI 3.0/3.1 document slice, <=24 KiB; selected JSON response only. Local references only."}, "openapi_path": {"type": "string", "description": "Optional path template from the supplied OpenAPI document."}, "response_schema": {"type": "object", "description": "Bounded subset: type, properties, required, items, additionalProperties, enum, const, numeric and string/array/object size bounds; formats uuid, date, strict date-time (uppercase T/Z, 1-6 fractional digits, no leap seconds). Bounded anyOf/oneOf/allOf (1–6 branches), type unions. No references or user patterns."}, "baseline_response": {"description": "Optional supplied JSON sample, <=16 KiB and 2000 nodes. Compare observed paths/types; sample drift is not proof of a breaking API change."}, "openapi_baseline_spec": {"type": "object", "description": "Optional prior OpenAPI slice. Requires openapi_spec; bounded declared operation/status/schema change report. No external references fetched."}, "csv_contract": {"type": "object", "description": "UTF-8 CSV checks: delimiter comma/semicolon/tab, required_columns, column_types string/integer/number/boolean/date, max_rows 1–1000. Cannot combine with JSON/OpenAPI/GeoJSON expectations."}, "x402_check": {"type": "boolean", "description": "Inspect selected x402 v2 HTTP payment advertisement fields without payment or indexing claims."}, "data_rules": {"type": "array", "minItems": 1, "maxItems": 20, "description": "Declared JSON invariants: count_equals_length, unique item keys, ordered item keys, compare scalar fields. Bounded to 1000 items per array and 10000 inspected items.", "items": {"oneOf": [{"type": "object", "additionalProperties": false, "required": ["array_path", "count_path", "kind"], "properties": {"array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "count_equals_length"}, "count_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}}}, {"type": "object", "additionalProperties": false, "required": ["array_path", "key_path", "kind"], "properties": {"key_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "unique"}}}, {"type": "object", "additionalProperties": false, "required": ["array_path", "direction", "key_path", "kind"], "properties": {"key_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "ordered"}, "direction": {"enum": ["ascending", "descending"]}}}, {"type": "object", "additionalProperties": false, "required": ["kind", "left_path", "operator", "right_path"], "properties": {"left_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "right_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "operator": {"enum": ["eq", "lt", "le", "gt", "ge"]}, "kind": {"const": "compare"}}}]}}}}, "example": {"url": "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/1HGCM82633A004352?format=json", "expected_fields": ["Results"]}}}}, "parameters": [{"name": "PAYMENT-SIGNATURE", "in": "header", "required": false, "schema": {"type": "string"}, "description": "Supply an x402 v2 authorization only after reading the live 402 challenge."}], "responses": {"200": {"description": "Diagnostic result after independent service-payment confirmation.", "content": {"application/json": {"schema": {"type": "object"}}}, "headers": {"PAYMENT-RESPONSE": {"description": "x402 settlement receipt.", "schema": {"type": "string"}}}}, "400": {"description": "Invalid diagnostic input or payment."}, "402": {"description": "Payment required; read the current Base USDC price and recipient.", "headers": {"PAYMENT-REQUIRED": {"description": "Base64-encoded x402 v2 payment requirements.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "403": {"description": "Browser origins are not enabled."}, "409": {"description": "Payment already used or awaiting reconciliation; do not pay again."}, "413": {"description": "Request or payment header too large."}, "415": {"description": "Send application/json."}, "429": {"description": "Service limits reached."}, "503": {"description": "Service unavailable or payment confirmation pending; do not automatically repay."}}}}, "/v1/api-regression/paid": {"post": {"operationId": "dolihi_api_regression_24h", "summary": "Prepaid 24-hour public API regression observations", "description": "Prepaid public JSON API regression report: one HTTPS GET endpoint, up to six observations at four-hour intervals within 24 hours after activation. Fixed first valid JSON baseline, supplied schema/OpenAPI response checks, shape drift and portable reproduction pack. First observation normally within one minute of confirmed payment. Private reports via Bearer access token, retained seven days after the observation window. No upstream payments, credentials, redirects, webhook, automatic renewal, guaranteed uptime or full compatibility certification. Baseline requires a successful JSON sample <=16 KiB/2000 nodes/depth 12. Unavailable, larger or contract-failing responses produce diagnostic findings, not a certified baseline.", "security": [], "x-payment-info": {"protocols": ["x402"], "price": {"mode": "fixed", "currency": "USD", "amount": "1.00"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["check"], "additionalProperties": false, "properties": {"check": {"type": "object", "required": ["url"], "additionalProperties": false, "properties": {"geojson_check": {"type": "boolean", "description": "Check bounded GeoJSON structure, coordinates and ring closure."}, "url": {"type": "string", "description": "Public HTTPS endpoint; no credentials."}, "method": {"type": "string", "enum": ["GET"], "default": "GET"}, "expected_fields": {"type": "array", "maxItems": 20, "items": {"type": "string"}, "description": "Required top-level JSON keys."}, "expected_paths": {"type": "object", "maxProperties": 30, "description": "JSON Pointer to expected type, e.g. /Results/0/Make: string."}, "expected_status": {"type": "integer", "minimum": 100, "maximum": 599, "description": "Expected HTTP status for this response."}, "expected_content_type": {"type": "string", "description": "Expected media type without parameters, e.g. application/json."}, "openapi_spec": {"type": "object", "description": "Inline JSON OpenAPI 3.0/3.1 document slice, <=24 KiB; selected JSON response only. Local references only."}, "openapi_path": {"type": "string", "description": "Optional path template from the supplied OpenAPI document."}, "response_schema": {"type": "object", "description": "Bounded subset: type, properties, required, items, additionalProperties, enum, const, numeric and string/array/object size bounds; formats uuid, date, strict date-time (uppercase T/Z, 1-6 fractional digits, no leap seconds). Bounded anyOf/oneOf/allOf (1–6 branches), type unions. No references or user patterns."}, "x402_check": {"type": "boolean", "description": "Inspect selected x402 v2 HTTP payment advertisement fields without payment or indexing claims."}, "data_rules": {"type": "array", "minItems": 1, "maxItems": 20, "description": "Declared JSON invariants: count_equals_length, unique item keys, ordered item keys, compare scalar fields. Bounded to 1000 items per array and 10000 inspected items.", "items": {"oneOf": [{"type": "object", "additionalProperties": false, "required": ["array_path", "count_path", "kind"], "properties": {"array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "count_equals_length"}, "count_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}}}, {"type": "object", "additionalProperties": false, "required": ["array_path", "key_path", "kind"], "properties": {"key_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "unique"}}}, {"type": "object", "additionalProperties": false, "required": ["array_path", "direction", "key_path", "kind"], "properties": {"key_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "array_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "kind": {"const": "ordered"}, "direction": {"enum": ["ascending", "descending"]}}}, {"type": "object", "additionalProperties": false, "required": ["kind", "left_path", "operator", "right_path"], "properties": {"left_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "right_path": {"type": "string", "maxLength": 128, "description": "JSON Pointer; empty string selects the root."}, "operator": {"enum": ["eq", "lt", "le", "gt", "ge"]}, "kind": {"const": "compare"}}}]}}}}}}, "example": {"check": {"url": "https://httpbin.org/json", "expected_fields": ["slideshow"]}}}}}, "parameters": [{"name": "PAYMENT-SIGNATURE", "in": "header", "required": false, "schema": {"type": "string"}, "description": "Supply an x402 v2 authorization only after reading the live 402 challenge."}], "responses": {"200": {"description": "Confirmed paid order with private access token; observations execute in background. Not a completed 24-hour report.", "content": {"application/json": {"schema": {"type": "object"}}}, "headers": {"PAYMENT-RESPONSE": {"description": "x402 settlement receipt.", "schema": {"type": "string"}}}}, "400": {"description": "Invalid diagnostic input or payment."}, "402": {"description": "Payment required; read the current Base USDC price and recipient.", "headers": {"PAYMENT-REQUIRED": {"description": "Base64-encoded x402 v2 payment requirements.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "403": {"description": "Browser origins are not enabled."}, "409": {"description": "Payment already used or awaiting reconciliation; do not pay again."}, "413": {"description": "Request or payment header too large."}, "415": {"description": "Send application/json."}, "429": {"description": "Service limits reached."}, "503": {"description": "Service unavailable or payment confirmation pending; do not automatically repay."}}}}}}