API · Plan Corporate

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

  1. 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.
  2. 2Chaque appel porte la clé dans l’en-tête Authorization: Bearer pls_….
  3. 3Vérifiez qu’elle fonctionne avec GET /me : la réponse donne le nom de votre entreprise et le droit de la clé.
Adresse de base
https://app.plensity.io/api/v1

Clé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) et offset, 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

GET/me

Clients

GET/clients

Liste les clients. Filtre avec q (nom ou secteur).

GET/clients/{id}

Un client.

POST/clientsécriture

Cré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.

PATCH/clients/{id}écriture

Modifie les champs envoyés.

Offres

GET/proposals

Liste les offres. Filtre avec status, client_id et updated_since (date ISO 8601).

GET/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.

POST/proposalsécriture

Cré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.

PATCH/proposals/{id}écriture

Change 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.

GET/proposals/{id}/pdf

Le PDF. Une fois envoyée, celui qu’a reçu le client.

GET/proposals/{id}/signature-certificate

Le certificat de signature. 404 not_signed si elle n’est pas signée.

Statuts d’offre
draftgeneratedsentclient_approvedwonlostcancelled

Exemple

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": "…" }
  }
}
400invalid_jsonLe corps n’est pas un objet JSON.
400invalid_parameterUn paramètre de l’URL n’est pas valide.
401unauthorizedLa clé est absente.
401invalid_keyLa clé n’existe pas ou a été révoquée.
401key_owner_inactiveLe créateur de la clé n’est plus administrateur actif.
403plan_requiredVotre plan n’inclut pas l’API.
403read_only_keyLa clé est en lecture seule.
404not_foundN’existe pas, ou n’est pas à votre entreprise.
404not_signedL’offre n’est pas signée.
405method_not_allowedCette méthode n’existe pas sur cette route.
409invalid_transitionCe changement de statut n’est pas permis.
410goneN’existe plus. Les opportunités ont été retirées : tout vient des offres (<code>/proposals</code>).
422validation_failedCertains champs ne sont pas valides.
429rate_limitedTrop d’appels : patientez un instant.
500server_errorUn 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.

Écrivez-nous pour Corporate
← Retour à l'accueil