Crea tiendas y publica vídeos en Instagram, Facebook y TikTok desde tus propias apps —n8n, Zapier, tu backend— con una clave de API.
La API va incluida desde el plan Starter en adelante —Starter, Creator, Pro y Agency—, sin coste aparte y sin pagar por uso. No está disponible en el plan gratis.
La clave se crea en tu panel: menú lateral → Cuenta → Developers → + Crear clave. Marcas ahí qué puede hacer esa clave. Se muestra una sola vez: al cerrar la ventana no se puede volver a ver, porque no la guardamos — solo su huella. Si la pierdes, revócala y crea otra.
Todas las llamadas van sobre https://dropsify.app/v1 con tu clave en la cabecera:
Authorization: Bearer dk_live_tu_clave
Sin clave, con una clave inválida o revocada: 401.
Cada clave lleva solo los permisos que le marques. Si llamas a un endpoint sin el permiso que pide, recibes 403 con "code": "scope".
| Permiso | Qué habilita |
|---|---|
stores:read | Ver tus tiendas, sus conexiones, tus perfiles de redes y el historial de publicaciones |
stores:write | Crear tiendas y republicarlas |
publish:ig | Publicar en Instagram |
publish:fb | Publicar en Facebook |
publish:tt | Publicar en TikTok |
orders:read | Consultar los pedidos de tus tiendas |
jobs:read | Consultar trabajos en curso y tu saldo de créditos |
Al publicar, el permiso se comprueba por red: una llamada a dos redes necesita los dos permisos.
Los errores devuelven { "error": "…", "code": "…" }. El error es un texto para leer; el code es lo que debes mirar desde tu programa.
| HTTP | Cuándo |
|---|---|
400 | Falta un campo o algo no vale (mira el code) |
401 | Clave ausente, inválida o revocada |
402 | Créditos insuficientes. Trae además balance |
403 | La clave no tiene el permiso necesario |
404 | No existe, o no es de tu cuenta |
409 | Ya hay una llamada igual en curso (ver idempotencia) |
429 | Demasiadas peticiones |
code | Qué pasó |
|---|---|
scope | A la clave le falta el permiso de esa red o de esa acción |
NO_CREDITS | Sin saldo para una operación que cuesta créditos |
w_plan_sin_publicacion | Tu plan no incluye publicar en redes (pasa en el plan gratis) |
w_caption_larga | El texto pasa de 2200 caracteres |
w_url | La URL del vídeo no es válida o no se pudo descargar |
w_url_interna | La URL apunta a una dirección no permitida (red interna) |
w_profile | Falta profile_id o ese perfil no es tuyo |
in_progress | Otra llamada con la misma Idempotency-Key se está ejecutando |
| 120 peticiones/minuto | por clave |
| 240 peticiones/minuto | por cuenta, sumando todas tus claves |
Al pasarte recibes 429; espera unos segundos y reintenta.
| Publicar (con tienda o sin ella) | 0 créditos. Ni por API ni a mano |
| Crear una tienda | Cuesta créditos, los mismos que desde el panel |
Consultas (GET) | 0 créditos |
Usar la API no lleva ningún recargo: lo que cuesta dinero cuesta lo mismo por API que a mano. Tu saldo: GET /v1/credits.
En los POST que crean o publican, manda una cabecera con un valor único tuyo:
Idempotency-Key: cualquier-valor-unico-tuyo
409 con "code": "in_progress".402 sin saldo), el reintento se ejecuta de verdad.Idempotency-Key en dos rutas distintas no se cruza.Tú das una URL pública y nuestro servidor descarga el vídeo para subirlo a la red.
| Protocolo | http o https |
| Tamaño | Hasta 64 MB |
| Accesible | Sin login. Si tarda más de 20 s en responder, se cancela |
| Direcciones internas | Rechazadas (localhost, IPs privadas, metadatos de nube) → w_url_interna |
Publicar fotos por API todavía no está disponible: de momento, vídeo.
El campo caption admite hasta 2200 caracteres, que es el máximo de TikTok e Instagram. Si te pasas, la llamada se rechaza con 400 y "code": "w_caption_larga" diciéndote cuántos llevas — nunca te lo recortamos por detrás.
Recuerda que Instagram admite como mucho 30 hashtags y 20 menciones.
Si solo quieres usar Dropsify para publicar, no necesitas crear ninguna tienda. Conecta tus cuentas una vez desde el panel y publica contra el perfil que quieras.
GET https://dropsify.app/v1/profiles
Authorization: Bearer dk_live_tu_clave
{ "profiles": [
{ "id": "ac_abc", "networks": ["tiktok"], "network": "tiktok",
"provider": "tiktok", "label": "Mi TikTok", "account": "micuenta" },
{ "id": "ac_def", "networks": ["fb","ig"], "network": "fb",
"provider": "meta", "label": "Mi página", "account": "Mi Página" }
] }
Un perfil meta (página de Facebook) sirve para fb y para el Instagram vinculado a ella: por eso networks es una lista.
POST https://dropsify.app/v1/publish
Authorization: Bearer dk_live_tu_clave
Content-Type: application/json
Idempotency-Key: mi-valor-unico
{
"network": "tiktok",
"profile_id": "ac_abc",
"video": "https://tu-servidor.com/video.mp4",
"caption": "mi producto 🔥",
"tt": { "privacy": "PUBLIC_TO_EVERYONE" }
}
→ 202 { "ok": true, "post_id": "p_…", "job_id": "j_…", "status": "scheduled" }
Una red por llamada: cada publicación va a un perfil, y cada perfil es de una red. El 202 significa "aceptado y en cola" — sigue el resultado con GET /v1/posts/{post_id}.
POST https://dropsify.app/v1/stores/st_abc/posts
Authorization: Bearer dk_live_tu_clave
Content-Type: application/json
{
"network": "ig,fb",
"video": "https://tu-servidor.com/mi-video.mp4",
"caption": "Mi producto 🔥 #oferta",
"run_at": "2026-08-20T18:00:00Z"
}
→ 202 { "ok": true, "post_id": "p_…", "job_id": "j_…", "status": "scheduled" }
| Campo | |
|---|---|
network | ig, fb y/o tiktok, separadas por coma. Necesitas el permiso de cada una |
video | URL pública del vídeo (ver requisitos) |
caption | Texto de la publicación, hasta 2200 caracteres |
tt.privacy | Solo TikTok y obligatorio: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS o SELF_ONLY |
tt.comment · tt.duet · tt.stitch | Solo TikTok, opcionales: permitir comentarios, dúos y stitch |
run_at | Opcional. Fecha ISO para programarla; si se omite, se publica ya |
{ "store_id": "st_abc",
"connections": {
"ig": { "connected": true, "account": "@mitienda" },
"fb": { "connected": false },
"tiktok": { "connected": true, "account": "mitiktok" } } }
Todo lo publicado por la cuenta, incluido lo que va sin tienda.
{ "posts": [ { "id": "p_…", "store_id": null, "network": "tiktok",
"status": "published", "result_url": "https://…",
"error": null, "created_at": "2026-08-11 12:46:17" } ] }
status: scheduled → published o error. Cuando sale bien, result_url lleva al post en la red.
Tus ventas, para llevarlas a tu ERP, tu hoja de cálculo o el flujo que uses. Solo las de tus tiendas.
GET https://dropsify.app/v1/orders?status=shipped&limit=50
Authorization: Bearer dk_live_tu_clave
{ "orders": [ {
"id": "o_abc", "store_id": "st_abc", "status": "shipped",
"amount_cents": 1990, "refunded_cents": 0,
"customer": { "name": "…", "email": "…", "address": { } },
"items": [ { "name": "…", "qty": 1 } ],
"tracking": null, "carrier": null, "coupon": null,
"created_at": "2026-08-12 09:14:02",
"history": [ ]
} ] }
Filtros opcionales: store_id, status y limit (por defecto 50, máximo 200). Los estados posibles son pending, ordered, shipped, delivered, cancelled, refunded y partially_refunded. Los importes van en céntimos enteros, para que no haya sorpresas de redondeo.
El mismo objeto, para un pedido. 404 si no existe o si no es de tu cuenta.
POST https://dropsify.app/v1/stores
Authorization: Bearer dk_live_tu_clave
Content-Type: application/json
Idempotency-Key: mi-valor-unico
{ "link": "https://es.aliexpress.com/item/…",
"name": "Mi producto",
"price": "19,90" }
→ 202 { "ok": true, "store": { "id": "st_…", "slug": "mi-producto", "status": "building" }, "job_id": "j_…" }
La tienda se construye en segundo plano: sigue el job_id hasta done. Cuesta créditos.
{ "stores": [ { "id": "st_…", "slug": "mi-producto", "title": "Mi producto",
"status": "live", "url": "https://…" } ] }
Vuelve a generar y desplegar la tienda. Responde 202 con job_id.
{ "job": { "id": "j_…", "type": "store.create", "status": "done",
"progress": 100, "error": null,
"created_at": "…", "finished_at": "…" } }
status: queued → running → done o error.
{ "balance": 5120 }
publish:tt y stores:read.GET https://dropsify.app/v1/profiles con la cabecera Authorization. Apunta el id del perfil de TikTok.POST https://dropsify.app/v1/publish con el cuerpo del ejemplo de arriba y el profile_id del paso 2.GET /v1/posts/{post_id} para confirmar que pasó a published y recoger la result_url.Pon una Idempotency-Key distinta por vídeo (por ejemplo el id del vídeo): si n8n reintenta, no se publica dos veces.
POST /v1/stores → 202 { "store": { "id": "st_x" }, "job_id": "j_x" }
GET /v1/jobs/j_x → { "job": { "status": "running" } }
GET /v1/jobs/j_x → { "job": { "status": "done" } }
GET /v1/stores/st_x → { "store": { "status": "live", "url": "https://…" } }