Convergint is evolving how we integrate with physical security platforms.
Historically, many integrations to on-prem systems have relied on on-prem agents/connectors that Convergint develops, distributes, and maintains. This works, but it pushes ongoing complexity onto Convergint (SDK/version drift, customer network constraints, credential handling, upgrades, and site-specific edge cases).
This document describes the next evolution: vendors own and operate the on-prem integration surface (if any) and Convergint integrates cloud-to-cloud. We “meet in the cloud.”
This is a high-level document intended to align on the integration contract (inventory + events). We expect to collaborate on the design specifics with each vendor.
What changes
Why vendors are best positioned
Convergint-owned agent runs at the customer site and forwards inventory/events to Convergint Cloud.
Vendor-owned connector (if any) runs at the customer site; Convergint integrates directly with the vendor cloud via APIs + webhooks.
We’re looking for two core capabilities from a vendor’s cloud platform:
Every payload (inventory or event) must include enough metadata to reliably map vendor entities to the correct Convergint customer and site.
We prefer credential-bound integrations:
account_id and site_id (or equivalent), and Convergint resolves those to our internal customer/site mapping.This is consistent with how many modern cloud integrations behave today, where vendor “Account/Org” and “Location/Site” identifiers exist and can be used for resolution.
At a minimum, we need the following fields.
Identifier Best Practice: We strongly recommend using UUIDs (or equivalent globally unique identifiers) for all entity IDs—devices, sites, accounts, and events. Globally unique IDs simplify event processing and eliminate ambiguity when correlating devices across locations.
Nice to Have
online / offline or equivalent)The vendor should expose an event catalog. Convergint prefers webhooks for all event families the platform can publish, but will start with health.
Examples of event families we may adopt (depending on vendor support):
The following examples illustrate the expected shape of API responses. These are illustrative—vendors may adapt field names and structure as needed, as long as the required data is present.
Returns the account associated with the current API key. This solves the bootstrap problem: Convergint can discover which vendor account the credentials belong to.
GET /api/v1/account
{
"account_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"name": "Acme Security Corp"
}
Since the API key is bound to a single account, the account is implicit.
GET /api/v1/account/sites?page=1&per_page=50
{
"sites": [
{
"site_id": "5e6693c0-091d-47a2-b90a-6c15531b3c50",
"name": "US - 101 Chicago, IL",
"address": "2000 Center Drive, Suite 315A, Hoffman Estates, IL 60192",
"timezone": "America/Chicago"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total_pages": 3,
"total_count": 127
}
}
GET /api/v1/sites/{site_id}/inventory?page=1&per_page=100
{
"devices": [
{
"device_id": "652efeac-8567-4253-9d61-bbc842863d33",
"name": "Front Lobby Door",
"type": "door",
"status": "online",
"mac_address": "00:0f:e5:14:b2:1e",
"site_id": "5e6693c0-091d-47a2-b90a-6c15531b3c50",
"parent_id": "b3a1f7d2-4e89-4c12-a5d6-9f8e7c6b5a43"
}
],
"pagination": {
"page": 1,
"per_page": 100,
"total_pages": 5,
"total_count": 487
}
}
{
"event_id": "698219ad-4de9-896d-3be0-66cb00000001",
"event_type": "health",
"device_id": "652efeac-8567-4253-9d61-bbc842863d33",
"timestamp": "2026-02-04T14:32:00Z",
"account_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"site_id": "5e6693c0-091d-47a2-b90a-6c15531b3c50",
"data": {
"status": "offline"
}
}
Initially, we are focused on health events. However, this structure should be flexible enough to accommodate other event types (access, alarm, etc.) in the future. The event_type field distinguishes between event families, and data contains the event-specific attributes.
We expect real-world gaps. A vendor integration should support:
API Authentication: We recommend JWT-based authentication. Convergint generates a private key per account from the vendor’s administration console. Convergint uses this key to mint short-lived tokens (RS256) for each API request, and the vendor verifies using the corresponding public key. This approach eliminates long-lived API keys and ensures tokens expire quickly if compromised.
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjb252ZXJnaW50IiwiaWF0IjoxNzA3MDYyNDAwLCJleHAiOjE3MDcwNjI3MDB9.signature...
Decoded payload (token expires in 1 hour):
{
"iss": "convergint",
"iat": 1707062400,
"exp": 1707066000
}
Webhook Signatures: All webhook payloads should be signed using HMAC-SHA256 with a shared secret. The signature should be included in a request header (e.g., X-Webhook-Signature), along with a timestamp for replay protection. Convergint verifies the signature before processing any event.
X-Webhook-Signature: sha256=5d5b09f6dcb2d53a93f17d2f4ad705c8e8a0123456789abcdef...
X-Webhook-Timestamp: 1707062400
Signature is computed as HMAC-SHA256(request_body, secret).
Webhook Management API (nice to have): To enable self-service configuration, we prefer an API for webhook lifecycle management.
Create webhook:
POST /api/v1/webhooks
{
"name": "Convergint Insights",
"target_url": "https://app.convergint.com/api/webhooks/vendor",
"status": "active"
}
Response (includes generated secret):
{
"webhook_id": "d4e5f6a7-1234-5678-90ab-cdef12345678",
"name": "Convergint Insights",
"target_url": "https://app.convergint.com/api/webhooks/vendor",
"status": "active",
"secret": "whsec_5d5b09f6dcb2d53a93f17d2f4ad705c8..."
}
List webhooks:
GET /api/v1/webhooks
{
"webhooks": [
{
"webhook_id": "d4e5f6a7-1234-5678-90ab-cdef12345678",
"name": "Convergint Insights",
"target_url": "https://app.convergint.com/api/webhooks/vendor",
"status": "active"
}
]
}
Delete webhook:
DELETE /api/v1/webhooks/{webhook_id}
We’re happy to discuss the specifics of authentication and webhook setup during our working sessions.
We recognize this model may be net-new work for vendors that historically integrate primarily via on-prem SDKs.
If you’re open to pursuing this, we’d like to collaborate on the design and implementation details together.
What we can provide
For questions or next steps, contact:
Ryan Johnston – ryan.johnston@convergint.com Director Engineering
Juan Pemberthy – juan.pemberthy@convergint.com Principal Software Engineer