Descripción general
La v1 tiene tres endpoints públicos. Usa /public/generate cuando solo necesites una vista previa. Usa /public/jobs cuando quieras que CazVid cree un registro de empleo real. Usa /public/usage para consultar tu cuota diaria restante sin gastarla.
/public/generateincludeDescription: true para incluir el HTML de la descripción generada./public/jobs/public/usageAutenticació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 y pueden limitarse a uno o más workspaces. 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/jsonVista previa de los detalles generados
Las llamadas de vista previa no escriben registros de empleo. Devuelven un DTO público normalizado que tu integración puede inspeccionar antes de crear un borrador o publicar.
curl -X POST https://aio-backend-prod.cazvid.app/api/v3.0/job-builder/public/generate \
-H "x-api-key: cazvid_jb_..." \
-H "Content-Type: application/json" \
-d '{
"prompt": "Looking for a remote customer support specialist in Mexico",
"language": "en",
"organizationId": "ORG_ID",
"workspaceId": "WORKSPACE_ID",
"includeDescription": true
}'Crear empleos
El endpoint jobs siempre genera los detalles y la descripción. Las preguntas de filtro se omiten en la v1. Los empleos Premium y Premium+ permanecen en la app porque dependen del flujo de pago.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| prompt | string | Requerido | Solicitud de contratación en lenguaje natural (de 1 a 10000 caracteres), incluyendo el puesto, la ubicación o la intención de trabajo remoto y los requisitos útiles. |
| language | en | es | nl | pt | Requerido | Idioma para los detalles y la descripción del empleo generados. Las superficies de empleo de CazVid son inglés y español, por lo que se recomienda en o es. |
| organizationId | ObjectId | Opcional | Organización propietaria del empleo. Si se omite, se usa la organización de la clave de API. |
| workspaceId | ObjectId | Opcional | Workspace donde se debe crear el empleo. Si se omite, se usa el workspace predeterminado de la clave de API. |
| publishMode | draft | publish | Opcional | draft (el valor predeterminado) guarda un empleo editable. publish crea un empleo estándar y lo envía a la aprobación de CazVid. |
Crear un borrador
curl -X POST https://aio-backend-prod.cazvid.app/api/v3.0/job-builder/public/jobs \
-H "x-api-key: cazvid_jb_..." \
-H "Content-Type: application/json" \
-d '{
"prompt": "Looking for a bilingual customer support specialist in Mexico",
"language": "en",
"organizationId": "ORG_ID",
"workspaceId": "WORKSPACE_ID",
"publishMode": "draft"
}'Publicar un empleo estándar
curl -X POST https://aio-backend-prod.cazvid.app/api/v3.0/job-builder/public/jobs \
-H "x-api-key: cazvid_jb_..." \
-H "Content-Type: application/json" \
-d '{
"prompt": "Looking for a bartender in Monterrey",
"language": "en",
"organizationId": "ORG_ID",
"workspaceId": "WORKSPACE_ID",
"publishMode": "publish"
}'Modos de trabajo y ubicación
Remoto dentro del país
Ejemplo de prompt: Looking for a remote customer support specialist in Mexico.
Devuelve workMode.type remote, scope country, countryCode MX, sin coordenadas de ciudad.
Remoto en todo el mundo
Ejemplo de prompt: Looking for a virtual assistant, fully remote worldwide.
Devuelve workMode.type remote, scope worldwide, y borra country, city, GeoName y coordinates.
Presencial o híbrido
Ejemplo de prompt: Looking for a truck driver in Managua.
Devuelve los datos canónicos de la ciudad resueltos a través de los servicios de ubicación de CazVid.
Estructura de la respuesta
Las respuestas de borrador y publicación incluyen el id del post creado, el modo de publicación, el estado del empleo, completePost, jobBuilderProgress y el DTO público del empleo generado. Los borradores conservan jobBuilderProgress para retomarlos en la app; al publicar se pone en null. Los empleos publicados también incluyen listId cuando se crea la lista de empleos (los borradores devuelven listId null).
{
"postId": "POST_ID",
"listId": "LIST_ID",
"publishMode": "publish",
"status": "pending",
"completePost": true,
"jobBuilderProgress": null,
"job": {
"title": "Bartender",
"language": "en",
"description": "<p>Generated job description...</p>",
"workMode": {
"type": "onsite",
"scope": null,
"countryCode": "MX",
"countryName": "Mexico",
"city": "Monterrey",
"region": "Nuevo Leon",
"displayName": "Monterrey, Nuevo Leon, Mexico",
"geoNameId": "3995465",
"coordinates": {
"longitude": -100.3161,
"latitude": 25.6866
}
},
"salary": {
"low": 8000,
"recommended": 10000,
"high": 12000,
"period": "monthly",
"currency": "MXN",
"currencySymbol": "MX$",
"negotiable": false,
"additionalCompensation": []
},
"primaryEmploymentType": "fullTime",
"employmentTypes": ["fullTime", "partTime"],
"categories": [
{
"id": "CATEGORY_ID",
"name": "Food Service",
"primary": true
}
],
"education": ["High School Diploma or equivalent"],
"skills": ["Customer service", "Attention to detail"]
}
}Idempotencia
Envía un encabezado opcional Idempotency-Key en POST /public/jobs para que la creación de empleos sea segura de reintentar. La clave tiene de 1 a 255 caracteres ASCII visibles. La misma clave con el mismo cuerpo de solicitud repite la respuesta almacenada (con un encabezado de respuesta Idempotency-Replayed: true) sin crear un segundo empleo y sin consumir cuota - el reintento aún debe pasar el límite diario, así que una repetición intentada cuando la organización está en su tope diario devuelve 429 RATE_LIMIT_EXCEEDED. Las repeticiones están disponibles durante 24 horas después de que la solicitud original se completa; después de eso la clave se comporta como nueva. La misma clave con un cuerpo diferente devuelve 422 IDEMPOTENCY_KEY_REUSED. Un duplicado concurrente que llega mientras el primero aún se procesa devuelve 409 IDEMPOTENCY_IN_PROGRESS; una solicitud inconclusa retiene la clave como máximo 10 minutos, así que los 409 se resuelven dentro de ese límite. Un encabezado con formato inválido devuelve 400 IDEMPOTENCY_KEY_INVALID. Si el almacén de idempotencia no está disponible, la solicitud no se procesa y devuelve 503 IDEMPOTENCY_STORE_UNAVAILABLE con el cupo de cuota reembolsado - reintenta con la misma clave.
curl -X POST https://aio-backend-prod.cazvid.app/api/v3.0/job-builder/public/jobs \
-H "x-api-key: cazvid_jb_..." \
-H "Idempotency-Key: 7c9e6a2f-unique-per-job-intent" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Looking for a bartender in Monterrey",
"language": "en",
"organizationId": "ORG_ID",
"workspaceId": "WORKSPACE_ID",
"publishMode": "publish"
}'Consultar la cuota restante
GET /public/usage devuelve la cuota diaria de Job Builder de la organización que llama. Usa la misma autenticación que los demás endpoints 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-builder/public/usage \
-H "x-api-key: cazvid_jb_..."| Campo | Tipo | Descripción |
|---|---|---|
| dailyQuota | number | Total de llamadas exitosas permitidas por organización por día UTC. |
| used | number | Llamadas a la API 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": 10,
"used": 3,
"remaining": 7,
"resetsAt": "2026-07-07T00: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 el día UTC.
| Estado | Código | Significado |
|---|---|---|
| 400 | VALIDATION_ERROR | El cuerpo de la solicitud no pasó la validación. |
| 400 | IDEMPOTENCY_KEY_INVALID | El encabezado Idempotency-Key tiene un formato inválido (debe tener de 1 a 255 caracteres ASCII visibles). |
| 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 | ORG_ACCESS_DENIED | La clave no puede acceder a esta organización. |
| 403 | WORKSPACE_ACCESS_DENIED | La clave no puede acceder a este workspace. |
| 403 | PLAN_REQUIRED | El acceso a la API en producción requiere un plan Platinum o superior. |
| 409 | IDEMPOTENCY_IN_PROGRESS | Una solicitud con el mismo Idempotency-Key aún se está procesando. Reintenta cuando termine. |
| 422 | IDEMPOTENCY_KEY_REUSED | El Idempotency-Key ya se usó con un cuerpo de solicitud diferente. |
| 429 | RATE_LIMIT_EXCEEDED | La organización alcanzó su cuota diaria de llamadas exitosas. |
| 503 | IDEMPOTENCY_STORE_UNAVAILABLE | No se pudo verificar la idempotencia, así que no se creó nada. Reintenta con la misma clave. |
{
"statusCode": 429,
"errorCode": "RATE_LIMIT_EXCEEDED",
"message": "Daily Job Builder API quota exceeded.",
"details": {
"limit": 10,
"period": "utc_day"
},
"retryAfter": 21600,
"path": "/api/v3.0/job-builder/public/jobs"
}Límites y comportamiento
- La cuota de la v1 es de 10 llamadas exitosas a
generateojobspor organización por día UTC. publishMode: "publish"crea únicamente empleos estándar. Premium y Premium+ permanecen en la app en la v1.- Los empleos publicados entran en el pipeline existente de CazVid de pendiente y aprobación. La API no marca directamente los empleos como aprobados.
- Rota las claves creando una clave nueva, actualizando tu integración y luego revocando la clave anterior.
¿También usas la Candidate Search API? Revisa sus términos de uso aceptable.
Usar desde un agente (MCP)
¿Prefieres controlar Job Builder desde un agente de IA en vez de HTTP directo? El servidor MCP de CazVid expone preview_job y create_job (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.