Appearance
Propool API
The Propool API lets your own tools read and update your workspace: Zapier or Make, a form on your website, or your own software. It covers contacts, pipelines and leads, listings and rental bookings (read only).
- Address:
https://app.propool.ai/api/public/v1 - Full reference, with every field and a "try it" button: app.propool.ai/api/public/docs
- AI assistants such as Claude and ChatGPT use the same API through a connector: see Connect AI assistants.
- To be told when something happens, use webhooks instead of checking the API over and over.
Create an API key
Only admins can create keys.
- Go to Settings → API keys and choose Create API key.
- Give it a name you will recognise later, such as Zapier or Website form.
- Choose what it may do with Contacts, Leads, Listings and Rental reservations: No access, Read or Read & write. Reservations are read only through the API.
- Copy the key. It starts with
ppk_and is shown only once. If you lose it, revoke it and create a new one.
A key acts as the admin who created it: everything it changes shows in the history under that admin's name, with the same rules as the app (duplicate checks, plan limits, pipeline stages). It stops working if that admin is removed or loses admin access. A workspace can have up to 25 active keys.
Give each tool its own key
Then you can see which tool did what, and revoke one without breaking the others. Grant only the permissions each tool needs.
Your first request
Send the key on every request in the Authorization header:
sh
curl https://app.propool.ai/api/public/v1/me \
-H "Authorization: Bearer ppk_your_key"/me answers with the key, its workspace and its permissions, so it is a good way to check a key works. X-API-Key: ppk_… also works if your tool cannot set an Authorization header.
Permissions
| Permission | Allows |
|---|---|
contacts:read / contacts:write | Read, or also create, update and archive, contacts |
leads:read / leads:write | Read pipelines and leads, or also create, move and archive leads |
inventory:read / inventory:write | Read, or also create, update and archive, listings |
bookings:read | Read rental bookings |
A :write permission includes the matching :read. Calling something the key isn't allowed to answers 403 with reason: insufficient_scope.
Endpoints
All paths start with /api/public/v1.
| Method | Path | What it does |
|---|---|---|
GET | /me | The key, its workspace and permissions |
GET | /contacts | List contacts, most recently changed first |
POST | /contacts | Create a contact (needs a phone, email, Instagram or Telegram handle) |
GET | /contacts/{id} | Get one contact |
PATCH | /contacts/{id} | Update a contact; only the fields you send change |
DELETE | /contacts/{id} | Archive a contact |
GET | /pipelines | List pipelines with their stages |
GET | /pipelines/{pipelineId}/leads | List leads in a pipeline |
POST | /pipelines/{pipelineId}/leads | Create a lead for an existing contact |
GET | /pipelines/{pipelineId}/leads/{leadId} | Get one lead |
PATCH | /pipelines/{pipelineId}/leads/{leadId} | Move a lead to another stage, reassign it or change its details |
DELETE | /pipelines/{pipelineId}/leads/{leadId} | Archive a lead |
GET | /listings | List listings |
POST | /listings | Create a listing |
GET | /listings/{id} | Get one listing |
PATCH | /listings/{id} | Update a listing; only the fields you send change |
DELETE | /listings/{id} | Archive a listing |
GET | /bookings | List rental bookings, newest first |
GET | /bookings/{id} | Get one booking with guest, rooms and amounts |
The full reference lists every field, which are required, and example responses.
Filters
- Contacts:
search,status(active,archived,all) - Leads:
search,stageId,assignedToUserId,archived - Listings:
search,view(active,archived,draft) - Bookings:
listingId,status(confirmed,cancelled),arrivalFrom,arrivalTo
Things to know
Nothing is deleted. DELETE archives the record, and it can be restored in the app.
Adding a lead takes two steps. A lead belongs to a contact, so find the contact first (GET /contacts?search=) or create it (POST /contacts), then create the lead with its contactId. Call GET /pipelines once to get the pipeline and stage IDs. The lead type's own required fields still apply; a buyer, for example, needs a budget and timeline. Moving a lead to a Lost stage may require a lost reason.
Updating a listing needs its version. Send the version you last read. If someone changed the listing since, you get a VERSION_CONFLICT error: read it again and reapply your change.
Unknown fields are rejected. Sending a field the API doesn't know answers 400, so typos don't fail silently.
Pages and limits
Lists answer with { data, meta: { page, limit, total, totalPages } }; pass page and limit for the next page. Bookings page with a cursor instead: pass the nextCursor from one response as cursor in the next.
Each key can make 120 requests a minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit answers 429 with a Retry-After header: wait that many seconds and try again.
Errors
Errors look like { "statusCode": 403, "message": "…", "reason": "…" }.
| Status | Meaning |
|---|---|
400 | Something in the request is missing or invalid; message says what |
401 | The key is missing, wrong or revoked |
403 | The key lacks a permission, or the workspace is suspended, closed or blocked for billing; reason says which |
404 | Not found, or not in this workspace |
429 | Too many requests; see Retry-After |
Workspaces without short-term rentals get 403 from the bookings endpoints.