Saltar al contenido

API de ISSA

Lee y escribe tus leads, contactos y citas desde tu propio software, y recibe un mensaje cuando algo pase.

Autenticación

Crea una llave en Ajustes, Desarrolladores, y envíala como token Bearer. Las llaves solo tienen los permisos que les diste.

Authorization: Bearer issa_live_<prefix>_<secret>

Convenciones

  • Cada llave puede hacer 120 solicitudes por minuto. Después recibes el error ISSA-4042 y un encabezado Retry-After.
  • Las listas usan cursores: envía limit y el cursor que recibiste como nextCursor.
  • Los errores se ven así: { "error": { "code": "ISSA-4040", "message": "…" } }.
  • Las solicitudes y respuestas son JSON en camelCase. Las fechas son ISO 8601.

Descripción legible por máquinas (OpenAPI 3.1): https://holaissa.com/v1/public/api/openapi.json

Leads

GET/leads

List leads

Requiere el permiso leads:read

Parámetros
cursorquery · string
limitquery · integer
qquery · string
stageIdquery · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/leads
POST/leads

Create a lead

Requiere el permiso leads:write

Cuerpo
nameobligatoriostring
phonestring
intereststring
valueAmountnumber
valueCurrencystring
stageIdstring
ownerMemberIdstring
tagsstring[]
assistantIdstring

Respuestas: 201 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X POST -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/leads
GET/leads/{id}

Get a lead

Requiere el permiso leads:read

Parámetros
idobligatoriopath · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/leads/{id}
PATCH/leads/{id}

Update a lead

Requiere el permiso leads:write

Parámetros
idobligatoriopath · string
Cuerpo
namestring
intereststring
stageIdstring
ownerMemberIdstring | null
valueAmountnumber | null
valueCurrencystring
productIdstring | null
tagsstring[]
lostReasonstring

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X PATCH -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/leads/{id}

Contacts

GET/contacts

List contacts

Requiere el permiso leads:read

Parámetros
cursorquery · string
limitquery · integer

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/contacts
GET/contacts/{id}

Get a contact

Requiere el permiso leads:read

Parámetros
idobligatoriopath · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/contacts/{id}

Appointments

GET/appointments

List appointments, soonest first

Requiere el permiso appointments:read

Parámetros
cursorquery · string
limitquery · integer
fromquery · string
toquery · string
statusquery · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/appointments
POST/appointments

Create an appointment (it does not appear in an external calendar)

Requiere el permiso appointments:write

Cuerpo
contactIdobligatoriostring
assistantIdstring
startAtobligatoriostring
endAtobligatoriostring
timezonestring
notesstring

Respuestas: 201 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X POST -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/appointments
GET/appointments/{id}

Get an appointment

Requiere el permiso appointments:read

Parámetros
idobligatoriopath · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/appointments/{id}
PATCH/appointments/{id}

Reschedule, cancel or annotate an appointment

Requiere el permiso appointments:write

Parámetros
idobligatoriopath · string
Cuerpo
startAtstring
endAtstring
status"booked" | "cancelled"
notesstring | null

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X PATCH -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/appointments/{id}

Patients

GET/patients

List patients (health module only)

Requiere el permiso patients:read

Parámetros
cursorquery · string
limitquery · integer
qquery · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/patients
POST/patients

Create a patient (health module only)

Requiere el permiso patients:write

Cuerpo
fullNameobligatoriostring
birthDatestring
sexstring
phonestring
emailstring
leadIdstring

Respuestas: 201 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X POST -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/patients
GET/patients/{id}

Get a patient (health module only)

Requiere el permiso patients:read

Parámetros
idobligatoriopath · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/patients/{id}
GET/patients/{id}/profile

Current clinical profile of a patient

Requiere el permiso patients:read

Parámetros
idobligatoriopath · string

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/patients/{id}/profile
GET/patients/{id}/notes

Signed clinical notes of a patient, newest first

Requiere el permiso patients:read

Parámetros
idobligatoriopath · string
cursorquery · string
limitquery · integer

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/patients/{id}/notes

Webhooks

GET/webhooks

List webhook endpoints

Requiere el permiso webhooks:manage

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/webhooks
POST/webhooks

Create a webhook endpoint (the signing secret is returned once)

Requiere el permiso webhooks:manage

Cuerpo
urlobligatoriostring
eventsobligatorio"lead.created" | "lead.updated" | "appointment.created" | "appointment.updated" | "patient.created" | "note.signed" | "consent.signed"[]
descriptionstring

Respuestas: 201 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X POST -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/webhooks
PATCH/webhooks/{id}

Update a webhook endpoint

Requiere el permiso webhooks:manage

Parámetros
idobligatoriopath · string
Cuerpo
urlstring
events"lead.created" | "lead.updated" | "appointment.created" | "appointment.updated" | "patient.created" | "note.signed" | "consent.signed"[]
descriptionstring | null
activeboolean

Respuestas: 200 OK · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X PATCH -H "Authorization: Bearer $ISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://holaissa.com/v1/public/api/webhooks/{id}
DELETE/webhooks/{id}

Delete a webhook endpoint

Requiere el permiso webhooks:manage

Parámetros
idobligatoriopath · string

Respuestas: 204 Done · 400 Invalid request (ISSA-0002) · 401 Missing, invalid, expired or revoked key (ISSA-4040) · 403 The key lacks the scope (ISSA-4041) · 404 Not found · 429 More than 120 requests a minute (ISSA-4042)

curl -X DELETE -H "Authorization: Bearer $ISSA_API_KEY" \
  https://holaissa.com/v1/public/api/webhooks/{id}

Webhooks

Agrega una dirección https en Ajustes, Desarrolladores y elige los eventos. ISSA envía un POST con un cuerpo JSON que trae los ids de lo que cambió; nunca texto libre de tus registros.

  • lead.created — apiDocs.webhooks.events.lead.created
  • lead.updated — apiDocs.webhooks.events.lead.updated
  • appointment.created — apiDocs.webhooks.events.appointment.created
  • appointment.updated — apiDocs.webhooks.events.appointment.updated

Cada mensaje trae X-ISSA-Signature: t=UNIX,v1=HEX. La firma es un HMAC-SHA256 de "t.body" con el secreto de tu endpoint. Compruébala y rechaza mensajes de más de cinco minutos.

import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(secret, rawBody, header) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  const expected = createHmac('sha256', secret).update(parts.t + '.' + rawBody).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return fresh && timingSafeEqual(Buffer.from(parts.v1, 'hex'), Buffer.from(expected, 'hex'));
}

Responde 2xx en menos de 10 segundos. Si no, ISSA reintenta 8 veces en 24 horas con esperas crecientes.