Aller au contenu

Modifier un code

PATCH/v1/codes/{id}

Changer la destination

requêtePATCH /v1/codes/qr_8841ce2mxk
curl -X PATCH https://api.dotwick.com/v1/codes/qr_8841ce2mxk \  -H "Authorization: Bearer sk_live_…" \  -H "Content-Type: application/json" \  -d '{    "content": {      "type": "url",      "url": "https://example.com/fleet/van-014-spring"    }  }'
réponse200 OK
{  "id": "qr_8841ce2mxk",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "name": "Van fleet – unit 14",  "type": "url",  "dynamic": true,  "status": "active",  "slug": "Xq7mK2p",  "domainId": null,  "shortUrl": "https://dotwick.co/Xq7mK2p",  "content": {    "type": "url",    "url": "https://example.com/fleet/van-014-spring"  },  "design": {    "pattern": "rounded",    "eyes": {      "frame": "circle",      "ball": "circle"    },    "colors": {      "fg": "#18181B",      "bg": "#FFFFFF"    }  },  "rules": {    "routes": [],    "expiresAt": null,    "scanLimit": null,    "inactiveUrl": null,    "passwordProtected": false  },  "folderId": "fld_8k2m4q7x",  "templateId": null,  "createdBy": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",  "createdAt": "2026-09-10T09:41:08.000Z",  "updatedAt": "2026-09-12T14:03:51.000Z",  "scans": 0}

Mises à jour partielles

N’envoyez que les champs à modifier ; les autres restent inchangés. design et rules sont fusionnés clé par clé avec ce qui est stocké, les tableaux remplacent le tableau stocké, et null efface une valeur.

Un nouveau slug laisse aussi fonctionner l’ancien : les liens déjà imprimés ne cassent donc jamais. Chaque modification est conservée dans l’historique du code (GET /v1/codes/{id}/versions) et envoie un webhook code.updated.

Mettre en pause et reprendre

requêtePATCH /v1/codes/qr_8841ce2mxk
curl -X PATCH https://api.dotwick.com/v1/codes/qr_8841ce2mxk \  -H "Authorization: Bearer sk_live_…" \  -H "Content-Type: application/json" \  -d '{    "status": "paused"  }'
réponse200 OKextrait : les scanners voient désormais la page de pause ; envoyez active pour reprendre
{  "id": "qr_8841ce2mxk",  "status": "paused",  "updatedAt": "2026-09-12T14:03:51.000Z"}

Dupliquer un code

POST /v1/codes/{id}/duplicate copie un code : son type, son contenu, son design, ses règles, son mot de passe, ses étiquettes, son dossier et son domaine suivent. La copie reçoit son propre lien court, un nom comme Table 4 (copy), aucun scan et le statut active. Elle compte dans le forfait comme tout nouveau code et répond 201 avec le nouveau code, dont duplicatedFromId est l’original.

Envoyez name, folderId (null pour le niveau supérieur) ou slug (Pro et au-dessus, codes dynamiques) pour les fixer sur la copie. Les codes de carte de visite, les codes GS1 et les codes désactivés par Dotwick ne peuvent pas être dupliqués. Envoyez une Idempotency-Key pour qu’une nouvelle tentative ne crée jamais deux copies.

requêtePOST /v1/codes/qr_8841ce2mxk/duplicate
curl -X POST https://api.dotwick.com/v1/codes/qr_8841ce2mxk/duplicate \  -H "Authorization: Bearer sk_live_…" \  -H "Content-Type: application/json" \  -H "Idempotency-Key: van-014-copy-1" \  -d '{    "name": "Van fleet – unit 14 (spring)",    "folderId": "fld_8k2m4q7x"  }'
réponse201 Created
{  "id": "qr_5d3b7e1f9a2c",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "name": "Van fleet – unit 14 (spring)",  "type": "url",  "dynamic": true,  "status": "active",  "slug": "van14b",  "domainId": null,  "shortUrl": "https://dotwick.co/van14b",  "content": {    "type": "url",    "url": "https://example.com/fleet/van-014"  },  "design": {    "pattern": "rounded",    "eyes": {      "frame": "circle",      "ball": "circle"    },    "colors": {      "fg": "#18181B",      "bg": "#FFFFFF"    }  },  "rules": {    "routes": [],    "expiresAt": null,    "scanLimit": null,    "inactiveUrl": null,    "passwordProtected": false  },  "folderId": "fld_8k2m4q7x",  "templateId": null,  "createdBy": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",  "createdAt": "2026-09-12T14:03:51.000Z",  "updatedAt": "2026-09-12T14:03:51.000Z",  "scans": 0,  "duplicatedFromId": "qr_8841ce2mxk"}

Modifier plusieurs codes à la fois

PATCH /v1/codes/bulk applique une action à jusqu’à 500 codes : pause, resume, archive, unarchive, addTags ou removeTags (les deux avec tagIds), move (avec folderId, null pour le niveau supérieur) ou delete. À ne pas confondre avec POST /v1/codes/bulk, qui crée des codes.

Chaque code est traité séparément, avec les mêmes règles, événements et webhooks qu’une modification isolée. La réponse est 200 même si certains codes ont échoué : results contient une entrée par code dans l’ordre de la requête, avec ok et changed, ou avec reason et message pour un code qui n’a pas pu recevoir l’action, et counts les additionne. Un code déjà dans l’état demandé est ok avec changed: false.

Répéter la requête est sans risque, elle ne prend donc pas d’Idempotency-Key. Une étiquette ou un dossier inconnu fait échouer toute la requête avec 404 not_found sans rien écrire, tout comme un déplacement vers un dossier avec un forfait sans dossiers (403 feature_not_in_plan).

  • not_found : ce code n’existe pas, ou il est dans un dossier que la clé ne peut pas voir.
  • forbidden : le rôle de la clé peut voir le code mais pas le modifier.
  • managed_code : le code appartient à une carte de visite ; mettre en pause, archiver et supprimer passent par la carte.
  • static_code et code_disabled : rien à mettre en pause ni à reprendre.
  • not_resumable : le code s’est arrêté à cause de sa date d’expiration ou de sa limite de scans ; changez plutôt cette règle.
  • too_many_tags : addTags mettrait plus d’étiquettes sur le code qu’il n’en peut porter.
requêtePATCH /v1/codes/bulk
curl -X PATCH https://api.dotwick.com/v1/codes/bulk \  -H "Authorization: Bearer sk_live_…" \  -H "Content-Type: application/json" \  -d '{    "action": "pause",    "codeIds": [      "qr_8841ce2mxk",      "qr_2k8m4q7x1c9v"    ]  }'
réponse200 OK
{  "action": "pause",  "results": [    {      "codeId": "qr_8841ce2mxk",      "ok": true,      "changed": true    },    {      "codeId": "qr_2k8m4q7x1c9v",      "ok": false,      "reason": "static_code",      "message": "Static codes can't be paused: they work without our server."    }  ],  "counts": {    "ok": 1,    "changed": 1,    "failed": 1  }}