Skip to content
CADCAMFUN
Docs

Documentation

Library

Shared library records and component, material, and tool lookup collections.

Playground

Send these requests to your own running sidecar. Values stay in this browser.

Not connected
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
Library operations in 3D Drag to orbit · scroll to zoom · right-drag to pan
One block per operation (8), stacked per resource section of this page and coloured by method: green GET, orange POST, blue PUT, violet PATCH, red DELETE. Generated from the OpenAPI document at build time.

/api/library

get /api/library # library.list

Requires Authorization: Bearer <token>.

Parameters
NameInTypeRequired
category query string | null optional
type query string | null optional
search query string | null optional
Responses
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
GET /api/library
[]
SDK example
library.list
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
GET /api/library
curl --request GET "${CADCAMFUN_URL}/api/library" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Try it
post /api/library # library.create

Requires Authorization: Bearer <token>.

Request body · required · application/json
{
  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
}
Responses
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
library.create
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
POST /api/library
curl --request POST "${CADCAMFUN_URL}/api/library" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
  --header "Content-Type: application/json" \
  --data-binary @request.json
Try it
get /api/library/{id} # library.get

Requires Authorization: Bearer <token>.

Parameters
NameInTypeRequired
id path string required
Responses
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
library.get
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
GET /api/library/{id}
curl --request GET "${CADCAMFUN_URL}/api/library/<id>" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Try it
put /api/library/{id} # library.update

Requires Authorization: Bearer <token>.

Parameters
NameInTypeRequired
id path string required
Request body · required · application/json
{
  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
}
Responses
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
library.update
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
PUT /api/library/{id}
curl --request PUT "${CADCAMFUN_URL}/api/library/<id>" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
  --header "Content-Type: application/json" \
  --data-binary @request.json
Try it
delete /api/library/{id} # library.remove

Requires Authorization: Bearer <token>.

Parameters
NameInTypeRequired
id path string required
Responses
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
library.remove
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
DELETE /api/library/{id}
curl --request DELETE "${CADCAMFUN_URL}/api/library/<id>" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Try it

/api/library/components

get /api/library/components # library.components

Requires Authorization: Bearer <token>.

Responses
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
GET /api/library/components
{
  "data": []
}
SDK example
library.components
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
GET /api/library/components
curl --request GET "${CADCAMFUN_URL}/api/library/components" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Try it

/api/library/materials

get /api/library/materials # library.materials

Requires Authorization: Bearer <token>.

Responses
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
GET /api/library/materials
{
  "data": []
}
SDK example
library.materials
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
GET /api/library/materials
curl --request GET "${CADCAMFUN_URL}/api/library/materials" \
  --header "Authorization: Bearer ${CADCAMFUN_TOKEN}"
Try it

/api/library/tools

get /api/library/tools # library.tools

Requires Authorization: Bearer <token>.

Responses
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
GET /api/library/tools
{
  "data": []
}
SDK example
library.tools
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
GET /api/library/tools
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
}
UnauthorizedEncoded
{
  _tag: "Unauthorized"
  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.

Errors from the Promise SDK
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

SymptomLikely causeFix
401 on every callToken from a previous launch, or missing Bearer prefixSend Authorization: Bearer <token> with the token the sidecar was started with.
400 before anything happensBody or parameter does not match the schemaCompare the payload with the request schema on the card.
403 or 404 on a record you can see elsewhereThe acting account differsSend the right x-session-token, or use the local profile that owns the record.
409Conflicting state, such as a duplicate name or a stale branch headRe-read the resource and retry with current data.
Try it says "blocked by CORS"The docs are served from a non-loopback originRun the docs locally or copy the request as curl.
Connection refusedThe sidecar restarted on a new portRead the port from the new ready line.