{"openapi":"3.1.0","info":{"title":"JSON Validate, Repair, Convert, Query & Diff","description":"Every AI agent and developer runs into broken or confusing JSON constantly. This tool handles all the most common JSON headaches in one place: check if JSON is valid (with exact error location), fix near-JSON that has typos or formatting mistakes, pretty-print or minify, pull out specific values using a path expression, compare two JSON documents and see exactly what changed, convert to and from YAML or CSV, produce a byte-stable canonical form for hashing or signing, validate against a schema, and get size and structure statistics. Same input always gives the same output — fully predictable, no side effects.","version":"1.0.0","contact":{"name":"_done","url":"https://forms.gle/5KzuSFH7p8hHtDmz7","email":"info@underscoredone.com"},"x-openapi-url":"https://json-suite.underscoredone.com/openapi.json","x-logo":{"url":"https://underscoredone.com/logo.png","altText":"_done"},"x-guidance":"Send the 'op' field to choose what to do. Use 'data_raw' (a plain string) only for 'validate' and 'repair' — these two need the original broken text. Use 'data' (actual parsed JSON) for all other operations: format, canonicalize, convert, query, diff, patch, schema, stats. For 'diff' and 'patch', put the first document in 'data' and the second in 'options.data_b'. For 'query', put your JSONPath expression (e.g. '$.items[*].id') in 'options.jsonpath' or a JSON Pointer (e.g. '/items/0/id') in 'options.pointer'. For 'convert', set 'options.to' to 'yaml', 'csv', 'ndjson', or 'json'. For 'schema', put the JSON Schema object in 'options.schema'. For 'format', set 'options.indent' (number, default 2) and 'options.sort_keys' (true/false). For 'canonicalize', no extra options needed — output is RFC 8785 JCS bytes as a string. The 'repair' operation is heuristic: it always returns 'fixes_applied' so you can audit what changed. Check the 'valid' field first in every response. On a 400 error, read 'detail' for a plain-English explanation of what went wrong.","x-ai-instructions":"Send the 'op' field to choose what to do. Use 'data_raw' (a plain string) only for 'validate' and 'repair' — these two need the original broken text. Use 'data' (actual parsed JSON) for all other operations: format, canonicalize, convert, query, diff, patch, schema, stats. For 'diff' and 'patch', put the first document in 'data' and the second in 'options.data_b'. For 'query', put your JSONPath expression (e.g. '$.items[*].id') in 'options.jsonpath' or a JSON Pointer (e.g. '/items/0/id') in 'options.pointer'. For 'convert', set 'options.to' to 'yaml', 'csv', 'ndjson', or 'json'. For 'schema', put the JSON Schema object in 'options.schema'. For 'format', set 'options.indent' (number, default 2) and 'options.sort_keys' (true/false). For 'canonicalize', no extra options needed — output is RFC 8785 JCS bytes as a string. The 'repair' operation is heuristic: it always returns 'fixes_applied' so you can audit what changed. Check the 'valid' field first in every response. On a 400 error, read 'detail' for a plain-English explanation of what went wrong.","x-provider":"_done — single-purpose utility APIs for developers and AI agents. Pay per call with USDC on Base.","x-pricing":{"model":"pay-per-call","currency":"USDC","network":"Base Mainnet","price":"$0.01"},"x-keywords":["parsing","json","validate","repair","jsonpath","diff","canonicalize","convert","yaml","csv","json-schema","rfc8785","ai-agent","utility","api","pay-per-call","usdc","x402"],"x-category":"parsing","x-provider-url":"https://underscoredone.com","x-402":{"price":"$0.01","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","pay_to":"0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08","facilitator":"https://api.cdp.coinbase.com/platform/v2/x402","scheme":"exact","description":"Every AI agent and developer runs into broken or confusing JSON constantly. This tool handles all the most common JSON headaches in one place: check if JSON is valid (with exact error location), fix near-JSON that has typos or formatting mistakes, pretty-print or minify, pull out specific values using a path expression, compare two JSON documents and see exactly what changed, convert to and from YAML or CSV, produce a byte-stable canonical form for hashing or signing, validate against a schema, and get size and structure statistics. Same input always gives the same output — fully predictable, no side effects.","mime_type":"application/json"}},"paths":{"/json":{"post":{"tags":["Parsing"],"summary":"Validate, repair, format, query, diff, convert, and canonicalize JSON in one call.","description":"Process a JSON document using the chosen operation. Send op to pick what to do, data or data_raw for the input, and options for extra settings.","operationId":"handler_json_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"},"examples":{"typical":{"summary":"Typical input","value":{"op":"query","data":{"order":{"id":"A-1029","items":[{"sku":"BIL-CUE-07","qty":2},{"sku":"BIL-CHALK-01","qty":5}]}},"options":{"jsonpath":"$.order.items[*].sku"}}},"zero_or_empty":{"summary":"Zero or empty input","value":{"op":"validate","data_raw":"{}"}},"negative_or_invalid":{"summary":"Invalid input (400 error)","value":{"op":"repair","data_raw":"{name:'Ada', role:'Engineer', active:true,}","options":{"pretty":true}}},"large":{"summary":"Large input","value":{"op":"diff","data":{"config":{"version":3,"retries":5,"timeout":30,"features":["auth","logging","metrics"]},"users":[{"id":1,"role":"admin"},{"id":2,"role":"viewer"}]},"options":{"data_b":{"config":{"version":4,"retries":5,"timeout":60,"features":["auth","logging"]},"users":[{"id":1,"role":"admin"},{"id":2,"role":"editor"}]}}}}}}},"required":true},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Response"},"examples":{"success":{"summary":"Successful response","value":{"api_version":"1.0.0","op":"query","valid":true,"matches":[{"path":"$.order.items[0].sku","value":"BIL-CUE-07"},{"path":"$.order.items[1].sku","value":"BIL-CHALK-01"}],"match_count":2}}}}}},"422":{"description":"Unprocessable — a required field is missing or the wrong type. Check the detail field for specifics.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"array"}}}}}},"402":{"description":"Payment required. Send a signed USDC payment on Base Mainnet using the x402 protocol.","headers":{"X-Payment-Response":{"description":"x402 payment challenge — base64-encoded JSON with payment details.","schema":{"type":"string"}}}},"400":{"description":"Bad request — your input failed validation or could not be processed. Check the detail field for specifics.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}}},"x-ai-instructions":"Send the 'op' field to choose what to do. Use 'data_raw' (a plain string) only for 'validate' and 'repair' — these two need the original broken text. Use 'data' (actual parsed JSON) for all other operations: format, canonicalize, convert, query, diff, patch, schema, stats. For 'diff' and 'patch', put the first document in 'data' and the second in 'options.data_b'. For 'query', put your JSONPath expression (e.g. '$.items[*].id') in 'options.jsonpath' or a JSON Pointer (e.g. '/items/0/id') in 'options.pointer'. For 'convert', set 'options.to' to 'yaml', 'csv', 'ndjson', or 'json'. For 'schema', put the JSON Schema object in 'options.schema'. For 'format', set 'options.indent' (number, default 2) and 'options.sort_keys' (true/false). For 'canonicalize', no extra options needed — output is RFC 8785 JCS bytes as a string. The 'repair' operation is heuristic: it always returns 'fixes_applied' so you can audit what changed. Check the 'valid' field first in every response. On a 400 error, read 'detail' for a plain-English explanation of what went wrong.","x-guidance":"Send the 'op' field to choose what to do. Use 'data_raw' (a plain string) only for 'validate' and 'repair' — these two need the original broken text. Use 'data' (actual parsed JSON) for all other operations: format, canonicalize, convert, query, diff, patch, schema, stats. For 'diff' and 'patch', put the first document in 'data' and the second in 'options.data_b'. For 'query', put your JSONPath expression (e.g. '$.items[*].id') in 'options.jsonpath' or a JSON Pointer (e.g. '/items/0/id') in 'options.pointer'. For 'convert', set 'options.to' to 'yaml', 'csv', 'ndjson', or 'json'. For 'schema', put the JSON Schema object in 'options.schema'. For 'format', set 'options.indent' (number, default 2) and 'options.sort_keys' (true/false). For 'canonicalize', no extra options needed — output is RFC 8785 JCS bytes as a string. The 'repair' operation is heuristic: it always returns 'fixes_applied' so you can audit what changed. Check the 'valid' field first in every response. On a 400 error, read 'detail' for a plain-English explanation of what went wrong.","x-payment-info":{"price":{"fixed":{"mode":"fixed","currency":"USD","amount":"0.01"}},"protocols":[{"x402":{}}]}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Request":{"properties":{"op":{"type":"string","title":"Op","description":"What you want to do. Choose one of: validate, repair, format, canonicalize, convert, query, diff, patch, schema, stats."},"data":{"anyOf":[{},{"type":"null"}],"title":"Data","description":"The JSON value you want to work with — can be an object, array, string, number, or anything valid. Required for all operations except validate and repair."},"data_raw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Raw","description":"The raw text you want to validate or repair. Use this instead of data only for validate and repair, because those need to see the original broken text exactly as-is."},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options","description":"Extra settings for the chosen operation. For example: indent, sort_keys, jsonpath, pointer, to (for convert), schema, data_b (for diff/patch). All optional — sensible defaults are used."}},"type":"object","required":["op"],"title":"Request","example":{"data":{"order":{"id":"A-1029","items":[{"qty":2,"sku":"BIL-CUE-07"},{"qty":5,"sku":"BIL-CHALK-01"}]}},"op":"query","options":{"jsonpath":"$.order.items[*].sku"}}},"Response":{"properties":{"api_version":{"type":"string","title":"Api Version","description":"API version","default":"1.0.0"},"op":{"type":"string","title":"Op","description":"The operation that was performed."},"valid":{"type":"boolean","title":"Valid","description":"Whether the JSON is valid (for validate) or the operation succeeded.","default":true},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"A plain-English description of what went wrong, if the JSON is not valid."},"line":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line","description":"The line number where the error was found, if known."},"column":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Column","description":"The column number where the error was found, if known."},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"The JSON path to the problem location, if known."},"result":{"anyOf":[{},{"type":"null"}],"title":"Result","description":"The output for format, canonicalize, convert, query (string), patch, and schema operations."},"repaired":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repaired","description":"The repaired JSON text, as a string."},"fixes_applied":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Fixes Applied","description":"A list describing what kinds of fixes were made during repair."},"matches":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Matches","description":"The list of values found by a query, each with its path and value."},"match_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Match Count","description":"How many values the query matched."},"equal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Equal","description":"Whether the two JSON documents are identical."},"change_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Change Count","description":"How many differences were found between the two documents."},"patch":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Patch","description":"The list of changes (RFC 6902 JSON Patch) that turn the first document into the second."},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats","description":"Size and structure statistics about the JSON document."},"schema_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Schema Valid","description":"Whether the document passes the provided JSON Schema."},"schema_errors":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Schema Errors","description":"A list of schema validation errors, if any."}},"type":"object","required":["op"],"title":"Response","example":{"api_version":"1.0.0","match_count":2,"matches":[{"path":"$.order.items[0].sku","value":"BIL-CUE-07"},{"path":"$.order.items[1].sku","value":"BIL-CHALK-01"}],"op":"query","valid":true}},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"siwx":{"type":"apiKey","in":"header","name":"SIGN-IN-WITH-X","description":"CAIP-122 wallet signature for repeat access after payment"}}},"servers":[{"url":"https://json-suite.underscoredone.com","description":"Production"}]}