Developers

Guides

How the CadCraft API works. It is for your servers and scripts: keys must never be put in a web page or an app you hand out.

Keys

Make keys on your account's Developers page. A key is shown once; we keep only a fingerprint. Send it on every call:

Authorization: Bearer cck_live_…

Keys come with a CadCraft license: a Team Cloud Plan seat (or managing a team on the plan), a cloud storage plan, an owned license, a SuperCad Studio license, or an active place in the Student Program. If the license ends, the account's keys pause (not_licensed) and start working again when it comes back.

A key acts as your account, and can never do more than your account can on this website. On top of that you can limit each key: its scopes, one workspace, an expiry date, and (live keys) the addresses it may be used from. Roll gives a new value while the old one keeps working for 24 hours; Revoke stops it at once.

Scopes

Each endpoint needs one scope. A :write scope includes its :read.

ScopeLets the key
account:readSee the account and its workspaces
licenses:readSee license counts and seat lists
licenses:writeAssign, unassign and give seats; request SuperCad Studio seat changes
education:readSee the students you enrolled
education:writeEnroll, edit and end students
library:readSee your library items and uploads
library:writeUpload library blocks and add them
storage:readSee cloud storage use
projects:readSee projects and the drawings in them (names and sizes, never the files)

Workspaces

Seats, storage and projects belong to a workspace: your personal one or a team. Get their ids from GET /v1/account/workspaces and pass workspace=<id>. A key limited to one workspace may leave it out. Moving seats needs the owner or admin role in that team, the same as on the website.

Answers

Every answer is JSON in the same envelope, with X-Request-Id also in the headers. Quote the request id if you write to us.

{
    "status": "success",
    "message": "Seat assigned to Sam Lee.",
    "data": {
        "seat": {
            "id": "9a8b7c6d-\u2026"
        }
    },
    "meta": {
        "request_id": "3f2a\u2026",
        "mode": "live"
    }
}
{
    "status": "error",
    "message": "Check the highlighted fields.",
    "code": "invalid",
    "errors": {
        "email": "Required."
    },
    "meta": {
        "request_id": "3f2a\u2026",
        "mode": "live"
    }
}

Ids are opaque strings. Times are UTC in ISO 8601 (2026-11-03T18:00:00Z). Sizes are bytes. Send bodies as JSON (Content-Type: application/json); uploads as multipart/form-data.

Errors

Check the HTTP status, then code. Messages are for people and may change; codes don't.

CodeHTTPMeans
invalid400A parameter is missing or wrong; errors{} names each field.
invalid_key401No key, or not a key we know.
key_revoked401The key was revoked.
key_expired401The key has expired.
not_licensed401The account no longer holds a CadCraft license, so its keys are paused.
insufficient_scope403The key was not given the scope this endpoint needs.
forbidden403The account may not do this (for example, it is not a team owner or admin).
wrong_workspace403The key is limited to another workspace.
ip_not_allowed403The call came from an address the key does not allow.
not_found404No such thing, or the account cannot see it.
method_not_allowed405That path takes a different method.
conflict409The thing is not in a state where this can happen.
idempotency_mismatch409This Idempotency-Key was used with a different request.
throttled429Too many calls. Wait for Retry-After seconds.
not_built501The endpoint is planned and documented, but not open yet.
server_error500Something broke on our side. Quote the request_id.

Paging

Lists take limit (1–200, default 50) and answer meta.page.next. Pass it back as cursor for the next page; null means the end.

Retrying safely

Send an Idempotency-Key header (any string up to 80 characters, like a UUID) on POST and PATCH calls. If the network drops and you send the same call again with the same key within 24 hours, you get the first answer back (meta.replayed: true) and nothing happens twice. The same key with a different body answers 409 idempotency_mismatch.

Limits

Per key: 600 calls and 120 changes every 10 minutes. Every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; over the limit is 429 throttled with Retry-After in seconds. Many calls with keys that don't work from one network are refused for ten minutes.

Sandbox

Sandbox keys (cck_test_…) will run every call against a practice copy of your account: a team of made-up members with seats, a SuperCad Studio license, a class of students and some projects. The calls really run, so a seat you assign shows up in the next list, but nothing reaches a real person: no email is sent (you can read what would have gone out on your Developers page) and nothing is charged. Answers say meta.mode: "sandbox". The sandbox is opening soon. Sandbox keys answer 503 sandbox_unavailable until then.

Versions

This is version 1 (CadCraft-Api-Version: 1). New fields and new endpoints are added in place, so ignore fields you don't know. A change that could break your code would come as /v2, announced on the changelog first.