{"openapi":"3.1.0","info":{"title":"HTML Table API","version":"1.0.0","description":"Render tabular data as an HTML table, and parse an HTML table back into data. The render endpoint turns a JSON array (of objects, or of arrays) or CSV into a clean, semantic <table> with <thead>/<tbody>, an optional caption and CSS class — every cell HTML-escaped so it is safe to embed. The parse endpoint does the reverse: give it any HTML containing a table and get back the headers, the rows and a ready-to-use JSON array of objects, with entities decoded and tags stripped from each cell. Perfect for emails and reports, dashboards and admin screens, and scraping or migrating tabular content. Pure local computation — no key, no third-party service, instant; up to 2 MB via POST. Live, nothing stored. 3 endpoints. Distinct from Markdown/ASCII table rendering and from generic HTML extraction.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/htmltable-api","description":"oanor gateway"}],"tags":[{"name":"HTML Table"},{"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/parse":{"get":{"operationId":"get_v1_parse","tags":["HTML Table"],"summary":"Parse an HTML table to JSON","description":"","parameters":[{"name":"html","in":"query","required":true,"description":"HTML containing a table","schema":{"type":"string"},"example":"<table><tr><th>name</th></tr><tr><td>Alice</td></tr></table>"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"json":[{"name":"Alice"}],"rows":[["Alice"]],"headers":["name"],"row_count":1},"meta":{"timestamp":"2026-06-03T09:25:09.687Z","request_id":"64ce5990-a1d2-43bb-9de3-f937454cea9b"},"status":"ok","message":"Parse an HTML table","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/render":{"get":{"operationId":"get_v1_render","tags":["HTML Table"],"summary":"Render an HTML table","description":"","parameters":[{"name":"json","in":"query","required":true,"description":"Array of objects/arrays (or use csv)","schema":{"type":"string"},"example":"[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]"},{"name":"csv","in":"query","required":false,"description":"CSV text (alternative to json)","schema":{"type":"string"}},{"name":"caption","in":"query","required":false,"description":"Optional caption","schema":{"type":"string"}},{"name":"class","in":"query","required":false,"description":"Optional CSS class","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"html":"<table><thead><tr><th>name</th><th>age</th></tr></thead><tbody><tr><td>Alice</td><td>30</td></tr><tr><td>Bob</td><td>25</td></tr></tbody></table>","rows":2,"columns":2},"meta":{"timestamp":"2026-06-03T09:25:09.786Z","request_id":"86ce43c3-0dcb-4c9c-bd6f-064163376852"},"status":"ok","message":"Render an HTML table","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":"HTML Table API","notes":"render takes the first row as the header (array-of-arrays) or the union of keys (array-of-objects). parse reads the first <table> in the input. Send large input via POST.","version":"v1","endpoints":[{"path":"/v1/render","params":{"csv":"CSV text","json":"array of objects/arrays, OR","class":"optional CSS class","caption":"optional"},"returns":"an HTML <table>"},{"path":"/v1/parse","params":{"html":"HTML containing a table (required)"},"returns":"headers, rows and a JSON array of objects"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"Render tabular data as an HTML <table> (from a JSON array of objects/arrays or from CSV, with an optional caption and CSS class), and parse an existing HTML table back into headers, rows and a JSON array of objects. Cells are HTML-escaped on render and entity-decoded on parse. Pure local, no key."},"meta":{"timestamp":"2026-06-03T09:25:09.893Z","request_id":"b2e8f0f9-a7e8-473f-987e-1907ff8955d3"},"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":1185,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":225,"monthly_call_quota":10250,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2215,"monthly_call_quota":153500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":6015,"monthly_call_quota":810000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/htmltable-api"}