Orders

View as Markdown

Orders for your products, from every channel.

This page covers the order object and the import issue object.

The order object

An order for your products, from any channel: what was ordered, where it ships, its status, what was charged and what you earn.

Attributes

  • idstring

    Unique identifier of the order, prefixed with ord_. Treat it as an opaque string: store it and compare it, never parse it.

  • objectstring

    Names the type of this object. Always order.

  • numberstring

    Human-readable order number, the one your customers and 3DAPI support use.

  • channelOrderChannel

    Where the order came from:

    • storefront: a buyer checked out on your 3DAPI store and paid by card.
    • shopify: imported from your Shopify store.
    • shipstation: imported from ShipStation.
    • api: created through the API.
    • manual: placed by you from the dashboard, charged at cost.
    • replacement: a reprint after a quality issue; charges.paid_by says who paid for it.
    Possible valuesstorefrontshopifyshipstationapimanualreplacement
  • statusOrderStatus

    Where the order is:

    • awaiting_payment: you still have to pay for it.
    • paid: paid, waiting to be assigned to a production partner.
    • assigned: a production partner has it; production has not started.
    • in_production: being made.
    • shipped: on its way to the customer. shipping has the tracking details.
    • completed: delivered and settled.
    • on_hold: there is not enough stock to fulfil it.
    • rejected: the production partner refused it.
    • returned: sent back after shipping.
    • cancelled: cancelled, usually after a full refund.
    Possible valuesawaiting_paymentpaidassignedin_productionshippedcompletedon_holdrejectedreturnedcancelled
  • customerOrderCustomer or null

    Who ordered. Personal data: null unless the API key has the orders:read_customer scope.

  • shipping_addressOrderShippingAddress

    Where the order ships. The country is always shown because it decides shipping and VAT; the rest is personal data.

  • chargesOrderCharges

    What the payer was charged for the order.

  • earningsOrderEarnings or null

    What you earn from a buyer-paid order and what was taken off it. Null when you paid for the order yourself.

  • shippingOrderShipping

    Shipping details.

  • externalobject or null

    The original order in the sales channel, for Shopify and ShipStation orders. Null otherwise.

  • customer_notesstring or null

    Notes the customer left at checkout. Null without the orders:read_customer scope, since buyers often write personal details here.

  • qcobject

    Quality control on this order. List QC tickets with order for the details.

  • created_attimestamp

    Point in time, ISO 8601 in UTC.

  • updated_attimestamp

    Point in time, ISO 8601 in UTC.

  • item_countinteger

    Units ordered across all lines.

    Range at least 0.
  • itemsarray of OrderItem

    The order lines.

  • refundsarray of OrderRefund

    Completed refunds, oldest first. Empty when none.

The order object
{
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  
}

List orders

GET/v2/orders

Credentials
An API key with the orders:read scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
list_orders

Lists orders for your products from every channel, newest first. Items and refunds are left out to stay small; get the order for them, or pass expand[]=items. Customer details need the orders:read_customer scope. Designers only.

Query parameters

  • statusarray of OrderStatus

    Only orders in these states. Repeat for several, for example status=paid&status=assigned.

    Possible valuesawaiting_paymentpaidassignedin_productionshippedcompletedon_holdrejectedreturnedcancelled
  • channelarray of OrderChannel

    Only orders from these channels.

    Possible valuesstorefrontshopifyshipstationapimanualreplacement
  • searchstring

    Matches the order number, or the customer name or email when the key has orders:read_customer.

  • created_aftertimestamp

    Only orders placed after this time.

  • created_beforetimestamp

    Only orders placed before this time.

  • updated_aftertimestamp

    Only orders changed after this time. Use it to sync status changes since your last poll.

  • sortstring

    Order of results. A leading - means descending.

    Possible values-created_atcreated_at-updated_at
    Defaults to "-created_at".
  • limitinteger

    How many results per page, from 1 to 100.

    Range 1 to 100. Defaults to 20.
  • cursorstring

    Where to continue from: the next_cursor of the previous page. Omit for the first page.

  • expand[]array of string

    Replace references with full objects. Repeat the parameter for several paths, for example expand[]=items. Unknown paths are rejected with invalid_expand.

Returns200 OK

A page of orders.

Responses

  • 200

    A page of orders.

  • 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.

  • 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/orders
curl "https://public-api.dapi.digital/v2/orders" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order",
      "number": "PV-SCN-1701A372",
      "channel": "storefront",
      "status": "in_production",
      "customer": {
        "name": "Ana Popescu",
        "email": "ana@example.com",
        "phone": null,
        "company": null
      },
      "shipping_address": {
        "formatted": "Str. Test 1, Cluj, RO",
        "city": "Cluj",
        "country": "Romania",
        "country_code": "RO"
      },
      "charges": {
        "paid_by": "buyer",
        "items": {
          "amount": 1800,
          "currency": "usd"
        },
        "shipping": {
          "amount": 600,
          "currency": "usd"
        },
        "vat": {
          "amount": {
            "amount": 0,
            "currency": "usd"
          },
          "rate": 0,
          "included": false,
          "country": null
        },
        "sample_credit": null,
        "total": {
          "amount": 2400,
          "currency": "usd"
        }
      },
      "earnings": {
        "manufacturing": {
          "amount": 900,
          "currency": "usd"
        },
        "platform_fee": {
          "amount": 300,
          "currency": "usd"
        },
        "payment_processing": {
          "amount": 102,
          "currency": "usd"
        },
        "refunded": {
          "amount": 0,
          "currency": "usd"
        },
        "net": {
          "amount": 498,
          "currency": "usd"
        }
      },
      "shipping": {
        "tier": "small",
        "carrier": null,
        "tracking_number": null,
        "shipped_at": null
      },
      "external": null,
      "customer_notes": null,
      "qc": {
        "open_tickets": 1,
        "blocks_shipping": true
      },
      "created_at": "2026-10-09T08:39:29Z",
      "updated_at": "2026-10-09T08:40:02Z",
      "item_count": 1
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create an order

POST/v2/orders

Credentials
An API key with the orders:write scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
create_order

Orders your own variants for a customer, for example a sale on your own website. You pay at cost (production price, shipping and VAT) from your wallet; if the balance is short, the difference is charged to your saved card. The order comes back paid, numbered 2AP..., with channel: api, and goes to production. If payment fails, no order is created. Designers only.

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

  • itemsarray of objectRequired

    What to produce and ship: 1 to 100 lines of 1 to 1000 units each.

  • customerobjectRequired

    Who receives the order.

  • shipping_addressobjectRequired

    Where to ship. Stored as one formatted line plus the country, which the order returns as shipping_address.formatted.

  • referencestring or null

    Your own order id, for matching. Letters, digits, - and _. Returned as external.channel_order_id and searchable.

  • customer_notesstring or null

    Free-text notes for the order, up to 2000 characters. Returned as customer_notes, which is only shown to keys with the orders:read_customer scope.

  • discount_codestring or null

    A discount code from 3DAPI.

  • use_sample_creditboolean

    Spend your sample credit on this order first. How much applies is decided by 3DAPI and shown in charges.sample_credit.

    Defaults to false.

Returns201 Created

The order, paid. Returns the order object.

Responses

  • 201

    The order, paid.

  • 400

    The request is invalid (validation_failed), or a discount code is unknown (invalid_discount_code).

  • 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).

  • 402

    Payment failed: no saved card to cover the shortfall, or the card was declined (payment_failed). No order was created.

  • 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.

  • 422

    A variant is not orderable: unknown, inactive, or its product is not approved (variant_not_orderable).

  • 429

    Too many requests (rate_limited): the limit is 500 per minute per API key (or signed-in user), plus 60 per minute per API key (or signed-in user) for quote, upload, order and payment operations. 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/orders
curl -X POST "https://public-api.dapi.digital/v2/orders" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "variant": "var_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "quantity": 2
    }
  ],
  "customer": {
    "name": "Ana Popescu",
    "email": "ana@example.com",
    "phone": "+40712345678"
  },
  "shipping_address": {
    "line1": "Str. Test 1",
    "city": "Cluj-Napoca",
    "postal_code": "400001",
    "country_code": "RO"
  },
  "reference": "SHOP-10023"
}'
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "2AP7KD2XQ",
  "channel": "api",
  "status": "paid",
  "customer": {
    "name": "Ana Popescu",
    "email": "ana@example.com",
    "phone": null,
    "company": null
  },
  "shipping_address": {
    "formatted": "Str. Test 1, Cluj, RO",
    "city": "Cluj",
    "country": "Romania",
    "country_code": "RO"
  },
  "charges": {
    "paid_by": "you",
    "items": {
      "amount": 1800,
      "currency": "usd"
    },
    "shipping": {
      "amount": 600,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 2400,
      "currency": "usd"
    }
  },
  "earnings": null,
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "external": {
    "channel_order_id": "SHOP-10023",
    "channel_total": null
  },
  "customer_notes": null,
  "qc": {
    "open_tickets": 1,
    "blocks_shipping": true
  },
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 1,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "product": {
        "id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "product",
        "name": "Clicker"
      },
      "variant": {
        "id": "var_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "variant",
        "name": "Clicker Blue"
      },
      "sku": "CLICK-BLUE",
      "quantity": 1,
      "unit_price": {
        "amount": 1800,
        "currency": "usd"
      },
      "total": {
        "amount": 1800,
        "currency": "usd"
      },
      "stock_used": [],
      "fulfilled_from_stock": false
    }
  ],
  "refunds": []
}

Cancel an order

POST/v2/orders/{id}/cancel

Credentials
An API key with the orders:write scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
cancel_order

Cancels one of your orders while it is still paid (no production partner has started) and refunds it in full to where it was paid from. Wallet-paid orders come back cancelled at once; card-paid orders stay paid until the card refund completes, then become cancelled and order.cancelled is sent. Designers only.

Path parameters

  • idstringRequired

    Unique identifier of the order, prefixed with ord_. 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.

Returns200 OK

The order, cancelled or with its refund on the way. Returns the order object.

Responses

  • 200

    The order, cancelled or with its refund on the way.

  • 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 order with this id (order_not_found).

  • 409

    The order cannot be cancelled here (order_not_cancellable): it is past paid (contact support), a refund on it is already on the way, it is not an order you paid for yourself (API and manual orders only), it was created through API v1 (cancel those from the dashboard or contact support), it was paid by card and card refunds are unavailable, or the card refund was refused. The message says which; the order and your money are unchanged.

  • 429

    Too many requests (rate_limited): the limit is 500 per minute per API key (or signed-in user), plus 60 per minute per API key (or signed-in user) for quote, upload, order and payment operations. 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/orders/{id}/cancel
curl -X POST "https://public-api.dapi.digital/v2/orders/ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu/cancel" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "PV-SCN-1701A372",
  "channel": "storefront",
  "status": "cancelled",
  "customer": {
    "name": "Ana Popescu",
    "email": "ana@example.com",
    "phone": null,
    "company": null
  },
  "shipping_address": {
    "formatted": "Str. Test 1, Cluj, RO",
    "city": "Cluj",
    "country": "Romania",
    "country_code": "RO"
  },
  "charges": {
    "paid_by": "buyer",
    "items": {
      "amount": 1800,
      "currency": "usd"
    },
    "shipping": {
      "amount": 600,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 2400,
      "currency": "usd"
    }
  },
  "earnings": {
    "manufacturing": {
      "amount": 900,
      "currency": "usd"
    },
    "platform_fee": {
      "amount": 300,
      "currency": "usd"
    },
    "payment_processing": {
      "amount": 102,
      "currency": "usd"
    },
    "refunded": {
      "amount": 0,
      "currency": "usd"
    },
    "net": {
      "amount": 498,
      "currency": "usd"
    }
  },
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "external": null,
  "customer_notes": null,
  "qc": {
    "open_tickets": 1,
    "blocks_shipping": true
  },
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 1,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "product": {
        "id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "product",
        "name": "Clicker"
      },
      "variant": {
        "id": "var_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "variant",
        "name": "Clicker Blue"
      },
      "sku": "CLICK-BLUE",
      "quantity": 1,
      "unit_price": {
        "amount": 1800,
        "currency": "usd"
      },
      "total": {
        "amount": 1800,
        "currency": "usd"
      },
      "stock_used": [],
      "fulfilled_from_stock": false
    }
  ],
  "refunds": []
}

Get an order

GET/v2/orders/{id}

Credentials
An API key with the orders:read scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
get_order

Returns one order with its items, charges, earnings, shipping and refunds. Customer details need the orders:read_customer scope. Designers only.

Path parameters

  • idstringRequired

    Unique identifier of the order, prefixed with ord_. Treat it as an opaque string: store it and compare it, never parse it.

Returns200 OK

The order. Returns the order object.

Responses

  • 200

    The order.

  • 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 order with this id (order_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/orders/{id}
curl "https://public-api.dapi.digital/v2/orders/ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "PV-SCN-1701A372",
  "channel": "storefront",
  "status": "in_production",
  "customer": {
    "name": "Ana Popescu",
    "email": "ana@example.com",
    "phone": null,
    "company": null
  },
  "shipping_address": {
    "formatted": "Str. Test 1, Cluj, RO",
    "city": "Cluj",
    "country": "Romania",
    "country_code": "RO"
  },
  "charges": {
    "paid_by": "buyer",
    "items": {
      "amount": 1800,
      "currency": "usd"
    },
    "shipping": {
      "amount": 600,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 2400,
      "currency": "usd"
    }
  },
  "earnings": {
    "manufacturing": {
      "amount": 900,
      "currency": "usd"
    },
    "platform_fee": {
      "amount": 300,
      "currency": "usd"
    },
    "payment_processing": {
      "amount": 102,
      "currency": "usd"
    },
    "refunded": {
      "amount": 0,
      "currency": "usd"
    },
    "net": {
      "amount": 498,
      "currency": "usd"
    }
  },
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "external": null,
  "customer_notes": null,
  "qc": {
    "open_tickets": 1,
    "blocks_shipping": true
  },
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 1,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "product": {
        "id": "prd_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "product",
        "name": "Clicker"
      },
      "variant": {
        "id": "var_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "variant",
        "name": "Clicker Blue"
      },
      "sku": "CLICK-BLUE",
      "quantity": 1,
      "unit_price": {
        "amount": 1800,
        "currency": "usd"
      },
      "total": {
        "amount": 1800,
        "currency": "usd"
      },
      "stock_used": [],
      "fulfilled_from_stock": false
    }
  ],
  "refunds": []
}

The import issue object

An order from a connected sales channel that could not be imported, and why. Retry or dismiss it from the dashboard; once the order imports, the issue disappears from this list.

Attributes

  • idstring

    Unique identifier of the import issue, prefixed with imp_. Treat it as an opaque string: store it and compare it, never parse it.

  • objectstring

    Names the type of this object. Always import_issue.

  • channelImportChannel

    The sales channel the order came from. Only shipstation today; shopify joins when the Shopify integration ships.

  • channel_order_idstring

    The order id in the sales channel.

  • channel_order_numberstring or null

    The order number your customer sees in the sales channel.

  • ordered_attimestamp or null

    When the customer placed the order in the sales channel.

  • reasonImportIssueReason

    Why the order could not be imported:

    • unknown_sku: at least one item has a SKU that matches none of your variants. Give a variant that SKU, then import the order again.
    • no_items: the order arrived with no items to make, or only lines such as shipping or discounts. Add the products in the sales channel, then import it again.
    • variant_not_found: an item's SKU is linked to a variant that no longer exists. Link the SKU to a current variant, then import the order again.
    • multiple_sellers: the order's SKUs are linked to products of more than one seller, and an order is made for one seller only. Link every SKU to your own variants or split the order, then import it again.
    Possible valuesunknown_skuno_itemsvariant_not_foundmultiple_sellers
  • messagestring

    What went wrong and how to fix it, ready to show to a person.

  • unmatched_itemsarray of object

    The items that matched none of your variants. Filled for unknown_sku only; empty for the other reasons.

  • created_attimestamp

    When the import failed.

The import issue object
{
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  
}

List import issues

GET/v2/import-issues

Credentials
An API key with the orders:read scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
list_import_issues

Lists orders from your connected sales channels that could not be imported, newest first, with what to fix. Filter on sku to find every order one missing SKU mapping blocks. Designers only.

Query parameters

  • channelstring

    Only this channel.

    Always shipstation
  • reasonstring

    Only this reason.

    Possible valuesunknown_skuno_itemsvariant_not_foundmultiple_sellers
  • skustring

    Only issues with an unmatched item of exactly this SKU. Use it to find every order one missing mapping is blocking.

  • ordered_aftertimestamp

    Only orders placed after this time.

  • ordered_beforetimestamp

    Only orders placed before this time.

  • sortstring

    Order of results. A leading - means newest first.

    Possible values-ordered_atordered_at-created_at
    Defaults to "-ordered_at".
  • limitinteger

    How many results per page, from 1 to 100.

    Range 1 to 100. Defaults to 20.
  • cursorstring

    Where to continue from: the next_cursor of the previous page. Omit for the first page.

Returns200 OK

A page of import issues.

Responses

  • 200

    A page of import issues.

  • 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.

  • 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/import-issues
curl "https://public-api.dapi.digital/v2/import-issues" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "id": "imp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "import_issue",
      "channel": "shipstation",
      "channel_order_id": "193554871",
      "channel_order_number": "3002",
      "ordered_at": "2026-10-07T14:20:54Z",
      "reason": "unknown_sku",
      "message": "1 item has a SKU that matches none of your variants. Give the variant this SKU, then import the order again.",
      "unmatched_items": [
        {
          "sku": "PR-TRACKERV2-465KG",
          "name": "PR Tracker V2 - 465 Kilograms (kg) Plates",
          "quantity": 1
        }
      ],
      "created_at": "2026-10-07T14:21:10Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Get an import issue

GET/v2/import-issues/{id}

Credentials
An API key with the orders:read scope (full access includes every scope). A signed-in dashboard session works too.
For
Designers
Operation id
get_import_issue

Returns one order that could not be imported. Designers only.

Path parameters

  • idstringRequired

    Unique identifier of the import issue, prefixed with imp_. Treat it as an opaque string: store it and compare it, never parse it.

Returns200 OK

The import issue. Returns the import issue object.

Responses

  • 200

    The import issue.

  • 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 import issue with this id (import_issue_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/import-issues/{id}
curl "https://public-api.dapi.digital/v2/import-issues/imp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "imp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "import_issue",
  "channel": "shipstation",
  "channel_order_id": "193554871",
  "channel_order_number": "3002",
  "ordered_at": "2026-10-07T14:20:54Z",
  "reason": "unknown_sku",
  "message": "1 item has a SKU that matches none of your variants. Give the variant this SKU, then import the order again.",
  "unmatched_items": [
    {
      "sku": "PR-TRACKERV2-465KG",
      "name": "PR Tracker V2 - 465 Kilograms (kg) Plates",
      "quantity": 1
    }
  ],
  "created_at": "2026-10-07T14:21:10Z"
}