Linework Developers
FR
Obtenir l'accès

Guide · store:write · orders:write

Gérer une boutique Bloop

Connectez votre entrepôt, votre e-commerce ou votre tableur à votre boutique Bloop sur Linework : produits, stocks, commandes et expédition.

Scopes : store:read, store:write, orders:read, orders:write.

Les paiements sont gérés par Linework dans l'application. L'API ne déplace jamais d'argent : vous gérez le catalogue et l'exécution des commandes, les acheteurs paient dans Linework comme d'habitude.

Les endpoints#

EndpointUsage
GET /storeVotre boutique.
POST /storeCréer votre boutique, si vous n'en avez pas encore.
PATCH /storeMettre à jour le nom, la description et les autres informations de la boutique.
GET /store/productsLister vos produits (paginé).
POST /store/productsCréer un produit.
PATCH /store/products/{id}Mettre à jour un produit.
DELETE /store/products/{id}Supprimer un produit.
PATCH /store/products/{id}/stockDéfinir la quantité disponible.
GET /store/ordersCommandes reçues (paginé).
GET /store/orders/{id}Une commande avec ses articles et l'adresse de livraison.
POST /store/orders/{id}/shipMarquer une commande comme expédiée, avec le suivi.

1. Vérifier votre boutique#

curl https://api.linework.app/open/v1/store \
  -H "Authorization: Bearer $LINEWORK_API_KEY"

Si vous n'avez pas encore de boutique, GET /store renvoie 404 NOT_FOUND : créez-la avec POST /store (champs décrits dans la Référence de l'API).

2. Créer un produit#

Importez d'abord les photos avec POST /media (voir Publier avec des médias), puis créez le produit avec leurs mediaId.

curl https://api.linework.app/open/v1/store/products \
  -H "Authorization: Bearer $LINEWORK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Linen shirt",
    "description": "100% Italian linen, made in Biella.",
    "price": 59.00,
    "currency": "EUR",
    "stock": 25,
    "sku": "SHIRT-LIN-M",
    "mediaIds": ["m_8f2c1a"]
  }'
const res = await fetch("https://api.linework.app/open/v1/store/products", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.LINEWORK_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    title: "Linen shirt",
    description: "100% Italian linen, made in Biella.",
    price: 59.0,
    currency: "EUR",
    stock: 25,
    sku: "SHIRT-LIN-M",
    mediaIds: [mediaId],
  }),
});
const product = await res.json();
import os, requests

API = "https://api.linework.app/open/v1"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['LINEWORK_API_KEY']}"

product = s.post(API + "/store/products", json={
    "title": "Linen shirt",
    "description": "100% Italian linen, made in Biella.",
    "price": 59.00,
    "currency": "EUR",
    "stock": 25,
    "sku": "SHIRT-LIN-M",
    "mediaIds": [media_id],
}, timeout=30).json()

3. Synchroniser les stocks#

Utilisez l'endpoint dédié au stock : il est léger et ne touche pas au reste du produit.

curl -X PATCH https://api.linework.app/open/v1/store/products/7781/stock \
  -H "Authorization: Bearer $LINEWORK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "stock": 12 }'

Une tâche de synchronisation type lit les quantités depuis votre système et ne met à jour que les produits qui ont changé :

const API = "https://api.linework.app/open/v1";
const headers = { Authorization: `Bearer ${process.env.LINEWORK_API_KEY}`, "Content-Type": "application/json" };

const warehouse = { "SHIRT-LIN-M": 12, "SHIRT-LIN-L": 0 }; // from your system

let cursor = null;
do {
  const url = `${API}/store/products?limit=100${cursor ? `&cursor=${encodeURIComponent(cursor)}` : ""}`;
  const page = await fetch(url, { headers }).then((r) => r.json());
  for (const p of page.data) {
    const qty = warehouse[p.sku];
    if (qty !== undefined && qty !== p.stock) {
      await fetch(`${API}/store/products/${p.id}/stock`, {
        method: "PATCH", headers, body: JSON.stringify({ stock: qty }),
      });
    }
  }
  cursor = page.next_cursor;
} while (cursor);
warehouse = {"SHIRT-LIN-M": 12, "SHIRT-LIN-L": 0}  # from your system

cursor = None
while True:
    params = {"limit": 100, **({"cursor": cursor} if cursor else {})}
    page = s.get(API + "/store/products", params=params, timeout=30).json()
    for p in page["data"]:
        qty = warehouse.get(p.get("sku"))
        if qty is not None and qty != p["stock"]:
            s.patch(f"{API}/store/products/{p['id']}/stock", json={"stock": qty}, timeout=30)
    cursor = page.get("next_cursor")
    if not cursor:
        break

Avec un stock à 0, le produit reste dans le catalogue en tant qu'épuisé. Pour le retirer, utilisez DELETE /store/products/{id}.

4. Lire les nouvelles commandes#

curl "https://api.linework.app/open/v1/store/orders?limit=50" \
  -H "Authorization: Bearer $LINEWORK_API_KEY"

Les commandes sont renvoyées de la plus récente à la plus ancienne. Chaque commande comporte un identifiant, un statut, ses articles, les totaux et, pour GET /store/orders/{id}, l'adresse de livraison. Récupérez la liste toutes les quelques minutes et traitez les commandes payées et pas encore expédiées. Le schéma complet des commandes et les valeurs de statut figurent dans la Référence de l'API.

Les commandes contiennent des données personnelles des acheteurs (nom, adresse). Utilisez-les uniquement pour exécuter la commande, protégez-les et ne les partagez pas. Consultez les Conditions de l'API.

5. Marquer comme expédiée#

curl https://api.linework.app/open/v1/store/orders/50213/ship \
  -H "Authorization: Bearer $LINEWORK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "carrier": "BRT", "trackingNumber": "084512345678" }'

L'acheteur est averti dans l'application avec les informations de suivi. Expédier deux fois une commande, ou une commande qui ne peut pas être expédiée (par exemple annulée), échoue avec 409 CONFLICT.