ULTINEO

Orders & logistics

When you move to Ultineo with years of sales recorded in another system, these endpoints let your migration or sync tool bring the whole history into your shop — customers, orders with their lines, payments, shipments, carrier claims, refused parcels, refunds, returns, loyalty wallet movements and support requests with their messages — keeping the original dates, then read back any record to check it.

Every import follows the shared contract described in Your first API call: an items list, an optional dry_run, and a line-by-line report. Every record is recognised by its external_id — its reference in your former system — so sending it again updates it instead of creating a duplicate.

Endpoints

MethodPathScopeBatch limit
POST/v1/customer/importcustomer:write200 customers
GET/v1/customer/importcustomer:readOne customer
POST/v1/order/importorder:write100 orders
GET/v1/order/importorder:readOne order
POST/v1/payment/importpayment:write300 payments
GET/v1/payment/importpayment:readOne payment
POST/v1/shipment/importshipment:write500 shipments
GET/v1/shipment/importshipment:readOne shipment
POST/v1/shipment/claimshipment_claim:write500 claims
GET/v1/shipment/claimshipment_claim:readOne claim
POST/v1/shipment/refusedshipment_refused:write500 refused parcels
GET/v1/shipment/refusedshipment_refused:readOne refused parcel
POST/v1/refund/importrefund:write400 refunds
GET/v1/refund/importrefund:readOne refund
POST/v1/order-return/importorder_return:write300 returns
GET/v1/order-return/importorder_return:readOne return
POST/v1/customer-wallet/importcustomer_wallet:write500 wallet movements
GET/v1/customer-wallet/importcustomer_wallet:readOne wallet movement
POST/v1/support-request/importsupport_request:write25 support requests
GET/v1/support-request/importsupport_request:readOne support request

Import in this order, because each record refers to the previous ones: customers, then orders, then payments and shipments, then refunds, returns, carrier claims, refused parcels, wallet movements and support requests. A record that refers to one not imported yet is refused, with a reason naming the missing reference.

What every resource shares

Customers

A customer is a buyer of your shop, with a billing and a delivery address. Import customers first: every other record of this page refers to them.

Import customers

POST /v1/customer/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the customer, up to 50 characters.
created_atintegerYesThe date the account was created, in Unix seconds. Not more than one day in the future.
statusstringNoactivated (default), active (stored as activated), suspended or deleted.
typestringNoUp to 50 characters. Defaults to individual.
first_namestringNoUp to 150 characters.
last_namestringNoUp to 150 characters.
namestringNoUp to 190 characters. Defaults to the first and last names.
companystringNoUp to 190 characters.
emailstringNoUp to 200 characters.
email_verifiedbooleanNotrue when the address was verified.
phonestringNoUp to 50 characters.
password_hashstringNoThe customer's password hash from your former system, up to 190 characters. Never returned.
notestringNoAn internal note.
billingobjectNoThe billing address (see below). Left empty, it is filled from the delivery address, with a notice.
deliveryobjectNoThe delivery address (see below).
previousobjectNoThe values you sent on your previous import of this customer, with the same keys. A contact or address field that differs from it was changed in your shop since, and is kept.

Each address holds line1, line2 (up to 190 characters), city (up to 120), postal_code (up to 30), state (up to 120) and country_iso — a two-letter country code such as fr.

curl
curl https://api.ultineo.com/v1/customer/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "C1001",
        "created_at": 1717236000,
        "first_name": "Claire",
        "last_name": "Martin",
        "email": "claire.martin@example.com",
        "email_verified": true,
        "phone": "+33 6 12 34 56 78",
        "delivery": {
          "line1": "12 rue des Lilas",
          "line2": "",
          "city": "Lyon",
          "postal_code": "69003",
          "state": "",
          "country_iso": "fr"
        }
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "customer",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "C1001", "action": "created", "id": "cust_c3e9a1074b5d28f6e0a7", "code": null, "title": null, "reason": null, "notice": ["blank billing initialized from delivery"] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a customer

GET /v1/customer/import

ParameterInDescription
external_idqueryThe customer's reference in your former system.
idqueryIts identifier in your shop, prefixed cust_. A value without that prefix is read as an external_id.

With neither, the call answers 400 Name the customer to read: ?external_id=… or /v1/customer/cust_….; an unknown customer answers 404 Customer not found.

curl
curl "https://api.ultineo.com/v1/customer/import?external_id=C1001" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "cust_c3e9a1074b5d28f6e0a7",
    "object": "customer",
    "external_id": "C1001",
    "status": "activated",
    "type": "individual",
    "first_name": "Claire",
    "last_name": "Martin",
    "name": "Claire Martin",
    "company": "",
    "email": "claire.martin@example.com",
    "email_verified": true,
    "phone": "+33 6 12 34 56 78",
    "has_password": false,
    "note": "",
    "billing": { "line1": "12 rue des Lilas", "line2": "", "city": "Lyon", "postal_code": "69003", "state": "", "country_iso": "fr" },
    "delivery": { "line1": "12 rue des Lilas", "line2": "", "city": "Lyon", "postal_code": "69003", "state": "", "country_iso": "fr" },
    "created_at": 1717236000,
    "updated_at": 1791745200
  }
}

The password itself is never returned; has_password says whether one is set.

Orders

An order is imported with all its lines in one item, and keeps its original dates. Totals are stored as you send them and are never recalculated: when the total does not match the articles, delivery and discount amounts, the report tells you in amount_check.

Import orders

POST /v1/order/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the order, up to 50 characters.
customer_external_idstringFor a new orderThe external_id of an already imported customer.
order_numberstringNoThe order number shown to the customer, up to 50 characters. reference is accepted as an alias.
statusstringNoThe commercial status: pending, paid, preparing, shipped, delivered, canceled or refunded. A status is never moved back: a status earlier in that list than the stored one is not applied.
si_codestringNoThe code of the store the order was placed on, up to 10 characters.
currencystringNoA currency code of 3 to 10 letters, such as EUR.
channelstringNoonline, in_store, phone or other.
articles_amountnumber or stringNoThe total of the articles.
delivery_amountnumber or stringNoThe delivery charge.
discount_amountnumber or stringNoThe discount granted.
total_amountnumber or stringNoThe amount paid.
discount_codestringNoThe discount code used, up to 50 characters.
notestringNoAn internal note.
placed_atintegerNoThe date the order was placed, in Unix seconds.
delivered_atintegerNoThe delivery date, in Unix seconds.
created_atintegerNoThe original creation date. Defaults to placed_at.
itemsarrayNoThe order lines (see below).

Each entry of items:

FieldTypeRequiredDescription
external_idstringYesYour reference for the line, unique in the order.
skustringNoThe product's SKU, up to 120 characters. The line is linked to the product of your catalog with that SKU.
productstringNoThe product's identifier in your shop (prod_…), instead of the SKU.
namestringNoThe product name as sold, up to 190 characters.
gradestringNoThe condition grade sold, up to 120 characters.
serialstringNoThe serial number of the item sold, up to 190 characters.
quantityintegerNoA positive whole number.
unit_pricenumber or stringNoThe unit price.
line_totalnumber or stringNoThe line total.
delivery_amountnumber or stringNoThe delivery charge of the line.
warranty_amountnumber or stringNoThe warranty charge of the line.
currencystringNoDefaults to the order's currency.
created_atintegerNoThe line's original date.

An order is saved with all its lines or not at all: one invalid line refuses the whole order. Lines you leave out of a later import are kept.

Each accepted entry of the report adds:

FieldTypeDescription
itemsobjectThe number of lines created, updated and unchanged.
items_detailarrayOne entry per line: its external_id, action and id.
amount_checkobject or nullnull when the amounts agree; otherwise expected_from_fields (articles + delivery − discount), total_amount, difference and items_line_total, as decimal strings.
curl
curl https://api.ultineo.com/v1/order/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "ORD-10458",
        "customer_external_id": "C1001",
        "order_number": "10458",
        "status": "delivered",
        "currency": "EUR",
        "channel": "online",
        "articles_amount": "459.00",
        "delivery_amount": "0.00",
        "discount_amount": "15.00",
        "total_amount": "444.00",
        "discount_code": "SPRING15",
        "placed_at": 1781258400,
        "delivered_at": 1781431200,
        "items": [
          { "external_id": "ORD-10458-1", "sku": "IP13-128-MID", "name": "iPhone 13 128 GB Midnight", "grade": "very_good", "quantity": 1, "unit_price": "459.00", "line_total": "459.00" }
        ]
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "order",
    "dry_run": false,
    "data": [
      {
        "index": 0,
        "external_id": "ORD-10458",
        "action": "created",
        "id": "ordr_5e0a8c2f71d94b36e1c8",
        "code": null,
        "title": null,
        "reason": null,
        "notice": [],
        "items": { "created": 1, "updated": 0, "unchanged": 0 },
        "items_detail": [
          { "external_id": "ORD-10458-1", "action": "created", "id": "oitm_8a3f0e6c2d1b47e95c20" }
        ],
        "amount_check": null
      }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read an order

GET /v1/order/import

ParameterInDescription
external_idqueryThe order's reference in your former system.
idqueryIts identifier in your shop, prefixed ordr_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown order answers 404 Order not found.

curl
curl "https://api.ultineo.com/v1/order/import?external_id=ORD-10458" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "ordr_5e0a8c2f71d94b36e1c8",
    "object": "order",
    "external_id": "ORD-10458",
    "project": "proj_5a91c7e03d2b48f6a1e9",
    "status": "activated",
    "commercial_status": "delivered",
    "reference": "10458",
    "customer": "cust_c3e9a1074b5d28f6e0a7",
    "customer_external_id": "C1001",
    "si_code": "",
    "currency": "EUR",
    "channel": "online",
    "articles_amount": "459.00",
    "delivery_amount": "0.00",
    "discount_amount": "15.00",
    "discount_code": "SPRING15",
    "total_amount": "444.00",
    "note": "",
    "placed_at": 1781258400,
    "delivered_at": 1781431200,
    "ship_before_at": 0,
    "created_at": 1781258400,
    "updated_at": 1791745200,
    "items": [
      {
        "id": "oitm_8a3f0e6c2d1b47e95c20",
        "object": "order_item",
        "external_id": "ORD-10458-1",
        "status": "activated",
        "product": "prod_a81f3c6e0b2d49e7c5f0",
        "sku": "IP13-128-MID",
        "name": "iPhone 13 128 GB Midnight",
        "grade": "very_good",
        "serial": "",
        "quantity": 1,
        "unit_price": "459.00",
        "line_total": "459.00",
        "delivery_amount": "0.00",
        "warranty_amount": "0.00",
        "currency": "EUR",
        "created_at": 1781258400,
        "updated_at": 1791745200
      }
    ]
  }
}

commercial_status is the order's commercial status; status is the state of the record itself. ship_before_at is the shipping deadline your shop computes; it is read-only.

Payments

A payment settles an order. Its gateway (the payment processor) and its method (how the buyer paid) are two separate fields.

Import payments

POST /v1/payment/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the payment, up to 50 characters.
order_external_idstringYesThe external_id of an already imported order.
created_atintegerYesThe payment's original date, in Unix seconds. Not more than one day in the future.
statusstringNopending (default), paid, refunded, canceled or deleted.
amountnumber or stringNoThe amount paid. Zero or more, with up to 2 decimals.
fee_amountnumber or stringNoThe processing fee.
refunded_amountnumber or stringNoThe amount refunded.
refundsarrayNoThe refunds of this payment, each { "external_id", "amount" }. When sent, their sum replaces refunded_amount.
currencystringNoUp to 10 characters, such as EUR.
methodstringNoHow the buyer paid, such as card, up to 50 characters.
gatewaystringNoThe payment processor, up to 50 characters.
referencestringNoThe processor's transaction reference, up to 190 characters.
session_referencestringNoThe processor's checkout session reference, up to 190 characters.
paid_atintegerNoThe date the payment succeeded, in Unix seconds.
curl
curl https://api.ultineo.com/v1/payment/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "PAY-77120",
        "order_external_id": "ORD-10458",
        "created_at": 1781258460,
        "status": "paid",
        "amount": "444.00",
        "fee_amount": "6.66",
        "currency": "EUR",
        "method": "card",
        "gateway": "stripe",
        "reference": "pi_3PZ0d2KJ8nA1",
        "paid_at": 1781258460
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "payment",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "PAY-77120", "action": "created", "id": "paym_2b7d9e04c1a35f8e6d91", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a payment

GET /v1/payment/import

ParameterInDescription
external_idqueryThe payment's reference in your former system.
idqueryIts identifier in your shop, prefixed paym_. A value without that prefix is read as an external_id.

With neither, the call answers 400 Name the payment to read: ?external_id=… or /v1/payment/paym_….; an unknown payment answers 404 Payment not found.

curl
curl "https://api.ultineo.com/v1/payment/import?external_id=PAY-77120" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "paym_2b7d9e04c1a35f8e6d91",
    "object": "payment",
    "external_id": "PAY-77120",
    "status": "paid",
    "order_id": "ordr_5e0a8c2f71d94b36e1c8",
    "order_external_id": "ORD-10458",
    "amount": "444.00",
    "fee_amount": "6.66",
    "refunded_amount": "0.00",
    "currency": "EUR",
    "method": "card",
    "gateway": "stripe",
    "reference": "pi_3PZ0d2KJ8nA1",
    "session_reference": "",
    "paid_at": 1781258460,
    "created_at": 1781258460,
    "updated_at": 1791745200
  }
}

Shipments

A shipment is a parcel sent for an order, with its carrier and tracking number. Its status follows its dates: delivered once delivered_at is set, shipped once shipped_at is set, pending otherwise.

Import shipments

POST /v1/shipment/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the parcel, up to 50 characters.
order_external_idstringYesThe external_id of an already imported order.
carrier_namestringNoThe carrier, up to 190 characters.
tracking_numberstringNoUp to 190 characters.
tracking_urlstringNoThe tracking page, a full https:// address of up to 500 characters.
recipient_namestringNoUp to 190 characters.
notestringNoUp to 2,000 characters.
shipped_atintegerNoThe date the parcel left, in Unix seconds.
delivered_atintegerNoThe delivery date. Left out, the order's delivery date is used.
created_atintegerNoThe original date. Defaults to shipped_at.
curl
curl https://api.ultineo.com/v1/shipment/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "SHP-20931",
        "order_external_id": "ORD-10458",
        "carrier_name": "Colissimo",
        "tracking_number": "6A23456789012",
        "recipient_name": "Claire Martin",
        "shipped_at": 1781334000,
        "delivered_at": 1781431200
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "shipment",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "SHP-20931", "action": "created", "id": "ship_9c1e5a7f02d34b86e0a3", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a shipment

GET /v1/shipment/import

ParameterInDescription
external_idqueryThe parcel's reference in your former system.
idqueryIts identifier in your shop, prefixed ship_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown parcel answers 404 Shipment not found.

curl
curl "https://api.ultineo.com/v1/shipment/import?external_id=SHP-20931" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "ship_9c1e5a7f02d34b86e0a3",
    "object": "shipment",
    "external_id": "SHP-20931",
    "status": "delivered",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "carrier_name": "Colissimo",
    "tracking_number": "6A23456789012",
    "recipient_name": "Claire Martin",
    "note": "",
    "shipped_at": 1781334000,
    "delivered_at": 1781431200,
    "created_at": 1781334000,
    "updated_at": 1791745200
  }
}

Carrier claims

A carrier claim is a dispute opened with the carrier about a parcel — lost, damaged, held by customs or not collected.

Import carrier claims

POST /v1/shipment/claim

FieldTypeRequiredDescription
external_idstringYesYour reference for the claim, up to 50 characters.
shipment_external_idstringYesThe external_id of an already imported shipment. The order is taken from the parcel.
typestringYeslost, damaged, customs or not_collected.
statusstringNonew (default), open, certified_delivered, certified_lost or canceled. A claim canceled in your shop stays canceled.
referencestringNoThe carrier's claim reference, up to 190 characters.
notestringNoUp to 2,000 characters.
opened_atintegerNoThe date the claim was opened, in Unix seconds.
settled_atintegerNoThe date it was settled.
created_atintegerNoThe original date. Defaults to opened_at.

Note — If your shop has never opened its Claims page, the import answers 422 and asks you to open that page once in your workspace, then replay the batch.

curl
curl https://api.ultineo.com/v1/shipment/claim \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "CLM-0081",
        "shipment_external_id": "SHP-20931",
        "type": "damaged",
        "status": "open",
        "reference": "COL-2026-55102",
        "opened_at": 1781517600
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "shipment_claim",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "CLM-0081", "action": "created", "id": "clai_4f8b2d6e01a93c75e2b0", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a carrier claim

GET /v1/shipment/claim

ParameterInDescription
external_idqueryThe claim's reference in your former system.
idqueryIts identifier in your shop, prefixed clai_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown claim answers 404 Claim not found.

curl
curl "https://api.ultineo.com/v1/shipment/claim?external_id=CLM-0081" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "clai_4f8b2d6e01a93c75e2b0",
    "object": "shipment_claim",
    "external_id": "CLM-0081",
    "status": "open",
    "shipment": "ship_9c1e5a7f02d34b86e0a3",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "type": "damaged",
    "reference": "COL-2026-55102",
    "note": "",
    "opened_at": 1781517600,
    "settled_at": 0,
    "created_at": 1781517600,
    "updated_at": 1791745200
  }
}

Refused parcels

A refused parcel is a shipment the recipient refused, on its way back to your warehouse.

Import refused parcels

POST /v1/shipment/refused

FieldTypeRequiredDescription
external_idstringYesYour reference for the refusal, up to 50 characters.
shipment_external_idstringYesThe external_id of an already imported shipment.
statusstringNoawaiting_delivery (default), warehouse_received or canceled. A refusal canceled in your shop stays canceled.
return_numberstringNoThe return number, up to 190 characters.
notestringNoUp to 2,000 characters.
refused_atintegerNoThe date the parcel was refused, in Unix seconds.
received_atintegerNoThe date it was received back at the warehouse.
created_atintegerNoThe original date. Defaults to refused_at.

Note — If your shop has never opened its Refused page, the import answers 422 and asks you to open that page once in your workspace, then replay the batch.

curl
curl https://api.ultineo.com/v1/shipment/refused \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "REF-0042",
        "shipment_external_id": "SHP-20931",
        "status": "warehouse_received",
        "return_number": "RET-55871",
        "refused_at": 1781431200,
        "received_at": 1781690400
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "shipment_refused",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "REF-0042", "action": "created", "id": "refu_7a0c3e9b51d24f68a0e7", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a refused parcel

GET /v1/shipment/refused

ParameterInDescription
external_idqueryThe refusal's reference in your former system.
idqueryIts identifier in your shop, prefixed refu_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown refusal answers 404 Refusal not found.

curl
curl "https://api.ultineo.com/v1/shipment/refused?external_id=REF-0042" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "refu_7a0c3e9b51d24f68a0e7",
    "object": "shipment_refused",
    "external_id": "REF-0042",
    "status": "warehouse_received",
    "shipment": "ship_9c1e5a7f02d34b86e0a3",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "return_number": "RET-55871",
    "note": "",
    "refused_at": 1781431200,
    "received_at": 1781690400,
    "created_at": 1781431200,
    "updated_at": 1791745200
  }
}

Refunds

A refund returns money to the buyer for an order, optionally against one of its payments.

Import refunds

POST /v1/refund/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the refund, up to 50 characters.
order_external_idstringYesThe external_id of an already imported order.
payment_external_idstringNoThe external_id of the refunded payment. Required when amount is above zero, unless status is mistake.
customer_external_idstringNoThe external_id of the refunded customer.
amountnumber or stringNoThe amount refunded. Zero or more, with up to 2 decimals.
currencystringNoUp to 10 characters, such as EUR.
reasonstringNofull_order, partial, priority_shipping, out_of_delivery_area, package_lost, returned_to_warehouse, no_service_for_country, return_voucher_converted, commercial_gesture or out_of_stock.
statusstringNoin_progress (default), finished or mistake.
notestringNoUp to 2,000 characters.
refunded_atintegerNoThe date of the refund, in Unix seconds.
created_atintegerNoThe original date. Defaults to refunded_at.

Note — The item field reason is the reason for the refund. Do not confuse it with the reason of a refused entry in the import report.

Important — A refund above zero that is not a mistake counts against its payment. That payment must be paid or refunded, the refund's currency must be the payment's, and all the refunds of one payment, pending ones included, cannot exceed it. Otherwise the entry is refused with 422 and a reason such as Total refunds, including pending refunds, cannot exceed the original payment.

curl
curl https://api.ultineo.com/v1/refund/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "RFD-3307",
        "order_external_id": "ORD-10458",
        "payment_external_id": "PAY-77120",
        "amount": "40.00",
        "currency": "EUR",
        "reason": "commercial_gesture",
        "status": "finished",
        "refunded_at": 1781604000
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "refund",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "RFD-3307", "action": "created", "id": "rfnd_0e6b4a2c93f15d78b4c1", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a refund

GET /v1/refund/import

ParameterInDescription
external_idqueryThe refund's reference in your former system.
idqueryIts identifier in your shop, prefixed rfnd_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown refund answers 404 Refund not found.

curl
curl "https://api.ultineo.com/v1/refund/import?external_id=RFD-3307" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "rfnd_0e6b4a2c93f15d78b4c1",
    "object": "refund",
    "external_id": "RFD-3307",
    "status": "finished",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "payment": "paym_2b7d9e04c1a35f8e6d91",
    "customer": "",
    "reason": "commercial_gesture",
    "amount": "40.00",
    "currency": "EUR",
    "note": "",
    "refunded_at": 1781604000,
    "created_at": 1781604000,
    "updated_at": 1791745200
  }
}

Order returns

An order return is an item a customer sends back — a withdrawal, a warranty case or a wrong item — and how it was resolved.

Import order returns

POST /v1/order-return/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the return, up to 50 characters.
order_external_idstringYesThe external_id of an already imported order.
customer_external_idstringYesThe external_id of an already imported customer.
order_item_external_idstringNoThe external_id of the returned line of that order.
typestringNowithdrawal, warranty, wrong_item or other (default).
resolutionstringNoexchange or refund. Set when the return is created.
statusstringNoOne of your shop's return statuses — by default requested, validated, icloud_check, icloud_verified, parcel_waiting, received, verified, complete or incident. Defaults to the first one. A status is never moved back along that flow. deleted withdraws a return already imported.
serialstringNoThe serial number of the returned item: 1 to 50 letters, digits or dashes.
carrier_namestringNoUp to 190 characters.
tracking_numberstringNoUp to 190 characters.
label_urlstringNoThe return label, a full https:// address of up to 500 characters.
support_requeststringNoThe identifier in your shop (sprq_…) of the related support request.
received_atintegerNoThe date the item was received, in Unix seconds.
completed_atintegerNoThe date the return was completed.
created_atintegerNoThe original date. Defaults to received_at.
curl
curl https://api.ultineo.com/v1/order-return/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "RTN-1190",
        "order_external_id": "ORD-10458",
        "customer_external_id": "C1001",
        "order_item_external_id": "ORD-10458-1",
        "type": "withdrawal",
        "resolution": "refund",
        "status": "received",
        "carrier_name": "Colissimo",
        "tracking_number": "8R00112233445",
        "received_at": 1781776800
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "order_return",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "RTN-1190", "action": "created", "id": "ortn_6d2a0f8c41e93b57d1a8", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read an order return

GET /v1/order-return/import

ParameterInDescription
external_idqueryThe return's reference in your former system.
idqueryIts identifier in your shop, prefixed ortn_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown return answers 404 Order return not found.

curl
curl "https://api.ultineo.com/v1/order-return/import?external_id=RTN-1190" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "ortn_6d2a0f8c41e93b57d1a8",
    "object": "order_return",
    "external_id": "RTN-1190",
    "status": "received",
    "type": "withdrawal",
    "resolution": "refund",
    "customer": "cust_c3e9a1074b5d28f6e0a7",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "order_item": "oitm_8a3f0e6c2d1b47e95c20",
    "support_request": "",
    "serial": "",
    "carrier_name": "Colissimo",
    "tracking_number": "8R00112233445",
    "label_url": "",
    "received_at": 1781776800,
    "completed_at": 0,
    "created_at": 1781776800,
    "updated_at": 1791745200
  }
}

Customer wallet

A wallet movement is a line of a customer's loyalty wallet: points earned on a purchase, a referral or a review, or points spent.

Import wallet movements

POST /v1/customer-wallet/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the movement, up to 50 characters.
customer_external_idstringYesThe external_id of an already imported customer.
order_external_idstringNoThe external_id of the related order.
pointsnumber or stringNoThe points, positive for a credit or negative for a debit, with up to 4 decimals.
reasonstringNopurchase, referral, activity, review, goodwill or conversion.
statusstringNocredited (default), pending or cancelled.
notestringNoA one-line note, up to 190 characters.
earned_atintegerNoThe date the points were earned, in Unix seconds.
created_atintegerNoThe original date. Defaults to earned_at.
curl
curl https://api.ultineo.com/v1/customer-wallet/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "WAL-55210",
        "customer_external_id": "C1001",
        "order_external_id": "ORD-10458",
        "points": "44.4",
        "reason": "purchase",
        "status": "credited",
        "earned_at": 1781431200
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "customer_wallet",
    "dry_run": false,
    "data": [
      { "index": 0, "external_id": "WAL-55210", "action": "created", "id": "cwal_3b9e1d7a05c42f86e3d2", "code": null, "title": null, "reason": null, "notice": [] }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a wallet movement

GET /v1/customer-wallet/import

ParameterInDescription
external_idqueryThe movement's reference in your former system.
idqueryIts identifier in your shop, prefixed cwal_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown movement answers 404 Wallet entry not found.

curl
curl "https://api.ultineo.com/v1/customer-wallet/import?external_id=WAL-55210" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "cwal_3b9e1d7a05c42f86e3d2",
    "object": "customer_wallet_entry",
    "external_id": "WAL-55210",
    "status": "credited",
    "customer": "cust_c3e9a1074b5d28f6e0a7",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "reason": "purchase",
    "points": "44.4000",
    "note": "",
    "earned_at": 1781431200,
    "created_at": 1781431200,
    "updated_at": 1791745200
  }
}

Support requests

A support request is a customer's question or after-sales case, imported with its thread of messages.

Import support requests

POST /v1/support-request/import

FieldTypeRequiredDescription
external_idstringYesYour reference for the request, up to 50 characters.
customer_external_idstringYesThe external_id of an already imported customer.
order_external_idstringNoThe external_id of the related order.
order_item_external_idstringNoThe external_id of the related line. Requires order_external_id.
categorystringNoorder or device. Send it together with topic.
topicstringNoThe subject, from the list of its category (see below).
statusstringNoopen (default), answered, waiting or closed.
messagestringNoThe opening message, up to 16,000 characters.
answered_atintegerNoThe date of the first answer, in Unix seconds.
created_atintegerNoThe original date. Defaults to the order's date.
messagesarrayNoThe messages of the thread (see below).

Topics of the order category: package_not_arrived, missing_item, missing_accessory, wrong_model, cancel_order, item_problem, withdrawal, customs_invoice, voucher_refund, delivery, delivery_problem, payment, refund, claim, returned_item, account, order_general, other.

Topics of the device category: slow, no_start, blocking, photo_video, no_flash, screen_color, screen_flash, screen_pixels, battery, battery_80, no_charge, cable, no_sound_call, geolocation, screen_lock, screen_fixed, network, vibrator, black_screen, scratched, button, not_listed.

Each entry of messages:

FieldTypeRequiredDescription
external_idstringYesYour reference for the message, unique in the batch.
textstringYesThe message, up to 16,000 characters.
authorstringNocustomer (default) or shop.
statusstringNoactivated or deleted.
created_atintegerNoThe date of the message. Defaults to the request's date.

A request is saved with all its messages or not at all. Messages you leave out of a later import are kept.

Each accepted entry of the report adds messages (the number of messages created, updated and unchanged) and messages_detail (one entry per message: its external_id, action and id).

curl
curl https://api.ultineo.com/v1/support-request/import \
  -H "Authorization: Bearer sk-project-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "external_id": "SUP-4402",
        "customer_external_id": "C1001",
        "order_external_id": "ORD-10458",
        "category": "device",
        "topic": "battery",
        "status": "closed",
        "message": "The battery drains faster than expected.",
        "created_at": 1782036000,
        "answered_at": 1782046800,
        "messages": [
          { "external_id": "SUP-4402-1", "author": "shop", "text": "Thank you, a prepaid return label is on its way.", "created_at": 1782046800 }
        ]
      }
    ]
  }'
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "object": "list",
    "resource": "support_request",
    "dry_run": false,
    "data": [
      {
        "index": 0,
        "external_id": "SUP-4402",
        "action": "created",
        "id": "sprq_1c7e3a9f50b24d68c1e5",
        "code": null,
        "title": null,
        "reason": null,
        "notice": [],
        "messages": { "created": 1, "updated": 0, "unchanged": 0 },
        "messages_detail": [
          { "external_id": "SUP-4402-1", "action": "created", "id": "spmg_8e2b0d4a61f37c95e2b4" }
        ]
      }
    ],
    "created": 1,
    "updated": 0,
    "unchanged": 0,
    "refused": 0,
    "total": 1
  }
}

Read a support request

GET /v1/support-request/import

ParameterInDescription
external_idqueryThe request's reference in your former system.
idqueryIts identifier in your shop, prefixed sprq_.

With neither, the call answers 400 Missing required parameter: external_id.; an unknown request answers 404 Support request not found.

curl
curl "https://api.ultineo.com/v1/support-request/import?external_id=SUP-4402" \
  -H "Authorization: Bearer sk-project-YOUR_KEY"
application/json
{
  "code": 200,
  "title": "OK",
  "response": {
    "id": "sprq_1c7e3a9f50b24d68c1e5",
    "object": "support_request",
    "external_id": "SUP-4402",
    "project": "proj_5a91c7e03d2b48f6a1e9",
    "status": "closed",
    "category": "device",
    "topic": "battery",
    "customer": "cust_c3e9a1074b5d28f6e0a7",
    "order": "ordr_5e0a8c2f71d94b36e1c8",
    "order_item": "",
    "message": "The battery drains faster than expected.",
    "answered_at": 1782046800,
    "created_at": 1782036000,
    "updated_at": 1791745200,
    "messages": [
      {
        "id": "spmg_8e2b0d4a61f37c95e2b4",
        "object": "support_message",
        "external_id": "SUP-4402-1",
        "status": "activated",
        "author": "shop",
        "text": "Thank you, a prepaid return label is on its way.",
        "created_at": 1782046800,
        "updated_at": 1791745200
      }
    ]
  }
}

The thread is returned in date order, including the messages written in your workspace (their external_id is empty).

Note — These endpoints do not list, search or delete records, and do not trigger actions: cancelling an order, issuing a refund, creating a shipping label or contacting a carrier are done in your workspace.