Skip to content

GatherDwell API

Read, add, and delete your properties, contacts, leases, payments, expenses, suppliers, and expense categories from your own scripts and tools.

Base address
https://www.gatherdwell.ca/api/v1
OpenAPI description
https://www.gatherdwell.ca/api/v1/openapi.jsonImport it into Postman, Insomnia, or another API client.
Connecting AI apps instead?
Add GatherDwell to Claude or ChatGPT as a connector at https://www.gatherdwell.ca/mcp and sign in with your account.

Create an API Key

  1. Open Settings and find API keys under Connect apps and the API.
  2. Add a key and name it after where you'll use it, such as "Zapier".
  3. Copy the key. It's shown only once.

Send the key with every request:

Authorization: Bearer YOUR_API_KEY

Anyone with the key can read, add to, and delete your data. Keep it secret, and revoke it in Settings if it leaks.

Endpoints

All endpoints are under https://www.gatherdwell.ca/api/v1, and requests and responses are JSON.

EndpointGET listsPOST adds
/propertiesyour propertiesa property
/contactsyour contactsa contact
/leasesleases; filter with propertyId, status (active, upcoming, ended)a lease
/paymentspayments, newest first; filter with leaseId, propertyId, from, to, limita payment, or several
/expensesexpenses, newest first; filter with propertyId, from, to, limitan expense, or several
/suppliersyour suppliersa supplier
/categoriesyour expense categoriesa category

Lists come back as { "data": [...] }. Payments and expenses return 100 at a time by default (limit goes up to 1,000) and include "hasMore": true when there are more.

To delete a record, send DELETE to its address with its id, for example DELETE /api/v1/expenses/EXPENSE_ID. It answers 204 once deleted. Deleting can't be undone, and it works like the delete buttons in the app:

  • Deleting a property also deletes its leases, payments, and expenses.
  • Deleting a lease also deletes its payments.
  • Deleting a contact removes them from their leases, but the leases stay.
  • Deleting a supplier or category leaves existing expenses as they are.

Adding Several at Once

To add several payments or expenses, send a JSON array of up to 100 to /payments or /expenses. It's all or nothing: every row is checked first, and if any has a problem, nothing is saved and the answer lists each row's problems by row number. Otherwise every row is saved and returned, with its new id.

Examples

List your properties:

curl https://www.gatherdwell.ca/api/v1/properties \
  -H "Authorization: Bearer YOUR_API_KEY"

Record a rent payment on a lease:

curl -X POST https://www.gatherdwell.ca/api/v1/payments \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"leaseId": "LEASE_ID", "date": "2026-10-01", "amount": 1650}'

Add two expenses, one paid to a supplier:

curl -X POST https://www.gatherdwell.ca/api/v1/expenses \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[{"propertyId": "PROPERTY_ID", "date": "2026-01-31", "amount": 310, "category": "Property Management", "supplier": "One Key Property Management", "description": "Fees - Jan 2026"},
       {"propertyId": "PROPERTY_ID", "date": "2026-01-15", "amount": 88.50, "category": "Utilities", "description": "Hydro"}]'

Delete an expense:

curl -X DELETE https://www.gatherdwell.ca/api/v1/expenses/EXPENSE_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Fields

Dates are written YYYY-MM-DD, and amounts are numbers in dollars.

RecordRequiredOptional
Propertyaddress, city, province, postalCode, propertyType, bedrooms, bathrooms, monthlyRentunit, country (Canada unless given), squareFootage, yearBuilt, description
ContactfirstName, lastNametitle, email, phone, mobile, contactType, notes, dateOfBirth
LeasepropertyId, startDate, rentendDate, frequency (MONTHLY unless given, or YEARLY), deposit, tenantIds
PaymentleaseId, date, amountcategory (RENT unless given), status (PAID unless given), notes
ExpensepropertyId, date, amount, category, and a description or suppliersupplier, status (PENDING unless given), recurring
Suppliernametype, email, phone
Categoryname

propertyType is one of SINGLE_FAMILY, MULTI_UNIT, APARTMENT, CONDO, or TOWNHOUSE. Payment categories are RENT, DEPOSIT, MORTGAGE, INTEREST, HOA, PROPERTY_MANAGEMENT, WATER, and OTHER, and statuses are PAID, PENDING, and OVERDUE. Get ids from the lists: a lease's tenantIds are contact ids.

An expense's supplier must be one of your suppliers. It's saved the way the expense form saves it, as "Supplier - description". A supplier's type is one of the types on the Suppliers page, such as Plumber or Property Manager. Supplier and category names must be new to your account, whatever the capitalization.

Records added through the API go through the same checks as GatherDwell's forms.

OpenAPI

A machine-readable description of the API (OpenAPI 3.1) is at https://www.gatherdwell.ca/api/v1/openapi.json. Import it into Postman, Insomnia, or another API client to get every request ready to use. Automation tools that accept OpenAPI can use it too.

Errors

A failed request returns a status code and a JSON message:

{ "error": "Start date is required", "issues": [{ "field": "startDate", "message": "Start date is required" }] }
  • 400: something in the request is missing or invalid.
  • 401: the API key is missing, revoked, or wrong.
  • 404: the record doesn't exist in your account.

When adding several at once, a 400 lists every row with problems: { "error": "Nothing was saved: 2 rows have problems", "rows": [{ "row": 3, "issues": [...] }] }.

New to GatherDwell? Create a free account, then create an API key in Settings.