Commandes & logistique
Lorsque vous passez à Ultineo avec des années de ventes enregistrées dans un autre système, ces points d'accès permettent à votre outil de migration ou de synchronisation de rapatrier tout l'historique dans votre boutique — clients, commandes avec leurs lignes, paiements, expéditions, réclamations transporteur, colis refusés, remboursements, retours, mouvements de cagnotte de fidélité et demandes de support avec leurs messages — en conservant les dates d'origine, puis de relire n'importe quel enregistrement pour le vérifier.
Chaque import suit le contrat commun décrit dans Votre premier appel : une liste items, un dry_run facultatif et un rapport ligne par ligne. Chaque enregistrement est reconnu par son external_id — sa référence d'origine — si bien que le renvoyer le met à jour au lieu de créer un doublon.
Points d'accès
| Méthode | Chemin | Droit | Limite par lot |
|---|---|---|---|
| POST | /v1/customer/import | customer:write | 200 clients |
| GET | /v1/customer/import | customer:read | Un client |
| POST | /v1/order/import | order:write | 100 commandes |
| GET | /v1/order/import | order:read | Une commande |
| POST | /v1/payment/import | payment:write | 300 paiements |
| GET | /v1/payment/import | payment:read | Un paiement |
| POST | /v1/shipment/import | shipment:write | 500 expéditions |
| GET | /v1/shipment/import | shipment:read | Une expédition |
| POST | /v1/shipment/claim | shipment_claim:write | 500 réclamations |
| GET | /v1/shipment/claim | shipment_claim:read | Une réclamation |
| POST | /v1/shipment/refused | shipment_refused:write | 500 colis refusés |
| GET | /v1/shipment/refused | shipment_refused:read | Un colis refusé |
| POST | /v1/refund/import | refund:write | 400 remboursements |
| GET | /v1/refund/import | refund:read | Un remboursement |
| POST | /v1/order-return/import | order_return:write | 300 retours |
| GET | /v1/order-return/import | order_return:read | Un retour |
| POST | /v1/customer-wallet/import | customer_wallet:write | 500 mouvements de cagnotte |
| GET | /v1/customer-wallet/import | customer_wallet:read | Un mouvement de cagnotte |
| POST | /v1/support-request/import | support_request:write | 25 demandes de support |
| GET | /v1/support-request/import | support_request:read | Une demande de support |
Importez dans cet ordre, car chaque enregistrement fait référence aux précédents : les clients, puis les commandes, puis les paiements et les expéditions, puis les remboursements, les retours, les réclamations transporteur, les colis refusés, les mouvements de cagnotte et les demandes de support. Un enregistrement qui fait référence à un autre pas encore importé est refusé, avec un reason qui nomme la référence manquante.
Ce que toutes les ressources ont en commun
- Les dates (
created_at,placed_at,shipped_at…) sont des horodatages Unix en secondes. Lecreated_atque vous envoyez est conservé comme date d'origine de l'enregistrement et n'est jamais modifié par un import ultérieur. Si vous l'omettez, la plupart des ressources utilisent la date connue la plus proche, comme la date de la commande. - Les liens vers d'autres enregistrements utilisent leur
external_id:customer_external_id,order_external_id,shipment_external_id, etc. - Les statuts sont contrôlés par rapport aux valeurs exactes listées ci-dessous, en minuscules. Un enregistrement retiré dans votre espace de travail conserve son statut : un import ne le rétablit jamais, et un
noticele signale. - Lire un enregistrement :
GETavec?external_id=(sa référence d'origine) ou?id=(son identifiant dans votre boutique). Sans l'un ni l'autre, l'appel répond400; un enregistrement absent de votre boutique répond404.
Clients
Un client est un acheteur de votre boutique, avec une adresse de facturation et une adresse de livraison. Importez les clients en premier : tous les autres enregistrements de cette page y font référence.
Importer des clients
POST /v1/customer/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le client, jusqu'à 50 caractères. |
created_at | entier | Oui | La date de création du compte, en secondes Unix. Pas plus d'un jour dans le futur. |
status | chaîne | Non | activated (par défaut), active (enregistré comme activated), suspended ou deleted. |
type | chaîne | Non | Jusqu'à 50 caractères. Vaut individual par défaut. |
first_name | chaîne | Non | Jusqu'à 150 caractères. |
last_name | chaîne | Non | Jusqu'à 150 caractères. |
name | chaîne | Non | Jusqu'à 190 caractères. Par défaut, le prénom et le nom. |
company | chaîne | Non | Jusqu'à 190 caractères. |
email | chaîne | Non | Jusqu'à 200 caractères. |
email_verified | booléen | Non | true si l'adresse a été vérifiée. |
phone | chaîne | Non | Jusqu'à 50 caractères. |
password_hash | chaîne | Non | Le hachage du mot de passe du client dans votre ancien système, jusqu'à 190 caractères. Jamais renvoyé. |
note | chaîne | Non | Une note interne. |
billing | objet | Non | L'adresse de facturation (voir ci-dessous). Laissée vide, elle est remplie à partir de l'adresse de livraison, avec un notice. |
delivery | objet | Non | L'adresse de livraison (voir ci-dessous). |
previous | objet | Non | Les valeurs que vous avez envoyées lors de votre import précédent de ce client, avec les mêmes clés. Un champ de contact ou d'adresse qui en diffère a été modifié dans votre boutique depuis, et il est conservé. |
Chaque adresse contient line1, line2 (jusqu'à 190 caractères), city (jusqu'à 120), postal_code (jusqu'à 30), state (jusqu'à 120) et country_iso — un code pays à deux lettres comme fr.
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"
}
}
]
}' {
"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
}
} Lire un client
GET /v1/customer/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du client. |
id | query | Son identifiant dans votre boutique, préfixé cust_. Une valeur sans ce préfixe est lue comme un external_id. |
Sans l'un ni l'autre, l'appel répond 400 Name the customer to read: ?external_id=… or /v1/customer/cust_…. ; un client inconnu répond 404 Customer not found.
curl "https://api.ultineo.com/v1/customer/import?external_id=C1001" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Le mot de passe lui-même n'est jamais renvoyé ; has_password indique s'il en existe un.
Commandes
Une commande est importée avec toutes ses lignes dans un seul élément, et conserve ses dates d'origine. Les totaux sont enregistrés tels que vous les envoyez et ne sont jamais recalculés : lorsque le total ne correspond pas aux montants des articles, de la livraison et de la remise, le rapport vous le signale dans amount_check.
Importer des commandes
POST /v1/order/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour la commande, jusqu'à 50 caractères. |
customer_external_id | chaîne | Pour une nouvelle commande | Le external_id d'un client déjà importé. |
order_number | chaîne | Non | Le numéro de commande affiché au client, jusqu'à 50 caractères. reference est accepté comme alias. |
status | chaîne | Non | Le statut commercial : pending, paid, preparing, shipped, delivered, canceled ou refunded. Un statut ne recule jamais : un statut situé avant le statut enregistré dans cette liste n'est pas appliqué. |
si_code | chaîne | Non | Le code de la boutique sur laquelle la commande a été passée, jusqu'à 10 caractères. |
currency | chaîne | Non | Un code de devise de 3 à 10 lettres, comme EUR. |
channel | chaîne | Non | online, in_store, phone ou other. |
articles_amount | nombre ou chaîne | Non | Le total des articles. |
delivery_amount | nombre ou chaîne | Non | Les frais de livraison. |
discount_amount | nombre ou chaîne | Non | La remise accordée. |
total_amount | nombre ou chaîne | Non | Le montant payé. |
discount_code | chaîne | Non | Le code de réduction utilisé, jusqu'à 50 caractères. |
note | chaîne | Non | Une note interne. |
placed_at | entier | Non | La date à laquelle la commande a été passée, en secondes Unix. |
delivered_at | entier | Non | La date de livraison, en secondes Unix. |
created_at | entier | Non | La date de création d'origine. Vaut placed_at par défaut. |
items | tableau | Non | Les lignes de commande (voir ci-dessous). |
Chaque entrée de items :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour la ligne, unique dans la commande. |
sku | chaîne | Non | Le SKU du produit, jusqu'à 120 caractères. La ligne est liée au produit de votre catalogue portant ce SKU. |
product | chaîne | Non | L'identifiant du produit dans votre boutique (prod_…), à la place du SKU. |
name | chaîne | Non | Le nom du produit tel que vendu, jusqu'à 190 caractères. |
grade | chaîne | Non | Le grade d'état vendu, jusqu'à 120 caractères. |
serial | chaîne | Non | Le numéro de série de l'article vendu, jusqu'à 190 caractères. |
quantity | entier | Non | Un nombre entier positif. |
unit_price | nombre ou chaîne | Non | Le prix unitaire. |
line_total | nombre ou chaîne | Non | Le total de la ligne. |
delivery_amount | nombre ou chaîne | Non | Les frais de livraison de la ligne. |
warranty_amount | nombre ou chaîne | Non | Le montant de la garantie de la ligne. |
currency | chaîne | Non | Par défaut, la devise de la commande. |
created_at | entier | Non | La date d'origine de la ligne. |
Une commande est enregistrée avec toutes ses lignes ou pas du tout : une seule ligne invalide fait refuser toute la commande. Les lignes que vous omettez lors d'un import ultérieur sont conservées.
Chaque entrée acceptée du rapport ajoute :
| Champ | Type | Description |
|---|---|---|
items | objet | Le nombre de lignes created, updated et unchanged. |
items_detail | tableau | Une entrée par ligne : son external_id, son action et son id. |
amount_check | objet ou null | null lorsque les montants concordent ; sinon expected_from_fields (articles + livraison − remise), total_amount, difference et items_line_total, sous forme de chaînes décimales. |
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" }
]
}
]
}' {
"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
}
} Lire une commande
GET /v1/order/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine de la commande. |
id | query | Son identifiant dans votre boutique, préfixé ordr_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; une commande inconnue répond 404 Order not found.
curl "https://api.ultineo.com/v1/order/import?external_id=ORD-10458" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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 est le statut commercial de la commande ; status est l'état de l'enregistrement lui-même. ship_before_at est la date limite d'expédition calculée par votre boutique ; il est en lecture seule.
Paiements
Un paiement règle une commande. Son gateway (le prestataire de paiement) et sa method (le moyen de paiement de l'acheteur) sont deux champs distincts.
Importer des paiements
POST /v1/payment/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le paiement, jusqu'à 50 caractères. |
order_external_id | chaîne | Oui | Le external_id d'une commande déjà importée. |
created_at | entier | Oui | La date d'origine du paiement, en secondes Unix. Pas plus d'un jour dans le futur. |
status | chaîne | Non | pending (par défaut), paid, refunded, canceled ou deleted. |
amount | nombre ou chaîne | Non | Le montant payé. Zéro ou plus, avec jusqu'à 2 décimales. |
fee_amount | nombre ou chaîne | Non | Les frais de traitement. |
refunded_amount | nombre ou chaîne | Non | Le montant remboursé. |
refunds | tableau | Non | Les remboursements de ce paiement, chacun { "external_id", "amount" }. S'ils sont envoyés, leur somme remplace refunded_amount. |
currency | chaîne | Non | Jusqu'à 10 caractères, comme EUR. |
method | chaîne | Non | Le moyen de paiement de l'acheteur, comme card, jusqu'à 50 caractères. |
gateway | chaîne | Non | Le prestataire de paiement, jusqu'à 50 caractères. |
reference | chaîne | Non | La référence de transaction du prestataire, jusqu'à 190 caractères. |
session_reference | chaîne | Non | La référence de session de paiement du prestataire, jusqu'à 190 caractères. |
paid_at | entier | Non | La date à laquelle le paiement a abouti, en secondes Unix. |
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
}
]
}' {
"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
}
} Lire un paiement
GET /v1/payment/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du paiement. |
id | query | Son identifiant dans votre boutique, préfixé paym_. Une valeur sans ce préfixe est lue comme un external_id. |
Sans l'un ni l'autre, l'appel répond 400 Name the payment to read: ?external_id=… or /v1/payment/paym_…. ; un paiement inconnu répond 404 Payment not found.
curl "https://api.ultineo.com/v1/payment/import?external_id=PAY-77120" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Expéditions
Une expédition est un colis envoyé pour une commande, avec son transporteur et son numéro de suivi. Son statut suit ses dates : delivered dès que delivered_at est renseigné, shipped dès que shipped_at est renseigné, pending sinon.
Importer des expéditions
POST /v1/shipment/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le colis, jusqu'à 50 caractères. |
order_external_id | chaîne | Oui | Le external_id d'une commande déjà importée. |
carrier_name | chaîne | Non | Le transporteur, jusqu'à 190 caractères. |
tracking_number | chaîne | Non | Jusqu'à 190 caractères. |
tracking_url | chaîne | Non | La page de suivi, une adresse https:// complète de 500 caractères au plus. |
recipient_name | chaîne | Non | Jusqu'à 190 caractères. |
note | chaîne | Non | Jusqu'à 2 000 caractères. |
shipped_at | entier | Non | La date de départ du colis, en secondes Unix. |
delivered_at | entier | Non | La date de livraison. Si elle est omise, la date de livraison de la commande est utilisée. |
created_at | entier | Non | La date d'origine. Vaut shipped_at par défaut. |
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
}
]
}' {
"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
}
} Lire une expédition
GET /v1/shipment/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du colis. |
id | query | Son identifiant dans votre boutique, préfixé ship_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; un colis inconnu répond 404 Shipment not found.
curl "https://api.ultineo.com/v1/shipment/import?external_id=SHP-20931" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Réclamations transporteur
Une réclamation transporteur est un litige ouvert auprès du transporteur au sujet d'un colis — perdu, endommagé, retenu en douane ou non retiré.
Importer des réclamations transporteur
POST /v1/shipment/claim
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour la réclamation, jusqu'à 50 caractères. |
shipment_external_id | chaîne | Oui | Le external_id d'une expédition déjà importée. La commande est déduite du colis. |
type | chaîne | Oui | lost, damaged, customs ou not_collected. |
status | chaîne | Non | new (par défaut), open, certified_delivered, certified_lost ou canceled. Une réclamation annulée dans votre boutique reste annulée. |
reference | chaîne | Non | La référence de réclamation du transporteur, jusqu'à 190 caractères. |
note | chaîne | Non | Jusqu'à 2 000 caractères. |
opened_at | entier | Non | La date d'ouverture de la réclamation, en secondes Unix. |
settled_at | entier | Non | La date de son règlement. |
created_at | entier | Non | La date d'origine. Vaut opened_at par défaut. |
Remarque — Si votre boutique n'a jamais ouvert sa page Réclamations, l'import répond
422et vous demande d'ouvrir cette page une fois dans votre espace de travail, puis de rejouer le lot.
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
}
]
}' {
"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
}
} Lire une réclamation transporteur
GET /v1/shipment/claim
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine de la réclamation. |
id | query | Son identifiant dans votre boutique, préfixé clai_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; une réclamation inconnue répond 404 Claim not found.
curl "https://api.ultineo.com/v1/shipment/claim?external_id=CLM-0081" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Colis refusés
Un colis refusé est une expédition refusée par le destinataire, en cours de retour vers votre entrepôt.
Importer des colis refusés
POST /v1/shipment/refused
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le refus, jusqu'à 50 caractères. |
shipment_external_id | chaîne | Oui | Le external_id d'une expédition déjà importée. |
status | chaîne | Non | awaiting_delivery (par défaut), warehouse_received ou canceled. Un refus annulé dans votre boutique reste annulé. |
return_number | chaîne | Non | Le numéro de retour, jusqu'à 190 caractères. |
note | chaîne | Non | Jusqu'à 2 000 caractères. |
refused_at | entier | Non | La date à laquelle le colis a été refusé, en secondes Unix. |
received_at | entier | Non | La date de sa réception en retour à l'entrepôt. |
created_at | entier | Non | La date d'origine. Vaut refused_at par défaut. |
Remarque — Si votre boutique n'a jamais ouvert sa page Colis refusés, l'import répond
422et vous demande d'ouvrir cette page une fois dans votre espace de travail, puis de rejouer le lot.
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
}
]
}' {
"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
}
} Lire un colis refusé
GET /v1/shipment/refused
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du refus. |
id | query | Son identifiant dans votre boutique, préfixé refu_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; un refus inconnu répond 404 Refusal not found.
curl "https://api.ultineo.com/v1/shipment/refused?external_id=REF-0042" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Remboursements
Un remboursement restitue de l'argent à l'acheteur pour une commande, éventuellement sur l'un de ses paiements.
Importer des remboursements
POST /v1/refund/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le remboursement, jusqu'à 50 caractères. |
order_external_id | chaîne | Oui | Le external_id d'une commande déjà importée. |
payment_external_id | chaîne | Non | Le external_id du paiement remboursé. Obligatoire quand amount est supérieur à zéro, sauf si status vaut mistake. |
customer_external_id | chaîne | Non | Le external_id du client remboursé. |
amount | nombre ou chaîne | Non | Le montant remboursé. Zéro ou plus, avec jusqu'à 2 décimales. |
currency | chaîne | Non | Jusqu'à 10 caractères, comme EUR. |
reason | chaîne | Non | full_order, partial, priority_shipping, out_of_delivery_area, package_lost, returned_to_warehouse, no_service_for_country, return_voucher_converted, commercial_gesture ou out_of_stock. |
status | chaîne | Non | in_progress (par défaut), finished ou mistake. |
note | chaîne | Non | Jusqu'à 2 000 caractères. |
refunded_at | entier | Non | La date du remboursement, en secondes Unix. |
created_at | entier | Non | La date d'origine. Vaut refunded_at par défaut. |
Remarque — Le champ
reasonde l'élément est le motif du remboursement. Ne le confondez pas avec lereasond'une entrée refusée dans le rapport d'import.
Important — Un remboursement supérieur à zéro qui n'est pas un
mistakeest imputé sur son paiement. Ce paiement doit être payé ou remboursé, lacurrencydu remboursement doit être celle du paiement, et l'ensemble des remboursements d'un paiement, en cours compris, ne peut pas le dépasser. Sinon l'entrée est refusée avec422et unreasontel queTotal refunds, including pending refunds, cannot exceed the original payment.
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
}
]
}' {
"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
}
} Lire un remboursement
GET /v1/refund/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du remboursement. |
id | query | Son identifiant dans votre boutique, préfixé rfnd_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; un remboursement inconnu répond 404 Refund not found.
curl "https://api.ultineo.com/v1/refund/import?external_id=RFD-3307" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Retours
Un retour est un article qu'un client renvoie — une rétractation, un cas de garantie ou un article erroné — ainsi que la façon dont il a été traité.
Importer des retours
POST /v1/order-return/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le retour, jusqu'à 50 caractères. |
order_external_id | chaîne | Oui | Le external_id d'une commande déjà importée. |
customer_external_id | chaîne | Oui | Le external_id d'un client déjà importé. |
order_item_external_id | chaîne | Non | Le external_id de la ligne retournée de cette commande. |
type | chaîne | Non | withdrawal, warranty, wrong_item ou other (par défaut). |
resolution | chaîne | Non | exchange ou refund. Défini à la création du retour. |
status | chaîne | Non | L'un des statuts de retour de votre boutique — par défaut requested, validated, icloud_check, icloud_verified, parcel_waiting, received, verified, complete ou incident. Vaut le premier par défaut. Un statut ne recule jamais dans ce parcours. deleted retire un retour déjà importé. |
serial | chaîne | Non | Le numéro de série de l'article retourné : 1 à 50 lettres, chiffres ou tirets. |
carrier_name | chaîne | Non | Jusqu'à 190 caractères. |
tracking_number | chaîne | Non | Jusqu'à 190 caractères. |
label_url | chaîne | Non | L'étiquette de retour, une adresse https:// complète de 500 caractères au plus. |
support_request | chaîne | Non | L'identifiant dans votre boutique (sprq_…) de la demande de support associée. |
received_at | entier | Non | La date de réception de l'article, en secondes Unix. |
completed_at | entier | Non | La date à laquelle le retour a été clôturé. |
created_at | entier | Non | La date d'origine. Vaut received_at par défaut. |
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
}
]
}' {
"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
}
} Lire un retour
GET /v1/order-return/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du retour. |
id | query | Son identifiant dans votre boutique, préfixé ortn_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; un retour inconnu répond 404 Order return not found.
curl "https://api.ultineo.com/v1/order-return/import?external_id=RTN-1190" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Cagnotte client
Un mouvement de cagnotte est une ligne de la cagnotte de fidélité d'un client : des points gagnés sur un achat, un parrainage ou un avis, ou des points dépensés.
Importer des mouvements de cagnotte
POST /v1/customer-wallet/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le mouvement, jusqu'à 50 caractères. |
customer_external_id | chaîne | Oui | Le external_id d'un client déjà importé. |
order_external_id | chaîne | Non | Le external_id de la commande associée. |
points | nombre ou chaîne | Non | Les points, positifs pour un crédit ou négatifs pour un débit, avec jusqu'à 4 décimales. |
reason | chaîne | Non | purchase, referral, activity, review, goodwill ou conversion. |
status | chaîne | Non | credited (par défaut), pending ou cancelled. |
note | chaîne | Non | Une note d'une ligne, jusqu'à 190 caractères. |
earned_at | entier | Non | La date à laquelle les points ont été gagnés, en secondes Unix. |
created_at | entier | Non | La date d'origine. Vaut earned_at par défaut. |
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
}
]
}' {
"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
}
} Lire un mouvement de cagnotte
GET /v1/customer-wallet/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine du mouvement. |
id | query | Son identifiant dans votre boutique, préfixé cwal_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; un mouvement inconnu répond 404 Wallet entry not found.
curl "https://api.ultineo.com/v1/customer-wallet/import?external_id=WAL-55210" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
} Demandes de support
Une demande de support est une question ou un dossier de service après-vente d'un client, importé avec son fil de messages.
Importer des demandes de support
POST /v1/support-request/import
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour la demande, jusqu'à 50 caractères. |
customer_external_id | chaîne | Oui | Le external_id d'un client déjà importé. |
order_external_id | chaîne | Non | Le external_id de la commande associée. |
order_item_external_id | chaîne | Non | Le external_id de la ligne associée. Nécessite order_external_id. |
category | chaîne | Non | order ou device. À envoyer avec topic. |
topic | chaîne | Non | Le sujet, choisi dans la liste de sa catégorie (voir ci-dessous). |
status | chaîne | Non | open (par défaut), answered, waiting ou closed. |
message | chaîne | Non | Le message d'ouverture, jusqu'à 16 000 caractères. |
answered_at | entier | Non | La date de la première réponse, en secondes Unix. |
created_at | entier | Non | La date d'origine. Par défaut, la date de la commande. |
messages | tableau | Non | Les messages du fil (voir ci-dessous). |
Sujets de la catégorie order : 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.
Sujets de la catégorie device : 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.
Chaque entrée de messages :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
external_id | chaîne | Oui | Votre référence pour le message, unique dans le lot. |
text | chaîne | Oui | Le message, jusqu'à 16 000 caractères. |
author | chaîne | Non | customer (par défaut) ou shop. |
status | chaîne | Non | activated ou deleted. |
created_at | entier | Non | La date du message. Par défaut, la date de la demande. |
Une demande est enregistrée avec tous ses messages ou pas du tout. Les messages que vous omettez lors d'un import ultérieur sont conservés.
Chaque entrée acceptée du rapport ajoute messages (le nombre de messages created, updated et unchanged) et messages_detail (une entrée par message : son external_id, son action et son id).
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 }
]
}
]
}' {
"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
}
} Lire une demande de support
GET /v1/support-request/import
| Paramètre | Emplacement | Description |
|---|---|---|
external_id | query | La référence d'origine de la demande. |
id | query | Son identifiant dans votre boutique, préfixé sprq_. |
Sans l'un ni l'autre, l'appel répond 400 Missing required parameter: external_id. ; une demande inconnue répond 404 Support request not found.
curl "https://api.ultineo.com/v1/support-request/import?external_id=SUP-4402" \
-H "Authorization: Bearer sk-project-YOUR_KEY" {
"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
}
]
}
} Le fil est renvoyé par ordre chronologique, y compris les messages rédigés dans votre espace de travail (leur external_id est vide).
Remarque — Ces points d'accès ne listent, ne recherchent ni ne suppriment d'enregistrements, et ne déclenchent aucune action : annuler une commande, émettre un remboursement, créer une étiquette d'expédition ou contacter un transporteur se font dans votre espace de travail.