Reference
API reference
Every endpoint and schema of the public /v1 API, rendered from the OpenAPI 3.1.0 document (version 0.1.0).
- Base URL:
https://printy3d-api-staging.onrender.com. Authenticate withAuthorization: Bearer p3d_…(keys); the scope each endpoint needs is named in its description. - Every error is a Problem; the codes are on Errors.
- Download the document: openapi.json. It works with OpenAPI tooling and code generators.
Files#
List files#
/v1/filesBearer keyRequires files:read. Cursor pagination within this organization and key mode.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
cursor | query | string | |
limit | query | integer |
Responses
Create file#
/v1/filesBearer keyRequires files:write. Reserve an immutable upload of up to 10 MiB in any accepted format.
PUT the exact bytes to upload.url with the returned headers, then complete the upload; the API verifies size, SHA-256 and the file's contents before it becomes ready. Live uploads need an approved account. Larger files use POST /v1/files/resumable. Idempotency-Key replays for 24 hours return a renewed upload URL.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
Idempotency-Keyrequired | header | string |
Request body required
Responses
- 201 Successful Response — FileUpload
- 401 403 404 409 413 422 429 501 Problem (
application/problem+json)
Create resumable file#
/v1/files/resumableBearer keyReserve a file larger than a simple upload allows, up to the plan's limit (at most 1 GiB).
Needs an approved account (or an internal storage grant). The answer is an S3 multipart upload: PUT each listed part to its URL (exact size, any order). Part URLs are capabilities: keep them private. Replay the same request with the same Idempotency-Key to resume or to renew URLs; parts already sent are kept (at most three new multipart starts per file, failed responses included). Complete assembles the parts and always queues background verification; poll the file until ready or rejected.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
Idempotency-Keyrequired | header | string |
Request body required
Responses
- 201 Successful Response — ResumableFileUpload
- 401 403 404 409 413 422 429 501 Problem (
application/problem+json)
Get file#
/v1/files/{file_id}Bearer keyRequires files:read.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
file_idrequired | path | string |
Responses
Complete file#
/v1/files/{file_id}/completeBearer keyRequires files:write. Prefer: respond-async queues durable verification.
Poll GET /v1/files/{file_id} until ready or rejected before creating a job. Resumable uploads always complete asynchronously. Without the preference, bounded legacy uploads still complete synchronously. Repeated completion calls do not enqueue duplicate verification work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
file_idrequired | path | string | |
prefer | header | string |
Responses
Jobs#
List jobs#
/v1/jobsBearer keyRequires jobs:read. Cursor pagination within this organization and key mode.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
cursor | query | string | |
limit | query | integer |
Responses
Create job#
/v1/jobsBearer keyRequires jobs:write. Queue a job for a ready file.
Sandbox (test-key) jobs return explicitly simulated results and incur no charge. A live job holds its expected cost in credits and is charged its run time when it finishes (usage); 402 insufficient_credits names the required and available credits when the balance cannot cover the hold (GET /v1/balance). 503 capacity_exhausted (with Retry-After and a reason) means a live job cannot start now: no GPU for a GPU recipe (paused, spend_limit, no_gpu_available, controller_offline), or no Exact Check worker running for a cad_check (cad_unavailable); nothing is queued or held. 501 feature_unavailable when live work, the input's format or size, or a live cad_check (its CPU lane's build) is not enabled. While a live job waits, queue gives its position, estimated_start_at and the GPU fleet's capacity (null for a cad_check); a queued live job fails free (capacity_exhausted) after 10 minutes without GPU capacity (a cad_check: without an Exact Check worker) or 24 hours in the queue. The Idempotency-Key is required; a replay within 24 hours returns the job as it is now, with Idempotent-Replayed: true.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
Idempotency-Keyrequired | header | string |
Request body required
Responses
Get job#
/v1/jobs/{job_id}Bearer keyRequires jobs:read. Poll status; analysis is published only after trusted verification.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string |
Responses
Cancel job#
/v1/jobs/{job_id}/cancelBearer keyRequires jobs:write. Fence the attempt; accepted cancellation prevents result publication.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string |
Responses
Job evaluation#
/v1/jobs/{job_id}/evaluationBearer keyRequires jobs:read. Free: judge the stored measurements of a succeeded cad_check job against the limits table of this organization, without a new job. Without process every process and material is judged; process alone judges each of its materials; material needs a process. 409 when the job is not a succeeded cad_check or its stored measurements expired; 503 (with Retry-After) when the limits table cannot be read.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string | |
process | query | string | null | |
material | query | string | null | |
scale | query | number | |
assembly_intent | query | "separate" | "together" | |
moving | query | boolean |
Responses
- 200 Successful Response — EvaluationList
- 401 403 404 409 413 422 429 501 503 Problem (
application/problem+json)
Job events#
/v1/jobs/{job_id}/eventsBearer keyRequires jobs:read. Durable ordered events; pass next_after to resume polling.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string | |
after | query | integer |
Responses
Exact Check limits#
Get technologies#
/v1/technologiesBearer keyRequires jobs:read. The limits per process and material that apply to this organization: the global table with the organization's own overrides merged over it. version changes whenever either changes; nothing stores it with a check, and each evaluation answers with the version it judged by (table_version). gap_floor_mm is the higher of the global floor and any floor set for this organization.
Responses
- 200 Successful Response — TechnologyTable
- 401 403 422 429 503 Problem (
application/problem+json)
Webhooks#
List webhook endpoints#
/v1/webhook_endpointsBearer keyRequires webhooks:manage. Every endpoint of the organization of this key's mode, oldest first, without secrets. Not paged: an account holds at most 20 endpoints of each mode, and all of them are in data.
Responses
- 200 Successful Response — WebhookEndpointPage
- 401 403 404 422 429 501 Problem (
application/problem+json)
Create webhook endpoint#
/v1/webhook_endpointsBearer keyRequires webhooks:manage. Register an HTTPS address to be told when a cad_check job finishes (name it in notify.webhook_endpoint when creating the job). The endpoint belongs to the key's mode: only keys of that mode can list, name or delete it. An account holds at most 20 endpoints of each mode; registering another is 409 conflict (delete one first).
The address must be https on port 443 or 1024 to 65535, and resolve to public hosts only: private, loopback, link-local and other non-routable addresses are refused (422, with the same sentence whether or not the name resolves), and checked again at every delivery.
The response holds the signing secret; verify Printy3D-Signature: t=<unix>,v1=<hex> as HMAC-SHA256 of <t>.<raw body> under it, in constant time, and reject a t more than 300 seconds from your clock. The payload is {event, job_id, status} and nothing else; fetch the job for the rest. A delivery is attempted up to 5 times in all, 1 m, 5 m, 30 m and 2 h apart. With an Idempotency-Key (kept 24 hours), a retry returns the same endpoint and secret with Idempotent-Replayed: true instead of registering a second one.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
Idempotency-Key | header | string | null |
Request body required
Responses
- 201 Successful Response — IssuedWebhookEndpoint
- 401 403 404 409 422 429 501 Problem (
application/problem+json)
Delete webhook endpoint#
/v1/webhook_endpoints/{endpoint_id}Bearer keyRequires webhooks:manage. An endpoint of this key's mode; deliveries still waiting for it are called off. One already being sent when the endpoint is deleted may still arrive.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
endpoint_idrequired | path | string |
Responses
- 204 Successful Response
- 401 403 404 422 429 501 Problem (
application/problem+json)
Artifacts & exports#
Download#
/v1/artifacts/{artifact_id}/downloadBearer keyRequires artifacts:read. Return a temporary download URL; keep it confidential.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
artifact_idrequired | path | string |
Responses
Artifacts#
/v1/jobs/{job_id}/artifactsBearer keyRequires artifacts:read. Empty until the entire result manifest has passed verification.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string |
Responses
- 200 Successful Response — ArtifactList
- 401 403 404 409 413 422 429 501 Problem (
application/problem+json)
Create export#
/v1/jobs/{job_id}/exportsBearer keyRequires jobs:write. A succeeded job's mesh output in one format, every piece in it.
200 ready with the artifact when the job generated that format. Otherwise 202 converting: one conversion job (conversion_job_id) makes it on the GPU fleet and is charged like any convert job (credits held and charged; 402, 429 and 503 as for POST /v1/jobs). Asking again returns the same conversion, or starts a new one after a failure; poll GET /v1/jobs/{job_id}/exports/{format}. Test keys export only the formats a job generated (501 for a conversion).
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string |
Request body required
Responses
Get export#
/v1/jobs/{job_id}/exports/{format}Bearer keyRequires artifacts:read. The export's state; 404 when it was never asked for.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
job_idrequired | path | string | |
formatrequired | path | "glb" | "obj" | "3mf" | "stl" | "ply" |
Responses
Credits#
Get balance#
/v1/balanceBearer keyRequires usage:read. The organization's credits; 1 credit = 1 second of a job's run.
Live jobs hold credits when submitted and are charged their run time when they finish; test-mode jobs never change the balance. POST /v1/jobs answers 402 insufficient_credits when a live job's hold exceeds available_credits.
Responses
List transactions#
/v1/balance/transactionsBearer keyRequires usage:read. Every credit movement, newest first.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
before | query | integer | null | |
limit | query | integer |
Responses
- 200 Successful Response — CreditTransactionPage
- 401 403 422 429 Problem (
application/problem+json)
Account, keys & catalogue#
List API keys#
/v1/api_keysBearer keyRequires keys:manage. Lists metadata in this organization and live/test mode.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
cursor | query | string | null | |
limit | query | integer |
Responses
- 200 Successful Response — ApiKeyPage
- 401 403 404 409 422 429 Problem (
application/problem+json)
Create API key#
/v1/api_keysBearer keyRequires keys:manage; scopes and restrictions cannot exceed the issuer.
Idempotency-Key is retained for 24 hours. Replays return issuance metadata with secret=null and Idempotent-Replayed=true; plaintext is returned once.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
Idempotency-Keyrequired | header | string |
Request body required
Responses
- 201 Successful Response — IssuedApiKey
- 401 403 404 409 422 429 Problem (
application/problem+json)
Get API key#
/v1/api_keys/{key_id}Bearer keyRequires keys:manage. Never returns a credential secret or its hash.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
key_idrequired | path | string |
Responses
Revoke API key#
/v1/api_keys/{key_id}Bearer keyRequires keys:manage. Repeated revocation of the same visible key is harmless.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
key_idrequired | path | string |
Responses
- 204 Successful Response
- 401 403 404 409 422 429 Problem (
application/problem+json)
Rotate API key#
/v1/api_keys/{key_id}/rotateBearer keyRequires keys:manage. Creates one successor without broadening authority.
The old key works during its grace period unless expired or revoked. An idempotent replay returns metadata with secret=null. Retain a recovery manager when requesting zero-grace self-rotation.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
key_idrequired | path | string | |
Idempotency-Keyrequired | header | string |
Request body required
Responses
- 201 Successful Response — IssuedApiKey
- 401 403 404 409 422 429 Problem (
application/problem+json)
List formats#
/v1/formatsBearer keyRequires files:read. enabled is live qualification; test_enabled is local sandbox support.
Responses
- 200 Successful Response — FormatList
- 401 403 404 409 422 429 Problem (
application/problem+json)
Get organization#
/v1/orgBearer keyRequires org:read. Returns only the authenticated organization.
Responses
- 200 Successful Response — Organization
- 401 403 404 409 422 429 Problem (
application/problem+json)
List repair profiles#
/v1/profilesBearer keyRequires files:read. The values each repair profile fixes; the rest is filled from the engine's recommendation (recommended) or the documented defaults.
Responses
- 200 Successful Response — RepairProfileList
- 401 403 404 409 422 429 Problem (
application/problem+json)
Status#
Liveness#
/healthzNo authLiveness: the process is up. Never touches a dependency.
Responses
- 200 Successful Response — any
Readiness#
/readyzNo authCheck the migrated database, non-owner runtime role and local storage.
Redis is not required for the local sandbox. Hosted object storage is not probed here until staging qualifies it (render-platform.md §4).
Responses
- 200 Successful Response — any
Schemas#
AnalysisApiKeyApiKeyPageAppliedRepairArtifactArtifactListBalanceCadCheckResultCapacityCreateApiKeyCreateExportCreateFileCreateJobCreateResumableFileCreateWebhookEndpointCreditTransactionCreditTransactionPageDataNoticeErrorCodeEvaluationEvaluationListEventPageExportFidelityReportFileFilePageFileUploadFindingFormatFormatKindFormatListIssuedApiKeyIssuedWebhookEndpointJobJobEventJobPageJobQueueJobUsageJsonValueNotifyTargetOrganizationProblemProblemFieldQualityAssessmentRecommendationAssessmentRepairIssueRepairParamsRepairProfileRepairProfileListRepairResultResumableFileUploadResumableUploadRotateApiKeyScaleScopeSizeBandSmoothingTechnologyRowTechnologyTableThicknessToolResultTransferUploadPartWebhookEndpointWebhookEndpointPage
Analysis#
| Field | Type | Notes |
|---|---|---|
applied | AppliedRepair | null | |
dimensions_mmrequired | [number, number, number] | |
facesrequired | integer | |
fidelity | FidelityReport | |
is_watertightrequired | boolean | |
recommendation_assessment | RecommendationAssessment | null | |
recommendation_assessments_by_scale | map<string, RecommendationAssessment> | null | |
recommended | RepairParams | null | |
recommended_by_scale | map<string, RepairParams> | null | |
schema_version | "1" | |
shells | integer | null | |
simulatedrequired | boolean | |
surface_area_mm2required | number | |
verticesrequired | integer | |
volume_mm3required | number | |
warnings | string[] |
ApiKey#
| Field | Type | Notes |
|---|---|---|
created_atrequired | string (date-time) | |
expires_atrequired | string (date-time) | null | |
grace_untilrequired | string (date-time) | null | |
idrequired | string | |
kindrequired | "live" | "test" | |
last_used_atrequired | string (date-time) | null | |
namerequired | string | |
org_idrequired | string | |
prefixrequired | string | |
revoked_atrequired | string (date-time) | null | |
scopesrequired | Scope[] | |
superseded_byrequired | string | null |
ApiKeyPage#
| Field | Type | Notes |
|---|---|---|
datarequired | ApiKey[] | |
next_cursor | string | null |
AppliedRepair#
What the repair actually ran with, and where each value came from.
wall_thickness_applied_mm is the wall the engine pushed to, which is params.wall_thickness_mm unless the engine raised it: the wall is floored at four voxels of the fine grid (a 0.7 mm request became 1.46 mm on a 20-inch print) and clamped at 10 % of the longest axis (fact: PrepEngine.cpp wallThicknessAppliedMM / wallThicknessClamped). wall_thickness_clamped says whether it differs. Both are None when the engine did not report them (a sandbox that predates them).
| Field | Type | Notes |
|---|---|---|
diagnostic_overrides | map<string, integer | boolean> | |
effective_engine_settings | map<string, JsonValue> | null | |
paramsrequired | RepairParams | |
sourcesrequired | map<string, "explicit" | "printer" | "profile" | "recommended" | "default"> | |
wall_thickness_applied_mm | number | null | |
wall_thickness_clamped | boolean | null |
Artifact#
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
job_idrequired | string | |
labelrequired | string | |
media_typerequired | string | |
sha256required | string | |
size_bytesrequired | integer |
ArtifactList#
| Field | Type | Notes |
|---|---|---|
datarequired | Artifact[] |
Balance#
The organization's credits. available = included + purchased - held.
Included credits come with the plan each period and expire at its end; purchased credits never expire and go negative when a job runs longer than its balance covered.
| Field | Type | Notes |
|---|---|---|
available_creditsrequired | integer | |
exhaustedrequired | boolean | |
held_creditsrequired | integer | |
included_creditsrequired | integer | |
lowrequired | boolean | |
period_endrequired | string (date-time) | |
period_startrequired | string (date-time) | |
purchased_creditsrequired | integer |
CadCheckResult#
| Field | Type | Notes |
|---|---|---|
accuracy_mmrequired | number | |
open_partsrequired | integer | |
pairsrequired | integer | |
partsrequired | integer | |
placed_copiesrequired | integer | |
sample_limit_per_shaperequired | integer | |
schema_versionrequired | integer | |
sheet_partsrequired | integer | |
truncatedrequired | boolean | |
unsupported_placements | integer | null | Placements in the file the checker could not read, so the parts they place were not measured. An evaluation reports them as |
Capacity#
| Field | Type | Notes |
|---|---|---|
reason | "paused" | "spend_limit" | "no_gpu_available" | "controller_offline" | null | |
retry_after_s | integer | null | |
staterequired | "available" | "busy" | "exhausted" |
CreateApiKey#
| Field | Type | Notes |
|---|---|---|
expires_at | string (date-time) | null | |
namerequired | string | |
scopesrequired | Scope[] |
CreateExport#
| Field | Type | Notes |
|---|---|---|
formatrequired | "glb" | "obj" | "3mf" | "stl" | "ply" |
CreateFile#
| Field | Type | Notes |
|---|---|---|
filenamerequired | string | |
sha256required | string | |
size_bytesrequired | integer |
CreateJob#
| Field | Type | Notes |
|---|---|---|
input_file_idrequired | string | |
notify | NotifyTarget | null | |
params | RepairParams | object | null | |
recipe | "inspect" | "repair" | "tool" | "cad_check" | |
tool | "measure" | "convert" | "cut" | "lattice" | "label" | "mirror" | "remove_small_parts" | "thickness" | "analyze" | "medial" | "structural.components" | "structural.fea" | "structural.heatmap" | "structural.fragility" | "structural.measure_all" | "structural.relief" | null |
CreateResumableFile#
| Field | Type | Notes |
|---|---|---|
filenamerequired | string | |
input_formatrequired | "stl" | "obj" | "3mf" | "ply" | "wrl" | "vrm" | "fbx" | "gltf" | "glb" | "dae" | "off" | "dcm" | "dicom" | "las" | "laz" | "step" | "zip" | "tar" | "tgz" | "rar" | |
sha256required | string | |
size_bytesrequired | integer |
CreateWebhookEndpoint#
An HTTPS address that resolves to a public host. Anything else is refused.
| Field | Type | Notes |
|---|---|---|
urlrequired | string |
CreditTransaction#
| Field | Type | Notes |
|---|---|---|
available_afterrequired | integer | |
created_atrequired | string (date-time) | |
held_deltarequired | integer | |
included_deltarequired | integer | |
job_id | string | null | |
kindrequired | "plan_grant" | "expire" | "topup" | "adjust" | "hold" | "settle" | |
note | string | null | |
purchased_deltarequired | integer | |
sequencerequired | integer |
CreditTransactionPage#
Newest first; pass next_before as before for the next page.
| Field | Type | Notes |
|---|---|---|
datarequired | CreditTransaction[] | |
next_before | integer | null |
DataNotice#
| Field | Type | Notes |
|---|---|---|
processing_regionrequired | string | |
retention_daysrequired | integer |
ErrorCode#
Every code the API may emit, public plane and worker plane.
malformed_requestunauthenticatedinvalid_api_keybootstrap_invalidinsufficient_creditsinsufficient_scopeorg_requiredorigin_not_allowedip_not_allowedimage_not_allowedaccount_pendingnot_foundmethod_not_allowedconflictjob_not_cancellableidempotency_in_progresslease_expiredlease_terminalexpiredfile_too_largeunsupported_formatvalidation_failedidempotency_key_reusedinput_too_largecontracts_mismatchrate_limitedconcurrency_limitquota_exceededinternalfeature_unavailableservice_unavailablecapacity_exhausted
Evaluation#
| Field | Type | Notes |
|---|---|---|
findingsrequired | Finding[] | |
materialrequired | string | |
processrequired | string | |
summaryrequired | "ok" | "warnings" | "blocked" |
EvaluationList#
Verdicts for one stored check, and the version of the limits table they were judged by.
| Field | Type | Notes |
|---|---|---|
itemsrequired | Evaluation[] | |
table_versionrequired | integer |
EventPage#
| Field | Type | Notes |
|---|---|---|
datarequired | JobEvent[] | |
next_afterrequired | integer |
Export#
A job's mesh output in one format, every piece in it (ADR-0058).
ready: download artifact (GET /v1/artifacts/{id}/download). converting: the format was not generated, a conversion job (conversion_job_id, charged like any convert job) is making it; ask again. failed: error_code says why; creating the export again starts a new conversion.
| Field | Type | Notes |
|---|---|---|
artifact | Artifact | null | |
conversion_job_id | string | null | |
error_code | string | null | |
formatrequired | "glb" | "obj" | "3mf" | "stl" | "ply" | |
job_idrequired | string | |
statusrequired | "ready" | "converting" | "failed" |
FidelityReport#
An artifact-bound comparison; absent or uncalibrated evidence never passes.
| Field | Type | Notes |
|---|---|---|
calibration_id | string | null | |
config_sha256 | string | null | |
coordinate_frame | string | null | |
error | string | null | |
input_sha256 | string | null | |
limitations | string[] | |
method_version | string | null | |
metrics | map<string, JsonValue> | |
output_sha256 | string | null | |
reason_codes | string[] | |
schema_version | "1" | |
source_scope | "original_input" | "engine_transformed_source" | |
source_sha256 | string | null | |
source_to_output_transform | number[][] | null | |
status | "not_assessed" | "needs_review" | "passed" | "failed" | |
thresholds | map<string, JsonValue> | |
thresholds_calibrated | boolean | |
transform_verified | boolean |
File#
| Field | Type | Notes |
|---|---|---|
created_atrequired | string (date-time) | |
filenamerequired | string | |
idrequired | string | |
input_format | "stl" | "obj" | "3mf" | "ply" | "wrl" | "vrm" | "fbx" | "gltf" | "glb" | "dae" | "off" | "dcm" | "dicom" | "las" | "laz" | "step" | "zip" | "tar" | "tgz" | "rar" | |
kind | "mesh" | "splat" | "pointcloud" | "medical" | "cad" | "archive" | |
livemoderequired | boolean | |
rejected_reason | string | null | |
sha256required | string | |
size_bytesrequired | integer | |
statusrequired | "awaiting_upload" | "verifying" | "ready" | "rejected" |
FilePage#
| Field | Type | Notes |
|---|---|---|
datarequired | File[] | |
next_cursor | string | null |
FileUpload#
Finding#
| Field | Type | Notes |
|---|---|---|
coderequired | string | |
frame | "part" | "assembly" | null | The frame of |
limit_mmrequired | number | null | |
locationrequired | number[] | null | A point in millimetres, or null. A wall, or a gap measured inside one body, is in that shape's own frame and applies to every placed copy of the part. A finding between two parts, or between two bodies of one part, is in the frame of the whole assembly. |
messagerequired | string | |
partrequired | string | null | |
severityrequired | "information" | "warning" | "blocking" | |
value_mmrequired | number | null |
Format#
| Field | Type | Notes |
|---|---|---|
enabledrequired | boolean | |
extrequired | string | |
kindrequired | FormatKind | |
test_enabled | boolean |
FormatKind#
formats.kind. Same members as FileKind; kept separate because the formats table describes an extension and a file describes an upload.
meshsplatpointcloudmedicalcadarchive
FormatList#
| Field | Type | Notes |
|---|---|---|
datarequired | Format[] |
IssuedApiKey#
| Field | Type | Notes |
|---|---|---|
api_keyrequired | ApiKey | |
secret | string | null |
IssuedWebhookEndpoint#
The only response that carries the signing secret.
| Field | Type | Notes |
|---|---|---|
created_atrequired | string (date-time) | |
enabledrequired | boolean | |
idrequired | string | |
livemoderequired | boolean | True when registered with a live key. An endpoint is told only about jobs of its own mode, and only keys of that mode can list, name or delete it. |
secretrequired | string | |
urlrequired | string |
Job#
| Field | Type | Notes |
|---|---|---|
analysis | Analysis | null | |
attemptrequired | integer | |
created_atrequired | string (date-time) | |
error_code | string | null | |
error_detail | string | null | |
idrequired | string | |
input_file_idrequired | string | |
livemoderequired | boolean | |
params | object | null | |
progress | integer | null | |
queue | JobQueue | null | |
reciperequired | "inspect" | "repair" | "tool" | "cad_check" | |
result | RepairResult | ToolResult | CadCheckResult | null | |
simulated | boolean | |
stage | string | null | |
statusrequired | "queued" | "running" | "verifying" | "succeeded" | "failed" | "cancelled" | |
tool | "measure" | "convert" | "cut" | "lattice" | "label" | "mirror" | "remove_small_parts" | "thickness" | "analyze" | "medial" | "structural.components" | "structural.fea" | "structural.heatmap" | "structural.fragility" | "structural.measure_all" | "structural.relief" | null | |
updated_atrequired | string (date-time) | |
usage | JobUsage | null |
JobEvent#
| Field | Type | Notes |
|---|---|---|
created_atrequired | string (date-time) | |
progress | integer | null | |
sequencerequired | integer | |
stage | string | null | |
statusrequired | string |
JobPage#
| Field | Type | Notes |
|---|---|---|
datarequired | Job[] | |
next_cursor | string | null |
JobQueue#
A queued live job's place. Refreshed every 30 s; a stale estimate is left out.
| Field | Type | Notes |
|---|---|---|
capacity | Capacity | null | |
estimated_start_at | string (date-time) | null | |
position | integer | null |
JobUsage#
Credits of one live job: held at admission, charged once it finishes.
| Field | Type | Notes |
|---|---|---|
charge_basis | "run_time" | "minimum" | "free" | null | |
charged_credits | integer | null | |
held_creditsrequired | integer |
JsonValue#
any
NotifyTarget#
The registered endpoint to tell when the job finishes. Ad-hoc URLs are not accepted.
| Field | Type | Notes |
|---|---|---|
webhook_endpointrequired | string |
Organization#
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
namerequired | string | |
plan_idrequired | string | |
statusrequired | "active" | "suspended" | "deleting" |
Problem#
The single error envelope (api.md §3.2).
model_config.extra = "allow" carries the code-specific extras — required and available on insufficient_credits, for instance — without a subclass per code.
| Field | Type | Notes |
|---|---|---|
coderequired | ErrorCode | |
detail | string | null | |
errors | ProblemField[] | |
instance | string | null | |
request_id | string | null | |
statusrequired | integer | |
titlerequired | string | |
typerequired | string |
ProblemField#
One field-level validation failure inside Problem.errors.
| Field | Type | Notes |
|---|---|---|
fieldrequired | string | |
messagerequired | string |
QualityAssessment#
| Field | Type | Notes |
|---|---|---|
print_readiness | "not_assessed" | |
reason_codes | string[] | |
status | "not_assessed" | "needs_review" | "passed" | "failed" |
RecommendationAssessment#
Source-wall prediction at one size, never a certificate of the repaired print.
| Field | Type | Notes |
|---|---|---|
clearance_basis | "shell_count_heuristic" | "unavailable" | |
measurement_confidence | "unavailable" | "limited" | |
open_surface_fraction | number | null | |
predicted_minimum_size_mm | number | null | |
process | string | null | |
reason_codes | string[] | |
source_below_wall_fraction | number | null | |
source_below_wall_fraction_lower | number | null | |
source_below_wall_fraction_upper | number | null | |
status | "not_assessed" | "needs_review" | |
target_mm | number | null | |
verified_minimum_size_mm | number | null | |
wall_basis | "unavailable" | "measured" | "percentile_interpolation" | |
wall_floor_mm | number | null | |
wall_quantile_sizes_mm | map<string, number> |
RepairIssue#
| Field | Type | Notes |
|---|---|---|
descriptionrequired | string | |
fixedrequired | boolean | |
namerequired | string | |
severityrequired | "critical" | "warning" | "info" |
RepairParams#
Bounds follow the 3D Prep Pro request schema kept for continuity (api.md §6).
| Field | Type | Notes |
|---|---|---|
clearance_mm | number | |
close_holes_mm | number | |
cut_transparent | boolean | |
hollow_mm | number | |
mix_textures | boolean | |
preserve_shells | boolean | |
printer | "mimaki" | "fdm" | null | |
profile | "recommended" | "character" | "mechanical" | "vehicle" | "custom" | |
quality | "draft" | "standard" | "high" | |
scale | Scale | |
smoothing | Smoothing | |
target_faces | integer | |
thickness | Thickness | |
wall_thickness_mm | number |
RepairProfile#
| Field | Type | Notes |
|---|---|---|
descriptionrequired | string | |
idrequired | "recommended" | "character" | "mechanical" | "vehicle" | "custom" | |
paramsrequired | object |
RepairProfileList#
| Field | Type | Notes |
|---|---|---|
datarequired | RepairProfile[] |
RepairResult#
Before/after comparison; shape follows the Windows worker's result document.
| Field | Type | Notes |
|---|---|---|
afterrequired | Analysis | |
applied | AppliedRepair | null | |
beforerequired | Analysis | |
improvements | string[] | |
issues | RepairIssue[] | |
output_bytesrequired | integer | |
printability_scorerequired | integer | |
quality | QualityAssessment | |
schema_version | "1" | |
simulatedrequired | boolean |
ResumableFileUpload#
| Field | Type | Notes |
|---|---|---|
filerequired | File | |
uploadrequired | ResumableUpload |
ResumableUpload#
An S3 multipart upload (api.md §4.1).
parts lists only the parts the store does not hold yet, each with its own URL. Send them in any order or in parallel, then complete the file. Replaying the request that created the file returns fresh URLs for the parts still missing; parts already sent are kept.
| Field | Type | Notes |
|---|---|---|
expires_atrequired | string (date-time) | |
method | "PUT" | |
part_size_bytesrequired | integer | |
partsrequired | UploadPart[] | |
protocol | "s3_multipart" |
RotateApiKey#
| Field | Type | Notes |
|---|---|---|
grace_seconds | integer |
Scale#
| Field | Type | Notes |
|---|---|---|
mode | "none" | "target" | "multiplier" | |
unit | "mm" | "cm" | "in" | |
value | number | null |
Scope#
files:readfiles:writejobs:readjobs:writeartifacts:readwebhooks:managekeys:manageusage:readorg:readadmin:billing
SizeBand#
| Field | Type | Notes |
|---|---|---|
up_to_mmrequired | number | |
wall_mmrequired | number |
Smoothing#
| Field | Type | Notes |
|---|---|---|
clr | integer | |
post_construct | integer | |
pre_smooth | boolean | null |
TechnologyRow#
| Field | Type | Notes |
|---|---|---|
gap_assembled_mmrequired | number | null | |
gap_inside_mmrequired | number | null | |
gap_moving_mmrequired | number | null | |
hole_countrequired | integer | null | |
hole_min_diameter_mmrequired | number | null | |
interiorrequired | "closed_ok" | "needs_holes" | "not_offered" | |
labelrequired | string | |
materialrequired | string | |
processrequired | string | |
sourcerequired | string | |
wall_by_size | SizeBand[] | null | |
wall_min_mmrequired | number | null |
TechnologyTable#
| Field | Type | Notes |
|---|---|---|
gap_floor_mmrequired | number | |
noticerequired | DataNotice | |
rowsrequired | TechnologyRow[] | |
versionrequired | integer |
Thickness#
The thickness stage's instrument (engine thicknessMethod, Settings.h) and its target.
medial measures every wall with the maximum inscribed ball (orientation- and curvature-invariant, engine MedialThickening), pushes the measured deficit along the caliper axis and caps it by the free room on each side; with structural on, the beam reduction raises the target on the shank of a thin feature that fails under tip_load_n at target_sf. lattice is the voxel heatmap the 3D Prep Pro pipeline ships. The tip load is the constant the coupon matrix has not measured (engine docs/medial-axis.md §6): it is echoed on every result and never a hidden default.
| Field | Type | Notes |
|---|---|---|
method | "medial" | "lattice" | |
structural | boolean | |
target_sf | number | |
tip_load_n | number |
ToolResult#
The engine's stdout envelope result object, path keys removed by the worker.
| Field | Type | Notes |
|---|---|---|
resultrequired | object | |
schema_version | "1" | |
simulatedrequired | boolean | |
toolrequired | "measure" | "convert" | "cut" | "lattice" | "label" | "mirror" | "remove_small_parts" | "thickness" | "analyze" | "medial" | "structural.components" | "structural.fea" | "structural.heatmap" | "structural.fragility" | "structural.measure_all" | "structural.relief" |
Transfer#
| Field | Type | Notes |
|---|---|---|
expires_atrequired | string (date-time) | |
headers | map<string, string> | |
methodrequired | "GET" | "PUT" | |
urlrequired | string |
UploadPart#
One part of a multipart upload: PUT exactly size_bytes from offset to url.
| Field | Type | Notes |
|---|---|---|
offsetrequired | integer | |
part_numberrequired | integer | |
size_bytesrequired | integer | |
urlrequired | string |
WebhookEndpoint#
| Field | Type | Notes |
|---|---|---|
created_atrequired | string (date-time) | |
enabledrequired | boolean | |
idrequired | string | |
livemoderequired | boolean | True when registered with a live key. An endpoint is told only about jobs of its own mode, and only keys of that mode can list, name or delete it. |
urlrequired | string |
WebhookEndpointPage#
| Field | Type | Notes |
|---|---|---|
datarequired | WebhookEndpoint[] | Every endpoint of the key's mode, oldest first. The list is not paged: an account holds at most 20 endpoints of each mode. |