{"openapi":"3.1.0","info":{"title":"CSV API","version":"1.0.0","description":"A fast, fully-local CSV data toolkit: parse CSV into typed row objects (RFC-4180), compute per-column statistics (count, unique, type and top values, and for numeric columns min, max, mean, median and sum), remove duplicate rows by all or a subset of columns, sort by a column with numeric-aware ordering, and filter rows by a condition (equals, not-equals, greater/less than, contains, starts-with, empty, not-empty). Every endpoint accepts input via the query string or the request body, up to 2 MB, and returns both row objects and a CSV string. Pure server-side compute, no third-party upstream, so responses are instant and always available. Ideal for data wrangling, ETL, analytics preparation, spreadsheet tooling and data cleaning. (For plain CSV to JSON conversion, see the oanor JSON API.)","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/csv-api","description":"oanor gateway"}],"tags":[{"name":"CSV"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/dedupe":{"get":{"operationId":"get_v1_dedupe","tags":["CSV"],"summary":"Remove duplicate rows","description":"","parameters":[{"name":"csv","in":"query","required":true,"description":"CSV with header row","schema":{"type":"string"},"example":"name,age,city\nAda,36,Berlin\nBob,41,Paris"},{"name":"columns","in":"query","required":false,"description":"Subset of columns to dedupe by","schema":{"type":"string"},"example":"name,city"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"csv":"name,age,city\nAda,36,Berlin\nBob,41,Paris","rows":[{"age":36,"city":"Berlin","name":"Ada"},{"age":41,"city":"Paris","name":"Bob"}],"count":2,"columns":["name","age","city"],"removed":0},"meta":{"timestamp":"2026-05-30T10:10:56.822Z","request_id":"7d72f4cf-4ce0-4fa9-9779-0c8e960044b9"},"status":"ok","message":"OK","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/filter":{"get":{"operationId":"get_v1_filter","tags":["CSV"],"summary":"Filter rows","description":"","parameters":[{"name":"csv","in":"query","required":true,"description":"CSV with header row","schema":{"type":"string"},"example":"name,age,city\nAda,36,Berlin\nBob,41,Paris"},{"name":"column","in":"query","required":true,"description":"Column","schema":{"type":"string"},"example":"age"},{"name":"op","in":"query","required":false,"description":"eq, neq, gt, gte, lt, lte, contains, startswith, empty, notempty","schema":{"type":"string"},"example":"gte"},{"name":"value","in":"query","required":false,"description":"Comparison value","schema":{"type":"string"},"example":"40"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"op":"gte","csv":"name,age,city\nBob,41,Paris","rows":[{"age":41,"city":"Paris","name":"Bob"}],"count":1,"value":"40","column":"age","columns":["name","age","city"]},"meta":{"timestamp":"2026-05-30T10:10:56.892Z","request_id":"2e87b1af-ecce-463b-91a7-40fa3f722fbf"},"status":"ok","message":"OK","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/parse":{"get":{"operationId":"get_v1_parse","tags":["CSV"],"summary":"Parse CSV to rows","description":"","parameters":[{"name":"csv","in":"query","required":true,"description":"CSV with header row","schema":{"type":"string"},"example":"name,age,city\nAda,36,Berlin\nBob,41,Paris"},{"name":"delimiter","in":"query","required":false,"description":"Delimiter (default ,)","schema":{"type":"string"},"example":","},{"name":"raw","in":"query","required":false,"description":"Keep all values as strings","schema":{"type":"string"},"example":"false"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"rows":[{"age":36,"city":"Berlin","name":"Ada"},{"age":41,"city":"Paris","name":"Bob"}],"count":2,"columns":["name","age","city"]},"meta":{"timestamp":"2026-05-30T10:10:56.970Z","request_id":"784f5822-6e2b-4299-97f4-c0f0d2113b28"},"status":"ok","message":"OK","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/sort":{"get":{"operationId":"get_v1_sort","tags":["CSV"],"summary":"Sort rows by column","description":"","parameters":[{"name":"csv","in":"query","required":true,"description":"CSV with header row","schema":{"type":"string"},"example":"name,age,city\nAda,36,Berlin\nBob,41,Paris"},{"name":"by","in":"query","required":true,"description":"Column to sort by","schema":{"type":"string"},"example":"age"},{"name":"order","in":"query","required":false,"description":"asc or desc","schema":{"type":"string"},"example":"desc"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"by":"age","csv":"name,age,city\nBob,41,Paris\nAda,36,Berlin","rows":[{"age":41,"city":"Paris","name":"Bob"},{"age":36,"city":"Berlin","name":"Ada"}],"count":2,"order":"desc","columns":["name","age","city"]},"meta":{"timestamp":"2026-05-30T10:10:57.049Z","request_id":"8479e8ef-4c67-4798-a96f-fc61e10768c1"},"status":"ok","message":"OK","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/stats":{"get":{"operationId":"get_v1_stats","tags":["CSV"],"summary":"Per-column statistics","description":"","parameters":[{"name":"csv","in":"query","required":true,"description":"CSV with header row","schema":{"type":"string"},"example":"name,age,city\nAda,36,Berlin\nBob,41,Paris"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"rows":2,"stats":{"age":{"max":41,"min":36,"sum":77,"mean":38.5,"type":"number","count":2,"empty":0,"median":38.5,"unique":2,"top_values":[{"count":1,"value":"36"},{"count":1,"value":"41"}]},"city":{"type":"string","count":2,"empty":0,"unique":2,"top_values":[{"count":1,"value":"Berlin"},{"count":1,"value":"Paris"}]},"name":{"type":"string","count":2,"empty":0,"unique":2,"top_values":[{"count":1,"value":"Ada"},{"count":1,"value":"Bob"}]}},"columns":3},"meta":{"timestamp":"2026-05-30T10:10:57.125Z","request_id":"aaddb16e-fac5-49bb-a3f2-903ca265e174"},"status":"ok","message":"OK","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":11000,"rps_limit":2,"hard_limit":true},{"slug":"basic","name":"Basic","price_cents_month":400,"monthly_call_quota":190000,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1500,"monthly_call_quota":1100000,"rps_limit":25,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":3800,"monthly_call_quota":5500000,"rps_limit":80,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/csv-api"}