Descripción general
La v1 tiene dos endpoints públicos. Usa /public/search para encontrar candidatos con una consulta y filtros opcionales. Usa /public/usage para consultar tu cuota diaria restante sin gastarla.
/public/search/public/usageLos resultados nunca incluyen datos de contacto
Los resultados de candidatos no incluyen correo, teléfono ni LinkedIn - por diseño. Usa el candidateId o el cazumeUrl devueltos para contactar a un candidato a través de la app de CazVid o de su perfil público. No intentes reidentificar ni contactar a los candidatos fuera de la plataforma.
Autenticación
Envía tu clave de API con el encabezado x-api-key o como un token Authorization: Bearer. Es la misma clave de CazVid Developer API que la de Job Builder - una sola clave sirve para ambos productos. Las claves pertenecen a una organización; los propietarios y administradores las gestionan en la app en Perfil > Developer API. Las claves en texto plano se muestran una sola vez al crearlas y CazVid las almacena solo como hash. Trata las claves como secretos: no las pongas en código de frontend, apps móviles, capturas de pantalla, registros ni mensajes de soporte.
x-api-key: cazvid_jb_...
Authorization: Bearer cazvid_jb_...
Content-Type: application/jsonBuscar candidatos
POST /public/search recibe un query obligatorio (de 2 a 300 caracteres) y filtros estructurados opcionales. Los filtros acotan el mismo pool de candidatos que usa la búsqueda de reclutadores en la app. Envía page y pageSize para paginar; pageSize está limitado a 25 y page a 100.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| query | string | Requerido | Búsqueda de candidatos en lenguaje natural (de 2 a 300 caracteres), por ejemplo 'agente de soporte al cliente bilingüe en Ciudad de México'. |
| location | string | Opcional | Filtro de ubicación opcional en texto libre (ciudad, región o país), hasta 120 caracteres, por ejemplo 'Bogotá, Colombia'. |
| remote | boolean | Opcional | Cuando es true, prioriza candidatos con disponibilidad remota. |
| requireVideo | boolean | Opcional | Cuando es true, solo devuelve candidatos con un perfil de video reproducible. |
| language | string (ISO 639-1) | Opcional | Idioma preferido del currículum como código ISO 639-1 de dos letras (por ejemplo en o es). Los resultados se orientan hacia ese idioma; es un ajuste aproximado, no un filtro estricto. |
| createdAfter | string (ISO 8601) | Opcional | Fecha y hora ISO 8601. Solo devuelve candidatos cuyo contenido buscable se actualizó después de ese instante. |
| page | integer | Opcional | Número de página (base 1), de 1 a 100. Predeterminado 1. |
| pageSize | integer | Opcional | Resultados por página, de 1 a 25. Predeterminado 10. |
curl -X POST https://aio-backend-prod.cazvid.app/api/v3.0/candidate-search/public/search \
-H "x-api-key: cazvid_jb_..." \
-H "Content-Type: application/json" \
-d '{
"query": "bilingual customer support agent in Mexico City",
"location": "Mexico City, Mexico",
"remote": true,
"requireVideo": true,
"language": "en",
"page": 1,
"pageSize": 10
}'Estructura del resultado
Cada resultado es un perfil público de candidato depurado. Los campos anulables se omiten o son null cuando CazVid no tiene ese dato. candidateId es un token pc1. opaco y estable, no un id de plataforma sin procesar y no reversible por quien llama. cazumeUrl solo está presente cuando el candidato ha publicado un perfil público de Cazume.
| Campo | Tipo | Descripción |
|---|---|---|
| candidateId | string | Token de candidato opaco y estable (pc1....). Úsalo para contactar al candidato a través de la app de CazVid; no es un id de plataforma sin procesar y no es reversible. |
| displayName | string | null | Nombre para mostrar del candidato, con la información de contacto depurada. |
| headline | string | null | Puesto actual o más reciente resuelto. |
| summary | string | null | Resumen breve de experiencia, con la información de contacto depurada. |
| topSkills | string[] | Habilidades principales, con la información de contacto depurada. |
| matchedSkills | string[] | Subconjunto de habilidades principales que coincidieron con la consulta. |
| matchTier | string | null | Nivel relativo de coincidencia para esta consulta cuando está disponible; trátalo como una etiqueta opaca. |
| locationName | string | null | Ubicación del candidato en formato legible. |
| countryCode | string | null | Código de país ISO 3166-1 alfa-2, cuando está disponible. |
| isRemote | boolean | Si el candidato tiene disponibilidad remota. |
| language | string | null | Idioma del currículum ISO 639-1, cuando está disponible. |
| hasVideo | boolean | Si existe un perfil de video reproducible. |
| videoUrl | string | null | URL del perfil de video alojado en CazVid, cuando está disponible. |
| thumbnailUrl | string | null | URL de la miniatura del video alojada en CazVid, cuando está disponible. |
| avatarUrl | string | null | URL de la imagen de avatar alojada en CazVid, cuando está disponible. |
| cazumeUrl | string | null | URL del perfil público de Cazume (https://cazvid.com/cazume/<slug>), presente solo cuando el candidato ha publicado uno. |
| updatedAt | string | null | Marca de tiempo ISO 8601 del contenido buscable más reciente del candidato. |
{
"results": [
{
"candidateId": "pc1.aGVsbG8td29ybGQ",
"displayName": "Maria G.",
"headline": "Bilingual Customer Support Specialist",
"summary": "Five years supporting SaaS customers in English and Spanish.",
"topSkills": ["Customer support", "Zendesk", "Bilingual (EN/ES)"],
"matchedSkills": ["Customer support", "Bilingual (EN/ES)"],
"matchTier": "local",
"locationName": "Mexico City, Mexico",
"countryCode": "MX",
"isRemote": true,
"language": "en",
"hasVideo": true,
"videoUrl": "https://ik.imagekit.io/cazvid/videos/example.mp4",
"thumbnailUrl": "https://ik.imagekit.io/cazvid/thumbs/example.jpg",
"avatarUrl": "https://ik.imagekit.io/cazvid/avatars/example.jpg",
"cazumeUrl": "https://cazvid.com/cazume/maria-g",
"updatedAt": "2026-07-01T12:30:00.000Z"
}
],
"hasMore": true,
"page": 1,
"pageSize": 10
}Paginación
La respuesta envuelve los resultados con metadatos de paginación. Esta API pagina solo con hasMore - no hay un conteo total.
results- los perfiles de candidatos de esta página.hasMore- true cuando existe otra página. Solicita la siguiente incrementandopage.page- el número de página (base 1) devuelto.pageSize- el tamaño de página devuelto.- No hay campo de conteo total. No esperes un
totalni uncount: sigue solicitando páginas mientrashasMoresea true.
Consultar la cuota restante
GET /public/usage devuelve la cuota diaria de Candidate Search de la organización que llama. Usa la misma autenticación que la búsqueda y no cuenta para la cuota, así que puedes consultarlo antes de un lote para evitar respuestas 429. Las consultas están limitadas a 60 solicitudes por minuto por clave de API; al excederlo se devuelve la forma estándar de 429 con details.period en minute.
/public/usagecurl https://aio-backend-prod.cazvid.app/api/v3.0/candidate-search/public/usage \
-H "x-api-key: cazvid_jb_..."| Campo | Tipo | Descripción |
|---|---|---|
| dailyQuota | number | Total de llamadas de búsqueda exitosas permitidas por organización por día UTC. |
| used | number | Llamadas de búsqueda que consumen cuota realizadas hoy (UTC) con las claves de esta organización. |
| remaining | number | Llamadas exitosas restantes antes de que se reinicie la cuota. |
| resetsAt | string (ISO 8601) | Marca de tiempo ISO 8601 de la próxima medianoche UTC, cuando se reinicia la cuota. |
| period | "utc_day" | Ventana de la cuota. Siempre utc_day en la v1. |
{
"dailyQuota": 100,
"used": 12,
"remaining": 88,
"resetsAt": "2026-07-08T00:00:00.000Z",
"period": "utc_day"
}Errores
Las respuestas de error usan valores errorCode estables para que las integraciones no tengan que analizar mensajes de texto. Cada error devuelve el path de la solicitud; las respuestas 429 añaden retryAfter, el número de segundos hasta que se reinicia la ventana del límite. Un 429 de la cuota diaria lleva details.period utc_day; un 429 del límite por minuto o del límite de consultas de uso lleva minute.
| Estado | Código | Significado |
|---|---|---|
| 400 | VALIDATION_ERROR | El cuerpo de la solicitud no pasó la validación (por ejemplo la longitud de query, los límites de page o pageSize, el formato de language o el formato de createdAfter). |
| 401 | API_KEY_MISSING | No se envió ninguna clave de API. |
| 401 | API_KEY_INVALID | La clave no existe o no se puede verificar. |
| 401 | API_KEY_EXPIRED | La clave superó su fecha de expiración. |
| 401 | API_KEY_REVOKED | La clave fue revocada. |
| 403 | PLAN_REQUIRED | El acceso a la API en producción requiere un plan Platinum o superior. |
| 403 | SCOPE_FORBIDDEN | La clave no lleva el alcance de candidate-search. |
| 403 | ORG_ACCESS_DENIED | La clave no puede acceder a esta organización. |
| 403 | WORKSPACE_ACCESS_DENIED | El workspaceId en el cuerpo de la solicitud no pertenece a tu clave de API. |
| 429 | RATE_LIMIT_EXCEEDED | Se alcanzó un límite: la cuota diaria (details.period utc_day) o el límite por minuto o el límite de consultas de uso (details.period minute). |
| 504 | SEARCH_TIMEOUT | La búsqueda de candidatos tardó demasiado. Reintenta la solicitud. |
| 500 | CANDIDATE_SEARCH_API_ERROR | Ocurrió un error inesperado del servidor, o una dependencia no estaba disponible. |
{
"statusCode": 429,
"errorCode": "RATE_LIMIT_EXCEEDED",
"message": "Daily Candidate Search API quota exceeded.",
"details": {
"limit": 100,
"period": "utc_day"
},
"retryAfter": 21600,
"path": "/api/v3.0/candidate-search/public/search"
}Uso aceptable
Los datos de candidatos se proporcionan para atender la solicitud del usuario final que tienes enfrente, no para copiarse ni revenderse. Al usar esta API aceptas lo siguiente. Estos términos pueden ser reemplazados por términos formales de la API cuando la API pase a disponibilidad general.
- Sin duplicación masiva ni redistribución. No copies el índice de candidatos a tu propio almacén ni construyas un directorio o conjunto de datos competidor a partir de él.
- Sin retención más allá de atender la solicitud. Conserva los resultados solo el tiempo necesario para responder la solicitud que tienes enfrente; no construyas una copia persistente de los perfiles de candidatos.
- Sin reventa. Los perfiles de candidatos y cualquier campo derivado de ellos no pueden venderse, sublicenciarse ni redistribuirse.
- Contacta a los candidatos solo a través de CazVid. Los resultados no incluyen datos de contacto; contacta a un candidato a través de su perfil público de Cazume o de la app de CazVid, nunca fuera de la plataforma.
- Sin evasión de la cuota. No uses varias claves, organizaciones ni cuentas para evadir la cuota diaria por organización ni el límite por minuto.
Límites y comportamiento
- La cuota de la v1 es de 100 llamadas exitosas a
searchpor organización por día UTC. Es una cuota separada de la de Job Builder API. - Un límite por organización de 20 búsquedas por minuto protege el backend de búsqueda compartido. Al excederlo se devuelve
429condetails.periodenminute. pageSizeestá limitado a 25 ypagea 100. Las solicitudes por encima de esos límites devuelven400 VALIDATION_ERROR.- Los resultados no incluyen datos de contacto (ni correo, ni teléfono, ni LinkedIn) ni ids de plataforma sin procesar. Contacta a los candidatos a través de la app de CazVid o de su perfil de Cazume.
- Rota las claves creando una clave nueva, actualizando tu integración y luego revocando la anterior. La misma clave sirve también para la Job Builder API.
Usar desde un agente (MCP)
¿Prefieres controlar la búsqueda de candidatos desde un agente de IA en vez de HTTP directo? El servidor MCP de CazVid expone search_candidates (además de list_api_usage) a Claude Code, Claude.ai, ChatGPT, Cursor y VS Code, con esta misma clave de API y cuota diaria.