curl --request GET \
--url https://api.revem.ai/contacts/public/v1 \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.revem.ai/contacts/public/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/contacts/public/v1"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contacts": [
{
"id": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"phone_number": "+56912345678",
"first_name": "Camila",
"last_name": "Rojas",
"email": "camila@ejemplo.cl",
"created_at": "2026-08-12T14:03:22.000Z",
"updated_at": "2026-09-01T09:41:05.000Z",
"programa": "Premium",
"fecha_ultima_compra": "2026-08-30"
}
],
"has_more": false
}{
"error": "<string>",
"ok": false,
"message": "<string>",
"unknownAttributes": [
"<string>"
]
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Listar contactos
Devuelve los contactos del tenant, del más reciente al más antiguo según su fecha de creación, paginados por limit y offset. Los contactos en la papelera y los del simulador no aparecen.
updated_since filtra pero no ordena: un contacto editado mientras recorres las páginas puede quedar fuera de la página que le correspondía. Para una sincronización incremental, solapa la ventana unos minutos con la corrida anterior en vez de partir exactamente donde terminó.
curl --request GET \
--url https://api.revem.ai/contacts/public/v1 \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.revem.ai/contacts/public/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/contacts/public/v1"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"contacts": [
{
"id": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"phone_number": "+56912345678",
"first_name": "Camila",
"last_name": "Rojas",
"email": "camila@ejemplo.cl",
"created_at": "2026-08-12T14:03:22.000Z",
"updated_at": "2026-09-01T09:41:05.000Z",
"programa": "Premium",
"fecha_ultima_compra": "2026-08-30"
}
],
"has_more": false
}{
"error": "<string>",
"ok": false,
"message": "<string>",
"unknownAttributes": [
"<string>"
]
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Authorizations
La API key de tu organización, con la forma rvm_<prefijo>.<secreto>, enviada como Authorization: Bearer rvm_…. Revem la emite y sólo se muestra una vez; si la pierdes se reemplaza, no se recupera.
Query Parameters
Busca por teléfono. Acepta las mismas grafías que el upsert, así que el número con que escribiste un contacto también lo encuentra.
1Busca por email, sin distinguir mayúsculas.
Sólo contactos modificados desde esta fecha (ISO 8601 con zona horaria, por ejemplo 2026-09-01T00:00:00Z).
Tamaño de página.
1 <= x <= 200Cuántos resultados saltar.
0 <= x <= 1000000