{"openapi":"3.0.3","info":{"title":"kestrel482 CSV Dedupe","version":"1.0.0","description":"Experimental exact CSV deduplication API. Keeps the first matching row. Public or synthetic data only; 128 KiB and 1,000 rows per call."},"servers":[{"url":"https://kestrel482-csv.netlify.app"}],"paths":{"/api/dedupe":{"post":{"operationId":"deduplicateCsv","summary":"Remove exact duplicate CSV records","description":"Remove duplicate CSV records using all columns or up to three exact key columns. Returns cleaned CSV, row counts and duplicate count. JSON input: csv string and optional keys array. No fuzzy matching.","x-price":"0.01","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["csv"],"properties":{"csv":{"type":"string","description":"Inline CSV, maximum 128 KiB and 1,000 data rows."},"keys":{"type":"array","maxItems":3,"uniqueItems":true,"items":{"type":"string","minLength":1},"description":"Exact column names. Omit to compare entire rows."}}},"example":{"csv":"id,note\n1,first\n1,duplicate\n","keys":["id"]}}}},"responses":{"200":{"description":"Deduplicated CSV and counts after payment settles."},"400":{"description":"Invalid input; no charge."},"402":{"description":"x402 v2 USDC payment required. Read PAYMENT-REQUIRED, pay the quoted amount, retry with PAYMENT-SIGNATURE."},"429":{"description":"Service busy; retry later."},"503":{"description":"Trial limit reached or temporary failure."}}}}}}