Integrator orders

View as Markdown

Orders integrators place for their own customers, paid from the wallet or through a hosted checkout. Integrators only.

The integrator order object

An order for prints of your quotes: what was ordered, where it ships, its status, what was charged and, in checkout mode, 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.

  • channelstring

    Which money flow the order follows.

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

  • customer_notesstring or null

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

  • created_attimestamp

    Point in time, ISO 8601 in UTC.

  • updated_attimestamp

    Point in time, ISO 8601 in UTC.

  • modestring

    wallet: you pay the production price plus shipping from your wallet (a shortfall is charged to your saved card). checkout: your customer pays the sales price you set through a hosted 3DAPI checkout and you earn the difference.

    Possible valuescheckoutwallet
  • checkoutobject or null

    The hosted checkout link in checkout mode, null in wallet mode.

  • item_countinteger

    Units ordered across all lines.

    Range at least 0.
  • itemsarray of IntegratorOrderItemOptional

    The order lines. In lists only present with expand[]=items.

  • refundsarray of object

    Completed refunds, oldest first, in lists too. Empty when none.

  • referencestring or null

    Your own order id, as you sent it.

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

List your orders

GET/v2/integrator/orders

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

Your orders, newest first, without their lines unless expand[]=items. Integrators only.

Query parameters

  • statusarray of OrderStatus

    Only orders in these statuses (repeatable).

    Possible valuesawaiting_paymentpaidassignedin_productionshippedcompletedon_holdrejectedreturnedcancelled
  • modestring

    wallet: you pay the production price plus shipping from your wallet (a shortfall is charged to your saved card). checkout: your customer pays the sales price you set through a hosted 3DAPI checkout and you earn the difference.

    Possible valuescheckoutwallet
  • created_aftertimestamp

    Only orders placed after this time.

  • created_beforetimestamp

    Only orders placed before this time.

  • referencestring

    Exact match on your own order id.

  • quotestring

    Only orders with a line from this quote.

  • searchstring

    Part of the order number or of your reference, case-insensitive. For example 7K2M finds 2AP7K2M9X, and 1042 finds SHOP-1042.

  • expand[]array of string

    items adds the order lines.

  • 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 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/integrator/orders
curl "https://public-api.dapi.digital/v2/integrator/orders" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "object": "list",
  "data": [
    [
      {
        "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "order",
        "number": "2AP7K2M9X",
        "channel": "integrator_wallet",
        "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": 5000,
            "currency": "usd"
          },
          "shipping": {
            "amount": 800,
            "currency": "usd"
          },
          "vat": {
            "amount": {
              "amount": 0,
              "currency": "usd"
            },
            "rate": 0,
            "included": false,
            "country": null
          },
          "sample_credit": null,
          "total": {
            "amount": 5800,
            "currency": "usd"
          }
        },
        "earnings": null,
        "shipping": {
          "tier": "small",
          "carrier": null,
          "tracking_number": null,
          "shipped_at": null
        },
        "customer_notes": null,
        "created_at": "2026-10-09T08:39:29Z",
        "updated_at": "2026-10-09T08:40:02Z",
        "item_count": 10,
        "mode": "wallet",
        "checkout": null,
        "refunds": [],
        "reference": "SHOP-1042"
      }
    ]
  ],
  "has_more": false,
  "next_cursor": null
}

Order prints of your quotes

POST/v2/integrator/orders

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

Orders prints of your own ready quotes once your account is approved. In wallet mode you pay the production price plus shipping from your wallet; a shortfall is charged to your saved card with VAT on the top-up, as for every wallet top-up. The order comes back paid, numbered 2AP..., and goes to production. If payment fails, no order is created. In checkout mode your customer pays your unit_sales_price plus shipping, and VAT when they ship to the EU or UK, on a hosted 3DAPI checkout: the order comes back awaiting_payment, numbered 2AC..., with checkout.url to send them to, and order.created is sent. The link stays open 24 hours; unpaid, the order is then cancelled and checkout.expired is sent. Cancelling it yourself before it is paid sends order.cancelled instead. Once the order is completed you earn the sales price less the production price and the card fee, credited to your wallet. A line may carry approved extras (items[].extras): their price per unit is added to the line's production price in both modes. Integrators 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

  • modestringRequired

    wallet: you pay the production price plus shipping from your wallet (a shortfall is charged to your saved card). checkout: your customer pays the sales price you set through a hosted 3DAPI checkout and you earn the difference.

    Possible valuescheckoutwallet
  • itemsarray of objectRequired

    What to print and ship, 1 to 100 lines.

  • shipping_addressobjectRequired

    Where to ship, in both modes. In checkout mode it also decides the buyer's VAT (EU and UK consumers pay their country's rate on top) and the payment account.

  • customerobjectRequired

    Who receives the order. In checkout mode this is your customer, who gets the order confirmation and shipping emails from 3DAPI naming you as the seller.

  • checkoutobject or null

    Required in checkout mode, forbidden in wallet mode.

  • referencestring or null

    Your own order id, for matching.

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

  • use_sample_creditboolean

    wallet mode only (forbidden in checkout mode): spend your sample credit on this order before the wallet balance. It applies only when the order ships to your own country (your billing or sign-up country); otherwise the order is placed at full price. What applied is shown in charges.sample_credit. Default false.

Returns201 Created

The order: paid in `wallet` mode, `awaiting_payment` with its checkout link in `checkout` mode. Returns the integrator order object.

Responses

  • 201

    The order: paid in wallet mode, awaiting_payment with its checkout link in checkout mode.

  • 400

    The request is invalid (validation_failed).

  • 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: the card was declined (payment_failed), or the wallet is short and there is no saved card (insufficient_balance). No order was created.

  • 403

    Your account cannot order yet: add your business billing details, or, to sell to EU or UK customers from outside the EU and UK, an active EU responsible person (compliance_blocked, details.requirements; details.fix_url links to the dashboard page that fixes it).

  • 404

    A quote is not one of yours (quote_not_found).

  • 409

    Production is paused (production_unavailable).

  • 422

    A quote is not ready (quote_not_ready) or was rejected in review (quote_rejected), an extra is not one of yours (extra_not_found) or not approved (extra_not_approved), your account is not approved yet (quote_not_approved), a material is unknown or there are more materials than the quote prints with (material_not_allowed), the slots sent are not the slots the quote's file uses (material_slots_mismatch, details.expected_slots), the suggested materials were asked for on a quote that has none (suggestions_unavailable), a sales price is not in usd (currency_not_supported) or is below the minimum (sales_price_below_production, details.minimum), we do not deliver to the country (shipping_destination_not_served: 3DAPI does not deliver to Russia, Belarus, Iran or Syria), or VIES did not confirm the business buyer's EU VAT number (vat_number_invalid, details.tax_id and details.country_code; nothing is created). The request is checked in full before the account compliance gate (403), so these come first.

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

  • 503

    Card payments are not available right now (card_payments_unavailable); no order was created.

Errors use the error object.

POST/v2/integrator/orders
curl -X POST "https://public-api.dapi.digital/v2/integrator/orders" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "mode": "wallet",
  "items": [
    {
      "quote": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "quantity": 10,
      "materials": [
        "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu"
      ]
    }
  ],
  "shipping_address": {
    "line1": "Hauptstrasse 12",
    "city": "Berlin",
    "postal_code": "10115",
    "country_code": "DE"
  },
  "customer": {
    "name": "Jane Buyer",
    "email": "jane@example.com"
  },
  "reference": "SHOP-1042"
}'
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "2AP7K2M9X",
  "channel": "integrator_wallet",
  "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": 5000,
      "currency": "usd"
    },
    "shipping": {
      "amount": 800,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 5800,
      "currency": "usd"
    }
  },
  "earnings": null,
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "customer_notes": null,
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 10,
  "mode": "wallet",
  "checkout": null,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "quote": {
        "id": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "quote",
        "name": "phone-stand.stl"
      },
      "materials": [
        {
          "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
          "object": "material",
          "name": "PLA Black"
        }
      ],
      "material_slots": [
        {
          "slot": 1,
          "material": {
            "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
            "object": "material",
            "name": "PLA Black"
          }
        }
      ],
      "quantity": 10,
      "unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "production_unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "extras": [],
      "total": {
        "amount": 5000,
        "currency": "usd"
      }
    }
  ],
  "refunds": [],
  "reference": "SHOP-1042"
}

Estimate the shipping of an order

POST/v2/integrator/orders/shipping-estimate

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

What create_integrator_order would charge for shipping these lines to this country, computed by the same code the order is charged with: the parcel takes the tier of its heaviest item, every other item (extra-small ones excluded) adds the zone's per-item price, and extras count toward the weight. Nothing is created, and your account does not need to be approved yet.

The total is without VAT: in checkout mode, buyers in the EU or UK pay VAT on top. It can change if the rate card changes before you order; the order charges the rate card at the time it is placed.

Send the same items (quote, quantity, extras) and the destination you would order with. Integrators 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

  • countrystringRequired

    Destination country, ISO 3166-1 alpha-2, uppercase: the shipping_address.country_code you would order with. A code that is not a real country is refused with validation_failed.

  • itemsarray of objectRequired

    The lines of the order you would place, as create_integrator_order takes them. Materials and prices do not change shipping, so they are not sent.

Returns200 OK

The shipping the order would be charged.

Responses

  • 200

    The shipping the order would be charged.

  • 400

    The request is invalid (validation_failed).

  • 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

    A quote is not one of yours (quote_not_found).

  • 422

    A quote is not ready (quote_not_ready) or was rejected in review (quote_rejected), an extra is not one of yours (extra_not_found) or not approved (extra_not_approved), or we do not deliver to the country (shipping_destination_not_served: 3DAPI does not deliver to Russia, Belarus, Iran or Syria).

  • 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/integrator/orders/shipping-estimate
curl -X POST "https://public-api.dapi.digital/v2/integrator/orders/shipping-estimate" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "country": "DE",
  "items": [
    {
      "quote": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "quantity": 2
    },
    {
      "quote": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "quantity": 2,
      "extras": [
        {
          "extra": "xtr_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
          "quantity_per_unit": 1
        }
      ]
    }
  ]
}'
Response
{
  "object": "shipping_estimate",
  "country_code": "DE",
  "zone": {
    "code": "eu-core",
    "name": "EU Core"
  },
  "tier": "medium",
  "additional_items": 3,
  "total": {
    "amount": 1099,
    "currency": "usd"
  }
}

Get an order

GET/v2/integrator/orders/{id}

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

One of your orders, with its lines and refunds. Integrators 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 integrator 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/integrator/orders/{id}
curl "https://public-api.dapi.digital/v2/integrator/orders/ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "2AP7K2M9X",
  "channel": "integrator_wallet",
  "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": 5000,
      "currency": "usd"
    },
    "shipping": {
      "amount": 800,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 5800,
      "currency": "usd"
    }
  },
  "earnings": null,
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "customer_notes": null,
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 10,
  "mode": "wallet",
  "checkout": null,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "quote": {
        "id": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "quote",
        "name": "phone-stand.stl"
      },
      "materials": [
        {
          "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
          "object": "material",
          "name": "PLA Black"
        }
      ],
      "material_slots": [
        {
          "slot": 1,
          "material": {
            "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
            "object": "material",
            "name": "PLA Black"
          }
        }
      ],
      "quantity": 10,
      "unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "production_unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "extras": [],
      "total": {
        "amount": 5000,
        "currency": "usd"
      }
    }
  ],
  "refunds": [],
  "reference": "SHOP-1042"
}

Cancel an order

POST/v2/integrator/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
Integrators
Operation id
cancel_integrator_order

Cancels an order. An unpaid checkout order (awaiting_payment) has its link closed and is cancelled. A paid order a production partner has not started is refunded in full: to your wallet for wallet orders, to your customer's card for checkout orders. Integrators 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. Returns the integrator order object.

Responses

  • 200

    The order, cancelled.

  • 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 (order_not_cancellable): it is already cancelled, or past paid (a production partner started it; contact support). Unpaid checkout orders (awaiting_payment) and paid orders can be cancelled; the message says which case applies.

  • 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/integrator/orders/{id}/cancel
curl -X POST "https://public-api.dapi.digital/v2/integrator/orders/ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu/cancel" \
  -H "x-api-key: $DAPI_API_KEY"
Response
{
  "id": "ord_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "order",
  "number": "2AP7K2M9X",
  "channel": "integrator_wallet",
  "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": "you",
    "items": {
      "amount": 5000,
      "currency": "usd"
    },
    "shipping": {
      "amount": 800,
      "currency": "usd"
    },
    "vat": {
      "amount": {
        "amount": 0,
        "currency": "usd"
      },
      "rate": 0,
      "included": false,
      "country": null
    },
    "sample_credit": null,
    "total": {
      "amount": 5800,
      "currency": "usd"
    }
  },
  "earnings": null,
  "shipping": {
    "tier": "small",
    "carrier": null,
    "tracking_number": null,
    "shipped_at": null
  },
  "customer_notes": null,
  "created_at": "2026-10-09T08:39:29Z",
  "updated_at": "2026-10-09T08:40:02Z",
  "item_count": 10,
  "mode": "wallet",
  "checkout": null,
  "items": [
    {
      "id": "itm_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
      "object": "order_item",
      "quote": {
        "id": "qte_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
        "object": "quote",
        "name": "phone-stand.stl"
      },
      "materials": [
        {
          "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
          "object": "material",
          "name": "PLA Black"
        }
      ],
      "material_slots": [
        {
          "slot": 1,
          "material": {
            "id": "mat_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
            "object": "material",
            "name": "PLA Black"
          }
        }
      ],
      "quantity": 10,
      "unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "production_unit_price": {
        "amount": 500,
        "currency": "usd"
      },
      "extras": [],
      "total": {
        "amount": 5000,
        "currency": "usd"
      }
    }
  ],
  "refunds": [],
  "reference": "SHOP-1042"
}