Files
MP-Manager/GHL_API_DOCUMENTACION.md
T
2026-05-30 14:31:19 -06:00

637 lines
16 KiB
Markdown

# Documentación API Go High Level (GHL) — Monte Providencia
> Versión de API: `2021-07-28`
> Base URL: `https://services.leadconnectorhq.com`
> Autenticación: `Bearer <API_TOKEN>` en header
---
## Índice
1. [Autenticación y Headers](#1-autenticación)
2. [Contactos](#2-contactos)
3. [Oportunidades](#3-oportunidades)
4. [Pipelines](#4-pipelines)
5. [Campos Personalizados](#5-campos-personalizados)
6. [Tags](#6-tags)
7. [Workflows](#7-workflows)
8. [Cuentas y Locations](#8-cuentas--locations)
9. [Búsquedas (Search)](#9-búsquedas-search)
10. [Errores Comunes](#10-errores-comunes)
11. [Apéndice: Códigos de Sucursales](#11-apéndice-códigos-de-sucursales)
---
## 1. Autenticación
### Headers requeridos en toda petición
```
Authorization: Bearer <API_TOKEN>
Version: 2021-07-28
Accept: application/json
```
### Cómo obtener el token
El token es el `API_token` asociado a cada Location ID. Se guarda en:
- `/data/workspace/agents/ghl/monte-providencia-accounts.csv`
- Formato: `Location_ID / API_TOKEN`
### Ejemplo con curl
```bash
curl -s -L "https://services.leadconnectorhq.com/contacts/" \
-H "Authorization: Bearer TU_TOKEN_AQUI" \
-H "Version: 2021-07-28"
```
---
## 2. Contactos
### 2.1 Obtener todos los contactos (GET /contacts/)
```
GET https://services.leadconnectorhq.com/contacts/?locationId={LOCATION_ID}&limit={1-100}
```
**Parámetros query:**
| Parámetro | Tipo | Descripción |
|---|---|---|
| `locationId` | string | **Requerido.** El Location ID de la cuenta |
| `limit` | int | 1-100 (máximo 100, API lo rechaza si es mayor) |
| `startAfter` | string | Cursor para paginar — valor de `nextPageUrl` |
| `startAfterId` | string | ID del último contacto para paginar |
**Nota sobre paginación:** La API devuelve `meta.nextPageUrl` con la URL completa de la siguiente página. No usa `skip`/offset. El campo `startAfter` se construye a partir del cursor en `nextPageUrl`.
```bash
# Primera página
curl -s "https://services.leadconnectorhq.com/contacts/?locationId=GBKkBpCmKu2QmloKFHy3&limit=100" \
-H "Authorization: Bearer TOKEN" -H "Version: 2021-07-28"
# Segunda página (usar nextPageUrl completo)
curl -s "https://services.leadconnectorhq.com/contacts/?locationId=GBKkBpCmKu2QmloKFHy3&limit=100&startAfter={CURSOR}" \
-H "Authorization: Bearer TOKEN" -H "Version: 2021-07-28"
```
**Respuesta:**
```json
{
"contacts": [
{
"id": "CKFO2IvIw41sOGOtCeFi",
"firstName": "Nicolas",
"lastName": "Tielve",
"email": "nicolas@ejemplo.com",
"phone": "+525531320553",
"locationId": "GbKkBpCmKu2QmloKFHy3",
"tags": ["sucursal", "follow-up"],
"customFields": [
{ "id": "N1apTH4TKBZ6PZqfs4L6", "value": "Ejército Nacional" }
],
"type": "contact",
"dateAdded": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z"
}
],
"meta": {
"nextPageUrl": "https://services.leadconnectorhq.com/contacts/?locationId=...&startAfter=..."
}
}
```
### 2.2 Obtener un contacto por ID (GET /contacts/{id})
```
GET https://services.leadconnectorhq.com/contacts/{CONTACT_ID}?locationId={LOCATION_ID}
```
```bash
curl -s "https://services.leadconnectorhq.com/contacts/CKFO2IvIw41sOGOtCeFi?locationId=GbKkBpCmKu2QmloKFHy3" \
-H "Authorization: Bearer TOKEN" -H "Version: 2021-07-28"
```
### 2.3 Crear contacto (POST /contacts/)
```
POST https://services.leadconnectorhq.com/contacts/
```
**Body (JSON):**
```json
{
"firstName": "Juan",
"lastName": "Pérez",
"email": "juan@ejemplo.com",
"phone": "+525512345678",
"locationId": "GbKkBpCmKu2QmloKFHy3",
"tags": ["lead", "web"],
"customFields": [
{ "id": "N1apTH4TKBZ6PZqfs4L6", "value": "Cancún" }
]
}
```
### 2.4 Actualizar contacto (PUT /contacts/{id})
```
PUT https://services.leadconnectorhq.com/contacts/{CONTACT_ID}
```
```json
{
"firstName": "Juan Actualizado",
"tags": ["lead", "web", "actualizado"],
"customFields": [
{ "id": "N1apTH4TKBZ6PZqfs4L6", "value": "Cancún" }
]
}
```
### 2.5 Eliminar contacto (DELETE /contacts/{id})
```
DELETE https://services.leadconnectorhq.com/contacts/{CONTACT_ID}?locationId={LOCATION_ID}
```
### 2.6 Agregar tag a contacto (POST /contacts/{id}/tags)
```
POST https://services.leadconnectorhq.com/contacts/{CONTACT_ID}/tags
```
Body:
```json
{
"tags": ["nuevo-tag"]
}
```
### 2.7 Eliminar tag de contacto (DELETE /contacts/{id}/tags/{tag})
```
DELETE https://services.leadconnectorhq.com/contacts/{CONTACT_ID}/tags/{TAG_NAME}
```
---
## 3. Oportunidades
### 3.1 Buscar oportunidades (POST /opportunities/search)
> ⚠️ **IMPORTANTE:** `GET /opportunities/` retorna vacío o 0 resultados. SIEMPRE usar `POST /opportunities/search`.
```
POST https://services.leadconnectorhq.com/opportunities/search
```
**Body:**
```json
{
"locationId": "GbKkBpCmKu2QmloKFHy3",
"limit": 100
}
```
**Respuesta:**
```json
{
"total": 184,
"opportunities": [
{
"id": "abc123",
"name": "Venta BMW 2024",
"status": "open",
"pipelineId": "NipUIm51OGRx5xGDifGT",
"pipelineStageId": "stage_xyz",
"monetaryValue": 500000,
"contactId": "CKFO2IvIw41sOGOtCeFi",
"assignedTo": "user_123",
"dateAdded": "2026-04-29T00:00:00Z"
}
]
}
```
### 3.2 Obtener oportunidad por ID (GET /opportunities/{id})
```
GET https://services.leadconnectorhq.com/opportunities/{OPP_ID}?locationId={LOCATION_ID}
```
### 3.3 Crear oportunidad (POST /opportunities/)
```
POST https://services.leadconnectorhq.com/opportunities/
```
```json
{
"name": "Nueva Oportunidad",
"locationId": "GbKkBpCmKu2QmloKFHy3",
"pipelineId": "NipUIm51OGRx5xGDifGT",
"pipelineStageId": "stage_xyz",
"contactId": "CKFO2IvIw41sOGOtCeFi",
"monetaryValue": 100000,
"assignedTo": "user_id",
"status": "open"
}
```
### 3.4 Mover oportunidad a otro pipeline (PUT /opportunities/{id})
> Para cambiar una oportunidad de pipeline, se usa `PUT` con el nuevo `pipelineId` y `pipelineStageId`.
```
PUT https://services.leadconnectorhq.com/opportunities/{OPP_ID}
```
```json
{
"pipelineId": "NipUIm51OGRx5xGDifGT",
"pipelineStageId": "stage_destino"
}
```
**Nota:** Para obtener los pipelineStageId disponibles, primero hay que recuperar los pipelines (ver sección 4).
### 3.5 Eliminar oportunidad (DELETE /opportunities/{id})
```
DELETE https://services.leadconnectorhq.com/opportunities/{OPP_ID}?locationId={LOCATION_ID}
```
---
## 4. Pipelines
### 4.1 Obtener pipelines (GET /pipelines/)
> ⚠️ **NOTA:** Esta llamada frecuentemente retorna `[]` para muchas cuentas. Cuando esto ocurre, los `pipelineId` se pueden obtener desde las oportunidades existentes usando `POST /opportunities/search`.
```
GET https://services.leadconnectorhq.com/pipelines/?locationId={LOCATION_ID}
```
```json
{
"pipelines": [
{
"id": "NipUIm51OGRx5xGDifGT",
"name": "Pipeline Principal",
"locationId": "GbKkBpCmKu2QmloKFHy3",
"stages": [
{
"id": "stage_abc",
"name": "Nuevo Lead",
"order": 1
},
{
"id": "stage_def",
"name": "Contacto Hecho",
"order": 2
}
]
}
]
}
```
### 4.2 Obtener pipeline específico (GET /pipelines/{pipelineId})
```
GET https://services.leadconnectorhq.com/pipelines/{PIPELINE_ID}?locationId={LOCATION_ID}
```
---
## 5. Campos Personalizados (Custom Fields)
### 5.1 Obtener todos los campos personalizados (GET /locations/{locationId}/customFields)
```
GET https://services.leadconnectorhq.com/locations/{LOCATION_ID}/customFields
```
```json
{
"customFields": [
{
"id": "N1apTH4TKBZ6PZqfs4L6",
"name": "Sucursal",
"dataType": "SINGLE_OPTIONS",
"options": ["Cancún", "Texcoco", "Ejército Nacional", ...]
},
{
"id": "fRmSueH3BcHX8bCiybyC",
"name": "Canal de Origen",
"dataType": "SINGLE_OPTIONS"
},
{
"id": "wtQb2PtY2GwJ4GI08BYG",
"name": "Fuente de Prospecto",
"dataType": "SINGLE_OPTIONS"
}
]
}
```
### 5.2 Obtener las opciones de un campo SINGLE_OPTIONS
Las opciones vienen en el campo `options` del custom field.
### ⚠️ IDs de campos diferentes por cuenta
> **CRÍTICO:** Cada Location (sucursal) tiene sus propios IDs de campos personalizados. Un ID de campo en la cuenta Marca NO es el mismo en las sucursales.
>
> Ejemplo — Campo "Sucursal":
> - Monte Providencia Marca: `N1apTH4TKBZ6PZqfs4L6`
> - 85974 - MP - Ejército Nacional: `pmrGTW3tIa7oz7rQJMVx`
> - 85932 - MP - La Viga: `Wj1iYdPv98dYxvE8sDF8`
>
> Para auditar el campo Sucursal correctamente, primero hay que obtener los IDs de cada sucursal consultando `/locations/{id}/customFields`.
### 5.3 Crear campo personalizado (POST /locations/{locationId}/customFields)
```
POST https://services.leadconnectorhq.com/locations/{LOCATION_ID}/customFields
```
```json
{
"name": "Mi Campo Nuevo",
"dataType": "SINGLE_OPTIONS",
"options": ["Opción 1", "Opción 2"],
"placeholder": "Selecciona..."
}
```
### 5.4 Tipos de campo (dataType)
| dataType | Descripción |
|---|---|
| `SINGLE_OPTIONS` | Selector dropdown de una opción |
| `MULTIPLE_OPTIONS` | Checkboxes (múltiples opciones) |
| `TEXT` | Campo de texto libre |
| `LARGE_TEXT` | Textarea (texto largo) |
| `PHONE_NUMBER` | Número telefónico |
| `EMAIL_ADDRESS` | Correo electrónico |
| `MONETORY` | Monto en dinero |
| `DATE` | Fecha |
| `CHECKBOX` | Boolean (sí/no) |
---
## 6. Tags
### 6.1 Obtener todos los tags (GET /locations/{locationId}/tags)
```
GET https://services.leadconnectorhq.com/locations/{LOCATION_ID}/tags
```
```json
{
"tags": [
{ "id": "tag_123", "name": "sucursal", "contactCount": 45 },
{ "id": "tag_456", "name": "lead", "contactCount": 120 }
]
}
```
### 6.2 Crear tag (POST /locations/{locationId}/tags)
```
POST https://services.leadconnectorhq.com/locations/{LOCATION_ID}/tags
```
Body:
```json
{ "name": "nuevo-tag" }
```
### 6.3 Eliminar tag (DELETE /locations/{locationId}/tags/{tagName})
```
DELETE https://services.leadconnectorhq.com/locations/{LOCATION_ID}/tags/{TAG_NAME}
```
### 6.4 Eliminar tag de contacto específico (DELETE /contacts/{id}/tags/{tagName})
```
DELETE https://services.leadconnectorhq.com/contacts/{CONTACT_ID}/tags/{TAG_NAME}?locationId={LOCATION_ID}
```
### 6.5 Agregar tag a contacto (POST /contacts/{id}/tags)
```
POST https://services.leadconnectorhq.com/contacts/{CONTACT_ID}/tags
```
Body:
```json
{ "tags": ["nuevo-tag"] }
```
---
## 7. Workflows
### 7.1 Obtener workflows (GET /workflows/)
```
GET https://services.leadconnectorhq.com/workflows/
```
**Parámetros query:**
| Parámetro | Descripción |
|---|---|
| `locationId` | **Requerido.** Location ID |
| `limit` | 1-100 |
| `status` | `active`, `inactive`, `draft` |
```json
{
"workflows": [
{
"id": "wf_abc123",
"name": "Sincronizar Contacto Creado",
"status": "active",
"trigger": "contact.created",
"createdAt": "2026-01-01T00:00:00Z"
}
]
}
```
### 7.2 Obtener un workflow específico (GET /locations/{locationId}/workflows/{workflowId})
```
GET https://services.leadconnectorhq.com/locations/{LOCATION_ID}/workflows/{WORKFLOW_ID}
```
### 7.3 Activar/Desactivar workflow (PUT /locations/{locationId}/workflows/{workflowId})
```
PUT https://services.leadconnectorhq.com/locations/{LOCATION_ID}/workflows/{WORKFLOW_ID}
```
```json
{
"status": "active"
}
```
### 7.4 Estados de workflow
| Status | Significado |
|---|---|
| `active` | Publicada y corriendo |
| `inactive` | Pausada |
| `draft` | Borrador — no está publicada |
### 7.5 Triggers comunes
Los triggers disponibles varían según la configuración de GHL. Comunes:
- `contact.created` — Se ejecuta al crear contacto
- `contact.updated` — Se ejecuta al actualizar contacto
- `tag.added` — Se ejecuta al agregar tag
- `form.submission` — Se ejecuta al recibir formulario
---
## 8. Cuentas y Locations
### 8.1 Location ID de Monte Providencia (Marca)
| Campo | Valor |
|---|---|
| Location ID | `GbKkBpCmKu2QmloKFHy3` |
| Token | `pit-4e4266f8-97ac-4150-a971-cc9158809640` |
### 8.2 Obtener información de location (GET /locations/{locationId})
```
GET https://services.leadconnectorhq.com/locations/{LOCATION_ID}
```
### 8.3 Listar usuarios (GET /locations/{locationId}/users)
```
GET https://services.leadconnectorhq.com/locations/{LOCATION_ID}/users
```
---
## 9. Búsquedas (Search)
### 9.1 Búsqueda de contactos con filtros (POST /contacts/search)
> ⚠️ **NOTA:** Esta endpoint devuelve 404 o errores para muchas cuentas. Usar `GET /contacts/` con paginación en su lugar.
```
POST https://services.leadconnectorhq.com/contacts/search
```
```json
{
"locationId": "GbKkBpCmKu2QmloKFHy3",
"limit": 100,
"query": "Nicolas"
}
```
### 9.2 Búsqueda de oportunidades (POST /opportunities/search)
> Esta es la forma correcta y principal de obtener oportunidades. **No usar GET.**
```
POST https://services.leadconnectorhq.com/opportunities/search
```
```json
{
"locationId": "GbKkBpCmKu2QmloKFHy3",
"limit": 100,
"pipelineId": "NipUIm51OGRx5xGDifGT"
}
```
---
## 10. Errores Comunes
| Código | Causa | Solución |
|---|---|---|
| `400` | Body malformado | Verificar JSON, comas, comillas |
| `401` | Token inválido o expirado | Verificar el `Bearer <token>` |
| `404` | Recurso no encontrado | Verificar el ID del recurso |
| `422` | Datos inválidos | Revisar el formato del body |
| `429` | Rate limit | Esperar 5-10 segundos entre requests |
| `500` | Error interno del servidor | Reintentar más tarde |
| `limit > 100` | Límite de página excedido | Usar `limit=100` máximo |
| `[]` vacío en GET /pipelines/ | Endpoint no soportado | Usar POST /opportunities/search para obtener pipelineIds |
| `[]` vacío en GET /contacts/ | Rate limit o account empty | Verificar token y Location ID |
### Rate Limits
- No hay un rate limit documentado oficial, pero se recomienda:
- **0.5-1 segundo** entre requests normales
- **5-10 segundos** después de errores 429
- Paginación: continuar solo cuando `nextPageUrl` exista
---
## 11. Apéndice: Códigos de Sucursales
### Monte Providencia — CSV de cuentas
Archivo: `/data/workspace/agents/ghl/monte-providencia-accounts.csv`
### Sucursales con IDs de campo Sucursal (Custom Field)
> Cada sucursal tiene su propio ID para el campo "Sucursal". Usar la tabla del CSV de cuentas para obtener el ID correcto.
| Sucursal | Location ID | Token (primeros 10 chars) |
|---|---|---|
| Monte Providencia (Marca) | GbKkBpCmKu2QmloKFHy3 | `pit-4e4266f8` |
| 0001 - MP -Qro DEMO | Z64WQKORPVwXb5mn68Ef | `pit-8215e76f` |
| Monte Providencia DEMO | Vf7qQl3L9vakJ8hDtQ8e | `pit-f162f285` |
| 85930 - MP - TULYEHUALCO | rQYjjwsGnjEGagskOxix | `pit-8001d42c` |
| 85931 - MP - Marina Nacional | HvDw9Eg3rjrwkbQJXqfi | `pit-155a2c8f` |
| 85932 - MP - La Viga | fKn9SaXZoKcjjLryg10v | `pit-350d963b` |
| 85957 - MP - PINOTEPA | 7H91g95hhLKwIUqSk0Rg | `pit-f68877be` |
| 85958 - MP - POCHUTLA | HvyNhH2IOe9ByeZrRo0N | `pit-0fb64a32` |
| 85974 - MP - Ejército Nacional | nF1uEaYB3mCK5em9bPn2 | `pit-dbdaabeb` |
| 85976 - MP - Cancún | uJEn2iuUficuml9zxAnt | `pit-7a23a1d8` |
| 85954 - MP - Izcalli | r0fiuXv6zQnFyXJW2SWU | `pit-8e8596a8` |
> Para la lista completa, consultar el archivo CSV.
---
## 12. Scripts de Auditoría Existentes
### Ubicación: `/data/workspace/agents/ghl/scripts/`
| Script | Descripción |
|---|---|
| `move_opportunities_pipeline.py` | Mueve oportunidades de un pipeline a otro |
| `check_multi_pipeline.py` | Detecta cuentas con múltiples pipelines |
| `find_contacts_without_sucursal.py` | Encuentra contactos sin campo Sucursal |
| `monitor_no_email.py` | Detecta contactos sin email en todas las cuentas (cron) |
### Monitoreo activo (cron jobs):
| Cron | Frecuencia | Qué hace |
|---|---|---|
| `GHL Monitor No Email` | Cada 30 min | Reporta nuevos contactos sin email |
| `Health Check Workflows` | Cada 30 min | Detecta workflows faltantes/inactivos |
Reportes: `/data/workspace/agents/ghl/reports/`
---
*Documentación generada en mayo 2026. Algunas endpoints pueden variar según el plan y configuración de GHL.*