GET/v1/notifications

Listado de envios (notifications:read)

Llave: sk_

Parámetros

NombreEnTipoDescripción
appIdquerystring
statusquerystring
sourcequery"api" | "panel" | "campaign" | "recurring"
pagequeryinteger
perPagequeryinteger

Respuestas: 200

curl -X GET "https://api.pushhub.daertec.com/v1/notifications" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

POST/v1/notifications

Crear un envio (sk_ con notifications:send). Se encola y responde 202.

Llave: sk_

Destinos: devices {ids|tokens}, external_users {ids}, topic {name}, all, test_devices. Con una llave en modo test
el envio solo alcanza a los dispositivos de prueba. segment/filters, media y schedule distinto de now llegan en la Fase 4.
validateOnly=true valida y estima sin crear. Errores: 2001/2002 validacion, 2003 payload > 4 KB, 2004 plataforma,
2011 programacion, 4005 Idempotency-Key reutilizada con otro cuerpo. 2002 con errors.content = [blocked]: el
contenido enlaza a un dominio o URL bloqueados por la plataforma.

Parámetros

NombreEnTipoDescripción
Idempotency-KeyheaderstringRepetir la misma clave (24 h) devuelve la notificacion original sin duplicar

Cuerpo

CampoTipoDescripción
contentType"alert" | "data_only" | "silent"
contentobjectPor idioma, ej. { es: { title, subtitle, body } }
variablesobjectReemplazan {{nombre}} en el texto
dataobject
deepLinkstringmáx. 500 caracteres
badgeinteger
soundstringdefault o un sonido registrado en la app (2002 si no existe)
ttlSecondsinteger0–2419200
priority"high" | "normal"
androidobject
android.channelIdstring
android.collapseKeystring
android.colorstring
android.tagstring
android.iconstring
iosobject
ios.interruptionLevel"passive" | "active" | "time-sensitive" | "critical"
ios.threadIdstring
ios.collapseIdstring
ios.relevanceScorenumber
ios.mutableContentboolean
appIdstring
target*object
target.type*"devices" | "external_users" | "topic" | "segment" | "filters" | "all" | "test_devices"
target.segmentIdstring
target.rulesobjectArbol AND/OR (maximo 3 niveles, 20 condiciones). Campos: platform, language, country, timezone, external_user_id, app_version, last_seen, tag (con key), topic, notifications_enabled, capability.
target.idsstring[]
target.tokensstring[]
target.namestring
platforms"android" | "ios"[]
category"transactional" | "marketing"
scheduleobjectnow; at {sendAt, timezone}: hora fija (sin offset = en timezone; por defecto la de la empresa); local_time {date, time}: esa hora en la zona de cada dispositivo (~26 h). Maximo 365 dias. Errores 2011 / 2012.
schedule.type"now" | "at" | "local_time"
schedule.sendAtstring
schedule.timezonestring
schedule.datestring
schedule.timestring
schedule.windowMinutesintegerEnvio gradual · 0–1440
schedule.expireAtstringNo enviar despues (tambien limita el TTL)
validateOnlyboolean
templateIdstringPlantilla: lo enviado en la peticion tiene prioridad; exige sus variables (2001)
mediaobjectSolo la URL viaja en el payload. Android: imagen grande (o poster de GIF/video); iOS: mutable-content + _ph.media para la extension. Un archivo en proceso solo se acepta en programadas (4009 si es inmediata).
media.type"image" | "gif" | "audio" | "video"
media.mediaIdstring
media.urlstringhttps externa (requiere type)
media.fallback"poster" | "none"
largeIconobjectImagen (Android, via SDK)
largeIcon.mediaIdstring
largeIcon.urlstring
actionsobject[]máx. 3 elementos

Respuestas: 200202422

curl -X POST "https://api.pushhub.daertec.com/v1/notifications" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA" \
  -H "Idempotency-Key: pedido-123" \
  -H "Content-Type: application/json" \
  -d '{
  "appId": "ID_DE_TU_APP",
  "target": {
    "type": "external_users",
    "ids": [
      "cliente-123"
    ]
  },
  "content": {
    "es": {
      "title": "Tu pedido va en camino",
      "body": "Llega hoy entre 2 y 4 p. m."
    },
    "en": {
      "title": "Your order is on its way",
      "body": "Arriving today between 2 and 4 p.m."
    }
  },
  "data": {
    "orderId": "A-1029"
  },
  "deepLink": "miapp://pedidos/A-1029",
  "category": "transactional"
}'

POST/v1/notifications/test

Consola de pruebas sincrona (hasta 10 destinos; no consume cuota; limite diario 3006)

Llave: sk_

Devuelve por destino result, interpretation y suggestion en espanol, provider_response (estado HTTP, codigo, cuerpo, latencia) y el request sin el token completo. mode validate_only solo para FCM.

Cuerpo

CampoTipoDescripción
contentType"alert" | "data_only" | "silent"
contentobjectPor idioma, ej. { es: { title, subtitle, body } }
variablesobjectReemplazan {{nombre}} en el texto
dataobject
deepLinkstringmáx. 500 caracteres
badgeinteger
soundstring
ttlSecondsinteger0–2419200
priority"high" | "normal"
androidobject
android.channelIdstring
android.collapseKeystring
android.colorstring
android.tagstring
android.iconstring
iosobject
ios.interruptionLevel"passive" | "active" | "time-sensitive" | "critical"
ios.threadIdstring
ios.collapseIdstring
ios.relevanceScorenumber
ios.mutableContentboolean
appIdstring
useTestDevicesboolean
targetsobject[]máx. 10 elementos
mode"send" | "validate_only"
environment"auto" | "sandbox" | "production"
rawPayloadobjectPayload final escrito a mano que reemplaza al generado: fcm = mensaje FCM v1 (sin token), apns = cuerpo APNs (debe incluir aps). PushHub pone el token y las cabeceras de APNs. Maximo 4 KB; error 2002 si no es valido.
rawPayload.fcmobject
rawPayload.apnsobject

Respuestas: 200429

curl -X POST "https://api.pushhub.daertec.com/v1/notifications/test" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA" \
  -H "Content-Type: application/json" \
  -d '{
  "appId": "ID_DE_TU_APP",
  "targets": [
    {
      "token": "TOKEN_DEL_DISPOSITIVO"
    }
  ],
  "content": {
    "es": {
      "title": "Prueba",
      "body": "Hola desde la consola de pruebas"
    }
  },
  "mode": "send"
}'

GET/v1/notifications/{id}

Estado y contadores de un envio

Llave: sk_

Parámetros

NombreEnTipoDescripción
id*pathstring

Respuestas: 200404

curl -X GET "https://api.pushhub.daertec.com/v1/notifications/ID_ID" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

PATCH/v1/notifications/{id}

Editar una programada: cuerpo completo, o solo {schedule} para reprogramar (4009 si ya salio)

Llave: sk_

Parámetros

NombreEnTipoDescripción
id*pathstring

Respuestas: 200

curl -X PATCH "https://api.pushhub.daertec.com/v1/notifications/ID_ID" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

GET/v1/notifications/{id}/deliveries

Entregas por dispositivo

Llave: sk_

Parámetros

NombreEnTipoDescripción
id*pathstring
statusquery"queued" | "accepted" | "failed" | "invalid_token" | "expired" | "skipped"
pagequeryinteger
perPagequeryinteger

Respuestas: 200

curl -X GET "https://api.pushhub.daertec.com/v1/notifications/ID_ID/deliveries" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

POST/v1/notifications/{id}/cancel

Cancelar (solo si aun esta en cola; si no, 4004)

Llave: sk_

Parámetros

NombreEnTipoDescripción
id*pathstring

Respuestas: 200409

curl -X POST "https://api.pushhub.daertec.com/v1/notifications/ID_ID/cancel" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

POST/v1/notifications/{id}/send-now

Enviar ya una programada (4009 si no esta programada)

Llave: sk_

Parámetros

NombreEnTipoDescripción
id*pathstring

Respuestas: 200

curl -X POST "https://api.pushhub.daertec.com/v1/notifications/ID_ID/send-now" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"

GET/v1/templates

Plantillas de la app (enviar con templateId + variables; notifications:read)

Llave: sk_

Parámetros

NombreEnTipoDescripción
appIdquerystring

Respuestas: 200

curl -X GET "https://api.pushhub.daertec.com/v1/templates" \
  -H "Authorization: Bearer sk_test_TU_LLAVE_SECRETA"