Dropsify Developers

Crea tiendas y publica vídeos en Instagram, Facebook y TikTok desde tus propias apps —n8n, Zapier, tu backend— con una clave de API.

En esta página

Antes de empezar

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 → CuentaDevelopers+ 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.

Las cuentas de Instagram, Facebook y TikTok se conectan una vez desde el panel (ahí autorizas con tu usuario en cada red). La API publica en las que ya tengas conectadas; no puede conectar cuentas por ti.

Autenticación

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.

Permisos

Cada clave lleva solo los permisos que le marques. Si llamas a un endpoint sin el permiso que pide, recibes 403 con "code": "scope".

PermisoQué habilita
stores:readVer tus tiendas, sus conexiones, tus perfiles de redes y el historial de publicaciones
stores:writeCrear tiendas y republicarlas
publish:igPublicar en Instagram
publish:fbPublicar en Facebook
publish:ttPublicar en TikTok
orders:readConsultar los pedidos de tus tiendas
jobs:readConsultar 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.

Errores

Los errores devuelven { "error": "…", "code": "…" }. El error es un texto para leer; el code es lo que debes mirar desde tu programa.

HTTPCuándo
400Falta un campo o algo no vale (mira el code)
401Clave ausente, inválida o revocada
402Créditos insuficientes. Trae además balance
403La clave no tiene el permiso necesario
404No existe, o no es de tu cuenta
409Ya hay una llamada igual en curso (ver idempotencia)
429Demasiadas peticiones

Códigos de negocio

codeQué pasó
scopeA la clave le falta el permiso de esa red o de esa acción
NO_CREDITSSin saldo para una operación que cuesta créditos
w_plan_sin_publicacionTu plan no incluye publicar en redes (pasa en el plan gratis)
w_caption_largaEl texto pasa de 2200 caracteres
w_urlLa URL del vídeo no es válida o no se pudo descargar
w_url_internaLa URL apunta a una dirección no permitida (red interna)
w_profileFalta profile_id o ese perfil no es tuyo
in_progressOtra llamada con la misma Idempotency-Key se está ejecutando

Límites de uso

120 peticiones/minutopor clave
240 peticiones/minutopor cuenta, sumando todas tus claves

Al pasarte recibes 429; espera unos segundos y reintenta.

Créditos: qué cuesta y qué no

Publicar (con tienda o sin ella)0 créditos. Ni por API ni a mano
Crear una tiendaCuesta 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.

Idempotencia

En los POST que crean o publican, manda una cabecera con un valor único tuyo:

Idempotency-Key: cualquier-valor-unico-tuyo

El vídeo que mandas

Tú das una URL pública y nuestro servidor descarga el vídeo para subirlo a la red.

Protocolohttp o https
TamañoHasta 64 MB
AccesibleSin login. Si tarda más de 20 s en responder, se cancela
Direcciones internasRechazadas (localhost, IPs privadas, metadatos de nube) → w_url_interna

Publicar fotos por API todavía no está disponible: de momento, vídeo.

El texto de la publicación

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.

Perfiles y publicar sin tienda

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/v1/profilesstores:read
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/v1/publishpublish:ig · publish:fb · publish:tt
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}.

Publicar desde una tienda

POST/v1/stores/{id}/postspublish:ig · publish:fb · publish:tt
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" }

Campos

Campo
networkig, fb y/o tiktok, separadas por coma. Necesitas el permiso de cada una
videoURL pública del vídeo (ver requisitos)
captionTexto de la publicación, hasta 2200 caracteres
tt.privacySolo TikTok y obligatorio: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS o SELF_ONLY
tt.comment · tt.duet · tt.stitchSolo TikTok, opcionales: permitir comentarios, dúos y stitch
run_atOpcional. Fecha ISO para programarla; si se omite, se publica ya
GET/v1/stores/{id}/connectionsstores:read
{ "store_id": "st_abc",
  "connections": {
    "ig":     { "connected": true,  "account": "@mitienda" },
    "fb":     { "connected": false },
    "tiktok": { "connected": true,  "account": "mitiktok" } } }

Historial de publicaciones

GET/v1/postsstores:read

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" } ] }
GET/v1/posts/{id}stores:read
GET/v1/stores/{id}/postsstores:read

status: scheduledpublished o error. Cuando sale bien, result_url lleva al post en la red.

Pedidos

Tus ventas, para llevarlas a tu ERP, tu hoja de cálculo o el flujo que uses. Solo las de tus tiendas.

GET/v1/ordersorders:read
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.

GET/v1/orders/{id}orders:read

El mismo objeto, para un pedido. 404 si no existe o si no es de tu cuenta.

Tiendas

POST/v1/storesstores:write
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.

GET/v1/storesstores:read
{ "stores": [ { "id": "st_…", "slug": "mi-producto", "title": "Mi producto",
                "status": "live", "url": "https://…" } ] }
GET/v1/stores/{id}stores:read
POST/v1/stores/{id}/republishstores:write

Vuelve a generar y desplegar la tienda. Responde 202 con job_id.

Trabajos y saldo

GET/v1/jobs/{id}jobs:read
{ "job": { "id": "j_…", "type": "store.create", "status": "done",
           "progress": 100, "error": null,
           "created_at": "…", "finished_at": "…" } }

status: queuedrunningdone o error.

GET/v1/creditsjobs:read
{ "balance": 5120 }

Recetas completas

Publicar en TikTok desde n8n

  1. Panel → Cuenta → Developers → crear clave con publish:tt y stores:read.
  2. Nodo HTTP Request: GET https://dropsify.app/v1/profiles con la cabecera Authorization. Apunta el id del perfil de TikTok.
  3. Nodo HTTP Request: POST https://dropsify.app/v1/publish con el cuerpo del ejemplo de arriba y el profile_id del paso 2.
  4. Opcional: 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.

Crear una tienda y esperar a que esté lista

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://…" } }