Projects & resources
A project is the unit of API ownership. It groups everything one API product needs: resources (data shapes), records (the actual data), API keys (auth), consumers (named end-customers), logs, usage, contracts (versions of the API surface), and webhooks.
A resource is one data shape inside a project. Each resource has fields with types and validation rules. EndpointOS stores records for that resource as JSON, and every record gets a stable id on create.
Field types
string: text. Validated by length when bounds are set.number: JSON number. Validated by min/max when bounds are set.boolean: true/false.enum: one of a fixed list of strings.datetime: ISO-8601 UTC timestamp.json: arbitrary nested JSON object. Use sparingly; loses validation.
Field rules
required: POST/PATCH that omits the field returns422.default: value applied on POST when the field is omitted.- Enum values: restrict an
enumfield to a closed set of strings. - Min/max: bounds on
stringlength andnumbervalue.
Data sources
- EndpointOS-managed: records live in our database as JSON. Zero setup. Default for new resources.
- Supabase: records live in a table in your own Supabase project. Paste the project URL, a service-role key (encrypted at rest), and the table name. EndpointOS handles auth, validation, monthly caps, and logs every request; record CRUD is proxied to your Supabase via PostgREST.
- External Postgres: any HTTPS-reachable Postgres (Neon, RDS, self-hosted, etc.). Connection string is encrypted at rest. Parameterised queries only; SSRF guard re-checks the host on every connect.
- BigQuery (read-only): expose a filtered, paginated view of a warehouse table. Service-account JSON auth (bigquery.readonly scope). Parameterised SQL via the jobs.query REST endpoint.
- Firestore (full CRUD): point a resource at a Firestore collection over the REST API. Typed-value format translated to plain JSON at the boundary so your clients never see Firestore's wire shape.
- External REST: any HTTPS endpoint. EndpointOS becomes the stable, branded, observable front door; we proxy CRUD upstream. Optional auth header, SSRF guard on every call.
What you can't do (yet)
- Relationships between resources (foreign keys, joins).
- Custom validation logic (regex patterns, custom validators).