Connectez vos systèmes à Plensity
Créez clients et offres depuis votre CRM, suivez l’état de chaque offre et téléchargez le PDF signé et son certificat, sans passer par l’application.
Premiers pas
- 1Dans Plensity, un administrateur va dans Paramètres → API et crée une clé. Elle ne s’affiche qu’une fois : conservez-la en lieu sûr.
- 2Chaque appel porte la clé dans l’en-tête
Authorization: Bearer pls_…. - 3Vérifiez qu’elle fonctionne avec
GET /me: la réponse donne le nom de votre entreprise et le droit de la clé.
https://app.plensity.io/api/v1Clés et droits
- Lecture seule : consulter et télécharger. Lecture et écriture : aussi créer et modifier.
- Une clé ne voit que les données de votre entreprise et agit au nom de l’administrateur qui l’a créée : les modifications sont journalisées comme « API : nom de la clé ».
- Elle cesse de fonctionner immédiatement si elle est révoquée, si son créateur n’est plus administrateur ou si l’entreprise quitte le plan Corporate.
- Plensity ne conserve pas la clé, seulement une empreinte. En cas de perte, révoquez-la et créez-en une autre.
Format
- Requêtes et réponses en JSON (
Content-Type: application/json). Les noms de champ sont en anglais. - Dates en ISO 8601. Montants en nombre, dans la devise de
currency. - Les listes se paginent avec
limit(jusqu’à 200, 50 par défaut) etoffset, et renvoient{"data": [...], "total", "limit", "offset"}. - Jusqu’à 120 appels par minute et par clé. Au-delà,
429 rate_limited: patientez un instant et réessayez.
Référence
Clients
/clientsListe les clients. Filtre avec q (nom ou secteur).
/clients/{id}Un client.
/clientsécritureCrée un client. name est obligatoire ; aussi sector, contact_name, contact_role, contact_email et contact_phone. S’il en existe déjà un avec ce nom (sans tenir compte des majuscules ni des accents), il n’est pas dupliqué : l’existant est renvoyé avec 200 et already_existed: true.
/clients/{id}écritureModifie les champs envoyés.
Offres
/proposalsListe les offres. Filtre avec status, client_id et updated_since (date ISO 8601).
/proposals/{id}Une offre avec ses services, si le client l’a ouverte (tracking), si elle est signée et par qui (signature), et les liens vers le PDF et le certificat. Chaque service indique son mode de facturation dans billing (fixed, per_day, monthly, per_unit), recurring_monthly est la redevance mensuelle et amount la valeur totale du contrat, hors taxes.
/proposalsécritureCrée le brouillon d’une offre, comme «+ Nouvelle proposition». client_id est obligatoire ; aussi title, description (ce que demande le client), deadline (AAAA-MM-JJ), owner_email (qui la suit) et template_id.
/proposals/{id}écritureChange le statut avec status (et lost_reason si perdue). Mêmes règles que dans Plensity : un brouillon ne devient pas gagné, et rien ne part sans la marge approuvée.
/proposals/{id}/pdfLe PDF. Une fois envoyée, celui qu’a reçu le client.
/proposals/{id}/signature-certificateLe certificat de signature. 404 not_signed si elle n’est pas signée.
draftgeneratedsentclient_approvedwonlostcancelledExemple
curl "https://app.plensity.io/api/v1/proposals/42" \ -H "Authorization: Bearer pls_…"
{
"id": 42,
"reference": "REF-2026-042",
"title": "Servicio gestionado 2027",
"client_id": 7,
"client_name": "Transportes Aldama",
"status": "sent",
"amount": 24900.0,
"currency": "EUR",
"sent_at": "2026-09-21T10:14:03",
"tracking": {
"opened": true,
"views": 3,
"first_opened_at": "2026-09-21T11:02:40",
"last_opened_at": "2026-09-24T08:31:12"
},
"signature": { "signed": false, "signed_at": null, "signer_name": null, "signer_email": null, "signer_company": null },
"recurring_monthly": 2075.0,
"services": [{
"name": "Servicio gestionado", "type": "managed", "price": 24900.0,
"billing": { "type": "monthly", "unit_price": 2075.0, "quantity": 12, "unit": null }
}],
"links": {
"pdf": "https://app.plensity.io/api/v1/proposals/42/pdf",
"signature_certificate": null
}
}curl -X POST "https://app.plensity.io/api/v1/proposals" \
-H "Authorization: Bearer pls_…" \
-H "Content-Type: application/json" \
-d '{"title": "Renovación 2027", "client_id": 7,
"deadline": "2027-01-31",
"owner_email": "laura@tuempresa.com"}'Erreurs
Toujours la même forme. Avec validation_failed, fields précise le problème de chaque champ.
{
"error": {
"code": "validation_failed",
"message": "…",
"fields": { "client_id": "…" }
}
}| 400 | invalid_json | Le corps n’est pas un objet JSON. |
| 400 | invalid_parameter | Un paramètre de l’URL n’est pas valide. |
| 401 | unauthorized | La clé est absente. |
| 401 | invalid_key | La clé n’existe pas ou a été révoquée. |
| 401 | key_owner_inactive | Le créateur de la clé n’est plus administrateur actif. |
| 403 | plan_required | Votre plan n’inclut pas l’API. |
| 403 | read_only_key | La clé est en lecture seule. |
| 404 | not_found | N’existe pas, ou n’est pas à votre entreprise. |
| 404 | not_signed | L’offre n’est pas signée. |
| 405 | method_not_allowed | Cette méthode n’existe pas sur cette route. |
| 409 | invalid_transition | Ce changement de statut n’est pas permis. |
| 410 | gone | N’existe plus. Les opportunités ont été retirées : tout vient des offres (<code>/proposals</code>). |
| 422 | validation_failed | Certains champs ne sont pas valides. |
| 429 | rate_limited | Trop d’appels : patientez un instant. |
| 500 | server_error | Un problème est survenu dans Plensity : réessayez dans un instant. |
Être prévenu ?
Pour savoir tout de suite qu’une offre est envoyée, change de statut ou est gagnée, sans interroger sans cesse, configurez un webhook dans Paramètres → Webhooks : Plensity appelle votre système quand cela arrive.