1. Acceso por plan
- • GET prospectos, ofertas, presupuestos/facturas, estadísticas
- • 100 solicitudes/hora
- • Cualquier solicitud POST / PATCH / DELETE devuelve 403
- • Todo Business + creación / modificación / eliminación
- • Prospectos, ofertas, presupuestos/facturas, IA, citas
- • 500 solicitudes/hora
2. Autenticación
Todas las solicitudes incluyen un Bearer token en la cabecera Authorization.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects
Genera tu clave desde Ajustes → Claves API.
3. Endpoints
/prospectsBusiness + PlatinumLista de prospectos (filtros: status, country, limit, offset).
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects?limit=50
/prospects/{id}Business + PlatinumDetalle de un prospecto.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalsBusiness + PlatinumOfertas comerciales de un prospecto.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals
/documentsBusiness + PlatinumLista de presupuestos/facturas (filtros: type, status).
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/documents?type=invoice&status=paid
/statsBusiness + PlatinumEstadísticas (period=month|quarter|year).
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/stats?period=month
/prospectsSolo PlatinumCrear un prospecto. Reservado al plan Platinum.
{ "name": "Jane Doe", "company": "Acme", "email": "jane@acme.io", "budget": 5000, "currency": "EUR" }curl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"Jane Doe","company":"Acme"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/prospects/{id}Solo PlatinumActualizar un prospecto. Reservado al plan Platinum.
{ "status": "won", "budget": 8000 }curl -X PATCH -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"status":"won"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/prospects/{id}Solo PlatinumEliminar un prospecto. Reservado al plan Platinum.
curl -X DELETE -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalsSolo PlatinumCrear una oferta. Reservado al plan Platinum.
{ "title": "Refonte site", "amount": 3500, "currency": "EUR" }curl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"title":"Refonte"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals/proposals/{id}Solo PlatinumActualizar una oferta. Reservado al plan Platinum.
{ "status": "sent" }curl -X PATCH -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"status":"sent"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/proposals/ID/prospects/{id}/documentsSolo PlatinumCrear un presupuesto o una factura. Reservado al plan Platinum.
{ "type": "invoice", "amount": 2500, "currency": "EUR" }curl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"type":"invoice","amount":2500}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/documents/emails/generateSolo PlatinumGenerar un email IA personalizado. Reservado al plan Platinum.
{ "prospect_id": "...", "template": "first_contact" }curl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"prospect_id":"..."}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/emails/generate/whatsapp/generateSolo PlatinumGenerar un mensaje de WhatsApp con IA. Reservado al plan Platinum.
{ "prospect_id": "...", "template": "relance douce" }curl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"prospect_id":"..."}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/whatsapp/generate4. Ejemplos cURL por plan
Elige la sección que corresponde a tu plan. Las solicitudes de escritura con una clave Business devuelven un 403 plan_forbidden_write.
Ejemplos Business (solo lectura)
/prospectscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects?limit=50
/prospects/{id}curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals
/documentscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/documents?type=invoice&status=paid
/statscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/stats?period=month
Ejemplos Platinum (lectura + escritura)
/prospectscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects?limit=50
/prospects/{id}curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals
/documentscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/documents?type=invoice&status=paid
/statscurl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/stats?period=month
/prospectscurl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"Jane Doe","company":"Acme"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/prospects/{id}curl -X PATCH -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"status":"won"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/prospects/{id}curl -X DELETE -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalscurl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"title":"Refonte"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals/proposals/{id}curl -X PATCH -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"status":"sent"}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/proposals/ID/prospects/{id}/documentscurl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"type":"invoice","amount":2500}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/documents/emails/generatecurl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"prospect_id":"..."}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/emails/generate/whatsapp/generatecurl -X POST -H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" -d '{"prospect_id":"..."}' \
https://propulse-ton-freelance.lovable.app/api/public/v1/whatsapp/generate5. Ejemplos de código
import requests
r = requests.get(
"https://propulse-ton-freelance.lovable.app/api/public/v1/prospects",
headers={"Authorization": "Bearer sk_live_xxx"}
)
print(r.json())const r = await fetch(
"https://propulse-ton-freelance.lovable.app/api/public/v1/prospects",
{ headers: { Authorization: "Bearer sk_live_xxx" } }
);
console.log(await r.json());6. Códigos de error y mensajes accionables
Cada error devuelve un JSON estructurado: { error, code, upgrade_url?, docs_url?, retry_after_seconds?, limit_per_hour? }. code — para mostrar un mensaje traducido y proponer la acción correspondiente al usuario.
| HTTP | code | Significado y acción recomendada |
|---|---|---|
| 401 | invalid_key | Clave API inválida o revocada. Genera una nueva clave en Ajustes → Claves API. |
| 403 | plan_no_api_access | El plan no da acceso a la API. Mensaje sugerido: «Esta acción requiere un plan Business o Platinum — mejorar de plan ». |
| 403 | plan_forbidden_write | Solicitud de escritura (POST/PATCH/DELETE) con una clave Business. Mensaje sugerido: «Esta acción requiere el plan Platinum — mejorar ». La URL de la acción se entrega en upgrade_url. |
| 400 | — | Campo ausente o inválido. Corrige el payload. |
| 404 | — | Recurso no encontrado. |
| 429 | rate_limited | Cuota horaria alcanzada (100/h Business · 500/h Platinum). El body incluye retry_after_seconds & limit_per_hour. Mensaje sugerido: «Límite de solicitudes alcanzado, reinténtalo en X minutos — ver los rate limits ». La cabecera HTTP Retry-After. |
| 500 | internal_error | Error temporal del servidor. Reinténtalo o contacta con soporte. |
{
"error": "This action requires the Platinum plan. Business API keys are read-only.",
"code": "plan_forbidden_write",
"upgrade_url": "https://propulse-ton-freelance.lovable.app/app/upgrade",
"docs_url": "https://propulse-ton-freelance.lovable.app/docs/api"
}HTTP/1.1 429 Too Many Requests
Retry-After: 3600
{
"error": "Rate limit exceeded (100/hour). Retry in a few minutes.",
"code": "rate_limited",
"retry_after_seconds": 3600,
"limit_per_hour": 100,
"docs_url": "https://propulse-ton-freelance.lovable.app/docs/api#rate-limits"
}7. Límites por endpoint (rate limits detallados)
Todas las solicitudes de la v1 comparten el mismo contador horario por cuenta (endpoint interno api_v1): 100 req/h en Business, 500 req/h en Platinum. El contador se reduce con cada solicitud autenticada, sea cual sea el verbo.
| Método | Endpoints | Business (solo lectura) | Platinum |
|---|---|---|---|
| GET | /prospects, /prospects/:id, /prospects/:id/proposals, /prospects/:id/documents, /proposals/:id, /documents, /stats | ✅ 100 req/h | ✅ 500 req/h |
| POST | /prospects, /prospects/:id/proposals, /prospects/:id/documents, /emails/generate, /whatsapp/generate | ❌ 403 plan_forbidden_write | ✅ 500 req/h |
| PATCH | /prospects/:id, /proposals/:id | ❌ 403 plan_forbidden_write | ✅ 500 req/h |
| DELETE | /prospects/:id | ❌ 403 plan_forbidden_write | ✅ 500 req/h |
HTTP/1.1 429 Too Many Requests
Retry-After: 3600
{
"error": "Rate limit exceeded (100/hour). Retry in a few minutes.",
"code": "rate_limited",
"retry_after_seconds": 3600,
"limit_per_hour": 100,
"docs_url": ".../docs/api#rate-limits"
}HTTP/1.1 403 Forbidden
{
"error": "This action requires the Platinum plan. Business API keys are read-only.",
"code": "plan_forbidden_write",
"upgrade_url": ".../app/upgrade",
"docs_url": ".../docs/api"
}- Respeta la cabecera Retry-After en lugar de reintentar de inmediato.
- Aplica un backoff exponencial (2s → 4s → 8s → …) en los errores 429 y 500.
- Agrupa las lecturas: prefiere un GET /prospects?limit=100 a 100 GET /prospects/:id.
- Cachea en el cliente las respuestas GET /stats.