The design object
A printable model: its files, the materials it can be printed in and how it is produced. Every design is reviewed by 3DAPI before it can be manufactured.
Attributes
- idstring
Unique identifier of the design, prefixed with
dsg_. Treat it as an opaque string: store it and compare it, never parse it. - objectstring
Names the type of this object. Always
design. - namestring
Display name, usually the name of the uploaded file.
- ownerobject
The product or stock this design belongs to. A design always belongs to exactly one of them; check
object. - reviewReview
Review by 3DAPI. Anything that will be manufactured is reviewed before it can be sold or produced.
- filesarray of DesignFile
The model files of this design. Usually exactly one.
- materialsobject
Which materials the design may be printed in.
modetells the two shapes apart. - manufacturingobject
How the design is produced.
- created_attimestamp
Point in time, ISO 8601 in UTC.
- updated_attimestamp
Point in time, ISO 8601 in UTC.
{
"id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design",
"name": "tracker.3mf",
"owner": {
"id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "product",
"name": "PR Tracker"
},
"review": {
"status": "approved",
"reason": null,
"reviewed_at": "2026-04-21T09:10:00Z"
},
"files": [
{
"id": "dfl_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design_file",
"name": "tracker.3mf",
"format": "3mf",
"size_bytes": 2758723,
"download_url": "https://files.example.com/tracker.3mf?signature=abc",
"uploaded_at": "2026-04-21T07:34:06Z",
"production_version": {
"name": "farm-settings-tracker.3mf",
"format": "3mf",
"size_bytes": 2761090,
"download_url": "https://files.example.com/farm-settings-tracker.3mf?signature=def",
"prepared_at": "2026-04-21T07:36:40Z"
}
}
],
"materials": {
"mode": "single",
"allowed": [
{
"id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "material",
"name": "PLA Black",
"custom": false
},
{
"id": null,
"object": "material",
"name": "PETG Matte",
"custom": true
}
]
},
"manufacturing": {
"colors": 1,
"requires_ams": false,
"assembly_required": true,
"farm_instructions": null,
"extra_parts_note": "Two M2 screws"
},
"created_at": "2026-04-21T07:34:06Z",
"updated_at": "2026-04-21T09:10:00Z"
}Add a design to a product
POST/
- Credentials
- An API key with the
products:writescope (full access includes every scope). A signed-in dashboard session works too. - For
- Designers
- Operation id
add_design
Adds a model file to a product, with the materials it may be printed in. The new design is pending review by 3DAPI, so the product is too until it is approved. Designers only.
Path parameters
- idstringRequired
Unique identifier of the product, prefixed with
prd_. Treat it as an opaque string: store it and compare it, never parse it.
Headers
- Idempotency-Keystring
Any unique string, for example a UUID. Sending the same request again with the same key within 24 hours returns the first response without doing anything twice. Reusing a key with a different body is refused with
idempotency_key_reused. A refused request (4xx) frees the key so you can correct and resend it; a server error (5xx) is kept and returned again, because the write may already have happened: check the resource before retrying with a new key.
Request body
- fileobjectRequired
The model file, uploaded first with purpose
design_file. - namestring or null
Display name. The file name when omitted.
- materialsobjectRequired
Returns201 Created
The new design, pending review. Returns the design object.
Responses
- 201
The new design, pending review.
- 400
The request is invalid.
details.errorslists each problem (validation_failed), or anexpand[]path is unknown (invalid_expand). - 401
Credentials are missing (
missing_credentials), the API key is unknown or inactive (invalid_api_key), the session expired (invalid_session), or both a key and a session were sent (ambiguous_credentials). - 403
The credentials are valid but not allowed to do this: a scope is missing (
missing_scope), the endpoint is for another kind of account (actor_not_allowed) or another kind of credential (credential_not_allowed), the account may no longer use the API (account_blacklisted), or the account must change something first, in which casedetails.fix_urllinks to the dashboard page that fixes it. - 404
You have no product with this id (
product_not_found). - 422
material_not_found,combination_slots_mismatch, or the file upload cannot be used:unknown_upload,upload_expired,upload_purpose_mismatch,upload_missing,upload_already_used. - 429
Too many requests (
rate_limited): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in theRetry-Afterheader, then retry;detailshaslimit,window_seconds,reset_atandretry_after_seconds.
Errors use the error object.
curl -X POST "https://public-api.dapi.digital/v2/products/prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu/designs" \
-H "x-api-key: $DAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file": {
"upload": "upl_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu"
},
"name": "Tracker lid",
"materials": {
"mode": "single",
"allowed": [
"mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu"
]
}
}'{
"id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design",
"name": "tracker.3mf",
"owner": {
"id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "product",
"name": "PR Tracker"
},
"review": {
"status": "pending",
"reason": null,
"reviewed_at": null
},
"files": [
{
"id": "dfl_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design_file",
"name": "tracker.3mf",
"format": "3mf",
"size_bytes": 2758723,
"download_url": "https://files.example.com/tracker.3mf?signature=abc",
"uploaded_at": "2026-04-21T07:34:06Z",
"production_version": {
"name": "farm-settings-tracker.3mf",
"format": "3mf",
"size_bytes": 2761090,
"download_url": "https://files.example.com/farm-settings-tracker.3mf?signature=def",
"prepared_at": "2026-04-21T07:36:40Z"
}
}
],
"materials": {
"mode": "single",
"allowed": [
{
"id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "material",
"name": "PLA Black",
"custom": false
},
{
"id": null,
"object": "material",
"name": "PETG Matte",
"custom": true
}
]
},
"manufacturing": {
"colors": 1,
"requires_ams": false,
"assembly_required": true,
"farm_instructions": null,
"extra_parts_note": "Two M2 screws"
},
"created_at": "2026-04-21T07:34:06Z",
"updated_at": "2026-04-21T09:10:00Z"
}Get a design
GET/
- Credentials
- An API key with the
products:readorstocks:readscope (full access includes every scope). A signed-in dashboard session works too. - For
- Designers
- Operation id
get_design
Returns one of your designs: its files with download links, allowed materials, production settings and review status. Designers only.
Path parameters
- idstringRequired
Unique identifier of the design, prefixed with
dsg_. Treat it as an opaque string: store it and compare it, never parse it.
Returns200 OK
The design. Returns the design object.
Responses
- 200
The design.
- 401
Credentials are missing (
missing_credentials), the API key is unknown or inactive (invalid_api_key), the session expired (invalid_session), or both a key and a session were sent (ambiguous_credentials). - 403
The credentials are valid but not allowed to do this: a scope is missing (
missing_scope), the endpoint is for another kind of account (actor_not_allowed) or another kind of credential (credential_not_allowed), the account may no longer use the API (account_blacklisted), or the account must change something first, in which casedetails.fix_urllinks to the dashboard page that fixes it. - 404
You have no design with this id (
design_not_found). - 429
Too many requests (
rate_limited): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in theRetry-Afterheader, then retry;detailshaslimit,window_seconds,reset_atandretry_after_seconds.
Errors use the error object.
curl "https://public-api.dapi.digital/v2/designs/dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
-H "x-api-key: $DAPI_API_KEY"{
"id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design",
"name": "tracker.3mf",
"owner": {
"id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "product",
"name": "PR Tracker"
},
"review": {
"status": "approved",
"reason": null,
"reviewed_at": "2026-04-21T09:10:00Z"
},
"files": [
{
"id": "dfl_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design_file",
"name": "tracker.3mf",
"format": "3mf",
"size_bytes": 2758723,
"download_url": "https://files.example.com/tracker.3mf?signature=abc",
"uploaded_at": "2026-04-21T07:34:06Z",
"production_version": {
"name": "farm-settings-tracker.3mf",
"format": "3mf",
"size_bytes": 2761090,
"download_url": "https://files.example.com/farm-settings-tracker.3mf?signature=def",
"prepared_at": "2026-04-21T07:36:40Z"
}
}
],
"materials": {
"mode": "single",
"allowed": [
{
"id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "material",
"name": "PLA Black",
"custom": false
},
{
"id": null,
"object": "material",
"name": "PETG Matte",
"custom": true
}
]
},
"manufacturing": {
"colors": 1,
"requires_ams": false,
"assembly_required": true,
"farm_instructions": null,
"extra_parts_note": "Two M2 screws"
},
"created_at": "2026-04-21T07:34:06Z",
"updated_at": "2026-04-21T09:10:00Z"
}Update a design
PATCH/
- Credentials
- An API key with the
products:writescope (full access includes every scope). A signed-in dashboard session works too. - For
- Designers
- Operation id
update_design
Changes a design name or its allowed materials. Sends designs back to review by 3DAPI: a new design file; turning assembly on or off (every design); a newly added extra that is not approved yet (every design); and, per design, a change to its custom materials, single or multicolor mode, color count or multi-material (AMS) requirement. Nothing else does. Designers only.
Path parameters
- idstringRequired
Unique identifier of the design, prefixed with
dsg_. Treat it as an opaque string: store it and compare it, never parse it.
Request body
- namestring or null
Display name. The file name when omitted.
- materialsobject
Returns200 OK
The updated design. Returns the design object.
Responses
- 200
The updated design.
- 400
The request is invalid.
details.errorslists each problem (validation_failed), or anexpand[]path is unknown (invalid_expand). - 401
Credentials are missing (
missing_credentials), the API key is unknown or inactive (invalid_api_key), the session expired (invalid_session), or both a key and a session were sent (ambiguous_credentials). - 403
The credentials are valid but not allowed to do this: a scope is missing (
missing_scope), the endpoint is for another kind of account (actor_not_allowed) or another kind of credential (credential_not_allowed), the account may no longer use the API (account_blacklisted), or the account must change something first, in which casedetails.fix_urllinks to the dashboard page that fixes it. - 404
You have no design with this id (
design_not_found). - 409
The design belongs to a stock (
design_belongs_to_stock); stock designs are changed from the dashboard for now. - 422
A material a variant still uses was removed (
material_in_use),material_not_foundorcombination_slots_mismatch. - 429
Too many requests (
rate_limited): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in theRetry-Afterheader, then retry;detailshaslimit,window_seconds,reset_atandretry_after_seconds.
Errors use the error object.
curl -X PATCH "https://public-api.dapi.digital/v2/designs/dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
-H "x-api-key: $DAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"materials": {
"mode": "single",
"allowed": [
"mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
{
"custom": "Silk white PLA"
}
]
}
}'{
"id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design",
"name": "tracker.3mf",
"owner": {
"id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "product",
"name": "PR Tracker"
},
"review": {
"status": "approved",
"reason": null,
"reviewed_at": "2026-04-21T09:10:00Z"
},
"files": [
{
"id": "dfl_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design_file",
"name": "tracker.3mf",
"format": "3mf",
"size_bytes": 2758723,
"download_url": "https://files.example.com/tracker.3mf?signature=abc",
"uploaded_at": "2026-04-21T07:34:06Z",
"production_version": {
"name": "farm-settings-tracker.3mf",
"format": "3mf",
"size_bytes": 2761090,
"download_url": "https://files.example.com/farm-settings-tracker.3mf?signature=def",
"prepared_at": "2026-04-21T07:36:40Z"
}
}
],
"materials": {
"mode": "single",
"allowed": [
{
"id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "material",
"name": "PLA Black",
"custom": false
},
{
"id": null,
"object": "material",
"name": "PETG Matte",
"custom": true
}
]
},
"manufacturing": {
"colors": 1,
"requires_ams": false,
"assembly_required": true,
"farm_instructions": null,
"extra_parts_note": "Two M2 screws"
},
"created_at": "2026-04-21T07:34:06Z",
"updated_at": "2026-04-21T09:10:00Z"
}Delete a design
DELETE/
- Credentials
- An API key with the
products:writescope (full access includes every scope). A signed-in dashboard session works too. - For
- Designers
- Operation id
delete_design
Removes a design from its product. Not possible while a variant uses it: change or delete those variants first. Designers only.
Path parameters
- idstringRequired
Unique identifier of the design, prefixed with
dsg_. Treat it as an opaque string: store it and compare it, never parse it.
Returns200 OK
The design was deleted.
Responses
- 200
The design was deleted.
- 401
Credentials are missing (
missing_credentials), the API key is unknown or inactive (invalid_api_key), the session expired (invalid_session), or both a key and a session were sent (ambiguous_credentials). - 403
The credentials are valid but not allowed to do this: a scope is missing (
missing_scope), the endpoint is for another kind of account (actor_not_allowed) or another kind of credential (credential_not_allowed), the account may no longer use the API (account_blacklisted), or the account must change something first, in which casedetails.fix_urllinks to the dashboard page that fixes it. - 404
You have no design with this id (
design_not_found). - 409
A variant still uses this design (
design_in_use), or the design belongs to a stock (design_belongs_to_stock). - 429
Too many requests (
rate_limited): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in theRetry-Afterheader, then retry;detailshaslimit,window_seconds,reset_atandretry_after_seconds.
Errors use the error object.
curl -X DELETE "https://public-api.dapi.digital/v2/designs/dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
-H "x-api-key: $DAPI_API_KEY"{
"id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
"object": "design",
"deleted": true
}