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.

7.6/ 10
Mixed

360 operations · 2094 models · 40 tags · OpenAPI 3.1.0

Scored 21 October 2026 · fingerprint 84603367261c… · spec version 2.3.0 · server api.openai.com

Document last changed 21 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.

RuleWeightResultSurfaceLocations
Successful responses declare a schemaresponse-schema2.00.4 lost9 of 360 operationsPOST /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-referenced2.00.4 lost1 of 360 operationsdeleted, id, object
Generated public names do not collideoperation-id-unique2.00.4 lost5 of 360 operationsGET /projects/{project_id}/rolesPOST /projects/{project_id}/rolesGET /projects/{project_id}/roles/{role_id}and 2 more
Every path placeholder has a parameterpath-parameters-declared1.5Clean360 operations cleanNothing found
Every operation declares an operationIdoperation-id-present1.0Clean360 operations cleanNothing found
operationIds read as method namesoperation-id-naming1.00.3 lost22 of 360 operationsGET /organization/admin_api_keysPOST /organization/admin_api_keysGET /organization/admin_api_keys/{key_id}and 19 more
Operations carry a summary or descriptionoperation-documented1.0Clean360 operations cleanNothing found
Request bodies are documentedrequest-body-documented1.00.2 lost14 of 360 operationsPOST /chat/completionsPOST /chat/completions/{completion_id}POST /responsesand 11 more
Failure responses are declarederror-responses1.00.2 lost4 of 360 operationsPOST /realtime/callsPOST /realtime/sessionsPOST /realtime/transcription_sessionsand 1 more
Operations are taggedoperation-tagged1.00.3 lost43 of 360 operationsGET /containersPOST /containersGET /containers/{container_id}and 40 more
No duplicate or equivalent pathsduplicate-paths1.0Clean230 paths cleanNothing found
Authentication is describedsecurity-declared1.0CleanDeclaredNothing found
Parameters explain their purposeparameters-documented0.750.18 lost20 of 360 operationsGET /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-url0.5CleanDeclaredNothing found

Packaging, outside the score

This generates one package with 360 operations and 2094 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.6 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 1.26.

−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

−0.4

Generated public names do not collide

5 of 360 operations

What to change first

The 6 heaviest of 8 rules that deducted.

  1. 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.

  2. 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.

  3. 0.4 lost

    Generated public names do not collide

    Rename the authored operationId, or set that operation's SDK namespace. The audit proposes one and can apply it; your tags and the wire operation are left alone.

    Inside Octri this one has a one-click fix.

  4. 0.3 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.

  5. 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.

  6. 0.2 lost

    Failure responses are declared

    Declare the failures you actually return, or one `default` response carrying your error shape.

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.