Designs

View as Markdown

Printable model files.

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. mode tells 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.

The design object
{
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  
}

Add a design to a product

POST/v2/products/{id}/designs

Credentials
An API key with the products:write scope (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.errors lists each problem (validation_failed), or an expand[] 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 case details.fix_url links 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 the Retry-After header, then retry; details has limit, window_seconds, reset_at and retry_after_seconds.

Errors use the error object.

POST/v2/products/{id}/designs
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"
    ]
  }
}'
Response
{
  "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/v2/designs/{id}

Credentials
An API key with the products:read or stocks:read scope (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 case details.fix_url links 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 the Retry-After header, then retry; details has limit, window_seconds, reset_at and retry_after_seconds.

Errors use the error object.

GET/v2/designs/{id}
curl "https://public-api.dapi.digital/v2/designs/dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "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/v2/designs/{id}

Credentials
An API key with the products:write scope (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.errors lists each problem (validation_failed), or an expand[] 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 case details.fix_url links 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_found or combination_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 the Retry-After header, then retry; details has limit, window_seconds, reset_at and retry_after_seconds.

Errors use the error object.

PATCH/v2/designs/{id}
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"
      }
    ]
  }
}'
Response
{
  "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/v2/designs/{id}

Credentials
An API key with the products:write scope (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 case details.fix_url links 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 the Retry-After header, then retry; details has limit, window_seconds, reset_at and retry_after_seconds.

Errors use the error object.

DELETE/v2/designs/{id}
curl -X DELETE "https://public-api.dapi.digital/v2/designs/dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "dsg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "design",
  "deleted": true
}