API v1

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:

📤
Webhooks

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.

📥
REST API

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.

💡 No coding required for most use cases. Zapier and Make can connect Apartment Building Management Software to 6,000+ apps — Google Sheets, Slack, WhatsApp, QuickBooks, HubSpot, and more — with a visual drag-and-drop builder.

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

1
Go to Settings → API Keys

In your Apartment Building Management Software dashboard, navigate to Settings in the sidebar, then API Keys.

2
Enter a name and click Generate

Give the key a descriptive name — e.g. "Zapier", "Make", "My app". Click Generate key.

3
Copy the key immediately

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.

⚠️ Treat API keys like passwords. Never expose them in client-side code (HTML/JavaScript), never commit them to GitHub, and never share them publicly. If a key is compromised, revoke it immediately from Settings → API Keys.

Quick start — 5 minutes to your first integration

Option A — Zapier (no code)

1
Create a Zapier account

Go to zapier.com and sign up free.

2
Create a new Zap → Trigger: Webhooks by Zapier → Catch Hook

Zapier gives you a unique URL like https://hooks.zapier.com/hooks/catch/123456/abcdef/

3
In Apartment Building Management Software → Settings → Integrations → Subscribe

Choose an event (e.g. payment.succeeded), paste the Zapier URL, click Create.

4
Trigger the event in Apartment Building Management Software

Record a test payment. Apartment Building Management Software sends the data to Zapier instantly.

5
Build your action in Zapier

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
event fires →
POST /your-url
→ delivered to →
Zapier / Make / Your server
→ triggers →
Your action

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

1
Get a target URL from your tool

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.

2
Go to Settings → Integrations in Apartment Building Management Software

Click the Integrations link in your sidebar under Settings.

3
Choose an event and paste your URL

Select from the event dropdown, paste your target URL, optionally add a signing secret for security verification, click Create subscription.

4
Trigger the event to test

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

EventFires whenKey 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:

HeaderValue
Content-Typeapplication/json
X-PM-EventThe event name, e.g. payment.succeeded
X-PM-DeliveryUnique delivery ID for this attempt
X-PM-SignatureHMAC-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
💡 Always use constant-time comparison (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:

AttemptDelay
1stImmediate
2nd5 minutes
3rd30 minutes
4th2 hours
5th6 hours

After 5 failed attempts the delivery is marked as failed. You can see all delivery history in Settings → Integrations → Recent deliveries.

💡 Your endpoint should return HTTP 200 as quickly as possible — ideally before doing any processing. If processing takes time, queue the work and return 200 immediately.

REST API — overview

The API lets external systems perform actions inside Apartment Building Management Software. All endpoints accept application/json and return JSON responses.

⚠️ Endpoints must include the .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.
EndpointMethodAction
/api/action_create_tenant.phpPOSTInvite a new tenant
/api/action_create_work_order.phpPOSTOpen a maintenance request
/api/action_record_payment.phpPOSTRecord a manual payment
/api/action_send_message.phpPOSTSend a broadcast message
/api/action_create_charge.phpPOSTAdd a charge to a tenant
/api/trigger_poll.phpGETPolling trigger for Zapier
/api/triggers.phpGETList available webhook events
/api/subscribe.phpPOSTSubscribe a URL to an event
/api/unsubscribe.phpPOSTRemove 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

emailstringTenant email address Required
first_namestringFirst name Required
last_namestringLast name Required
phonestringPhone number Optional
# 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

titlestringShort description of the issue Required
descriptionstringFull details of the issue Required
property_idintegerProperty ID from Apartment Building Management Software Required
unit_idintegerUnit ID (if the issue is unit-specific) Optional
prioritystringlow | normal | high | emergency Optional, default: normal
categorystringe.g. plumbing, electrical, hvac Optional
# 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

tenant_idintegerTenant user ID Required
amountnumberPayment amount in your currency Required
methodstringFree-text label, e.g. cash, check, bank_transfer Optional, default: manual
referencestringReceipt number, cheque number etc. Optional
charge_idintegerApply to a specific charge. Leave blank to apply oldest-first. Optional
notesstringInternal note saved with the payment Optional
# 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

subjectstringEmail subject line Required
bodystringMessage body text Required
audiencestringall_tenants | property_tenants | vendors | staff Optional, default: all_tenants
channelstringemail | sms | both Optional, default: email
property_idintegerRequired when audience is property_tenants Conditional
# Response — HTTP 200
{
  "broadcast_id": 17
}

Create charge — POST /api/action_create_charge.php

Request body

tenant_idintegerTenant user ID Required
amountnumberCharge amount Required
descriptionstringWhat the charge is for Required
due_datestringISO date e.g. 2025-06-01 Required
categorystringe.g. rent | utility | late_fee | other Optional, default: other
lease_idintegerLink the charge to a specific lease Optional
# 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

1
Create a Zap → Search for "Webhooks by Zapier"

Choose trigger event: Catch Hook

2
Copy the webhook URL Zapier gives you

It looks like: https://hooks.zapier.com/hooks/catch/1234567/abcdefg/

3
In Apartment Building Management Software → Settings → Integrations → Subscribe

Paste the Zapier URL, choose your event, click Create.

4
In Zapier → click "Test trigger"

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

1
Add an action step → "Webhooks by Zapier" → POST
2
URL: https://yourdomain.com/api/action_create_tenant.php (or any endpoint)
3
Headers: Add Authorization = Bearer pm_your_api_key
4
Data: Map fields from your trigger to the Apartment Building Management Software API fields

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

1
Add a Webhooks → Custom webhook module

Make gives you a URL like https://hook.eu1.make.com/xxxx

2
Subscribe in Apartment Building Management Software → Settings → Integrations

Paste the Make URL and choose your event.

3
Click "Determine data structure" in Make

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-Signature header
# 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.

1
Zapier trigger: Webhooks → Catch Hook

Copy the URL Zapier gives you.

2
Apartment Building Management Software: subscribe to payment.succeeded

Settings → Integrations → event: payment.succeeded → paste URL → Create.

3
Record a test payment in Apartment Building Management Software

Zapier catches it. You'll see fields like amount, tenant_id, method, created_at.

4
Zapier action: Google Sheets → Create Spreadsheet Row

Map: Amount → amount, Method → method, Date → created_at, Tenant → tenant_id.

5
Turn on the Zap

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.

1
Zapier trigger: Webhooks → Catch Hook → copy URL
2
Apartment Building Management Software: subscribe to work_order.created
3
Add a Zapier filter step

Only continue if priority equals emergency.

4
Zapier action: Slack → Send channel message

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.

1
Zapier trigger: Webhooks → Catch Hook → copy URL
2
Apartment Building Management Software: subscribe to tenant.created
3
Zapier action: HubSpot → Create/Update Contact

Map: Email → email, First name → first_name, Last name → last_name.

4
Done — tenants sync to your CRM automatically

Apartment Building Management Software · Integration & API Documentation