OpenAI API OpenAPI spec score
Octri scored the public spec at https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml for what a code generator can do with it. This is a reading of the document, not a grade of the API.
360 operations · 2095 models · 40 tags · OpenAPI 3.1.0
Scored 16 October 2026 · fingerprint c8669635a97d… · spec version 2.3.0 · server api.openai.com
Document last changed 16 October 2026.
Where the points went
Every rule, heaviest first, with what it cost this document, how much of the surface it touched, and where. The rule id links to what that rule checks.
| Rule | Weight | Result | Surface | Locations |
|---|---|---|---|---|
| Successful responses declare a schemaresponse-schema | 2.0 | 0.4 lost | 9 of 360 operations | POST /live/sessions/{session_id}/acceptPOST /live/sessions/{session_id}/hangupPOST /live/sessions/{session_id}/referand 6 more |
| Shared models live in components and are $ref'dshared-schemas-referenced | 2.0 | 0.4 lost | 1 of 360 operations | deleted, id, object |
| Generated public names do not collideoperation-id-unique | 2.0 | Clean | 360 operations clean | Nothing found |
| Every path placeholder has a parameterpath-parameters-declared | 1.5 | Clean | 360 operations clean | Nothing found |
| Every operation declares an operationIdoperation-id-present | 1.0 | Clean | 360 operations clean | Nothing found |
| operationIds read as method namesoperation-id-naming | 1.0 | 0.4 lost | 89 of 360 operations | POST /assistants/{assistant_id}POST /batches/{batch_id}/cancelPOST /evals/{eval_id}/runs/{run_id}/canceland 86 more |
| Operations carry a summary or descriptionoperation-documented | 1.0 | Clean | 360 operations clean | Nothing found |
| Request bodies are documentedrequest-body-documented | 1.0 | 0.2 lost | 15 of 360 operations | POST /audio/voicesPOST /chat/completionsPOST /chat/completions/{completion_id}and 12 more |
| Failure responses are declarederror-responses | 1.0 | 0.2 lost | 4 of 360 operations | POST /realtime/callsPOST /realtime/sessionsPOST /realtime/transcription_sessionsand 1 more |
| Operations are taggedoperation-tagged | 1.0 | 0.3 lost | 43 of 360 operations | GET /containersPOST /containersGET /containers/{container_id}and 40 more |
| No duplicate or equivalent pathsduplicate-paths | 1.0 | Clean | 230 paths clean | Nothing found |
| Authentication is describedsecurity-declared | 1.0 | Clean | Declared | Nothing found |
| Parameters explain their purposeparameters-documented | 0.75 | 0.18 lost | 20 of 360 operations | GET /containers/{container_id}#path:container_idPOST /containers/{container_id}/files#path:container_idGET /containers/{container_id}/files#path:container_idand 17 more |
| A server URL is declaredserver-url | 0.5 | Clean | Declared | Nothing found |
Packaging, outside the score
This generates one package with 360 operations and 2095 models. Frontend consumers download all of it to call any of it, and low-spec machines pay for it in IDE and build time. The largest groups are `Agents` (37), `Projects` (24), `Assistants` (23), and each is a candidate for its own project.
What 7.8 means for an SDK
A mixed reading, and the three rules that decide most of it.
The client compiles and works. Callers will feel the soft spots: a few methods that return an untyped value, arguments with no hint on them, a namespace or two named after a path segment rather than a resource.
Three rules carry six of the 10 points between them. On this document they took 0.84.
−0.4
Successful responses declare a schema
9 of 360 operations
−0.4
Shared models live in components and are $ref'd
1 of 360 operations
Clean
Generated public names do not collide
360 operations clean
What to change first
The 6 heaviest of 7 rules that deducted.
0.4 lost
Successful responses declare a schema
Give the success response a schema, or a $ref to one in components. A 204 needs nothing.
Inside Octri this one has a one-click fix.
0.4 lost
Shared models live in components and are $ref'd
Move the shape into components.schemas once and $ref it from each operation that returns or accepts it.
0.4 lost
operationIds read as method names
Name the id for the action, not the route. The audit suggests one per operation and can apply it.
Inside Octri this one has a one-click fix.
0.2 lost
Request bodies are documented
Describe the body, or the fields inside it. Field-level prose is the one that reaches the SDK's arguments.
Inside Octri this one has a one-click fix.
0.2 lost
Failure responses are declared
Declare the failures you actually return, or one `default` response carrying your error shape.
0.3 lost
Operations are tagged
Tag every operation. Tags are what decide whether a caller writes `client.invoices.list()` or `client.misc.list()`.
Inside Octri this one has a one-click fix.
Where to go next
- Score your own spec The same fourteen rules, on any public URL. No account, and the spec is not kept.
- OpenAPI to a TypeScript SDK Published to npm, with the type definitions generated from your spec.
- OpenAPI to an MCP server The same endpoints, as tools an agent can call.
- How SDK Studio shapes a client Naming, hooks and packaging, decided before ten runtimes are built.
The spec at raw.githubusercontent.com is public. Octri keeps the `info` block, the score, and up to five sample finding locations per rule. The document itself is not stored and is not served from here. The audit predicts what an SDK generator can do with the description; it is not a security review, an uptime measurement or a critique of the API’s design. This page is not affiliated with OpenAI API or OpenAI Support.