Créer une tâche d'impression USB
POST https://www.expedy.fr/api/v2/devices/{device_uid}/usb/{usb_port}/print
Envoie une tâche d'impression vers une imprimante branchée sur l'un des ports USB de votre boîtier Expedy.
URL de base : https://www.expedy.fr/api/v2
Authentification
Ce endpoint nécessite un en-tête Authorization contenant votre SID et votre TOKEN, séparés par un seul deux-points.
Authorization: <SID>:<TOKEN>
Authorization: 9F3K7Q2WZ1ABCDEF:b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6
⚠️ Ce n'est pas un jeton Bearer. N'ajoutez pas de préfixe
BearerniBasic— envoyez la valeur bruteSID:TOKEN.
Les deux valeurs sont disponibles dans la console Expedy, rubrique API. Toutes les requêtes doivent être effectuées en HTTPS (TLS).
Paramètres de chemin
| Paramètre | Type | Requis | Description |
|---|---|---|---|
device_uid |
string |
Oui | UID du boîtier, visible dans la console sous Machines (ex. OOBBZ100PI). |
usb_port |
string |
Oui | Le port USB sur lequel l'imprimante est branchée : 1, 2, 3 ou 4, conformément aux ports affichés dans la console. Utilisez /usb/scan/read pour voir ce qui est connecté sur chacun. |
Un port n'accepte de tâche qu'une fois qu'une imprimante y a été détectée puis configurée. Si le port est libre, ou si l'imprimante qui s'y trouve n'a jamais été configurée, la tâche est refusée.
Corps de la requête
Content-Type : application/json
| Paramètre | Type | Requis | Description |
|---|---|---|---|
usb_msg |
string |
Oui | Le contenu à imprimer, construit avec les balises de mise en page du ticket (<C>, <BOLD>, <IMG>, <QR>, <CUT/>, …). Texte brut, QR codes, images ou URL d'un PDF. |
notification_url |
string |
Non | Une URL que le service d'impression appelle une fois la tâche remise à l'imprimante. Elle permet de boucler la boucle dans votre propre système plutôt que de supposer que le ticket est sorti. |
origin |
string |
Non | Une étiquette libre pour marquer la source de la tâche (un URI, un nom d'application, un service…). Utile pour filtrer et déboguer dans vos journaux. |
printer_han |
string |
Non | L'écriture dans laquelle composer le ticket : cn chinois, kr coréen, jp japonais. Omettez-le pour les écritures latines. Voir Caractères asiatiques. |
Exemple de requête :
{
"usb_msg": "<C><BOLD>ORDER #1234</BOLD></C>\n<C>Table 7</C>\n--------------------------------\n1 x Burger\n2 x Fries\n<CUT/>",
"notification_url": "https://www.example.com/print-callback",
"origin": "pos-kitchen-01"
}
Exemple cURL :
curl -X POST "https://www.expedy.fr/api/v2/devices/OOBBZ100PI/usb/1/print" \
-H "Authorization: <SID>:<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"usb_msg":"<C><BOLD>Hello</BOLD></C><CUT/>","origin":"my-app"}'
Caractères asiatiques
Le chinois, le japonais et le coréen exigent printer_han, réglé sur l'écriture que vous imprimez.
| Valeur | Écriture |
|---|---|
cn |
chinois |
kr |
coréen |
jp |
japonais |
1 reste accepté comme synonyme de cn.
Par défaut, le ticket est composé en mode mono-octet : chaque caractère est associé à l'une des code pages de l'imprimante. Aucune code page mono-octet ne contient de hanzi, de kana ni de hangul : sans ce paramètre, chacun de ces caractères est remplacé par un ? avant même que la tâche n'atteigne l'appareil.
{
"usb_msg": "<C><BOLD>주문 #1234</BOLD></C>\n<CUT/>",
"printer_han": "kr"
}
La valeur doit correspondre à l'écriture. Chacune sélectionne un encodage différent, et ils ne se recouvrent pas : du coréen envoyé en cn ressort en ?, exactement comme si le paramètre avait été omis.
L'imprimante doit posséder la police correspondante. printer_han bascule le flux en mode multi-octets ; les glyphes, eux, viennent de la ROM de police de l'imprimante. Un modèle vendu sans cette police n'imprimera pas ces caractères, même avec la bonne valeur, et une imprimante destinée au marché chinois embarque les hanzi, ce qui ne signifie pas qu'elle embarque le hangul ou les kana. Testez l'écriture dont vous avez besoin sur le modèle exact que vous déployez, et contactez le support si le résultat n'est pas lisible.
Le texte latin n'en a pas besoin. Laissez printer_han de côté pour les langues européennes : les caractères accentués sont gérés par le mode par défaut.
Envoyez votre contenu en UTF-8 dans tous les modes. L'API stocke et renvoie exactement ce qu'elle reçoit : l'historique d'impression de la console affiche donc le texte tel qu'il est arrivé, ce qui reste le moyen le plus rapide de distinguer un problème de données d'un problème d'imprimante.
Réponse 200 OK
La tâche a été acceptée et mise en file d'attente.
ℹ️ Un
200confirme uniquement la réception côté serveur — pas que le ticket a été physiquement imprimé. La remise est asynchrone : le boîtier reçoit la tâche lors de sa prochaine connexion. L'imprimante peut être hors ligne, à court de papier, éteinte ou injoignable à cet instant. Renseigneznotification_urlsi vous avez besoin de savoir ce qui s'est réellement passé.
| Paramètre | Type | Description |
|---|---|---|
request_uid |
string |
Identifiant unique de la tâche d'impression acceptée (ex. 1X5ERXL94BYVWHP92DK3MCASUGJ). |
last_ping |
integer |
Horodatage Unix du dernier contact du boîtier avec le serveur. Une valeur ancienne signifie que le boîtier n'était pas en ligne au moment de l'envoi. |
Exemple de réponse :
{
"last_ping": 1641509604,
"request_uid": "1X5ERXL94BYVWHP92DK3MCASUGJ"
}
last_ping mérite d'être lu à chaque appel : c'est le signal le moins coûteux qu'un boîtier s'est tu.
Erreurs
| Statut | Signification |
|---|---|
403 |
Identifiants manquants ou invalides (SID / TOKEN), ou le boîtier n'appartient pas à ce compte. |
404 |
device_uid inconnu, ou aucune imprimante configurée sur ce usb_port. |
405 |
Mauvaise méthode HTTP — ce endpoint n'accepte que POST. |
422 |
usb_msg vide ou mal formé. |
500 |
La tâche n'a pas pu être remise au boîtier. Réessayez, puis contactez le support si cela persiste. |
Bonnes pratiques
- Idempotence. Chaque requête acceptée produit une impression. Le endpoint ne dédoublonne pas : si vous réessayez après une erreur réseau, protégez-vous contre la double impression de votre côté.
- Gardez
usb_msgdans la largeur du papier. 32 caractères par ligne en 58 mm, 48 en 80 mm. Voir la référence de mise en page. - Testez avec et sans images. Certains modèles d'imprimante rejettent certains types d'images et peuvent faire échouer toute la tâche — validez avant la mise en production.
Endpoints associés
GET https://www.expedy.fr/api/v2/devices/{device_uid}/usb/scan/read
Renvoie ce qui est actuellement branché sur chaque port USB, avec le fabricant et le modèle détectés. Utilisez-le pour découvrir sur quel port imprimer, et pour vérifier qu'une imprimante est toujours là où vous le croyez.
/usb/conf renvoie la configuration enregistrée de chaque port : largeur du papier, mode d'impression, mode graphique.
SDK & exemples
Vous préférez un client prêt à l'emploi ? Utilisez le SDK officiel Node.js :