Developers

API reference

Base URL https://api.getcadcraft.com/v1. Every answer is JSON in one envelope: status, message, data and meta.request_id. Machine-readable: GET /v1/endpoints.

Account

Who the key acts as, and the workspaces it can reach.

The account and this key

GET/v1/account account:read

Who the key acts as, which licenses let the account hold keys, and the key's own settings.

Request: curl
curl "https://api.getcadcraft.com/v1/account" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/account');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/account",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/account", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "account": {
            "name": "Dana Reyes",
            "email": "dana@example.com",
            "email_verified": true,
            "licensed_by": [
                "team_cloud_plan_manager"
            ]
        },
        "key": {
            "id": "6f1c…",
            "name": "Seat sync",
            "prefix": "cck_live_AbCd1234…",
            "mode": "live",
            "scopes": [
                "account:read",
                "licenses:write"
            ],
            "workspace": null,
            "expires_at": null,
            "created_at": "2026-11-03T18:00:00Z",
            "last_used_at": "2026-11-03T18:05:00Z"
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Workspaces the account belongs to

GET/v1/account/workspaces account:read

The personal workspace and every team, with the account's role and what that role may do. A key limited to one workspace lists only that one.

Request: curl
curl "https://api.getcadcraft.com/v1/account/workspaces" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/account/workspaces');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/account/workspaces",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/account/workspaces", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "workspaces": [
            {
                "id": "b3d9f1c2-…",
                "name": "Reyes Studio",
                "kind": "team",
                "role": "owner",
                "members": 6,
                "can": {
                    "manage_members": true,
                    "manage_licenses": true,
                    "manage_billing": true
                },
                "seats": {
                    "total": 10,
                    "assigned": 7,
                    "in_force": 10
                }
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Licenses and seats

Count licenses and move seats: Team Cloud Plan seats and SuperCad Studio seats.

License counts

GET/v1/licenses/summary licenses:read

For each workspace: Team Cloud Plan seats (total, assigned, free, in force, renewal). Then the SuperCad Studio licenses the account manages (seats, confirmed, upgrades until).

ParameterInTypeAbout
workspacequerystringWorkspace uuid (from GET /v1/account/workspaces). Optional when the key is limited to one workspace.
Request: curl
curl "https://api.getcadcraft.com/v1/licenses/summary" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/summary');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/licenses/summary",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/summary", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "team_cloud_plan": [
            {
                "workspace": "b3d9f1c2-…",
                "name": "Reyes Studio",
                "seats": 10,
                "assigned": 7,
                "free": 3,
                "in_force": 10,
                "interval": "year",
                "period_end": "2027-03-01T00:00:00Z",
                "apps": [
                    "cadcraft",
                    "bimcraft"
                ]
            }
        ],
        "supercad": [
            {
                "id": "0d6a…",
                "number": "2640-0000-0012",
                "company": "Reyes Studio",
                "seats": 5,
                "confirmed": 4,
                "upgrades_until": "2029-11-01",
                "lifetime_upgrades": false
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Team Cloud Plan seats

GET/v1/licenses/seats licenses:read

Every seat of a team with who holds it. A free seat may be held for someone invited by email. Needs the owner or admin role.

ParameterInTypeAbout
workspace requiredquerystringWorkspace uuid (from GET /v1/account/workspaces). Can be left out when the key is limited to one workspace.
limitqueryinteger1–200, default 50.
cursorquerystringmeta.page.next from the previous page.
Request: curl
curl "https://api.getcadcraft.com/v1/licenses/seats?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/seats?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/licenses/seats?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/seats?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "seats": [
            {
                "id": "9a8b7c6d-…",
                "in_force": true,
                "assignee": {
                    "name": "Sam Lee",
                    "email": "sam@example.com"
                },
                "assigned_at": "2026-10-20T15:02:11Z",
                "held_for": null
            },
            {
                "id": "1b2c3d4e-…",
                "in_force": true,
                "assignee": null,
                "assigned_at": null,
                "held_for": "new.hire@example.com"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Assign a seat to a member

POST/v1/licenses/seats/{seat}/assign licenses:write

Gives this seat to a member of the team, by email. A member holds one seat per team, so any seat they held before is freed. To give a seat to someone who is not a member yet, use POST /v1/licenses/seats/give.

ParameterInTypeAbout
seat requiredpathstringSeat id from GET /v1/licenses/seats.
email requiredbodystringEmail of a team member.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/assign" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"email":"sam@example.com"}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/assign');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['email' => 'sam@example.com']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/assign",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"email":"sam@example.com"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/assign", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"email":"sam@example.com"}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "seat": {
            "id": "9a8b7c6d-…",
            "assignee": {
                "name": "Sam Lee",
                "email": "sam@example.com"
            }
        },
        "message": "Seat assigned to Sam Lee."
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}
Errors of this endpoint
  • not_member (400): Nobody in the team has that email. Use /give to invite them with a seat.

Try it in the console

Free a seat

POST/v1/licenses/seats/{seat}/unassign licenses:write

Takes the seat from whoever holds it. Their files stay in the team; they open them again once they hold a seat.

ParameterInTypeAbout
seat requiredpathstringSeat id.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/unassign" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/unassign');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/unassign",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/seats/9a8b7c6d-…/unassign", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "seat": {
            "id": "9a8b7c6d-…",
            "assignee": null
        },
        "message": "Seat unassigned."
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Give a free seat to an email address

POST/v1/licenses/seats/give licenses:write

A member with that address gets a free seat now (mode assigned). Anyone else is invited to the team and a free seat is held for them until they accept (mode invited; inviting needs owner or admin). No free seat → 400.

ParameterInTypeAbout
workspace requiredbodystringWorkspace uuid (from GET /v1/account/workspaces). Can be left out when the key is limited to one workspace.
email requiredbodystringWho gets the seat.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/licenses/seats/give" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"workspace":"b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f","email":"new.hire@example.com"}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/seats/give');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['workspace' => 'b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f', 'email' => 'new.hire@example.com']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/licenses/seats/give",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"workspace":"b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f","email":"new.hire@example.com"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/seats/give", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"workspace":"b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f","email":"new.hire@example.com"}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "mode": "invited",
        "message": "Invitation sent to new.hire@example.com. A seat is held for them until they accept."
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

SuperCad Studio seats

GET/v1/licenses/supercad/{license}/seats licenses:read

The seats of a SuperCad Studio license the account manages: who each is for, whether they confirmed, and when the seat may next change hands.

ParameterInTypeAbout
license requiredpathstringLicense id from GET /v1/licenses/summary (supercad[].id).
Request: curl
curl "https://api.getcadcraft.com/v1/licenses/supercad/0d6a…/seats" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/supercad/0d6a…/seats');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/licenses/supercad/0d6a…/seats",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/supercad/0d6a…/seats", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "seats": [
            {
                "id": "5e4d…",
                "seat_no": 1,
                "number": "2640-0000-0012-01",
                "assignee": {
                    "name": "Sam Lee",
                    "email": "sam@example.com"
                },
                "confirmed_at": "2026-11-02T10:00:00Z",
                "next_change_at": "2026-12-02T10:00:00Z"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Move a SuperCad Studio seat

POST/v1/licenses/supercad/seats/{seat}/change licenses:write

The same rule as on the website: a seat may change hands once in a while. Inside that time, give a reason and the change waits for our approval (applied false). An empty email frees the seat, which is always allowed.

ParameterInTypeAbout
seat requiredpathstringSeat id.
email requiredbodystringNew holder, or "" to free the seat.
namebodystringNew holder's name.
reasonbodystringNeeded only for a change inside the waiting time.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/licenses/supercad/seats/5e4d…/change" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"email":"pat@example.com","name":"Pat Kim","reason":"Sam left the firm."}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/licenses/supercad/seats/5e4d…/change');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['email' => 'pat@example.com', 'name' => 'Pat Kim', 'reason' => 'Sam left the firm.']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/licenses/supercad/seats/5e4d…/change",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"email":"pat@example.com","name":"Pat Kim","reason":"Sam left the firm."},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/licenses/supercad/seats/5e4d…/change", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"email":"pat@example.com","name":"Pat Kim","reason":"Sam left the firm."}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "applied": true,
        "message": "Seat 1 is now for pat@example.com. We emailed them a link to confirm it."
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}
Errors of this endpoint
  • needs_reason (400): The seat changed recently; send a reason to ask for approval.

Try it in the console

Education

For educators in the Student Program: enroll a class, edit students, list them.

Your students

GET/v1/education/students education:read Coming soon

Students you enrolled, newest first. Needs an active educator place in the Student Program.

ParameterInTypeAbout
statusquerystringinvited, active, stale, expired or ended.
grad_yearqueryintegerOnly this graduation year.
qquerystringPart of a name or email.
limitqueryinteger1–200, default 50.
cursorquerystringmeta.page.next from the previous page.
Request: curl
curl "https://api.getcadcraft.com/v1/education/students" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/education/students",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "students": [
            {
                "id": "7c1e…",
                "name": "Sam Lee",
                "email": "sam@school.edu",
                "status": "active",
                "school": "Lakeside College",
                "grad_year": 2028,
                "study": "Architecture",
                "enrolled_at": "2026-11-03T18:00:00Z",
                "confirmed_at": "2026-11-04T09:12:00Z"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}
Errors of this endpoint
  • not_educator (403): The account has no active educator place in the Student Program.

One student

GET/v1/education/students/{student} education:read Coming soon

One student you enrolled, with its history (invited, confirmed, checks).

ParameterInTypeAbout
student requiredpathstringStudent id from GET /v1/education/students.
Request: curl
curl "https://api.getcadcraft.com/v1/education/students/7c1e…" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students/7c1e…');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/education/students/7c1e…",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students/7c1e…", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "student": {
            "id": "7c1e…",
            "status": "active",
            "events": [
                {
                    "event": "invited",
                    "at": "2026-11-03T18:00:00Z"
                }
            ]
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Enroll a list of students

POST/v1/education/students education:write Coming soon

Up to 200 students a call. Each new student gets one email from CadCraft and becomes active when they click it (no review by us). Rows are judged one by one: the call answers 200 with a result per row. Send an Idempotency-Key so a retried call adds nobody twice.

ParameterInTypeAbout
students requiredbodyarrayList of {name, email, grad_year?, study?}.
schoolbodystringDefaults to your own school.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/education/students" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"students":[{"name":"Sam Lee","email":"sam@school.edu","grad_year":2028,"study":"Architecture"}],"school":"Lakeside College"}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['students' => [['name' => 'Sam Lee', 'email' => 'sam@school.edu', 'grad_year' => 2028, 'study' => 'Architecture']], 'school' => 'Lakeside College']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/education/students",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"students":[{"name":"Sam Lee","email":"sam@school.edu","grad_year":2028,"study":"Architecture"}],"school":"Lakeside College"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"students":[{"name":"Sam Lee","email":"sam@school.edu","grad_year":2028,"study":"Architecture"}],"school":"Lakeside College"}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "results": [
            {
                "email": "sam@school.edu",
                "result": "invited",
                "student": "7c1e…"
            },
            {
                "email": "kim@school.edu",
                "result": "already_active",
                "student": "2f3a…"
            }
        ],
        "counts": {
            "invited": 1,
            "already_active": 1,
            "already_invited": 0,
            "blocked": 0,
            "invalid": 0
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}
Errors of this endpoint
  • not_educator (403): The account has no active educator place in the Student Program.

Edit a student

PATCH/v1/education/students/{student} education:write Coming soon

Change name, graduation year or study. The email can change only before the student has confirmed; that sends a new invite and voids the old one.

ParameterInTypeAbout
student requiredpathstringStudent id from GET /v1/education/students.
namebodystring
emailbodystringOnly while invited.
grad_yearbodyinteger
studybodystring
Request: curl
curl -X PATCH "https://api.getcadcraft.com/v1/education/students/7c1e…" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Sam Lee","email":"sam.lee@school.edu","grad_year":2029,"study":"Civil engineering"}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students/7c1e…');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['name' => 'Sam Lee', 'email' => 'sam.lee@school.edu', 'grad_year' => 2029, 'study' => 'Civil engineering']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.patch(
    "https://api.getcadcraft.com/v1/education/students/7c1e…",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"name":"Sam Lee","email":"sam.lee@school.edu","grad_year":2029,"study":"Civil engineering"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students/7c1e…", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"name":"Sam Lee","email":"sam.lee@school.edu","grad_year":2029,"study":"Civil engineering"}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "student": {
            "id": "7c1e…",
            "grad_year": 2029
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Resend the invite

POST/v1/education/students/{student}/resend education:write Coming soon

Sends the invite email again (3 a day per student).

ParameterInTypeAbout
student requiredpathstringStudent id from GET /v1/education/students.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/education/students/7c1e…/resend" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students/7c1e…/resend');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/education/students/7c1e…/resend",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students/7c1e…/resend", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "message": "Invite sent again to sam@school.edu."
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

End a student's place

POST/v1/education/students/{student}/end education:write Coming soon

The student keeps the versions they already have (like a lapsed check); new versions stop.

ParameterInTypeAbout
student requiredpathstringStudent id from GET /v1/education/students.
reason requiredbodystringWhy (kept on the record).
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/education/students/7c1e…/end" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"reason":"Left the course."}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/education/students/7c1e…/end');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['reason' => 'Left the course.']),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/education/students/7c1e…/end",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"reason":"Left the course."},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/education/students/7c1e…/end", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"reason":"Left the course."}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "student": {
            "id": "7c1e…",
            "status": "ended"
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Library

Upload blocks (DWG, DXF or library files) and add them to the Library or a team library.

Your library items

GET/v1/library/items library:read Coming soon

Items the account made, newest first.

ParameterInTypeAbout
kindquerystringblock, material, …
limitqueryinteger1–200, default 50.
cursorquerystringmeta.page.next from the previous page.
Request: curl
curl "https://api.getcadcraft.com/v1/library/items" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/library/items');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/library/items",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/library/items", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "items": [
            {
                "id": "3c2b…",
                "name": "Door 900",
                "kind": "block",
                "visibility": "public",
                "review": "published"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Upload blocks

POST/v1/library/uploads library:write Coming soon

multipart/form-data with a DWG, DXF or library .json file (up to 50 MB). Answers with the blocks found in it; then commit the ones to add.

ParameterInTypeAbout
file requiredfilefileThe file.
workspacebodystringWorkspace uuid (from GET /v1/account/workspaces). Optional when the key is limited to one workspace.
unitsbodystringmm, cm, m, in or ft when the file does not say.
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/library/uploads" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -F "file=@doors.dwg" \
  -F "workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f" \
  -F "units=mm"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/library/uploads');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
    CURLOPT_POSTFIELDS => ['file' => new CURLFile('doors.dwg')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/library/uploads",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    files={"file": open("doors.dwg", "rb")},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/library/uploads", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
  body: (() => { const f = new FormData(); f.append("file", new Blob([require("fs").readFileSync("doors.dwg")]), "doors.dwg"); return f; })(),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "upload": {
            "id": "8d7c…",
            "status": "ready",
            "candidates": [
                {
                    "key": "b1",
                    "name": "DOOR-900",
                    "kind": "block"
                }
            ]
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Add uploaded blocks

POST/v1/library/uploads/{upload}/commit library:write Coming soon

Choose blocks from an upload and add them with a category, tags and visibility. Public items are reviewed like any website upload.

ParameterInTypeAbout
upload requiredpathstringUpload id.
choose requiredbodyarrayCandidate keys, or ["all"].
meta requiredbodyobject{category, tags[], visibility, license, description}
Request: curl
curl -X POST "https://api.getcadcraft.com/v1/library/uploads/8d7c…/commit" \
  -H "Authorization: Bearer $CADCRAFT_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"choose":["all"],"meta":{"category":"openings/doors","visibility":"private"}}'
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/library/uploads/8d7c…/commit');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['choose' => ['all'], 'meta' => ['category' => 'openings/doors', 'visibility' => 'private']]),
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.post(
    "https://api.getcadcraft.com/v1/library/uploads/8d7c…/commit",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
    json={"choose":["all"],"meta":{"category":"openings/doors","visibility":"private"}},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/library/uploads/8d7c…/commit", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({"choose":["all"],"meta":{"category":"openings/doors","visibility":"private"}}),
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "items": [
            {
                "id": "3c2b…",
                "name": "DOOR-900",
                "review": "private"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Cloud storage

How much cloud space a workspace has and uses.

Cloud storage use

GET/v1/storage/usage storage:read

A workspace's shared pool (seats in force × 1 TB, plus the storage plan and disk packages) and what its files use (every version counts). Also the account's own folder.

ParameterInTypeAbout
workspace requiredquerystringWorkspace uuid (from GET /v1/account/workspaces). Can be left out when the key is limited to one workspace.
Request: curl
curl "https://api.getcadcraft.com/v1/storage/usage?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/storage/usage?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/storage/usage?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/storage/usage?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "workspace": {
            "quota_bytes": 10000000000000,
            "used_bytes": 812345678901,
            "free_bytes": 9187654321099,
            "over": false,
            "seats_in_force": 10,
            "packs": [
                {
                    "tb": 10,
                    "period_end": "2027-03-01T00:00:00Z"
                }
            ]
        },
        "account_folder": {
            "quota_bytes": 1000000000000,
            "used_bytes": 51234567
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Projects

Cloud projects and the drawings in them: names, apps, versions and sizes.

Projects

GET/v1/projects projects:read

Cloud projects in a workspace that the account may open.

ParameterInTypeAbout
workspace requiredquerystringWorkspace uuid (from GET /v1/account/workspaces). Can be left out when the key is limited to one workspace.
limitqueryinteger1–200, default 50.
cursorquerystringmeta.page.next from the previous page.
Request: curl
curl "https://api.getcadcraft.com/v1/projects?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/projects?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/projects?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/projects?workspace=b3d9f1c2-1a2b-4c3d-8e9f-0a1b2c3d4e5f", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "projects": [
            {
                "id": "4a5b…",
                "name": "Harbor Library",
                "visibility": "organization",
                "drawings": 14,
                "updated_at": "2026-11-02T16:40:00Z"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

One project

GET/v1/projects/{project} projects:read

A project with its members.

ParameterInTypeAbout
project requiredpathstringProject id from GET /v1/projects.
Request: curl
curl "https://api.getcadcraft.com/v1/projects/4a5b…" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/projects/4a5b…');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/projects/4a5b…",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/projects/4a5b…", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "project": {
            "id": "4a5b…",
            "name": "Harbor Library",
            "members": [
                {
                    "name": "Sam Lee",
                    "email": "sam@example.com",
                    "role": "editor"
                }
            ]
        }
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Drawings in a project

GET/v1/projects/{project}/drawings projects:read

Names, apps, latest version and size. The files themselves open only in the apps.

ParameterInTypeAbout
project requiredpathstringProject id from GET /v1/projects.
limitqueryinteger1–200, default 50.
cursorquerystringmeta.page.next from the previous page.
Request: curl
curl "https://api.getcadcraft.com/v1/projects/4a5b…/drawings" \
  -H "Authorization: Bearer $CADCRAFT_KEY"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/projects/4a5b…/drawings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('CADCRAFT_KEY')],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/projects/4a5b…/drawings",
    headers={"Authorization": f"Bearer {os.environ['CADCRAFT_KEY']}"},
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/projects/4a5b…/drawings", {
  headers: { Authorization: `Bearer ${process.env.CADCRAFT_KEY}` },
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "drawings": [
            {
                "id": "6e7f…",
                "name": "Level 1 plan",
                "app": "cadcraft",
                "version": 12,
                "size_bytes": 2345678,
                "saved_at": "2026-11-02T16:40:00Z"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Meta

No key needed: is the API up, and what can it do.

Is the API up

GET/v1/health no key

Answers without a key. Use it for uptime checks.

Request: curl
curl "https://api.getcadcraft.com/v1/health"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/health');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/health",
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/health", {
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "ok": true,
        "version": "1",
        "time": "2026-11-03T18:00:00Z"
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console

Every endpoint, machine-readable

GET/v1/endpoints no key

This catalogue as JSON: method, path, scope, parameters and status of every endpoint.

Request: curl
curl "https://api.getcadcraft.com/v1/endpoints"
Request: PHP
<?php
$ch = curl_init('https://api.getcadcraft.com/v1/endpoints');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
print_r($res['data']);
Request: Python
import os, requests

r = requests.get(
    "https://api.getcadcraft.com/v1/endpoints",
)
print(r.json()["data"])
Request: Node.js
const res = await fetch("https://api.getcadcraft.com/v1/endpoints", {
});
console.log((await res.json()).data);
Example response
{
    "status": "success",
    "message": "",
    "data": {
        "version": "1",
        "endpoints": [
            {
                "id": "account.me",
                "method": "GET",
                "path": "/v1/account",
                "scope": "account:read",
                "status": "live"
            }
        ]
    },
    "meta": {
        "request_id": "3f2a9c1e-5b7d-4e8f-a1b2-c3d4e5f6a7b8",
        "mode": "live"
    }
}

Try it in the console