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
- Open Settings and find API keys under Connect apps and the API.
- Add a key and name it after where you'll use it, such as "Zapier".
- 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.
| Endpoint | GET lists | POST adds |
|---|---|---|
/properties | your properties | a property |
/contacts | your contacts | a contact |
/leases | leases; filter with propertyId, status (active, upcoming, ended) | a lease |
/payments | payments, newest first; filter with leaseId, propertyId, from, to, limit | a payment, or several |
/expenses | expenses, newest first; filter with propertyId, from, to, limit | an expense, or several |
/suppliers | your suppliers | a supplier |
/categories | your expense categories | a 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.
| Record | Required | Optional |
|---|---|---|
| Property | address, city, province, postalCode, propertyType, bedrooms, bathrooms, monthlyRent | unit, country (Canada unless given), squareFootage, yearBuilt, description |
| Contact | firstName, lastName | title, email, phone, mobile, contactType, notes, dateOfBirth |
| Lease | propertyId, startDate, rent | endDate, frequency (MONTHLY unless given, or YEARLY), deposit, tenantIds |
| Payment | leaseId, date, amount | category (RENT unless given), status (PAID unless given), notes |
| Expense | propertyId, date, amount, category, and a description or supplier | supplier, status (PENDING unless given), recurring |
| Supplier | name | type, email, phone |
| Category | name |
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.