This document defines the OpenComments v1 API contract for open data access and export jobs.
- Supabase Edge Function base:
/functions/v1/public-api - Version prefix:
/v1
Example full path:
/functions/v1/public-api/v1/dockets
- Requests:
application/json - Responses:
application/json
List endpoints support:
page(default1)per_page(default20, max100)
List responses include:
meta.pagemeta.per_pagemeta.total_count(nullorunknownwhen exact count is unavailable)- Headers:
X-Request-Id,X-Page,X-Per-Page,X-Total-Count
- Public API routes are rate limited per-IP and per-route in a 60-second window.
- Default limit:
120requests/minute (configurable viaPUBLIC_API_RATE_LIMIT_PER_MINUTE). - Exceeded requests return
429 RATE_LIMIT_EXCEEDED.
Query params:
q(optional search text)status(opendefault,draft,closed,archived,all)tags(comma-separated list)page,per_page
Returns public docket detail with agency context, attachments, and public comments.
Query params:
status(comma-separated list; default compatibility set:published,approved)docket_slugq(content search)page,per_page
Returns one public comment detail record.
Query params:
q(name/jurisdiction search)page,per_page
Returns one agency profile.
Authentication uses Supabase JWT bearer token:
Authorization: Bearer <access_token>
Request body:
{
"agency_id": "uuid",
"docket_id": "uuid-optional",
"export_type": "csv",
"filters": {
"comment_statuses": ["published"],
"date_from": "2026-01-01T00:00:00Z",
"date_to": "2026-01-31T23:59:59Z",
"include_pii": false
}
}Notes:
export_type:csv | zip | combined- Creates job and triggers background generation function.
- PII behavior:
include_piidefaults tofalse.- Email fields are masked unless
include_pii=trueand caller has authorized platform role. - When requesting unmasked PII, include
pii_reasonin filters.
Returns export job status and metadata for authorized agency users.
Returns a one-hour signed download URL for completed exports.
{
"error": {
"code": "VALIDATION_ERROR",
"message": "agency_id is required",
"details": null
}
}Rate limit error example:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many API requests. Please retry shortly.",
"details": {
"limit": 120,
"remaining": 0,
"reset_at": "2026-02-11T12:00:00Z"
}
}
}- v1 route handlers are implemented in:
supabase/functions/public-api/index.ts
- Export processing function:
supabase/functions/generate-export/index.ts
- Rate limiting and formal OpenAPI generation are planned hardening tasks.