Connect your systems to Plensity
Create clients and proposals from your CRM, track where every proposal stands and download the signed PDF and its certificate, without opening the app.
Getting started
- 1In Plensity, an admin goes to Settings → API and creates a key. It is shown only once: store it somewhere safe.
- 2Every call carries the key in the header
Authorization: Bearer pls_…. - 3Check it works with
GET /me: it returns your company name and the key’s access level.
https://app.plensity.io/api/v1Keys and access
- Read only: query and download. Read and write: also create and update.
- A key only sees your company’s data and acts on behalf of the admin who created it: changes are logged in the audit trail as “API: key name”.
- It stops working immediately if it is revoked, if its creator is no longer an admin, or if the company leaves the Corporate plan.
- Plensity does not store the key, only a fingerprint. If it is lost, revoke it and create a new one.
Format
- JSON requests and responses (
Content-Type: application/json). - Dates in ISO 8601. Amounts as numbers, in the
currencygiven. - Lists are paginated with
limit(up to 200, default 50) andoffset, and return{"data": [...], "total", "limit", "offset"}. - Up to 120 calls per minute per key. Beyond that,
429 rate_limited: wait a moment and retry.
Reference
Clients
/clientsList clients. Filter with q (name or sector).
/clients/{id}One client.
/clientswriteCreate a client. name is required; also sector, contact_name, contact_role, contact_email and contact_phone. If one with that name already exists (ignoring case and accents), it is not duplicated: the existing one is returned with 200 and already_existed: true.
/clients/{id}writeUpdate the fields you send.
Proposals
/proposalsList proposals. Filter with status, client_id and updated_since (ISO 8601 date).
/proposals/{id}One proposal with its services, whether the client opened it (tracking), whether and by whom it was signed (signature), and links to the PDF and the certificate. Each service says how it is charged in billing (fixed, per_day, monthly, per_unit), recurring_monthly is the monthly fee and amount is the full contract value, before tax.
/proposalswriteCreate a draft proposal, like «+ New proposal». client_id is required; also title, description (what the client asks for), deadline (YYYY-MM-DD), owner_email (who handles it) and template_id.
/proposals/{id}writeChange the status with status (and lost_reason when lost). Same rules as in Plensity: a draft cannot become won, and nothing goes out without the approved margin.
/proposals/{id}/pdfThe PDF. Once sent, the one the client received.
/proposals/{id}/signature-certificateThe signature certificate. 404 not_signed if it is not signed.
draftgeneratedsentclient_approvedwonlostcancelledExample
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"}'Errors
Always the same shape. With validation_failed, fields explains what is wrong with each field.
{
"error": {
"code": "validation_failed",
"message": "…",
"fields": { "client_id": "…" }
}
}| 400 | invalid_json | The body is not a JSON object. |
| 400 | invalid_parameter | A URL parameter is not valid. |
| 401 | unauthorized | The key is missing. |
| 401 | invalid_key | The key does not exist or was revoked. |
| 401 | key_owner_inactive | The key’s creator is no longer an active admin. |
| 403 | plan_required | Your plan does not include the API. |
| 403 | read_only_key | The key is read only. |
| 404 | not_found | It does not exist, or it is not your company’s. |
| 404 | not_signed | The proposal is not signed. |
| 405 | method_not_allowed | That method does not exist on that route. |
| 409 | invalid_transition | That status change is not allowed. |
| 410 | gone | No longer exists. Opportunities were removed: everything comes from proposals (<code>/proposals</code>). |
| 422 | validation_failed | Some fields are not valid. |
| 429 | rate_limited | Too many calls: wait a moment. |
| 500 | server_error | Something went wrong in Plensity: retry in a moment. |
Want to be notified?
To know right away when a proposal is sent, changes status or is won, without polling, set up a webhook in Settings → Webhooks: Plensity calls your system when it happens.