API v1
Documentación de la API
Con la API de DIGO Email, tu sitio web, tu tienda online o tu sistema de gestión trabajan junto a tu cuenta: suscriben a los contactos con su consentimiento, envían productos y artículos para usar en tus emails y registran pedidos y carritos para medir cuánto vende cada campaña y poner en marcha las automatizaciones.
Antes de empezar
En estos casos no hace falta escribir código, porque la conexión ya está lista:
- WordPress y WooCommerce: descarga el plugin desde Integraciones. Lleva a DIGO Email las suscripciones del checkout y de los formularios de Contact Form 7, los pedidos, los productos, los artículos del blog y los carritos.
- digo.sale: en la administración de la tienda abre Marketing → DIGO Email y pega la clave.
- Un formulario de suscripción: cada lista tiene el suyo, para compartirlo con un enlace o insertarlo en tu sitio, en Listas y formularios.
- ChatGPT y Claude: conecta tu asistente desde Integraciones › ChatGPT y Claude. Accede con tu consentimiento (OAuth), sin la clave API.
La API sirve para todo lo demás: un sitio web hecho a medida, otra plataforma de e-commerce, un CRM, un sistema de gestión o una app con su propio servidor.
403 account_inactive.Primeros pasos
- En el panel abre Integraciones. En Conectar un sitio escribe el nombre y la dirección del sitio y elige Sitio web como plataforma.
- Pulsa Conectar y crear la clave y copia la clave que aparece: empieza por
dge_y solo te la mostramos una vez. - Prueba la clave pidiendo los datos de la conexión:
Solicitud
curl https://www.digo.email/api/v1/ping \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Accept: application/json"
Respuesta · 200
{
"store": "Tienda online",
"account": "Rossi S.L.",
"platform": "site",
"can_send": true,
"status": "active"
}
Desde la primera solicitud correcta, el sitio aparece como Conectado en el panel.
Autenticación
Cada solicitud lleva la clave del sitio en la cabecera Authorization, después de la palabra Bearer:
Cabecera
Authorization: Bearer dge_TU_CLAVE
- Una clave por sitio. Puedes conectar hasta 20 sitios, cada uno con su clave. Productos, artículos, pedidos y carritos pertenecen al sitio que los envió; contactos, listas, etiquetas y campos son de la cuenta y valen para todos los sitios.
- Guárdala en el servidor. Quien tenga la clave puede suscribir direcciones y enviar pedidos en tu nombre: nunca la pongas en el JavaScript de tus páginas, en una app instalada en los móviles ni en un repositorio público.
- Solo la ves una vez. Guardamos únicamente una huella cifrada de la clave y en el panel mostramos sus últimos seis caracteres. Si la pierdes, crea una nueva.
- Para cambiarla abre Integraciones y luego Editar o cambiar clave › Clave nueva: la anterior deja de funcionar al instante. Hazlo si crees que alguien la ha visto.
- Desconectar el sitio desactiva la clave y borra los productos, artículos y pedidos recibidos de ese sitio. Los contactos se quedan.
Solicitudes y respuestas
Todas las direcciones empiezan así:
https://www.digo.email/api/v1
- JSON. Envía los datos en JSON con
Content-Type: application/jsony pide las respuestas conAccept: application/json. Las respuestas siempre son JSON, en UTF-8. Usa siempre HTTPS. - Tus propios identificadores. Productos, artículos, pedidos y carritos se reconocen por tu
id(texto, hasta 64 caracteres). Enviar de nuevo el mismoidactualiza el elemento en lugar de crear otro. - Importes en unidades de la moneda, con punto para los decimales:
49.90, no4990. La moneda es un código de tres letras (EUR,MXN,USD); si falta, vale la del sitio configurada en Integraciones. - Fechas en formato ISO 8601 con la zona horaria:
2026-10-20T09:30:00+02:00. - Mensajes. El campo
messagede los errores está escrito para personas, en italiano, inglés, español, francés o alemán según la cabeceraAccept-Languageo el idioma de la cuenta. En tu código decide según el código HTTP y el campoerror, que no cambian. - Campos nuevos. Las respuestas pueden incluir campos nuevos: ignora los que no conozcas.
Errores
Los códigos 2xx indican que la solicitud ha ido bien. En los demás casos, el cuerpo de la respuesta explica qué ha pasado:
Respuesta · 403
{
"error": "account_inactive",
"message": "La cuenta de DIGO Email aún no está activa."
}
| Código | error | Qué significa y qué hacer |
|---|---|---|
401 | invalid_key | Clave ausente, incorrecta o sustituida. Revisa la clave o crea una nueva. |
403 | account_inactive | La cuenta todavía está en verificación y no acepta suscripciones. Te avisamos por email cuando esté activa. |
403 | account_suspended | Los envíos de la cuenta están suspendidos y las suscripciones se rechazan. Escribe al soporte. |
409 | contact_limit | Los contactos han llegado al doble del límite de la cuenta: las nuevas suscripciones se rechazan hasta que compres más contactos o elimines los que no usas. |
409 | privacy_missing | Solo para GET /forms: falta el enlace a tu política de privacidad. Añádelo en Ajustes › Empresa. |
422 | unknown_list | No existe ninguna de las listas indicadas. Vuelve a leer los id con GET /lists. |
422 | — | Datos no válidos: el campo errors enumera los problemas campo por campo. Corrige los datos antes de volver a intentarlo. |
429 | — | Demasiadas solicitudes. Espera los segundos indicados en la cabecera Retry-After. |
5xx | — | Un problema temporal por nuestra parte. Vuelve a intentarlo más tarde, esperando un poco más cada vez. |
Respuesta · 422
{
"message": "Debes aceptar la declaración de consentimiento.",
"errors": {
"consent": ["Debes aceptar la declaración de consentimiento."]
}
}
Límites
- Hasta 300 solicitudes por minuto por cada sitio conectado, contando todos los endpoints.
- Para
POST /contacts, como máximo 60 suscripciones por minuto por sitio. - Productos, artículos y pedidos pasados viajan en grupos de 100 por solicitud.
- Las respuestas indican el límite general (
X-RateLimit-Limit) y cuántas solicitudes quedan en el minuto (X-RateLimit-Remaining). Al superar un límite recibes429conRetry-After.
Una solicitud que falló por un error de red, un 429 o un 5xx se puede repetir sin problema: pedidos, productos, artículos y carritos se actualizan por id y un contacto ya suscrito no se duplica. En cambio, los demás errores 4xx se repiten igual hasta que corrijas los datos.
Lista de endpoints
| Método | Ruta | Para qué sirve |
|---|---|---|
| GET | /ping | Comprueba la clave y el estado de la cuenta |
| GET | /lists | Las listas, con sus id |
| GET | /tags | Las etiquetas |
| GET | /fields | Los campos personalizados de los contactos |
| GET | /forms | Los formularios de suscripción, listos para mostrar |
| POST | /contacts | Suscribe a un contacto con su consentimiento |
| PUT | /items | Crea o actualiza productos y artículos |
| DELETE | /items/{type}/{id} | Quita un producto o un artículo |
| POST | /orders | Registra un pedido o actualiza su estado |
| POST | /orders/history | Importa los pedidos pasados |
| PUT | /carts | Guarda el carrito de un cliente |
| DELETE | /carts/{id} | Cierra un carrito vaciado |
Cuenta y ajustes
Estos endpoints leen lo que has preparado en el panel: tu sitio los usa para que quien lo configura elija listas, etiquetas y campos.
GET /ping
Comprueba la clave y el estado de la cuenta. Llámalo cuando alguien pegue la clave en los ajustes de tu sitio y, de vez en cuando, para saber si la cuenta acepta suscripciones. La respuesta es la de Primeros pasos.
| Campo | Tipo | Descripción |
|---|---|---|
store | string | El nombre del sitio en Integraciones. |
account | string | El nombre de la cuenta de DIGO Email. |
platform | string | La plataforma elegida: woocommerce, digo_sale o site (Sitio web). |
can_send | boolean | true cuando la cuenta está activa y acepta suscripciones. |
status | string | pending (en verificación), active (activa) o suspended (envíos suspendidos). |
GET /lists
Las listas de la cuenta en orden alfabético, con el id que debes usar para suscribir contactos.
Respuesta · 200
{
"data": [
{ "id": 3, "name": "Clientes", "double_opt_in": false },
{ "id": 5, "name": "Newsletter", "double_opt_in": true }
]
}
Con double_opt_in en true, quien se suscribe recibe un email para confirmar: queda suscrito, y recibe las campañas, solo después de confirmar.
GET /tags
Las etiquetas de la cuenta en orden alfabético. Para poner una etiqueta a un contacto basta su nombre: las que no existen se crean.
Respuesta · 200
{
"data": [
{ "id": 9, "name": "Madrid" },
{ "id": 7, "name": "VIP" }
]
}
GET /fields
Los campos personalizados de los contactos, que creas en Contactos › Campos personalizados.
Respuesta · 200
{
"data": [
{ "key": "empresa", "label": "Empresa", "type": "text" },
{ "key": "nacimiento", "label": "Fecha de nacimiento", "type": "date" }
]
}
| Campo | Tipo | Descripción |
|---|---|---|
key | string | El nombre que debes usar en fields de POST /contacts. También es el marcador en los emails: {{nacimiento}}. |
label | string | El nombre que se muestra en el panel. |
type | string | text, number o date. |
GET /forms
Los formularios de suscripción de las listas, con todo lo necesario para mostrarlos con el estilo de tu sitio. Es lo que usa el shortcode del plugin para WordPress.
| Parámetro | Tipo | Descripción |
|---|---|---|
lang | string | Opcional, en la dirección: el idioma de la página (it, en, es, fr o de). Las etiquetas y el texto del consentimiento llegan en ese idioma, salvo que la lista tenga uno propio. |
Solicitud
curl "https://www.digo.email/api/v1/forms?lang=es" \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Accept: application/json"
Respuesta · 200
{
"data": [
{
"id": 5,
"name": "Newsletter",
"title": "Suscríbete a la newsletter",
"action": "https://www.digo.email/f/k3Jd9QmZ2xTb7LpV4nWc8RyA1sGe6HuF",
"locale": "es",
"consent_text": "Acepto recibir comunicaciones por email de Rossi S.L. Puedo darme de baja en cualquier momento.",
"labels": { "email": "Email", "optional": "opcional", "privacy": "Política de privacidad", "submit": "Suscríbete" },
"privacy_url": "https://www.tusitio.es/privacidad",
"double_opt_in": true,
"fields": [
{ "name": "first_name", "label": "Nombre", "type": "text", "required": false },
{ "name": "fields[nacimiento]", "label": "Fecha de nacimiento", "type": "date", "required": false }
],
"script": "https://www.digo.email/js/digo-form.js?v=3",
"can_send": true
}
]
}
El formulario no pasa por tu servidor: el navegador del visitante lo envía directamente a la dirección action, sin clave. El consentimiento, el doble opt-in y las protecciones contra abusos son los de los formularios de DIGO Email. Para crearlo:
- un
<form method="post">conactioncomo destino; - el campo
emaily los campos defields, cada uno con suname, obligatorios cuandorequiredestrue; - una casilla
consentjunto al textoconsent_texty al enlace aprivacy_url, más un campo ocultoconsent_textcon el mismo texto; - el script indicado en
script. En los sitios de la cuenta (los dominios de envío verificados y los sitios conectados) envía el formulario sin salir de la página y muestra ahí la respuesta; en otros sitios, o sin el script, el visitante ve la respuesta en una página de DIGO Email.
No llames website a ningún campo: es la trampa para los programas automáticos y un formulario que lo rellena se ignora. Sin el enlace a la política de privacidad en los ajustes de la cuenta, la respuesta es 409 privacy_missing.
Contactos
POST /contacts
Suscribe a una persona que ha aceptado recibir tus emails: desde un formulario de tu sitio, en el checkout o al registrarse. Sin consentimiento no se guarda nada.
| Campo | Tipo | Descripción |
|---|---|---|
emailobligatorio | string | La dirección de email, hasta 190 caracteres. |
list_idsobligatorio | array | Los id de las listas, de 1 a 10 (GET /lists). Los que no existen se ignoran; si no existe ninguno, la respuesta es 422 unknown_list. |
consentobligatorio | boolean | Tiene que ser true: la persona ha marcado la casilla del consentimiento. |
consent_textobligatorio | string | El texto exacto de la casilla que la persona marcó, hasta 1000 caracteres. Lo guardamos como prueba del consentimiento. |
sourceobligatorio | string | Dónde se ha suscrito: form (un formulario), checkout (una compra) o registration (al crear una cuenta en tu sitio). |
first_name | string | El nombre, hasta 100 caracteres. |
last_name | string | Los apellidos, hasta 100 caracteres. |
fields | object | Los campos personalizados, por key (GET /fields): {"nacimiento": "1990-04-18"}. Fechas como AAAA-MM-DD, números como números JSON (12.5). Los campos que no existen se ignoran. |
tags | array | Hasta 10 nombres de etiquetas, de 60 caracteres como máximo. Las que no existen se crean. |
language | string | El idioma de la persona: it, en, es, fr o de (también valen es_ES o Español). Los emails de confirmación, las campañas y las páginas de baja lo seguirán. Un idioma que no gestionamos se ignora. También se puede llamar locale. |
form | string | El nombre del formulario, hasta 190 caracteres: aparece en el historial del contacto. |
page | string | La dirección de la página donde se suscribió. Solo guardamos el dominio y la ruta, sin lo que va después de ? o #. |
ip | string | La dirección IP del visitante, no la de tu servidor: forma parte de la prueba del consentimiento. |
user_agent | string | El navegador del visitante, también para la prueba del consentimiento. |
Solicitud
curl -X POST https://www.digo.email/api/v1/contacts \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": "lucia.garcia@example.com",
"first_name": "Lucía",
"last_name": "García",
"list_ids": [5],
"tags": ["Sitio web"],
"fields": { "empresa": "García Diseño", "nacimiento": "1990-04-18" },
"consent": true,
"consent_text": "Quiero recibir la newsletter de Rossi S.L. con novedades y ofertas.",
"source": "form",
"form": "Pie de página",
"language": "es",
"page": "https://www.tusitio.es/contacto",
"ip": "203.0.113.24",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15_6) AppleWebKit/605.1.15"
}'
Respuesta · 200
{ "status": "confirming" }
| status | Qué significa |
|---|---|
subscribed | Suscrito. Si ya era un contacto, se han añadido las listas y las etiquetas. |
confirming | Tiene que confirmar desde el email que le hemos enviado: una de las listas tiene doble opt-in, o en el pasado se dio de baja. |
limited | Suscripción guardada, pero hoy esta dirección ya ha recibido demasiados emails de confirmación: el enlace llegará si se suscribe de nuevo mañana. |
capped | Suscripción guardada, pero la cuenta ya ha enviado los 500 emails de confirmación de hoy: pide a la persona que lo intente de nuevo mañana. |
Quien ya está entre tus contactos
- Las listas y las etiquetas se añaden, nunca se quitan.
- El nombre y los apellidos se quedan como están; los campos personalizados solo se rellenan si están vacíos, y el idioma solo si no tiene uno.
- Quien ya está suscrito entra enseguida también en las listas con doble opt-in, sin otra confirmación.
- Quien se dio de baja tiene que confirmar desde su propio buzón, incluso para las listas sin doble opt-in: nadie puede volver a suscribirlo en su lugar. A las direcciones que rebotaron o marcaron los emails como spam no les enviamos nada.
Qué pasa después
- En cuanto el contacto queda suscrito, enseguida o cuando confirma, se ponen en marcha las automatizaciones Se suscribe a una lista y Recibe una etiqueta.
- Por encima del límite de contactos de tu cuenta la suscripción se guarda igualmente, pero las campañas y las automatizaciones se detienen hasta que compres más contactos o elimines algunos; al doble del límite, las nuevas suscripciones se rechazan con
409 contact_limit. - En la ficha del contacto encuentras la suscripción con el texto del consentimiento, el sitio, la página y el formulario.
PHP, en el servidor que recibe el formulario
<?php
// La clave viene de una variable de entorno: no la escribas en el código.
$consentText = 'Quiero recibir la newsletter de Rossi S.L. con novedades y ofertas.';
if (empty($_POST['consentimiento'])) {
exit('Para suscribirte marca la casilla del consentimiento.');
}
$ch = curl_init('https://www.digo.email/api/v1/contacts');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DIGO_EMAIL_KEY'),
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => trim($_POST['email'] ?? ''),
'first_name' => trim($_POST['nombre'] ?? ''),
'list_ids' => [5],
'consent' => true,
'consent_text' => $consentText, // el mismo texto que se muestra junto a la casilla
'source' => 'form',
'language' => 'es',
'page' => 'https://www.tusitio.es/contacto',
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
]),
]);
$body = json_decode((string) curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$messages = [
'subscribed' => 'Gracias, ya estás suscrito.',
'confirming' => 'Casi listo: abre el email que te hemos enviado y confirma.',
'limited' => 'Hoy no podemos enviarte más emails de confirmación: inténtalo de nuevo mañana.',
'capped' => 'Hoy no podemos enviarte más emails de confirmación: inténtalo de nuevo mañana.',
];
if ($code === 200) {
echo $messages[$body['status']] ?? $messages['subscribed'];
} else {
error_log('DIGO Email: ' . ($body['message'] ?? 'HTTP ' . $code));
echo 'No hemos podido completar la suscripción. Inténtalo de nuevo más tarde.';
}
Node.js 18 o posterior, en el servidor
const response = await fetch('https://www.digo.email/api/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DIGO_EMAIL_KEY}`,
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({
email: 'lucia.garcia@example.com',
list_ids: [5],
consent: true,
consent_text: 'Quiero recibir la newsletter de Rossi S.L. con novedades y ofertas.',
source: 'checkout',
language: 'es',
}),
});
const data = await response.json();
if (!response.ok) throw new Error(data.message);
console.log(data.status); // subscribed, confirming, limited o capped
Productos y artículos
Los productos y los artículos del blog que envías aquí aparecen en el editor de emails, en los bloques Productos y Artículos: quien escribe una campaña los elige de una lista, con título, imagen, precio y enlace ya preparados.
PUT /items
Crea o actualiza hasta 100 elementos por solicitud, reconocidos por type e id. Envíalos todos la primera vez y luego cada vez que cambien el título, el precio, la imagen o la disponibilidad.
| Campo | Tipo | Descripción |
|---|---|---|
itemsobligatorio | array | Los elementos, hasta 100. |
items[].typeobligatorio | string | product (producto) o post (artículo). |
items[].idobligatorio | string | Tu id del elemento, hasta 64 caracteres. |
items[].title | string | El nombre. Sin nombre, el elemento se omite. |
items[].url | string | La dirección completa de la página, con https://. Sin una dirección válida, el elemento se omite. |
items[].image | string | La dirección completa de la imagen. |
items[].excerpt | string | Una descripción breve, hasta 2000 caracteres. El HTML se elimina. |
items[].price | number | El precio, tal como lo ve el cliente. |
items[].sale_price | number | El precio rebajado: en los emails pasa a ser el precio, con el normal tachado. |
items[].available | boolean | false si el producto no está disponible. Si falta, vale true. |
items[].published_at | string | La fecha de publicación: en la lista, los artículos más recientes salen primero. |
Solicitud
curl -X PUT https://www.digo.email/api/v1/items \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"items": [
{
"type": "product",
"id": "1042",
"title": "Taza de cerámica esmaltada",
"url": "https://www.tusitio.es/productos/taza-esmaltada",
"image": "https://www.tusitio.es/media/taza-esmaltada.jpg",
"excerpt": "Hecha a mano, 350 ml, apta para lavavajillas.",
"price": 24.00,
"sale_price": 19.90,
"available": true
},
{
"type": "post",
"id": "87",
"title": "Cómo elegir la taza adecuada",
"url": "https://www.tusitio.es/blog/taza-adecuada",
"image": "https://www.tusitio.es/media/blog-tazas.jpg",
"excerpt": "Materiales, capacidad y cuidados: una guía en cinco minutos.",
"published_at": "2026-10-12T08:00:00+02:00"
}
]
}'
Respuesta · 200
{ "saved": 2, "skipped": [] }
saved cuenta los elementos guardados; skipped enumera los id omitidos por no tener nombre o una dirección válida.
DELETE /items/{type}/{id}
Quita de la lista un producto que ya no vendes o un artículo que ya no está publicado. Responde 204, sin contenido, aunque el elemento no estuviera. Los emails ya preparados que lo contienen no cambian.
Solicitud
curl -X DELETE https://www.digo.email/api/v1/items/product/1042 \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Accept: application/json"
Pedidos
Los pedidos sirven para medir cuánto vende cada campaña, poner en marcha las automatizaciones Hace una compra en la tienda y cerrar los carritos abandonados. Los compradores no se convierten en contactos: guardamos un pedido solo si quien compra ya está entre tus contactos o si llega desde el enlace de una campaña (consulta Ventas de las campañas). Los demás se descartan.
POST /orders
Registra un pedido o actualiza su estado. Envíalo cuando se crea y de nuevo con cada cambio (pago, reembolso, cancelación), siempre con el mismo id.
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Tu id del pedido, hasta 64 caracteres. |
statusobligatorio | string | pending (pendiente de pago), paid (pagado), refunded (reembolsado por completo) o cancelled (cancelado). |
totalobligatorio | number | El total que pagó el cliente, con impuestos y envío. |
email | string | El email de quien compra: vincula el pedido al contacto con la misma dirección. |
number | string | El número de pedido que ve el cliente, si es distinto del id. |
refunded | number | Cuánto se ha reembolsado hasta ahora. Para un reembolso parcial deja status en paid e indica aquí el importe. |
currency | string | El código de la moneda. Si falta, vale la del sitio. |
created_at | string | La fecha y hora del pedido. Si falta, vale el momento en que lo recibimos. |
click_id | string | El valor de la cookie digo_c, si existe: vincula el pedido a la campaña. |
items | array | Las líneas del pedido, hasta 200. |
items[].nameobligatorio | string | El nombre del producto. |
items[].quantityobligatorio | integer | La cantidad, al menos 1. |
items[].totalobligatorio | number | El total de la línea. |
items[].id | string | El id del producto, el mismo de PUT /items: lo necesitan las automatizaciones que se ponen en marcha para un producto concreto. |
Solicitud
curl -X POST https://www.digo.email/api/v1/orders \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id": "5531",
"number": "#5531",
"email": "lucia.garcia@example.com",
"status": "paid",
"total": 43.80,
"refunded": 0,
"currency": "EUR",
"created_at": "2026-10-20T10:15:00+02:00",
"click_id": "184467.9f1c2ab07d3e4f51",
"items": [
{ "id": "1042", "name": "Taza de cerámica esmaltada", "quantity": 2, "total": 39.80 }
]
}'
Respuesta · 200
{ "attributed": true }
attributed es true cuando el pedido cuenta para una campaña. Un pedido que no afecta ni a un contacto ni a una campaña no se guarda y la respuesta es {"attributed": false, "stored": false}.
- Cuando un pedido pasa a
paidpor primera vez y quien compra es un contacto, se ponen en marcha las automatizaciones Hace una compra en la tienda. - Un pedido
pendingopaidcierra los carritos abiertos de quien compra: los emails de carrito abandonado ya no salen. - En los informes cuentan los pedidos pagados, menos los reembolsos. Los pendientes y los cancelados no cuentan.
POST /orders/history
Importa los pedidos pasados, hasta 100 por solicitud, dentro de orders y con los mismos campos que POST /orders. Valen las mismas reglas, pero estos pedidos describen lo que ya ha pasado: no ponen en marcha automatizaciones ni cierran carritos. Puedes enviarlos de nuevo: actualizan los mismos pedidos. Un email no válido simplemente no coincide con ningún contacto.
Solicitud
curl -X POST https://www.digo.email/api/v1/orders/history \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"orders": [
{ "id": "4870", "email": "lucia.garcia@example.com", "status": "paid", "total": 24.00, "created_at": "2026-03-02T17:40:00+01:00" },
{ "id": "4871", "email": "javier.lopez@example.com", "status": "refunded", "total": 58.50, "refunded": 58.50, "created_at": "2026-03-03T09:12:00+01:00" }
]
}'
Respuesta · 200
{ "received": 2, "stored": 1 }
received cuenta los pedidos recibidos y stored los guardados porque son de tus contactos o llegaron desde una campaña.
Carritos
Con los carritos puedes recordar a los clientes lo que dejaron en tu tienda, con la automatización Abandona el carrito. En los emails, los marcadores {{carrello_link}}, {{carrello_totale}} y {{carrello_prodotti}} muestran el enlace para recuperar el carrito, el total y los productos.
PUT /carts
Guarda el carrito de un cliente cuyo email conoces, porque ha iniciado sesión o lo ha escrito en el checkout. Envíalo de nuevo con cada cambio, siempre con el mismo id. Solo guardamos los carritos de quien ya está entre tus contactos: nadie se convierte en contacto por llenar un carrito.
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Tu id del carrito, hasta 64 caracteres. |
emailobligatorio | string | El email del cliente. |
totalobligatorio | number | El total del carrito. |
urlobligatorio | string | La dirección que vuelve a abrir este carrito, también desde otro dispositivo: es el enlace del botón en los emails. Si no es válida, usamos la del sitio. |
itemsobligatorio | array | Los productos, de 1 a 100, con name, quantity y total obligatorios, e id e image (la dirección completa de la imagen) opcionales. |
currency | string | El código de la moneda. Si falta, vale la del sitio. |
Solicitud
curl -X PUT https://www.digo.email/api/v1/carts \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id": "c-8f2a1c",
"email": "lucia.garcia@example.com",
"total": 39.80,
"currency": "EUR",
"url": "https://www.tusitio.es/carrito?recuperar=8f2a1c",
"items": [
{ "id": "1042", "name": "Taza de cerámica esmaltada", "quantity": 2, "total": 39.80, "image": "https://www.tusitio.es/media/taza-esmaltada.jpg" }
]
}'
Respuesta · 200
{ "saved": true }
Si el email no es de uno de tus contactos, la respuesta es {"saved": false} y se quita el carrito que se hubiera guardado antes con el mismo id.
DELETE /carts/{id}
Cierra un carrito que el cliente ha vaciado. Responde 204, sin contenido. Después de una compra no hace falta: el pedido ya cierra los carritos de quien compra.
Solicitud
curl -X DELETE https://www.digo.email/api/v1/carts/c-8f2a1c \
-H "Authorization: Bearer dge_TU_CLAVE" \
-H "Accept: application/json"
Ventas de las campañas
Para decirte cuánto vende cada campaña, DIGO Email vincula los pedidos con los clics en los emails:
- Cuando alguien hace clic en un enlace del email que lleva a tu sitio, añadimos a la dirección el parámetro
digo_c, por ejemplohttps://www.tusitio.es/productos/taza-esmaltada?digo_c=184467.9f1c2ab07d3e4f51. Vale para la dirección del sitio configurada en Integraciones y para sus subdominios. - Si el visitante ha aceptado las cookies de marketing, tu sitio guarda el valor en la cookie
digo_cdurante 7 días. Un clic más reciente sustituye al anterior. - Cuando el cliente compra, envías el valor de la cookie como
click_idjunto con el pedido.
El pedido cuenta para la campaña si llega en los 7 días siguientes al último clic en ese email. Si el cliente hizo clic en varios emails, vale el último.
JavaScript, en todas las páginas del sitio
<script>
(function () {
var click = new URLSearchParams(location.search).get('digo_c');
if (!/^\d{1,19}\.[a-f0-9]{16}$/.test(click || '')) return;
if (!aceptoMarketing()) return; // la comprobación de tu banner de cookies
document.cookie = 'digo_c=' + click + '; path=/; max-age=604800; SameSite=Lax; Secure';
})();
</script>
PHP, cuando envías el pedido
$order['click_id'] = $_COOKIE['digo_c'] ?? null;
digo_c es una cookie de marketing: guárdala solo con el consentimiento del visitante e inclúyela en tu política de cookies (categoría marketing, duración 7 días, sirve para atribuir las ventas a las campañas de email). Si el visitante acepta las cookies después de abrir la página, repite la comprobación cuando el banner registre su elección.La vinculación solo funciona con la medición de clics activada, en Ajustes › Empresa › Medir aperturas y clics: sin ella, los enlaces de los emails llevan directamente al sitio y no llevan digo_c.
Buenas prácticas
- Llama a la API desde tu servidor, nunca desde el navegador: la clave no debe salir de él.
- No hagas esperar a los clientes. En el checkout pon en cola las suscripciones, los pedidos y los carritos y envíalos justo después: si DIGO Email va lento o no responde, la compra no debe bloquearse.
- Reintenta con calma tras un error de red, un
429o un5xx, esperando un poco más cada vez. Las solicitudes con otros errores4xxhay que corregirlas, no repetirlas. - Pide el consentimiento con una casilla para marcar, no marcada de antemano, y envía en
consent_textexactamente el texto que la persona leyó. - Envía el idioma de quien se suscribe con
language: los emails de confirmación, las campañas y las páginas de baja lo seguirán. - Mantén el catálogo al día: envía los productos cuando cambien y quítalos cuando dejen de estar a la venta.
- Haz pruebas con una lista de prueba y direcciones tuyas. Las suscripciones de prueba son contactos reales: cuentan para el límite y, con doble opt-in, reciben emails reales. Al terminar, bórralos desde el panel.
Soporte
Si tienes dudas sobre la API, escribe a info@digo.email. Indica el nombre del sitio conectado, el endpoint y la respuesta recibida: nunca la clave.