Documentation
Library
Shared library records and component, material, and tool lookup collections.
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
8 endpoints in the library 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/library | library.list |
| post | /api/library | library.create |
| get | /api/library/{id} | library.get |
| put | /api/library/{id} | library.update |
| delete | /api/library/{id} | library.remove |
| get | /api/library/components | library.components |
| get | /api/library/materials | library.materials |
| get | /api/library/tools | library.tools |
/api/library
library.list Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| category | query | string | null | optional |
| type | query | string | null | optional |
| search | query | string | null | optional |
200 Array<object> application/json
Array<{ id: string name: string description: string | null category: string type: string data: unknown properties: unknown tags: unknown thumbnail: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null }>
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Example response captured · 200
[] SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// LibraryListInput
const result = await client.library.list({}) curl
curl --request GET "${CADCAMFUN_URL}/api/library" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
library.create Requires Authorization: Bearer <token>.
{ name?: string | null description?: string | null category?: string | null type?: string | null data?: unknown | null properties?: unknown | null tags?: unknown | null organizationId?: string | null isPublic?: boolean | null }
201 object application/json
{ id: string name: string description: string | null category: string type: string data: unknown properties: unknown tags: unknown thumbnail: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 ForbiddenEncoded application/json
ForbiddenEncoded
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}` },
})
// LibraryCreateInput
const result = await client.library.create({
name: "",
description: "",
category: "",
type: "",
data: null,
properties: null,
tags: null,
organizationId: "",
isPublic: false
}) curl
curl --request POST "${CADCAMFUN_URL}/api/library" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Try it
library.get Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
200 object application/json
{ id: string name: string description: string | null category: string type: string data: unknown properties: unknown tags: unknown thumbnail: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null }
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}` },
})
// LibraryGetInput
const result = await client.library.get({
id: "<id>"
}) curl
curl --request GET "${CADCAMFUN_URL}/api/library/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
library.update Requires Authorization: Bearer <token>.
| Name | In | Type | Required |
|---|---|---|---|
| id | path | string | required |
{ name?: string | null description?: string | null category?: string | null type?: string | null data?: unknown | null properties?: unknown | null tags?: unknown | null organizationId?: string | null isPublic?: boolean | null }
200 object application/json
{ id: string name: string description: string | null category: string type: string data: unknown properties: unknown tags: unknown thumbnail: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: 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}` },
})
// LibraryUpdateInput
const result = await client.library.update({
id: "<id>",
name: "",
description: "",
category: "",
type: "",
data: null,
properties: null,
tags: null,
organizationId: "",
isPublic: false
}) curl
curl --request PUT "${CADCAMFUN_URL}/api/library/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Try it
library.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}` },
})
// LibraryRemoveInput
const result = await client.library.remove({
id: "<id>"
}) curl
curl --request DELETE "${CADCAMFUN_URL}/api/library/<id>" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
/api/library/components
library.components Requires Authorization: Bearer <token>.
200 object application/json
{ data: Array<{ id: string name: string description: string | null category: string type: string data: unknown properties: unknown tags: unknown thumbnail: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null owner: { id: string name: string | null email: string | null image: string | null } | null }> }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Example response captured · 200
{
"data": []
} SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.library.components() curl
curl --request GET "${CADCAMFUN_URL}/api/library/components" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
/api/library/materials
library.materials Requires Authorization: Bearer <token>.
200 object application/json
{ data: Array<{ id: string name: string description: string | null properties: unknown isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null owner: { id: string name: string | null email: string | null image: string | null } | null }> }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Example response captured · 200
{
"data": []
} SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.library.materials() curl
curl --request GET "${CADCAMFUN_URL}/api/library/materials" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Try it
/api/library/tools
library.tools Requires Authorization: Bearer <token>.
200 object application/json
{ data: Array<{ id: string name: string type: string diameter: number | "Infinity" | "-Infinity" | "NaN" material: string numberOfFlutes: number | "Infinity" | "-Infinity" | "NaN" | null maxRPM: number | "Infinity" | "-Infinity" | "NaN" | null coolantType: string | null cuttingLength: number | "Infinity" | "-Infinity" | "NaN" | null totalLength: number | "Infinity" | "-Infinity" | "NaN" | null shankDiameter: number | "Infinity" | "-Infinity" | "NaN" | null cornerRadius?: number | "Infinity" | "-Infinity" | "NaN" | null tipAngle?: number | "Infinity" | "-Infinity" | "NaN" | null threadPitch?: number | "Infinity" | "-Infinity" | "NaN" | null holderDiameter?: number | "Infinity" | "-Infinity" | "NaN" | null holderLength?: number | "Infinity" | "-Infinity" | "NaN" | null stickout?: number | "Infinity" | "-Infinity" | "NaN" | null notes: string | null isPublic: boolean createdAt: string updatedAt: string ownerId: string | null organizationId: string | null owner: { id: string name: string | null email: string | null image: string | null } | null }> }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Example response captured · 200
{
"data": []
} SDK example
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.library.tools() curl
curl --request GET "${CADCAMFUN_URL}/api/library/tools" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" 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 }
ForbiddenEncoded{ _tag: "Forbidden" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
KeyedInternalEncoded{ _tag: "KeyedInternal" error: string }
NotFoundEncoded{ _tag: "NotFound" message: string }
Calling this group
Operation ids have the form library.<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. |