Skip to content

Actividades

Gestiona las actividades de tu CRM — llamadas, tareas, reuniones, correos, notas y más. Las actividades pueden asociarse a cualquier entidad (contacto, empresa, negocio, producto, etc.).

Autenticación

Requiere header Authorization: Bearer {token}. Ver .


Listar Actividades

http
GET /activities

Retorna una lista paginada de actividades del workspace, con soporte para filtros y búsqueda.

Parámetros de consulta

ParámetroTipoRequeridoDescripción
cursorstringNoCursor de paginación retornado en la respuesta anterior
limitintegerNoResultados por página. Mín: 1, máx: 100. Default: 25
sortstringNoCampo de ordenamiento: created_at, due_date, title. Default: created_at
orderstringNoDirección: asc o desc. Default: desc
searchstringNoBúsqueda por texto en título y descripción
typestringNoTipo de actividad: call, task, meeting, email, note, lunch, deadline
statusstringNoEstado: pending, completed, overdue
owner_idstringNoFiltra por ID del responsable
entity_typestringNoFiltra por tipo de entidad asociada: contact, company, deal, product, subscription, booking, quote, order, invoice
entity_idstringNoFiltra por ID de la entidad asociada. Requiere entity_type

Permisos

Requiere permiso activities:read. Los usuarios con permiso de alcance propio (activities:read:own) solo ven actividades asignadas a ellos.

Ejemplo

bash
curl -X GET "https://api-crm.zelta.dev/public/v1/activities?type=task&status=pending&limit=25" \
  -H "Authorization: Bearer tu-api-token-aqui"

Ejemplo JS

javascript
const params = new URLSearchParams({
  type: 'task',
  status: 'pending',
  limit: '25'
});

const response = await fetch(
  `https://api-crm.zelta.dev/public/v1/activities?${params}`,
  {
    headers: {
      'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`
    }
  }
);

const result = await response.json();
console.log(result.data); // array de actividades

Ejemplo Py

python
import requests

response = requests.get(
    'https://api-crm.zelta.dev/public/v1/activities',
    params={
        'type': 'task',
        'status': 'pending',
        'limit': 25
    },
    headers={
        'Authorization': 'Bearer tu-api-token-aqui'
    }
)

result = response.json()
print(result['data'])

Respuesta exitosa

HTTP 200 OK

json
{
  "data": [
    {
      "id": "V1StGXR8_Z5jdHi6B-myT",
      "title": "Llamada de seguimiento",
      "description": "Revisar propuesta enviada la semana pasada",
      "type": "call",
      "priority": "high",
      "status": "pending",
      "ownerId": "aB3kLmNpQrSt",
      "ownerName": "María González",
      "entityType": "deal",
      "entityId": "xY9wVuTsRqPo",
      "dueDate": "2026-04-15T10:00:00.000Z",
      "durationMinutes": 30,
      "location": null,
      "meetingUrl": null,
      "notes": null,
      "completedAt": null,
      "customData": {},
      "createdAt": "2026-04-01T14:22:00.000Z",
      "updatedAt": "2026-04-01T14:22:00.000Z"
    }
  ],
  "pagination": {
    "nextCursor": "eyJjcmVhdGVkQXQiOiIyMDI2LTA0LTAxVDE0OjIyOjAwLjAwMFoiLCJpZCI6IlYxU3RHWFIyX1o1amRIaTZCLW15VCJ9",
    "hasMore": true
  }
}

Obtener Actividad

http
GET /activities/:id

Retorna el detalle completo de una actividad por su ID.

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringID de la actividad

Ejemplo

bash
curl -X GET "https://api-crm.zelta.dev/public/v1/activities/V1StGXR8_Z5jdHi6B-myT" \
  -H "Authorization: Bearer tu-api-token-aqui"

Ejemplo JS

javascript
const id = 'V1StGXR8_Z5jdHi6B-myT';

const response = await fetch(
  `https://api-crm.zelta.dev/public/v1/activities/${id}`,
  {
    headers: {
      'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`
    }
  }
);

const result = await response.json();
console.log(result.data);

Ejemplo Py

python
import requests

activity_id = 'V1StGXR8_Z5jdHi6B-myT'

response = requests.get(
    f'https://api-crm.zelta.dev/public/v1/activities/{activity_id}',
    headers={
        'Authorization': 'Bearer tu-api-token-aqui'
    }
)

result = response.json()
print(result['data'])

Respuesta exitosa

HTTP 200 OK

json
{
  "data": {
    "id": "V1StGXR8_Z5jdHi6B-myT",
    "title": "Llamada de seguimiento",
    "description": "Revisar propuesta enviada la semana pasada",
    "type": "call",
    "priority": "high",
    "status": "pending",
    "ownerId": "aB3kLmNpQrSt",
    "ownerName": "María González",
    "entityType": "deal",
    "entityId": "xY9wVuTsRqPo",
    "dueDate": "2026-04-15T10:00:00.000Z",
    "durationMinutes": 30,
    "location": null,
    "meetingUrl": null,
    "notes": null,
    "completedAt": null,
    "customData": {},
    "createdAt": "2026-04-01T14:22:00.000Z",
    "updatedAt": "2026-04-01T14:22:00.000Z"
  }
}

Crear Actividad

http
POST /activities

Crea una nueva actividad en el workspace.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
titlestringTítulo de la actividad. Máx: 200 caracteres
typestringTipo: call, task, meeting, email, note, lunch, deadline
descriptionstringNoDescripción detallada
prioritystringNoPrioridad: low, medium, high. Default: medium
ownerIdstringNoID del usuario responsable. Default: el usuario de la API key
entityTypestringNoTipo de entidad principal: contact, company, deal, product, subscription, booking, quote, order, invoice
entityIdstringCondicionalID de la entidad principal. Requerido cuando se envía entityType
entitiesarrayNoEntidades adicionales asociadas (máx. 10). Ver objeto entities[]
dueDatestringNoFecha y hora de vencimiento en formato ISO 8601
durationMinutesintegerNoDuración estimada en minutos. Debe ser mayor a 0
locationstringNoUbicación física de la actividad
meetingUrlstringNoURL de videoconferencia (formato URL válida)
notesstringNoNotas internas de la actividad
customDataobjectNoDatos adicionales en formato clave-valor libre

Objeto en entities[]

CampoTipoRequeridoDescripción
entityTypestringTipo de entidad: contact, company, deal, product, subscription, booking, quote, order, invoice
entityIdstringID de la entidad a asociar

Entidad principal vs. entidades adicionales

entityType + entityId definen la entidad principal de la actividad (aparece en el timeline de esa entidad). El array entities permite asociar la actividad a múltiples entidades adicionales simultáneamente, por ejemplo: un contacto y el negocio relacionado.

Ejemplo

bash
curl -X POST "https://api-crm.zelta.dev/public/v1/activities" \
  -H "Authorization: Bearer tu-api-token-aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Reunión de presentación de propuesta",
    "type": "meeting",
    "priority": "high",
    "entityType": "deal",
    "entityId": "xY9wVuTsRqPo",
    "entities": [
      { "entityType": "contact", "entityId": "cZ2mNbKpLqRs" }
    ],
    "dueDate": "2026-04-20T15:00:00.000Z",
    "durationMinutes": 60,
    "meetingUrl": "https://meet.google.com/abc-defg-hij",
    "notes": "Llevar demo del módulo de reportes"
  }'

Ejemplo JS

javascript
const response = await fetch('https://api-crm.zelta.dev/public/v1/activities', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    title: 'Reunión de presentación de propuesta',
    type: 'meeting',
    priority: 'high',
    entityType: 'deal',
    entityId: 'xY9wVuTsRqPo',
    entities: [
      { entityType: 'contact', entityId: 'cZ2mNbKpLqRs' }
    ],
    dueDate: '2026-04-20T15:00:00.000Z',
    durationMinutes: 60,
    meetingUrl: 'https://meet.google.com/abc-defg-hij',
    notes: 'Llevar demo del módulo de reportes'
  })
});

const result = await response.json();
console.log(result.data.id);

Ejemplo Py

python
import requests

response = requests.post(
    'https://api-crm.zelta.dev/public/v1/activities',
    headers={
        'Authorization': 'Bearer tu-api-token-aqui',
        'Content-Type': 'application/json'
    },
    json={
        'title': 'Reunión de presentación de propuesta',
        'type': 'meeting',
        'priority': 'high',
        'entityType': 'deal',
        'entityId': 'xY9wVuTsRqPo',
        'entities': [
            {'entityType': 'contact', 'entityId': 'cZ2mNbKpLqRs'}
        ],
        'dueDate': '2026-04-20T15:00:00.000Z',
        'durationMinutes': 60,
        'meetingUrl': 'https://meet.google.com/abc-defg-hij',
        'notes': 'Llevar demo del módulo de reportes'
    }
)

result = response.json()
print(result['data']['id'])

Respuesta exitosa

HTTP 201 Created

json
{
  "data": {
    "id": "nP7qRsWxYzAb",
    "title": "Reunión de presentación de propuesta",
    "type": "meeting",
    "priority": "high",
    "status": "pending",
    "ownerId": "aB3kLmNpQrSt",
    "ownerName": "María González",
    "entityType": "deal",
    "entityId": "xY9wVuTsRqPo",
    "dueDate": "2026-04-20T15:00:00.000Z",
    "durationMinutes": 60,
    "meetingUrl": "https://meet.google.com/abc-defg-hij",
    "notes": "Llevar demo del módulo de reportes",
    "completedAt": null,
    "customData": {},
    "createdAt": "2026-04-09T10:00:00.000Z",
    "updatedAt": "2026-04-09T10:00:00.000Z"
  }
}

Actualizar Actividad

http
PUT /activities/:id

Actualiza los campos de una actividad existente. Todos los campos son opcionales — solo se modifican los campos enviados.

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringID de la actividad

Cuerpo de la solicitud

Los mismos campos que en , todos opcionales.

Ejemplo

bash
curl -X PUT "https://api-crm.zelta.dev/public/v1/activities/nP7qRsWxYzAb" \
  -H "Authorization: Bearer tu-api-token-aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "dueDate": "2026-04-21T15:00:00.000Z",
    "notes": "Reprogramada para el día siguiente. Llevar también caso de éxito."
  }'

Ejemplo JS

javascript
const id = 'nP7qRsWxYzAb';

const response = await fetch(`https://api-crm.zelta.dev/public/v1/activities/${id}`, {
  method: 'PUT',
  headers: {
    'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    dueDate: '2026-04-21T15:00:00.000Z',
    notes: 'Reprogramada para el día siguiente. Llevar también caso de éxito.'
  })
});

const result = await response.json();

Ejemplo Py

python
import requests

activity_id = 'nP7qRsWxYzAb'

response = requests.put(
    f'https://api-crm.zelta.dev/public/v1/activities/{activity_id}',
    headers={
        'Authorization': 'Bearer tu-api-token-aqui',
        'Content-Type': 'application/json'
    },
    json={
        'dueDate': '2026-04-21T15:00:00.000Z',
        'notes': 'Reprogramada para el día siguiente. Llevar también caso de éxito.'
    }
)

result = response.json()

Respuesta exitosa

HTTP 200 OK — Retorna la actividad con los campos actualizados.


Eliminar Actividad

http
DELETE /activities/:id

Elimina una actividad de forma permanente (soft delete). La actividad deja de aparecer en listados y timelines.

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringID de la actividad

Ejemplo

bash
curl -X DELETE "https://api-crm.zelta.dev/public/v1/activities/nP7qRsWxYzAb" \
  -H "Authorization: Bearer tu-api-token-aqui"

Ejemplo JS

javascript
const id = 'nP7qRsWxYzAb';

const response = await fetch(`https://api-crm.zelta.dev/public/v1/activities/${id}`, {
  method: 'DELETE',
  headers: {
    'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`
  }
});

const result = await response.json();
console.log(result.success); // true

Ejemplo Py

python
import requests

activity_id = 'nP7qRsWxYzAb'

response = requests.delete(
    f'https://api-crm.zelta.dev/public/v1/activities/{activity_id}',
    headers={
        'Authorization': 'Bearer tu-api-token-aqui'
    }
)

result = response.json()
print(result['success'])  # True

Respuesta exitosa

HTTP 200 OK

json
{
  "success": true
}

Marcar como Completada

http
PATCH /activities/:id/complete

Marca una actividad como completada. Establece completedAt a la fecha y hora actual y cambia el status a completed. No requiere cuerpo en la solicitud.

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringID de la actividad

Sin cuerpo

Este endpoint no requiere body. Simplemente realiza el PATCH al path con autenticación.

Ejemplo

bash
curl -X PATCH "https://api-crm.zelta.dev/public/v1/activities/V1StGXR8_Z5jdHi6B-myT/complete" \
  -H "Authorization: Bearer tu-api-token-aqui"

Ejemplo JS

javascript
const id = 'V1StGXR8_Z5jdHi6B-myT';

const response = await fetch(
  `https://api-crm.zelta.dev/public/v1/activities/${id}/complete`,
  {
    method: 'PATCH',
    headers: {
      'Authorization': `Bearer ${process.env.ZELTA_API_TOKEN}`
    }
  }
);

const result = await response.json();
console.log(result.data.status); // "completed"
console.log(result.data.completedAt); // "2026-04-09T10:35:00.000Z"

Ejemplo Py

python
import requests

activity_id = 'V1StGXR8_Z5jdHi6B-myT'

response = requests.patch(
    f'https://api-crm.zelta.dev/public/v1/activities/{activity_id}/complete',
    headers={
        'Authorization': 'Bearer tu-api-token-aqui'
    }
)

result = response.json()
print(result['data']['status'])      # completed
print(result['data']['completedAt']) # 2026-04-09T10:35:00.000Z

Respuesta exitosa

HTTP 200 OK

json
{
  "data": {
    "id": "V1StGXR8_Z5jdHi6B-myT",
    "title": "Llamada de seguimiento",
    "type": "call",
    "priority": "high",
    "status": "completed",
    "ownerId": "aB3kLmNpQrSt",
    "ownerName": "María González",
    "entityType": "deal",
    "entityId": "xY9wVuTsRqPo",
    "dueDate": "2026-04-15T10:00:00.000Z",
    "durationMinutes": 30,
    "completedAt": "2026-04-09T10:35:00.000Z",
    "createdAt": "2026-04-01T14:22:00.000Z",
    "updatedAt": "2026-04-09T10:35:00.000Z"
  }
}

Campos de la respuesta

CampoTipoDescripción
idstringIdentificador único de la actividad (nanoid)
titlestringTítulo de la actividad
descriptionstring | nullDescripción detallada
typestringTipo: call, task, meeting, email, note, lunch, deadline
prioritystringPrioridad: low, medium, high
statusstringEstado actual: pending, completed, overdue
ownerIdstring | nullID del responsable
ownerNamestring | nullNombre completo del responsable (resuelto por JOIN)
entityTypestring | nullTipo de la entidad principal asociada
entityIdstring | nullID de la entidad principal asociada
dueDatestring | nullFecha y hora de vencimiento (ISO 8601)
durationMinutesinteger | nullDuración estimada en minutos
locationstring | nullUbicación física
meetingUrlstring | nullURL de videoconferencia
notesstring | nullNotas internas
completedAtstring | nullFecha y hora de completado (ISO 8601). null si está pendiente
customDataobjectDatos personalizados adicionales
createdAtstringFecha de creación (ISO 8601)
updatedAtstringFecha de última actualización (ISO 8601)

Problemas comunes

ErrorCausaSolución
401 UnauthorizedToken ausente, inválido o expiradoVerifica tu API token en Configuración > API Keys
403 ForbiddenSin permiso activities:read/create/update/deleteRevisa los permisos de la API key en tu workspace
404 Not FoundLa actividad no existe o fue eliminadaVerifica que el ID sea correcto y pertenezca a tu workspace
400title requeridoSe omitió el campo title en la creaciónIncluye un title de hasta 200 caracteres
400type inválidoSe envió un tipo no reconocidoUsa uno de: call, task, meeting, email, note, lunch, deadline
400entityId requeridoSe envió entityType sin entityIdAmbos campos deben enviarse juntos
400meetingUrl inválidoLa URL de videoconferencia no es válidaAsegúrate de incluir el protocolo (https://)
400 — límite de entidadesEl array entities supera 10 elementosReduce la cantidad de entidades adicionales a máx. 10

Siguientes pasos

  • — Asocia actividades a tus contactos
  • — Vincula actividades al pipeline de ventas
  • — Encuentra actividades con el buscador unificado

Documentación oficial de Zelta