# Changelog

History of API changes, deprecations, and breaking changes.

Source: https://support.toolingmetrics.com/en/api/changelog/
Updated: 2026-10-29

## Deprecation policy

Breaking changes are announced a minimum of **60 days** before they take effect. A breaking change is any change that requires existing integrations to update their code — removing a field, changing a field's type, removing an endpoint, or changing authentication behavior.

Non-breaking changes (adding new fields, adding new endpoints, adding new optional parameters) may be made at any time without notice.

---

## 2026

### October 2026

**Fixed** — Approving a project (`PATCH` of a released project with `"status": "approved"`) now needs the key's user to be allowed to change items as well as projects, as approving in the web app does. The approval copies the products of the project's tool assemblies into items, created as the project's creator, so the key's user must be allowed to create such items and to update the existing ones. A key without that right answers `401 Unauthorized` with `"You are not authorized to perform this action"`, and the project stays released with no item created, where it was approved and the items created. As it closes a write the web app refuses, this takes effect without the 60-day notice.

**Fixed** — Creating or updating a part (`POST` or `PATCH` of a part) with a `drawing` now stores that drawing as the part's 2D drawing. The drawing was read from the `picture` field: a request that sent both stored the picture's bytes as the drawing, and one that sent `drawing` alone failed. No field, type or response changes, so integrations that send only `picture` or `model` are not affected.

**Fixed** — Creating or updating a part (`POST` or `PATCH` of a part) with the `material_id` of another organization's material now answers `422 Unprocessable Entity` with the error on `material_id`, where it saved the part with that material. A part takes its organization's own material or a shared one, as the web app's part form now requires too.

**Fixed** — A request for one record (`GET`, `PATCH` or `DELETE` of a project, part or machine, a machine's `tool_crib`, and `GET /tool_assemblies/:id`) now looks the record up only in the organization its URL names. A record of another organization answers `404 Not Found`, with the same body as an id that doesn't exist, as these docs already said; it was read, changed or deleted when the key's user could do so in the record's own organization. The Fusion plugin always names the record's own organization, so it is not affected. As it brings the API in line with its documentation and closes reading and writing across organizations through another organization's address, this takes effect without the 60-day notice.

**Fixed** — `GET /tool_assemblies/:id` now answers a tool assembly id that doesn't exist with `404 Not Found` and the singular `error` key, as Parts, Projects and Machines do, where it answered `500 Internal Server Error`.

**Fixed** — A key no longer reads or changes anything of an organization in which its user is not approved: a user who asked to join it and waits for an admin, who was invited and has not accepted yet, or whom an admin suspended there. Whatever the user's groups there grant, every endpoint of that organization (projects, parts, machines, materials and tool assemblies) answers `401 Unauthorized` with `"You are not authorized to perform this action"`, as for any other action the key's bearer is not authorized for; the web app already sends such a user to its access request page. The Fusion tool library export (`GET /tool_library/fusion`) now answers the same `401 Unauthorized` to such a key, and to any other key it refuses, such as one whose user may not list the organization's tool assemblies, where it answered `200 OK` with an `error` object in place of the library. It answers the same `401`, with the same body, to an organization id that does not exist, and so does every other endpoint of an organization: a list, a search or a create answered `404 Not Found` there, and an endpoint that names a record by id now answers an organization the key cannot reach with this `401` before it looks the record up. No endpoint tells which organization ids exist any more. A tool assembly the export cannot build is left out of the library, as before, and its user is notified; when the export cannot be built even without those assemblies, it answers `422 Unprocessable Entity` with the reason in `errors`, and any other failure answers `500 Internal Server Error` with `"The tool library export failed"`, where both answered `200 OK` with an `error` object too. `200 OK` now carries a library, or `null` for a vendor the export does not support or an organization with nothing to export. As it closes access the web app already refused, no longer tells which organization ids exist, and makes the export answer its refusals and failures with an error status, this takes effect without the 60-day notice. The key of an active member of the organization, or of the owner of its site, answers as before, and `GET /organizations` already listed only the organizations the key's user is an active member of.

**Fixed** — The Fusion tool library export (`GET /tool_library/fusion`) now writes a thread tool's `minimum-thread-pitch` and `maximum-thread-pitch` as numbers, the type Fusion's tool library format gives them, instead of strings. As it brings the export in line with Fusion's format, this is a fix rather than a breaking change, and it takes effect without the 60-day notice. A thread mill or threading insert that gives its pitch range only in threads per inch now carries both fields as well, in mm. A thread mill or threading insert whose own pitch range has only one usable end no longer exports that end alone, as a string: it takes its range whole from its threads per inch, or writes neither field.

**Fixed** — In the same export, a tap's `type` now names its thread's hand: `tap left hand` for a left-hand tap and `tap right hand` for any other, a tap without a hand code included. It was plain `tap` for every tap but a right-hand one.

**Fixed** — In the same export, a tool whose data the export cannot read no longer fails the whole export, which answered with an error instead of the library. A property that is not a finite number, such as `1e400`, or that is written with a decimal comma, such as `11,5`, is left out of its tool, which is exported without it; a tooth or flute count (`NT`, `NOF`) that is not a number is left out too, where it was written as 0. A thread pitch so small that its threads per inch would be infinite, such as 1e-320 mm, counts as unusable, as a pitch of 0 does: the tool takes its `TP` from its threads per inch, or is exported without one. A tool the export cannot build is left out of the library, and the rest of the library is exported: a tool whose assembly does not have exactly one tool item; a turning holder whose insert shape has no included angle; a turning, grooving or threading holder that does not hold exactly one insert; and a tool whose data raises an error the export did not foresee, which is reported to us. The user the export runs for, the API key's user, gets a notification in ToolingMetrics naming each tool left out, and each property, preset or insert dropped from a tool, with the reason. A turning insert without a readable corner radius now carries `RE` 0, as a grooving insert's and a rotating tool's do.

**Added** — In the same export, the cutting data presets carry more of the feeds Fusion's tool library format requires. A spot drill's, center drill's or countersink's preset carries `use-feed-per-revolution` (false) and `v_f_retract` beside its `v_f_plunge`, and every milling preset, and a boring bar's, counterbore's, spot drill's, center drill's or countersink's, carries `v_f_transition`, equal to its `v_f`. A preset's `f_n` is now the exact feed per revolution, the unrounded `v_f` over the unrounded `n`, where it was the rounded `v_f` over the rounded `n`: 0.2 mm instead of 0.200126 for a two-flute drill at 0.1 mm per tooth. No field is removed or changes its type.

**Added** — In the same export, every milling preset carries the `ramp-angle` Fusion's tool library format requires of it: 2 degrees, as in Autodesk's sample library, since no cutting data gives a ramp angle of its own. A threading insert, or a thread mill whose class lists the profile angle (PNA), that gives its own PNA now carries it as `thread-profile-angle`, which was written only when derived from the flank angles or thread form, and then even in place of its own. No field is removed or changes its type.

## 2024

### December 2024

**Added** — API Tokens are now created and revoked from **Your profile → API Tokens**, tied to your own account rather than a separate personal-access-token flow.

### September 2024

**Added** — `GET /machines/:id/tool_crib` endpoint returning tools currently loaded at a machine, grouped by tool assembly.

**Added** — `tool_assemblies` responses now include a nested `cutting_data` array.

### March 2024

**Initial release** — v1 API with endpoints for organizations, machines, parts, projects, and tool assemblies.
