1. Access by plan
- • GET prospects, proposals, quotes/invoices, stats
- • 100 requests/hour
- • Any POST / PATCH / DELETE request returns 403
- • Everything in Business + create / update / delete
- • Prospects, proposals, quotes/invoices, AI, bookings
- • 500 requests/hour
2. Authentication
Every request must include a Bearer token in the Authorization.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects
Generate your key from Settings → API keys.
3. Endpoints
/prospectsBusiness + PlatinumList prospects (filters: 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 + PlatinumProspect details.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalsBusiness + PlatinumCommercial offers for a prospect.
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID/proposals
/documentsBusiness + PlatinumList quotes/invoices (filters: type, status).
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/documents?type=invoice&status=paid
/statsBusiness + PlatinumStatistics (period=month|quarter|year).
curl -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/stats?period=month
/prospectsPlatinum onlyCreate a prospect. Platinum plan only.
{ "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}Platinum onlyUpdate a prospect. Platinum plan only.
{ "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}Platinum onlyDelete a prospect. Platinum plan only.
curl -X DELETE -H "Authorization: Bearer sk_live_xxx" \ https://propulse-ton-freelance.lovable.app/api/public/v1/prospects/PROSPECT_ID
/prospects/{id}/proposalsPlatinum onlyCreate an offer. Platinum plan only.
{ "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}Platinum onlyUpdate an offer. Platinum plan only.
{ "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}/documentsPlatinum onlyCreate a quote or an invoice. Platinum plan only.
{ "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/generatePlatinum onlyGenerate a personalised AI email. Platinum plan only.
{ "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/generatePlatinum onlyGenerate an AI WhatsApp message. Platinum plan only.
{ "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. cURL examples by plan
Pick the section matching your plan. Write requests made with a Business key return a 403 plan_forbidden_write.
Business examples (read-only)
/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
Platinum examples (read + write)
/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. Code examples
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. Error codes & actionable messages
Every error returns a structured JSON payload: { error, code, upgrade_url?, docs_url?, retry_after_seconds?, limit_per_hour? }. code — to display a translated message and offer the matching action to the user.
| HTTP | code | Meaning & recommended action |
|---|---|---|
| 401 | invalid_key | Invalid or revoked API key. Generate a new key in Settings → API keys. |
| 403 | plan_no_api_access | The plan does not include API access. Suggested message: “This action requires a Business or Platinum plan — upgrade your plan ». |
| 403 | plan_forbidden_write | Write request (POST/PATCH/DELETE) from a Business key. Suggested message: “This action requires the Platinum plan — upgrade ». The action URL is provided in upgrade_url. |
| 400 | — | Missing or invalid field. Fix the payload. |
| 404 | — | Resource not found. |
| 429 | rate_limited | Hourly quota reached (100/h Business · 500/h Platinum). The body includes retry_after_seconds & limit_per_hour. Suggested message: “Rate limit reached, retry in X minutes — see rate limits ». The HTTP header Retry-After. |
| 500 | internal_error | Temporary server error. Retry or contact support. |
{
"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. Per-endpoint limits (detailed rate limits)
All v1 requests share the same hourly counter per account (internal endpoint api_v1): 100 req/h on Business, 500 req/h on Platinum. The counter is decremented by every authenticated request, whatever the verb.
| Method | Endpoints | Business (read-only) | 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"
}- Honour the Retry-After header instead of retrying immediately.
- Apply exponential backoff (2s → 4s → 8s → …) on 429 and 500 errors.
- Batch reads: prefer one GET /prospects?limit=100 over 100 GET /prospects/:id.
- Cache GET /stats responses client-side.