Overview
This guide covers two distinct camera analytics capabilities that are easy to confuse:- Face Recognition (identity) — enroll known people from face images, then receive face-match events when a camera detects a matching face. Each event carries a confidence score and the best-matching person. Use this to recognize who appears on camera.
- People counting (headcount) — aggregate, non-identifying camera analytics that count how many people cross a camera’s field of view over time. These come from the Report Webservice as count time series and occupancy counts. No identity is involved.
- Enroll and manage people by creating person records and uploading face images
- Query face-match events with rich filters and pagination
- Tune the matching threshold and correct misidentified events
- Pull people-count analytics as time series or the most recent counts per camera
Not the same as occupancy sensors. Rhombus also offers physical occupancy sensors (Bluetooth/motion hardware) that report room presence. Those are a separate product served by a different API — see the IoT Sensors guide. This page’s “people counting” is camera analytics.
Prerequisites
Before you begin, make sure you have:
- A Rhombus API key. Enrolling or managing faces requires face-management permissions; reading people-count reports requires report read access. Generate and scope keys in the Rhombus Console under Settings > API.
- At least one camera with the relevant analytics enabled (face recognition for identity workflows, people counting for headcount analytics).
- Face Recognition is a licensed, gated feature. If the face endpoints are unavailable for your organization, contact your Rhombus account team to confirm entitlement.
POST to https://api2.rhombussystems.com and authenticate with the x-auth-scheme and x-auth-apikey headers. Timestamps are epoch milliseconds unless noted, and match confidence is a float between 0 and 1.
Enroll and manage known people
A person is a named identity record. A matchmaker is an enrolled face template attached to a person; the recognition engine compares detected faces against your matchmakers.Create a person
Create a named person record to enroll against.string
required
Display name for the person.
person object:
string
Unique identifier for the person.
string
Display name.
string
Optional email associated with the person.
string
Organization the person belongs to.
string
When the person record was created.
string
When the person record was last updated.
Upload a face image
Enroll a face by uploading a.jpg or .png image (maximum 5 MB) as multipart/form-data. The file must be sent under the form field name file. Two optional query parameters control the transaction:
transaction— a transaction ID you supply to track and later poll the upload. If omitted, the server generates one and returns it.createPersonIfNotFound— set totrueto have the system create a new person automatically when the uploaded face does not match an existing one.
string
The transaction ID for this upload (echoed back, or generated if you omitted it). Use it to poll processing status.
array
Per-file upload results, each with
fileName, success (boolean), and message.Poll the upload transaction
Face images process asynchronously. Poll the transaction to learn the resultingfaceId and the personUuid the face was enrolled or linked to.
faceUploadMetadata includes:
Label a person
Attach labels (for example,employee or visitor) to organize people and filter face events later.
removePersonLabel with the same body to detach a label, and findPersonLabelsByOrg (empty body {}) to retrieve a labelsByPerson map of every person’s labels.
List people and matchmakers
List every enrolled person withfindPeopleByOrg, and list enrolled face templates with findFaceMatchmakersByOrg (or findFaceMatchmakersByPerson for one person).
id (the face ID), personUuid, orgUuid, uploaded (boolean), and createdOn.
Update or remove people and faces
To manage retention and deletion of biometric data, use
deletePerson (removes the person and their enrollment) and deleteFaceMatchmaker (removes a single enrolled face). Face events can be removed individually with deleteFaceEvent (below).Query face-match events
When a camera detects a face, it generates a face event. Retrieve events withfindFaceEventsByOrg, which takes a searchFilter and a pageRequest.
Search filter
AllsearchFilter fields are optional. When timestampFilter is omitted, the search defaults to the last 7 days.
string[]
Filter to a set of people.
string[]
Filter by exact person names.
string
Filter by a name substring (minimum 3 characters after trimming). Takes precedence over
faceNames if both are set.string[]
Filter by person labels.
string[]
Filter to a set of cameras.
string[]
Filter to a set of locations.
boolean
Filter by the presence (
true) or absence (false) of a matched person name.boolean
Filter by the presence or absence of a face embedding.
object
Time window with
rangeStart and rangeEnd, each a string containing an epoch-millisecond value (inclusive). Defaults to the last 7 days.Page request
integer
Maximum number of events to return in one page.
string
Pagination cursor. Pass the
lastEvaluatedKey from the previous response to fetch the next page. Absent when there are no more results.Interpreting a face event
Each event infaceEvents is an object with these fields:
string
Unique identifier for the face event.
integer
When the face was detected, in epoch milliseconds.
string
Name of the matched person. Equal to the
name of selectedPersonMatch when a match was selected.string
UUID of the matched person, if any.
string
Camera that generated the event.
string
Location of the camera.
number
Confidence (0–1) that the detected image is a face.
number
Confidence (0–1) associated with the generated face signature.
boolean
Whether the event has a face signature.
object
The chosen person match, with
uuid, name, faceId, and confidence (0–1). Null when no match was selected.array
The best candidate matches for the face, each with
uuid, name, faceId, and confidence (0–1). Useful for reviewing near-matches.string
Storage key for the event image.
string
Storage key for the event thumbnail.
Tune matching and correct events
Read and update the matching threshold
The matching threshold controls how strict face matching is. It is a confidence value between0 and 1 — a higher value requires a closer match (fewer false positives, more misses); a lower value is more permissive.
number
Minimum match confidence (0–1) required to consider a detected face a match.
Correct a misidentified event
Reassign a face event to the correct person (or set a name directly) withupdateFaceEvent. This is how you fix false matches.
string
required
The face event to update.
string
UUID of the correct person to associate with the event.
string
Name to associate with the event. Ignored if
personUuid matches one of the event’s top person matches.deleteFaceEvent with { "eventUuid": "..." }.
People-counting analytics
People counting is aggregate camera analytics — it counts people without identifying them, served by the Report Webservice. Use it for footfall, occupancy, and trend dashboards.Count time series
getCountReportV2 returns a time series of counts bucketed by interval. For people counting, set types to ["PEOPLE"].
integer
required
Start of the range in epoch milliseconds.
integer
required
End of the range in epoch milliseconds.
string
required
Bucket size. One of
MINUTELY, QUARTERHOURLY, HOURLY, DAILY, WEEKLY, MONTHLY.string
required
Aggregation scope. One of
REGION, DEVICE, LOCATION, ORG.string[]
required
Report types to include. Use
["PEOPLE"] for people counting.string
Target UUID for the chosen scope (for example, a camera UUID when
scope is DEVICE). Omit for ORG scope.string
IANA time zone used to bucket the data (for example,
America/Los_Angeles).timeSeriesDataPoints includes:
string
Bucket start in UTC.
string
Bucket start in the requested time zone.
object
Map of report type to count for the bucket (for example,
{ "PEOPLE": 42 }).object
Map describing which devices reported into the bucket.
getCountReportV2 supports many types beyond PEOPLE — see the Reports & Analytics guide for the full report model, additional analytics endpoints, and CSV export.Most recent people counts
getMostRecentPeopleCountEvents returns the latest raw people-count events for a camera — useful for a live headcount tile.
string
required
Camera to read people counts from.
integer
required
Number of most recent count events to return.
eventTimestamp (epoch ms), peopleCount, deviceUuid, locationUuid, and uuid.
Occupancy counts over time
getOccupancyCountsV2 returns a time series of camera-derived occupancy counts for a single camera.
string
required
Camera to read occupancy counts from.
integer
required
Start of the range in epoch milliseconds.
integer
required
End of the range in epoch milliseconds.
string
required
Bucket size (
MINUTELY, QUARTERHOURLY, HOURLY, DAILY, WEEKLY, MONTHLY).timestampMs and approximateTimestampMsMap to the standard dateUtc, dateLocal, eventCountMap, and reportingDevicesMap fields.
This occupancy report is camera-derived. For room presence measured by physical Bluetooth/motion occupancy sensors, see the IoT Sensors guide — that is a separate hardware product with its own API.
Reference: report enums
Use cases
- Watchlist alerting — enroll people of interest, then poll
findFaceEventsByOrgfiltered bypersonUuidsorlabelsto flag sightings. - Access reconciliation — cross-reference face events with access-control activity to confirm the person who badged in matches who the camera saw.
- Model quality loop — review
topPersonMatcheson low-confidence events, correct them withupdateFaceEvent, and tunefaceMatchConfidenceThresholdto balance false positives against misses. - Footfall dashboards — chart
getCountReportV2withtypes: ["PEOPLE"]for daily or hourly traffic trends per camera or location. - Live occupancy tiles — surface
getMostRecentPeopleCountEventsfor a near-real-time headcount display.
Troubleshooting
uploadFaceMatchmakers rejects my file
uploadFaceMatchmakers rejects my file
Send exactly one file per request under the form field name
file, keep it under 5 MB, and use .jpg or .png. Let your HTTP client set the multipart Content-Type boundary — do not set Content-Type manually.findFaceUploadMetadataByTransaction returns nothing yet
findFaceUploadMetadataByTransaction returns nothing yet
Uploads process asynchronously. Poll the transaction until each entry reports a
success value. When success is false, read errorMsg for the reason.No face events come back
No face events come back
If you omit
timestampFilter, the search only covers the last 7 days. Widen the window with rangeStart/rangeEnd (epoch-millisecond strings), and loosen filters such as hasName or personUuids. Remember to page with lastEvaluatedKey.Too many false matches (or too few matches)
Too many false matches (or too few matches)
Adjust
faceMatchConfidenceThreshold with updateFaceMatchingConfig. Raise it (closer to 1) to reduce false positives; lower it to catch more potential matches. Correct individual mistakes with updateFaceEvent.Next Steps
Reports & Analytics
Full count-report model, threshold-crossing counts, and CSV export
LPR & Vehicle
Detect and search license plates and vehicles across your cameras
IoT Sensors
Physical occupancy, climate, and environmental sensors
API Reference
Browse and test every Rhombus API endpoint