Descripción general
La v1 tiene dos endpoints públicos. Usa /public/search para encontrar empleos públicos con una consulta y filtros opcionales. Usa /public/usage para consultar tu cuota diaria restante sin gastarla. El contrato OpenAPI se sirve en /public/openapi.json.
/public/search/public/usageEmpleos públicos, con un enlace para postularse y sin datos de contacto
Cada resultado es un empleo público de CazVid. Los resultados nunca incluyen datos de contacto del reclutador ni del responsable de contratación - ni correo, ni teléfono, ni LinkedIn. Cuando el empleo tiene página pública, el resultado incluye un applyUrl (la página del empleo en CazVid donde se postula la persona) y un slug estable. Entrega el applyUrl a quien busca empleo; la postulación siempre ocurre en CazVid.
Autenticación
Envía tu clave de API con el encabezado x-api-key o como un token Authorization: Bearer. Las claves pertenecen a una organización; los propietarios y administradores las gestionan en la app en Perfil > Developer API, y quienes buscan empleo también pueden crear una. 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. El mismo formato de clave (cazvid_jb_...) sirve para todas las familias de la CazVid Developer API; cada clave lleva solo los alcances que permite tu plan.
x-api-key: cazvid_jb_...
Authorization: Bearer cazvid_jb_...
Content-Type: application/jsonBuscar empleos
POST /public/search recibe un query opcional y filtros estructurados opcionales. Envía query en lenguaje natural (por ejemplo 'empleos de almacén en Bogotá'), u omítelo para explorar solo con filtros. Envía page y pageSize para paginar; pageSize está limitado a 25 y page a 100. Las solicitudes por encima de esos límites devuelven 400 VALIDATION_ERROR.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| query | string | Opcional | Búsqueda de empleo opcional en lenguaje natural, por ejemplo 'empleos de almacén en Bogotá'. Omítelo para explorar solo con filtros. |
| location | string | Opcional | Filtro de ubicación opcional en texto libre (ciudad, región o país), por ejemplo 'Bogotá, Colombia' o 'México'. |
| remote | boolean | Opcional | Cuando es true, prioriza empleos remotos. |
| language | string (ISO 639-1) | Opcional | Idioma preferido del empleo 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 empleos publicados después de ese instante; filtra por el createdAt de la publicación. |
| 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/job-search/public/search \
-H "x-api-key: cazvid_jb_..." \
-H "Content-Type: application/json" \
-d '{
"query": "warehouse jobs in Bogota",
"location": "Bogota, Colombia",
"remote": false,
"language": "es",
"page": 1,
"pageSize": 10
}'Estructura del resultado
Cada resultado es un empleo público. Los campos anulables se omiten o son null cuando CazVid no tiene ese dato. Cuando están presentes, slug identifica el empleo en cazvid.com y applyUrl es la página canónica del empleo por la que se postula la persona (https://cazvid.com/job/<slug>, o /empleo/<slug> en español); ambos son null para un empleo sin página pública. Nunca se incluyen ids de plataforma sin procesar ni campos de contacto.
| Campo | Tipo | Descripción |
|---|---|---|
| title | string | null | Título del empleo. |
| description | string | null | Descripción del empleo, con los datos de contacto depurados y el HTML eliminado. |
| companyName | string | null | Nombre de la empresa contratante, cuando está disponible. |
| authorName | string | null | Nombre público que se muestra en la página del empleo, cuando está disponible. |
| jobType | string | null | Tipo de empleo (por ejemplo tiempo completo o medio tiempo), cuando está disponible. |
| typeOfWork | string | null | Clasificación de la modalidad de trabajo, cuando está disponible. |
| isRemote | boolean | Si el empleo es remoto. |
| remoteWorkScope | string | null | Alcance del trabajo remoto (por ejemplo solo país o mundial), cuando está disponible. |
| locationName | string | null | Ubicación del empleo en formato legible. |
| locationCountryCode | string | null | Código de país ISO 3166-1 alfa-2, cuando está disponible. |
| payAmount | number | null | Monto del pago, cuando está disponible. |
| payCurrency | string | null | Código de moneda ISO 4217 del monto del pago, cuando está disponible. |
| payType | string | null | Periodo de pago (por ejemplo por hora o mensual), cuando está disponible. |
| isNegotiable | boolean | Si el pago es negociable. |
| language | string | null | Idioma del empleo ISO 639-1, cuando está disponible. |
| occupationTitles | string[] | Títulos de ocupación asociados al empleo. |
| occupationFamilies | string[] | Familias de ocupación a las que pertenece el empleo. |
| createdAt | string | null | Marca de tiempo ISO 8601 de cuándo se publicó el empleo. |
| refreshedAt | string | null | Marca de tiempo ISO 8601 de la actualización más reciente del empleo, cuando está disponible. |
| slug | string | null | Slug público estable que identifica el empleo en cazvid.com, o null cuando el empleo no tiene página pública. |
| applyUrl | string | null | Página canónica del empleo en CazVid para postularse (https://cazvid.com/job/<slug>, o /empleo/<slug> en español), o null cuando el empleo no tiene página pública. |
| videoUrl | string | null | URL del video del empleo alojado en CazVid, cuando está disponible. |
| thumbnailUrl | string | null | URL de la miniatura del video del empleo alojada en CazVid, cuando está disponible. |
{
"jobs": [
{
"title": "Warehouse Operator",
"description": "Join our Bogota distribution center as a warehouse operator...",
"companyName": "Andes Logistics",
"authorName": "Andes Logistics HR",
"jobType": "full-time",
"typeOfWork": "on-site",
"isRemote": false,
"remoteWorkScope": null,
"locationName": "Bogota, Colombia",
"locationCountryCode": "CO",
"payAmount": 1800000,
"payCurrency": "COP",
"payType": "monthly",
"isNegotiable": false,
"language": "es",
"occupationTitles": ["Warehouse Operator", "Logistics Assistant"],
"occupationFamilies": ["Transportation and Logistics"],
"createdAt": "2026-07-01T12:30:00.000Z",
"refreshedAt": "2026-07-08T09:00:00.000Z",
"slug": "warehouse-operator-bogota-andes-logistics",
"applyUrl": "https://cazvid.com/empleo/warehouse-operator-bogota-andes-logistics",
"videoUrl": "https://ik.imagekit.io/cazvid/videos/example.mp4",
"thumbnailUrl": "https://ik.imagekit.io/cazvid/thumbs/example.jpg"
}
],
"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.
jobs- los empleos 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 Job 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/job-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. Predeterminado 500. |
| 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 a la medianoche UTC. |
| 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": 500,
"used": 12,
"remaining": 488,
"resetsAt": "2026-07-11T00: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; un 429 del backstop por IP lleva minute con details.scope en ip.
| Estado | Código | Significado |
|---|---|---|
| 400 | VALIDATION_ERROR | El cuerpo de la solicitud no pasó la validación, por ejemplo un tipo de campo incorrecto, un formato de language o createdAfter inválido, o un valor de page o pageSize por encima de los límites permitidos. |
| 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 | SCOPE_FORBIDDEN | La clave no lleva el alcance de job-search. |
| 429 | RATE_LIMIT_EXCEEDED | Se alcanzó un límite: la cuota diaria (details.period utc_day), el límite por minuto o el límite de consultas de uso (details.period minute), o el backstop por IP (details.period minute con details.scope ip). |
| 504 | SEARCH_TIMEOUT | La búsqueda de empleos tardó demasiado. Reintenta la solicitud. |
| 500 | JOB_SEARCH_API_ERROR | Ocurrió un error inesperado del servidor, o una dependencia no estaba disponible. |
{
"statusCode": 429,
"errorCode": "RATE_LIMIT_EXCEEDED",
"message": "Daily Job Search API quota exceeded.",
"details": {
"limit": 500,
"period": "utc_day"
},
"retryAfter": 21600,
"path": "/api/v3.0/job-search/public/search"
}Uso aceptable
Los empleos se proporcionan para atender la búsqueda de empleo 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 empleos a tu propio almacén ni construyas una bolsa de empleo 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 búsqueda que tienes enfrente; no construyas una copia persistente del índice de empleos.
- Sin reventa. Los empleos y cualquier campo derivado de ellos no pueden venderse, sublicenciarse ni redistribuirse.
- Postúlate a través de CazVid. Envía a quienes buscan empleo al
applyUrlen cazvid.com; no hagas scraping para evitarlo ni redirijas las postulaciones 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, el límite por minuto ni el backstop por IP.
Límites y comportamiento
- La cuota de la v1 es de 500 llamadas exitosas a
searchpor organización por día UTC. El alcance de job-search es gratuito y está separado de las cuotas de Job Builder y Candidate Search. - Un límite por organización de 30 búsquedas por minuto, más un backstop por IP de 60 por minuto, protege el backend de búsqueda compartido. Al exceder cualquiera se devuelve
429condetails.periodenminute(el bloqueo por IP añadedetails.scopeenip). pageSizeestá limitado a 25 ypagea 100. Las solicitudes por encima de esos límites devuelven400 VALIDATION_ERROR.- Los resultados son empleos públicos. Incluyen un
applyUrly unslugcuando el empleo tiene página pública, pero ningún dato de contacto del reclutador ni ids de plataforma sin procesar. - Rota las claves creando una clave nueva, actualizando tu integración y luego revocando la anterior. Cada organización puede tener hasta 10 claves activas en todas las familias.
Usar desde un agente (MCP)
¿Prefieres controlar la búsqueda de empleo desde un agente de IA en vez de HTTP directo? El servidor MCP de CazVid expone search_jobs (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.