OpenAPI Export & Developer Tools
Export a machine-readable OpenAPI 3.0.3 document for your schemas, try endpoints in the playground, and hand the spec to a frontend generator. The console's developer tools, and the four things the spec tells a code generator that it would otherwise get wrong.
What the console gives you
| Tool | Where | What it is for |
|---|---|---|
| API Documentation | API Docs | Every endpoint your schemas produce, grouped by schema type, with request and response shapes and copyable SDK examples |
| OpenAPI export | API Docs → Export OpenAPI | A downloadable OpenAPI 3.0.3 document covering all your schemas — JSON, YAML, or copied to the clipboard |
| PDF export | API Docs → Export PDF | The same reference as a document you can send to someone who is not going to log in |
| Playground | Playground | Issue real authenticated requests against your own data and read the actual response |
| SDK Guide | SDK Docs | The verified client patterns for Python and JavaScript |
| SDK generation | SDKs | Build a client package baked with your domain's current schemas |
| Test data generation | Data → Generate Test Data | Populate a schema with records so the endpoints have something to return |
ℹ️ These are tools for building against the API
⚠️ Not present in the on-premise admin edition
Exporting an OpenAPI document
- •Download as JSON — the conventional format for tooling.
- •Download as YAML — the conventional format for humans and for checking into a repository.
- •Copy to clipboard — the whole document as JSON, for pasting into a tool that takes a spec inline.
ℹ️ The export always covers every schema
⚠️ There is no served spec URL
What is in the document
| Security scheme | How it is sent | Where the credential comes from |
|---|---|---|
| bearerAuth | Authorization: Bearer <JWT> | POST /api/v1/auth/login — the token is at auth.access_token in the nested response, not at the top level |
| apiKeyAuth | Authorization: Bearer ak_... | POST /api/v1/domains/{domain}/api-key |
ℹ️ Both credentials travel as a bearer token
The Supero extensions, and why they matter
| Extension | What it carries |
|---|---|
| x-supero-filtering | That GET list endpoints accept no per-field filters, which operators POST /query does accept, and a worked request example |
| x-supero-parenting | That every create must be parented, the three ways to express the parent, and the expected depth for each parent type |
| x-supero-schemas | The full schema definition behind each type, beyond the request and response shapes |
🚨 The filtering rule is the one that bites
🚨 Every create must be parented
💡 Read the extensions yourself even if your tool ignores them
Handing the spec to a frontend generator
ℹ️ Cross-origin requests are allowed
🚨 There is no browser-safe place to keep the session
ℹ️ Serving from your own origin remains the pattern Supero itself uses
- 1
Model your data
Upload your schemas, or describe the app and let Supero generate them. Every endpoint in the spec comes from a schema, so the spec is only as complete as your model.
- 2
Seed something to look at
Generate test data for the main types. A generator that receives an empty API invents placeholder content, and you will not be able to tell which screens are wired and which are decoration.
- 3
Decide where it will be served
Settle the origin and the proxy before generating anything. This decision determines whether the result can call the API at all, and it is expensive to retrofit.
- 4
Export the spec
API Docs → Export OpenAPI → JSON. Keep the file; you will re-export it whenever the schema changes.
- 5
Hand it over, with the corrections
Give the generator the spec, the base URL, and the list below. It will not read the x- extensions, so anything in them has to be said in the prompt.
- 6
Review against the list below
Every item is a failure that returns a success status. None of them look broken in a demo.
- 7
Re-export on every schema change
The spec is a snapshot, not a served URL. A frontend generated against an old spec keeps calling fields that no longer exist.
| What a generator assumes | What actually happens | Where it is documented |
|---|---|---|
| Filters as query parameters: GET ?status=active | Silently dropped. HTTP 200 with every row. Filtering is POST /query | Querying & Pagination |
| Records have an id field | record.id is undefined. The identifier is record.uuid, and timestamps are created_at | API Overview |
| A create response is the record | Create returns the uuid; the body is not guaranteed to carry back every field. Re-read the record | CRUD Endpoints |
| Create needs only the field values | Every create must be parented — fq_name, or parent_uuid + name, or parent_context + name. Otherwise 400 | CRUD Endpoints |
| name is a display label | name is mandatory, URL-safe and unique within its parent — distinct from a title or display field | Schema Reference |
| A field in the spec is writable by everyone | Fields a role may not write are stripped from the payload and the rest of the write succeeds — 200, and the value did not change | Access Policies |
| response.ok means it worked | Batch operations and service calls return 200 with per-record or per-call failures in the body | Errors & Status Codes |
⚠️ Authentication is yours to wire
⚠️ Signing a user up does not place them in a tenant
⚠️ A generated frontend is not a security boundary
ℹ️ Other paths to the same place
The playground
⚠️ It writes to real data
💡 Use it to confirm the filtering behaviour
SDK reference and generation
ℹ️ Generated package, not static typing
Next steps
The contract
API Overview & Conventions
One base URL, two route families, two auth schemes, one response envelope. Read it
The trap in the spec
Querying & Pagination
Why list filtering is a POST, and what the query operators are. Read it
Before real users
Going to Production
The seeded credentials, permissive defaults and demo affordances a generated app ships with. Read it
Compare the routes
Ways to Build
Generating the frontend elsewhere, against App Studio, MCP, the CLI and the raw API. Read it
On this page