Skip to content
OpenAppPhysical access, fully managed
Login

Site People

Site People routes manage the people attached to a site for a virtual access integration: principals that hold an org role like virtual_access:integration:{id}:*. All three operations require X-Org and api_key (X-API-Key); path id is the integration ULID (see Integrations and Organization context & pagination).

OpenAPI groups these under /integrations/{id}/people (and .../{user_id} for removal). AddSitePersonPayload requires user_id and role strings — paste the role your deployment expects (often scoped to that integration); see schemas in the API reference.

ConcernHTTPoperationIdNotes
List usersGET .../peoplelist_peoplePath id = integration.200 body is an array per bundle (no named response schema in the public YAML).
Add userPOST .../peopleadd_personAddSitePersonPayload. 201 created.
Remove userDELETE .../people/{user_id}delete_person204 empty body on success.
CapabilityPythonRust (openapp_sdk)GoTypeScript (AsyncClient)
Listclient.site_people.list(id) → list[dict]Thin site_people().list omits X-Org — use transport() + RequestSpec (see examples) when the gateway requires the headerDirectoryListingMembersAPI.ListPeople + .XOrg(...)Not on façade yet
Addsite_people.add(id, user_id=…, role=…)Same: prefer transport() + RequestSpec below for strict header parityAddPerson + payload + .XOrg(...)Not on façade yet
Removesite_people.remove(id, user_id)SameDeletePerson + .XOrg(...)Not on façade yet

The Go generator returns raw *http.Response for these operations (no typed decode in the client) — decode JSON yourself from Body on success.

401 / 403 for auth and org policy; 404 when the integration (or user, for delete) is missing; 400 for invalid payloads. Error bodies where returned follow ApiErrorResponse — see Errors & retries.

Constants below stand in for real ULIDs from your org.

rows = await client.site_people.list(integration_id)

OpenAPI requires X-Org on list_people. If your bridge does not inject it from the default org, use interceptors or mirror the transport + RequestSpec pattern from the Rust tab with your HTTP client.

created = await client.site_people.add(
integration_id,
user_id=user_ulid,
role=role_string,
)
await client.site_people.remove(integration_id, user_ulid)

Same X-Org requirement as for GET — ensure the wire request carries the header for POST / DELETE.