Documentation

REST API reference

Base URL: https://api.cadxor.com (API access is provided to pilot workspaces). All requests and responses are JSON unless noted. This reference is generated from the platform's route table at build time.

Download OpenAPI 3.1 (JSON)

System

GET/healthLiveness and dependency status

Auth: none (public)

GET/api/v1/openapi.jsonOpenAPI 3.1 document generated from the route table

Auth: none (public)

Auth

POST/api/v1/auth/loginSign in with email and password (sets session + CSRF cookies)

Auth: none (public)

Body: LoginIn

FieldTypeRequiredNotes
emailstringyes Max 254 chars.
passwordstringyes Max 256 chars.
POST/api/v1/auth/logoutSign out (revokes the session)

Auth: API key or session

GET/api/v1/meCurrent user, organisation and permissions

Auth: API key or session

Dashboard

GET/api/v1/dashboardDashboard metrics for the organisation

Auth: API key or session · permission configurations.read

Catalog

GET/api/v1/familiesList product families

Auth: API key or session · permission configurations.read

GET/api/v1/families/{family_id}/catalogFamily definition plus the components eligible for each slot (configurator bootstrap)

Auth: API key or session · permission configurations.read

Component library

GET/api/v1/componentsList components (current revisions)

Auth: API key or session · permission components.read

POST/api/v1/componentsCreate a component with its first revision

Auth: API key or session · permission components.write

Body: ComponentIn

FieldTypeRequiredNotes
part_numberstringyes Max 80 chars.
kindstringyes One of: fixed, linear
categorystringyes Max 40 chars.
revisionComponentRevisionInyes
GET/api/v1/components/{component_id}Component with full revision history

Auth: API key or session · permission components.read

POST/api/v1/components/{component_id}/revisionsAdd a new revision (released data is never overwritten; released revisions supersede the previous one)

Auth: API key or session · permission components.write

Body: ComponentRevisionIn

FieldTypeRequiredNotes
revisionstringyes Max 10 chars.
descriptionstringyes Max 300 chars.
materialstring | null
statusstring One of: draft, in_review, released, obsolete
dataobjectConnectors, dimensions, drawing profile, cost, engine settings
erp_item_idstring | null
plm_idstring | null
effective_fromstring | null
effective_tostring | null
POST/api/v1/components/{component_id}/revisions/{revision_id}/stepUpload the STEP model for a draft revision (multipart field 'file')

Auth: API key or session · permission components.write

Body: multipart/form-data

Configurations

POST/api/v1/configurations/evaluateValidate and price a configuration without saving it (used live by the configurator)

Auth: API key or session · permission configurations.read

Body: EvaluateIn

FieldTypeRequiredNotes
family_idstringyes Max 64 chars.
customer_idstring | null
valuesConfigValuesyes
GET/api/v1/configurationsList configurations (latest first). Filter: ?status=

Auth: API key or session · permission configurations.read

POST/api/v1/configurationsCreate a configuration (draft)

Auth: API key or session · permission configurations.write

Body: ConfigurationIn

FieldTypeRequiredNotes
family_idstringyes Max 64 chars.
customer_idstring | null
valuesConfigValuesyes
GET/api/v1/configurations/{config_id}Configuration with approvals, jobs, quotes and revisions

Auth: API key or session · permission configurations.read

PUT/api/v1/configurations/{config_id}Update a configuration. Changing engineering values invalidates any approvals.

Auth: API key or session · permission configurations.write

Body: ConfigurationUpdateIn

FieldTypeRequiredNotes
customer_idstring | null
valuesConfigValuesyes
POST/api/v1/configurations/{config_id}/submitValidate, route for approval or release, and queue CAD generation

Auth: API key or session · permission configurations.submit

POST/api/v1/configurations/{config_id}/reviseCreate the next revision of a locked configuration

Auth: API key or session · permission configurations.revise

POST/api/v1/configurations/{config_id}/cancelCancel a configuration

Auth: API key or session · permission configurations.write

GET/api/v1/configurations/{config_id}/bom.csvBill of materials as CSV

Auth: API key or session · permission configurations.read

Quotes

POST/api/v1/configurations/{config_id}/quoteCreate a quote from the configuration's estimate

Auth: API key or session · permission quotes.write

GET/api/v1/quotesList quotes

Auth: API key or session · permission quotes.read

Integrations

POST/api/v1/configurations/{config_id}/erp-syncPush a released configuration to the connected ERP

Auth: API key or session · permission integrations.sync

GET/api/v1/integrationsIntegration catalogue, connections and recent sync log

Auth: API key or session · permission configurations.read

POST/api/v1/integrationsCreate or update an integration connection (credentials live in the secrets manager, never in this request)

Auth: API key or session · permission integrations.manage

Body: IntegrationIn

FieldTypeRequiredNotes
providerstringyes
namestringyes Max 80 chars.
modestring One of: dry_run, live
settingsobject
GET/api/v1/configurations/{config_id}/erp-previewPreview the ERP payloads for a configuration

Auth: API key or session · permission configurations.read

Approvals

GET/api/v1/approvalsApproval requests. Filter: ?status=pending

Auth: API key or session · permission configurations.read

POST/api/v1/approvals/{approval_id}/decisionApprove or reject (comment required to reject)

Auth: API key or session

Body: DecisionIn

FieldTypeRequiredNotes
decisionstringyes One of: approved, rejected
commentstring | null
POST/api/v1/approvals/{approval_id}/customer-linkIssue a secure, single-purpose customer approval link (shown once)

Auth: API key or session · permission configurations.submit

GET/api/v1/customer-approvals/{token}Customer view of a pending approval (secure link)

Auth: none (public)

POST/api/v1/customer-approvals/{token}Customer approves or rejects through the secure link

Auth: none (public)

Body: CustomerDecisionIn

FieldTypeRequiredNotes
decisionstringyes One of: approved, rejected
commentstring | null
namestringyesName of the person approving Max 120 chars.

Jobs

GET/api/v1/jobsList CAD jobs. Filter: ?status=

Auth: API key or session · permission jobs.read

GET/api/v1/jobs/{job_id}Job detail with inputs, events and signed output links

Auth: API key or session · permission jobs.read

POST/api/v1/jobs/{job_id}/retryRetry a failed job

Auth: API key or session · permission jobs.retry

GET/api/v1/files/{file_id}/downloadDownload a file through a signed, short-lived URL

Auth: none (public)

Customers

GET/api/v1/customersList customers

Auth: API key or session · permission customers.read

POST/api/v1/customersCreate a customer

Auth: API key or session · permission customers.write

Body: CustomerIn

FieldTypeRequiredNotes
codestringyes Max 40 chars.
namestringyes Max 200 chars.
erp_idstring | null
crm_idstring | null
default_unitsstring One of: in, mm
pricing_groupstring | null
termsstring | null
requires_drawing_approvalboolean
allowed_family_idsarray
restricted_component_idsarray
contactsarray
addressesarray
customer_part_numbersobject
custom_fieldsobject

Rules

GET/api/v1/rulesList engineering rules

Auth: API key or session · permission configurations.read

POST/api/v1/rulesCreate or update a rule (by key). Definition is schema-checked.

Auth: API key or session · permission rules.write

Body: RuleIn

FieldTypeRequiredNotes
keystringyes Max 60 chars.
namestringyes Max 120 chars.
descriptionstring | null
family_idstring | null
priorityinteger
enabledboolean
definitionobjectyes
GET/api/v1/drawing-templatesList drawing templates

Auth: API key or session · permission configurations.read

Organization

GET/api/v1/usersList users and roles

Auth: API key or session · permission users.manage

POST/api/v1/usersInvite a user (returns a one-time temporary password until email is configured)

Auth: API key or session · permission users.manage

Body: UserInviteIn

FieldTypeRequiredNotes
emailstringyes
namestringyes Max 120 chars.
role_keystringyes Max 40 chars.
customer_idstring | null
PUT/api/v1/me/notificationsUpdate notification preferences

Auth: API key or session

Body: NotificationPrefsIn

FieldTypeRequiredNotes
prefsobjectyes
GET/api/v1/notificationsIn-app notifications for the current user

Auth: API key or session

POST/api/v1/notifications/read-allMark all notifications read

Auth: API key or session

PUT/api/v1/organization/settingsUpdate organisation settings

Auth: API key or session · permission settings.manage

Body: SettingsIn

FieldTypeRequiredNotes
settingsobjectyes

Developer

GET/api/v1/api-keysList API keys (secrets are never returned)

Auth: API key or session · permission apikeys.manage

POST/api/v1/api-keysCreate an API key (the secret is shown once)

Auth: API key or session · permission apikeys.manage

Body: ApiKeyIn

FieldTypeRequiredNotes
namestringyes Max 80 chars.
permissionsarray | null
expires_in_daysinteger | null
DELETE/api/v1/api-keys/{key_id}Revoke an API key

Auth: API key or session · permission apikeys.manage

GET/api/v1/webhooksList webhook subscriptions and recent deliveries

Auth: API key or session · permission webhooks.manage

POST/api/v1/webhooksSubscribe an HTTPS endpoint to events (signing secret shown once)

Auth: API key or session · permission webhooks.manage

Body: WebhookIn

FieldTypeRequiredNotes
urlstringyes Max 500 chars.
eventsarrayyes

Audit

GET/api/v1/auditAudit log (newest first). ?entity_id= filter. Includes chain verification.

Auth: API key or session · permission audit.read

Website

POST/api/v1/public/demo-requestsBook-a-demo form submission

Auth: none (public)

Body: LeadIn

FieldTypeRequiredNotes
namestringyes Max 120 chars.
emailstringyes
companystringyes Max 160 chars.
job_titlestringyes Max 120 chars.
company_sizestringyes One of: 1-9, 10-49, 50-199, 200-500, 500+
cad_platformstringyes Max 80 chars.
erpstring | null
monthly_configurationsstringyes One of: <10, 10-50, 50-200, 200+, unknown
automatestringyes Max 2000 chars.
notesstring | null
websitestring | null
elapsed_msinteger | null
consentbooleanyes
POST/api/v1/public/contactContact form submission

Auth: none (public)

Body: ContactIn

FieldTypeRequiredNotes
namestringyes Max 120 chars.
emailstringyes
topicstringyes One of: general, sales, partnership, press, security, privacy
messagestringyes Max 4000 chars.
websitestring | null
elapsed_msinteger | null

Support

POST/api/v1/support/ticketsOpen a support ticket with diagnostics

Auth: API key or session

Body: SupportIn

FieldTypeRequiredNotes
categorystringyes One of: bug, question, feature_request, cad_job, integration, billing, security
subjectstringyes Max 200 chars.
descriptionstringyes Max 8000 chars.
job_idstring | null
configuration_idstring | null
output_typestring | null
error_messagestring | null
browserstring | null

Worker

POST/worker/v1/heartbeatWorker heartbeat (extends the lease of the current job)

Auth: worker token

Body: WorkerHeartbeatIn

FieldTypeRequiredNotes
enginesarrayyes
capabilitiesobject
versionstring | null
job_idstring | null
messagestring | null
POST/worker/v1/jobs/leaseLease the next queued job this worker can run

Auth: worker token

Body: WorkerLeaseIn

FieldTypeRequiredNotes
enginesarrayyes
capabilitiesobject
versionstring | null
POST/worker/v1/jobs/{job_id}/outputsUpload one output file (multipart: kind, file)

Auth: worker token

Body: multipart/form-data

POST/worker/v1/jobs/{job_id}/completeMark a job complete

Auth: worker token

Body: WorkerCompleteIn

FieldTypeRequiredNotes
resultobjectyes
POST/worker/v1/jobs/{job_id}/failReport a failed attempt (retried with backoff unless final)

Auth: worker token

Body: WorkerFailIn

FieldTypeRequiredNotes
errorstringyes Max 8000 chars.
retryableboolean
GET/worker/v1/files/{file_id}Fetch a component file for a leased job (signed URL)

Auth: worker token