API v1 preview

# List model file revisions

`GET /api/v1/models/{model_id}/revisions`

## Overview

Owner-only immutable source history, newest revision first. Use limit (1–100, default 20) and cursor. Returns data, has_more and next_cursor. Names and sizes remain current model settings. Missing or deleted models return 404 model_not_found.

Requires `models:read`.

[Model edits and revisions guide](https://ottomfg.com/docs/edit-models.md)

[Errors and retries](https://ottomfg.com/docs/errors.md)

Request

bash

```
# Requires models:read. Newest first; 20 file revisions per page by default.
curl --fail-with-body --max-time 30 \
  "${API_BASE_URL%/}/api/v1/models/$MODEL_ID/revisions" \
  --header "Authorization: Bearer $OTTOMFG_API_KEY"
# While has_more is true, repeat with ?limit=20&cursor=<next_cursor>.
# Use the returned cursor; do not assume it is a page number.
```

Set API_BASE_URL, OTTOMFG_API_KEY and MODEL_ID. Save the write body and GET ETag as MODEL_ETAG for If-Match. The replacement example also uses REVISION_REQUEST_KEY for retries. See the guide before sending. History reads need no body or key.

[Edit setup and recovery](https://ottomfg.com/docs/edit-models.md)

## Parameters

`model_id` path · required

Immutable model ID: MD- followed by eight uppercase Crockford Base32 characters. Use this same ID in the website, URLs and API; pass it unchanged.

string

`limit` query · optional

Maximum number of results.

integer

`cursor` query · optional

Opaque next_cursor from the previous page. Keep the same account, resource, filters and limit.

string

## Responses

Revision page.

200 response

JSON

```
{
  "data": [
    {
      "number": 2,
      "label": "2",
      "source": {
        "file_id": "file_7c82bd3e319b4bb099310d54a761879e"
      },
      "filename": "figurine-v2.zip",
      "created_at": "2026-09-30T00:01:00.000000Z",
      "current": false,
      "repairs": [
        {
          "repair": 1,
          "label": "2.1",
          "source": {
            "file_id": "file_8c82bd3e319b4bb099310d54a761879e"
          },
          "filename": "figurine-v2-repaired.zip",
          "created_at": "2026-10-03T09:00:00.000000Z",
          "current": true
        }
      ]
    },
    {
      "number": 1,
      "label": "1",
      "source": {
        "file_id": "file_6c82bd3e319b4bb099310d54a761879e"
      },
      "filename": "figurine.zip",
      "created_at": "2026-09-18T18:00:00.000000Z",
      "current": false,
      "repairs": []
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

`data` array · required

**data item fields**

`number` integer · required

Minimum: 1

`source` object · required

Reference to an uploaded geometry file and its supporting assets. One file can back multiple models in the same account. Set print size explicitly using longest_dimension_mm.

**source fields**

`file_id` string · required

Unique, server-generated file ID. Treat it as an opaque reference.

Min length: 37 · Max length: 37

`filename` string · required

`created_at` string (date-time) · required

`current` boolean · required

`label` string · required

`repairs` array · required

Published model repairs of this upload, newest first (1.1 repairs 1).

**repairs item fields**

`repair` integer · required

Minimum: 1

`label` string · required

`source` object · required

Reference to an uploaded geometry file and its supporting assets. One file can back multiple models in the same account. Set print size explicitly using longest_dimension_mm.

**source fields**

`file_id` string · required

Unique, server-generated file ID. Treat it as an opaque reference.

Min length: 37 · Max length: 37

`filename` string · required

`created_at` string (date-time) · required

`current` boolean · required

`has_more` boolean · required

`next_cursor` string | null · required

Opaque signed cursor; null on the last page.

**Response headers**

`X-Request-ID`

Request identifier for support. Send X-Request-ID with 8–64 ASCII letters, digits or hyphens to reuse that value; otherwise the server generates a UUID4 hex value. Include the returned X-Request-ID in support requests. Do not put secrets or account IDs in this value.

## Errors

| HTTP | Code | What to do |
| --- | --- | --- |
| 400 Bad Request | `invalid_argument` | A field, query parameter or header is invalid. Fix the field named in details, then send the request again. |
| 401 Unauthorized | `unauthenticated` | The API key is missing, invalid or revoked. Send a valid business API key in Authorization: Bearer. |
| 403 Forbidden | `permission_denied` | The key lacks the endpoint's scope, or payments lack spending consent. Check the scope listed on the endpoint. |
| 404 Not Found | `model_not_found` | No model with this ID exists in the account, or it was deleted. Check the ID. |
| 429 Too Many Requests | `resource_exhausted` | A rate or account limit was reached. Wait at least Retry-After seconds, then retry. |
| 500 Internal Server Error | `internal` | The server failed unexpectedly. Retry with backoff; contact support with X-Request-ID if it persists. |
| 503 Service Unavailable | `unavailable` | A required service is briefly unavailable. Retry with backoff, reusing the same Idempotency-Key. |

[Idempotent requests](https://ottomfg.com/docs/idempotency.md)

API v1 preview

Source: https://ottomfg.com/docs/list-model-revisions
