Saltar al contenido

Actualizar un código

PATCH/v1/codes/{id}

Cambiar el destino

solicitudPATCH /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"    }  }'
respuesta200 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}

Actualizaciones parciales

Envía solo los campos que quieras cambiar; el resto se queda como está. design y rules se combinan clave por clave con lo guardado, los arrays sustituyen al array guardado y null borra un valor.

Un slug nuevo mantiene también el antiguo funcionando, para que los enlaces ya impresos nunca se rompan. Cada cambio se guarda en el historial del código (GET /v1/codes/{id}/versions) y envía un webhook code.updated.

Pausar y reanudar

solicitudPATCH /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"  }'
respuesta200 OKextracto: los escáneres ahora ven la página en pausa; envía active para reanudar
{  "id": "qr_8841ce2mxk",  "status": "paused",  "updatedAt": "2026-09-12T14:03:51.000Z"}

Duplicar un código

POST /v1/codes/{id}/duplicate copia un código: su tipo, contenido, diseño, reglas, contraseña, etiquetas, carpeta y dominio pasan a la copia. La copia recibe su propio enlace corto, un nombre como Table 4 (copy), ningún escaneo y el estado active. Cuenta para el plan como cualquier código nuevo y responde 201 con el código nuevo, cuyo duplicatedFromId es el original.

Envía name, folderId (null para el nivel superior) o slug (Pro y superiores, códigos dinámicos) para fijarlos en la copia. Los códigos de tarjeta de visita, los códigos GS1 y los que Dotwick ha desactivado no se pueden duplicar. Envía una Idempotency-Key para que un reintento nunca cree dos copias.

solicitudPOST /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"  }'
respuesta201 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"}

Cambiar muchos códigos a la vez

PATCH /v1/codes/bulk aplica una acción a hasta 500 códigos: pause, resume, archive, unarchive, addTags o removeTags (ambas con tagIds), move (con folderId, null para el nivel superior) o delete. No lo confundas con POST /v1/codes/bulk, que crea códigos.

Cada código se trata por separado, con las mismas reglas, eventos y webhooks que un cambio individual. La respuesta es 200 aunque algunos códigos hayan fallado: results trae una entrada por código en el orden de la solicitud, con ok y changed, o con reason y message para un código que no pudo aceptar la acción, y counts las suma. Un código que ya está en el estado pedido es ok con changed: false.

Repetir la solicitud es seguro, así que no lleva Idempotency-Key. Una etiqueta o carpeta desconocida hace fallar toda la solicitud con 404 not_found sin escribir nada, igual que mover a una carpeta en un plan sin carpetas (403 feature_not_in_plan).

  • not_found: no existe ese código, o está en una carpeta que la clave no puede ver.
  • forbidden: el rol de la clave puede ver el código pero no cambiarlo.
  • managed_code: el código pertenece a una tarjeta de visita; pausar, archivar y eliminar pasan por la tarjeta.
  • static_code y code_disabled: no hay nada que pausar ni reanudar.
  • not_resumable: el código se detuvo por su fecha de caducidad o su límite de escaneos; cambia esa regla en su lugar.
  • too_many_tags: addTags pondría más etiquetas de las que el código admite.
solicitudPATCH /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"    ]  }'
respuesta200 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  }}