{"openapi":"3.1.0","info":{"title":"Set Operations API","version":"1.0.0","description":"Treat lists as sets. Compute the union, intersection, difference or symmetric difference of two lists; deduplicate a single list; and compare two lists to learn whether one is a subset of the other, whether they are equal as sets, whether they are disjoint and how many items they share. Items can be plain strings (comma- or newline-separated) or arbitrary JSON values, and an optional case-insensitive mode treats differently-cased strings as equal. Order is preserved (first occurrence wins). Perfect for data wrangling and reconciliation, tag and permission maths, deduplication, A/B list comparison and ETL. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 4 endpoints. Distinct from CSV/JSON toolkits — this is pure set logic.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/setops-api","description":"oanor gateway"}],"tags":[{"name":"Set Ops"},{"name":"Meta"}],"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/compare":{"get":{"operationId":"get_v1_compare","tags":["Set Ops"],"summary":"Compare two lists","description":"","parameters":[{"name":"a","in":"query","required":true,"description":"First list","schema":{"type":"string"},"example":"a,b"},{"name":"b","in":"query","required":true,"description":"Second list","schema":{"type":"string"},"example":"a,b,c"},{"name":"case_insensitive","in":"query","required":false,"description":"true/false (default false)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"a_unique":2,"b_unique":3,"disjoint":false,"common_count":2,"a_subset_of_b":true,"b_subset_of_a":false,"equal_as_sets":false},"meta":{"timestamp":"2026-06-03T01:09:39.772Z","request_id":"947595b5-c19e-4119-9894-c3e39fd2fcdb"},"status":"ok","message":"Compare two lists","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/dedupe":{"get":{"operationId":"get_v1_dedupe","tags":["Set Ops"],"summary":"Deduplicate a list","description":"","parameters":[{"name":"list","in":"query","required":true,"description":"A list","schema":{"type":"string"},"example":"a,b,a,c,b"},{"name":"case_insensitive","in":"query","required":false,"description":"true/false (default false)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"result":["a","b","c"],"removed":2,"input_count":5,"unique_count":3},"meta":{"timestamp":"2026-06-03T01:09:39.871Z","request_id":"f3110614-3856-4f6b-b1fa-25dd104f784f"},"status":"ok","message":"Deduplicate a list","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/operate":{"get":{"operationId":"get_v1_operate","tags":["Set Ops"],"summary":"Set operation on two lists","description":"","parameters":[{"name":"a","in":"query","required":true,"description":"First list","schema":{"type":"string"},"example":"a,b,c"},{"name":"b","in":"query","required":true,"description":"Second list","schema":{"type":"string"},"example":"b,c,d"},{"name":"operation","in":"query","required":true,"description":"union|intersection|difference|symmetric_difference","schema":{"type":"string"},"example":"intersection"},{"name":"case_insensitive","in":"query","required":false,"description":"true/false (default false)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":2,"result":["b","c"],"operation":"intersection"},"meta":{"timestamp":"2026-06-03T01:09:39.966Z","request_id":"76e6aee6-5a04-4de6-820f-878b2d1ade03"},"status":"ok","message":"Set operation on two lists","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/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"Set Operations API","notes":"Lists may be a JSON array or a comma/newline-separated list. Order is preserved (first occurrence wins). Nothing is stored.","version":"v1","endpoints":[{"path":"/v1/operate","params":{"a":"list (required)","b":"list (required)","operation":"union|intersection|difference|symmetric_difference","case_insensitive":"true/false"},"returns":"the resulting list"},{"path":"/v1/dedupe","params":{"list":"a list (required)","case_insensitive":"true/false"},"returns":"the list with duplicates removed"},{"path":"/v1/compare","params":{"a":"list (required)","b":"list (required)"},"returns":"subset / equality / disjoint / overlap info"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"Treat lists as sets: union, intersection, difference and symmetric difference of two lists, deduplicate a single list, and compare two lists (subset, equality, disjoint, overlap). Works on strings or arbitrary JSON values, with an optional case-insensitive mode. Pure local, no key."},"meta":{"timestamp":"2026-06-03T01:09:40.048Z","request_id":"37bbfa9a-5695-4ac1-b7bd-53c9a97058ab"},"status":"ok","message":"Meta","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":1155,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":195,"monthly_call_quota":9950,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2185,"monthly_call_quota":150500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":5985,"monthly_call_quota":795000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/setops-api"}