{"openapi": "3.1.0", "info": {"title": "Cian Endpoint Audit", "version": "1.0.0", "description": "5 paid audit resources on one host: HTTP endpoint health, Python static analysis, CSV data quality, DNS/email authentication, and a multi-target suite. On Base: 0.05 USDC each for /v1/audit, /v1/py-audit, /v1/csv-audit, /v1/dns-audit and 0.08 USDC for /v1/suite."}, "servers": [{"url": "https://cian-x402.netlify.app"}], "paths": {"/v1/audit": {"get": {"summary": "HTTP endpoint health audit for one URL", "parameters": [{"name": "url", "in": "query", "required": true, "schema": {"type": "string", "format": "uri"}, "description": "http or https URL on port 80 or 443, public address only"}], "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Target refused or missing url parameter. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/audit"}}}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}}, "/v1/py-audit": {"get": {"summary": "Static audit of one Python source file, input in the query string", "description": "Static audit of one Python source file, computed with the standard library `ast` module and no model. Returns machine-readable findings with stable ids - bare_except, broad_except, mutable_default, unclosed_file, undefined_name, float_money, mutable_class_attr, string_format_in_sql, assert_in_production, shadowed_builtin, open_without_encoding, parameter_mutated_and_returned, todo_marker - each with line, column, severity, detail and a fix_hint. Also returns syntax_ok and, for unparseable input, the error position. No style opinions: every finding is a mechanism. Body cap 64 KiB. This form takes each body field as base64url text (RFC 4648 section 5, padding optional) in the query string and returns the identical result at the identical price. A GET carries at most 45000 bytes decoded; use POST for more.", "parameters": [{"name": "source", "in": "query", "required": true, "schema": {"type": "string"}, "description": "the Python source text, base64url encoded; at most 45000 bytes decoded"}, {"name": "filename", "in": "query", "required": false, "schema": {"type": "string"}, "description": "optional name; used only to skip assert findings in test-looking files"}, {"name": "encoding", "in": "query", "required": false, "schema": {"type": "string", "enum": ["base64url", "plain"]}, "description": "plain sends the values literally instead of base64url; base64url is the default"}], "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "source is missing, not valid base64url, over the query ceiling, or decodes to bytes that are not UTF-8 text. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/py-audit"}}}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}, "post": {"summary": "Static audit of one Python source file", "description": "Static audit of one Python source file, computed with the standard library `ast` module and no model. Returns machine-readable findings with stable ids - bare_except, broad_except, mutable_default, unclosed_file, undefined_name, float_money, mutable_class_attr, string_format_in_sql, assert_in_production, shadowed_builtin, open_without_encoding, parameter_mutated_and_returned, todo_marker - each with line, column, severity, detail and a fix_hint. Also returns syntax_ok and, for unparseable input, the error position. No style opinions: every finding is a mechanism. Body cap 64 KiB.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["source"], "properties": {"source": {"type": "string", "description": "Python source text, at most 64 KiB"}, "filename": {"type": "string", "description": "optional name; used only to skip assert findings in test-looking files"}}, "additionalProperties": false}}}}, "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Body is not JSON, or source is missing or not a string. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/py-audit"}}}, "413": {"description": "Body larger than 65536 bytes. Refused from Content-Length before reading. Not settled."}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}}, "/v1/csv-audit": {"get": {"summary": "Data-quality report on one CSV document, input in the query string", "description": "Data-quality report on one CSV document, standard library only. Returns rows, columns, per-column null_count / blank_count / distinct_count / duplicate_value_count, type_inference (int, float, date, email, url, text by a documented 80% majority rule), type_inconsistent_rows with example values, duplicate_rows with row numbers, ragged rows, duplicate header names, encoding_anomalies (BOM, non-ASCII count, control characters, CRLF vs LF mix, missing trailing newline) and quoted_field_anomalies. Handles BOM, CRLF, quoted commas and embedded newlines. Pass key_column for duplicates_by_key. Body cap 1 MiB. This form takes each body field as base64url text (RFC 4648 section 5, padding optional) in the query string and returns the identical result at the identical price. A GET carries at most 45000 bytes decoded; use POST for more.", "parameters": [{"name": "csv", "in": "query", "required": true, "schema": {"type": "string"}, "description": "the CSV document text, base64url encoded; at most 45000 bytes decoded"}, {"name": "key_column", "in": "query", "required": false, "schema": {"type": "string"}, "description": "optional column name for duplicates_by_key"}, {"name": "encoding", "in": "query", "required": false, "schema": {"type": "string", "enum": ["base64url", "plain"]}, "description": "plain sends the values literally instead of base64url; base64url is the default"}], "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "csv is missing, not valid base64url, over the query ceiling, or decodes to bytes that are not UTF-8 text. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/csv-audit"}}}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}, "post": {"summary": "Data-quality report on one CSV document", "description": "Data-quality report on one CSV document, standard library only. Returns rows, columns, per-column null_count / blank_count / distinct_count / duplicate_value_count, type_inference (int, float, date, email, url, text by a documented 80% majority rule), type_inconsistent_rows with example values, duplicate_rows with row numbers, ragged rows, duplicate header names, encoding_anomalies (BOM, non-ASCII count, control characters, CRLF vs LF mix, missing trailing newline) and quoted_field_anomalies. Handles BOM, CRLF, quoted commas and embedded newlines. Pass key_column for duplicates_by_key. Body cap 1 MiB.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["csv"], "properties": {"csv": {"type": "string", "description": "CSV document text, at most 1 MiB"}, "key_column": {"type": "string", "description": "optional column name for duplicates_by_key"}}, "additionalProperties": false}}}}, "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Body is not JSON, csv is missing, or key_column is not in the header. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/csv-audit"}}}, "413": {"description": "Body larger than 1048576 bytes. Refused from Content-Length before reading. Not settled."}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}}, "/v1/dns-audit": {"get": {"summary": "DNS and email-authentication audit for one domain", "parameters": [{"name": "domain", "in": "query", "required": true, "schema": {"type": "string", "format": "hostname"}, "description": "bare domain such as example.com; not a URL"}], "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Missing or malformed domain. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/dns-audit"}}}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "50000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}}, "/v1/suite": {"get": {"summary": "HTTP and DNS audit for up to three targets in one call", "description": "Multi-target suite: for each of up to three public http or https targets, the HTTP endpoint audit (final status, redirect chain, latency p50/p95, TLS expiry and issuer, response headers, anomalies) and the DNS and email-authentication audit for that target's host (NS, MX, SPF, DMARC, a DKIM selector probe, CAA, DNSSEC). One JSON document holding every per-target result, a `checked` list of the operations actually run, and a `summary` counting findings by severity. Refuses private, loopback and link-local targets before doing any work, and returns what it has with `partial: true` rather than running past its time budget.", "parameters": [{"name": "url", "in": "query", "required": true, "schema": {"type": "string", "format": "uri"}, "description": "first target: http or https, port 80 or 443, public address only"}, {"name": "urls", "in": "query", "required": false, "schema": {"type": "string"}, "description": "at most 2 more targets, comma separated"}], "responses": {"200": {"description": "Result. Requires a settled x402 payment.", "headers": {"PAYMENT-RESPONSE": {"schema": {"type": "string"}, "description": "base64 JSON settlement receipt"}}, "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "No url, more than 3 targets, or a target that is not a public http/https URL on port 80 or 443. Not settled."}, "402": {"description": "Payment required, or payment did not settle", "headers": {"PAYMENT-REQUIRED": {"schema": {"type": "string"}, "description": "base64 JSON PaymentRequired (x402 v2) for /v1/suite"}}}, "429": {"description": "Rate limited: 60 requests per minute per IP"}}, "x-payment-info": {"protocol": "x402", "version": 2, "scheme": "exact", "network": "eip155:8453", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "amount": "80000", "payTo": "0x7373E88368378052EB5a449d2eBC95aD7E5f2bEF", "facilitator": "https://facilitator.payai.network"}}}, "/.well-known/x402": {"get": {"summary": "Discovery document", "responses": {"200": {"description": "ok"}}}}, "/llms.txt": {"get": {"summary": "Plain-text description for agents", "responses": {"200": {"description": "ok"}}}}, "/healthz": {"get": {"summary": "Liveness", "responses": {"200": {"description": "ok"}}}}}}