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.
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
| Field | Type | Required | Notes |
|---|---|---|---|
email | string | yes | Max 254 chars. |
password | string | yes | 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
| Field | Type | Required | Notes |
|---|---|---|---|
part_number | string | yes | Max 80 chars. |
kind | string | yes | One of: fixed, linear |
category | string | yes | Max 40 chars. |
revision | ComponentRevisionIn | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
revision | string | yes | Max 10 chars. |
description | string | yes | Max 300 chars. |
material | string | null | ||
status | string | One of: draft, in_review, released, obsolete | |
data | object | Connectors, dimensions, drawing profile, cost, engine settings | |
erp_item_id | string | null | ||
plm_id | string | null | ||
effective_from | string | null | ||
effective_to | string | 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
| Field | Type | Required | Notes |
|---|---|---|---|
family_id | string | yes | Max 64 chars. |
customer_id | string | null | ||
values | ConfigValues | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
family_id | string | yes | Max 64 chars. |
customer_id | string | null | ||
values | ConfigValues | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
customer_id | string | null | ||
values | ConfigValues | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
provider | string | yes | |
name | string | yes | Max 80 chars. |
mode | string | One of: dry_run, live | |
settings | object |
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
| Field | Type | Required | Notes |
|---|---|---|---|
decision | string | yes | One of: approved, rejected |
comment | string | 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
| Field | Type | Required | Notes |
|---|---|---|---|
decision | string | yes | One of: approved, rejected |
comment | string | null | ||
name | string | yes | Name 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
| Field | Type | Required | Notes |
|---|---|---|---|
code | string | yes | Max 40 chars. |
name | string | yes | Max 200 chars. |
erp_id | string | null | ||
crm_id | string | null | ||
default_units | string | One of: in, mm | |
pricing_group | string | null | ||
terms | string | null | ||
requires_drawing_approval | boolean | ||
allowed_family_ids | array | ||
restricted_component_ids | array | ||
contacts | array | ||
addresses | array | ||
customer_part_numbers | object | ||
custom_fields | object |
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
| Field | Type | Required | Notes |
|---|---|---|---|
key | string | yes | Max 60 chars. |
name | string | yes | Max 120 chars. |
description | string | null | ||
family_id | string | null | ||
priority | integer | ||
enabled | boolean | ||
definition | object | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
email | string | yes | |
name | string | yes | Max 120 chars. |
role_key | string | yes | Max 40 chars. |
customer_id | string | null |
PUT/api/v1/me/notificationsUpdate notification preferences
Auth: API key or session
Body: NotificationPrefsIn
| Field | Type | Required | Notes |
|---|---|---|---|
prefs | object | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
settings | object | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | Max 80 chars. |
permissions | array | null | ||
expires_in_days | integer | 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
| Field | Type | Required | Notes |
|---|---|---|---|
url | string | yes | Max 500 chars. |
events | array | yes |
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
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | Max 120 chars. |
email | string | yes | |
company | string | yes | Max 160 chars. |
job_title | string | yes | Max 120 chars. |
company_size | string | yes | One of: 1-9, 10-49, 50-199, 200-500, 500+ |
cad_platform | string | yes | Max 80 chars. |
erp | string | null | ||
monthly_configurations | string | yes | One of: <10, 10-50, 50-200, 200+, unknown |
automate | string | yes | Max 2000 chars. |
notes | string | null | ||
website | string | null | ||
elapsed_ms | integer | null | ||
consent | boolean | yes |
POST/api/v1/public/contactContact form submission
Auth: none (public)
Body: ContactIn
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | Max 120 chars. |
email | string | yes | |
topic | string | yes | One of: general, sales, partnership, press, security, privacy |
message | string | yes | Max 4000 chars. |
website | string | null | ||
elapsed_ms | integer | null |
Support
POST/api/v1/support/ticketsOpen a support ticket with diagnostics
Auth: API key or session
Body: SupportIn
| Field | Type | Required | Notes |
|---|---|---|---|
category | string | yes | One of: bug, question, feature_request, cad_job, integration, billing, security |
subject | string | yes | Max 200 chars. |
description | string | yes | Max 8000 chars. |
job_id | string | null | ||
configuration_id | string | null | ||
output_type | string | null | ||
error_message | string | null | ||
browser | string | null |
Worker
POST/worker/v1/heartbeatWorker heartbeat (extends the lease of the current job)
Auth: worker token
Body: WorkerHeartbeatIn
| Field | Type | Required | Notes |
|---|---|---|---|
engines | array | yes | |
capabilities | object | ||
version | string | null | ||
job_id | string | null | ||
message | string | null |
POST/worker/v1/jobs/leaseLease the next queued job this worker can run
Auth: worker token
Body: WorkerLeaseIn
| Field | Type | Required | Notes |
|---|---|---|---|
engines | array | yes | |
capabilities | object | ||
version | string | 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
| Field | Type | Required | Notes |
|---|---|---|---|
result | object | yes |
POST/worker/v1/jobs/{job_id}/failReport a failed attempt (retried with backoff unless final)
Auth: worker token
Body: WorkerFailIn
| Field | Type | Required | Notes |
|---|---|---|---|
error | string | yes | Max 8000 chars. |
retryable | boolean |
GET/worker/v1/files/{file_id}Fetch a component file for a leased job (signed URL)
Auth: worker token