{"schema_version":"1.0","service":{"name":"DataGate x402","description":"Validate and conservatively clean structured data before agent pipelines consume it.","payment_enabled":true},"payment":{"protocol":"x402","version":2,"scheme":"exact","network":"eip155:8453","asset":"USDC","pay_to":"0x340106403E7489E0De42017a6ede2d7BA562cab6","facilitator":"Coinbase CDP Facilitator"},"resources":[{"method":"POST","path":"/validate","url":"https://datagate-x402.onrender.com/validate","price":"$0.05","description":"Validate structured JSON data against explicit quality rules without modifying the data.","input_schema":{"additionalProperties":false,"description":"Input contract for POST /validate.","properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"title":"Data","type":"array"},"rules":{"additionalProperties":false,"description":"Machine-readable validation contract for a batch of JSON records.\n\nThis keeps the proven Artifact Handoff pattern: the caller declares an\nexplicit contract first, and the service returns structured violations\ninstead of guessing what the caller intended.","properties":{"required_fields":{"items":{"type":"string"},"title":"Required Fields","type":"array"},"types":{"additionalProperties":{"enum":["string","integer","number","boolean","date"],"type":"string"},"title":"Types","type":"object"},"nullable":{"additionalProperties":{"type":"boolean"},"title":"Nullable","type":"object"},"ranges":{"additionalProperties":{"description":"Optional inclusive numeric range for a field.","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Min"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Max"}},"title":"RangeRule","type":"object"},"title":"Ranges","type":"object"},"date_formats":{"additionalProperties":{"type":"string"},"title":"Date Formats","type":"object"},"duplicates":{"anyOf":[{"description":"Duplicate detection configuration.\n\nIf fields is empty, the entire record is used as the duplicate key.\nDuplicate records default to WARN so callers can distinguish quality\nwarnings from hard schema failures.","properties":{"fields":{"items":{"type":"string"},"title":"Fields","type":"array"},"severity":{"default":"WARN","enum":["WARN","FAIL"],"title":"Severity","type":"string"}},"title":"DuplicateRule","type":"object"},{"type":"null"}],"default":null}},"title":"ValidationRules","type":"object"}},"required":["data"],"title":"ValidateRequest","type":"object"},"output_schema":{"description":"Stable VALIDATE response contract.","properties":{"verdict":{"enum":["PASS","WARN","FAIL"],"title":"Verdict","type":"string"},"issues":{"items":{"description":"A single problem detected in the dataset.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"}},"required":["code","severity","message"],"title":"ValidationIssue","type":"object"},"title":"Issues","type":"array"},"summary":{"description":"Small batch summary useful to machine consumers.","properties":{"rows_received":{"title":"Rows Received","type":"integer"},"issues_found":{"title":"Issues Found","type":"integer"},"warnings":{"title":"Warnings","type":"integer"},"failures":{"title":"Failures","type":"integer"}},"required":["rows_received","issues_found","warnings","failures"],"title":"ValidationSummary","type":"object"}},"required":["verdict","issues","summary"],"title":"ValidateResponse","type":"object"}},{"method":"POST","path":"/clean","url":"https://datagate-x402.onrender.com/clean","price":"$0.30","description":"Validate, conservatively clean, revalidate, and return cleaned data with an SHA-256 manifest and audit trail.","input_schema":{"additionalProperties":false,"description":"Input contract for POST /clean.","properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"title":"Data","type":"array"},"rules":{"additionalProperties":false,"description":"Machine-readable validation contract for a batch of JSON records.\n\nThis keeps the proven Artifact Handoff pattern: the caller declares an\nexplicit contract first, and the service returns structured violations\ninstead of guessing what the caller intended.","properties":{"required_fields":{"items":{"type":"string"},"title":"Required Fields","type":"array"},"types":{"additionalProperties":{"enum":["string","integer","number","boolean","date"],"type":"string"},"title":"Types","type":"object"},"nullable":{"additionalProperties":{"type":"boolean"},"title":"Nullable","type":"object"},"ranges":{"additionalProperties":{"description":"Optional inclusive numeric range for a field.","properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Min"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Max"}},"title":"RangeRule","type":"object"},"title":"Ranges","type":"object"},"date_formats":{"additionalProperties":{"type":"string"},"title":"Date Formats","type":"object"},"duplicates":{"anyOf":[{"description":"Duplicate detection configuration.\n\nIf fields is empty, the entire record is used as the duplicate key.\nDuplicate records default to WARN so callers can distinguish quality\nwarnings from hard schema failures.","properties":{"fields":{"items":{"type":"string"},"title":"Fields","type":"array"},"severity":{"default":"WARN","enum":["WARN","FAIL"],"title":"Severity","type":"string"}},"title":"DuplicateRule","type":"object"},{"type":"null"}],"default":null}},"title":"ValidationRules","type":"object"},"cleaning":{"additionalProperties":false,"description":"Explicit policy for the CLEAN endpoint.\n\nDefaults are intentionally conservative:\n- deterministic safe type coercions are enabled;\n- duplicates are removed only when the validation contract defines how\n  duplicates are identified;\n- string trimming is opt-in;\n- null replacement and alternate date formats must be supplied explicitly.","properties":{"coerce_types":{"default":true,"title":"Coerce Types","type":"boolean"},"deduplicate":{"default":true,"title":"Deduplicate","type":"boolean"},"trim_strings":{"default":false,"title":"Trim Strings","type":"boolean"},"null_replacements":{"additionalProperties":true,"title":"Null Replacements","type":"object"},"date_input_formats":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"title":"Date Input Formats","type":"object"}},"title":"CleaningPolicy","type":"object"}},"required":["data"],"title":"CleanRequest","type":"object"},"output_schema":{"description":"CLEAN response contract with additive Phase 3 traceability.\n\nBackward compatibility:\n- `issues` remains the list of issues after cleaning.\n- `cleaning_actions` remains unchanged.\n\nAdded audit sets:\n- `issues_original`: all issues before cleaning.\n- `issues_resolved`: original issues that disappeared AND have a compatible\n  cleaning action that explains why.\n- `issues_remaining`: explicit alias of the final `issues` list.\n- `issues_untraced_disappeared`: issues that disappeared without a\n  compatible action. These are NOT claimed as resolved.","properties":{"verdict":{"enum":["PASS","WARN","FAIL"],"title":"Verdict","type":"string"},"issues":{"items":{"description":"A single problem detected in the dataset.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"}},"required":["code","severity","message"],"title":"ValidationIssue","type":"object"},"title":"Issues","type":"array"},"cleaning_actions":{"items":{"description":"A deterministic mutation actually applied by CLEAN.","properties":{"code":{"title":"Code","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"}},"required":["code","message"],"title":"CleaningAction","type":"object"},"title":"Cleaning Actions","type":"array"},"issues_original":{"items":{"description":"A single problem detected in the dataset.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"}},"required":["code","severity","message"],"title":"ValidationIssue","type":"object"},"title":"Issues Original","type":"array"},"issues_resolved":{"items":{"description":"An original issue proven to be absent after CLEAN and linked to the\nconcrete cleaning action that explains its disappearance.\n\nThe inherited row/field/code identify the ORIGINAL issue.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"},"resolved_by":{"description":"A deterministic mutation actually applied by CLEAN.","properties":{"code":{"title":"Code","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"}},"required":["code","message"],"title":"CleaningAction","type":"object"}},"required":["code","severity","message","resolved_by"],"title":"ResolvedValidationIssue","type":"object"},"title":"Issues Resolved","type":"array"},"issues_remaining":{"items":{"description":"A single problem detected in the dataset.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"}},"required":["code","severity","message"],"title":"ValidationIssue","type":"object"},"title":"Issues Remaining","type":"array"},"issues_untraced_disappeared":{"items":{"description":"A single problem detected in the dataset.","properties":{"code":{"title":"Code","type":"string"},"severity":{"enum":["WARN","FAIL"],"title":"Severity","type":"string"},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Field"},"message":{"title":"Message","type":"string"},"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"}},"required":["code","severity","message"],"title":"ValidationIssue","type":"object"},"title":"Issues Untraced Disappeared","type":"array"},"cleaned_data":{"items":{"additionalProperties":true,"type":"object"},"title":"Cleaned Data","type":"array"},"manifest":{"description":"Integrity metadata for cleaned_data.\n\nThe digest is over canonical cleaned_data bytes only. The manifest itself\nis not included in the hash, avoiding circular/non-deterministic hashing.","properties":{"schema_version":{"const":"1.0","default":"1.0","title":"Schema Version","type":"string"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"hash_algorithm":{"const":"sha256","default":"sha256","title":"Hash Algorithm","type":"string"},"canonicalization":{"const":"datagate-json-v1","default":"datagate-json-v1","title":"Canonicalization","type":"string"},"cleaned_data_sha256":{"title":"Cleaned Data Sha256","type":"string"},"cleaned_data_bytes":{"title":"Cleaned Data Bytes","type":"integer"},"provenance":{"additionalProperties":true,"title":"Provenance","type":"object"}},"required":["created_at","cleaned_data_sha256","cleaned_data_bytes","provenance"],"title":"DataManifest","type":"object"},"summary":{"description":"Before/after summary for a CLEAN operation.","properties":{"rows_received":{"title":"Rows Received","type":"integer"},"rows_output":{"title":"Rows Output","type":"integer"},"issues_before_cleaning":{"title":"Issues Before Cleaning","type":"integer"},"issues_resolved":{"title":"Issues Resolved","type":"integer"},"issues_remaining":{"title":"Issues Remaining","type":"integer"},"issues_untraced_disappeared":{"title":"Issues Untraced Disappeared","type":"integer"},"cleaning_actions":{"title":"Cleaning Actions","type":"integer"},"warnings_remaining":{"title":"Warnings Remaining","type":"integer"},"failures_remaining":{"title":"Failures Remaining","type":"integer"}},"required":["rows_received","rows_output","issues_before_cleaning","issues_resolved","issues_remaining","issues_untraced_disappeared","cleaning_actions","warnings_remaining","failures_remaining"],"title":"CleanSummary","type":"object"}},"required":["verdict","issues","cleaning_actions","issues_original","issues_resolved","issues_remaining","issues_untraced_disappeared","cleaned_data","manifest","summary"],"title":"CleanResponse","type":"object"}}]}