Webhooks API Reference Guide
This document provides a comprehensive guide for integrating with Monument webhooks. Webhooks allow you to receive real-time notifications about tenant lifecycle events in your Monument system.Overview
Monument securely sends event notifications to your endpoints via webhooks. Webhooks enable you to stay synchronized with tenant activities such as move-ins, move-outs, rent changes, and more.Authentication
Determining the expected signature Monument uses an HMAC with SHA-256 to sign its webhooks. So to calculate the expected signature, you should HMAC the signedcontent from above using the base64 portion of your signing secret (this is the part after the whsec prefix) as the key. For example, given the secret whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw you will want to use MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw. For example, this is how you can calculate the signature in Node.js:v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE= v1,bm9ldHUjKzFob2VudXRob2VodWUzMjRvdWVvdW9ldQo= v2,MzJsNDk4MzI0K2VvdSMjMTEjQEBAQDEyMzMzMzEyMwo=
Make sure to remove the version prefix and delimiter (e.g. v1,) before verifying the signature.
Please note that to compare the signatures it’s recommended to use a constant-time string comparison method in order to prevent timing attacks.
Webhook Events
Monument publishes the following webhook events. Each event is triggered by specific actions within the Monument system. Response Body: All webhook events include adata key with an array base response structure with the following fields:
event(string): The event type (e.g., “moved-in”)eventId(string): Unique event identifier in format{rentalRecordUuid}-{event_timestamp}-{event}tenantUuid(UUID): Unique identifier for the tenantunitRental(object): Contains rental information including:rentalRecordUuid(UUID): Unique identifier for the rental recordunitGroupUuid(UUID): Unique identifier for the unit groupunitUuid(UUID): Unique identifier for the unitfacilityUuid(UUID): Unique identifier for the facilityrentalBalance(number): Current rental balancestartRentDate(string): Start date of the rentalendRentDate(string): End date of the rental
billingTemplate(object): Contains billing information including:currentRentInPennies(number): Current rent amount in penniesadditionalServicesAndFees(array): Array of additional services and feespromotions(array): Array of active promotionsbillingDayOfMonth(number): Day of month when billing occursnextDueDate(string): Next payment due date
tenantBalanceInPennies(number): Total tenant balance in penniesprimaryContact(object): Contains primary contact information including:firstName(string): First namelastName(string): Last namephone(string): Phone numberisSMSEnrolled(boolean): Whether SMS enrollment is activeemail(string): Email address
1. moved-in
Event Type:moved-in
Description: Triggered when a lead is successfully converted to a tenant on the Monument system.
When This Event Fires:
- A lead signs their lease and is converted to a tenant
2. moved-out
Event Type:moved-out
Description: Triggered when a tenant moves out of their storage unit.
When This Event Fires:
- When a move-out request is processed and completed
3. rent-change
Event Type:rent-change
Description: Triggered when the rent amount for a tenant’s unit changes.
When This Event Fires:
- When a rent modification is applied to an active rental
rentChange object:
- All base response fields
rentChange(object): Contains rent change details:previousRentInPennies(number): Previous rent amount in penniescurrentRentInPennies(number): Current rent amount in penniesrentChangeDate(string): Date when the rent change was maderentChangeEffectiveDate(string): Date when the rent change becomes effective
4. delinquency-status-change
Event Type:delinquency-status-change
Description: Triggered when a tenant’s delinquency status changes (e.g., from OVERDUE to OVERlOCK, or from OVERLOCK to PAID).
When This Event Fires:
- When a payment is missed and the account becomes overdue
- When a payment is received that resolves delinquency
- When delinquency stages progress (overdue → overlock → lien)
delinquencyStatusChange object:
- All base response fields
delinquencyStatusChange(object): Contains delinquency status change details:delinquencyUuid(UUID): Unique identifier for the delinquency recorddelinquencyPreviousStatus(string): Previous delinquency status (e.g., “OVERDUE”, “OVERLOCK”, “LIEN”, “AUCTION”, “PAID”, “PAUSED”, “WRITTEN_OFF”)delinquencyNewStatus(string): New delinquency statusdelinquencyStatusChangeDate(string): Date when the status change occurredpaymentDate(string | null): Date of payment if status change was due to payment
5. recurring-service-change
Event Type:recurring-service-change
Description: Triggered when recurring services (additional services) are added to or removed from a tenant’s account.
When This Event Fires:
- When services are added during move-in or after move-in
- When services are removed from an active rental
recurringServiceChange object:
- All base response fields
recurringServiceChange(object): Contains recurring service change details:previousAdditionalServicesFees(array): Array of previous additional services and fees, each containing:description(string): Service descriptionamount(number): Service amountfeeType(string): Fee type (e.g., “FIXED_AMOUNT”, “PERCENTAGE”)itemTypeUuid(UUID): Unique identifier for the item type
currentAdditionalServicesFees(array): Array of current additional services and fees (same structure as above)serviceChangeDate(string): Date when the service change was madeserviceChangeEffectiveDate(string): Date when the service change becomes effective
How to Subscribe to Webhook Events
To subscribe to webhook events, you can use the Monument API to create and manage webhook subscriptions programmatically.Create Webhook Subscription
Creates a new webhook subscription for the specified application.Endpoint
Request Headers
Request Body
vendorName(string, required): Vendor name identifiertargetUrl(string, required): HTTPS URL where webhook events will be sent (must be HTTPS, no localhost, loopback, or private IPs, no query string)eventTypes(array of strings, required): Array of event types to subscribe to (e.g.,["moved-in", "moved-out", "rent-change"])description(string, required): Description of the webhook subscriptionportfolio(string, required): Database prefix (portfolio identifier)facilityUuids(array of UUIDs, optional): Filter events by specific facility UUIDsamenityUuids(array of UUIDs, optional): Filter events by specific amenity UUIDsunitTypes(array of UUIDs, optional): Filter events by specific unit type UUIDs
Response
endpointId(string): Svix endpoint IDapplicationId(string): Svix application IDurl(string): Webhook URLsubscribedEventTypes(array of strings): Event types that are subscribedfacilityUuids(array of UUIDs): Facility UUIDs filteramenityUuids(array of UUIDs): Amenity UUIDs filterunitTypes(array of UUIDs): Unit type UUIDs filterdatabasePrefix(string): Database prefixsecret(string): Endpoint secret for webhook signature verification (store this securely)
secret value securely. You’ll need it to verify webhook signatures (see Authentication section).
Unsubscribe from Webhook Events
Unsubscribes from one or more event types. If all event types are unsubscribed, the endpoint may be removed.Endpoint
Request Headers
Request Body
vendorName(string, required): Vendor name identifierportfolio(string, required): Database prefix (portfolio identifier)eventTypes(array of strings, required): Array of event types to unsubscribe from
Response
applicationId(string): Svix application IDvendorName(string): Vendor nameendpointId(string): Svix endpoint IDurl(string): Webhook URLunsubscribedEventTypes(array of strings, optional): Event types that were unsubscribed (only present for partial unsubscribe)remainingEventTypes(array of strings, optional): Event types that remain subscribed (only present for partial unsubscribe)
Webhook Configuration
Your webhook configuration can be customized to:- Filter events by facility UUIDs
- Filter events by unit types
- Filter events by amenities
- Enable or disable specific event types
How to Manage Webhooks and Events
Monument provides API endpoints to manage your webhook subscriptions and access the webhook management dashboard.Get Webhook Subscriptions
Retrieves all webhook subscriptions for the specified application. You can optionally filter by target URL or event type.Endpoint
Request Headers
Query Parameters
targetUrl(string, optional): Filter subscriptions by target URLeventType(string, optional): Filter subscriptions by event type
Response
applicationId(string): Svix application IDitems(array): Array of subscription items, each containing:url(string): Webhook URLdescription(string): Subscription descriptioneventType(string): Event type for this subscriptionfacilityUuids(array of UUIDs): Facility UUIDs filterunitTypes(array of UUIDs): Unit type UUIDs filteramenityUuids(array of UUIDs): Amenity UUIDs filterportfolio(string): Database prefix
Get Webhook Dashboard Link
Retrieves a secure link to the webhook management dashboard where you can:- View webhook delivery status and history
- View endpoint secrets for authentication
- Monitor webhook delivery success and failure rates
- Configure retry settings
- View event logs
Endpoint
Request Headers
Response
url(string, required): Secure URL to the webhook management dashboard. This link expires after 7 days and a new link will need to be generated.
Send Test Event
Sends a test event to verify your webhook endpoint is working correctly.Endpoint
Request Headers
Request Body
eventType(string, required): Event type to send as a test (e.g., “moved-in”, “moved-out”, “rent-change”)
Response
Returns HTTP 200 OK on success.Best Practices
-
Idempotency: Design your webhook handlers to be idempotent. Events may be delivered multiple times, so ensure processing the same event multiple times doesn’t cause issues.
You will receive on your endpoint a header called
webhook-idwhich is unique per message allowing you to handle deduplication on the receiving end as well, considering the at least once delivery policy. - Quick Response: Respond to webhook requests quickly (within a few seconds). If processing takes longer, acknowledge the webhook and process asynchronously.
-
Error Handling: Return appropriate HTTP status codes:
2xx: Successfully received and processed4xx: Client error (your endpoint issue)5xx: Server error (temporary issue, will retry)
- Security: Always verify webhook signatures to ensure requests are from Monument (see Authentication section).
-
Retry Handling: Monument will automatically retry failed deliveries. Ensure your endpoint can handle retry attempts gracefully.
Failed deliveries are retried according to our retry policy. Ensure your endpoint can handle retry attempts.
Each message is attempted based on the following schedule, where each period is started following the failure of the preceding attempt:
- Immediately
- 5 seconds
- 5 minutes
- 30 minutes
- 2 hours
- 5 hours
- 10 hours
- 10 hours (in addition to the previous)
-
Event Ordering: While events are generally delivered in order, design your system to handle out-of-order events if necessary.
Monument also sends on every payload an
eventIdkey composed of three parts{rentalRecordUuid}-{event_timestamp}-{event}, you can use it to properly order the event items.

