Integrations & API Connect Apartment Building Management Software to Zapier, Make, n8n, or any custom system
Apartment Building Management Software has two integration methods that work together:
Apartment Building Management Software pushes data to you the moment something happens. A payment is recorded, a work order is created, a lease expires — Apartment Building Management Software instantly sends a POST request to your URL.
You send data to Apartment Building Management Software on demand. Create tenants, open work orders, record payments — all from external systems using a simple API call.
Authentication
All API requests must include your API key as a Bearer token in the Authorization header.
Authorization: Bearer pm_your_api_key_here # Example with curl: curl -X POST https://yourdomain.com/api/action_create_tenant.php \ -H "Authorization: Bearer pm_abc123..." \ -H "Content-Type: application/json" \ -d '{"email":"tenant@example.com","first_name":"Jane","last_name":"Smith"}'
Generating an API key
In your Apartment Building Management Software dashboard, navigate to Settings in the sidebar, then API Keys.
Give the key a descriptive name — e.g. "Zapier", "Make", "My app". Click Generate key.
The full key is only shown once. Copy it now and store it somewhere safe — like a password manager. If you lose it, revoke it and generate a new one.
Quick start — 5 minutes to your first integration
Option A — Zapier (no code)
Go to zapier.com and sign up free.
Zapier gives you a unique URL like https://hooks.zapier.com/hooks/catch/123456/abcdef/
Choose an event (e.g. payment.succeeded), paste the Zapier URL, click Create.
Record a test payment. Apartment Building Management Software sends the data to Zapier instantly.
Map the Apartment Building Management Software fields to whatever you want — Google Sheets row, Slack message, email, CRM record.
Option B — curl / code
# Test the API in 30 seconds: curl -X POST https://yourdomain.com/api/action_create_tenant.php \ -H "Authorization: Bearer pm_your_key" \ -H "Content-Type: application/json" \ -d '{ "email": "jane@example.com", "first_name": "Jane", "last_name": "Smith", "phone": "+1555000000" }'
Webhooks — overview
A webhook is an HTTP POST request that Apartment Building Management Software sends to a URL you specify, the instant an event occurs. Your URL receives the request, reads the data, and acts on it — all within seconds of the event happening in Apartment Building Management Software.
How the flow works
Apartment Building Management Software makes up to 5 delivery attempts with exponential backoff if your server is down or returns an error. Failed and retried deliveries are visible in Settings → Integrations → Recent deliveries.
Setting up a webhook
In Zapier: Webhooks by Zapier → Catch Hook → copy the URL.
In Make: Webhooks → Custom webhook → copy the URL.
Custom server: use any URL that accepts POST requests.
Click the Integrations link in your sidebar under Settings.
Select from the event dropdown, paste your target URL, optionally add a signing secret for security verification, click Create subscription.
Perform the action in Apartment Building Management Software (record a payment, create a work order) and check your tool received the data.
All webhook events
| Event | Fires when | Key data fields |
|---|---|---|
| payment.succeeded | A payment is successfully recorded (Stripe or manual) | id, tenant_id, amount, method, created_at |
| payment.failed | A Stripe payment attempt fails | id, tenant_id, amount, error |
| work_order.created | A maintenance request is opened (by tenant or manager) | id, unit_id, title, priority, reported_by |
| work_order.updated | A work order is edited or its status changes | id, unit_id, title, status, priority |
| work_order.completed | A work order status is set to completed | id, unit_id, title, completed_at |
| tenant.created | A tenant user is invited or created | id, email, first_name, last_name |
| lease.created | A new lease is drafted | id, unit_id, tenant_id, start_date, end_date, monthly_rent |
| lease.expiring_soon | A lease enters the renewal alert window (default: 60 days before end) | id, tenant_id, end_date, days_remaining |
| inspection.completed | An inspection is marked as completed | id, property_id, unit_id, completed_at |
| document.uploaded | A document is uploaded to any record | id, title, scope, scope_id |
| broadcast.sent | A mass message or announcement is sent | id, channel, audience, recipients |
Payload format
Every webhook POST request has the same envelope structure. The data object contains event-specific fields.
{
"event": "payment.succeeded",
"id": "evt_1715261400_42", // unique event ID
"fired_at": "2025-05-09T14:30:00Z", // ISO 8601 UTC
"data": {
"id": 42,
"tenant_id": 7,
"amount": 1800.00,
"method": "stripe_card",
"created_at": "2025-05-09T14:30:00Z"
}
}
The request also includes these HTTP headers:
| Header | Value |
|---|---|
Content-Type | application/json |
X-PM-Event | The event name, e.g. payment.succeeded |
X-PM-Delivery | Unique delivery ID for this attempt |
X-PM-Signature | HMAC-SHA256 signature (if signing secret is set) |
Verifying webhook signatures
When you add a signing secret to a subscription, Apartment Building Management Software signs every request body with HMAC-SHA256. You can verify this signature on your server to confirm the request really came from Apartment Building Management Software and wasn't faked by someone who found your URL.
How to verify
Compute HMAC-SHA256(raw_body, your_secret) and compare it to the X-PM-Signature header value.
// PHP verification example $secret = 'your_signing_secret'; $raw_body = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_PM_SIGNATURE'] ?? ''; $expected = 'sha256=' . hash_hmac('sha256', $raw_body, $secret); if (!hash_equals($expected, $signature)) { http_response_code(403); die('Invalid signature'); } // Signature is valid — process the webhook $event = json_decode($raw_body, true); echo 'Received: ' . $event['event'];
// Node.js verification example const crypto = require('crypto'); app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => { const secret = 'your_signing_secret'; const signature = req.headers['x-pm-signature'] || ''; const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(req.body) .digest('hex'); if (!crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) )) { return res.status(403).send('Invalid signature'); } const event = JSON.parse(req.body); console.log('Received:', event.event); res.status(200).send('OK'); });
# Python / Flask verification example import hmac, hashlib from flask import request, abort SECRET = 'your_signing_secret' @app.route('/webhook', methods=['POST']) def webhook(): signature = request.headers.get('X-PM-Signature', '') expected = 'sha256=' + hmac.new( SECRET.encode(), request.data, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, signature): abort(403) event = request.json print(f"Received: {event['event']}") return 'OK', 200
hash_equals, timingSafeEqual, compare_digest) — never regular string comparison — to prevent timing attacks.
Retry behavior
If your server is unavailable or returns a non-2xx response, Apartment Building Management Software retries the delivery automatically:
| Attempt | Delay |
|---|---|
| 1st | Immediate |
| 2nd | 5 minutes |
| 3rd | 30 minutes |
| 4th | 2 hours |
| 5th | 6 hours |
After 5 failed attempts the delivery is marked as failed. You can see all delivery history in Settings → Integrations → Recent deliveries.
REST API — overview
The API lets external systems perform actions inside Apartment Building Management Software. All endpoints accept application/json and return JSON responses.
.php extension. Call /api/action_create_tenant.php — not /api/action_create_tenant. There is no extension-less rewrite, so the short form returns 404.
| Endpoint | Method | Action |
|---|---|---|
/api/action_create_tenant.php | POST | Invite a new tenant |
/api/action_create_work_order.php | POST | Open a maintenance request |
/api/action_record_payment.php | POST | Record a manual payment |
/api/action_send_message.php | POST | Send a broadcast message |
/api/action_create_charge.php | POST | Add a charge to a tenant |
/api/trigger_poll.php | GET | Polling trigger for Zapier |
/api/triggers.php | GET | List available webhook events |
/api/subscribe.php | POST | Subscribe a URL to an event |
/api/unsubscribe.php | POST | Remove a subscription |
Response format
On success, each endpoint returns its result under a named key — there is no ok/data wrapper. The key differs per endpoint (tenant, charge, work_order, payment, broadcast_id, etc.).
// Success — HTTP 200 (key name varies by endpoint) { "tenant": { ...resource fields... } } // Validation / processing error — HTTP 400 { "error": "A human-readable error message" } // Auth error — HTTP 401 { "error": "unauthorized", "message": "Missing or invalid Bearer token" }
Create tenant — POST /api/action_create_tenant.php
Invites a new tenant. Apartment Building Management Software creates the user and sends them an email with a link to activate their portal and set a password.
Request body
# Request curl -X POST https://yourdomain.com/api/action_create_tenant.php \ -H "Authorization: Bearer pm_your_key" \ -H "Content-Type: application/json" \ -d '{ "email": "jane@example.com", "first_name": "Jane", "last_name": "Smith", "phone": "+1555000000" }' # Response — HTTP 200 { "tenant": { "id": 24, "email": "jane@example.com", "first_name": "Jane", "last_name": "Smith", "role": "tenant", "status": "invited", "accept_url": "https://yourdomain.com/accept-invite.php?token=…" } }
Create work order — POST /api/action_create_work_order.php
Opens a new maintenance request.
Request body
low | normal | high | emergency Optional, default: normal# Request { "title": "Kitchen tap dripping", "description": "Cold tap has been dripping for 2 days.", "property_id": 3, "unit_id": 12, "priority": "high", "category": "plumbing" } # Response — HTTP 200 { "work_order": { "id": 88, "title": "Kitchen tap dripping", "status": "open", ... } }
Record payment — POST /api/action_record_payment.php
Records a manual (cash / cheque / transfer) payment against a tenant.
Request body
cash, check, bank_transfer Optional, default: manual# Request { "tenant_id": 7, "amount": 1800.00, "method": "bank_transfer", "reference": "TXN-99812" } # Response — HTTP 200 { "payment": { "id": 42, "tenant_id": 7, "amount": 1800.00, "method": "bank_transfer", ... } }
Send message — POST /api/action_send_message.php
Request body
all_tenants | property_tenants | vendors | staff Optional, default: all_tenantsemail | sms | both Optional, default: emailproperty_tenants Conditional# Response — HTTP 200 { "broadcast_id": 17 }
Create charge — POST /api/action_create_charge.php
Request body
2025-06-01 Requiredrent | utility | late_fee | other Optional, default: other# Request { "tenant_id": 7, "amount": 75.00, "description": "Late fee — May rent", "due_date": "2025-06-01", "category": "late_fee" } # Response — HTTP 200 { "charge": { "id": 131, "tenant_id": 7, "amount": 75.00, "status": "open", ... } }
Polling trigger — GET /api/trigger_poll.php
Used for Zapier polling triggers. Returns recent events since the last poll. Zapier calls this endpoint every few minutes and checks for new items. Supported event values: tenant.created, payment.succeeded, work_order.created, work_order.completed.
# Zapier calls this automatically — no manual setup needed GET /api/trigger_poll.php?event=payment.succeeded&since=2025-05-09T14:00:00Z Authorization: Bearer pm_your_key # Response — HTTP 200 { "event": "payment.succeeded", "since": "2025-05-09T14:00:00Z", "count": 2, "results": [ ...recent rows... ] }
Zapier integration
Zapier connects Apartment Building Management Software to 6,000+ apps — Google Sheets, Slack, Gmail, HubSpot, QuickBooks, WhatsApp, and more. No coding required.
Trigger: receive data from Apartment Building Management Software
Choose trigger event: Catch Hook
It looks like: https://hooks.zapier.com/hooks/catch/1234567/abcdefg/
Paste the Zapier URL, choose your event, click Create.
Trigger the event in Apartment Building Management Software. Zapier catches it and shows you the data fields to map.
Action: send data to Apartment Building Management Software from Zapier
https://yourdomain.com/api/action_create_tenant.php (or any endpoint)
Authorization = Bearer pm_your_api_key
Make (Integromat)
Make uses a visual scenario builder. Use the Webhooks module to receive data from Apartment Building Management Software and the HTTP → Make a request module to call Apartment Building Management Software's API.
Receiving webhooks in Make
Make gives you a URL like https://hook.eu1.make.com/xxxx
Paste the Make URL and choose your event.
Trigger the event in Apartment Building Management Software. Make parses the payload and creates the data structure automatically.
n8n
n8n is an open-source automation tool you can self-host. Use the Webhook node to receive and the HTTP Request node to send.
# n8n HTTP Request node settings for Apartment Building Management Software API:
Method: POST
URL: https://yourdomain.com/api/action_create_tenant.php
Auth: Header Auth
Name: Authorization
Value: Bearer pm_your_key_here
Custom server / curl
Any server that can receive HTTP POST requests can be a webhook endpoint. Your endpoint just needs to:
- Accept POST requests
- Return HTTP 200 within 10 seconds
- Optionally verify the
X-PM-Signatureheader
# Complete example — receive and process a webhook in PHP $secret = 'your_signing_secret'; $body = file_get_contents('php://input'); $sig = $_SERVER['HTTP_X_PM_SIGNATURE'] ?? ''; $expected = 'sha256=' . hash_hmac('sha256', $body, $secret); if (!hash_equals($expected, $sig)) { http_response_code(403); exit; } $event = json_decode($body, true); switch ($event['event']) { case 'payment.succeeded': // Add row to your accounting system record_payment($event['data']); break; case 'work_order.created': // Send SMS to maintenance team send_sms($event['data']['title']); break; } http_response_code(200); echo 'OK';
Example: Payments → Google Sheets
Log every rent payment to a Google Sheet automatically for bookkeeping.
Copy the URL Zapier gives you.
payment.succeeded
Settings → Integrations → event: payment.succeeded → paste URL → Create.
Zapier catches it. You'll see fields like amount, tenant_id, method, created_at.
Map: Amount → amount, Method → method, Date → created_at, Tenant → tenant_id.
Every payment now appears in your spreadsheet within seconds.
Example: Work orders → Slack
Get a Slack notification every time an emergency maintenance request is created.
work_order.created
Only continue if priority equals emergency.
Message: 🚨 Emergency: {{title}} at unit {{unit_id}}
Example: Tenants → CRM
When a tenant is added to Apartment Building Management Software, automatically create a contact in HubSpot or any CRM.
tenant.created
Map: Email → email, First name → first_name, Last name → last_name.
Apartment Building Management Software · Integration & API Documentation