# Tool assemblies API

List and retrieve tool assembly models. Export the full library as a Fusion 360 package.

Source: https://support.toolingmetrics.com/en/api/reference/tool-assemblies/
Updated: 2026-10-29

Base path: `/v1/organizations/:organization_id/tool_assemblies`

## Endpoints

| Method | Path | Description |
|---|---|---|
| `GET` | `/tool_assemblies` | List tool assembly models ready for export |
| `GET` | `/tool_assemblies/:id` | Get a tool assembly model |
| `GET` | `/tool_library/:vendor` | Export library as a package for the given vendor |

Tool assemblies are read-only via the API — there is no `POST`, `PATCH`, or `DELETE` route for this resource. Create and manage them in the application under **Library → Tool Assemblies**.

## Tool assembly object

```json
{
  "id": 42,
  "name": "Face Mill Ø80 — ADKT",
  "designation": "TA-042",
  "status": "released",
  "created_at": "2025-01-10T08:00:00Z",
  "updated_at": "2025-06-01T10:00:00Z",
  "category": { "id": 3, "name": "Face Mills", "code": "FM" },
  "created_by": { "id": 7, "email": "user@example.com", "firstname": "Long", "lastname": "Han" },
  "cutting_data": [
    {
      "id": "b1e1f7a0-1c2d-4e3f-9a8b-7c6d5e4f3a2b",
      "material_id": 2,
      "name": "42CrMo4 — Face milling",
      "operation": "milling_face",
      "parameters": { "cutting_speed": 180, "feed_per_tooth": 0.12 },
      "unit_system": "metric",
      "created_at": "2025-01-10T08:00:00Z",
      "updated_at": "2025-01-10T08:00:00Z"
    }
  ]
}
```

Note the identifying field is `designation`, not `number`. `cutting_data[].parameters` is a free-form JSON object — its keys depend on `operation` and aren't fixed by the schema; treat it as an opaque bag of cutting parameters rather than a stable contract.

## List behavior

`GET /tool_assemblies` returns only tool assemblies that:

- Have a `status` in the organization's configured "tool library exportable" statuses — the "Central tool assemblies library" checkbox set (Draft/Released/Active/To archive/Archived) in **Admin Center → Organizations → Preferences**, an org-level preference (`organizations.preferences["engineering"]["tool_library_exportable"]`), not a fixed list of statuses. This is a separate axis from the tool assembly's own release-pipeline `status` — the org decides what counts as "CAM-usable" independent of what the state machine calls "released"
- Have `assets_builded: true` (the 3D/STEP assets have finished processing)

A tool assembly that exists and is visible in the app UI may not appear here if either condition isn't met yet.

`GET /tool_assemblies/:id`, unlike the list endpoint, has no such filter — it returns any of the organization's tool assemblies by id, subject to the normal authorization scoping (see [Authentication](https://support.toolingmetrics.com/en/api/authentication/)).

## Export library

```
GET /v1/organizations/:organization_id/tool_library/:vendor
```

`:vendor` is currently only implemented for `fusion` (Autodesk Fusion 360's tool library JSON format, built from the same status/assets filter as the list endpoint). Any other vendor value returns a `200 OK` with a `null` body rather than an error — check for an empty/null response rather than relying on an error status. To connect Autodesk Fusion, see [ToolingMetrics CAM Connect for Autodesk Fusion](https://support.toolingmetrics.com/en/integrations/cam-connect/autodesk-fusion/).

## Examples

```bash
# List all exportable tool assemblies
curl "https://api.toolingmetrics.com/v1/organizations/12/tool_assemblies" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Get a specific tool assembly with cutting data
curl "https://api.toolingmetrics.com/v1/organizations/12/tool_assemblies/42" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Export the full library as a Fusion 360 package
curl "https://api.toolingmetrics.com/v1/organizations/12/tool_library/fusion" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -o tool_library.json
```

```python
import requests
import json

BASE = "https://api.toolingmetrics.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_TOKEN"}

# Fetch all exportable tool assemblies and index them by designation for lookup
assemblies = requests.get(
    f"{BASE}/organizations/12/tool_assemblies",
    headers=HEADERS,
).json()

by_designation = {a["designation"]: a for a in assemblies}
ta = by_designation.get("TA-042")
if ta:
    print(f"{ta['name']} — status: {ta['status']}")

# Download the Fusion 360 library package
fusion_pkg = requests.get(
    f"{BASE}/organizations/12/tool_library/fusion",
    headers=HEADERS,
).json()

if fusion_pkg:
    with open("tool_library.json", "w") as f:
        json.dump(fusion_pkg, f, indent=2)
    print("Fusion 360 library exported.")
else:
    print("Nothing exported — no exportable tool assemblies, or the vendor value isn't supported.")
```

## Common errors

| Status | Cause |
|---|---|
| `401` | Not authorized to view tool assemblies in this organization, or no organization with this id |
| `404` | `GET /tool_assemblies/:id`: no tool assembly with this id in this organization. The body uses the singular `error` key, as for Parts, Projects and Machines (see [Errors](https://support.toolingmetrics.com/en/api/errors/)) |
| `422` | Export Library only: the export could not be built even without the tool assemblies it could not build, which it otherwise leaves out of the library, notifying their user; `errors` says why |
| `500` | Export Library only: the export failed unexpectedly; `errors` holds `"The tool library export failed"` |
