Carta de presentación
Envía el CV de un candidato junto con una oferta de empleo concreta, y el endpoint redacta una carta de presentación que efectivamente hace referencia a ambos documentos, no una plantilla genérica con el nombre de la empresa cambiado. Está pensado para el momento en que un reclutador, una plataforma de empleo o un sistema de seguimiento de candidatos necesita una carta que suene como si alguien hubiera leído la oferta.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
El vacío que resuelve
La mayoría de las herramientas de cartas de presentación producen los mismos tres párrafos sin importar la entrada: una apertura entusiasta, un cuerpo sobre experiencia y un cierre pidiendo entrevista. Este endpoint, en cambio, cruza la trayectoria real del CV contra los requisitos que declara la oferta, así que la carta nombra las habilidades o proyectos concretos que coinciden con lo que pide el empleador. Esto importa sobre todo para agencias de reclutamiento, centros de carrera universitarios y plataformas de empleo que generan cartas en volumen para muchas ofertas distintas a la vez.
Qué envía, qué recibe
Se hace POST a /text/cover-letter con el texto del CV (o un resumen estructurado de él) y el texto de la oferta. La tarea corre de forma asíncrona: recibe un task_id de inmediato, y la carta terminada llega por webhook firmado o por un enlace firmado válido durante 24 horas. No hay espera síncrona, lo que hace que el endpoint funcione bien en flujos por lotes que procesan decenas de postulaciones sin mantener una conexión abierta.
Por qué la carta de presentación resiste la plantilla
La carta de presentación como género siempre ha sido un argumento, no un resumen: su función es explicar por qué este candidato encaja en este puesto específico, que es justo lo que una plantilla de espacios en blanco no puede lograr. Automatizar bien ese argumento requiere leer de verdad ambos documentos y encontrar el cruce entre ellos, que es la parte que resolvemos para que su producto no tenga que reimplementar el análisis de currículums y el cruce de requisitos desde cero.
Dónde encaja en un flujo automatizado
Los casos típicos son integraciones con sistemas de seguimiento de candidatos, SaaS de creación de currículums y herramientas de recolocación laboral que ya tienen el texto del CV y están cruzando candidatos contra puestos abiertos. Como la llamada es asíncrona con entrega por webhook, se integra sin fricción en una cola: se dispara una solicitud por cada par candidato-oferta, el webhook escribe el resultado en su base de datos, y se sigue con la siguiente. El precio es una tarifa fija por solicitud más un cargo por carta generada, y se cobra solo cuando la carta se completa; una generación fallida, que se reintenta automáticamente hasta tres veces, nunca se cobra.
Qué puede hacer con ella
Agencia de reclutamiento en volumen
Una agencia de contratación cruza cincuenta CVs contra diez ofertas abiertas durante la noche y recibe cincuenta cartas personalizadas para la mañana siguiente, cada una referida al puesto real.
SaaS de creación de currículums
Una plataforma de empleo deja que el usuario pegue el enlace de una vacante; el producto llama al endpoint en segundo plano y muestra un borrador de carta que el usuario puede editar antes de postular.
Centro de carrera universitario
Una oficina de servicios de carrera genera un primer borrador de carta para cada pareja estudiante-vacante, para que los asesores dediquen su tiempo a orientar en lugar de redactar desde cero.
Apoyo en recolocación laboral
Un proveedor de recursos humanos que ayuda a personas despedidas a reinsertarse en el mercado genera por lotes las cartas contra los puestos que cada persona está postulando activamente.
Preguntas frecuentes
¿Es gratis la API para generar cartas de presentación?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Necesita el CV y la oferta de empleo a la vez?
Sí. La carta se construye a partir del cruce entre ambos documentos, así que la calidad depende de enviar el contenido real del CV y el texto de la oferta, no solo un título.
¿Cómo recibo el resultado?
Por webhook firmado, que recomendamos para flujos automatizados, o por un enlace firmado que permanece válido durante 24 horas si prefiere consultarlo manualmente.
¿Puedo generar cartas en lote?
Sí: se llama al endpoint una vez por cada par candidato-oferta; cada llamada es una tarea asíncrona independiente con su propio task_id, así que puede lanzar varias en paralelo.
¿En qué idioma sale la carta?
Sigue el idioma del CV y la oferta que envíe; no existe un parámetro de idioma separado que configurar.
¿La carta va a sonar genérica?
Está pensada para no sonar así: hace referencia a habilidades y requisitos concretos extraídos de lo que envía en lugar de llenar una plantilla fija, así que la calidad depende del detalle de su entrada.
¿Qué pasa con los datos del CV después?
Se eliminan al terminar el periodo de retención y nunca se usan para entrenamiento; el endpoint existe para generar la carta, no para conservar los datos de sus candidatos.
¿Es lo mismo que un analizador de currículums?
No, no extrae campos estructurados del currículum: lee el CV como contexto para escribir la carta. Combínelo con un paso de análisis aparte si además necesita datos estructurados.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/text/cover-letter \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/cover-letter", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/cover-letter",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/cover-letter", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/cover-letter", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.cover_letter",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_tokens | 20000 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
422 | task_failed | La tarea falló tras 3 reintentos. No se cobra. |