Documentation
Drawings
Project drawings and their saved geometry, metadata, and update operations.
Send these requests to your own running sidecar. Values stay in this browser.
How this works
The sidecar listens on a loopback port chosen at startup and prints it in its ready line; use that URL and the CADCAMFUN_TOKEN it was started with. Requests go straight from this page to that address.
The sidecar sends CORS headers only to the Tauri origins and to http://localhost or http://127.0.0.1 on any port. From the hosted docs the browser blocks the response, so run the docs locally (bun run dev in packages/web) to use the playground, or copy the request as curl. To experiment without touching real data, start the sidecar with CADCAMFUN_DATA_DIR pointed at a throwaway directory — see the API walkthrough.
Operations
7 endpoints in the drawings group, generated from the sidecar's own OpenAPI document. Protected operations take Authorization: Bearer $CADCAMFUN_TOKEN; see authentication. Behaviour and limits are in the subsystem guide.
| get | /api/drawings/{id} | drawings.get |
| put | /api/drawings/{id} | drawings.update |
| delete | /api/drawings/{id} | drawings.remove |
| get | /api/drawings/{id}/versions | drawings.versions |
| post | /api/drawings/{id}/versions/{versionId}/restore | drawings.restoreVersion |
| get | /api/projects/{id}/drawings | drawings.listForProject |
| post | /api/projects/{id}/drawings | drawings.createForProject |
/api/drawings
drawings.get Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
200 object application/json
{ id: string name: string description: string | null data: unknown thumbnail: string | null createdAt: string updatedAt: string projectId: string project: { id: string name: string ownerId: string organization: { id: string users: Array<{ role: string }> } | null } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// DrawingsGetInput
const result = await client.drawings.get({
id: "<id>"
}) curl
curl --request GET "${CADCAMFUN_URL}/api/drawings/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
drawings.update Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
{ name?: string | null description?: string | null data?: unknown | null thumbnail?: string | null baseUpdatedAt?: string | null mergeData?: boolean | null }
200 object application/json
{ id: string name: string description: string | null data: unknown thumbnail: string | null createdAt: string updatedAt: string projectId: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
409 ConflictEncoded application/json
ConflictEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// DrawingsUpdateInput
const result = await client.drawings.update({
id: "<id>",
name: "",
description: "",
data: null,
thumbnail: "",
baseUpdatedAt: "",
mergeData: false
}) curl
curl --request PUT "${CADCAMFUN_URL}/api/drawings/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Try it
drawings.remove Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
200 object application/json
{ message: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// DrawingsRemoveInput
const result = await client.drawings.remove({
id: "<id>"
}) curl
curl --request DELETE "${CADCAMFUN_URL}/api/drawings/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
drawings.versions Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
200 Array<object> application/json
Array<{ id: string version: number | "Infinity" | "-Infinity" | "NaN" createdAt: string elements: number | "Infinity" | "-Infinity" | "NaN" }>
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
fetch example
// Not generated in the Promise SDK (multipart, binary or raw body): call it with fetch.
const response = await fetch(`${process.env.CADCAMFUN_URL}/api/drawings/${id}/versions`, {
method: "GET",
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
}) curl
curl --request GET "${CADCAMFUN_URL}/api/drawings/<id>/versions" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
drawings.restoreVersion Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
| versionId | path | string | required |
200 object application/json
{ id: string name: string description: string | null data: unknown thumbnail: string | null createdAt: string updatedAt: string projectId: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
fetch example
// Not generated in the Promise SDK (multipart, binary or raw body): call it with fetch.
const response = await fetch(`${process.env.CADCAMFUN_URL}/api/drawings/${id}/versions/${versionId}/restore`, {
method: "POST",
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
}) curl
curl --request POST "${CADCAMFUN_URL}/api/drawings/<id>/versions/<versionId>/restore" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
/api/projects
drawings.listForProject Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
200 Array<object> application/json
Array<{ id: string name: string description: string | null data: unknown thumbnail: string | null createdAt: string updatedAt: string projectId: string }>
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// DrawingsListForProjectInput
const result = await client.drawings.listForProject({
id: "<id>"
}) curl
curl --request GET "${CADCAMFUN_URL}/api/projects/<id>/drawings" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
drawings.createForProject Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
{ name?: string | null description?: string | null data?: unknown | null thumbnail?: string | null baseUpdatedAt?: string | null mergeData?: boolean | null }
201 object application/json
{ id: string name: string description: string | null data: unknown thumbnail: string | null createdAt: string updatedAt: string projectId: string }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
404 NotFoundEncoded application/json
NotFoundEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// DrawingsCreateForProjectInput
const result = await client.drawings.createForProject({
id: "<id>",
name: "",
description: "",
data: null,
thumbnail: "",
baseUpdatedAt: "",
mergeData: false
}) curl
curl --request POST "${CADCAMFUN_URL}/api/projects/<id>/drawings" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Try it
Schemas
Named schemas reachable from this group's parameters, bodies and responses. A ? marks an optional field; | null marks a field that may be present with a null value.
BadRequestEncoded{ _tag: "BadRequest" message: string }
ConflictEncoded{ _tag: "Conflict" message: string }
ForbiddenEncoded{ _tag: "Forbidden" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
NotFoundEncoded{ _tag: "NotFound" message: string }
Calling this group
Operation ids have the form drawings.<name>. The generated Promise SDK (@cadcamfun/api/sdk) exposes most of them as client.<namespace>.<method>(input), where input is one flat object of path parameters and body fields; each card's SDK example shows the exact accessor and input type. Multipart uploads, binary or JavaScript responses and raw webhooks are not generated; those cards show fetch instead.
import { CadCam, ClientError } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
try {
await client.projects.list()
} catch (error) {
if (error instanceof ClientError) {
// Transport | UnexpectedStatus | UnsupportedContentType | MalformedResponse | SseEventTooLarge
} else {
// a declared error body: switch on error._tag
}
} Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| 401 on every call | Token from a previous launch, or missing Bearer prefix | Send Authorization: Bearer <token> with the token the sidecar was started with. |
| 400 before anything happens | Body or parameter does not match the schema | Compare the payload with the request schema on the card. |
| 403 or 404 on a record you can see elsewhere | The acting account differs | Send the right x-session-token, or use the local profile that owns the record. |
| 409 | Conflicting state, such as a duplicate name or a stale branch head | Re-read the resource and retry with current data. |
| Try it says "blocked by CORS" | The docs are served from a non-loopback origin | Run the docs locally or copy the request as curl. |
| Connection refused | The sidecar restarted on a new port | Read the port from the new ready line. |