Skip to content

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.

  1. Go to Settings → API keys and choose Create API key.
  2. Give it a name you will recognise later, such as Zapier or Website form.
  3. 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.
  4. 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 ​

PermissionAllows
contacts:read / contacts:writeRead, or also create, update and archive, contacts
leads:read / leads:writeRead pipelines and leads, or also create, move and archive leads
inventory:read / inventory:writeRead, or also create, update and archive, listings
bookings:readRead 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.

MethodPathWhat it does
GET/meThe key, its workspace and permissions
GET/contactsList contacts, most recently changed first
POST/contactsCreate 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/pipelinesList pipelines with their stages
GET/pipelines/{pipelineId}/leadsList leads in a pipeline
POST/pipelines/{pipelineId}/leadsCreate 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/listingsList listings
POST/listingsCreate 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/bookingsList 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": "…" }.

StatusMeaning
400Something in the request is missing or invalid; message says what
401The key is missing, wrong or revoked
403The key lacks a permission, or the workspace is suspended, closed or blocked for billing; reason says which
404Not found, or not in this workspace
429Too many requests; see Retry-After

Workspaces without short-term rentals get 403 from the bookings endpoints.