Download OpenAPI specification:
VAULT is an enterprise WiFi authentication, subscriber management, and monetization platform that provides comprehensive APIs for network operators, venue administrators, and subscribers. The platform integrates with property management systems, payment processors, and network infrastructure to deliver seamless WiFi services.
This update is rolling out to all VAULT production environments. Most operators have already received it, and the rollout is scheduled to complete on July 23, 2026. This is a large update — all operators are encouraged to read these notes in detail.
VAULT now supports keypools assigned to individual units. Wi-Fi passwords/PSKs continue to maintain their roll-up hierarchy: a PSK assigned to a unit-level keypool rolls up to work with venue-level keypools and global keypools. See the Unit-Level Keypools and Keypool Hierarchy pages in our Knowledge Base for details.
When a new keypool is added to a venue or unit, existing PSKs now work against that new keypool, in accordance with keypool rules.
Stripe configuration has moved down from the subscriber level to the subscription level. This means an individual subscriber may now hold multiple subscriptions on different Stripe accounts. Subscribers moving from one venue to another will no longer see a Stripe processing error when the two venues have different Stripe accounts associated with them.
VAULT now supports a limited use case allowing a customer to sign up for Wi-Fi-only service, with wired access available as a paid upgrade. Please reach out to your VAULT Account Manager for more information if you wish to take advantage of this capability.
API updates have been applied and are available for review on our new API Documentation page in the Knowledge Base. This release introduces the api-version header. New integrations must send api-version: 20260417 to receive the current response format; existing integrations have until the 2026-11-17 sunset to adopt it, after which all responses use the current format regardless of whether the header is present. For our API-based customers, your VAULT Account Manager will reach out to discuss how this new versioning affects you and to agree on a timeline for moving to the latest API versions.
Email addresses are now editable by Network Admins only. Customer Support Agents and Subscribers remain restricted for security reasons. Expanded email editability — including standard new-address verification — is on our roadmap for a future update.
Subscriber logs now contain user login attempts. This helps support teams identify whether users are attempting to log in and, if so, whether they are entering the incorrect password.
We have relaxed our suppression / DDoS-prevention logic for devices that repeatedly attempt to connect with the wrong password. This should reduce the number of false rejections for those devices. We continuously monitor this logic and will relax it further over time.
A fix has been applied to improve Ruckus WPA3 capabilities.
Countless bugs have been squashed.
Dozens of infrastructure updates ship with this release, delivering multiple operational efficiencies. At the time of release, over 90% of VAULT authentications are processing in under 70 milliseconds.
For integrators. Every row below was verified against the code at this release's HEAD.
| Change | Endpoint / Field | Details |
|---|---|---|
| New endpoint | listPushNotificationTemplates — GET + POST, under /equipment/…, /config/…, /networkoperatorconsole/equipment/… |
Admin-only (NetworkSoftwareProvider / NetworkOperator). Returns the operator's per-locale push templates (PushConfiguration, plus a DynamicVariables hint) and the push channel block Notifications.PushNotifications, which now contains only { PushApplicationID, Enable } — Vault no longer stores or returns FCM/APNS credentials or channel status. Sibling /config/listEmailTemplates + /config/listSMSTemplates aliases added. |
| New request field | subscriber configure — Devices[] |
Declarative full push-device list {DeviceToken, ChannelType:'GCM'|'APNS', Platform?, DeviceName?}; each token ≤4096 chars + safe charset, deduped by token (first wins), capped at 20; a non-array value is ignored. A subscriber may set only its own list; operator / NSP / venue admins may set it on a subscriber's behalf. |
| New response field | listSubscriptions, shoppingcart/listSubscriptions, listKeys / listSubscriberKeys |
RegisteredDevices (registered push devices) — distinct from AllDevices (connected Wi-Fi devices by MAC). |
| Changed config + read field | operator/configure, listOperatorDetails — Notifications.PushNotifications |
Operator push is submitted and returned as { PushApplicationID, Enable }. The operator points Vault at a Pinpoint / AWS End User Messaging app they already own; the supplied PushApplicationID is validated (not auto-provisioned), and push is toggled by a separate Enable flag (stored as PushNotificationsEnabled). The two are independent — Enable is honored only when an app id is present. Vault stores only the app id + flag, no FCM/APNS credentials. PushApplicationID + Enable are returned under Notifications.PushNotifications on listOperatorDetails for admins/NSP; the per-locale templates surface only on the admin-only listPushNotificationTemplates. |
| Version-gated fields | listSubscriptions |
With api-version ≥ 20260417: per-key StrictPSK, per-policy VenueUnitSSID (in NetworkData), and per-policy StripeCustomerID. The legacy top-level StripeCustomerID is returned only below the threshold. A localized deprecation hint names the header. |
| Version-gated fields | listVenueUnits |
With api-version ≥ 20260417: per-unit VenueUnitSSID and StrictPSK (stripped below the threshold). This endpoint has no StripeCustomerID field. A localized deprecation hint names the header. |
| Threshold fix | listSubscriptions, listVenueUnits |
The VenueUnitSSID / per-policy StripeCustomerID read gate was mistakenly checking 20260917 and is corrected to 20260417 — clients on api-version: 20260417 now actually receive the fields. |
| Preview auto-versioning | listOperatorDetails, listVenueUnits, listSubscriptions |
When the request Origin contains -preview, the handler injects api-version = the running CODE_BRANCH, so preview UIs receive the newest gated shape with no header. (VAULT-109) |
| Write gate removed | configure / add endpoints (object layer) | The per-codebranch write block (401 "Write access not permitted on codebranch.") was removed from 26 object-layer files. Operators can write against any deployed API version. (A separate read-only-replica region gate is unchanged.) |
| Removed field | listOperatorDetails — Notifications.Pinpoint / PinpointID |
No longer returned for api-version ≥ 20260417 (re-injected as empty below the threshold until the 2026-11-17 sunset). SMS now routes by SMSConsolePhoneNumber.E164 only. |
| Identifier change (from the 2026-11-17 sunset) | networkoperatorconsole/subscribers/resetKey |
From the 2026-11-17 (20261117) sunset, admin Wi-Fi-password reset requires SubscriberToken + psk (the subscriber's current PSK); CurrentKeyID/pmk is no longer accepted. Before the sunset, CurrentKeyID stays a legacy alternative to psk. (resetKey sunset-gate update, in-range commit 097c348bd; no NETWORKOP ticket in the release range) |
| New endpoint | listSuppressedDevices — POST (read-only), /operatorconsole/venues/listSuppressedDevices |
Requires AccessToken + VenueID; auth mirrors venue configuration (NetworkSoftwareProvider — needs OperatorID in body — / NetworkOperator / Venue Administrator). Lists a venue's three escalating per-MAC RADIUS suppression tiers, keyed by its NAS-Identifier: suppressed_mac (short, 60s / ≥10), suppressed_mac_repeat (4h / ≥100), suppressed_mac_longterm (12h / ≥1000) — each entry { mac, count, ttl }. Never deletes; discovery is region-local (run per region). |
| New request field | configureVenue — clearSuppressedMacs (boolean) |
Ops action that does not modify the venue: when true, short-circuits the normal configure path and lists and deletes every per-MAC suppression counter (short / repeat / long-term) for the venue's NAS-Identifier, releasing devices stuck in the 12h long-term lockout (e.g. a subscription deleted then recreated, whose MAC is rejected pre-auth before its valid PSK is ever tried). The delete rides the cross-region cache fan-out (clears every region); discovery is region-local. Read-only sibling is listSuppressedDevices. |
| Changed route + request fields | listLogs — moved /operatorconsole/config/listLogs → /operatorconsole/listLogs (old path deprecated in the spec) |
Full-text audit-log search over OpenSearch. New request fields: searchText (multi-field match), customQuery (raw OpenSearch Query DSL — supersedes the individual filter fields; only OperatorID + date range still applied; 400 on invalid DSL), exact-match filter fields, and searchBefore cursor pagination. Response adds searchBefore (next-page cursor) and allowedFilterFields. (logs → OpenSearch) |
| Removed endpoint | networkoperatorconsole/scratchcards/{addScratchCards, extendScratchCardBatch, invalidateScratchCardBatch, viewScratchCardBatch} |
The scratch-card batch feature (bulk pre-generated one-time-PSK vouchers) was retired — all four routes dropped from the OpenAPI spec and their backing Lambdas deleted (ScratchCardGenerator + the four scratchcards/*). Clients calling these paths no longer have a route. |
| New API type | device-authenticator (RADIUS/PSK) endpoints | Migrated from API Gateway REST API → HTTP API (new invoke URL; WAFv2 WebACL association removed — HTTP API does not support it). |
The VAULT API consists of three main console interfaces:
Self-service portal for WiFi subscribers and guests
Core Functions:
Administrative interface for property and venue managers
Core Functions:
Enterprise management for network service providers
Core Functions:
Backend Infrastructure: - AWS Lambda serverless functions for API endpoint handlers - AWS Cognito Identity Provider for authentication and user management - Distributed data storage for relationship and metadata management
Payment Processing: - Stripe integration for subscription billing and payment management - Automated billing cycles with failure handling and retry logic - Support for multiple currencies and regional payment methods
Network Integration: - ConnectWise API integration for network equipment management - PRTG monitoring system integration for real-time equipment status - RADIUS authentication support for WiFi infrastructure - Device bandwidth monitoring and usage analytics - Supported gateways: Nomadix, Mikrotik, Peplink, Altiplano, RiQ
Security & Compliance: - Multi-level access controls with role-based permissions - Input validation and sanitization on all endpoints - Audit logging for compliance and security monitoring - GDPR-compliant data handling and privacy protection
👨💼 Staff & Support Operations (/staff/, /support/):
Venue Operations: - Multi-building property discovery and configuration management - Real-time network equipment monitoring with ConnectWise integration - Usage analytics and bandwidth reporting with timezone support - RSSI signal strength monitoring and network optimization - Operational history and audit logging
Subscriber Management: - Complete subscriber lifecycle from onboarding to billing - Payment processing with Stripe integration and transaction history - Subscription modifications including plan changes and pricing adjustments - Communication tools and notification systems - Email validation and PII data management
Unit-Level Management: - Individual unit usage tracking and bandwidth monitoring - WiFi key pool management for secure device authentication - Unit-specific audit logs and activity tracking
Authentication & Profile Management: - Multi-modal login support (email, phone, subscriber tokens) - Terms & Conditions acceptance workflow and compliance tracking - Password reset and account recovery with secure validation - Personal information updates with privacy controls
Device & Access Management: - WiFi key generation and device registration - Real-time device session monitoring and connection history - Device naming and tagging for user organization - Key lifecycle management including rotation and security updates
Subscription & Billing: - Self-service subscription management and plan modifications - Payment method management with Stripe integration - Subscription cancellation with automated processing - Transaction history and billing statement access
Support & Communication: - Self-service ticketing system with automated routing - Venue communication and message acknowledgment - Account activity logging for transparency - Multi-language support (English, Spanish)
Architecture: - OpenAPI 3.0.3 specification with comprehensive schema validation - RESTful design using POST methods with JSON payloads - Token-based authentication via AccessToken parameters - Standardized response format with consistent error handling
Security Framework: - TLS encryption with AWS Certificate Manager - AWS Cognito Identity Provider for authentication - Role-based access controls with venue-level isolation - Input validation and sanitization on all endpoints - Audit logging with immutable records and user attribution
All API endpoints require authentication via AccessToken in the JSON request body:
Cloud Services: - AWS Lambda serverless functions for scalable API processing - AWS Cognito Identity Provider for secure user authentication - Distributed data storage for scalable relationship management
External Integrations: - Stripe payment processing for subscription billing and transactions - ConnectWise API for network equipment management and configuration - PRTG monitoring system for real-time infrastructure status - SMTP services for automated email communications - Supported network gateways: Nomadix, Mikrotik, Peplink, Altiplano, RiQ
Required header — api-version: New integrations must send api-version: 20260417 on every API call to receive the current response format; without the header, responses fall back to the legacy format. Existing integrations may keep calling without it until the 2026-11-17 sunset (and keep receiving the legacy format until then). From 2026-11-17 onward, every response uses the current format whether or not the header is present.
Standard Request Structure: json { "AccessToken": "authentication_token", "VenueID": "venue_identifier", "RequestParameters": "endpoint_specific_data" }
Standard Response Structure: json { "message": "Operation result description", "errorProcessing": false, "data": "endpoint_specific_results", "SupportedLocales": { "en-us": "English (US)", "es-xl": "Spanish (Latin America)" } }
Error Response Format: - HTTP Status Codes: 200 (Success), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), 500 (Server Error) - Localized error messages with troubleshooting guidance - Rate limiting with 429 responses and retry-after headers - Service maintenance notifications with 503 responses
Internal RADIUS authentication endpoints called by network access servers (NAS) and WiFi controllers to validate device credentials and retrieve per-device pre-shared keys.
x-api-key header) — operator-scoped RADIUS key, not JWT/wpa3phase2) — per-device PSK lookup for WPA3 networksThese endpoints are not intended for direct web client consumption. They are called by network infrastructure (RADIUS servers, controllers) to make real-time access control decisions.
Comprehensive self-service portal for subscribers to manage their account, services, billing, and preferences independently.
Signs a subscriber in and returns Cognito tokens. Unauthenticated — takes credentials, not an access token. The operator must have a fully configured Cognito pool (pool id, app client id AND secret) or every request is refused.
Two flows:
Password plus one of EmailAddress (≥5 chars, lower-cased), PhoneNumber (matched exactly as stored, no normalization) or SubscriberToken (>4 chars, lower-cased). Refused if the account is SSO-managed and the operator has SAML configured.authorizationToken (an OAuth2 code from the operator's hosted sign-in page, NOT a bearer token) — takes precedence over Password. Exchanged for tokens at the operator's Cognito domain.⚠ This "login" call writes: a new account is created if none exists; an existing account is marked SSO-managed on a successful SSO sign-in. Every attempt is logged, successful or not.
Sensitive fields (SubscriberToken, EmailAddress, PhoneNumber, name, status, key material) are always stripped from the response. Messages are localized (Spanish for Accept-Language starting 'es').
| Password | string <password> Subscriber password. Selects the credential flow. Must be sent with exactly one identifier. Sending an identifier WITHOUT a password is refused with the same message as a wrong password. |
| EmailAddress | string <email> Subscriber email. Lower-cased before use. Consulted only when at least 5 characters long; a shorter value is silently skipped in favour of PhoneNumber. |
| PhoneNumber | string Subscriber phone number, used for lookup exactly as supplied - no formatting or E.164 normalisation is applied. Reached only when EmailAddress is absent or shorter than 5 characters. |
| SubscriberToken | string Subscriber token, lower-cased and used directly as the sign-in username. Reached only when neither EmailAddress (5+ characters) nor PhoneNumber was supplied, and honoured only when longer than 4 characters. |
| authorizationToken | string OAuth2 authorization CODE issued by the operator's hosted sign-in page - not a JWT. Any non-empty value selects the SSO flow, which takes precedence over Password. The code is redeemed against the operator's Cognito domain using the request Origin as the redirect URI, so the Origin must match the one registered there. |
| Domain | string Accepted but has no effect on this operation. In particular it does not change which user pool the sign-in is performed against. |
| property name* additional property | any |
{- "EmailAddress": "subscriber@example.com",
- "Password": "<password>"
}{- "AuthenticationResult": {
- "AuthenticationResult": {
- "AccessToken": "<access token>",
- "IdToken": "<id token>",
- "RefreshToken": "<refresh token>"
}
}, - "message": "",
- "errorProcessing": false
}Complete a new subscriber's account activation: exchange the temporary password they were issued for a password of their own, recording their acceptance of the Terms and Conditions.
No login required — the caller is identified by the subscriber selector plus the temporary password only that subscriber received. One of SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber (undotted), tried in that order.
Deliberately uninformative on an unknown subscriber: 401 with an empty message, so the response can't be used to test whether an account exists.
Password rules: NewPassword must be 8-63 printable-ASCII characters. A missing/malformed value returns HTTP 200 with errorProcessing: true, not a 4xx.
On success: password is set, email marked verified, status becomes in-service, temporary password cleared, and a LoginPasswordCreated webhook fires if configured.
Already-activated accounts are refused (401, errorProcessing: false) but are still partially updated — the new password and in-service status are applied without verifying the temporary password.
An expired temporary password self-heals: a new one is generated and emailed, and the request is refused so the subscriber can retry.
| Accept-Language | string Example: es-XL A first tag beginning |
| SubscriberToken | string The subscriber's identifier. Highest precedence of the four selectors. |
| externalSubscriberID | string The operator's own identifier for the subscriber. Used only when |
| EmailAddress | string <email> The subscriber's email address, matched case-insensitively. Used only when |
| PhoneNumber | string The subscriber's phone number, matched exactly as sent against the stored value. Lowest precedence. The dotted |
| TemporaryPassword required | string The temporary password issued to the subscriber. Trimmed before use; an empty or whitespace-only value is reported as missing. |
| NewPassword required | string The password the subscriber is choosing. Trimmed before use, then required to be 8 to 63 characters of printable ASCII (space through |
{- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "TemporaryPassword": "string",
- "NewPassword": "string"
}{- "message": "string",
- "errorProcessing": false
}Starts a subscriber console password reset: a one-time code is issued for the account and delivered to the subscriber by email or SMS. The code itself is never returned in the response - it goes only to the account's own contact details - and it is then presented to the confirm step to set the new password.
No access token is required. A caller with no token at all is classified as public and served. If a token IS supplied (in the body or as Authorization: Bearer <JWT>) and the operator has an identity pool, it is verified, so a malformed or expired token is refused 401 even though omitting it entirely would have been accepted. A verified token is classified as a Network Software Provider (which must also send OperatorID), a network-operator administrator listed for this operator under DomainAdministrator, AccountManager or CustomerSupport, venue staff (a VenueAdministrator or LeasingAgent whose token lists the VenueID sent in the body - so that classification only happens when you send VenueID), or the subscriber themselves.
Whose account. A subscriber caller always targets their own account and any identifier in the body is ignored. Every other caller names the account with SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber, resolved in that order of precedence; venue staff are additionally confined to subscribers who hold a subscription at one of their own venues.
A public caller's misses are answered like a success. For an unauthenticated caller, an unknown identifier, an account whose cached record cannot be loaded, and an account managed through an external identity provider ALL return the same 200 success body as a real send. The one account-dependent rejection a public caller can still see is the delivery-stage 401 'SMS is not configured for Operator', which arises only for an account that does exist; every other distinguishing rejection needs an authenticated caller.
What actually gets sent depends on the account's state. An account that already has an unused reset code has that SAME code re-sent - a fresh one is not issued. An account with no outstanding code gets a newly generated code of eight lower-case letters, stored against the account with the time it was issued. An account that has never completed its first sign-in is sent its welcome message with its existing temporary password instead of a reset code. An account in any other state answers success WITHOUT sending anything. All four cases return the same message, so the response does not tell you which happened.
Delivery channel. By default the message goes to the account's email address. Sending NotificationChannel set to exactly 'SMS' (upper-case; the comparison is exact) routes it to the account's phone number instead, and that request is honoured regardless of the operator's e-mail suppression settings - but if the operator has no SMS sending number configured the call is refused 401 with the English-only 'SMS is not configured for Operator'. Any OTHER delivery failure - including an account with no usable phone number - still answers 200 with the normal success message, so a 200 does not prove the message was delivered.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. It localizes the success message, 'OperatorID Missing. ', 'Subscriber not found.' and the external-identity-provider rejection; the SMS-not-configured failure is hardcoded English. |
| EmailAddress | string <email> Names the account to reset. Lower-cased before lookup. Ignored when the caller's own token carries a subscriber identity, and outranked by SubscriberToken and externalSubscriberID when several are sent. |
| PhoneNumber | string Names the account to reset, matched against the stored value exactly as sent. Lowest precedence of the four identifiers. |
| SubscriberToken | string Names the account to reset; highest precedence of the four identifiers. IGNORED when the caller's own token carries a subscriber identity - their own account is used instead. |
| externalSubscriberID | string Names the account to reset by the operator's own identifier for the subscriber. Second in precedence, after SubscriberToken. |
| AccessToken | string Optional Cognito access-token JWT; may instead be supplied as |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider, in which case its absence gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and removed from the body. |
| VenueID | string Only meaningful for venue staff: the caller is classified as venue staff solely when their token lists this VenueID as a VenueAdministrator or LeasingAgent venue, and the target subscriber must then hold a subscription at one of the caller's venues. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| NotificationChannel | string Set to exactly 'SMS' to have the code sent to the account's phone number instead of its email address; the comparison is case-sensitive, so 'sms' does not select SMS. Any other value, or omitting it, leaves delivery to the account's email address. An SMS request is honoured even where the operator suppresses subscriber e-mail. |
| property name* additional property | any |
{- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "NotificationChannel": "SMS"
}{- "message": "Code to reset password sent to account. ",
- "errorProcessing": false,
- "statusCode": 200
}Completes a subscriber console password reset: present the one-time code plus a new password.
Unauthenticated — any access token supplied is ignored; authorization rests entirely on possession of a valid code for the named account.
Identify the account with exactly one of EmailAddress, PhoneNumber or SubscriberToken.
⚠ The not-found rejection carries no text — an unresolvable identifier gets 401 with an EMPTY message, deliberately, so a public caller can't probe for accounts.
OTP is the 8-letter reset code most recently issued; it has no time limit of its own and stays valid until used or replaced (the message says 'expired' but really means 'didn't match').
New password: 8-63 printable-ASCII characters. Length/charset failures return HTTP 200 with errorProcessing: true, not 4xx. The identity pool's own password policy can still reject an otherwise-valid password (401 'Something went wrong!. ').
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. Here it localizes the field-validation messages, 'OTP expired. ', 'Password changed. ', 'Error updating password. ' and 'Something went wrong!. '. |
| Authorization | string Accepted but inert: when present the second space-separated word is copied onto the request's AccessToken property, which this operation never verifies and never uses to authorise anything. |
| EmailAddress | string <email> One of the three ways to name the account. Lower-cased before lookup. Used only when SubscriberToken is absent. |
| PhoneNumber | string One of the three ways to name the account, matched against the stored value exactly as sent, so it must be in the same form the account holds. Used only when SubscriberToken and EmailAddress are both absent. Must be a JSON string; a numeric value abandons the request, which then answers HTTP 200 with an empty message and errorProcessing false, having changed nothing. |
| SubscriberToken | string One of the three ways to name the account, and the one that wins when several are sent. |
| OTP required | string The one-time reset code issued for this account - eight lower-case letters when generated by the reset-initiation step. Must be a non-empty string after trimming, else the request fails with HTTP 200 and 'OTP missing from request. '. A non-matching code gives 401 'OTP expired. '. |
| NewPassword required | string <password> [ 8 .. 63 ] characters The new console password. Trimmed before validation, then required to be 8-63 characters of printable US-ASCII (space through ~). Missing, too short, too long or out-of-range characters each fail with HTTP 200 and errorProcessing true. It is set as a PERMANENT password in the operator's identity pool and also recorded on the subscriber's account record. |
| AccessToken | string Accepted but inert - this operation never verifies it and it confers no authority. |
| property name* additional property | any |
{- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "SubscriberToken": "string",
- "OTP": "string",
- "NewPassword": "pa$$word",
- "AccessToken": "string"
}{- "message": "Password changed. ",
- "errorProcessing": false
}Updates the calling subscriber's own account. Whose record is changed depends on the caller's role, not the request body — a caller with no operator/venue role is always confined to their own account, regardless of what SubscriberToken/EmailAddress/etc. is sent; an operator/venue-role caller may target another account via those fields (this handler also serves the staff consoles).
Field permissions (subscriber caller): may set GivenName, FamilyName, PhoneNumber, contactpref_sms, locale, Status, registered devices. May NOT set EmailAddress (needs a DomainAdministrator/NSP), externalSubscriberID, any AdministrativeAccess role, or account-removal switches — a disallowed field is silently dropped, not rejected, EXCEPT AdministrativeAccess, whose mere presence can trigger a 409 regardless of role.
Names are sanitized (not rejected) unless the cleanup would remove disallowed characters, in which case the request is refused. Only changed fields are written; the account is locked during the update — a concurrent update returns 200 having changed nothing.
| AccessToken | string Cognito access token of the calling subscriber. May instead be supplied as 'Authorization: Bearer |
| GivenName | string Given name. Only applied when non-empty. Markup and entities are stripped, the value is trimmed and truncated to 64 characters, and letters, digits, dot, underscore, hyphen, ampersand, space, parentheses, comma, question mark, asterisk and apostrophe are kept; if anything else was present the request is refused with 'Invalid characters in GivenName.' |
| FamilyName | string Family name. Same sanitising and same refusal, with 'Invalid characters in FamilyName.' |
| PhoneNumber | string Phone number. Normalised to E.164 before storing; an unusable value is refused with the literal doubled, as 'Invalid PhoneNumber. Invalid PhoneNumber. '. If the normalised number already belongs to another account of this operator the request is refused with 'PhoneNumber is associated with another account.' |
| PhoneNumber.E164 | string Alias for PhoneNumber - when present it is copied onto PhoneNumber before the update runs. For a subscriber caller it does NOT select another account. |
| contactpref_sms | boolean SMS contact preference. Applied only when the value is exactly the boolean true or false; a string such as "true" is ignored. |
| phone_number_verified | boolean Marks the phone number as verified. Applied only for an exact boolean true or false. |
| locale | string Enum: "en-us" "es-xl" Preferred language. Any other value is ignored, not rejected. |
| Status | string Account status. Only 'AUP not accepted' and 'In Service' are accepted (compared case-insensitively after trimming); any other value is ignored. |
Array of objects Declarative replacement of the account's registered push-notification devices. Applied only when the value is an array. Devices present in the list are registered or refreshed and devices missing from it are removed. | |
| forgetSubscriberDevices | boolean When exactly true, forgets the subscriber's connected network devices. Optionally scoped to a single device by also sending Calling-Station-Id; a supplied but unusable Calling-Station-Id is refused with 'Invalid Calling-Station-Id. ' rather than falling through to forgetting them all, and one that matches nothing is refused with 'Device not found. '. |
| Calling-Station-Id | string Device MAC address, used only alongside forgetSubscriberDevices to limit the operation to that one device. |
| EmailAddress | string <email> Accepted only from a domain administrator of the operator or a provider-level caller. Sent by a subscriber it is ignored - the account's email cannot be changed through this operation by its owner. When it is applied and the address already belongs to another account of the operator the request is refused with 'Email Address is associated with another account.' |
| SubscriberToken | string Ignored for a subscriber caller: the target is forced to the token's own account. Staff callers use it to select the account to change. |
| externalSubscriberID | string Accepted only from an operator-level or provider-level caller; ignored when a subscriber sends it. |
| SubscriberManagedviaSSO | boolean Marks the account as managed through an external identity provider. Unlike every other field here it has no role restriction - any caller can set it on the account the request resolved to - and it is applied on ANY truthy value, so the string "false" sets it too. It also REPLACES the rest of the request: when it is truthy every other field sent alongside it is discarded and only this flag is written. The change is reported in message as the literal 'Updated SubscriberManagedviaSSO to true. '. Once set, the account can no longer sign in with a password at an operator configured with a SAML identity provider. |
| property name* additional property | any |
{- "AccessToken": "<cognito access token>",
- "GivenName": "<given name>",
- "FamilyName": "<family name>",
- "locale": "en-us",
- "contactpref_sms": true
}{- "errorProcessing": false,
- "statusCode": 200,
- "message": "Updated locale = en-us. Updated contactpref_sms = true. "
}Returns the operator's Terms and Conditions text for a locale. No login required — the caller is authorized purely by the request Origin resolving to a known operator; any token/subscriber fields sent are ignored, and the same request returns the same text for anyone on that operator's domain.
Locale: derived from Accept-Language by default (es-xl if it starts with es, else en-us); sending locale overrides it and is echoed back as ProfileLocale.
⚠ An unusable locale (case-insensitively neither en-us nor es-xl) does NOT fail the request — it returns 200 with only message/errorProcessing: false and no TandC. Check for the ABSENCE of TandC, not errorProcessing, to detect this. Send locale in lower case — a value that differs only in case passes validation but then matches no stored text.
TandC is likewise absent (not empty) when the operator has published no text for the resolved locale. Read-only.
| Accept-Language | string Example: es-XL Determines |
| locale | string Which localised text to return. Must be |
{- "locale": "es-xl"
}{- "DeviceLocale": "en-us",
- "ProfileLocale": "es-xl",
- "TandC": "string",
- "message": "string",
- "errorProcessing": false
}Returns the operator's Terms and Conditions text for a locale. No login required — the caller is authorized purely by the request Origin resolving to a known operator; any token/subscriber fields sent are ignored, and the same request returns the same text for anyone on that operator's domain.
Locale: derived from Accept-Language by default (es-xl if it starts with es, else en-us); sending locale overrides it and is echoed back as ProfileLocale.
⚠ An unusable locale (case-insensitively neither en-us nor es-xl) does NOT fail the request — it returns 200 with only message/errorProcessing: false and no TandC. Check for the ABSENCE of TandC, not errorProcessing, to detect this. Send locale in lower case — a value that differs only in case passes validation but then matches no stored text.
TandC is likewise absent (not empty) when the operator has published no text for the resolved locale. Read-only.
| locale | string Example: locale=es-xl Which localised text to return. Must be |
| Accept-Language | string Example: es-XL Determines |
{- "DeviceLocale": "en-us",
- "ProfileLocale": "es-xl",
- "TandC": "string",
- "message": "string",
- "errorProcessing": false
}Return the calling subscriber's own Wi-Fi keys, grouped by keypool, with connected devices, registered devices, and venue messages.
Reports only on the caller — every request field except the access token is discarded; there's no subscriber/venue/unit selector. An operator-admin token that happens to resolve to a subscriber gets THEIR OWN keys back; a NetworkSoftwareProvider staff token can never use this operation (always 'OperatorID Missing. ').
The body IS the subscriber's record — no envelope, no success flag; use errorProcessing.
Ended subscriptions are dropped; the remainder are folded into KeysInKeyPools. A subscriber with no surviving subscription gets only their record plus device counts.
Read-only.
api-version gate: api-version: 20260417 or higher adds editable/StrictPSK/VenueUnitSSID/per-policy StripeCustomerID; below that, a version-upgrade notice is appended to message on every response.
| Authorization | string
|
| api-version | string Example: 20260417 Send |
| AccessToken | string Cognito access token. Required unless supplied as an |
{- "AccessToken": "string"
}{- "SubscriberToken": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "en-us",
- "PhoneNumber.E164": "string",
- "OperatorID": "string",
- "SubscriberManagedviaSSO": true,
- "Devices": [
- { }
], - "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "AdministrativeAccess": { },
- "DeviceCountOnline": 0,
- "DeviceCountOffline": 0,
- "KeyCount": 1,
- "KeyCountActive": 1,
- "KeysInKeyPools": {
- "property1": {
- "ssid": "string",
- "DisplayOrder": 1,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}
}, - "property2": {
- "ssid": "string",
- "DisplayOrder": 1,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}
}
}, - "AllDevices": {
- "property1": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}, - "property2": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}
}, - "RegisteredDevices": [
- { }
], - "messages_from_venues": {
- "property1": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}, - "property2": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}
}, - "StripeCustomerID": "string",
- "message": "string",
- "errorProcessing": true
}Return the calling subscriber's own Wi-Fi keys, grouped by keypool, with connected devices, registered devices, and venue messages.
Reports only on the caller — every request field except the access token is discarded; there's no subscriber/venue/unit selector. An operator-admin token that happens to resolve to a subscriber gets THEIR OWN keys back; a NetworkSoftwareProvider staff token can never use this operation (always 'OperatorID Missing. ').
The body IS the subscriber's record — no envelope, no success flag; use errorProcessing.
Ended subscriptions are dropped; the remainder are folded into KeysInKeyPools. A subscriber with no surviving subscription gets only their record plus device counts.
Read-only.
api-version gate: api-version: 20260417 or higher adds editable/StrictPSK/VenueUnitSSID/per-policy StripeCustomerID; below that, a version-upgrade notice is appended to message on every response.
| AccessToken | string Cognito access token. Required unless supplied as an |
| Authorization | string
|
| api-version | string Example: 20260417 Send |
{- "SubscriberToken": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "en-us",
- "PhoneNumber.E164": "string",
- "OperatorID": "string",
- "SubscriberManagedviaSSO": true,
- "Devices": [
- { }
], - "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "AdministrativeAccess": { },
- "DeviceCountOnline": 0,
- "DeviceCountOffline": 0,
- "KeyCount": 1,
- "KeyCountActive": 1,
- "KeysInKeyPools": {
- "property1": {
- "ssid": "string",
- "DisplayOrder": 1,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}
}, - "property2": {
- "ssid": "string",
- "DisplayOrder": 1,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "VenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "string",
- "Currency": "string",
- "CurrencySymbol": "string",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "string",
- "SubscriberManagedviaSSO": true,
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": { },
- "SMSCode": "string",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}
}
}, - "Devices": { }
}
}
}, - "AllDevices": {
- "property1": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}, - "property2": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}
}, - "RegisteredDevices": [
- { }
], - "messages_from_venues": {
- "property1": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}, - "property2": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}
}, - "StripeCustomerID": "string",
- "message": "string",
- "errorProcessing": true
}Exchanges a refresh token for a fresh token set via the identity provider — no password re-entry.
What actually authorizes this: the refresh token, verified by the identity provider. The access token sent alongside it is NOT verified here (no signature/expiry/sign-out check) — it's decoded only to read the user name needed to address the refresh, and is expected to be expired in normal use.
A provider refusal is not an error status — the response is 200 with an empty message and no AuthenticationResult. Clients MUST treat the absence of AuthenticationResult, not the HTTP status, as failure. The same empty 200 covers an operator with no identity-provider configured and an unexpected internal failure.
On success, the new tokens are nested one level deeper than the property name suggests: AuthenticationResult.AuthenticationResult.
| RefreshToken required | string The refresh token to exchange. This is the credential for the operation. An absent or empty value is rejected 401 |
| AccessToken | string The account's access token, supplied here or as an |
{- "RefreshToken": "string",
- "AccessToken": "string"
}{- "AuthenticationResult": {
- "AuthenticationResult": { },
- "ChallengeParameters": { }
}, - "message": "",
- "errorProcessing": false
}Signs the calling subscriber out everywhere — evicts the presented token and every other cached token for the account, sets a global sign-out marker (tokens issued BEFORE this instant are refused elsewhere in the API until they expire), and asks the identity provider to revoke refresh tokens on every device. A fresh login moments later is unaffected.
Authorization: the token must resolve to a subscriber identity — the only role test on this operation, with no anonymous path. The account signed out is always the token's own account; no request field can name a different one.
Idempotent and always reports success: signing out an already-signed-out account succeeds again, and the identity-provider result isn't inspected — even if refresh-token revocation fails there, this still returns 200.
Messages localize to Spanish for Accept-Language: es*.
| AccessToken | string The access token to sign out. Required unless it is supplied as an |
| IdToken | string Optional companion identity token. When present it, rather than the access token, is verified against the operator's identity pool to establish who the caller is; the account to sign out is still taken from the access token's own user-name claim, so a request whose identity token verifies but whose access token carries no user name is rejected. |
{- "AccessToken": "string",
- "IdToken": "string"
}{- "message": "string",
- "errorProcessing": false
}Give one of your Wi-Fi keys a name of your own.
Only the key's own subscriber can rename it — any other authenticated caller's request is accepted, returns 200, and changes nothing (indistinguishable from a no-op except by the empty message).
Send psk (the key's own PSK) to target the key; without it, a subscriber with more than one active subscription gets a silent no-op.
The name is validated, not cleaned up — HTML/whitespace/length are checked, and any correction needed triggers a rejection (Invalid characters in UserFriendlySubscriptionID.) rather than silently truncating.
Renaming to the current name is a no-op. This is one entry point onto the shared subscription-configuration operation — other subscription fields sent in the same body are applied too, where the caller is permitted.
A missing or non-JSON body fails with 502, not a normal 4xx refusal — always send a JSON object.
| Authorization | string
|
| Accept-Language | string Example: es-XL A first tag beginning |
| AccessToken | string Cognito access token. Required unless supplied as an |
| KeyTag | string <= 40 characters The name to give the key. 1 to 40 characters; it must contain no HTML markup or entities and no leading or trailing whitespace, because the value is rejected rather than cleaned. Omitting it means no rename is attempted. |
| psk | string The pre-shared key of the subscription to rename, exactly as it appears in the key listing. Strongly recommended: without it the rename is applied only when the caller holds exactly one active subscription. |
| OperatorID | string Required only for a network-software-provider caller; omitting it is a 401 for that caller and it is ignored for everyone else. Note that such a caller cannot perform a rename regardless. |
| VenueID | string Read only to decide whether the caller holds a venue role over that venue. It does not select the subscription, and a venue caller cannot rename a key either. Format |
| SubscriberToken | string Names the target subscriber for an operator or venue caller. A subscriber caller does not need it: any target selector a subscriber sends is ignored and replaced with their own identity, so a subscriber can only ever address their own keys. |
| externalSubscriberID | string Alternative target-subscriber selector for an operator or venue caller, used when |
| EmailAddress | string <email> Alternative target-subscriber selector for an operator or venue caller, matched case-insensitively. |
| PhoneNumber.E164 | string Alternative target-subscriber selector for an operator or venue caller. Only the dotted form is recognised as a selector here. |
{- "AccessToken": "string",
- "KeyTag": "Study",
- "psk": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string"
}{- "message": "string",
- "errorProcessing": false
}Sets the friendly label on one of the calling subscriber's registered devices, identified by its MAC. Stored in the device cache, not on the subscription record.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a network-operator admin, or (for any token carrying a subscriber identity) the subscriber themself. No venue-scoped branch — venue staff can only act as their own subscriber identity, if they have one.
The MAC is normalized (lower-cased, separators stripped) before matching — a MAC not among the caller's registered devices is refused 'Device not found. '.
The label is HTML-escaped, trimmed and truncated to 40 characters AFTER escaping — a label containing anything that looks like an HTML tag/entity is rejected outright rather than cleaned up. Must also be unique across the caller's own devices, INCLUDING the device's own current label — re-sending the existing label is a rejection, not a no-op.
Success returns an empty message — the presence of Calling-Station-Id/UserDefinedHostName in the body, not the message text, is what confirms the rename.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. On this operation it affects only 'AccessToken Missing. ', 'OperatorID Missing. ', 'Access Denied. ' and 'Subscriber not found.'; every device and label message is a hardcoded English literal that never localizes. |
| AccessToken | string Cognito access-token JWT. May instead be supplied as |
| Calling-Station-Id required | string MAC address of the device to rename, with or without ':' or '-' separators and in any case; it is normalised to lower-case with separators removed before lookup and storage. Any falsy value (absent, empty string, 0) gives 401 'Calling-Station-Id not found. '. A MAC that is not one of the caller's registered devices gives 401 'Device not found. '. |
| UserDefinedHostName required | string <= 40 characters The new label. Absent or empty gives 401 'UserDefinedHostName not found. '. A value containing an HTML tag or an HTML entity is rejected 401 'Invalid characters in UserDefinedHostName.' rather than sanitised. Otherwise it is HTML-escaped, trimmed and cut to 40 characters - if that leaves nothing, 401 'UserDefinedHostName not found. '. It must not equal a label already carried by any of the caller's devices, including the device being renamed - re-sending that device's current label gives 401 'Duplicate UserDefinedHostName. ' and writes nothing. |
| SubscriberToken | string IGNORED when the caller's own token carries a subscriber identity - it is overwritten with the caller's own. It identifies the target device owner only for operator and provider callers. |
| EmailAddress | string <email> IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers. Lower-cased by the shared request sanitiser before lookup. |
| PhoneNumber.E164 | string IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers, in which case it is also copied onto a PhoneNumber property before lookup. |
| externalSubscriberID | string IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers, by the operator's own identifier for them. |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider, in which case its absence gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and removed from the body before the rename runs. |
| property name* additional property | any |
{- "AccessToken": "string",
- "Calling-Station-Id": "02:00:00:00:00:01",
- "UserDefinedHostName": "Study Laptop",
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "OperatorID": "string"
}{- "message": "",
- "Calling-Station-Id": "020000000001",
- "UserDefinedHostName": "Study Laptop",
- "errorProcessing": false
}Sets, changes or removes the end date of one of the signed-in subscriber's own subscriptions. Not limited to cancelling — sending an empty NewEndDateTimeUTC.ISO8601 removes a future end date, un-cancelling a pending cancellation.
Always scoped to the caller's own subscription — any SubscriberToken in the body is overridden by the authenticated identity (the one exception: a supplied externalSubscriberID that resolves to exactly one subscriber of this operator replaces the caller for the request — send it only for your own account).
Selecting the subscription: exactly one non-ended subscription must match; narrow with VenueID, UnitID_internal, etc. if the subscriber holds more than one.
End date: endImmediately (loosely compared) ends the subscription now and overrides NewEndDateTimeUTC.ISO8601; otherwise the date is required (or send it empty to remove an existing future end date). For a wired unit, a non-immediate end is pushed to end-of-day in the venue's local time zone unless doNotResetDatetoMidnight is exactly true.
Refunds: if permitted and the current billing cycle hasn't ended, remaining whole hours are refunded (capped by what's refundable on the last invoice); requestedRefundAmount overrides the pro-rated figure. A refund Stripe rejects does NOT fail the call — 200 with an error message instead. During a zero-priced trial, the end date moves to the trial's end instead of refunding.
A subscriber managed through external SSO cannot use this operation.
| Origin required | string Must be the console origin of the operator the subscriber belongs to. Absent, or not resolvable to exactly one known operator domain, is refused with 401 'Forbidden. '. |
| Partner-Integration-Channel | string Marks the call as machine-to-machine API access, which skips the external-SSO refusal. It changes no other check. |
| AccessToken required | string Cognito access token for the signed-in subscriber. Required; the request is refused without it whenever the operator has console sign-on configured. |
| NewEndDateTimeUTC.ISO8601 | string The new end instant, as an ISO-8601 string. Required unless endImmediately is set. Send it EMPTY to remove an existing future end date instead of setting one. Cannot carry format date-time because the empty string is a meaningful value. |
boolean or string or integer Ends the subscription at the moment of the request and overrides NewEndDateTimeUTC.ISO8601. Compared loosely: true, 'true' and 1 all trigger it; anything else leaves it off. | |
| doNotResetDatetoMidnight | boolean Only meaningful for a wired unit with a non-immediate end date. Exactly the boolean true keeps the end instant as supplied; any other value lets it be moved to end of day in the venue's local time zone. |
| VenueID | string Narrows the search to one venue when the subscriber holds several subscriptions. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| UnitID_internal | string Narrows the search to one unit. Highest-selectivity narrowing field after SetupIntentId. |
| UnitID | string Narrows the search by the unit number/name as recorded on the subscription. |
| UnitBuilding | string Narrows the search by building. |
| UnitFloor | string Narrows the search by floor. |
| externalVenueID | string Narrows the search by the operator's own venue identifier. |
| externalVenueUnitID | string Narrows the search by the operator's own unit identifier. |
| SetupIntentId | string Selects the subscription directly by its subscription identifier. Ignored when StripeClientSecret is supplied. |
| StripeClientSecret | string Selects the subscription by the client secret recorded on it. Takes precedence over SetupIntentId. The literal string 'undefined' is ignored. |
| externalSubscriberID | string CAUTION: this field selects WHICH SUBSCRIBER the request acts on. Trimmed to 64 characters and resolved against this operator's subscribers; a single match replaces the caller's own identity for the rest of the request, and a value matching more than one subscriber is refused. Omit it unless it is your own. |
integer or string Requested refund in the smallest currency unit. Honoured when it parses to a positive integer, and still capped at the amount that remains refundable on the last invoice. Absent means the refund is pro-rated from the hours remaining in the billing cycle. | |
| CancellationReasons | Array of strings Free-text reasons recorded on the subscription and forwarded on the webhook event. Anything that is not a non-empty array is stored as an empty list. |
| SubscriberToken | string Ignored. It is overwritten with the signed-in subscriber's own identity before the subscription is looked up. |
| EmailAddress | string <email> Not used to select the subscription while the signed-in identity is available. |
{- "AccessToken": "<Cognito access token>",
- "VenueID": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "NewEndDateTimeUTC.ISO8601": "2026-12-31T23:59:59.999Z",
- "CancellationReasons": [
- "<reason>"
]
}{- "message": "Subscription end date updated to 2026-12-31T23:59:59.999Z",
- "EndDateTimeUTC.ISO8601": "2026-12-31T23:59:59.999Z",
- "errorProcessing": false
}Returns invoice/payment history as a Payments array plus record counts and per-currency totals. Read-only, apart from a best-effort receipt-URL lookup for rows missing one.
Who may call it: an access token is mandatory (no anonymous access). Classified in order: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), or Subscriber — whichever the token matches first.
Scope: a Subscriber caller (including a staff token that doesn't match its intended role) always sees only their own history; other identifiers in the request can only narrow it further, never widen it. Operator/venue callers may target a subscriber via externalSubscriberID, EmailAddress or PhoneNumber.E164.
Date window: defaults to the last 2 years when no lower bound is sent — this does NOT return full history by default. An unparseable bound is silently ignored. Rows with no invoice date are always included.
Size guard: if more than 2000 records match, Payments is emptied and message explains why; PaymentCount becomes 0 but NonZeroPaymentCount still reflects the real (pre-emptying) tally.
| AccessToken | string Access token identifying the caller. Required unless it is supplied as an |
| IdToken | string Optional companion identity token. When present it, rather than the access token, is verified against the operator's identity pool to establish who the caller is. |
| OperatorID | string Required ONLY for a network-software-provider caller, for whom it selects the operator whose invoices are read; it is consumed as the operator context and never used as a row filter. Ignored for every other caller. |
| SubscriberToken | string Restrict to one subscriber. Sent by a subscriber caller it is overwritten with the caller's own identity, so it can neither broaden nor redirect the query. |
| externalSubscriberID | string Operator's own subscriber identifier. Used to resolve a subscriber when no |
| EmailAddress | string <email> Subscriber e-mail. Lower-cased before use. Resolves a subscriber when no |
| PhoneNumber.E164 | string Subscriber phone in E.164 form. For operator- and venue-level callers it is also promoted to the subscriber-resolution input; for a subscriber caller it acts only as an exact-match filter on the row's stored phone. |
| StripeCustomerID | string Payment-provider customer identifier. Selects the read when no subscriber identity is in play, and is an exact-match filter in all cases. |
| externalSubscriptionID | string Exact-match filter on the row's external subscription identifier. |
| VenueID | string Venue identifier. For a venue-level caller this is the value that must be covered by the token's venue role, and it is also applied as an exact-match filter, which is what confines such a caller to its own venue. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| externalVenueID | string Exact-match filter on the row's external venue identifier. |
| UnitID_internal | string Exact-match filter on the row's unit identifier. |
| externalVenueUnitID | string Exact-match filter on the row's external unit identifier. |
| ServicePlanID | string Exact-match filter on the row's service plan. |
| externalServicePlanID | string Exact-match filter on the row's external service-plan identifier. |
| MinInvoiceDateTimeUTC.ISO8601 | string Inclusive lower bound on the invoice date. Overrides |
| MaxInvoiceDateTimeUTC.ISO8601 | string Inclusive upper bound on the invoice date. Overrides |
| MinStartDateTimeUTC.ISO8601 | string Lower bound, used only when |
| MaxStartDateTimeUTC.ISO8601 | string Upper bound, used only when |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "StripeCustomerID": "string",
- "externalSubscriptionID": "string",
- "VenueID": "PMGID._V3VENUE_.USA.STATE.POSTALCODEID.VENUENAMEID.CITYID",
- "externalVenueID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "MinInvoiceDateTimeUTC.ISO8601": "string",
- "MaxInvoiceDateTimeUTC.ISO8601": "string",
- "MinStartDateTimeUTC.ISO8601": "string",
- "MaxStartDateTimeUTC.ISO8601": "string"
}{- "PaymentCount": 0,
- "NonZeroPaymentCount": 0,
- "Payments": [
- {
- "dateAddedUTC.ISO8601": "string",
- "InvoiceDateTimeUTC.ISO8601": "string",
- "PaymentSuccessDateTimeUTC.ISO8601": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "StripeCustomerID": "string",
- "StripePaymentIntentId": "string",
- "StripeClientSecret": "string",
- "EmailAddress": "string",
- "PhoneNumber.E164": "string",
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "BillingCycleHours": 0,
- "UploadKbps": 0,
- "DownloadKbps": 0,
- "Currency": "string",
- "CurrencySymbol": "string",
- "ConcurrentDevices": 0,
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "externalVenueID": "string",
- "VenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "StripeReceiptURL": "string",
- "StripeRefundReceiptURL": "string",
- "StripePaymentChargeId": "string",
- "CancellationSource": "string",
- "CancellationReasons": [
- "string"
], - "BillingCyclePriceAdjustment": 0,
- "BillingCycleAdjustmentReasons": [
- "string"
], - "property1": 0,
- "property2": 0
}
], - "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "PricePerDownloadGbps.USD": 0,
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "MinInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "message": "string",
- "errorProcessing": false,
- "property1": 0,
- "property2": 0
}Raises a support ticket on the ConnectWise PSA instance configured for the caller's venue, and attaches the issue text as a note.
Always scoped to the caller's own subscription — matched by the authenticated account's email against active, set-up, non-ended subscriptions at the given VenueID. contactEmailAddress/EmailAddress only set the ticket's contact info, never used to find the subscription. Exactly one matching subscription must exist.
VenueID is required — VAULTID is accepted as an alias but only VenueID is actually used for the lookup, so sending VAULTID alone will not find a subscription.
Silent no-op: if the venue lacks a complete ConnectWise configuration, or any ConnectWise call fails, no ticket is created and the call still succeeds with an empty result.
⚠ This operation returns a JSON ARRAY, not an object. On success: index 0 is an internal object not part of the contract, index 1 is the created ticket (or {} if none was created). A validation rejection returns a ONE-element array with no message/errorProcessing at all — branch on the HTTP status code, not the body, for those. Earlier rejections (bad token, malformed body) return a normal object instead.
| Origin required | string Must be the console origin of the operator the subscriber belongs to. Absent, or not resolvable to exactly one known operator domain, is refused with 401 'Forbidden. '. |
| Partner-Integration-Channel | string Marks the call as machine-to-machine API access. It does not change any check this operation performs. |
| AccessToken required | string Cognito access token for the signed-in subscriber. Required; the request is refused without it whenever the operator has console sign-on configured. |
| contactName required | string Required. Recorded as the ticket contact and as the author of the note. Refused if absent or empty, and refused if it contains anything that looks like an HTML tag or an HTML entity. Otherwise trimmed and truncated to 40 characters. |
| contactEmailAddress | string <email> Contact e-mail recorded on the ticket. Either this or EmailAddress must be present; when both are, this one wins and replaces EmailAddress. Must be a valid e-mail address. Not used to select the subscription. |
| EmailAddress | string <email> Alternative to contactEmailAddress, used only when that field is absent. Must be a valid e-mail address. Lower-cased before use. Not used to select the subscription - the subscription is always found through the authenticated account. |
| summary required | string Required. One-line ticket subject. HTML-escaped, then trimmed and truncated to 100 characters. Also used as the note text when Description is absent. |
| VenueID | string The venue the subscription is. Required in practice: it is the only field the subscription lookup reads. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| VAULTID | string The venue key used to read the venue's ConnectWise configuration and to select its VAULT-UI company configurations. Defaults to VenueID when omitted. Supplying VAULTID without VenueID satisfies the presence check but leaves the subscription lookup with nothing to query, so the request is then always refused. |
| unitID | string Optional. When present the subscription must be the one for exactly this unit, and the same value is used as the ConnectWise UNIT configuration id whose name is recorded on the ticket. When absent, the subscriber must have exactly one qualifying unit at the venue. |
| VAULTUnitID | string Optional, used only when unitID is absent. Matched case-insensitively against the answers of the ConnectWise UNIT configurations' questions whose text contains 'VAULT'; a match records that configuration's name and site on the ticket. No effect on which subscription is selected. |
| CustomUnit | string Optional free-text unit label. Used only on the unitID branch, and only when ConnectWise returns no UNIT configuration for that id. |
| Description | string Optional. The body of the note attached to the ticket. Falls back to summary when absent. Not escaped or truncated. |
| PrefContactMethod | string Optional. When present it is placed on its own line above the note text. |
| TicketType | string Optional ConnectWise ticket type name. |
| TicketSubType | string Optional ConnectWise ticket sub-type name. Only applied when TicketType is also supplied. |
| contactPhoneNumber | string Optional. Recorded on the ticket as the contact phone number, verbatim. |
| serviceboardid | string Optional ConnectWise service board id. Consulted only when the venue's own configured board id is present but is not a positive number. The string 'undefined' is ignored. |
{- "AccessToken": "<Cognito access token>",
- "contactName": "<contact name>",
- "contactEmailAddress": "subscriber@example.com",
- "summary": "<short description of the issue>",
- "VenueID": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "Description": "<full description of the issue>"
}[- {
- "<internal request context - not part of the API contract>": "..."
}, - {
- "id": 12345,
- "summary": "<short description of the issue>"
}
]Returns one subscriber's Wi-Fi data usage for the trailing 7 days as a fixed hourly series (~168 entries, oldest first, zero-filled for idle hours). Each entry's timestamp marks the END of the hour it covers, so the final entry is stamped up to an hour ahead of the request. Read-only.
Whose usage: a token with no operator/venue role but a subscriber identity always reads its OWN usage (request identifiers are ignored). A NetworkOperator caller may name a subscriber via SubscriberToken/externalSubscriberID/EmailAddress/PhoneNumber.E164. A Venue-role caller must send a VenueID it holds, and is confined to subscribers with a subscription at one of its venues. If no identifier is sent, the caller's own usage is returned regardless of role.
Two fields that don't filter: VenueID never narrows the totals; Calling-Station-Id only replaces the reported device list per hour, not the byte totals.
GET and POST are served by the same implementation and return identical output for the same subscriber; GET reads parameters from the query string and its response also adds Cache-Control: private, max-age=5.
| Origin required | string Must be the console origin of the operator the request belongs to; an absent or unrecognised Origin is refused with 401. |
| Authorization | string Bearer |
| Accept-Language | string A value beginning with 'es' returns the localisable rejection messages in Spanish; anything else returns them in English. |
| AccessToken | string Cognito access token for the caller. Required unless the same token is sent as an Authorization: Bearer header, which takes precedence over this field. Missing from both is refused. |
| OperatorID | string Required only when the caller is a network-software-provider console user (a token with no subscriber identity, on an origin that belongs to a software provider); omitting it is then refused. Every other caller has the operator derived from the Origin header and this field is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| SubscriberToken | string Identifies the subscriber to report on. Highest precedence of the four identifying fields, and used exactly as supplied. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| externalSubscriberID | string The operator's own identifier for the subscriber. Used when SubscriberToken is absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| EmailAddress | string <email> Subscriber e-mail; matched case-insensitively. Used when SubscriberToken and externalSubscriberID are absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| PhoneNumber.E164 | string Subscriber phone number in E.164. Lowest precedence, and honoured only for network-software-provider, network-operator and venue callers. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| VenueID | string Grants access to a venue administrator or leasing agent whose role list contains this venue, and confines that caller to subscribers of its own venues. It does NOT filter the usage figures. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| Calling-Station-Id | string A device MAC address. Separators ':' and '-' are stripped and the value is lower-cased. It does NOT filter the byte totals: its only effect is that each hour's Calling-Station-Id array reports this one value instead of the devices actually seen. |
{- "AccessToken": "<Cognito access token>"
}{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Returns one subscriber's Wi-Fi data usage for the trailing 7 days as a fixed hourly series (~168 entries, oldest first, zero-filled for idle hours). Each entry's timestamp marks the END of the hour it covers, so the final entry is stamped up to an hour ahead of the request. Read-only.
Whose usage: a token with no operator/venue role but a subscriber identity always reads its OWN usage (request identifiers are ignored). A NetworkOperator caller may name a subscriber via SubscriberToken/externalSubscriberID/EmailAddress/PhoneNumber.E164. A Venue-role caller must send a VenueID it holds, and is confined to subscribers with a subscription at one of its venues. If no identifier is sent, the caller's own usage is returned regardless of role.
Two fields that don't filter: VenueID never narrows the totals; Calling-Station-Id only replaces the reported device list per hour, not the byte totals.
GET and POST are served by the same implementation and return identical output for the same subscriber; GET reads parameters from the query string and its response also adds Cache-Control: private, max-age=5.
| AccessToken | string Example: AccessToken=<Cognito access token> Cognito access token for the caller. Required unless the same token is sent as an Authorization: Bearer header, which takes precedence over this field. Missing from both is refused. |
| OperatorID | string Example: OperatorID=<Country>.<State>.<PostalCode_ID>.<OperatorName_ID>.<City_ID> Required only when the caller is a network-software-provider console user (a token with no subscriber identity, on an origin that belongs to a software provider); omitting it is then refused. Every other caller has the operator derived from the Origin header and this field is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| SubscriberToken | string Example: SubscriberToken=<SubscriberToken> Identifies the subscriber to report on. Highest precedence of the four identifying fields, and used exactly as supplied. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| externalSubscriberID | string Example: externalSubscriberID=<operator's own subscriber id> The operator's own identifier for the subscriber. Used when SubscriberToken is absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com Subscriber e-mail; matched case-insensitively. Used when SubscriberToken and externalSubscriberID are absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| PhoneNumber.E164 | string Example: PhoneNumber.E164=+15555550100 Subscriber phone number in E.164. Lowest precedence, and honoured only for network-software-provider, network-operator and venue callers. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| VenueID | string Example: VenueID=<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID> Grants access to a venue administrator or leasing agent whose role list contains this venue, and confines that caller to subscribers of its own venues. It does NOT filter the usage figures. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| Calling-Station-Id | string Example: Calling-Station-Id=AA:BB:CC:DD:EE:FF A device MAC address. Separators ':' and '-' are stripped and the value is lower-cased. It does NOT filter the byte totals: its only effect is that each hour's Calling-Station-Id array reports this one value instead of the devices actually seen. |
| Origin required | string Must be the console origin of the operator the request belongs to; an absent or unrecognised Origin is refused with 401. |
| Authorization | string Bearer |
| Accept-Language | string A value beginning with 'es' returns the localisable rejection messages in Spanish; anything else returns them in English. |
{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Returns a summary of the card/wallet saved against ONE of the calling subscriber's subscriptions — funding type, brand, expiry, last four digits. No full card number or provider identifier is returned; nothing is written.
Who may call it: only the subscriber themself — the lookup is forced to the token's identity, so a SubscriberToken in the body can't be used to read someone else's card.
Choosing the subscription: StripeClientSecret must match exactly one non-ended subscription of the caller. Zero or multiple matches both return 200 with an essentially empty body — check for the presence of card, not the status.
No card on file (or no usable payment-provider credentials) also returns 200 with card present but empty.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. On this operation it affects only 'AccessToken Missing. ' and 'Access Denied. '; 'StripeClientSecret missing from request. ' is a hardcoded English literal. |
| AccessToken | string Cognito access-token JWT of the subscriber. May instead be supplied as |
| StripeClientSecret required | string The payment client secret stored on the subscription whose saved card you want, compared for exact equality against the caller's own non-ended subscriptions. Absent or empty gives 401 'StripeClientSecret missing from request. '. A value matching none - or more than one - of them returns 200 with an empty body rather than an error. |
| SubscriberToken | string IGNORED. It is overwritten with the subscriber identity carried by the access token before the lookup, so it cannot reach another subscriber's payment method. |
| property name* additional property | any |
{- "AccessToken": "string",
- "StripeClientSecret": "string",
- "SubscriberToken": "string"
}{- "SetupSuccessDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "card": {
- "funding": "string",
- "brand": "string",
- "exp_month": 1,
- "exp_year": 0,
- "last4": "string"
}, - "wallet": {
- "type": "string",
- "dynamic_last4": "string"
}, - "errorProcessing": false,
- "message": ""
}Returns one subscriber's Wi-Fi data usage for the trailing 7 days as a fixed hourly series (~168 entries, oldest first, zero-filled for idle hours). Each entry's timestamp marks the END of the hour it covers, so the final entry is stamped up to an hour ahead of the request. Read-only.
Whose usage: a token with no operator/venue role but a subscriber identity always reads its OWN usage (request identifiers are ignored). A NetworkOperator caller may name a subscriber via SubscriberToken/externalSubscriberID/EmailAddress/PhoneNumber.E164. A Venue-role caller must send a VenueID it holds, and is confined to subscribers with a subscription at one of its venues. If no identifier is sent, the caller's own usage is returned regardless of role.
Two fields that don't filter: VenueID never narrows the totals; Calling-Station-Id only replaces the reported device list per hour, not the byte totals.
GET and POST are served by the same implementation and return identical output for the same subscriber; GET reads parameters from the query string and its response also adds Cache-Control: private, max-age=5.
| Origin required | string Must be the console origin of the operator the request belongs to; an absent or unrecognised Origin is refused with 401. |
| Authorization | string Bearer |
| Accept-Language | string A value beginning with 'es' returns the localisable rejection messages in Spanish; anything else returns them in English. |
| AccessToken | string Cognito access token for the caller. Required unless the same token is sent as an Authorization: Bearer header, which takes precedence over this field. Missing from both is refused. |
| OperatorID | string Required only when the caller is a network-software-provider console user (a token with no subscriber identity, on an origin that belongs to a software provider); omitting it is then refused. Every other caller has the operator derived from the Origin header and this field is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| SubscriberToken | string Identifies the subscriber to report on. Highest precedence of the four identifying fields, and used exactly as supplied. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| externalSubscriberID | string The operator's own identifier for the subscriber. Used when SubscriberToken is absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| EmailAddress | string <email> Subscriber e-mail; matched case-insensitively. Used when SubscriberToken and externalSubscriberID are absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| PhoneNumber.E164 | string Subscriber phone number in E.164. Lowest precedence, and honoured only for network-software-provider, network-operator and venue callers. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it but no qualifying operator or venue role (see the description). |
| VenueID | string Grants access to a venue administrator or leasing agent whose role list contains this venue, and confines that caller to subscribers of its own venues. It does NOT filter the usage figures. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| Calling-Station-Id | string A device MAC address. Separators ':' and '-' are stripped and the value is lower-cased. It does NOT filter the byte totals: its only effect is that each hour's Calling-Station-Id array reports this one value instead of the devices actually seen. |
{- "AccessToken": "<Cognito access token>"
}{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Returns one subscriber's Wi-Fi data usage for the trailing 7 days as a fixed hourly series (~168 entries, oldest first, zero-filled for idle hours). Each entry's timestamp marks the END of the hour it covers, so the final entry is stamped up to an hour ahead of the request. Read-only.
Whose usage: a token with no operator/venue role but a subscriber identity always reads its OWN usage (request identifiers are ignored). A NetworkOperator caller may name a subscriber via SubscriberToken/externalSubscriberID/EmailAddress/PhoneNumber.E164. A Venue-role caller must send a VenueID it holds, and is confined to subscribers with a subscription at one of its venues. If no identifier is sent, the caller's own usage is returned regardless of role.
Two fields that don't filter: VenueID never narrows the totals; Calling-Station-Id only replaces the reported device list per hour, not the byte totals.
GET and POST are served by the same implementation and return identical output for the same subscriber; GET reads parameters from the query string and its response also adds Cache-Control: private, max-age=5.
| AccessToken | string Example: AccessToken=<Cognito access token> Cognito access token for the caller. Required unless the same token is sent as an Authorization: Bearer header, which takes precedence over this field. Missing from both is refused. |
| OperatorID | string Example: OperatorID=<Country>.<State>.<PostalCode_ID>.<OperatorName_ID>.<City_ID> Required only when the caller is a network-software-provider console user (a token with no subscriber identity, on an origin that belongs to a software provider); omitting it is then refused. Every other caller has the operator derived from the Origin header and this field is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| SubscriberToken | string Example: SubscriberToken=<SubscriberToken> Identifies the subscriber to report on. Highest precedence of the four identifying fields. Ignored only for a caller classified as a subscriber - that is, one whose token matches no network-operator role for the operator resolved from the Origin and no venue role for the supplied VenueID. A staff token carries a subscriber identity too, but is classified by its role first, so these fields ARE honoured for it. |
| externalSubscriberID | string Example: externalSubscriberID=<operator's own subscriber id> The operator's own identifier for the subscriber. Used when SubscriberToken is absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com Subscriber e-mail; matched case-insensitively. Used when SubscriberToken and externalSubscriberID are absent. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it. |
| PhoneNumber.E164 | string Example: PhoneNumber.E164=+15555550100 Subscriber phone number in E.164. Lowest precedence, and honoured only for network-software-provider, network-operator and venue callers. Ignored only for a caller classified as a subscriber (no matching network-operator role and no matching venue role); a staff token also carries a subscriber identity but is classified by its role first, so this field IS honoured for it. |
| VenueID | string Example: VenueID=<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID> Grants access to a venue administrator or leasing agent whose role list contains this venue, and confines that caller to subscribers of its own venues. It does NOT filter the usage figures. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| Calling-Station-Id | string Example: Calling-Station-Id=AA:BB:CC:DD:EE:FF A device MAC address. Separators ':' and '-' are stripped and the value is lower-cased. It does NOT filter the byte totals: its only effect is that each hour's Calling-Station-Id array reports this one value instead of the devices actually seen. |
| Origin required | string Must be the console origin of the operator the request belongs to; an absent or unrecognised Origin is refused with 401. |
| Authorization | string Bearer |
| Accept-Language | string A value beginning with 'es' returns the localisable rejection messages in Spanish; anything else returns them in English. |
{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Rotates a subscriber's Wi-Fi pre-shared key (PSK). You identify the CURRENT key, supply the NEW one, and the change is written across every one of that subscriber's set-up, non-ended subscriptions that carries the current key; the key-pool caches are then rebuilt so the new key starts authenticating and the old one stops. The new key is NOT echoed back - the response carries only a status message.
Who may call it. An access token is mandatory: it is read from Authorization: Bearer <JWT> (which overwrites any AccessToken in the body) or from the body, and if neither is present the call is refused 401 with 'AccessToken Missing. ' - there is no anonymous fallthrough on this operation. The token is then classified, in this order: a Network Software Provider (the operator resolved from the request Origin carries a provider id, and the token carries a username but no subscriber identity - such a caller MUST send OperatorID, else 401 'OperatorID Missing. '); a network-operator administrator whose token lists this operator under DomainAdministrator, AccountManager or CustomerSupport; or any token carrying a subscriber identity, which is treated as the subscriber acting on their own key. There is NO venue-scoped branch on this operation - a venue administrator or leasing agent is admitted only if their own token also carries a subscriber identity, and then only as that subscriber. Anything else is refused 401 'Access Denied. '.
Whose key is rotated. For a subscriber caller SubscriberToken, EmailAddress, PhoneNumber.E164 and externalSubscriberID in the body are ignored and the subscriber identity carried by the token is used instead, so the account cannot be selected by naming one. The account whose key is actually rotated is then derived from the current key you supply: with psk alone the match is narrowed to that subscriber's own subscriptions, but when CurrentKeyID is sent as well the narrowing is skipped and the target becomes whichever subscriber of this operator holds the supplied key. Those four fields are read only for operator and provider callers, and if such a caller sends none of them they too are reclassified as a subscriber and the call targets their own token (a provider token carries no subscriber identity at all, so that combination ends in 401 'Subscriber not found.').
Identifying the current key. Send psk - the current pre-shared key itself. CurrentKeyID, the WPA2 pairwise master key derived from it, remains accepted as a legacy alternative until 17 November 2026, after which only psk satisfies the check; it is resolved back to the PSK through a reverse-lookup cache and, failing that, by recomputing the key derivation over the subscriber's active keys across the SSIDs they are served on. A current key that does not resolve to exactly one subscription holder of this operator gives 401 'Current key not found.'.
Supplying the new key. Send either NewKey (the complete key) or UserPartForNewKey, from which the stored key is assembled as that value, a dot, and the subscriber's own token. Send exactly one of the two. As of 2026-08-24 an empty or null NewKey is no longer rejected as invalid characters - the charset check is skipped when the field is empty - so a UserPartForNewKey request succeeds whether NewKey is omitted, empty or null. Where the resolved StrictPSK is true for the target subscription (escalate-only: operator OR venue OR unit), a full NewKey is MANDATORY - UserPartForNewKey is refused there, because the assembled value contains a '.' and can never be StrictPSK-compliant. A missing NewKey in that case returns 401 'This subscription requires NewKey. UserPartForNewKey is not accepted where StrictPSK applies.'; a supplied NewKey failing the strict contract (8-63 characters, an uppercase, a lowercase, a digit and one special from !#+,-/:=@_ with no other non-alphanumeric, no '.', not starting with a special, no run of 8 identical characters) returns 401 'New key does not meet the StrictPSK requirement for this venue unit. ...'; and if that policy cannot be resolved the reset is refused 401 'Unable to verify the password policy for this subscription. Try again.' rather than proceeding.
dryRun runs every validation - length, character set, assembled format and uniqueness across the operator - and answers 200 'Strong Wi-Fi password. ' WITHOUT writing anything or rotating any key.
Two request-shape failures answer HTTP 200, not 4xx. Omitting the current-key identifier and omitting the new key are both reported as HTTP 200 with errorProcessing true and an explanatory message. Treat errorProcessing, not the HTTP status, as the outcome flag on this operation.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. It affects only the four translated rejections on this operation ('AccessToken Missing. ', 'OperatorID Missing. ', 'Access Denied. ', 'Subscriber not found.'); every key-validation and key-rotation message is a hardcoded English literal that does not localize. |
| AccessToken | string Cognito access-token JWT. May instead be supplied as |
| psk | string The CURRENT pre-shared key, and the supported way to identify the key being rotated. When it is sent without |
| CurrentKeyID | string LEGACY alternative to psk until 17 November 2026: the WPA2 pairwise master key for the current PSK, as a hex string. It is resolved back to the PSK through a reverse-lookup cache and, failing that, by recomputing the key derivation over the subscriber's active keys across the SSIDs they are served on. From that date it no longer satisfies the current-key requirement. |
| NewKey | string [ 8 .. 63 ] characters The complete new pre-shared key. Send this OR UserPartForNewKey. Longer than 63 characters gives 401 'NewKey cannot be more than 63 characters.'. Any value outside the WPA-permitted printable range - INCLUDING an empty string, a null, or any value shorter than 8 characters - gives 401 'NewKey has invalid characters.', so omit the property entirely when you are using UserPartForNewKey. After assembly the key must differ from the current key, and when it contains a dot whose final segment is longer than 5 characters that segment must be the target's own subscriber token, otherwise 401 'New key in incompatible format.'. |
| UserPartForNewKey | string <= 40 characters Alternative to NewKey: the stored key becomes this value, a dot, and the target subscriber's own token. Longer than 40 characters gives 401 'UserPartForNewKey cannot be more than 40 characters.'; characters outside the permitted printable range give 401 'UserPartForNewKey has invalid characters. It cannot contain a period.'. The assembled key must still be at least 8 and at most 63 characters. |
| dryRun | boolean Truthy runs every validation, including the operator-wide uniqueness check, and returns 200 'Strong Wi-Fi password. ' WITHOUT writing anything. This is a plain truthiness test, so the string '0' counts as true while the number 0 does not. It also suppresses the duplicate-key metric. |
| SubscriberToken | string IGNORED when the caller's own token carries a subscriber identity - the caller's own token is used instead and this value is overwritten. It identifies the target only for operator and provider callers. |
| EmailAddress | string <email> IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers. Lower-cased by the shared request sanitiser before lookup. |
| PhoneNumber.E164 | string IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers, in which case it is also copied onto a PhoneNumber property before lookup. |
| externalSubscriberID | string IGNORED for a subscriber caller; identifies the target subscriber only for operator and provider callers, by the operator's own identifier for them. |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider, in which case its absence gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and removed from the body before the key logic runs. |
| property name* additional property | any |
{- "AccessToken": "string",
- "psk": "string",
- "CurrentKeyID": "string",
- "NewKey": "stringst",
- "UserPartForNewKey": "string",
- "dryRun": true,
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "OperatorID": "string"
}{- "message": "Password reset successful.",
- "errorProcessing": false,
- "statusCode": 200
}Marks one message a venue sent to the calling subscriber as acknowledged.
Who may call it: only the subscriber the message belongs to — the target subscriber comes from the token and overwrites any identifier sent in the body, so this can only ever acknowledge the caller's own message.
MessageID is the key under which the message appears in messages_from_venues (from listKeys) — must be sent as a non-empty string.
Idempotent: re-acknowledging an already-acknowledged message returns the same success, unchanged.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. On this operation it affects only 'AccessToken Missing. ' and 'Access Denied. '; the success message, 'MessageID missing from request. ' and 'Message not found. ' are hardcoded English literals that never localize. |
| AccessToken | string Cognito access-token JWT of the subscriber. May instead be supplied as |
| MessageID required | string Identifier of the message to acknowledge, as returned in the subscriber's message list. Must be a non-empty string; absent, empty or non-string gives 401 'MessageID missing from request. '. A value that is not one of the caller's own messages gives 404 'Message not found. '. |
| SubscriberToken | string IGNORED. Whatever is sent here is overwritten with the subscriber identity carried by the access token before the message is looked up, so it cannot be used to reach another subscriber's message. |
| property name* additional property | any |
{- "AccessToken": "string",
- "MessageID": "string",
- "SubscriberToken": "string"
}{- "message": "Message acknowledged by subscriber. ",
- "errorProcessing": false
}Changes the service plan on one of the caller's own subscriptions and returns the resulting billing adjustment. Requires only a valid token — no role/admin access needed.
Selecting the subscription: filtered to the caller's own active subscriptions using unit/venue/external-id/Stripe identifiers; exactly one match is required (with no filters, the call only succeeds if the operator has exactly one active subscription for this caller).
The new plan must be offered at the subscription's venue and belong to the same operator; a differing billing cycle is adopted and the cadence re-anchored. Requesting the current plan is refused.
On success: the subscription is repriced (unused hours of the old cycle credited back, new hours valued at the new rate, net carried to the next invoice — capped so the next invoice never goes negative), bandwidth/device limits are rewritten, and the subscriber is notified. If the new plan costs money and there's no usable payment method, the subscription is flagged payment-failed.
⚠ Real billing consequences, not idempotent.
| AccessToken required | string Cognito access token of the calling subscriber, in the request BODY (this operation does not read an Authorization header). The user pool is resolved from the request Origin. A missing token is refused with 401 whenever the operator has a Cognito pool configured. |
| NewServicePlanID | string Identifier of the plan to move to. One of NewServicePlanID or NewExternalServicePlanID must be a non-empty string, otherwise the call is refused with 401. The plan must be offered at the matched subscription's venue and belong to the same operator. Its billing-cycle length need NOT match the current subscription's. |
| NewExternalServicePlanID | string Alternative to NewServicePlanID: the operator's own external identifier for the plan. Used only when NewServicePlanID is absent or empty. |
| UnitID_internal | string Selects the subscription by internal unit id. This is the most selective filter and is applied first when present. |
| UnitID | string Selects the subscription by the unit's display id. |
| UnitBuilding | string Narrows selection by building. |
| UnitFloor | string Narrows selection by floor. |
| externalVenueUnitID | string Narrows selection by the operator's external unit identifier. |
| VenueID | string Narrows selection to one venue. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| externalVenueID | string Narrows selection by the operator's external venue identifier. |
| externalSubscriberID | string Narrows selection by the operator's external subscriber identifier. |
| externalSubscriptionID | string Narrows selection by the operator's external subscription identifier. |
| StripeClientSecret | string Narrows selection by the subscription's stored Stripe client secret. |
| SetupIntentId | string Selects the subscription by its Stripe setup-intent / subscription id. Applied before every other filter when present. |
| Reason | string Optional free text recorded on the subscription's event history alongside the plan change. Not validated. |
| property name* additional property | any |
{- "AccessToken": "<cognito access token>",
- "NewServicePlanID": "<service plan id>",
- "UnitID_internal": "<internal unit id>"
}{- "message": "Service plan updated. ",
- "BillingCyclePriceAdjustment": -450,
- "NextInvoiceAdjustedAmount.USD": 2550,
- "NextInvoiceDateTimeUTC.ISO8601": "2026-09-15T00:00:00.000Z",
- "errorProcessing": false
}Returns activity-log entries for the CALLING subscriber's account only — a SubscriberToken naming someone else silently yields an empty result, never another subscriber's log.
Results are scoped to the caller's operator and a time window (newest first; no lower bound by default, upper bound defaults to just after 'now'); the window actually used is echoed back. Narrow further with the listed filters, a fuzzy free-text search, or (POST only) a raw search expression that replaces the individual filters. Each entry's Administrator field is expanded to Given Family (email) where recognizable.
The event field is always an object — structured entries as stored, plain-text entries wrapped as { message: <text> }. Read-only.
GET form: query parameters mirror the POST body, with two exceptions — customQuery can't be sent as a query string (silently ignored, but it still suppresses every other filter when present), and paging beyond the first page requires the POST form. Responses may be cached briefly by the client.
| AccessToken | string Cognito access token of the calling subscriber. May instead be supplied as 'Authorization: Bearer |
| MinViewWindowDateUTC.ISO8601 | string <date-time> Start of the window. Omitted means no lower bound at all - and in that case the total count stops being exact past 10000. An unparseable value is refused with 400. |
| MaxViewWindowDateUTC.ISO8601 | string <date-time> End of the window. Defaults to about a minute after 'now'. An unparseable value is refused with 400. |
| pageSize | integer <= 500 Default: 250 Entries per page. Defaults to 250 and is capped at 500. |
| searchBefore | Array of any Cursor from a previous response's searchBefore, to fetch the next page. |
| searchText | string Fuzzy full-text search across the entry text, operation name, administrator, source address, account token and log type. All supplied terms must match. |
object Raw search expression, applied instead of the individual filter fields below. It must be an object containing at least one of bool, match, term, terms, range, wildcard, regexp, exists or multi_match; an object carrying none of them is refused with 400. The operator scope and the date window are still applied on top of it. It does not lift the account scoping. A value that is NOT an object is neither applied nor refused: it is ignored as a search expression, but it still suppresses every individual filter field below, so the request returns 200 with those filters silently dropped. | |
string or Array of strings Exact-match filter on the operation that produced the entry. A single value or an array of values. | |
string or Array of strings Exact-match filter on the entry type. A single value or an array of values. | |
string or Array of strings Exact-match filter on the stored administrator value (matched before it is expanded for display). A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. For a subscriber caller the account is forced to their own regardless, so a value other than their own token simply produces an empty result. | |
string or Array of strings Exact-match filter on the venue. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. A single value or an array. | |
string or Array of strings Exact-match filter on the internal unit id. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
string or Array of strings Exact-match filter. A single value or an array. | |
| property name* additional property | any |
{- "AccessToken": "<cognito access token>",
- "pageSize": 50,
- "MinViewWindowDateUTC.ISO8601": "2026-07-01T00:00:00Z"
}{- "log": [
- {
- "@timestamp": "2026-08-18T14:03:11.204Z",
- "function_name": "/updatePII",
- "event": {
- "message": "Updated locale = en-us. "
}, - "Administrator": "<given> <family> (subscriber@example.com)",
- "SourceIP": "203.0.113.10",
- "SourceLocale": "en-us"
}
], - "currentCount": 1,
- "totalCount": 1,
- "pageSize": 250,
- "hasMore": false,
- "MinViewWindowDateUTC.ISO8601": null,
- "MaxViewWindowDateUTC.ISO8601": "2026-08-19T09:00:00.000Z",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "",
- "errorProcessing": false
}Returns activity-log entries for the CALLING subscriber's account only — a SubscriberToken naming someone else silently yields an empty result, never another subscriber's log.
Results are scoped to the caller's operator and a time window (newest first; no lower bound by default, upper bound defaults to just after 'now'); the window actually used is echoed back. Narrow further with the listed filters, a fuzzy free-text search, or (POST only) a raw search expression that replaces the individual filters. Each entry's Administrator field is expanded to Given Family (email) where recognizable.
The event field is always an object — structured entries as stored, plain-text entries wrapped as { message: <text> }. Read-only.
GET form: query parameters mirror the POST body, with two exceptions — customQuery can't be sent as a query string (silently ignored, but it still suppresses every other filter when present), and paging beyond the first page requires the POST form. Responses may be cached briefly by the client.
| AccessToken | string Cognito access token of the calling subscriber, as an alternative to the Authorization header. Missing in both places is refused with 401. |
| MinViewWindowDateUTC.ISO8601 | string <date-time> Start of the window. Omitted means no lower bound at all - and in that case the total count stops being exact past 10000. An unparseable value is refused with 400. |
| MaxViewWindowDateUTC.ISO8601 | string <date-time> End of the window. Defaults to about a minute after 'now'. An unparseable value is refused with 400. |
| pageSize | integer <= 500 Default: 250 Entries per page. Defaults to 250 and is capped at 500. |
| searchText | string Fuzzy full-text search across the entry text, operation name, administrator, source address, account token and log type. All supplied terms must match. |
| function_name | string Exact-match filter on the operation that produced the entry. |
| LogType | string Exact-match filter on the entry type. |
| Administrator | string Exact-match filter on the stored administrator value, matched before it is expanded for display. |
| AdministratorOS | string Exact-match filter. |
| AdministratorBrowser | string Exact-match filter. |
| SourceIP | string Exact-match filter. |
| SourceLocale | string Exact-match filter. |
| SubscriberToken | string Exact-match filter. For a subscriber caller the account is forced to their own regardless, so a value other than their own token simply produces an empty result. |
| VenueID | string Example: VenueID=PMG000._V3VENUE_.USA.ST.00000.VENUENAME.CITY Exact-match filter on the venue. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| UnitID_internal | string Exact-match filter on the internal unit id. |
| EquipmentID | string Exact-match filter. |
| KeyPoolID | string Exact-match filter. |
| ServicePlanID | string Exact-match filter. |
| Authorization | string 'Bearer |
{- "log": [
- {
- "@timestamp": "2026-08-18T14:03:11.204Z",
- "function_name": "/updatePII",
- "event": {
- "message": "Updated locale = en-us. "
}, - "Administrator": "<given> <family> (subscriber@example.com)",
- "SourceIP": "203.0.113.10",
- "SourceLocale": "en-us"
}
], - "currentCount": 1,
- "totalCount": 1,
- "pageSize": 250,
- "hasMore": false,
- "MinViewWindowDateUTC.ISO8601": null,
- "MaxViewWindowDateUTC.ISO8601": "2026-08-19T09:00:00.000Z",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "",
- "errorProcessing": false
}Sends the subscriber-console password-reset code — or, for an account that has never accepted the Terms and Conditions, the welcome message with its temporary password. Despite the name, this is the general subscriber password-reset module.
No authentication is required — an unauthenticated request is accepted and classified Public.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), Subscriber (always their own account only), or Public.
Delivery: NotificationChannel: "SMS" forces SMS to the subscriber's stored phone number (bypassing suppression) when one exists; otherwise email is sent. An EmailAddress/PhoneNumber in the request is only used to look the subscriber up, never as a destination.
Privacy for unauthenticated callers: a Public caller always gets the same 200 success body, whether or not the subscriber exists or is reachable — this prevents account enumeration. Authenticated callers get the real rejection instead.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional on this route. When non-empty the value is split on a space and element [1] is taken as the AccessToken, OVERWRITING any AccessToken in the request body. A value with no space yields undefined, which is then treated as no token at all - the request is processed as an anonymous Public call rather than rejected. |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) message catalogue, anything else US English. This affects the response 'message' text only. |
| AccessToken | string Cognito JWT access token. Optional. Overwritten by the Authorization header when that header is present. Verified only when the operator record carries a Cognito pool; a token that fails verification is rejected 401. |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and its preferred_username (or, failing that, its email resolved through the operator's email cache) identifies the caller. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller, which is rejected 401 'OperatorID Missing. ' without it. It then replaces the operator context and is removed from the request before the identifier lookups run. Ignored for every other caller. |
| VenueID | string Read only by the role check: a caller whose venue-level role list contains this exact VenueID is classified 'Venue'. It does NOT scope the reset and it is not required for operator-level callers - but a venue staff member who omits it is classified 'Subscriber' and resets their own password instead of the target's. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Identifies the target subscriber directly. Highest precedence of the four identifiers. Ignored for a caller classified 'Subscriber', whose own token always wins. |
| externalSubscriberID | string The operator's own subscriber identifier; resolved to a SubscriberToken. Used only when SubscriberToken is absent. |
| EmailAddress | string Subscriber email address; lower-cased and resolved to a SubscriberToken. Used only when SubscriberToken and externalSubscriberID are absent. Look-up only - the reset is delivered to the address stored on the subscriber record. |
| PhoneNumber | string Lowest precedence of the four identifiers. Note the un-dotted name: a 'PhoneNumber.E164' property is not read by this route. |
| NotificationChannel | string Passed straight through to the notification engine. The only value with an effect is the exact string 'SMS', which sends the code by SMS to the subscriber's stored phone number and bypasses every suppression flag - but only when the subscriber record has a phone number; without one the request falls back to email. Any other value, or none, sends email when the subscriber record has an email address. |
| Domain | string Read only when the resolved operator is the NetworkSoftwareProvider itself: it stages a second operator record for admin use. It does not select the operator whose subscriber is reset - use OperatorID for that. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "NotificationChannel": "string",
- "Domain": "string"
}{- "message": "Code to reset password sent to account. ",
- "errorProcessing": false,
- "statusCode": 200
}Complete e-commerce functionality for venue browsing, service selection, and checkout processes for prospective subscribers.
Lists service plans for the operator resolved from the request's origin header. Returns one of three shapes, selected by UnitID_internal first, then caller role:
UnitID_internal supplied (any caller, including unauthenticated): { "AvailableServicePlans": [...] }, narrowed by the unit's venue, active subscriptions and (for public/cart callers) self-signup rules.UnitID_internal, caller is operator staff: a bare JSON array of the operator's plans.UnitID_internal, any other caller: {} with errorProcessing: false — a 200, not a rejection.Authentication is optional; there's no role-based rejection for the public path — only a NetworkSoftwareProvider can be rejected on role grounds (missing/unresolvable OperatorID).
Filtering on shape 1: narrowed by the unit's existing subscription (wired units only), then the venue's configured plan list (globally-available plans always included; a venue with no configured list, or an unresolvable venue, shrinks to ONLY globally-available plans), then (public/cart callers only) self-signup, deprecated, low-bandwidth and name/description keyword filters.
Read-only. This path is an alias — served by the identical implementation as the other two listServicePlans routes.
| origin required | string Selects the operator whose configuration is read: the value, with a leading |
| Authorization | string
|
| api-version | string Integer api-version selector. It does not change which plans are returned. Sending a value below 20260417 (before the 2026-11-17 sunset) appends an advisory sentence about |
| Accept-Language | string Only the first tag is inspected and only its first two characters: a value beginning |
Optional. A body is parsed only when it is sent as a JSON string; anything else is treated as an empty object. A present-but-unparseable body is a 401, not a 400.
| AccessToken | string Cognito access token. OPTIONAL - without it the caller is public, which is the supported shopping-cart path when |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller - it names the target operator whose plans are listed, and omitting it is a 401. Ignored for every other caller. |
| UnitID_internal | string A non-empty value selects response shape 1 for ANY caller. It is looked up as the operator's unit record; a value that finds no unit does not error - the filters are simply skipped, and the operator's whole plan catalogue is returned unfiltered. |
| VenueID | string Read ONLY on the administrator bare-array shape - it is ignored when |
| externalServicePlanID | string Read ONLY on the administrator bare-array shape. Compared with loose equality against each plan's |
| ShoppingCartEnabled | boolean Read only on shape 1, and only when it is exactly the JSON boolean |
| IdToken | string Cognito id token. It is consulted ONLY when an |
{- "AccessToken": "string",
- "OperatorID": "string",
- "UnitID_internal": "string",
- "VenueID": "string",
- "externalServicePlanID": "string",
- "ShoppingCartEnabled": true,
- "IdToken": "string"
}[ ]Lists service plans for the operator resolved from the request's origin header. Returns one of three shapes, selected by UnitID_internal first, then caller role:
UnitID_internal supplied (any caller, including unauthenticated): { "AvailableServicePlans": [...] }, narrowed by the unit's venue, active subscriptions and (for public/cart callers) self-signup rules.UnitID_internal, caller is operator staff: a bare JSON array of the operator's plans.UnitID_internal, any other caller: {} with errorProcessing: false — a 200, not a rejection.Authentication is optional; there's no role-based rejection for the public path — only a NetworkSoftwareProvider can be rejected on role grounds (missing/unresolvable OperatorID).
Filtering on shape 1: narrowed by the unit's existing subscription (wired units only), then the venue's configured plan list (globally-available plans always included; a venue with no configured list, or an unresolvable venue, shrinks to ONLY globally-available plans), then (public/cart callers only) self-signup, deprecated, low-bandwidth and name/description keyword filters.
Read-only. This path is an alias — served by the identical implementation as the other two listServicePlans routes.
| AccessToken | string Cognito access token. OPTIONAL - without it the caller is public, which is the supported shopping-cart path when |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller - it names the target operator whose plans are listed, and omitting it is a 401. Ignored for every other caller. |
| UnitID_internal | string A non-empty value selects response shape 1 for ANY caller. It is looked up as the operator's unit record; a value that finds no unit does not error - the filters are simply skipped, and the operator's whole plan catalogue is returned unfiltered. |
| VenueID | string Read ONLY on the administrator bare-array shape - it is ignored when |
| externalServicePlanID | string Read ONLY on the administrator bare-array shape. Compared with loose equality against each plan's |
| ShoppingCartEnabled | string Accepted but INERT on the GET form. It is honoured only when it is exactly the JSON boolean |
| origin required | string Selects the operator whose configuration is read: the value, with a leading |
| Authorization | string
|
| api-version | string Integer api-version selector. It does not change which plans are returned. Sending a value below 20260417 (before the 2026-11-17 sunset) appends an advisory sentence about |
| Accept-Language | string Only the first tag is inspected and only its first two characters: a value beginning |
[ ]Public (unauthenticated) shopping-cart entry point for starting or resuming a subscription setup — the operator is resolved from Origin, not a token.
Two shapes: with StripeClientSecret, re-opens an existing setup (returns the pending Stripe setup-intent, starts a payment-method update, or — if setup already completed — reports the completed state with no Stripe secret to open). Without it, delegates to the standard subscription-creation flow: finds/creates the subscriber, resolves the venue unit, validates the service plan, and either returns a pre-existing subscription or creates a new one with a Stripe setup intent.
Cart-safe response: this route never returns psk, SubscriberToken, unit or service-plan details, or other subscriber PII — those fields are stripped before the response is sent, win or lose.
⚠ Creating a new subscriber without GivenName AND without a caller-supplied externalSubscriberID is rejected. contactpref_sms IS persisted for a new subscriber.
| StripeClientSecret | string Shape (1). When present (length > 0) the subscription is looked up on the OperatorID-StripeClientSecret index and no new subscription is created. Exactly one match is required, otherwise 401 'Invalid subscription. '. This is a Stripe value - the client_secret of the Stripe SetupIntent, stored and expected to start with 'seti_'. |
| updatePaymentMethod | boolean Shape (1) only. Strictly true starts a new Stripe setup intent for a payment-method update. |
| EmailAddress | string <email> Shape (2) subscriber identifier. One of EmailAddress / PhoneNumber.E164 / SubscriberToken / externalSubscriberID is required, else 401 'EmailAddress, PhoneNumber.E164, SubscriberToken or externalSubscriberID missing from request. ' (401). Sanitized by request validation, which lowercases, strips characters outside [a-z0-9._%+-@] and then runs an email address; a null result returns 401 'Email Address validation failed' - note the space in 'Email Address'. |
| PhoneNumber.E164 | string Shape (2) subscriber identifier / SMS OTP destination. Compared against the number already on the account to compute phoneNumberDifferent. The value 'null' anywhere in the string causes the field to be dropped. |
| PhoneNumber | string Alternate spelling the cart posts; used only for the phoneNumberDifferent comparison. |
| SubscriberToken | string Shape (2) subscriber identifier. Format: an 8-character token generated by the platform. NOTE: on this unauthenticated route a supplied SubscriberToken can never update the subscriber - caller_may_update_subscriber is false for function_name 'vault_shoppingcart'. A SubscriberToken that does not resolve to a subscriber of this operator also blocks new-subscriber creation: the token is simply deleted and no account is opened. |
| externalSubscriberID | string Shape (2) subscriber identifier. On the new-subscriber path it is trimmed to 40 characters, NOT 64. It is NOT sanitized anywhere before that point on this route, so a value containing an HTML tag or entity is rejected with 401 'Invalid characters in externalSubscriberID.' (401). When present it also satisfies the GivenName requirement: copies it into GivenName. |
| GivenName | string CONDITIONALLY REQUIRED. When the call creates a new subscriber and neither GivenName nor a caller-supplied externalSubscriberID is present, the request is rejected with 401 'GivenName missing from request' (401 - no trailing space and no full stop). The crypto.randomUUID assigned at does NOT satisfy the fallback: it lands on Subscriber.externalSubscriberID, while tests the request's externalSubscriberID. Sanitized with request validation; when sanitization empties the value the call returns 401 'GivenName validation failed'. |
| FamilyName | string Family name for a newly created subscriber. Sanitized with request validation; when sanitization empties the value the call returns 401 'FamilyName validation failed'. When absent it defaults to GivenName. |
| UnitID_internal | string Shape (2). Primary way to identify the venue unit; resolved directly and checked against the operator's venues. Not found returns 401 'ERROR: UnitID_internal not found. '. Format: {VenueID}.{UnitID}.{UnitBuilding}.{UnitFloor}, each of the last three uppercased and stripped of characters outside [A-Za-z0-9_-]. |
| externalVenueUnitID | string Shape (2) alternative unit identifier. |
| VenueID | string Shape (2). Narrows the unit search to one venue; when omitted every venue of the operator is searched. Format: {pmgID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode}.{VenueName}.{City} (example). |
| externalVenueID | string Shape (2) alternative venue identifier. |
| UnitID | string Shape (2) unit lookup field (trimmed to 40 characters). |
| UnitBuilding | string Shape (2) unit lookup field (trimmed to 40 characters). |
| UnitFloor | string Shape (2) unit lookup field (trimmed to 40 characters). |
| AddressLine1 | string Shape (2) unit lookup field (trimmed to 40 characters). |
| AddressLine2 | string Shape (2) unit lookup field (trimmed to 40 characters). |
| City | string Shape (2) unit lookup field (trimmed to 40 characters). |
| State | string Shape (2) unit lookup field (trimmed to 40 characters). |
| Country.ISO3166A3 | string Shape (2) unit lookup field (trimmed to 40 characters). |
| PostalCode | string Shape (2) unit lookup field (trimmed to 40 characters). |
| ServicePlanID | string Shape (2). Validated against the venue unit; when omitted the unit's DefaultServicePlanID is used. An unavailable plan returns 401 with the composed message 'ERROR: Service plan ' + the submitted ServicePlanID + ' is not available for this subscription.'. A value ending in '.V3SERVICEPLAN.EMERGENCYSERVICE' is replaced by the existing subscription's plan in shape (1). FORMAT: {OperatorID}.V3SERVICEPLAN.{plan name, sanitized, first 20 characters, spaces removed, UPPERCASED} - the prefix is the OPERATOR id, which is itself {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. It is never a VenueID. |
| externalServicePlanID | string Shape (2) alternative service-plan identifier. |
| externalSubscriptionID | string Shape (2). Accepted, but never written on this route (the caller_may_update_subscriber gate at is false for 'vault_shoppingcart') and stripped from the response and from the response's Subscription. |
| NewKey | string A complete Wi-Fi password, used INSTEAD of |
| UserPartForNewKey | string Shape (2). The user part of the PSK. 1-40 characters: over 40 returns 401 'Wi-Fi password cannot be more than 40 characters.', under 1 returns 401 'Wi-Fi password cannot be less than 1 character.', and a value that is not WPA-legal or that contains a '.' returns 401 'Wi-Fi password has invalid characters.'. Where the resolved StrictPSK is true for the unit this field is REFUSED with 401 (the composed value contains a '.' and can never be StrictPSK-compliant): omit it to have a compliant key generated, or supply a compliant full key instead. When a pre-existing setup-intent subscription is found at the unit it replaces the user part of that subscription's PSK. |
| contactpref_sms | boolean HONOURED on the new-subscriber path, contrary to what the name of the caller_may_update_subscriber gate suggests. That gate only blocks the UPDATE path (for a request that names an existing SubscriberToken). When a NEW subscriber is created, copies the value onto Subscriber.contactpref_sms and writes it onto the created subscription row, so posting it to this unauthenticated endpoint DOES change persisted state. The test is LOOSE ( |
{- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "+15555550100",
- "GivenName": "Alex",
- "FamilyName": "Rivera",
- "VenueID": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO",
- "UnitID_internal": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO.101.A.1"
}{- "StripeCustomerID": "cus_XXXXXXXXXXXX",
- "StripeSetupIntentId": "seti_XXXXXXXXXXXX",
- "StripeClientSecret": "seti_XXXXXXXXXXXX_secret_XXXXXXXXXXXX",
- "StripePublishableKey": "pk_XXXXXXXXXXXX",
- "dateAddedUTC.ISO8601": "2026-08-19T14:03:22.117Z",
- "phoneNumberDifferent": false,
- "errorProcessing": false
}List the operator's venues, filtered by the caller's role. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue) or NetworkOperator (sees every venue) get the full list; a Venue admin/leasing agent sees only their own venues; Public (including unauthenticated) sees venues only when the operator's shopping cart is enabled, filtered to cart-eligible venues.
Trimmed per venue: internal config sections, Stripe credentials and dateAddedUTC are always removed. A caller whose token carries no SubscriberToken (NSP, or Public with no subscriber record) additionally loses externalVenueID, ShoppingCart and DailyReport on cart-enabled venues.
Read-only, from cache — a venue changed moments ago may not be reflected yet.
This path is an exact alias of /networkoperatorconsole/venues/listVenues — same implementation, same filtering by token, not by path.
JSON object. A body is not required: with no access token the caller is simply treated as Public. If a body IS sent it must be valid JSON - a non-empty non-JSON body is rejected with 401 'Malformed JSON in input. '.
| AccessToken | string Cognito access-token JWT. Optional - absent means Public. May instead be supplied as an |
| IdToken | string Cognito id token. Only consulted during token verification, which runs only when an |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider; ignored otherwise. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string"
}{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}List the operator's venues, filtered by the caller's role. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue) or NetworkOperator (sees every venue) get the full list; a Venue admin/leasing agent sees only their own venues; Public (including unauthenticated) sees venues only when the operator's shopping cart is enabled, filtered to cart-eligible venues.
Trimmed per venue: internal config sections, Stripe credentials and dateAddedUTC are always removed. A caller whose token carries no SubscriberToken (NSP, or Public with no subscriber record) additionally loses externalVenueID, ShoppingCart and DailyReport on cart-enabled venues.
Read-only, from cache — a venue changed moments ago may not be reflected yet.
This path is an exact alias of /networkoperatorconsole/venues/listVenues — same implementation, same filtering by token, not by path.
| AccessToken | string Cognito access-token JWT. Optional - with no token the caller is treated as Public. May instead be supplied as an |
| IdToken | string Cognito id token. Only consulted during token verification, which itself only runs when an |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider - omitting it then is a 401. Ignored for every other caller. |
{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}List a venue's units for self-service shopping cart sign-up — identity, address, PSK policy and SMS code only. Read-only. No token required (anonymous sign-up is supported).
Always returns the cut-down cart projection, for every caller — unlike the sibling /venues/listVenueUnits, an admin token does not get the richer projection here.
Filtering by role: Public and Subscriber callers have cart-disabled and occupied units filtered out (a Subscriber's own units are always kept); NetworkSoftwareProvider (must send OperatorID), NetworkOperator and Venue callers see everything unfiltered. globalroaming and secondary units are always excluded.
Resolving the venue: VenueID directly, or derived from externalVenueID (not for Public) or UnitID_internal (narrows to one unit). No resolvable venue is a 400.
An unowned or cart-disabled venue is not an error — 200 with no VenueUnits key.
api-version gate: StrictPSK requires api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
| Authorization | string
|
| api-version | string Example: 20260417 Feature gate. Send |
| AccessToken | string Cognito access-token JWT, as an alternative to the Authorization header. Optional: with no token at all the caller resolves to the Public role rather than being rejected. |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID | string The venue whose units are listed. Required unless |
| externalVenueID | string The operator's own venue identifier, used to resolve |
| UnitID_internal | string Narrows the result to this one unit, and resolves |
| externalVenueUnitID | string Accepted and IGNORED on this resource: the external-unit resolver that reads it runs only on |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "externalVenueID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string"
}{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 0,
- "message": "string",
- "errorProcessing": false
}List a venue's units for self-service shopping cart sign-up — identity, address, PSK policy and SMS code only. Read-only. No token required (anonymous sign-up is supported).
Always returns the cut-down cart projection, for every caller — unlike the sibling /venues/listVenueUnits, an admin token does not get the richer projection here.
Filtering by role: Public and Subscriber callers have cart-disabled and occupied units filtered out (a Subscriber's own units are always kept); NetworkSoftwareProvider (must send OperatorID), NetworkOperator and Venue callers see everything unfiltered. globalroaming and secondary units are always excluded.
Resolving the venue: VenueID directly, or derived from externalVenueID (not for Public) or UnitID_internal (narrows to one unit). No resolvable venue is a 400.
An unowned or cart-disabled venue is not an error — 200 with no VenueUnits key.
api-version gate: StrictPSK requires api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
| AccessToken | string Cognito access-token JWT, as an alternative to the Authorization header. Optional: with no token at all the caller resolves to the Public role rather than being rejected. |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID | string The venue whose units are listed. Required unless |
| externalVenueID | string The operator's own venue identifier, used to resolve |
| UnitID_internal | string Narrows the result to this one unit, and resolves |
| externalVenueUnitID | string Accepted and IGNORED on this resource: the external-unit resolver that reads it runs only on |
| Authorization | string
|
| api-version | string Example: 20260417 Feature gate. Send |
{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 0,
- "message": "string",
- "errorProcessing": false
}Not implemented — do not use. The route is live and fully authenticated, but the operation behind it is an empty stub: it reads nothing from the request, writes nothing, and returns HTTP 200 with a body of exactly {"errorProcessing": false}. Because the status is 200, the failure is silent.
To take payment for a subscription, use the Stripe SetupIntent flow: call /networkoperatorconsole/shoppingcart/requestSubscription to create the subscription and obtain the SetupIntent, then /networkoperatorconsole/shoppingcart/approveSubscriptionSetup to confirm it. Capture itself is driven by Stripe's webhook, not by an operator-console call.
To refund, use /networkoperatorconsole/subscribers/refundPayment.
| AccessToken required | string Cognito access token. Absent rejects with HTTP 401 and message 'AccessToken missing from request'. The operator scope (OperatorID) is NOT taken from the token: it is resolved from the request Origin header, which request validation.validateUIDomain records and getCognitoData maps to the operator record. The token supplies only the AdministrativeAccess arrays, which are checked against that OperatorID. Format: a Cognito JWT access token string. The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the resolved OperatorID, otherwise HTTP 401 'Administrative Access denied (2). ' (message, statusCode). AccessToken is the ONLY field with any effect: never dereferences its |
| property name* additional property | any |
{- "AccessToken": "<cognito-access-token>"
}{- "errorProcessing": false
}List the calling operator's subscriptions, with filters and optional pagination.
Requires one of NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the resolved operator.
Two response modes: by default, the full filtered list is returned (up to 2000 rows — beyond that, Subscriptions is emptied and a message explains the cap, with Subscriptions_csv holding the CSV instead). Sending Limit or nextToken switches to pagination: SubscriptionCount becomes the page size, TotalCount the full total, page size defaults to 250 and is clamped to 1000.
Filters: EmailAddress/PhoneNumber.E164/externalSubscriberID are resolved to a SubscriberToken first (no GSI on these fields) — an identifier that resolves to nothing yields an empty result set rather than an error.
| AccessToken required | string Cognito JWT for an operator staff member. Presence checked; verified at token validation. |
| SubscriberToken | string Filter by subscriber. Takes precedence over EmailAddress/PhoneNumber.E164/externalSubscriberID, which are otherwise resolved to a token. |
| EmailAddress | string Filter by subscriber email; lower-cased before use. Resolved to a SubscriberToken via the Cognito-backed resolver. |
| PhoneNumber.E164 | string Filter by subscriber phone; resolved to a SubscriberToken. Copied onto the request's PhoneNumber for the resolver when that field is absent. |
| externalSubscriberID | string Filter by the operator's own subscriber id; resolved to a SubscriberToken. |
| externalSubscriptionID | string Filter by external subscription id. |
| StripeCustomerID | string Filter by Stripe customer id. |
| UnitID_internal | string Filter by venue unit; drives an indexed query. |
| externalVenueUnitID | string Filter by external venue-unit id. |
| VenueID | string Filter by venue. Format is |
| externalVenueID | string Filter by external venue id. |
| ServicePlanID | string Filter by service plan. |
| externalServicePlanID | string Filter by external service plan id. |
| AccountStatusAtCreation | string Filter by the account status recorded when the subscription was created. |
boolean or string Filter on the payment-failed flag. Matched with strict === against both the boolean and the string form, i.e. true/"true" and false/"false"; any other value selects neither filter. | |
boolean or string Restrict to pending subscriptions. Enabled only when the value is truthy AND strictly equals true or the string "true". | |
| MaxViewWindowDateUTC.ISO8601 | string Upper bound of the view window; passed to |
| MinViewWindowDateUTC.ISO8601 | string Lower bound of the view window. |
integer or string Page size. Supplying it (any value that is not undefined/null/'') switches the response into paginated mode. Validated as an integer and clamped to 1000; default page size is 250. | |
| nextToken | string Opaque cursor from a previous page - base64url of {v:1, o: |
{- "AccessToken": "string",
- "SubscriberToken": "string",
- "EmailAddress": "string",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "StripeCustomerID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "VenueID": "string",
- "externalVenueID": "string",
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "AccountStatusAtCreation": "string",
- "paymentFailed": true,
- "onlyDisplayPendingSubscriptions": true,
- "MaxViewWindowDateUTC.ISO8601": "string",
- "MinViewWindowDateUTC.ISO8601": "string",
- "Limit": 1,
- "nextToken": "string"
}{- "SubscriptionCount": 0,
- "Subscriptions": [
- { }
], - "Subscriptions_csv": [
- "string"
], - "TotalCount": 0,
- "nextToken": "string",
- "MaxViewWindowDateUTC.ISO8601": "string",
- "MinViewWindowDateUTC.ISO8601": "string",
- "message": "string",
- "errorProcessing": false
}Despite the name, this does not fetch live Stripe transactions — it lists stored invoice records; Stripe fields (StripeCustomerID, etc.) come from the database, not a live call. The one exception: a best-effort per-row Stripe lookup back-fills a missing receipt URL when a stored row has a charge id but none.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), or Subscriber (always scoped to their own token). No anonymous access.
Date window: defaults to the last 2 years when no lower bound is sent.
Size guard: beyond 2000 matching rows, Payments is emptied and message explains why; PaymentCount becomes 0.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) message catalogue, anything else US English. Affects rejection text only - no field in the success body is localized. |
| AccessToken | string Cognito JWT access token. Mandatory unless supplied through the Authorization header, which overrides it. Verified only when the operator record carries a Cognito pool. |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and its preferred_username (or its email resolved through the operator's email cache) identifies the caller. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller, which is rejected 401 'OperatorID Missing. ' without it. It then becomes the operator every result is scoped to, and is deleted from the request before filtering. Ignored for every other caller. |
| VenueID | string Two jobs at once: it is the value the Venue role check matches against, AND a result filter (rows whose VenueID differs are dropped). A caller whose only role is venue-level must send it. When it is the only identifier given, it also selects the VenueID index as the query source. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Selects the SubscriberToken index and filters the result. Overwritten with the caller's own token when the caller is classified Subscriber. |
| EmailAddress | string Lower-cased and resolved to a SubscriberToken; on success the raw email is dropped from the in-memory filters (invoice rows may not carry it). If it resolves to nothing, the result is empty. Resolution is attempted only when no SubscriberToken was supplied; when one was, the email stays on as an additional exact-match filter against each invoice row's EmailAddress attribute, which many rows do not carry - so that combination can return an empty result. |
| PhoneNumber.E164 | string Subscriber phone number. For an operator-level or venue-level caller it is also copied to the un-dotted PhoneNumber field the cache resolver reads, and matched against the phone cache verbatim (no normalisation). Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| externalSubscriberID | string The operator's own subscriber identifier, resolved to a SubscriberToken. Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| StripeCustomerID | string Filters the result and, when no subscriber identifier resolved, selects the Stripe-customer index as the query source. |
| externalSubscriptionID | string In-memory filter only; matched exactly against the invoice record's attribute of the same name. |
| externalVenueID | string In-memory filter only; matched exactly. |
| UnitID_internal | string In-memory filter only; matched exactly. |
| externalVenueUnitID | string In-memory filter only; matched exactly. |
| ServicePlanID | string In-memory filter only; matched exactly. |
| externalServicePlanID | string In-memory filter only; matched exactly. |
| MinInvoiceDateTimeUTC.ISO8601 | string <date-time> Lower bound on the invoice date, inclusive of equal values (rows strictly earlier are dropped). Takes precedence over MinStartDateTimeUTC.ISO8601. When neither is sent the bound defaults to two years before the request. A value that does not parse to a real date disables the lower bound entirely rather than erroring. |
| MaxInvoiceDateTimeUTC.ISO8601 | string <date-time> Upper bound on the invoice date, inclusive of equal values. Takes precedence over MaxStartDateTimeUTC.ISO8601. Absent means no upper bound. |
| MinStartDateTimeUTC.ISO8601 | string <date-time> Fallback lower bound, used only when MinInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date, not to any subscription start date. |
| MaxStartDateTimeUTC.ISO8601 | string <date-time> Fallback upper bound, used only when MaxInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "StripeCustomerID": "string",
- "externalSubscriptionID": "string",
- "externalVenueID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "MinInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MinStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z"
}{- "PaymentCount": 1,
- "NonZeroPaymentCount": 1,
- "Payments": [
- {
- "dateAddedUTC.ISO8601": "2026-07-01T04:15:22.113Z",
- "InvoiceDateTimeUTC.ISO8601": "2026-07-01T04:15:20.000Z",
- "PaymentSuccessDateTimeUTC.ISO8601": "2026-07-01T04:15:24.881Z",
- "GivenName": "",
- "FamilyName": "",
- "SubscriberToken": "",
- "externalSubscriberID": "",
- "externalSubscriptionID": "",
- "StripeCustomerID": "",
- "StripePaymentIntentId": "",
- "StripeClientSecret": "",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "",
- "externalServicePlanID": "",
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Currency": "USD",
- "BillingCyclePrice.USD": 4999,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "AmountProcessed.USD": 4999,
- "AmountReceived.USD": 4999,
- "AmountRefunded.USD": 0,
- "UnitID_internal": "",
- "externalVenueUnitID": "",
- "externalVenueID": "",
- "StripeReceiptURL": "",
- "StripeRefundReceiptURL": "",
- "StripePaymentChargeId": "",
- "CancellationSource": "",
- "CancellationReasons": [ ],
- "BillingCyclePriceAdjustment": 0,
- "BillingCycleAdjustmentReasons": [ ],
- "ServicePlanID": "",
- "BillingCycleHours": 720,
- "UploadKbps": 100000,
- "DownloadKbps": 100000,
- "CurrencySymbol": "$",
- "ConcurrentDevices": 5
}
], - "BillingCycleHours": 720,
- "DownloadKbps": 100000,
- "UploadKbps": 100000,
- "PricePerDownloadGbps.USD": 4,
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "MinInvoiceDateTimeUTC.ISO8601": "2024-08-20T00:00:00.000Z",
- "errorProcessing": false
}Returns invoice/payment history as a Payments array plus record counts. Read-only, aside from a best-effort receipt-URL lookup for rows missing one.
Who may call it: an access token is mandatory (no anonymous access). Classified in order: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), or Subscriber — whichever the token matches first.
Scope: a Subscriber caller (including a staff token that doesn't match its intended role) always sees only their own history; a Venue caller is confined to the VenueID it sent, even if a subscriber token from another venue is supplied.
Date window: defaults to the last 2 years when no lower bound is sent.
Size guard: beyond 2000 matching rows, Payments is emptied and message explains why; PaymentCount becomes 0.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) message catalogue, anything else US English. Affects rejection text only - no field in the success body is localized. |
| AccessToken | string Cognito JWT access token. Mandatory unless supplied through the Authorization header, which overrides it. Verified only when the operator record carries a Cognito pool. |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and its preferred_username (or its email resolved through the operator's email cache) identifies the caller. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller, which is rejected 401 'OperatorID Missing. ' without it. It then becomes the operator every result is scoped to, and is deleted from the request before filtering. Ignored for every other caller. |
| VenueID | string Two jobs at once: it is the value the Venue role check matches against, AND a result filter (rows whose VenueID differs are dropped). A caller whose only role is venue-level must send it. When it is the only identifier given, it also selects the VenueID index as the query source. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Selects the SubscriberToken index and filters the result. Overwritten with the caller's own token when the caller is classified Subscriber. |
| EmailAddress | string Lower-cased and resolved to a SubscriberToken; on success the raw email is dropped from the in-memory filters (invoice rows may not carry it). If it resolves to nothing, the result is empty. Resolution is attempted only when no SubscriberToken was supplied; when one was, the email stays on as an additional exact-match filter against each invoice row's EmailAddress attribute, which many rows do not carry - so that combination can return an empty result. |
| PhoneNumber.E164 | string Subscriber phone number. For an operator-level or venue-level caller it is also copied to the un-dotted PhoneNumber field the cache resolver reads, and matched against the phone cache verbatim (no normalisation). Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| externalSubscriberID | string The operator's own subscriber identifier, resolved to a SubscriberToken. Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| StripeCustomerID | string Filters the result and, when no subscriber identifier resolved, selects the Stripe-customer index as the query source. |
| externalSubscriptionID | string In-memory filter only; matched exactly against the invoice record's attribute of the same name. |
| externalVenueID | string In-memory filter only; matched exactly. |
| UnitID_internal | string In-memory filter only; matched exactly. |
| externalVenueUnitID | string In-memory filter only; matched exactly. |
| ServicePlanID | string In-memory filter only; matched exactly. |
| externalServicePlanID | string In-memory filter only; matched exactly. |
| MinInvoiceDateTimeUTC.ISO8601 | string <date-time> Lower bound on the invoice date, inclusive of equal values (rows strictly earlier are dropped). Takes precedence over MinStartDateTimeUTC.ISO8601. When neither is sent the bound defaults to two years before the request. A value that does not parse to a real date disables the lower bound entirely rather than erroring. |
| MaxInvoiceDateTimeUTC.ISO8601 | string <date-time> Upper bound on the invoice date, inclusive of equal values. Takes precedence over MaxStartDateTimeUTC.ISO8601. Absent means no upper bound. |
| MinStartDateTimeUTC.ISO8601 | string <date-time> Fallback lower bound, used only when MinInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date, not to any subscription start date. |
| MaxStartDateTimeUTC.ISO8601 | string <date-time> Fallback upper bound, used only when MaxInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "StripeCustomerID": "string",
- "externalSubscriptionID": "string",
- "externalVenueID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "MinInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MinStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z"
}{- "PaymentCount": 1,
- "NonZeroPaymentCount": 1,
- "Payments": [
- {
- "dateAddedUTC.ISO8601": "2026-07-01T04:15:22.113Z",
- "InvoiceDateTimeUTC.ISO8601": "2026-07-01T04:15:20.000Z",
- "PaymentSuccessDateTimeUTC.ISO8601": "2026-07-01T04:15:24.881Z",
- "GivenName": "",
- "FamilyName": "",
- "SubscriberToken": "",
- "externalSubscriberID": "",
- "externalSubscriptionID": "",
- "StripeCustomerID": "",
- "StripePaymentIntentId": "",
- "StripeClientSecret": "",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "",
- "externalServicePlanID": "",
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Currency": "USD",
- "BillingCyclePrice.USD": 4999,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "AmountProcessed.USD": 4999,
- "AmountReceived.USD": 4999,
- "AmountRefunded.USD": 0,
- "UnitID_internal": "",
- "externalVenueUnitID": "",
- "externalVenueID": "",
- "StripeReceiptURL": "",
- "StripeRefundReceiptURL": "",
- "StripePaymentChargeId": "",
- "CancellationSource": "",
- "CancellationReasons": [ ],
- "BillingCyclePriceAdjustment": 0,
- "BillingCycleAdjustmentReasons": [ ],
- "ServicePlanID": "",
- "BillingCycleHours": 720,
- "UploadKbps": 100000,
- "DownloadKbps": 100000,
- "CurrencySymbol": "$",
- "ConcurrentDevices": 5
}
], - "BillingCycleHours": 720,
- "DownloadKbps": 100000,
- "UploadKbps": 100000,
- "PricePerDownloadGbps.USD": 4,
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "MinInvoiceDateTimeUTC.ISO8601": "2024-08-20T00:00:00.000Z",
- "errorProcessing": false
}Returns the Stripe-hosted receipt URL recorded on a subscription row — a single indexed read; Stripe itself is never contacted. A receipt that exists at Stripe but was never written back here reads as an empty string.
No AccessToken — one of a handful of shopping-cart resources that identifies the operator from the request Origin alone.
| StripeClientSecret required | string The Stripe client secret stored on the subscription record. Presence is a bare truthiness check, so an empty string, 0 or false are all rejected as missing. The lookup is scoped to the caller's operator. |
{- "StripeClientSecret": "string"
}{- "StripeReceiptURL": "string",
- "errorProcessing": false,
- "SupportedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}
}Returns the operator's display-option (branding/theme) profiles.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Public — EVERY other caller, including a completely unauthenticated one. No token is required to call this endpoint. A Public caller must supply DisplayOptionID.
GET reads the query string (merged over the body); its response also adds Cache-Control: private, max-age=5.
| Authorization | string Optional |
| AccessToken | string Cognito JWT access token, read. Absent/empty means Public, NOT an error. An |
| OperatorID | string Target operator, read ONLY on the NetworkSoftwareProvider branch where it is mandatory (401 'OperatorID Missing. ' otherwise) and is deleted from the body once copied to Operator.OperatorID. Ignored for other roles. Built as {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| DisplayOptionID | string REQUIRED for a Public (unauthenticated) caller - returns 401 'Missing DisplayOptionID. ' without it. Also acts as an exact-match filter, but only when DisplayOptionName was not supplied. |
| DisplayOptionName | string Exact-match filter on the item's DisplayOptionName. Evaluated BEFORE DisplayOptionID, so it takes precedence as the filter. |
| property name* additional property | any |
{- "AccessToken": "string",
- "OperatorID": "string",
- "DisplayOptionID": "string",
- "DisplayOptionName": "string"
}{- "DisplayOptions": [
- {
- "DisplayOptionID": "string",
- "DisplayOptionName": "string",
- "DisplayConfiguration": {
- "ThemeLight": {
- "LogoFileNameDesktopLogin": "string",
- "LogoFileNameMobileLogin": "string",
- "LogoFileNameDesktopMobileAfterLogin": "string",
- "LoginBackgroundColorHex": "string",
- "LoginTextColorHex": "string",
- "BackgroundColorHex": "string",
- "PrimaryColorHex": "string",
- "SecondaryColorHex": "string",
- "PrimaryTextColorHex": "string",
- "SecondaryTextColorHex": "string",
- "BorderColorHex": "string",
- "LinkColorHex": "string",
- "TableColorHex": "string",
- "BannerColor1Hex": "string",
- "BannerColor2Hex": "string",
- "NavbarColorHex": "string",
- "ModalColorHex": "string",
- "InputBoxColorHex": "string"
}, - "ThemeDark": {
- "LogoFileNameDesktopLogin": "string",
- "LogoFileNameMobileLogin": "string",
- "LogoFileNameDesktopMobileAfterLogin": "string",
- "LoginBackgroundColorHex": "string",
- "LoginTextColorHex": "string",
- "BackgroundColorHex": "string",
- "PrimaryColorHex": "string",
- "SecondaryColorHex": "string",
- "PrimaryTextColorHex": "string",
- "SecondaryTextColorHex": "string",
- "BorderColorHex": "string",
- "LinkColorHex": "string",
- "TableColorHex": "string",
- "BannerColor1Hex": "string",
- "BannerColor2Hex": "string",
- "NavbarColorHex": "string",
- "ModalColorHex": "string",
- "InputBoxColorHex": "string"
}, - "MetaData": {
- "FavIconHRef": "string",
- "TitleTextContent": "string",
- "DescriptionContent": "string"
}, - "Behavior": {
- "CancellationMethod": "string",
- "PrivacyPolicyURL": "string",
- "AllowedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}, - "ShowTour": true,
- "ShowFooterOnLoginPage": true,
- "S3Directory": "string",
- "S3DirectoryCustomComponents": "string",
- "GoogleAnalyticsID": "string"
}, - "ShoppingCart": {
- "enableShoppingCart": true,
- "AllowSelfCancellation": true,
- "AllowSelfPaymentMethodUpdate": true,
- "AllowSelfServicePlanUpdate": true
}, - "Support": {
- "ShowSupportLinks": true,
- "ExternallyManagedSupport": true,
- "ExternalSupportSystemURL": "string",
- "ShowEquipmentStatusToVenueAdministrator": true,
- "DisplaySuperAdminEmailModule": true,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string"
}
}
}
], - "SupportedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}, - "message": "",
- "errorProcessing": true
}Comprehensive venue management system for property owners, managers, and network operators to oversee venue operations and subscriber services.
List the operator's venues, role-filtered, from the operator's cached venue list. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue), NetworkOperator (sees every venue), Venue admin/leasing agent (filtered to their own VenueIDs — admin takes precedence when a token holds both), or Public (sees venues only when the operator's shopping cart is enabled) — INCLUDING a request with no access token at all.
Trimmed per venue: internal config sections, Stripe adjustments, dateAddedUTC are removed; a DailyReport is added. A caller whose token carries no SubscriberToken additionally loses externalVenueID, ShoppingCart and DailyReport on any cart-enabled venue.
Read-only.
| AccessToken | string Cognito access-token JWT, as an alternative to the Authorization header. Optional: with no token at all the caller is resolved as Public rather than rejected. |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token and the username comes from its |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller - its absence for such a caller is a 401. Ignored for every other caller. |
| Authorization | string
|
{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}Return the full detail record for one venue: configuration, units, non-expired subscriptions, keypools, core equipment and available service plans. The venue comes back under a key named after its VenueID — read the response as body[VenueID].
What each role gets:
OperatorID) and NetworkOperator get the full record; only NetworkOperator sees the clear-text equipment Password.ShoppingCart.Stripe reduced to just the publishable key, equipment MACAddress/Password withheld.message/errorProcessing.VenueUnits/VenueUnitCount instead of the venue object — the venue's cart-eligible, unoccupied units in a cut-down projection; skipped entirely if the venue's shopping cart is disabled.Resolving the venue: VenueID directly, or (non-Public callers) derived from externalVenueID. No resolvable venue is a 400.
An unowned venue is not an error — 200 with no venue key.
api-version gate: several fields (VenueUnitSSID, StrictPSK, equipment UnitID_internal/MACAddress) require api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
GET form: parameters come from the query string; responses add Cache-Control: private, max-age=5.
| AccessToken | string Cognito access-token JWT, as an alternative to the Authorization header. Optional: with no token at all the caller resolves to the Public role rather than being rejected, and receives a unit list instead of the venue record. |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID | string The venue to describe. Required unless |
| externalVenueID | string The operator's own venue identifier, used to resolve |
| UnitID_internal | string Narrows the unit set the detail record is built from to this one unit; the venue's subscription, keypool and equipment sections are unaffected. On this resource an unmatched value is NOT an error. |
| Authorization | string
|
| api-version | string Example: 20260417 Feature gate. Send |
{- "message": "string",
- "errorProcessing": false,
- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 0,
- "property1": {
- "VenueID": "string",
- "VenueName": "string",
- "externalVenueID": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "dateAddedUTC": "string",
- "dateAddedUTC.ISO8601": "string",
- "DeviceCount": 0,
- "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "NetworkConfiguration": {
- "NAS-Identifier": "string",
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "WirelessOnlyPlanVLANOffset": 0,
- "GWError": "string"
}, - "NAS-Identifier": "string",
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "ServicePlanConfiguration": {
- "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string",
- "ServicePlanIDs": [
- "string"
]
}, - "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string",
- "Notifications": {
- "WelcomeEmail_countdown_hours": 0,
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "suppressSubscriberSMS": true
}, - "WelcomeEmail_countdown_hours": 0,
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "suppressSubscriberSMS": true,
- "Roles": {
- "VenueAdministrators": [
- "string"
], - "LeasingAgents": [
- "string"
]
}, - "VenueAdministrators": [
- "string"
], - "LeasingAgents": [
- "string"
], - "Reporting": {
- "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0
}, - "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0,
- "Integrations": {
- "ConnectWise": { },
- "PRTG": {
- "URL": "string",
- "Username": "string",
- "PasswordHash": "string"
}
}, - "PMS": { },
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "Currencies": [
- "string"
], - "hasVenueUnitShoppingCartPriceAdjustment": true,
- "ShoppingCartPriceAdjustment": 0,
- "Stripe": { },
- "StripePublishableKey": "string",
- "Stripe_Secret_key": "string",
- "Stripe_Webhook_signingsecret": "string",
- "StripeWebHookURL": "string",
- "Stripe_allowrefund": true,
- "TrialCycleAdjustment": 0
}, - "Keypools": {
- "property1": {
- "ssid": "string",
- "Scope": "string",
- "DisplayOrder": 0,
- "AuthenticationMechanism": "string"
}, - "property2": {
- "ssid": "string",
- "Scope": "string",
- "DisplayOrder": 0,
- "AuthenticationMechanism": "string"
}
}, - "CoreEquipmentStatus": {
- "property1": {
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "string",
- "Status": "string",
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}, - "property2": {
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "string",
- "Status": "string",
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}
}, - "CoreEquipmentCount": 0,
- "CoreEquipmentUPCount": 0,
- "AvailableServicePlans": [
- {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "BillingCycleHours": 0,
- "Currencies": [
- "string"
], - "TrialCycles": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "GloballyAvailablePlan": true,
- "AllowSelfSignup": true,
- "Deprecated": true,
- "WirelessOnlyPlan": true,
- "ServicePlanImageURL": "string",
- "SMSCode": "string",
- "FCCLabel": { }
}
], - "Units-Building-Floor-List-Subscribers": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Units-Building-Floor-List-GuestNetworks": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Units-Building-Floor-List-RoamingNetworks": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Subscriptions": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}
}, - "GuestSubscriptions": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}
}, - "UnitsWithoutSubscriptionsCount": 0,
- "PendingAUP": 0
}, - "property2": {
- "VenueID": "string",
- "VenueName": "string",
- "externalVenueID": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "dateAddedUTC": "string",
- "dateAddedUTC.ISO8601": "string",
- "DeviceCount": 0,
- "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "NetworkConfiguration": {
- "NAS-Identifier": "string",
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "WirelessOnlyPlanVLANOffset": 0,
- "GWError": "string"
}, - "NAS-Identifier": "string",
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "ServicePlanConfiguration": {
- "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string",
- "ServicePlanIDs": [
- "string"
]
}, - "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string",
- "Notifications": {
- "WelcomeEmail_countdown_hours": 0,
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "suppressSubscriberSMS": true
}, - "WelcomeEmail_countdown_hours": 0,
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "suppressSubscriberSMS": true,
- "Roles": {
- "VenueAdministrators": [
- "string"
], - "LeasingAgents": [
- "string"
]
}, - "VenueAdministrators": [
- "string"
], - "LeasingAgents": [
- "string"
], - "Reporting": {
- "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0
}, - "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0,
- "Integrations": {
- "ConnectWise": { },
- "PRTG": {
- "URL": "string",
- "Username": "string",
- "PasswordHash": "string"
}
}, - "PMS": { },
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "Currencies": [
- "string"
], - "hasVenueUnitShoppingCartPriceAdjustment": true,
- "ShoppingCartPriceAdjustment": 0,
- "Stripe": { },
- "StripePublishableKey": "string",
- "Stripe_Secret_key": "string",
- "Stripe_Webhook_signingsecret": "string",
- "StripeWebHookURL": "string",
- "Stripe_allowrefund": true,
- "TrialCycleAdjustment": 0
}, - "Keypools": {
- "property1": {
- "ssid": "string",
- "Scope": "string",
- "DisplayOrder": 0,
- "AuthenticationMechanism": "string"
}, - "property2": {
- "ssid": "string",
- "Scope": "string",
- "DisplayOrder": 0,
- "AuthenticationMechanism": "string"
}
}, - "CoreEquipmentStatus": {
- "property1": {
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "string",
- "Status": "string",
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}, - "property2": {
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "string",
- "Status": "string",
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}
}, - "CoreEquipmentCount": 0,
- "CoreEquipmentUPCount": 0,
- "AvailableServicePlans": [
- {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "BillingCycleHours": 0,
- "Currencies": [
- "string"
], - "TrialCycles": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "GloballyAvailablePlan": true,
- "AllowSelfSignup": true,
- "Deprecated": true,
- "WirelessOnlyPlan": true,
- "ServicePlanImageURL": "string",
- "SMSCode": "string",
- "FCCLabel": { }
}
], - "Units-Building-Floor-List-Subscribers": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Units-Building-Floor-List-GuestNetworks": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Units-Building-Floor-List-RoamingNetworks": {
- "property1": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}, - "property2": {
- "property1": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}, - "property2": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "EntrataUnitSpaceID": "string",
- "vlan": null,
- "purpose": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "hasActiveOrFutureSubscription": true,
- "PMS": {
- "RealPage": { },
- "Entrata": { },
- "SyncDateTimeUTC": "string"
}, - "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SMSCode": "string",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true
}, - "Subscriptions": { }
}
}
}
}, - "Subscriptions": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}
}, - "GuestSubscriptions": {
- "property1": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "UnitID_internal": "string",
- "PrimaryUnitID_internal": "string",
- "externalVenueUnitID": "string",
- "RealPageUnitID": "string",
- "purpose": "string",
- "vlan": null,
- "psk": [
- "string"
], - "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "Status": "string",
- "SubscriberGivenName": "string",
- "SubscriberFamilyName": "string",
- "SubscriberEmail": "subscriber@example.com",
- "SubscriberPhoneNumber.E164": "string",
- "SubscriberLocale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "paymentFailed": true,
- "SubscriberManagedviaSSO": true,
- "gatewayConfigured": true,
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "BillingCycleHours": 0,
- "DownloadKbps": 0,
- "UploadKbps": 0
}, - "StartDateTimeUTC.ISO8601": "string",
- "SuspensionDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ConfirmedEndDate.ISO8601": "string",
- "ListBillingCyclePrice": 0,
- "VenueUnitShoppingCartPriceAdjustment": 0,
- "VenueShoppingCartPriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "VenuePriceAdjustment": 0,
- "StripeClientSecret": "string",
- "SetupIntentId": "string"
}
}, - "UnitsWithoutSubscriptionsCount": 0,
- "PendingAUP": 0
}
}Audit/event log documents for ONE venue from the operator's OpenSearch log indices. VenueID is REQUIRED (401 'VenueID Missing. ' without it) and every query is additionally filtered on it.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent for the requested VenueID. ⚠ A caller who resolves only to the Subscriber category (no operator/venue role) does NOT match this route at all and gets a 500, not a 401.
Filtering: searchText runs a fuzzy match; a whitelist of 13 fields is available, or raw OpenSearch customQuery (replaces the whitelist). Results are newest-first, paged via searchBefore. Administrator values are expanded to a display form; event is always an object.
GET reads the query string (merged over the body); its response also adds Cache-Control: private, max-age=5.
| AccessToken | string Cognito access token. Absent/empty in both the request and the Authorization header is 401 'AccessToken Missing. '. It is verified only when the operator record resolved from the request Origin carries a Cognito pool; when it does not, the token is never validated, the caller lands in no access category, and the request is refused 401 'Access Denied. '. |
| IdToken | string Optional Cognito ID token. Used by the shared token validator only when the access token's username is not already cached: the ID token is then verified instead, and its preferred_username (or its email, resolved through the operator's email index) becomes the caller identity. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing is 401 'OperatorID Missing. '); it becomes the OperatorID every log query is filtered on and is then removed from the request. Ignored for every other caller, whose operator comes from the request Origin. |
| VenueID required | string REQUIRED. The venue whose logs are returned; a missing or empty value is 401 'VenueID Missing. '. It has two further effects: it is the value matched against a Venue-role caller's VenueAdministrator/LeasingAgent arrays, and because VenueID is also a whitelisted filter field it is applied as a term filter twice (harmlessly). Composite Vault VenueID, {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| MinViewWindowDateUTC.ISO8601 | string Example: MinViewWindowDateUTC.ISO8601=2026-08-01T00:00:00.000Z Window start, parsed with the JavaScript Date constructor. DEFAULT: none - when it is omitted NO lower bound is applied at all and the query spans every monthly log index. Supplying it also switches the hit counter to exact mode; without it totalCount is capped (see the 200 response). An unparseable value is 400. |
| MaxViewWindowDateUTC.ISO8601 | string Example: MaxViewWindowDateUTC.ISO8601=2026-08-19T23:59:59.000Z Window end, parsed with the JavaScript Date constructor. DEFAULT: now + 60 seconds - the extra minute compensates for OpenSearch Serverless near-real-time indexing lag. An unparseable value is 400. |
| pageSize | integer Example: pageSize=250 Page size. DEFAULT 250 when omitted or when the value is falsy (the JSON number 0 and an empty string are falsy and therefore fall back to 250). Any other value is parsed as an integer and clamped to a maximum of 500 by the shared OpenSearch service. Note that the string "0" IS truthy: it yields a zero-size query, an empty log array and hasMore true. A non-numeric value yields NaN and the query fails as a 500. |
| searchBefore | string Pagination cursor echoed by a previous response. The cursor is an ARRAY of sort values, which a query string cannot express, so a GET cannot page beyond the first page - use the POST form for pagination. |
| searchText | string Example: searchText=authentication failed Full-text search added as a multi_match (best_fields, operator 'and', fuzziness 'AUTO') across event, function_name, Administrator, SourceIP, SubscriberToken and LogType. It is ANDed with every other filter, INCLUDING a customQuery. |
| customQuery | string Not usable on GET. The endpoint only honours customQuery when the received value is a JavaScript object; a query-string value is a string, so the query itself is never applied. Its presence is still detected, however, and it suppresses the whole exact-match filter whitelist, so every other filter field you sent (function_name, LogType, Administrator, SourceIP, SubscriberToken, EquipmentID, KeyPoolID, ServicePlanID and the rest) is dropped with no error, widening the search. The route's own scoping and the date window are unaffected. Use the POST form. |
| function_name | string Name of the emitting function/route recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| LogType | string Log severity/type recorded on the document (e.g. the value the emitter wrote). Filterable, but NOT among the fields projected back by this route. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| Administrator | string The raw stored administrator identifier (username or email) as written by the emitter - match on the STORED value, not on the display string this route returns after enrichment. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| AdministratorOS | string Operating system parsed from the emitting request's User-Agent. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| AdministratorBrowser | string Browser parsed from the emitting request's User-Agent. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SourceIP | string Source IP recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SourceLocale | string Locale recorded on the log document ('en-us' or 'es-xl'). Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SubscriberToken | string SubscriberToken recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| UnitID_internal | string UnitID_internal recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| EquipmentID | string EquipmentID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| KeyPoolID | string KeyPoolID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| ServicePlanID | string ServicePlanID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else the English one. It affects rejection text only. |
{- "log": [
- {
- "@timestamp": "string",
- "function_name": "string",
- "event": { },
- "UnitID_internal": "string",
- "EquipmentID": "string",
- "EquipmentType": "string",
- "ServicePlanID": "string",
- "ServicePlanIDs": null,
- "KeyPoolID": "string",
- "SubscriberToken": "string",
- "Administrator": "string",
- "AdministratorOS": "string",
- "AdministratorBrowser": "string",
- "Subscriber": "string",
- "sourceIP": "string",
- "SourceIP": "string",
- "SourceLocale": "string",
- "SourceUA": "string"
}
], - "currentCount": 250,
- "totalCount": 10000,
- "pageSize": 250,
- "hasMore": true,
- "searchBefore": [
- null
], - "MinViewWindowDateUTC.ISO8601": "string",
- "MaxViewWindowDateUTC.ISO8601": "string",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "string",
- "errorProcessing": false
}Audit/event log documents for ONE venue unit from the operator's OpenSearch log indices. UnitID_internal is REQUIRED — omitting it doesn't hit a validation error, it matches no route branch and fails with 500.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent — a Venue-role caller must also send the VenueID it administers, applied as an extra filter.
Filtering: searchText fuzzy match, a whitelist of 13 fields, or raw OpenSearch customQuery (replaces the whitelist). Results newest-first, paged via searchBefore. Administrator values are expanded to a display form; event is always an object.
GET reads the query string (merged over the body); its response also adds Cache-Control: private, max-age=5.
| AccessToken | string Cognito access token. Absent/empty in both the request and the Authorization header is 401 'AccessToken Missing. '. It is verified only when the operator record resolved from the request Origin carries a Cognito pool; when it does not, the token is never validated, the caller lands in no access category, and the request is refused 401 'Access Denied. '. |
| IdToken | string Optional Cognito ID token. Used by the shared token validator only when the access token's username is not already cached: the ID token is then verified instead, and its preferred_username (or its email, resolved through the operator's email index) becomes the caller identity. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing is 401 'OperatorID Missing. '); it becomes the OperatorID every log query is filtered on and is then removed from the request. Ignored for every other caller, whose operator comes from the request Origin. |
| UnitID_internal required | string Example: UnitID_internal={VenueID}.{UNIT}.{BUILDING}.{FLOOR} REQUIRED. The unit whose logs are returned; it is part of the route's branch condition, so a request without it is answered 500, not 400/401. Applied as a term filter (twice, since UnitID_internal is also a whitelisted filter field). Format: {VenueID}.{UNIT}.{BUILDING}.{FLOOR}, where the last three components are upper-cased, stripped of characters outside A-Z a-z 0-9 _ - and truncated to 20 characters when the unit is created. |
| VenueID | string Required for a Venue-role caller: it is the value matched against the caller's VenueAdministrator/LeasingAgent arrays to grant that role, and it is then applied as an additional term filter so the caller sees only that venue's documents. Optional for NetworkSoftwareProvider and NetworkOperator callers, for whom it acts as an ordinary filter field. Composite Vault VenueID, {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| MinViewWindowDateUTC.ISO8601 | string Example: MinViewWindowDateUTC.ISO8601=2026-08-01T00:00:00.000Z Window start, parsed with the JavaScript Date constructor. DEFAULT: none - when it is omitted NO lower bound is applied at all and the query spans every monthly log index. Supplying it also switches the hit counter to exact mode; without it totalCount is capped (see the 200 response). An unparseable value is 400. |
| MaxViewWindowDateUTC.ISO8601 | string Example: MaxViewWindowDateUTC.ISO8601=2026-08-19T23:59:59.000Z Window end, parsed with the JavaScript Date constructor. DEFAULT: now + 60 seconds - the extra minute compensates for OpenSearch Serverless near-real-time indexing lag. An unparseable value is 400. |
| pageSize | integer Example: pageSize=250 Page size. DEFAULT 250 when omitted or when the value is falsy (the JSON number 0 and an empty string are falsy and therefore fall back to 250). Any other value is parsed as an integer and clamped to a maximum of 500 by the shared OpenSearch service. Note that the string "0" IS truthy: it yields a zero-size query, an empty log array and hasMore true. A non-numeric value yields NaN and the query fails as a 500. |
| searchBefore | string Pagination cursor echoed by a previous response. The cursor is an ARRAY of sort values, which a query string cannot express, so a GET cannot page beyond the first page - use the POST form for pagination. |
| searchText | string Example: searchText=authentication failed Full-text search added as a multi_match (best_fields, operator 'and', fuzziness 'AUTO') across event, function_name, Administrator, SourceIP, SubscriberToken and LogType. It is ANDed with every other filter, INCLUDING a customQuery. |
| customQuery | string Not usable on GET. The endpoint only honours customQuery when the received value is a JavaScript object; a query-string value is a string, so the query itself is never applied. Its presence is still detected, however, and it suppresses the whole exact-match filter whitelist, so every other filter field you sent (function_name, LogType, Administrator, SourceIP, SubscriberToken, EquipmentID, KeyPoolID, ServicePlanID and the rest) is dropped with no error, widening the search. The route's own scoping and the date window are unaffected. Use the POST form. |
| function_name | string Name of the emitting function/route recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| LogType | string Log severity/type recorded on the document (e.g. the value the emitter wrote). Filterable, but NOT among the fields projected back by this route. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| Administrator | string The raw stored administrator identifier (username or email) as written by the emitter - match on the STORED value, not on the display string this route returns after enrichment. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| AdministratorOS | string Operating system parsed from the emitting request's User-Agent. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| AdministratorBrowser | string Browser parsed from the emitting request's User-Agent. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SourceIP | string Source IP recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SourceLocale | string Locale recorded on the log document ('en-us' or 'es-xl'). Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| SubscriberToken | string SubscriberToken recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| EquipmentID | string EquipmentID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| KeyPoolID | string KeyPoolID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| ServicePlanID | string ServicePlanID recorded on the log document. Exact-match term filter. On GET only a single value can be expressed, so the filter is always a one-value exact match. |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else the English one. It affects rejection text only. |
{- "log": [
- {
- "@timestamp": "string",
- "function_name": "string",
- "event": { },
- "SubscriberToken": "string",
- "EquipmentID": "string",
- "EquipmentType": "string",
- "ServicePlanID": "string",
- "ServicePlanIDs": null,
- "KeyPoolID": "string",
- "Administrator": "string",
- "AdministratorOS": "string",
- "AdministratorBrowser": "string",
- "sourceIP": "string",
- "SourceIP": "string",
- "SourceLocale": "string",
- "SourceUA": "string"
}
], - "currentCount": 250,
- "totalCount": 10000,
- "pageSize": 250,
- "hasMore": true,
- "searchBefore": [
- null
], - "MinViewWindowDateUTC.ISO8601": "string",
- "MaxViewWindowDateUTC.ISO8601": "string",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "string",
- "errorProcessing": false
}List the operator's venues, role-filtered, from the operator's cached venue list. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue), NetworkOperator (sees every venue), Venue admin/leasing agent (filtered to their own VenueIDs), or Public (sees venues only when the operator's shopping cart is enabled).
Trimmed per venue: internal config sections, Stripe credentials, dateAddedUTC are removed; a DailyReport summary is added. A caller whose token carries no SubscriberToken (NSP, or Public) additionally loses externalVenueID, ShoppingCart and DailyReport.
A venue's ShoppingCart.enableShoppingCart/DisplayOptionID value of the literal Inherit is replaced with the operator's own value before the venue is returned.
Read-only.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. It affects only the one rejection message this endpoint raises itself ('OperatorID Missing. '); the shared validation literals are English whatever is sent. |
JSON object. A body is not required: with no access token the caller is simply treated as Public. If a body IS sent it must be valid JSON - a non-empty body that does not parse is rejected 401 with 'Malformed JSON in input. '.
| AccessToken | string Cognito access-token JWT. Optional; absent means the caller is Public. May instead be supplied as an |
| IdToken | string Cognito id token. When supplied, the verifier validates it instead of the access token and identifies the caller from its preferred_username, or from its email resolved through the operator's email cache. It is also checked against the global sign-out marker. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller, whose request is rejected 401 'OperatorID Missing. ' without it; it is then deleted from the body once consumed. Ignored for every other caller. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string"
}{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}List the operator's venues, role-filtered, from the operator's cached venue list (no live DB read). The operator is resolved from the Origin header.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue), NetworkOperator (sees every venue), Venue admin/leasing agent (filtered to their own VenueIDs), or Public — INCLUDING a request with no access token, which is not rejected. A Public caller sees venues only when the operator's shopping cart is enabled, filtered to venues with it enabled themselves.
Trimmed per venue: internal config sections, Stripe credentials, dateAddedUTC are removed; a DailyReport summary is added. A caller whose token carries no SubscriberToken (no token at all, or NSP) additionally loses externalVenueID, ShoppingCart and DailyReport.
Read-only. GET reads the query string (merged after the body) and adds Cache-Control: private, max-age=5. /networkoperatorconsole/shoppingcart/listVenues is an exact alias — same implementation and output.
| AccessToken | string Cognito access-token JWT. Optional - with no token the caller is treated as Public. May instead be supplied as an |
| IdToken | string Cognito id token. Only consulted during token verification, which itself only runs when an |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider - omitting it then is a 401. Ignored for every other caller. |
{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "string",
- "TZ": "America/New_York",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "WIRED+WIFI",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "USD",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}Creates a venue (property) under the caller's operator, and applies any venue-configuration properties sent in the same body to the new venue.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator of the operator. AccountManager, CustomerSupport and all venue-level/subscriber roles are NOT accepted here. The access token must be in the body — no Authorization header support.
Identifiers are derived, not accepted. VenueID is built from the property management group, country, state, postal code, venue name and city; the NAS-Identifier is derived from the same address components unless a longer one is supplied. Both must be unique — VenueID operator-wide, the NAS-Identifier system-wide across every operator.
On success: the new venue inherits default service plans, VLAN ranges, StrictPSK and notification settings from the operator; an audit entry is written, caches invalidated, a VenueAdded webhook fires if configured, and any other venue-configuration fields sent in the same body are applied immediately (only their message text is surfaced — a rejected field there does not fail the create).
Six missing-field checks, and both duplicate-detection paths, answer HTTP 200 with errorProcessing: true, not a 4xx.
JSON body. It is parsed by the legacy field-mapping step before the endpoint's own error handling starts, so a missing, empty or non-JSON body is not answered with a Vault error body on this operation.
| AccessToken required | string Cognito access-token JWT. It MUST be sent in the body - this operation does not read an Authorization header. Absent or empty gives 401 'AccessToken Missing. '. It is only verified when the resolved operator has a Cognito pool. |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider; it names the operator to create the venue under and is then deleted from the forwarded body. Absent for that caller gives 401 'OperatorID Missing. '. Ignored for a DomainAdministrator caller. |
| VenueName required | string Display name. Absent or empty gives HTTP 200 with errorProcessing true and 'VenueName missing from request. '. It is stripped of markup and of characters outside letters, digits, dot, underscore, hyphen, ampersand and space, trimmed, and truncated to 40 characters; the first 20 characters of that result, further stripped to letters, digits, underscore and hyphen and upper-cased, become the VenueName_ID component of the VenueID. |
| AddressLine1 required | string Street address. Absent or empty gives HTTP 200 with 'AddressLine1 missing from request. '. Sanitised and truncated to 40 characters. |
| AddressLine2 | string Optional suite/unit line, sanitised and truncated to 40 characters; stored as an empty string when not supplied. |
| City required | string Absent or empty gives HTTP 200 with 'City missing from request. '. Stripped of markup, trimmed and truncated to 40 characters; the first 10 characters of that, stripped to letters, digits, underscore and hyphen and upper-cased, become the City_ID component of the VenueID. |
| State required | string State or province. Absent or empty gives HTTP 200 with 'State missing from request. '. It is upper-cased and then matched against the country's state list by full name first and by abbreviation second; the ABBREVIATION is what gets stored and used in the VenueID. No match gives 401 'Invalid State for the selected country.'; a country with no state list gives 401 'No states found for ' followed by the country code. |
| Country | string Country. Absent or empty gives HTTP 200 with 'Country missing from request. '. It is normalised to an ISO 3166 alpha-3 code, so send an ISO 3166 CODE - alpha-2, alpha-3 or numeric (for example |
| Country.ISO3166A3 | string Alias: when present it is copied over Country before the required-field check runs. |
| PostalCode required | string Absent or empty gives HTTP 200 with 'PostalCode missing from request. '. Stripped of markup, trimmed and truncated to 10 characters; the first 10 characters of that, stripped to letters, digits, underscore and hyphen and upper-cased, become the PostalCode_ID component of the VenueID. |
| NAS-Identifier | string Optional RADIUS NAS identifier. It is honoured only when the supplied value is LONGER than 7 characters; a value of 7 characters or fewer is discarded and one is generated from the address components instead. A honoured value is stripped to letters, digits, dot, underscore and hyphen, truncated to 253 characters and upper-cased. It must be unique across the ENTIRE system, not just this operator. |
| externalVenueID | string The operator's own identifier for the venue. Stripped of markup and of characters outside letters, digits, dot, underscore, hyphen and space, trimmed and truncated to 64 characters; stored as null when not supplied. |
| NetworkConfiguration | object Venue network settings applied by the venue-configure step that runs after creation. The legacy flat spellings of the six Minimum/MaximumAutoGeneratedVLAN_* fields and allowOverlappingSubscriptionWiredUnit are folded in here by the field mapping. |
| Notifications | object Venue notification settings applied by the venue-configure step. The legacy flat spellings suppressSubscriberEmails, suppressSubscriberSMS, sendSubscriptionAddedEmail, sendSubscriptionEndEmail and WelcomeEmail_countdown_hours are folded in here by the field mapping. |
| ServicePlanConfiguration | object Venue default plans (DefaultServicePlanID_LocalWirelessAccess, DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess, DefaultServicePlanID_Roaming), applied by the venue-configure step. Values not supplied are inherited from the operator record at creation time. |
| ShoppingCart | object Venue shopping-cart settings (enableShoppingCart, TrialCycleAdjustment, ShoppingCartPriceAdjustment and a Stripe child), applied by the venue-configure step. The legacy flat spellings are folded in here by the field mapping. |
| Reporting | object Venue reporting settings, applied by the venue-configure step; the legacy flat ReportingSubscriptionEnd_lookahead_hours is folded in here. |
| PMS | object Property-management-system settings, applied by the venue-configure step. The legacy flat enableRealPageSync, RealPageSiteId and RealPage sync timestamp are folded in here by the field mapping. |
| property name* additional property | any |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueName": "Riverside Apartments",
- "AddressLine1": "100 Main Street",
- "AddressLine2": "Building B",
- "City": "Springfield",
- "State": "IL",
- "Country": "USA",
- "Country.ISO3166A3": "USA",
- "PostalCode": "60601",
- "NAS-Identifier": "string",
- "externalVenueID": "string",
- "NetworkConfiguration": { },
- "Notifications": { },
- "ServicePlanConfiguration": { },
- "ShoppingCart": { },
- "Reporting": { },
- "PMS": { }
}{- "message": "string",
- "VenueID": "string",
- "errorProcessing": false,
- "statusCode": 200
}Updates the stored record of one piece of network equipment at a venue (VenueID + EquipmentID) — each changed property is appended to an audit narrative returned as message.
⚠ This same logic also serves /admin/deleteVenueEquipmentPermanently, and honors a delete: true request property on THIS route too.
| AccessToken required | string Cognito access token. Missing or empty rejects with HTTP 401 and message 'AccessToken Missing. '. |
| VenueID required | string Venue that owns the equipment. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. Missing sets errorProcessing=true with message 'VenueID missing from request. ' while the HTTP status stays 200. The value must match the VenueID stored on the equipment record, otherwise the lookup is treated as a miss and returns 404. |
| EquipmentID required | string The equipment record's partition key (its ID attribute). addVenueEquipment keeps a caller-supplied EquipmentID_internal verbatim when its length is >0 and <256, and only otherwise composes VenueID + '._V3EQUIPMENT.' + EquipmentID, writing that value as the row's ID - so the composed form is the DEFAULT, not a guaranteed format; use the id that listVenueEquipment returns. Missing sets errorProcessing=true with message 'EquipmentID missing from request. ' and HTTP status 200. |
| OperatorID | string Required only for a Network Software Provider caller; missing rejects with HTTP 401 and 'OperatorID Missing. '. It is moved onto the request context and deleted from the body. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| Manufacturer | string <= 40 characters HTML-stripped, trimmed, truncated to 40 characters. Case-insensitive substring normalisation is applied: a value containing 'riq' becomes 'RiQ', 'mikrotik' becomes 'MikroTik', 'nomadix' becomes 'Nomadix', 'peplink' becomes 'Peplink', 'altiplano' becomes 'Altiplano'. Any other value is stored as the sanitised string - this field is not an enum and no value is rejected. Changing it to one of those five recognised manufacturers also sets remove_gatewayConfigured, which nulls AllGatewaysConfigured and drops this equipment id from gatewaysConfigured on every active subscription at the venue. |
| Model | string <= 40 characters HTML-stripped, trimmed, truncated to 40 characters. |
| MACAddress | string EUI-48/EUI-64, with or without separators. Stored canonically as uppercase colon-separated. An unparseable value rejects the whole call with HTTP 401 and message 'Invalid MACAddress: ' + the trimmed supplied value + '. '. |
| UnitID_internal | string or null Venue unit this equipment serves; format VenueID + '.' + UnitID + '.' + UnitBuilding + '.' + UnitFloor, each component uppercased and stripped to [A-Za-z0-9_-]. Explicit null detaches the equipment from its current unit. A supplied id must exist in venue store-units - absent gives HTTP 404 'Unit not found: ' + id + '. ' - and must be at the same venue, otherwise HTTP 401 'Unit ' + id + ' is not at venue ' + VenueID + '. '. Ids matching /-(TEMP|WIFI)-\d/ are auto-generated sub-units and are refused with HTTP 401 'Cannot attach equipment to auto-generated unit ' + id + '. '. Equipment whose (resulting) EquipmentType is Gateway or Wireless Controller cannot carry a unit at all: HTTP 401 ' |
| EquipmentType | string Enum: "Gateway" "Firewall" "OLT" "Wireless Controller" "Wi-Fi Access Point" "Switch" "CMTS" "Router" "SmartBox" "StreamBlade" "LAN Load Balancer" "Data Plane" "G.hn Headend" "WAN Load Balancer" "DSL" "Other" The supplied value is HTML-stripped, trimmed and truncated to 30 characters, then matched case-insensitively. Besides the lower-cased canonical spellings listed in the enum, these aliases are accepted and stored in canonical form: 'wirelesscontroller' -> 'Wireless Controller'; 'wifi access point', 'wi-fiaccesspoint', 'wifiaccesspoint' -> 'Wi-Fi Access Point'; 'lanloadbalancer' -> 'LAN Load Balancer'; 'dataplane' -> 'Data Plane'; 'ghnheadend' -> 'G.hn Headend'; 'wanloadbalancer' -> 'WAN Load Balancer'. Anything else rejects with HTTP 401 and message 'Invalid EquipmentType: ' + value + '. Supported types are Gateway, Firewall, OLT, Wireless Controller, Wi-Fi Access Point, Switch, CMTS, Router, SmartBox, StreamBlade, LAN Load Balancer, Data Plane, G.hn Headend, WAN Load Balancer, DSL, Other.'. Setting it to Gateway when the venue already has 3 gateways rejects with HTTP 401 'Maximum of 3 gateways allowed per venue.'. |
| WirelessZone | string <= 40 characters HTML-stripped, trimmed, truncated to 40 characters. |
| MikrotikPre643 | boolean Only accepted as a real boolean. When the equipment is a Gateway, a change also resets the gateway error counters. |
| ConnectionProtocol | string Enum: "http" "https" Any other value is silently ignored — there is no rejection branch. |
| IPAddress | string IPv4 or IPv6, validated as an IP address. A value that fails validation is silently ignored, not rejected. |
string or integer Validated as a port on the string form; a failing value is silently ignored. | |
| Username | string <= 64 characters Device login. HTML-stripped, trimmed, truncated to 64 characters. |
| Password | string <password> <= 100 characters Device password. HTML-stripped, trimmed, truncated to 100 characters. The audit narrative records only 'Updated Password. ', never the value. |
| Status | string Enum: "UP" "IN SERVICE" "DOWN" Compared case-insensitively; both 'UP' and 'IN SERVICE' store 'UP'. Any other value is ignored. Setting a Gateway to DOWN sends an equipment-error notification. |
| updateACL | boolean Only boolean AS CURRENTLY BUILT EVERY updateACL:true REQUEST RETURNS HTTP 500, by one of two paths, so the ACL is never reported as pushed. (1) The equipment IS a MikroTik gateway (EquipmentType 'Gateway', Manufacturer 'Mikrotik'/'MikroTik', IPAddress not 127.0.0.1 -): NetworkEquipment.updateACL assigns response.body = the WHOLE object returned by updateACL_MikroTik -> updateMikroTik ({statusCode, body:'[...]'}), so the JSON call receives an object; validator's assertString throws TypeError('Expected a string but received a Object') (validator 13.15.35), the catch fires answer 500 with message 'Error updating ACL: Expected a string but received a Object. '. (2) Anything else: sets a STRING body of [{ERROR:'Gateway not found. '}], branch fires answer 500. There is therefore no success shape for this flag today. |
| delete | boolean PERMANENT DELETE. Set automatically when the request arrives on /admin/deleteVenueEquipmentPermanently, but also honoured when sent in the body on this path. '. |
| property name* additional property | any |
{- "AccessToken": "eyJraWQiOiJ...<access token>",
- "VenueID": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "EquipmentID": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>._V3EQUIPMENT.<EquipmentID>",
- "OperatorID": "<Country>.<State>.<PostalCode_ID>.<OperatorName_ID>.<City_ID>",
- "Manufacturer": "MikroTik",
- "Model": "RB4011",
- "MACAddress": "AA:BB:CC:DD:EE:FF",
- "UnitID_internal": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>.<UnitID>.<UnitBuilding>.<UnitFloor>",
- "EquipmentType": "Gateway",
- "WirelessZone": "ZONE-1",
- "MikrotikPre643": false,
- "ConnectionProtocol": "https",
- "IPAddress": "192.168.1.100",
- "Port": "8728",
- "Username": "admin",
- "Password": "<device password>",
- "Status": "UP",
- "updateACL": true,
- "delete": false
}{- "message": "Updated Manufacturer = MikroTik. Updating IPAddress to <IPAddress>. Updating Port to <Port>. Updating Status to UP. ",
- "errorProcessing": false,
- "statusCode": 200
}Lists one venue's units. Read-only.
No token required — an absent or unmatched token resolves to the Public role rather than being rejected.
Access: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (matched against the VenueID as sent, before any external-id resolution), Subscriber, or Public.
Two response shapes, both under VenueUnits: a cut-down cart projection for Public callers, and a fuller console projection for everyone else (Subscriber included).
Extra filtering for Subscriber and Public: occupied units are dropped unless the caller already holds them or the unit allows overlapping subscriptions; cart-disabled units are also dropped (a strict false test for Public, a loose one for Subscriber). NetworkSoftwareProvider/NetworkOperator/Venue callers see everything.
api-version gate: StrictPSK and (console projection only) NetworkConfiguration.VenueUnitSSID require api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
Also available as GET, with identical fields sent as query-string parameters.
An unknown venue is not an error — the response is 200 with no VenueUnits key.
| api-version | string Example: 20260417 Parsed as an integer. At 20260417 or higher (or after the 2026-11-17 sunset) the reply gains |
| Authorization | string Optional |
| AccessToken | string Cognito access-token JWT. Optional — omitting it yields |
| IdToken | string Cognito id token. Read by the shared token verifier alongside the access token, and also checked against the global sign-out marker. |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller — absent, that caller is rejected 401. For every other caller the operator is derived from the request Origin and this field is ignored. |
| VenueID | string Venue whose units are listed. Required unless it can be derived from |
| externalVenueID | string The operator's own venue identifier; resolved to |
| externalVenueUnitID | string The operator's own unit identifier; resolved to |
| UnitID_internal | string Narrows the result to a single unit, and resolves |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "externalVenueID": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string"
}{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 42,
- "message": "string",
- "errorProcessing": false
}Lists one venue's units. Read-only. GET form — every field is sent as a query-string parameter.
No token required — an absent or unmatched token resolves to the Public role rather than being rejected.
Access: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (matched against the VenueID as sent, before any external-id resolution), Subscriber, or Public.
Two response shapes, both under VenueUnits: a cut-down cart projection for Public callers, and a fuller console projection for everyone else (Subscriber included).
Extra filtering for Subscriber and Public: occupied units are dropped unless the caller already holds them or the unit allows overlapping subscriptions; cart-disabled units are also dropped (a strict false test for Public, a loose one for Subscriber). NetworkSoftwareProvider/NetworkOperator/Venue callers see everything.
api-version gate: StrictPSK and (console projection only) NetworkConfiguration.VenueUnitSSID require api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
An unknown venue is not an error — the response is 200 with no VenueUnits key.
| AccessToken | string Cognito access-token JWT. Optional — omitting it yields |
| IdToken | string Cognito id token. Read by the shared token verifier alongside the access token, and also checked against the global sign-out marker. |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller — absent, that caller is rejected 401. For every other caller the operator is derived from the request Origin and this field is ignored. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} Venue whose units are listed. Required unless it can be derived from |
| externalVenueID | string The operator's own venue identifier; resolved to |
| externalVenueUnitID | string The operator's own unit identifier; resolved to |
| UnitID_internal | string Narrows the result to a single unit, and resolves |
| api-version | string Example: 20260417 Parsed as an integer. At 20260417 or higher (or after the 2026-11-17 sunset) the reply gains |
| Authorization | string Optional |
{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 42,
- "message": "string",
- "errorProcessing": false
}Creates one unit inside an existing venue — or, if the derived unit key already exists, updates that unit instead. Despite the plural path name, one unit per call.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator. AccountManager/CustomerSupport are NOT accepted on this route (unlike other venue endpoints).
UnitID_internal is derived, never accepted — built from VenueID/UnitID/UnitBuilding/UnitFloor, each truncated and sanitized. Address fields left out are inherited from the venue.
VLAN handling: below 200 units at the venue, an omitted VLAN auto-generates from the operator's configured range; from 200 units an explicit VLAN becomes mandatory; at 5000 units the venue is closed to new units.
Both the create and already-exists paths run the same body through the unit-configure step afterward, so configuration fields sent alongside are applied in the same request.
| Authorization | string Optional alternative to the body |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue for the localised messages, anything else US English. It affects only the localised subset of |
| AccessToken | string Caller's Cognito JWT access token. May instead be supplied as an |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and identifies the caller by its preferred_username, or failing that by its email resolved through the operator's email cache. |
| OperatorID | string Target operator. REQUIRED only for a Network Software Provider caller, where it names the operator the unit is created under and is then removed from the forwarded body; omitting it in that case -> 401 'OperatorID Missing. '. It is not read for a Network Operator caller, whose operator comes from the request Origin. |
| VenueID | string Venue the unit belongs to. Not checked by the endpoint; the venue object rejects an absent value with 401 'Invalid VenueID: undefined', rejects the literal string 'global' (case-insensitive) with 401 'Invalid VenueID: |
| externalVenueID | string Alternative way to select the venue. The operator's venues are listed and, only when EXACTLY ONE carries this external id, it overwrites |
| UnitID required | string <= 20 characters Unit identifier, e.g. an apartment number. REQUIRED: absent or empty returns HTTP 200 carrying errorProcessing true and message 'UnitID missing from request. ', so the service's own address-derived fallback for UnitID can never run on this route. The value is coerced to a string, HTML-stripped, trimmed and truncated to 20 characters; its upper-cased, [A-Za-z0-9_-]-only first 20 characters form the second segment of the derived UnitID_internal. |
| UnitBuilding | string <= 20 characters Building identifier. HTML-stripped and truncated to 20 characters, or the literal 'DEFAULT' when absent or empty. Third segment of the derived UnitID_internal. |
| UnitFloor | string <= 20 characters Floor identifier. Same handling as UnitBuilding, defaulting to the literal 'DEFAULT'. Fourth segment of the derived UnitID_internal. |
| purpose | string Default: "wiredunit" Enum: "wiredunit" "localwirelessonly" "globalroaming" Anything outside this set is silently replaced with 'wiredunit' rather than rejected. It selects which auto-generated-VLAN window the unit draws from: the global-wireless-plus-local-wired window for 'wiredunit', the local-wireless window for 'localwirelessonly', the global-roaming window for 'globalroaming'. |
integer or string Explicit VLAN id. A string is parsed to an integer first. Validated with a minimum of 1; out of range -> 401 'VLAN must be between 1-4095. '. When omitted a VLAN is auto-generated ONLY while the venue holds fewer than 200 units; from 200 units, omitting it -> 401 'VLAN must be provided when adding more than 200 units. '. | |
| AddressLine1 | string <= 40 characters Optional. Inherited from the venue when absent; otherwise HTML-stripped and truncated to 40 characters. |
| AddressLine2 | string <= 40 characters Optional. Inherited from the venue when absent; otherwise truncated to 40 characters. |
| City | string Optional. Inherited from the venue when absent. |
| State | string Optional. It is validated ONLY when |
| Country | string Optional. |
| Country.ISO3166A3 | string Alias for |
| PostalCode | string <= 10 characters Optional. Coerced to a string; a value that fails postal-code validation is REPLACED by the venue's postal code rather than rejected. Truncated to 10 characters. |
string or Array of strings Existing venue-equipment record id(s) to attach to the new unit - each the equipment record's own id as the venue-equipment listing returns it, not a bare serial number. EVERY id is verified to exist, to belong to this operator and to sit at this VenueID BEFORE the unit is created, so one bad id cannot leave a half-built unit behind: any miss -> 404 'Equipment not found at venue: | |
| PrimaryUnitID_internal | string Links this unit to a primary unit. Stored only when present, and only together with |
| PrimaryUnitID | string Stored only when |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID": "<unit identifier>",
- "purpose": "wiredunit"
}{- "message": "Unit added. ",
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.DEFAULT.DEFAULT",
- "UnitID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.DEFAULT.DEFAULT",
- "vlan": 1050,
- "errorProcessing": false
}Update a venue's postal address and related identity fields. Changed fields propagate to every unit at the venue and to active subscription payment records; an audit entry is written and the venue cache is invalidated.
Uniqueness: an exact match on the full address against another of the operator's venues is rejected.
Known limits: State and Country are accepted but never saved. Changing PostalCode to a new value currently fails outright (401), and none of the other field changes in that same request are saved either — avoid combining a postal-code correction with other edits until this is fixed.
Field rules: AddressLine1/AddressLine2/VenueName allow letters, digits, space and . _ - & ( ) , ? only (no #, /, '), max 40 characters. externalVenueID follows the same rule at 64 characters. City only rejects HTML and values over 40 characters.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles and subscriber tokens cannot use this operation. The access token must be in the request body — no Authorization header support.
Sending clearSuppressedMacs: true clears suppressed MACs instead of updating the address.
Check errorProcessing, not just the HTTP status — some validation failures return 200 with errorProcessing: true, and some return 401 with errorProcessing: false.
JSON object. Must be valid JSON - a non-empty non-JSON body is rejected with 401 'Malformed JSON in input. '. Supply only the fields you want changed.
| AccessToken required | string Operator console access-token JWT. Must be in the body; an |
| VenueID required | string Venue to change. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. The venue must belong to the operator the call resolves to, or the request is rejected with 'Venue not found. '. |
| VenueName | string <= 40 characters New venue name. Rejected on any sanitiser difference - see the validation rules in the operation description. |
| AddressLine1 | string <= 40 characters Street address. Rejected on any sanitiser difference; |
| AddressLine2 | string <= 40 characters Secondary address line. Send a single space character to CLEAR it - the stored value becomes an empty string. Any other value is validated like AddressLine1. |
| City | string <= 40 characters City. Rejected only for HTML content, surrounding whitespace, or more than 40 characters. |
| PostalCode | string Postal or ZIP code, validated against known formats for any country. CAUTION: changing this to a different value currently fails the whole request - see the operation description. |
| externalVenueID | string <= 64 characters The operator's own identifier for this venue. Send a single space character to CLEAR it. Letters, digits, space and |
| State | string ACCEPTED BUT NOT SAVED. The venue's stored state is never changed by this operation; the value is used only as part of the duplicate-address comparison. Omit it unless you intend to influence that comparison. |
| Country | string ACCEPTED BUT NOT SAVED. Same as |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider; it is consumed during authorisation and not passed on to the venue update. |
{- "AccessToken": "string",
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "VenueName": "Example Apartments",
- "AddressLine1": "500 Example Avenue",
- "AddressLine2": "Building 2",
- "City": "Springfield",
- "PostalCode": "10001",
- "externalVenueID": "EXTVENUE001",
- "State": "NY",
- "Country": "USA",
- "OperatorID": "string"
}{- "message": "Updated AddressLine1 = 500 Example Avenue. Updated City = Springfield. 120 units updated. 45 payments updated. Venue updated. ",
- "errorProcessing": true,
- "statusCode": 0
}Stores ConnectWise PSA credentials for one venue — a convenience wrapper over venue-configuration: the five ConnectWise fields may be sent flat (URL, Authorization, serviceboardid, ClientID, CompanyID) and are lifted into Integrations.ConnectWise.*; any other venue-configuration field in the same body is applied exactly as on configureVenue.
Authorization here is a body field (the ConnectWise credential), not the HTTP header — this operation never reads an Authorization request header.
⚠ The credential's allowed character set is narrow (letters, digits, . _ - & ( ) , ?) — a conventional Basic <base64> value is REJECTED, since : and = are stripped by sanitizing.
serviceboardid is read only when it parses as an integer; a board name is silently discarded.
Send a single space " " as URL/Authorization/ClientID/CompanyID to clear a stored value.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles are refused. The token must be in the body — no Authorization header support.
A 401 doesn't mean nothing changed — a per-field validation failure records its message and sets 401, but does not stop the rest of the request from being applied.
AccessToken and VenueID are required. The five ConnectWise values may be sent flat, as documented here, or nested under Integrations.ConnectWise. Any other venue-configuration property is accepted and applied as on the configureVenue operation.
| AccessToken required | string Cognito access-token JWT, in the BODY. Absent or empty gives 401 "AccessToken Missing. ". It is verified only when the resolved operator has a Cognito pool configured; without one the token is not verified and the role test then refuses the call. |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| VenueID required | string The venue whose ConnectWise credentials are set. Absent gives HTTP 200 with |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; absent in that case gives 401 "OperatorID Missing. ". It becomes the target operator and is removed from the forwarded body. Ignored for a NetworkOperator caller. Format is |
| URL | string ConnectWise API endpoint. Rewritten to |
| Authorization | string ConnectWise API credential — a BODY field, unrelated to the HTTP Authorization header, which this operation ignores. Max 256 characters, and only letters, digits, |
integer or string ConnectWise service-board identifier, rewritten to | |
| ClientID | string Rewritten to |
| CompanyID | string Rewritten to |
object The nested form of the same five values. Sending them here bypasses the flat rewrite and behaves identically. | |
| clearSuppressedMacs | boolean Shared with the venue-configuration operation. Strict |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "ClientID": "vault-integration",
- "CompanyID": "example-company",
- "serviceboardid": 12
}{- "message": "Updated Integrations.ConnectWise.URL = https://connectwise.example.com. Updated ConnectWiseClientID = vault-integration. Venue updated. ",
- "errorProcessing": false,
- "statusCode": 200
}Stores PRTG monitoring credentials for one venue — a convenience wrapper over venue-configuration: the three PRTG fields may be sent flat (URL, Username, PasswordHash) and are lifted into Integrations.PRTG.*; any other venue-configuration field in the same body is applied exactly as on configureVenue.
⚠ The credential character set is narrow (letters, digits, . _ - & ( ) , ?, max 256 chars) — punctuation like :, =, /, @ is stripped, producing a rejection rather than a silently-altered value.
Send a single space " " as URL/Username/PasswordHash to clear a stored value.
⚠ PasswordHash is masked on read — venue-detail responses return only the first characters plus ****; a round-trip will not return what was written. The audit message for a password change records only that it changed, never the value.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles are refused. Token must be in the body.
A 401 doesn't mean nothing changed — a per-field validation failure records its message and sets 401, but does not stop the rest of the request from being applied.
AccessToken and VenueID are required. The three PRTG values may be sent flat, as documented here, or nested under Integrations.PRTG. Any other venue-configuration property is accepted and applied as on the configureVenue operation.
| AccessToken required | string Cognito access-token JWT, in the BODY. Absent or empty gives 401 "AccessToken Missing. ". It is verified only when the resolved operator has a Cognito pool configured; without one the token is not verified and the role test then refuses the call. |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| VenueID required | string The venue whose PRTG credentials are set. Absent gives HTTP 200 with |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; absent in that case gives 401 "OperatorID Missing. ". It becomes the target operator and is removed from the forwarded body. Ignored for a NetworkOperator caller. Format is |
| URL | string PRTG server URL. Rewritten to |
| Username | string PRTG account name. Rewritten to |
| PasswordHash | string PRTG password hash or passhash. Rewritten to |
object The nested form of the same three values. Sending them here bypasses the flat rewrite and behaves identically. | |
| clearSuppressedMacs | boolean Shared with the venue-configuration operation. Strict |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "Username": "vault-monitor",
- "PasswordHash": "1234567890"
}{- "message": "Updated Integrations.PRTG.URL = https://prtg.example.com. Updated PRTGUsername = vault-monitor. Updated PRTGPasswordHash. Venue updated. ",
- "errorProcessing": false,
- "statusCode": 200
}Add one service plan to a venue's available list. This replaces the whole list — the venue's currently available plans are read, the new plan added, and the result submitted as the complete list; anything missing from that read is also removed from the venue. Only a plan belonging to the same operator and not flagged globally-available can be added.
Enabling an already-enabled plan is a silent no-op (200, empty message, nothing written).
Caution: the starting list comes from a cached copy of the venue; if it has diverged from the live record, plans missing from the cache are removed as a side effect. Re-read the venue between rapid successive changes.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles and subscriber tokens cannot use this operation.
Sending clearSuppressedMacs: true clears suppressed MACs instead of changing the plan list.
Check errorProcessing, not just the HTTP status — some validation failures return 200 with errorProcessing: true, some return 401 with errorProcessing: false.
JSON object. Must be valid JSON - a non-empty non-JSON body is rejected with 401 'Malformed JSON in input. '.
| AccessToken required | string Operator console access-token JWT. Must be in the body; an |
| VenueID required | string Venue to change. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. The venue must belong to the operator the call resolves to, or the request is rejected with 'Venue not found. '. |
| ServicePlanID | string Service plan to add. Format is {OperatorID}.V3SERVICEPLAN.{PLANNAME}, upper-cased with non-alphanumerics stripped. Optional in the protocol sense: if it is omitted or empty the request is still accepted and simply configures the venue with whatever else the body contains, without touching the plan list. |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider; it is consumed during authorisation and not passed on to the venue update. |
{- "AccessToken": "string",
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "ServicePlanID": "<OperatorID>._V3SERVICEPLAN_.1GBPS",
- "OperatorID": "string"
}{- "message": "Added <ServicePlanID> to venue. <n> units updated. <n> payments updated. Venue updated. ",
- "errorProcessing": true,
- "statusCode": 0
}Remove one service plan from a venue's list of available service plans.
The plan list is applied as a WHOLE: this operation reads the venue's currently available plans, removes ServicePlanID from that list, and submits the result as the venue's complete plan list. Anything missing from the list that is read is therefore also removed from the venue - see the caution below.
A plan flagged as a globally available plan is never removed from a venue, even when its id is supplied; the request succeeds and simply reports no change. Removing a plan that is already absent is likewise a no-op: HTTP 200, errorProcessing: false, and an EMPTY message. Use the venue listing to confirm the resulting plan set rather than relying on the message.
A plan still in use at the venue cannot be disabled. If any subscription at this venue is active or starts in the future - no end date, or an end date still ahead - and carries the plan as its ServicePlanID or its CurrentServicePlanID, the request is refused with HTTP 401, errorProcessing: true and 'ServicePlan CurrentServicePlanID is checked because a subscription degraded after a failed payment runs on the degraded plan while its ServicePlanID still names the paid one, and is restored to it on the next successful payment. End or migrate those subscriptions, or move them to another plan, before disabling it.
Caution - this is a whole-list replacement built from a cached copy of the venue. The list this operation starts from is the operator's cached venue data, while the change is applied against the venue's live record. If the two have diverged - a plan enabled moments earlier, or a cache entry that does not yet contain this venue - the plans missing from the cached copy are removed from the venue as a side effect. When several plan changes are made in quick succession, re-read the venue between calls and verify the resulting plan set.
Who may call it. Exactly two kinds of caller are accepted:
Username and no SubscriberToken; such a caller must also send OperatorID, naming the operator to act on, and omitting it is a 401.AdministrativeAccess.NetworkOperator.DomainAdministrator, .AccountManager or .CustomerSupport contains the resolved operator's id.Every other caller is rejected with 401 'Access Denied. '. That explicitly includes venue-level roles: a VenueAdministrator or LeasingAgent token CANNOT use this operation, even for a venue it administers, and neither can a subscriber token. The access token must be in the request body - this operation does not read an Authorization header - and an empty or missing AccessToken is 401 'AccessToken Missing. '.
The whole request body is forwarded to the venue-configuration engine, which is shared with configureVenue. Only the fields documented here are interpreted for this operation; any other venue-configuration property present in the body is applied too, including the bulk-delete flags deleteEmptyVenueUnits, deleteVenueifEmpty and forceDelete. Send only the fields you intend to change. One field is an exception: clearSuppressedMacs: true REPLACES the operation instead of adding to it - the hand-off to the configuration engine is skipped entirely, so the plan list is not changed, and the reply is a different 200 body reporting a RADIUS suppressed-MAC clear (message, VenueID, NAS-Identifier, region, cleared, truncated, totalKeys, deletedKeys, counts, suppressed) with no statusCode.
Read errorProcessing and message, not just the HTTP status. Two mismatches are normal here. A request that fails the operation's own field checks is answered with HTTP 200 and errorProcessing: true. Conversely, several validation failures raised while applying the body return HTTP 401 while leaving errorProcessing: false - the text in message is the authoritative signal in that case. A run that changed nothing succeeds with an EMPTY message.
Changes are written to the venue record and cascade: venue units, active subscriptions and their payment records are updated, an audit entry is written, the operator's cached venue data is invalidated, and a VenueUpdated webhook is sent when the operator has a webhook URL configured.
JSON object. Must be valid JSON - a non-empty non-JSON body is rejected with 401 'Malformed JSON in input. '.
| AccessToken required | string Operator console access-token JWT. Must be in the body; an |
| VenueID required | string Venue to change. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. The venue must belong to the operator the call resolves to, or the request is rejected with 'Venue not found. '. |
| ServicePlanID | string Service plan to remove. Format is {OperatorID}.V3SERVICEPLAN.{PLANNAME}, upper-cased with non-alphanumerics stripped. Optional in the protocol sense: if it is omitted or empty the request is still accepted and simply configures the venue with whatever else the body contains, without touching the plan list. |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider; it is consumed during authorisation and not passed on to the venue update. |
{- "AccessToken": "string",
- "VenueID": "<pmgId>._V3VENUE_.USA.NY.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "ServicePlanID": "<OperatorID>._V3SERVICEPLAN_.1GBPS",
- "OperatorID": "string"
}{- "message": "Removed service plan <ServicePlanID> from venue. <n> units updated. <n> payments updated. Venue updated. ",
- "errorProcessing": true,
- "statusCode": 0
}Permanently deletes one venue — but only when it's empty (no currently-active subscription). This is the same code path as venue configuration; the operation name alone triggers the delete.
Cascade order when empty: every unit, then equipment, then the venue record, then its messages — plus cache invalidation and a security notification email. Occupied units block the whole delete; nothing is removed.
Every other request field is discarded once the delete is armed — except forceDelete, read just before the body is cleared.
forceDelete does NOT force anything — with occupied units, it just returns 200 saying a subscription delete was initiated (no actual teardown happens; retrying reports the same occupied units until those subscriptions end some other way). Without it, the same situation is a 401. Either way, nothing is deleted.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles are refused. Token must be in the body.
⚠ The reply reports intent, not confirmation — a mid-cascade failure is logged, not raised; the response can read "Deleting empty venue
clearSuppressedMacs: true short-circuits this route entirely into a RADIUS suppression clear and deletes nothing.
| AccessToken required | string Cognito access-token JWT, in the BODY. Absent or empty gives 401 "AccessToken Missing. ". It is verified only when the resolved operator has a Cognito pool configured; without one the token is not verified and the role test then refuses the call. |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| VenueID required | string The venue to delete. Absent gives HTTP 200 with |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; absent in that case gives 401 "OperatorID Missing. ". It becomes the target operator and is removed from the forwarded body. Ignored for a NetworkOperator caller. Format is |
| forceDelete | boolean Default: false Strict |
| clearSuppressedMacs | boolean Shared with the venue-configuration operation. Strict |
| Calling-Station-Id | string Read only alongside |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}"
}{- "message": "Deleting empty venue {pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. ",
- "errorProcessing": false,
- "statusCode": 200
}Permanently deletes every EMPTY unit of one venue (empty = no active subscription references it) — the venue itself and its occupied units are kept.
⚠ Unlike the single-unit/single-equipment delete paths, this does NOT blank the request body — any other venue-configuration property sent alongside is also applied to the venue in the same call.
Related venue-level cache keys are invalidated only in the finalization block, which is skipped when the call errored. No api-version gating on this path.
| AccessToken required | string Caller's Cognito JWT, sent in the body. Absent/empty rejects with 401 and message 'AccessToken Missing. '; when present it is verified by request validation. |
| VenueID required | string Venue whose empty units are deleted. Format built as '{pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}'. Absent/empty returns HTTP 200 with errorProcessing true and message 'VenueID missing from request. '. The venue record must exist AND carry the caller's OperatorID, otherwise 401 'Venue not found. '. |
| OperatorID | string Required only for a Network Software Provider caller; it becomes the target operator and is then deleted from the body. Missing for an NSP caller rejects with 401 'OperatorID Missing. '. Ignored for a Network Operator caller. Format built as '{Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}'. |
| forceDelete | boolean Default: false Read only when the venue has occupied units. false/absent -> the response is 401 'Venue has |
| clearSuppressedMacs | boolean Shared-handler flag. When strictly true (=== true) the endpoint short-circuits into the suppressed-MAC clearing path and NEVER calls venue/configure, so no unit is deleted and the 200 body is one of the four suppression-clear bodies instead. Do not send it on this resource unless that is the intent. |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}"
}{- "message": "Deleting 42 empty units from venue <VenueID>. Venue updated.",
- "errorProcessing": false,
- "statusCode": 200
}Permanently deletes one venue unit — the request body is blanked, so no other unit property sent alongside is applied.
⚠ A Subscriber-category token is ALSO admitted on this path but is NOT given the delete flag — instead their body is rewritten to clear the unit's SSIDs, which REMOVES every SSID from the unit if their subscription is the sole active one there (refused otherwise). No api-version gating on this path.
| AccessToken required | string Caller's Cognito JWT. Absent/empty rejects with 401 and message 'AccessToken Missing. '. |
| UnitID_internal required | string Absent/empty returns HTTP 200 with errorProcessing true and message 'UnitID_internal missing from request. '. |
| OperatorID | string Required only for a Network Software Provider caller; it becomes the target operator and is then deleted from the body. Missing for an NSP caller rejects with 401 'OperatorID Missing. '. Ignored for a Network Operator caller. Format built as '{Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}'. |
| forceDelete | boolean Default: false Read UNCONDITIONALLY, the first statement of the delete branch, before the attached-equipment check, the pending-decommission check and the subscription query; it is only CONSUMED, where active subscriptions exist. false/absent with active subscriptions -> 401 'Unit has |
| property name* additional property | any |
{- "AccessToken": "eyJraWQiOiJ...<jwt>",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}"
}{- "message": "Deleting empty unit <UnitID_internal>.",
- "errorProcessing": false
}Sends the subscriber-console password-reset code — or, for an account that has never accepted the Terms and Conditions, the welcome message with its temporary password. Despite the name, this is the general subscriber password-reset module.
No authentication is required — an unauthenticated request is accepted and classified Public.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), Subscriber (always their own account only), or Public.
Delivery: NotificationChannel: "SMS" forces SMS to the subscriber's stored phone number (bypassing suppression) when one exists; otherwise email is sent. An EmailAddress/PhoneNumber in the request is only used to look the subscriber up, never as a destination.
Privacy for unauthenticated callers: a Public caller always gets the same 200 success body, whether or not the subscriber exists or is reachable — this prevents account enumeration. Authenticated callers get the real rejection instead.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional on this route. When non-empty the value is split on a space and element [1] is taken as the AccessToken, OVERWRITING any AccessToken in the request body. A value with no space yields undefined, which is then treated as no token at all - the request is processed as an anonymous Public call rather than rejected. |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) message catalogue, anything else US English. This affects the response 'message' text only. |
| AccessToken | string Cognito JWT access token. Optional. Overwritten by the Authorization header when that header is present. Verified only when the operator record carries a Cognito pool; a token that fails verification is rejected 401. |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and its preferred_username (or, failing that, its email resolved through the operator's email cache) identifies the caller. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller, which is rejected 401 'OperatorID Missing. ' without it. It then replaces the operator context and is removed from the request before the identifier lookups run. Ignored for every other caller. |
| VenueID | string Read only by the role check: a caller whose venue-level role list contains this exact VenueID is classified 'Venue'. It does NOT scope the reset and it is not required for operator-level callers - but a venue staff member who omits it is classified 'Subscriber' and resets their own password instead of the target's. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Identifies the target subscriber directly. Highest precedence of the four identifiers. Ignored for a caller classified 'Subscriber', whose own token always wins. |
| externalSubscriberID | string The operator's own subscriber identifier; resolved to a SubscriberToken. Used only when SubscriberToken is absent. |
| EmailAddress | string Subscriber email address; lower-cased and resolved to a SubscriberToken. Used only when SubscriberToken and externalSubscriberID are absent. Look-up only - the reset is delivered to the address stored on the subscriber record. |
| PhoneNumber | string Lowest precedence of the four identifiers. Note the un-dotted name: a 'PhoneNumber.E164' property is not read by this route. |
| NotificationChannel | string Passed straight through to the notification engine. The only value with an effect is the exact string 'SMS', which sends the code by SMS to the subscriber's stored phone number and bypasses every suppression flag - but only when the subscriber record has a phone number; without one the request falls back to email. Any other value, or none, sends email when the subscriber record has an email address. |
| Domain | string Read only when the resolved operator is the NetworkSoftwareProvider itself: it stages a second operator record for admin use. It does not select the operator whose subscriber is reset - use OperatorID for that. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "NotificationChannel": "string",
- "Domain": "string"
}{- "message": "Code to reset password sent to account. ",
- "errorProcessing": false,
- "statusCode": 200
}Lists the property-management groups recorded on the operator's cached record — read-only, no database query, no venue linkage (so a venue-level caller sees the operator's full list, not a narrowed one).
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or a caller holding a VenueAdministrator/LeasingAgent role for a supplied VenueID. Anyone else, including an unauthenticated request, is refused.
Note: an NSP's OperatorID only sets which operator id is USED in the call — the groups returned still come from the operator resolved from the request Origin, so a provider can't read another operator's list this way.
GET responses carry Cache-Control: private, max-age=5.
| AccessToken | string Cognito access-token JWT. May instead be sent as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 |
| VenueID | string REQUIRED for a caller whose only rights are venue-level: the request is authorised only when this venue appears among the VenueAdministrator and LeasingAgent venues on the caller's token. It does NOT filter the response - the full operator list is returned either way. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string"
}{- "PropertyManagementGroups": {
- "property1": {
- "dateAddedUTC.ISO8601": "2026-03-04T18:22:07.113Z",
- "PropertyManagementGroupName": "Example Property Management",
- "AddressLine1": "100 Example Street",
- "AddressLine2": "Suite 200",
- "City": "Springfield",
- "State": "IL",
- "Country.ISO3166A3": "USA",
- "PostalCode": "62704",
- "EmailAddress": "manager@example.com",
- "PhoneNumber": "+15551234567"
}, - "property2": {
- "dateAddedUTC.ISO8601": "2026-03-04T18:22:07.113Z",
- "PropertyManagementGroupName": "Example Property Management",
- "AddressLine1": "100 Example Street",
- "AddressLine2": "Suite 200",
- "City": "Springfield",
- "State": "IL",
- "Country.ISO3166A3": "USA",
- "PostalCode": "62704",
- "EmailAddress": "manager@example.com",
- "PhoneNumber": "+15551234567"
}
}, - "PropertyManagementGroupsCount": 2,
- "message": "",
- "errorProcessing": false
}Lists the property-management groups recorded on the operator's cached record — read-only, no database query, no venue linkage (so a venue-level caller sees the operator's full list, not a narrowed one).
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or a caller holding a VenueAdministrator/LeasingAgent role for a supplied VenueID. Anyone else, including an unauthenticated request, is refused.
Note: an NSP's OperatorID only sets which operator id is USED in the call — the groups returned still come from the operator resolved from the request Origin, so a provider can't read another operator's list this way.
GET responses carry Cache-Control: private, max-age=5.
| AccessToken | string Cognito access-token JWT. Not marked required at the parameter level because it may instead arrive in the Authorization header, but with neither present the call is refused 401 |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 |
| VenueID | string REQUIRED for a caller whose only rights are venue-level: the request is authorised only when this venue appears among the VenueAdministrator and LeasingAgent venues on the caller's token. It does NOT filter the response. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| api-version | string Accepted by the platform but not read by this operation - no field of this response is version-gated. |
{- "PropertyManagementGroups": {
- "property1": {
- "dateAddedUTC.ISO8601": "2026-03-04T18:22:07.113Z",
- "PropertyManagementGroupName": "Example Property Management",
- "AddressLine1": "100 Example Street",
- "AddressLine2": "Suite 200",
- "City": "Springfield",
- "State": "IL",
- "Country.ISO3166A3": "USA",
- "PostalCode": "62704",
- "EmailAddress": "manager@example.com",
- "PhoneNumber": "+15551234567"
}, - "property2": {
- "dateAddedUTC.ISO8601": "2026-03-04T18:22:07.113Z",
- "PropertyManagementGroupName": "Example Property Management",
- "AddressLine1": "100 Example Street",
- "AddressLine2": "Suite 200",
- "City": "Springfield",
- "State": "IL",
- "Country.ISO3166A3": "USA",
- "PostalCode": "62704",
- "EmailAddress": "manager@example.com",
- "PhoneNumber": "+15551234567"
}
}, - "PropertyManagementGroupsCount": 2,
- "message": "",
- "errorProcessing": false
}Creates a venue (property) under the caller's operator. VenueID and the NAS-Identifier are DERIVED, not accepted — built from sanitized/truncated/uppercased address components (VenueName/City/PostalCode), unless a NAS-Identifier longer than 7 characters is explicitly supplied.
Both must be free: VenueID is the table partition key; the NAS-Identifier is checked for uniqueness across the ENTIRE system (every operator, every PMG) via a global index.
| AccessToken required | string Caller's Cognito JWT, sent in the body. This endpoint does NOT read an Authorization header. Absent/empty -> 401 'AccessToken Missing. '; present, it is verified by request validation when the operator has a CognitoPool. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; it then becomes the target operator and is deleted from the forwarded body. Missing for an NSP caller -> 401 'OperatorID Missing. '. Ignored for a NetworkOperator caller. Format is built as '{Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}'. |
| VenueName required | string Venue display name. Empty/absent -> HTTP 200 with errorProcessing true and message 'VenueName missing from request. '. Sanitised to A-Z a-z 0-9. _ - & and space, trimmed, truncated to 40 characters; its first 20 characters, uppercased and stripped to [A-Za-z0-9_-], become the VenueName_ID segment of the VenueID. |
| AddressLine1 required | string Street address. Absent -> 200 'AddressLine1 missing from request. '. Sanitised and truncated to 40 characters. Not part of the VenueID. |
| AddressLine2 | string Optional second address line, sanitised and truncated to 40 characters; stored as '' when absent. Never validated by the endpoint. |
| City required | string Absent -> 200 'City missing from request. '. HTML-stripped and truncated to 40 characters; its first 10 characters, uppercased and stripped to [A-Za-z0-9_-], become the City_ID segment. |
| State required | string State or province. The submitted value is HTML/entity-stripped and trimmed into |
| Country | string ISO 3166 country CODE - alpha-2, alpha-3 or numeric, in any case. runs |
| Country.ISO3166A3 | string Alias for Country; when present it overwrites Country. Because the endpoint copies it BEFORE the Country presence test, supplying this field alone satisfies the country requirement. Same ISO 3166 alpha-3 code format expected. |
| PostalCode required | string Absent -> 200 'PostalCode missing from request. '. Validated as a postal code; failure -> 401 'Invalid PostalCode ' + |
| externalVenueID | string Optional external identifier. Sanitised to [A-Za-z0-9._- and space], truncated to 64 characters; stored as null when absent. |
| NAS-Identifier | string Optional RADIUS NAS-Identifier. Honoured ONLY when longer than 7 characters; that value is then stripped to [A-Za-z0-9._-], truncated to 253 characters and uppercased. A 1-7 character value is silently discarded and the identifier is auto-generated as ' |
object Stored flattened as the venue attribute FCCLabeldisplayLabel. | |
object Only WirelessOnlyPlanVLANOffset is read on this path; the rest reach the venue through the configure call. | |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueName": "<venue display name>",
- "AddressLine1": "<street address>",
- "City": "<city>",
- "State": "<state name or abbreviation>",
- "Country": "USA",
- "PostalCode": "<postal code>"
}{- "message": "Venue added {pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.Venue updated.",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "errorProcessing": false
}Register one piece of network equipment at a venue. Create only — an existing record is rejected, not updated.
The add and the configure are one unit of work. Immediately after the row is written, configureVenueEquipment runs against it with the same body — that's what actually persists Manufacturer, Model, EquipmentType, connection details, MACAddress, UnitID_internal, etc. If the configure step rejects, the just-created row is DELETED again and the message becomes 'Equipment not added. ' plus the configure failure — so a corrected retry is never blocked by 'Equipment already exists. '.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator.
| AccessToken | string Cognito JWT. May be sent in the body or as |
| OperatorID | string Target operator. REQUIRED for a NetworkSoftwareProvider caller, deleted from the body once accepted. |
| VenueID required | string REQUIRED. Venue id in the form |
| EquipmentID required | string REQUIRED. Operator-chosen identifier; it becomes the suffix of the stored key |
| EquipmentID_internal | string Optional explicit primary key. Honoured only when its length is 1-255, otherwise it is overwritten with the derived value. |
| ConnectionProtocol required | string Enum: "http" "https" REQUIRED. The check is |
| IPAddress required | string REQUIRED. Must be a string and pass an IP address or an IP address. |
| Port required | string REQUIRED. Coerced to a string and checked as a port, so a JSON number is accepted. |
| Username required | string <= 64 characters REQUIRED. Rejected when the length is not < 65. |
| Password required | string <= 100 characters REQUIRED. Rejected when the length is not < 101. Masked before any response logging. |
| Manufacturer | string Optional. HTML tags and entities stripped, trimmed, truncated to 20 characters. |
| Model | string Optional. Same sanitisation, 20 characters. |
| EquipmentType | string Optional. Sanitised and truncated to 20 characters by the endpoint, then matched case-insensitively by configureVenueEquipment and stored in canonical form - Gateway, Firewall, OLT, Wireless Controller, Wi-Fi Access Point, Switch, CMTS, Router, SmartBox, StreamBlade, LAN Load Balancer, Data Plane, G.hn Headend, WAN Load Balancer, DSL, Other (space-free spellings such as |
| MACAddress | string Optional. Accepted with or without separators; stored in canonical upper-case colon-separated form by the configure half. |
| UnitID_internal | string Optional unit the equipment serves. Rejected when the EquipmentType is a gateway or a wireless controller (both serve the whole venue), when the unit is an auto-generated dynamic sub-unit (its id matching |
| WirelessZone | string Optional pass-through to the configure half; sanitised and truncated to 40 characters there. |
| MikrotikPre643 | boolean Optional pass-through; stored only when exactly |
| Status | string Optional pass-through; acted on only when the upper-cased value is |
| updateACL | boolean Optional pass-through. Only the literal |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "EquipmentID": "string",
- "EquipmentID_internal": "string",
- "ConnectionProtocol": "http",
- "IPAddress": "string",
- "Port": "string",
- "Username": "string",
- "Password": "string",
- "Manufacturer": "string",
- "Model": "string",
- "EquipmentType": "string",
- "MACAddress": "string",
- "UnitID_internal": "string",
- "WirelessZone": "string",
- "MikrotikPre643": true,
- "Status": "string",
- "updateACL": true
}{- "message": "string",
- "EquipmentID_internal": "string",
- "errorProcessing": false,
- "statusCode": 200
}Creates a unit (apartment/room/port) inside an existing venue — or, if the derived unit already exists, quietly switches to updating it instead. UnitID_internal is DERIVED from venue/unit/building/floor, not accepted; any address field left out is inherited from the venue.
VLAN handling, three paths: an explicit vlan is range-checked (1–4095); otherwise the service picks the first free VLAN in the configured window for the unit's purpose while the venue holds under 200 units; at 200+ units an explicit VLAN becomes mandatory; at 5000 units the venue is closed to new units.
| AccessToken required | string Caller's Cognito JWT. May instead be supplied as |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; it becomes the target operator and is deleted from the forwarded body. Missing then -> 401 'OperatorID Missing. '. Ignored for a NetworkOperator caller. |
| VenueID | string Venue the unit belongs to. NOT checked by the endpoint - the service rejects an absent value 401 'Invalid VenueID: undefined', the literal string 'global' (case-insensitive) 401 'Invalid VenueID: |
| externalVenueID | string Alternative way to select the venue: the service lists the operator's venues and, only when EXACTLY ONE matches, overwrites VenueID with it. Zero or multiple matches DELETE any VenueID that was supplied, which then fails as 'Invalid VenueID: undefined'. |
| UnitID required | string Unit identifier. Absent/empty -> HTTP 200 with errorProcessing true and message 'UnitID missing from request. ', so the service's own AddressLine-derived fallback is unreachable on this route. Coerced to a string, HTML-stripped, trimmed and truncated to 20 characters; its uppercased, [A-Za-z0-9_-]-stripped first 20 characters form the second segment of UnitID_internal. |
| UnitBuilding | string Building identifier. HTML-stripped and truncated to 20 characters, or the literal 'DEFAULT' when absent/empty. Third segment of UnitID_internal. |
| UnitFloor | string Floor identifier. Same handling; defaults to 'DEFAULT'. Fourth segment of UnitID_internal. |
| purpose | string Default: "wiredunit" Enum: "wiredunit" "localwirelessonly" "globalroaming" Anything not in this set is silently replaced with 'wiredunit'. It selects which Minimum/MaximumAutoGeneratedVLAN_* window the auto-generated VLAN is drawn from: GlobalWirelessPlusLocalWiredAccess for wiredunit, LocalWirelessAccess for localwirelessonly, GlobalWirelessRoaming for globalroaming. |
integer or string Explicit VLAN. A string is parseInt-ed first. Validated by request validation with min 1; out of range -> 401 'VLAN must be between 1-4095. '. When omitted, one is auto-generated only while the venue holds FEWER THAN 200 units; at 200 or more, omitting it -> 401 'VLAN must be provided when adding more than 200 units. '. | |
| AddressLine1 | string Optional; inherited from the venue when absent, otherwise HTML-stripped and truncated to 40 characters. |
| AddressLine2 | string Optional; inherited from the venue when absent, otherwise truncated to 40 characters. |
| City | string Optional; inherited from the venue when absent. |
| State | string Optional. When supplied it is validated against the resolved country's state list and stored as the ABBREVIATION; no match -> 401 'Invalid State for the selected country.'; a country with no state list -> 401 'No states found for ' + |
| Country | string Optional; |
| Country.ISO3166A3 | string Alias for Country; copied onto Country and then deleted. |
| PostalCode | string Optional. Coerced to a string; if it is not a postal code it is REPLACED by the venue's postal code rather than rejected. Truncated to 10 characters. |
string or Array of strings Existing venue-equipment record id(s) to attach to the new unit - each the equipment record's own ID, not a bare serial. EVERY id is verified up front to exist, belong to this operator AND sit at this VenueID before the unit is created, so one bad id cannot leave a half-built unit behind: any miss -> 404 'Equipment not found at venue: | |
| PrimaryUnitID_internal | string Links this unit to a primary unit. Stored only when present, together with PrimaryUnitID. |
| PrimaryUnitID | string Stored only when PrimaryUnitID_internal is also present. |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID": "<unit identifier>",
- "purpose": "wiredunit"
}{- "message": "Unit added. ",
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.DEFAULT.DEFAULT",
- "UnitID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.DEFAULT.DEFAULT",
- "vlan": 1050,
- "errorProcessing": false
}Updates one venue's configuration. No GET route for this path. The whole request body is forwarded unchanged to the venue-configure service, whose response replaces the body wholesale (hence the statusCode field inside the body).
Sending clearSuppressedMacs: true clears RADIUS suppression counters instead of updating the venue — handled entirely in this endpoint. ServicePlanID is INERT here (the rewrite that consumes it only fires on enableServicePlan/disableServicePlan) — use ServicePlanConfiguration.ServicePlanIDs instead.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport). Venue-level roles are deliberately excluded — admitting them would grant write access to every venue setting, including deletion.
The access token must be in the body — no Authorization header support.
AccessToken and VenueID are the only two fields every call needs. Everything else is optional and is applied only when present; the whole body is forwarded verbatim.
| AccessToken required | string Cognito JWT, in the body - this endpoint does NOT accept an Authorization header. Absent or empty gives 401 with message 'AccessToken Missing. ' (translations.json the localized message). |
| VenueID required | string The venue to configure. Absent gives a 200 whose body carries errorProcessing true and message 'VenueID missing from request. ' - the endpoint sets statusCode explicitly to 200 on that branch. The service re-checks it and answers 401 'Invalid Venue' if it is still empty. Ownership is enforced, which loads the row by ID and discards it unless its OperatorID matches the caller's; a mismatch yields 401 'Venue not found. '. Format is the venue-id form built by - {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and DELETED from the forwarded body, so the service never sees it. |
| clearSuppressedMacs | boolean Strict |
| Calling-Station-Id | string Read ONLY when clearSuppressedMacs is true. Narrows the clear to one client MAC; any separator style is accepted and normalised (separators stripped, lowercased) before use. A non-empty value that is not a MAC after normalisation is rejected with message 'Invalid Calling-Station-Id. ' and statusCode 200 - deliberately, so a malformed MAC can never fall through to the venue-wide delete. Omitting it clears every suppressed MAC at the venue. |
| VenueName | string Max 40 chars, Sanitised; if sanitising changes the string the service appends 'Invalid characters in VenueName.' and sets statusCode 401. |
| externalVenueID | string A single space ' ' REMOVES the stored value. Otherwise sanitised with idField; a change from the input appends 'Invalid characters in externalVenueID.' and sets statusCode 401. |
| AddressLine1 | string Sanitised; a change appends 'Invalid characters in AddressLine1.' with statusCode 401. When any address field changes, the venue's whole address is checked for uniqueness within the operator: the comparison is over SIX fields at once - AddressLine1, AddressLine2, City, State, Country.ISO3166A3 and PostalCode - each taken from the request when supplied and from the stored record otherwise, and the venue's own row is excluded by ID. So a venue that differs in only AddressLine2 or State does NOT clash. A clash gives errorProcessing true, statusCode 401 and the message 'Address is assigned to another venue - ' + the other venue's VenueName. |
| AddressLine2 | string A single space ' ' REMOVES the stored value. Otherwise sanitised with nameAndAddress at 40 chars; a change from the input appends 'Invalid characters in AddressLine2.' with statusCode 401. |
| City | string Sanitised; a change appends 'Invalid characters in City.' with statusCode 401. |
| State | string Accepted by the API but NEVER STORED by this endpoint: the entire State. It is NOT inert, though: the request's State is read (falling back to the stored venue's State) and compared as one of the six terms of the address-uniqueness check, so supplying it can change whether that 401 fires. |
| PostalCode | string Validated as a postal code; a failure appends 'Invalid characters in PostalCode.' and sets statusCode 401. |
| Country.ISO3166A3 | string ISO 3166 alpha-3. Accepted by the API but NEVER STORED by this endpoint: the country validation and write block, including the Country.ISO3166A3. Note the address-uniqueness check reads the PLAIN |
| AuthCounterEnabled | boolean Per-venue RADIUS auth-counter opt-in, at the TOP level of the body (not under NetworkConfiguration). Written only when the value is a literal true/false AND differs from the stored value. |
object | |
object | |
object | |
object | |
object | |
object | |
object | |
object | |
| DisplayOptionID | string Display-option template id. Sanitised with idField; a change from the input appends 'Invalid characters in DisplayOptionID.' with statusCode 401. The display-option NAME is derived by stripping the prefix |
| deleteVenueifEmpty | boolean Strict |
| deleteEmptyVenueUnits | boolean Deletes every unit with no active subscription. Occupied units block it the same way. |
| forceDelete | boolean With either delete flag, starts subscription teardown for occupied units instead of failing outright; the message then gains ' Initiated subscription delete for occupied units. It may take few minutes to disable equipment. Please retry deletion after few minutes. ' and the caller must retry. |
| ServicePlanID | string INERT on this path. The endpoint only rewrites it into ServicePlanConfiguration.ServicePlanIDs for the '/venues/enableServicePlan' and '/venues/disableServicePlan' resources; on '/venues/configure' the lookup still runs but update_serviceplans stays false, so the field is forwarded to an object that never reads it. Use ServicePlanConfiguration.ServicePlanIDs instead. |
{- "AccessToken": "string",
- "VenueID": "string",
- "OperatorID": "string",
- "clearSuppressedMacs": true,
- "Calling-Station-Id": "string",
- "VenueName": "string",
- "externalVenueID": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "string",
- "AuthCounterEnabled": true,
- "NetworkConfiguration": {
- "NAS-Identifier": "string",
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "WirelessOnlyPlanVLANOffset": 0,
- "WelcomeEmail_countdown_hours": 0
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0,
- "NetworkManagementPractice": "string"
}, - "PMS": {
- "ProfileID": "string",
- "RealPage": {
- "SiteId": 0
}, - "Entrata": {
- "PropertyID": 0
}, - "enableUnitSync": true,
- "enableSubscriberSync": true,
- "blacklistedSubscriberEmails": [
- "string"
]
}, - "Integrations": {
- "ConnectWise": {
- "URL": "string",
- "Authorization": "string",
- "serviceboardid": "string",
- "ClientID": "string",
- "CompanyID": "string"
}, - "PRTG": {
- "URL": "string",
- "Username": "string",
- "PasswordHash": "string",
- "PRTGGroup": { }
}
}, - "ServicePlanConfiguration": {
- "ServicePlanIDs": [
- "string"
], - "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string"
}, - "Notifications": {
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "suppressSubscriberSMS": true,
- "WelcomeEmail_countdown_hours": 0
}, - "Reporting": {
- "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0
}, - "ShoppingCart": {
- "enableShoppingCart": true,
- "ShoppingCartPriceAdjustment": 0,
- "TrialCycleAdjustment": 0,
- "Stripe": {
- "Stripe_allowrefund": true
}
}, - "DisplayOptionID": "string",
- "deleteVenueifEmpty": true,
- "deleteEmptyVenueUnits": true,
- "forceDelete": true,
- "ServicePlanID": "string"
}{- "message": "string",
- "VenueID": "string",
- "NAS-Identifier": "string",
- "Calling-Station-Id": "string",
- "region": "string",
- "cleared": true,
- "truncated": true,
- "readErrors": 0,
- "totalKeys": 0,
- "deletedKeys": 0,
- "counts": {
- "longterm": 0,
- "repeat": 0,
- "short": 0
}, - "suppressed": {
- "longterm": [
- {
- "mac": "string",
- "count": 0,
- "ttl": 0
}
], - "repeat": [
- {
- "mac": "string",
- "count": 0,
- "ttl": 0
}
], - "short": [
- {
- "mac": "string",
- "count": 0,
- "ttl": 0
}
]
}, - "errorProcessing": true
}Updates one existing piece of network equipment at a venue — also the permanent-delete path for it. The row is matched by EquipmentID AND must belong to the caller's operator AND the submitted VenueID — any mismatch is a 404.
Side effects: a ConnectionProtocol/IPAddress/Port/Username/Password change, or Status → UP, on a Gateway triggers a provisioning re-drive (clears AllGatewaysConfigured, drops this equipment from every active subscription's gatewaysConfigured list, re-seeds PendingGatewayEnable). ⚠ A Manufacturer change to RiQ/MikroTik/Nomadix/Peplink/Altiplano triggers the SAME re-drive regardless of equipment type — not just on Gateways. Those changes (plus MikrotikPre643) also clear the equipment error counters; a Manufacturer change alone does not. Status → DOWN on a Gateway sends an equipment-error notification.
| AccessToken required | string Caller's Cognito JWT, sent in the body - this endpoint does NOT accept an Authorization header. Absent/empty -> 401 'AccessToken Missing. '; present, it is verified by request validation when the operator has a CognitoPool. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; it becomes the target operator and is deleted from the forwarded body. Missing then -> 401 'OperatorID Missing. '. |
| VenueID required | string The venue that must own the equipment. Absent/empty -> HTTP 200 with errorProcessing true and message 'VenueID missing from request. '. It is not just a scope hint: the service requires the stored record's VenueID to equal this value or the request 404s. Format: '{pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}'. |
| EquipmentID required | string The equipment record's own primary key, of the form ' |
| delete | boolean Exactly |
| Manufacturer | string HTML-stripped, trimmed, truncated to 40 characters, then canonicalised by SUBSTRING match (case-insensitive): a value containing 'riq' becomes 'RiQ', 'mikrotik' -> 'MikroTik', 'nomadix' -> 'Nomadix', 'peplink' -> 'Peplink', 'altiplano' -> 'Altiplano'; anything else is stored as submitted. Setting it to one of those five canonical values sets remove_gatewayConfigured, which re-drives provisioning for every active subscription at the venue. Unlike every other trigger in this object this one is NOT gated on the record being a Gateway - there is no equipment_type test, and the Manufacturer block runs before equipment_type is read - so it also fires on a Switch, an Access Point or any other EquipmentType. It does NOT clear the equipment error counters. |
| Model | string HTML-stripped, trimmed, truncated to 40 characters. No validation beyond that. |
| MACAddress | string Accepted with or without separators and STORED CANONICALLY as uppercase colon-separated, so any input spelling maps to one value. Anything else -> 401 'Invalid MACAddress: ' + |
| EquipmentType | string Enum: "Gateway" "Firewall" "OLT" "Wireless Controller" "Wi-Fi Access Point" "Switch" "CMTS" "Router" "SmartBox" "StreamBlade" "LAN Load Balancer" "Data Plane" "G.hn Headend" "WAN Load Balancer" "DSL" "Other" Matched case-insensitively, and several spellings without spaces or hyphens are also accepted ('wirelesscontroller', 'wifiaccesspoint', 'wi-fiaccesspoint', 'lanloadbalancer', 'dataplane', 'ghnheadend', 'wanloadbalancer'); the canonical value above is what gets stored. Anything else -> 401 'Invalid EquipmentType: ' + |
| UnitID_internal | string or null Attaches this equipment to a unit, or - when sent as JSON |
| WirelessZone | string HTML-stripped, trimmed, truncated to 40 characters. |
| MikrotikPre643 | boolean Must be exactly true or false and differ from the stored value. On a Gateway it clears the equipment error counters but does NOT re-drive provisioning. |
| ConnectionProtocol | string Enum: "http" "https" Only these two exact lowercase values are honoured; anything else is silently ignored. On a Gateway a change re-drives provisioning and clears the error counters. |
| IPAddress | string Must be an IP address as IPv4 or IPv6; anything else is silently IGNORED, not rejected. On a Gateway a change re-drives provisioning and clears the error counters. |
integer or string Coerced to a string and validated as a port; anything else is silently IGNORED. On a Gateway a change re-drives provisioning and clears the error counters. | |
| Username | string Management-interface username. HTML-stripped, trimmed, truncated to 64 characters. On a Gateway a change re-drives provisioning and clears the error counters. NOTE the audit message echoes the value: 'Updated Username = |
| Password | string <password> Management-interface password. HTML-stripped, trimmed, truncated to 100 characters. The audit message deliberately does NOT echo it - it is the literal 'Updated Password. '. On a Gateway a change re-drives provisioning and clears the error counters. |
| Status | string Accepted case-insensitively as 'UP', 'IN SERVICE' or 'DOWN'; both 'UP' and 'IN SERVICE' store the value 'UP'. Any other value is silently ignored. On a Gateway, ->UP re-drives provisioning and clears the error counters, while ->DOWN sends an equipment-error notification titled 'Gateway DOWN'. |
| updateACL | boolean Exactly |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "EquipmentID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}._V3EQUIPMENT.<equipment id>",
- "Status": "UP"
}{- "message": "Updating Status to UP. ",
- "errorProcessing": false,
- "statusCode": 200
}Updates one existing venue unit — also the delete path for an empty unit.
Who may call it: a NetworkSoftwareProvider, a NetworkOperator DomainAdministrator/AccountManager/CustomerSupport, or the subscriber themself (who must hold an ACTIVE subscription on that exact unit) — venue-level roles are deliberately excluded, since no field is individually role-gated and admitting them would grant write access to Stripe keys, PMS bindings and unit deletion.
For a Subscriber caller, the whole request body is replaced with just UnitID_internal and NetworkConfiguration.VenueUnitSSID (capped at 4 entries) before the update runs.
Removing an SSID cascades — stripped from every unit of the venue and every subscription on this unit.
AccessToken is body-only — this endpoint never reads an Authorization header.
| AccessToken required | string Caller's Cognito JWT, sent in the body - this endpoint does NOT accept an Authorization header. Absent/empty -> 401 'AccessToken Missing. '; present, it is verified by request validation when the operator has a CognitoPool. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller; it becomes the target operator and is deleted from the forwarded body. Missing then -> 401 'OperatorID Missing. '. |
| UnitID_internal required | string The unit's primary key. Absent/empty -> HTTP 200 with errorProcessing true and message 'UnitID_internal missing from request. '. Format is ' |
object Network settings. | |
object Alias: the endpoint copies this whole object onto NetworkConfiguration, overwriting it. Send one or the other, not both. | |
| deleteEmptyVenueUnit | boolean Exactly |
| forceDelete | boolean Read only inside the delete path, and only when the unit has ACTIVE subscriptions. Absent/false -> 401 'Unit has |
string or Array of strings Existing venue-equipment record id(s) to attach to this unit - each the equipment record's own ID as listVenueEquipment returns it, of the form ' | |
| externalVenueUnitID | string External identifier. Rejected 401 'Invalid characters in externalVenueUnitID.' when the value changes under HTML sanitisation, and 401 'Duplicate externalVenueUnitID at |
| UnitID | string Renames the unit's display id. Rejected 401 'Invalid characters in UnitID.' on a sanitisation mismatch. NOTE this does NOT change UnitID_internal, which stays the primary key. |
| UnitBuilding | string Rejected 401 'Invalid characters in UnitBuilding.' on a sanitisation mismatch. |
| UnitFloor | string Rejected 401 'Invalid characters in UnitFloor.' on a sanitisation mismatch. |
| AddressLine1 | string Rejected 401 'Invalid characters in AddressLine1.' on a sanitisation mismatch. |
| AddressLine2 | string A single SPACE (' ') CLEARS the stored value; any other value is sanitised and rejected 401 'Invalid characters in AddressLine2.' on a mismatch. |
| City | string Rejected 401 'Invalid characters in City.' on a sanitisation mismatch. |
| State | string Rejected 401 'Invalid characters in State.' on a sanitisation mismatch. |
| Country | string
|
| Country.ISO3166A3 | string Alias for Country. |
| PostalCode | string Validated unless it is the literal string '0'; failure -> 401 'PostalCode validation failed'. |
integer or string New VLAN for the unit. A non-integer-parsable value is DELETED from the body rather than rejected. Otherwise validated by request validation with min 1; out of range -> 401 'vlan should be between 1-4095. '. A successful change also nulls AllGatewaysConfigured, gatewaysConfigured and 'R1ConfiguredUTC.ISO8601' on the unit's subscriptions, forcing re-provisioning. | |
| SMSCode | string Short code for SMS enrolment; coerced to a string, trimmed and truncated to 6 characters. Rejected 401 'Invalid characters in SMSCode.' when the value changes under sanitisation - which includes containing a SPACE, because the API also splits on ' ' and keeps the first token. Must be unique across EVERY unit of EVERY venue of the operator, else 401 'Duplicate SMSCode.'. |
integer or string RealPage PMS unit id. A non-integer string is coerced to 0, and 0 or negative -> 401 'RealPageUnitID should be a positive number.'. | |
object Only ONE notification field is still honoured at unit level; suppressSubscriberEmails, sendSubscriptionAddedEmail and sendSubscriptionEndEmail were moved to operator+venue level on 2026-08-12 and are ignored here. | |
object Shopping-cart settings. The Stripe key blocks that used to live here are not served, so ShoppingCart.Stripe.* is accepted by the field mapper but written by nothing. | |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.DEFAULT.DEFAULT",
- "NetworkConfiguration": {
- "VenueUnitSSID": [
- "<ssid>"
]
}
}{- "message": "Removed ssids <old ssid> from VenueUnitSSID. Added <new ssid> to VenueUnitSSID.",
- "errorProcessing": false
}Per-venue daily usage report as a fixed hourly series, read from a cache written by a scheduled job — not computed live.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin for the requested VenueID. No anonymous fallthrough — an unrecognized caller (including a tokenless request) is refused.
Report window: the requested date (or 'now'), converted to the venue's LOCAL start-of-day and expressed in UTC. Because the cache key is written using the timezone offset at write time and read using the offset at report time, the lookup probes several nearby cache-key variants before giving up.
A VenueID that doesn't match one of the operator's cached venues returns HTTP 200 with errorProcessing: true, not a 4xx.
Read-only. An unexpected exception is caught and NOT converted to an error status — the caller gets 200 with an empty result rather than a 5xx.
GET and POST behave identically; GET also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT. Verified by request validation only when non-empty; an absent token is not reported as such but falls through to 'Access Denied. ' 401. Overridden by an Authorization: Bearer header if one is sent. |
| OperatorID | string Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Built. |
| VenueID | string Venue to report on. Absent/empty -> HTTP 200 with errorProcessing true and 'Missing VenueID. '. Not present exactly once in the cached venues |
| UsageReportStartDateUTC.ISO8601 | string Optional. Any string accepted by the JavaScript Date constructor; read and passed to new Date. Defaults to now. It is NOT the returned window verbatim - it is snapped back to the venue's local start of day and then decremented 1 ms to form the cache key. An unparseable value does not error (new Date does not throw): every derived timestamp becomes NaN, all six cache probes miss and UsageData comes back empty. |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}"
}{- "UsageData": [
- {
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.{UnitBuilding}.{UnitFloor}",
- "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "UsageReportDateUTC.ISO8601": "2019-08-24T14:15:22Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0
}
], - "message": "",
- "errorProcessing": false
}Per-venue daily usage report as a fixed hourly series, read from a cache written by a scheduled job — not computed live.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin for the requested VenueID. No anonymous fallthrough — an unrecognized caller (including a tokenless request) is refused.
Report window: the requested date (or 'now'), converted to the venue's LOCAL start-of-day and expressed in UTC. Because the cache key is written using the timezone offset at write time and read using the offset at report time, the lookup probes several nearby cache-key variants before giving up.
A VenueID that doesn't match one of the operator's cached venues returns HTTP 200 with errorProcessing: true, not a 4xx.
Read-only. An unexpected exception is caught and NOT converted to an error status — the caller gets 200 with an empty result rather than a 5xx.
GET and POST behave identically; GET also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT. Verified by request validation only when non-empty; an absent token is not reported as such but falls through to 'Access Denied. ' 401. Overridden by an Authorization: Bearer header if one is sent. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} Venue to report on. Absent/empty -> HTTP 200 with errorProcessing true and 'Missing VenueID. '. Not present exactly once in the cached venues |
| UsageReportStartDateUTC.ISO8601 | string Optional. Any string accepted by the JavaScript Date constructor; read and passed to new Date. Defaults to now. It is NOT the returned window verbatim - it is snapped back to the venue's local start of day and then decremented 1 ms to form the cache key. An unparseable value does not error (new Date does not throw): every derived timestamp becomes NaN, all six cache probes miss and UsageData comes back empty. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
{- "UsageData": [
- {
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.{UnitBuilding}.{UnitFloor}",
- "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "UsageReportDateUTC.ISO8601": "2019-08-24T14:15:22Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0
}
], - "message": "",
- "errorProcessing": false
}Network equipment registered at one venue. GET and POST behave identically; GET reads the query string and adds Cache-Control.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin — note LeasingAgent is NOT accepted here, unlike listVenueDailyReport/listVenueLatestSnapshot.
Field visibility: a Venue-role caller doesn't receive Manufacturer, Model, MACAddress, WirelessZone, ConnectionProtocol, IPAddress, Port or MikrotikPre643; Password is returned only to a small internal support allow-list regardless of role.
A VenueID that exists but belongs to another operator is NOT an error — it returns 200 with an empty equipment list. Unlike its siblings, this endpoint DOES check for a missing token explicitly.
Read-only.
| AccessToken | string Cognito JWT. REQUIRED: absent or empty is rejected 401 'AccessToken Missing. '. Verified by request validation only when the origin's operator record carries SignOn.Cognito.CognitoPool. Overridden by an Authorization: Bearer header if one is sent. |
| OperatorID | string Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Built. |
| VenueID | string Venue whose equipment is listed. Absent/empty -> HTTP 200 with errorProcessing true and 'VenueID missing from request. '. A venue that is not in the caller's operator's cached venue list is NOT rejected - it returns 200 with Equipment [] and both counts 0. Also the value matched against the token's VenueAdministrator list for the Venue role. |
| UnitID_internal | string Optional filter. Coerced to a string and trimmed, then matched with === against each equipment record's UnitID_internal - exact and case-sensitive. Because venue-level equipment carries UnitID_internal '', supplying this excludes every gateway and wireless controller. EquipmentCount and EquipmentUPCount describe the filtered set. |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}"
}{- "Equipment": [
- {
- "id": "string",
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.{UnitBuilding}.{UnitFloor}",
- "Status": "string",
- "statusupdateDateTimeUTC.ISO8601": "string",
- "GatewayErrorNotificationSent": null,
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}
], - "EquipmentCount": 0,
- "EquipmentUPCount": 0,
- "message": "",
- "errorProcessing": false
}Network equipment registered at one venue. GET and POST behave identically; GET reads the query string and adds Cache-Control.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin — note LeasingAgent is NOT accepted here, unlike listVenueDailyReport/listVenueLatestSnapshot.
Field visibility: a Venue-role caller doesn't receive Manufacturer, Model, MACAddress, WirelessZone, ConnectionProtocol, IPAddress, Port or MikrotikPre643; Password is returned only to a small internal support allow-list regardless of role.
A VenueID that exists but belongs to another operator is NOT an error — it returns 200 with an empty equipment list. Unlike its siblings, this endpoint DOES check for a missing token explicitly.
Read-only.
| AccessToken | string Cognito JWT. REQUIRED: absent or empty is rejected 401 'AccessToken Missing. '. Verified by request validation only when the origin's operator record carries SignOn.Cognito.CognitoPool. Overridden by an Authorization: Bearer header if one is sent. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} Venue whose equipment is listed. Absent/empty -> HTTP 200 with errorProcessing true and 'VenueID missing from request. '. A venue that is not in the caller's operator's cached venue list is NOT rejected - it returns 200 with Equipment [] and both counts 0. Also the value matched against the token's VenueAdministrator list for the Venue role. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| UnitID_internal | string Example: UnitID_internal={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.{UnitBuilding}.{UnitFloor} Optional filter. Coerced to a string and trimmed, then matched with === against each equipment record's UnitID_internal - exact and case-sensitive. Because venue-level equipment carries UnitID_internal '', supplying this excludes every gateway and wireless controller. EquipmentCount and EquipmentUPCount describe the filtered set. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
{- "Equipment": [
- {
- "id": "string",
- "EquipmentID": "string",
- "EquipmentType": "string",
- "UnitID_internal": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}.{UnitID}.{UnitBuilding}.{UnitFloor}",
- "Status": "string",
- "statusupdateDateTimeUTC.ISO8601": "string",
- "GatewayErrorNotificationSent": null,
- "Manufacturer": "string",
- "Model": "string",
- "MACAddress": "string",
- "WirelessZone": "string",
- "ConnectionProtocol": "string",
- "IPAddress": "string",
- "Port": null,
- "Username": "string",
- "Password": "string",
- "MikrotikPre643": null
}
], - "EquipmentCount": 0,
- "EquipmentUPCount": 0,
- "message": "",
- "errorProcessing": false
}Latest cached utilization snapshot for the caller's venue portfolio — a per-venue map plus a portfolio rollup. Not scoped to a single venue by default; VenueID merely narrows it.
Roles: NetworkSoftwareProvider (must send OperatorID, sees the whole operator), NetworkOperator (sees the whole operator), or Venue admin (narrowed to their own venues). No anonymous fallthrough — an unrecognized caller is refused.
Data comes from a maintained cache (venueutil<OperatorID>), not a live query — a venue changed moments ago may not be reflected yet. A VenueID the caller can't see is silently ignored, not rejected — the response falls back to the caller's entire portfolio rather than emptying.
Read-only. GET and POST behave identically; GET also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT. Verified by request validation only when non-empty; an absent token is not reported as such but falls through to 'Access Denied. ' 401. Overridden by an Authorization: Bearer header if one is sent. |
| OperatorID | string Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Built. |
| VenueID | string OPTIONAL - omitting it returns the caller's whole portfolio. When supplied it narrows Utilization to that venue, but only if the id is already in the caller's filtered map; an id that is not a key of that map leaves the un-narrowed map in place - no error, no empty result. It is ALSO the value tested by the Venue role branch, so a venue administrator MUST supply it or be rejected 401. |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>"
}{- "Summary": {
- "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}, - "Utilization": {
- "property1": {
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "dateAdded": "2019-08-24T14:15:22Z"
}, - "property2": {
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "dateAdded": "2019-08-24T14:15:22Z"
}
}, - "message": "",
- "errorProcessing": false
}Latest cached utilization snapshot for the caller's venue portfolio — a per-venue map plus a portfolio rollup. Not scoped to a single venue by default; VenueID merely narrows it.
Roles: NetworkSoftwareProvider (must send OperatorID, sees the whole operator), NetworkOperator (sees the whole operator), or Venue admin (narrowed to their own venues). No anonymous fallthrough — an unrecognized caller is refused.
Data comes from a maintained cache (venueutil<OperatorID>), not a live query — a venue changed moments ago may not be reflected yet. A VenueID the caller can't see is silently ignored, not rejected — the response falls back to the caller's entire portfolio rather than emptying.
Read-only. GET and POST behave identically; GET also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT. Verified by request validation only when non-empty; an absent token is not reported as such but falls through to 'Access Denied. ' 401. Overridden by an Authorization: Bearer header if one is sent. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing -> 401 'OperatorID Missing. '); on success it is copied onto Operator.OperatorID and deleted from the request body. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} OPTIONAL - omitting it returns the caller's whole portfolio. When supplied it narrows Utilization to that venue, but only if the id is already in the caller's filtered map; an id that is not simply leaves the unnarrowed map in place. It is ALSO the value tested by the Venue role branch, so a venue administrator MUST supply it or be rejected 401. Read from the query string only because the endpoint itself merges the query string into the request body on a GET; the endpoint code below that point cannot tell a query parameter from a body field. |
{- "Summary": {
- "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}, - "Utilization": {
- "property1": {
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "dateAdded": "2019-08-24T14:15:22Z"
}, - "property2": {
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "SubscriptionCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "SubscriptionCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0,
- "SubscriptionCount_Active": 0,
- "SubscriptionCount_PendingSetupSuccess": 0,
- "SubscriptionCount_paymentFailed": 0,
- "SubscriptionCount_PendingAUP": 0,
- "SubscriptionCount_gatewayConfigured_failed": 0,
- "SubscriptionCount_gatewayConfigured_success": 0,
- "dateAdded": "2019-08-24T14:15:22Z"
}
}, - "message": "",
- "errorProcessing": false
}One venue's RSSI (signal strength) histogram for a single report day — how many RADIUS-accounted connections were recorded at each RSSI value. Written by RADIUS session accounting with an 8-day TTL; a report date older than about a week returns an all-zero distribution rather than an error.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
A VenueID that doesn't match one of the operator's cached venues returns Invalid VenueID. .
On success, RSSIDistribution is back-filled with a zero-connection entry for every RSSI value 1–127 the cache didn't supply, so a response always carries at least 127 entries even on a day with no data.
No Bearer-header fallback (unlike listVenueUnit6mReport/listVenueUnits) — the token must be sent as the AccessToken query parameter. GET responses also carry Cache-Control: private, max-age=5.
| AccessToken required | string Cognito JWT access token. Validated only when non-empty; if omitted no role can be resolved and the request is denied 401. |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue whose RSSI histogram is returned; must be in the operator's cached venue list. Format is |
| UsageReportStartDateUTC.ISO8601 | string Report day, parsed with |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "UsageReportStartDateUTC.ISO8601": "string"
}{- "UsageReportStartDateUTC": "2019-08-24T14:15:22Z",
- "RSSIDistribution": [
- {
- "rssi": 0,
- "connections": 0
}
], - "message": "string",
- "errorProcessing": false
}One venue's RSSI (signal strength) histogram for a single report day — how many RADIUS-accounted connections were recorded at each RSSI value. Written by RADIUS session accounting with an 8-day TTL; a report date older than about a week returns an all-zero distribution rather than an error.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
A VenueID that doesn't match one of the operator's cached venues returns Invalid VenueID. .
On success, RSSIDistribution is back-filled with a zero-connection entry for every RSSI value 1–127 the cache didn't supply, so a response always carries at least 127 entries even on a day with no data.
No Bearer-header fallback (unlike listVenueUnit6mReport/listVenueUnits) — the token must be sent as the AccessToken query parameter. GET responses also carry Cache-Control: private, max-age=5.
| AccessToken required | string Cognito JWT access token. Validated only when non-empty; if omitted no role can be resolved and the request is denied 401. |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue whose RSSI histogram is returned; must be in the operator's cached venue list. Format is |
| UsageReportStartDateUTC.ISO8601 | string Report day, parsed with |
{- "UsageReportStartDateUTC": "2019-08-24T14:15:22Z",
- "RSSIDistribution": [
- {
- "rssi": 0,
- "connections": 0
}
], - "message": "string",
- "errorProcessing": false
}A fixed 180-entry daily bandwidth series (~6 months) for one venue unit, back-filled with zeros for missing days — the count is always 180, driven by a loop bound rather than the data. Rows come from the daily report scheduler (181-day TTL).
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
Lookups: VenueID must be one of the operator's cached venues, then UnitID_internal must match exactly one of that venue's cached units — a non-match returns Invalid UnitID_internal. (still carrying UsageData: [], since that key is set before the match check).
GET merges query-string parameters into the same request; its response also carries Cache-Control: private, max-age=5.
| Authorization | string Optional |
| AccessToken | string Cognito JWT access token; may instead be supplied as |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue that owns the unit; must be in the operator's cached venue list. Format is |
| UnitID_internal required | string Unit whose usage series is returned; must match exactly one entry of the venue's cached unit list. Format is |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "UnitID_internal": "string"
}{- "UsageData": [
- {
- "UsageReportDateUTC.ISO8601": "2019-08-24T14:15:22Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0
}
], - "message": "string",
- "errorProcessing": false
}A fixed 180-entry daily bandwidth series (~6 months) for one venue unit, back-filled with zeros for missing days — the count is always 180, driven by a loop bound rather than the data. Rows come from the daily report scheduler (181-day TTL).
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
Lookups: VenueID must be one of the operator's cached venues, then UnitID_internal must match exactly one of that venue's cached units — a non-match returns Invalid UnitID_internal. (still carrying UsageData: [], since that key is set before the match check).
GET merges query-string parameters into the same request; its response also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT access token; may instead be supplied as |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue that owns the unit; must be in the operator's cached venue list. Format is |
| UnitID_internal required | string Unit whose usage series is returned; must match exactly one entry of the venue's cached unit list. Format is |
| Authorization | string Optional |
{- "UsageData": [
- {
- "UsageReportDateUTC.ISO8601": "2019-08-24T14:15:22Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0
}
], - "message": "string",
- "errorProcessing": false
}Lists one venue's units — also serves the self-service shopping cart. No token required; an absent or unmatched token resolves to the Public role.
Access: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the requested VenueID), Subscriber, or Public.
Two response shapes, both under VenueUnits: a cut-down cart projection for Public callers, a fuller console projection for everyone else.
Extra filtering for Subscriber and Public: occupied units are dropped unless the caller already holds them; cart-disabled units are also dropped. NetworkSoftwareProvider/NetworkOperator/Venue callers see everything.
api-version gate: StrictPSK and (console projection) NetworkConfiguration.VenueUnitSSID require api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
An unknown venue is not an error — 200 with no VenueUnits key.
| api-version | string Parsed with parseInt. At >= 20260417 (or after the 2026-11-17 sunset) the response gains StrictPSK and, in the console projection, NetworkConfiguration.VenueUnitSSID; below that a deprecation notice is appended to |
| Authorization | string Optional |
| AccessToken | string Cognito JWT access token; may instead be supplied as |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID | string Venue whose units are listed. Required unless it can be derived from externalVenueID, externalVenueUnitID or UnitID_internal; otherwise 400. Format is |
| externalVenueID | string Operator's own venue identifier; resolved to VenueID through |
| externalVenueUnitID | string Operator's own unit identifier; resolved to UnitID_internal (and VenueID when absent) through |
| UnitID_internal | string Restricts the result to a single unit and resolves VenueID when it is absent. If the lookup returns a row set that does not narrow to exactly one unit, the request is rejected 400. Format is |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "externalVenueID": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string"
}{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 0,
- "message": "string",
- "errorProcessing": false
}Lists one venue's units — also serves the self-service shopping cart. No token required; an absent or unmatched token resolves to the Public role.
Access: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the requested VenueID), Subscriber, or Public.
Two response shapes, both under VenueUnits: a cut-down cart projection for Public callers, a fuller console projection for everyone else.
Extra filtering for Subscriber and Public: occupied units are dropped unless the caller already holds them; cart-disabled units are also dropped. NetworkSoftwareProvider/NetworkOperator/Venue callers see everything.
api-version gate: StrictPSK and (console projection) NetworkConfiguration.VenueUnitSSID require api-version: 20260417 or higher; below that, a version-upgrade notice is appended to message on every response.
An unknown venue is not an error — 200 with no VenueUnits key.
GET form: parameters come from the query string; responses add Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT access token; may instead be supplied as |
| OperatorID | string Target operator. Required only for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID | string Venue whose units are listed. Required unless it can be derived from externalVenueID, externalVenueUnitID or UnitID_internal; otherwise 400. Format is |
| externalVenueID | string Operator's own venue identifier; resolved to VenueID through |
| externalVenueUnitID | string Operator's own unit identifier; resolved to UnitID_internal (and VenueID when absent) through |
| UnitID_internal | string Restricts the result to a single unit and resolves VenueID when it is absent. If the lookup returns a row set that does not narrow to exactly one unit, the request is rejected 400. Format is |
| api-version | string Parsed with parseInt. At >= 20260417 (or after the 2026-11-17 sunset) the response gains StrictPSK and, in the console projection, NetworkConfiguration.VenueUnitSSID; below that a deprecation notice is appended to |
| Authorization | string Optional |
{- "VenueUnits": [
- {
- "UnitID_internal": "string",
- "purpose": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "allowOverlappingSubscriptionWiredUnit": true,
- "StrictPSK": true,
- "SMSCode": "string"
}
], - "VenueUnitCount": 0,
- "message": "string",
- "errorProcessing": false
}List the operator's venues, role-filtered, from the operator's cached venue list. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue), NetworkOperator (sees every venue), Venue admin/leasing agent (filtered to their own VenueIDs), or Public — INCLUDING a request with no access token at all. A Public caller sees venues only when the operator's shopping cart is enabled.
Trimmed per venue: internal config sections, Stripe adjustments, dateAddedUTC are removed; a DailyReport is added.
Read-only. GET reads the query string (merged after validation) and adds Cache-Control: private, max-age=5.
JSON object. A body is not required: with no AccessToken the caller is simply treated as Public. If a body IS sent it must be valid JSON - request validation rejects a non-JSON non-empty body with 401 'Malformed JSON in input. '.
| AccessToken | string Cognito access-token JWT. Optional; absent means Public. May instead be supplied as an |
| IdToken | string Cognito id token, honoured only when an AccessToken is also present. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller; ignored otherwise. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string"
}{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}List the operator's venues, role-filtered, from the operator's cached venue list. The operator is resolved from Origin.
Roles: NetworkSoftwareProvider (must send OperatorID, sees every venue), NetworkOperator (sees every venue), Venue admin/leasing agent (filtered to their own VenueIDs), or Public — INCLUDING a request with no access token at all. A Public caller sees venues only when the operator's shopping cart is enabled.
Trimmed per venue: internal config sections, Stripe adjustments, dateAddedUTC are removed; a DailyReport is added.
Read-only. GET reads the query string (merged after validation) and adds Cache-Control: private, max-age=5.
| AccessToken | string Cognito access-token JWT. Optional: with no token the caller is treated as Public. Merged from the query string. May instead be supplied as an |
| IdToken | string Cognito id token. Read only inside validateAccessToken, which itself runs only when an AccessToken is also supplied; when present the id token is verified instead of the access token and the username comes from preferred_username or an email lookup. |
| OperatorID | string Target operator. Required ONLY when the caller is a NetworkSoftwareProvider; its absence for such a caller is a 401. Ignored for every other caller. |
{- "message": "",
- "errorProcessing": false,
- "VenueList": {
- "property1": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}, - "property2": {
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "TZ": "string",
- "TimeZoneOffset": 0,
- "TimeZone": 0,
- "SupportEmailAddress": "string",
- "SupportPhoneNumber.E164": "string",
- "VenueType": "string",
- "PrimaryContactGivenName": "string",
- "PrimaryContactFamilyName": "string",
- "PrimaryContactName": "string",
- "DefaultSubscriptionDurationHours_GlobalWirelessPlusLocalWiredAccess": 0,
- "DefaultSubscriptionDurationHours_LocalWirelessAccess": 0,
- "PropertyManagementGroup": {
- "PropertyManagementGroupID": "string",
- "PropertyManagementGroupName": "string"
}, - "FCCLabel": {
- "displayLabel": true,
- "TypicalLatency": 0
}, - "AuthCounterEnabled": true,
- "DisplayOptionID": "string",
- "ShoppingCart": {
- "enableShoppingCart": true,
- "Currency": "string",
- "hasVenueUnitShoppingCartPriceAdjustment": true
}, - "dateAddedUTC.ISO8601": "string",
- "DailyReport": {
- "DeviceReportDateTimeUTC.ISO8601": "string",
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}
}
}, - "VenueCount": 0,
- "UnitCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "UnitCount_LocalWirelessAccess": 0,
- "UnitCount_GlobalWirelessRoaming": 0,
- "PolicyCount_GlobalWirelessPlusLocalWiredAccess": 0,
- "PolicyCount_LocalWirelessAccess": 0,
- "DeviceCount": 0,
- "OnlineDeviceCount": 0
}Complete subscriber database management system for tracking, monitoring, and administering all subscriber accounts and services.
Looks a subscriber up by email address and returns their cached profile. Performs no email-format validation and writes nothing — it either returns the profile or rejects.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent for the requested VenueID. There is no subscriber or Public fallback — a plain subscriber token is refused even for their own address.
Lookup runs only when EmailAddress is at least 5 characters; the profile is returned only when exactly one cached record matches and belongs to the caller's operator. Anything else is 401 'Subscriber not found.'.
⚠ Known quirk: the lookup runs even for an already-rejected request — a caller with no access token, or refused with 'Access Denied. ', can still have profile fields written into the body of their 401. Documented as shipped, not as intended behavior.
| Authorization | string
|
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else (and an absent header) selects English. |
| EmailAddress required | string <email> >= 5 characters The subscriber's email. Ignored unless its length is at least 5, and lower-cased by the shared request sanitiser before the operator-namespaced cache read. Absent or shorter than 5 characters produces 401 'Subscriber not found.', not a validation error. |
| AccessToken | string Cognito JWT. Overridden by the Authorization header when that is present; missing from both is 401 'AccessToken Missing. '. It is only cryptographically verified when the Origin-resolved operator has a Cognito pool configured. |
| IdToken | string Optional Cognito ID token, read only by the shared token validation and only when the access token's username was not already cached; in that case the ID token is the one verified and the username comes from its |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is then deleted from the request. Ignored for every other role, whose operator comes from the request Origin. |
| VenueID | string Used ONLY to grant the Venue role - it must appear in the token's VenueAdministrator or LeasingAgent list. It does not filter the lookup, though a Venue caller's resolved subscriber must hold at least one venue the caller administers. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}; no example is shown because any realistic value names a real venue. |
| SubscriberToken | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
| externalSubscriberID | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
| PhoneNumber | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
{- "EmailAddress": "subscriber@example.com",
- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "PhoneNumber": "string"
}{- "message": "",
- "GivenName": "string",
- "FamilyName": "",
- "PhoneNumber": "",
- "PhoneNumber.E164": "",
- "locale": "en-us",
- "contactpref_sms": false,
- "contactpref_email": true,
- "errorProcessing": false
}Looks a subscriber up by email address and returns their cached profile. Performs no email-format validation and writes nothing — it either returns the profile or rejects.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent for the requested VenueID. There is no subscriber or Public fallback — a plain subscriber token is refused even for their own address.
Lookup runs only when EmailAddress is at least 5 characters; the profile is returned only when exactly one cached record matches and belongs to the caller's operator. Anything else is 401 'Subscriber not found.'.
⚠ Known quirk: the lookup runs even for an already-rejected request — a caller with no access token, or refused with 'Access Denied. ', can still have profile fields written into the body of their 401. Documented as shipped, not as intended behavior.
GET form: fields come from the query string; responses add Cache-Control: private, max-age=5.
| EmailAddress required | string <email> >= 5 characters Example: EmailAddress=subscriber@example.com The subscriber's email. Ignored unless its length is at least 5; it is the only usable lookup key on this operation. Absent or shorter than 5 characters produces 401 'Subscriber not found.', not a validation error. Marked required because without it the call cannot succeed. |
| AccessToken | string Cognito JWT, merged into the request body. Not marked required because it may instead arrive in the Authorization header, which overrides it - but one of the two MUST be present or the call is 401 'AccessToken Missing. '. |
| IdToken | string Optional Cognito ID token, read only by the shared token validation and only when the access token's username was not already cached; in that case the ID token is the one verified and the username comes from its |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is then deleted from the request. Ignored for every other role. |
| VenueID | string Used ONLY to grant the Venue role - it must appear in the token's VenueAdministrator or LeasingAgent list. It does not filter the lookup, though a Venue caller's resolved subscriber must hold at least one venue the caller administers. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}; no example is shown because any realistic value names a real venue. |
| SubscriberToken | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
| externalSubscriberID | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
| PhoneNumber | string Accepted by the parser but DELETED before the lookup, so it has no effect on this operation. |
| Authorization | string
|
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else (and an absent header) selects English. |
{- "message": "",
- "GivenName": "string",
- "FamilyName": "",
- "PhoneNumber": "",
- "PhoneNumber.E164": "",
- "locale": "en-us",
- "contactpref_sms": false,
- "contactpref_email": true,
- "errorProcessing": false
}Returns messages sent to a subscriber. The same handler is also mounted on the operator console under a different path — behavior is decided entirely by the caller's role, not the URL.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (confined to venues it administers), or Subscriber. A caller supplying none of PhoneNumber.E164/EmailAddress/SubscriberToken/externalSubscriberID is treated as reading its own messages.
⚠ Naming a subscriber by bare PhoneNumber reclassifies the caller as a Subscriber — the Venue-scope confinement and SubscriberToken ownership check are then bypassed.
VenueID narrows to that venue's messages; without it, an operator/venue caller naming a subscriber by SubscriberToken must pass an ownership check that the token belongs to the calling operator. Messages have a six-month TTL — nothing older than ~180 days is returned.
GET reads the query string; its response adds Cache-Control: private, max-age=5.
| AccessToken | string Cognito access token. Absent/empty both here and in the Authorization header is 401 'AccessToken Missing. '. It is verified only when the operator record resolved from the request Origin carries a Cognito pool. |
| IdToken | string Optional Cognito ID token. Used by the shared token validator only when the access token's username is not already cached: the ID token is verified instead and its preferred_username, or its email resolved through the operator's email index, becomes the caller identity. |
| OperatorID | string Example: OperatorID={Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID} REQUIRED for a NetworkSoftwareProvider caller (missing is 401 'OperatorID Missing. '); it then becomes the operator context used for both the subscriber lookup and the ownership check, and is removed from the request. Ignored for every other caller. |
| VenueID | string Two effects: it is the value matched against a caller's VenueAdministrator/LeasingAgent arrays to grant the Venue role, and when non-empty it switches the read to the venue+subscriber index so only that venue's messages are returned. When it is absent the subscriber index is used and an operator/venue caller that named the subscriber by SubscriberToken must pass the ownership check. Composite Vault VenueID, {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Target subscriber; highest-precedence lookup key. Ignored for a Subscriber caller, which always reads its own token. Supplying it is what triggers the operator-ownership check on the no-VenueID path. |
| externalSubscriberID | string Subscriber lookup key, used when SubscriberToken is absent; resolved through the operator's external-ID index. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com Subscriber lookup key, used when SubscriberToken and externalSubscriberID are absent. On GET the value is merged into the request AFTER the shared request sanitiser has run, so that lower-casing pass never sees it; the address is lower-cased where the cache key is built, so the lookup is still case-insensitive. |
| PhoneNumber.E164 | string Subscriber lookup key of last resort, and only for a NetworkSoftwareProvider, NetworkOperator or Venue caller - only for those roles is it copied to the internal PhoneNumber field the resolver reads. The phone index is matched by exact string, so the value must be stored exactly as it is sent. Note the key contains a literal dot. |
| PhoneNumber | string Subscriber lookup key read directly by the resolver, after SubscriberToken, externalSubscriberID and EmailAddress and matched against the operator's phone index by exact string. Unlike PhoneNumber.E164 it is not role-gated, and it is not one of the four keys the Subscriber fallback tests, so a request that carries it alone is treated as a Subscriber caller: the Venue-scope confinement and the SubscriberToken ownership check are both skipped. For a NetworkSoftwareProvider, NetworkOperator or Venue caller a supplied PhoneNumber.E164 overwrites this value. |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else the English one. Affects rejection text only. |
{- "messages": {
- "property1": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "",
- "Subject": "string",
- "Message": "string"
}, - "property2": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "",
- "Subject": "string",
- "Message": "string"
}
}, - "message": "",
- "errorProcessing": false
}Returns a fixed 168-entry hourly bandwidth roll-up for one subscriber, covering the last 7 days (falls back to the session cluster when device-bandwidth isn't configured).
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), or Subscriber. The subscriber is selected by PhoneNumber.E164, EmailAddress, SubscriberToken or externalSubscriberID; if none are sent (or the caller is a subscriber), the caller's own usage is returned. A Venue-role caller is limited to subscribers sharing a venue with them.
Window: the last 7 days, hourly buckets (168 total) — the storage layer expires accounting data after 8 days, making 7 days the practical maximum.
Two fields that don't filter, despite their names: VenueID does not narrow the totals (both branches sum the same data); Calling-Station-Id only replaces the reported device list per hour, the octet totals still cover every device.
| AccessToken | string Cognito JWT, merged into the request body. Not marked required because it may instead arrive in the Authorization header - but one of the two MUST be present or the call is 401 'AccessToken Missing. '. It is only cryptographically verified when the Origin-resolved operator has a Cognito pool configured. |
| IdToken | string Optional Cognito ID token, read only by the shared token validation and only when the access token's username was not already cached; in that case the ID token is the one verified and the username comes from its |
| OperatorID | string Target operator. Read ONLY on the NetworkSoftwareProvider branch, where it is mandatory (401 'OperatorID Missing. ' otherwise) and is deleted from the request once copied into the operator context. Ignored for every other role. |
| VenueID | string Grants the Venue role (it must appear in the caller's VenueAdministrator or LeasingAgent list). It is also compared against each stored session's venue, but that comparison changes nothing - both branches add the same figures - so it does NOT scope the usage figures. Format is {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}; no example is shown because any realistic value names a real venue. |
| SubscriberToken | string Target subscriber, used verbatim when present - it short-circuits the other three lookup keys. No operator-ownership check is applied to it on this endpoint. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com Subscriber lookup key; used only when no SubscriberToken and no externalSubscriberID were supplied. NOTE a GET-only quirk: the shared request sanitiser lower-cases EmailAddress BEFORE the query string is merged, so on a GET it is the cache-key builder that lower-cases it instead. The effect is the same. |
| externalSubscriberID | string Operator-side subscriber identifier, resolved through an operator-namespaced cache key; used only when no SubscriberToken was supplied. |
| PhoneNumber.E164 | string LITERAL dotted parameter name. For an operator/venue-role caller it is copied onto |
| PhoneNumber | string The key the cache lookup actually reads. A request carrying only this resolves the subscriber by phone, after first being re-labelled Subscriber. |
| Calling-Station-Id | string Device MAC. Hyphens become colons and the value is upper-cased, then colons are stripped and it is lower-cased. It does NOT filter the octet figures - it only replaces the per-hour device list in the response with this one value. |
| Authorization | string
|
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else (and an absent header) selects English. |
{- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-13T17:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}
], - "message": "",
- "errorProcessing": false
}Returns one subscriber's audit and event log, newest first. The subscriber is identified by SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber, tried in that order.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (any subscriber of the operator), a Venue admin/leasing agent (only a subscriber with a subscription, current or past, at a venue they administer — otherwise reported as not found), or the Subscriber themself (always their own log).
Filtering: searchText runs a fuzzy match; a whitelist of exact-match fields is available, or raw OpenSearch customQuery (which replaces the whitelist). The date window defaults to now for the upper bound and is unbounded below unless you send a lower bound — sending one also switches totalCount from a capped estimate to an exact count. Results are newest-first, paged via searchBefore.
GET reads parameters from the query string: only single-valued filters are supported — array filters, customQuery and paging past the first page require the POST form. Responses carry Cache-Control: private, max-age=5.
| AccessToken | string Example: AccessToken=<Cognito JWT access token> Cognito access token, as an alternative to the Authorization header. Absent from both gives 401 'AccessToken Missing. '. |
| SubscriberToken | string Example: SubscriberToken=<SubscriberToken> The subscriber whose log is wanted, given directly. Highest priority of the four identifier parameters. For a Subscriber caller this value is IGNORED and replaced with the caller's own token. It is also on the exact-match filter whitelist, so supplying it adds a second, identical term clause - harmless. |
| externalSubscriberID | string Example: externalSubscriberID=EXT-SUB-1 The operator's own subscriber identifier. Used only when SubscriberToken is absent. Resolved through the operator's external-id index and must match exactly one record. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com The subscriber's email address. Used only when SubscriberToken and externalSubscriberID are both absent. Lower-cased before the index lookup and must match exactly one record. |
| PhoneNumber | string Example: PhoneNumber=+15555550123 The subscriber's phone number. Lowest priority - used only when none of the three above is present. Matched verbatim (no normalisation is applied at this point), so it must be in the same form the operator's phone index was written with. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} Doubles as the venue-scope selector and as an exact-match filter. A caller whose only role is VenueAdministrator or LeasingAgent is classified as a Venue caller ONLY if this matches a venue they hold; the same value is then forced onto the query as a VenueID term, so their view of the subscriber's log is limited to that venue. |
| OperatorID | string The operator whose log is wanted. REQUIRED for a NetworkSoftwareProvider caller, which otherwise gets 401 'OperatorID Missing. '. For every other caller the operator is taken from the request Origin and this parameter has no effect. |
| MinViewWindowDateUTC.ISO8601 | string <date-time> Example: MinViewWindowDateUTC.ISO8601=2026-08-01T00:00:00.000Z Lower bound of the @timestamp range. DEFAULTS TO NONE - omit it and the query has no lower bound. Supplying it also switches total counting to exact mode; without it totalCount is capped at 10000. An unparseable value is a 400. |
| MaxViewWindowDateUTC.ISO8601 | string <date-time> Example: MaxViewWindowDateUTC.ISO8601=2026-08-19T23:59:59.999Z Upper bound of the @timestamp range. Defaults to the request time plus a 60-second OpenSearch indexing-lag buffer. An unparseable value is a 400. |
| pageSize | integer [ 1 .. 500 ] Default: 250 Example: pageSize=250 Entries per page, capped at 500. Omit it for the default of 250. Because the value arrives as a string, '0' is truthy here and produces an empty page rather than the default. |
| searchText | string Example: searchText=password reset Fuzzy full-text search across event, function_name, Administrator, SourceIP, SubscriberToken and LogType (best_fields, operator 'and', fuzziness AUTO). |
| function_name | string Exact-match filter on the function_name field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. The Vault function or route that emitted the entry. |
| LogType | string Exact-match filter on the LogType field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. For example 'INFO' or 'ERROR' - the emitter's own label, not a validated enum. Note that LogType is filterable but is NOT among the fields this resource returns. |
| Administrator | string Exact-match filter on the Administrator field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| AdministratorOS | string Exact-match filter on the AdministratorOS field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| AdministratorBrowser | string Exact-match filter on the AdministratorBrowser field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| SourceIP | string Exact-match filter on the SourceIP field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| SourceLocale | string Exact-match filter on the SourceLocale field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| UnitID_internal | string Exact-match filter on the UnitID_internal field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. Format: {VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}. |
| EquipmentID | string Exact-match filter on the EquipmentID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| KeyPoolID | string Exact-match filter on the KeyPoolID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| ServicePlanID | string Exact-match filter on the ServicePlanID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| Authorization | string Example: Bearer <Cognito JWT access token> Bearer token for authentication, and the preferred way to authenticate this form. When present, the second whitespace-separated word of the header REPLACES any AccessToken supplied as a query parameter. |
| Accept-Language | string Example: en-US Selects the language of the error messages. A first tag beginning with 'es' selects Spanish (Latin America); anything else selects English (US). It has no effect on the log entries themselves. |
{- "log": [
- {
- "@timestamp": "2026-08-19T11:58:02.114Z",
- "function_name": "subscriber_login_failed",
- "event": {
- "message": "Incorrect password."
}, - "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "SourceIP": "203.0.113.10",
- "SourceLocale": "en-us",
- "SourceUA": "Mozilla/5.0"
}, - {
- "@timestamp": "2026-08-18T09:12:44.031Z",
- "function_name": "vault_venuemgmtconsole_addSubscriber",
- "event": {
- "message": "Subscription added."
}, - "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "ServicePlanID": "<ServicePlanID>",
- "KeyPoolID": "<KeyPoolID>",
- "Administrator": "Given Family (staff@example.com)",
- "AdministratorOS": "macOS 15.5",
- "AdministratorBrowser": "Chrome 139.0",
- "SourceIP": "203.0.113.11"
}
], - "currentCount": 2,
- "totalCount": 2,
- "pageSize": 250,
- "hasMore": false,
- "MinViewWindowDateUTC.ISO8601": "2026-08-01T00:00:00.000Z",
- "MaxViewWindowDateUTC.ISO8601": "2026-08-19T12:01:00.000Z",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "",
- "errorProcessing": false
}Create a subscriber and their subscription (Wi-Fi key) at a venue unit. If SubscriberToken already identifies an existing subscriber of this operator, no new subscription is created — only externalSubscriberID, externalSubscriptionID and contactpref_sms are updated on the subscriber and their subscriptions.
Requires NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the resolved operator.
Wi-Fi key. Supply NewKey / UserPartofKey / LegacyPSK to choose the key, or omit it to auto-generate one. If the venue unit has StrictPSK enabled, a supplied key must meet the strict complexity rules (8-63 characters, an uppercase, a lowercase, a digit and one special character) or the request is rejected; an auto-generated key is always made compliant.
Set ignore_subscription to create only the subscriber, without a venue unit or subscription.
| AccessToken required | string Cognito JWT for an operator staff member. |
| SubscriberToken | string Presence with length > 0 switches the call into the update-only branch - no key is created. Omit it to create. |
| EmailAddress | string Sanitised; a value that sanitises to falsy is rejected. Also used to find an existing subscriber. |
| PhoneNumber.E164 | string Subscriber phone in E.164. Note the dotted name - the shopping cart posts plain |
| GivenName | string Sanitised; a value that sanitises to falsy is rejected. |
| FamilyName | string Sanitised; a value that sanitises to falsy is rejected. |
| externalSubscriberID | string Operator's own subscriber id. Trimmed to 64 chars and used to find an existing subscriber; resolving to more than one subscriber is an error. |
| externalSubscriptionID | string Operator's own subscription id. Auto-generated as a UUID when absent on the create path. |
| contactpref_sms | boolean SMS contact preference. The two branches use DIFFERENT operators. |
| locale | string Subscriber locale. NOT validated - any other value is silently COERCED to 'en-us' rather than rejected: on the create path overwrites anything that is not exactly 'en-us' or 'es-xl' with 'en-us' (an absent locale defaults to 'en-us'), and the value written onto the subscription record is re-resolved the same way. The two values the code recognises are 'en-us' and 'es-xl'. |
| UnitID_internal | string Preferred way to name the venue unit; also used to pick up venue-level Stripe config. May be sent flat or inside PolicyforSubscriberKey. |
| externalVenueUnitID | string Alternative unit selector. |
| VenueID | string Scopes the unit search. Format is |
| externalVenueID | string Scopes the unit search by the operator's own venue id. |
| UnitID | string Address-tuple unit selector; trimmed and truncated to 40 chars. May be sent flat or inside PolicyforSubscriberKey. |
| UnitBuilding | string Address-tuple selector, trimmed to 40 chars. |
| UnitFloor | string Address-tuple selector, trimmed to 40 chars. |
| AddressLine1 | string Address-tuple selector, trimmed to 40 chars. |
| AddressLine2 | string Address-tuple selector, trimmed to 40 chars. |
| City | string Address-tuple selector, trimmed to 40 chars. |
| State | string Address-tuple selector, trimmed to 40 chars. |
| Country.ISO3166A3 | string Address-tuple selector, trimmed to 40 chars. |
| PostalCode | string Address-tuple selector, trimmed to 40 chars. |
| PolicyforSubscriberKey | object Optional wrapper. The endpoint copies UnitID_internal, UnitID, UnitBuilding, UnitFloor, AddressLine1, AddressLine2, City, State, Country.ISO3166A3 and PostalCode out of it onto the request root and then deletes it. Any other key nested here is lost. |
| ServicePlanID | string Service plan to subscribe to. When neither this nor externalServicePlanID is given, the unit's DefaultServicePlanID is used, then the operator's defaults. |
| externalServicePlanID | string Alternative plan selector. |
| UserPartForNewKey | string User-chosen portion of the generated PSK, 1-40 characters, WPA-valid. |
| UserPartofKey | string Alias for UserPartForNewKey. |
| LegacyPSK | string Import an existing PSK: 8-63 characters, WPA-valid, and if it contains a dot the final segment must be 5 characters or fewer. Accepted only for this route - every other caller has it deleted - and it must not already be in use by a live subscription. WARNING: when the request carries NO |
| NewKey | string Alias for LegacyPSK, renamed onto it at with no CustomPSK check - unlike a directly-supplied LegacyPSK it is never overwritten by auto-generator. |
| InvoiceDateTimeUTC.ISO8601 | string Anchor date for the first invoice; must parse to a valid Date. Supplying it forces TrialCycles to 0. Accepted only for this route. |
| StartDateTimeUTC.ISO8601 | string Subscription start. A past value is replaced by now; a future value on a wired unit is normalised to local start-of-day unless doNotResetDatetoMidnight is strictly true. |
| EndDateTimeUTC.ISO8601 | string Subscription end. A past value is dropped; a future value on a wired unit is normalised to local end-of-day unless doNotResetDatetoMidnight is strictly true. |
| doNotResetDatetoMidnight | boolean Only a strict |
| ignore_subscription | any Any truthy value skips venue-unit resolution and subscription creation entirely. |
| RealPageLeaseID | string Stored on the new subscription when supplied. |
| EntrataLeaseID | string Stored on the new subscription when supplied. |
| EntrataCustomerID | string Stored on the new subscription when supplied. |
{- "AccessToken": "string",
- "SubscriberToken": "string",
- "EmailAddress": "string",
- "PhoneNumber.E164": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "externalSubscriberID": "string",
- "externalSubscriptionID": "string",
- "contactpref_sms": true,
- "locale": "en-us",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "VenueID": "string",
- "externalVenueID": "string",
- "UnitID": "string",
- "UnitBuilding": "string",
- "UnitFloor": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "PolicyforSubscriberKey": { },
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "UserPartForNewKey": "string",
- "UserPartofKey": "string",
- "LegacyPSK": "string",
- "NewKey": "string",
- "InvoiceDateTimeUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "doNotResetDatetoMidnight": true,
- "ignore_subscription": null,
- "RealPageLeaseID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}{- "message": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "Status": "string",
- "Username": "string",
- "locale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "StripeCustomerID": "string",
- "StripeSetupIntentId": "string",
- "StripeClientSecret": "string",
- "StripePublishableKey": "string",
- "CustomerID": "string",
- "SetupIntentId": "string",
- "paymentFailed": true,
- "FirstInvoiceDateUTC.ISO8601": "string",
- "Subscription": { },
- "errorProcessing": false
}Deletes a subscriber's subscription/transaction history — the subscriber account, Cognito user and any admin access are left in place (that's deleteSubscriberAccountPermanently, which calls this as its first step).
Ends every still-active subscription first (attempting any owed Stripe refund), then REFUSES to proceed while any subscription is still mid-activation or has gateways to decommission — only then batch-deletes the rows and invalidates the related PSK-policy caches.
| AccessToken required | string Cognito access token. Absent rejects with HTTP 401 and message 'AccessToken missing from request'. The operator scope (OperatorID) is NOT taken from the token: it is resolved from the request Origin header, which request validation.validateUIDomain records and getCognitoData maps to the operator record. The token supplies only the AdministrativeAccess arrays, which are checked against that OperatorID. Format: a Cognito JWT access token string. The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the resolved OperatorID, otherwise HTTP 401 'Administrative Access denied (2). ' (message, statusCode). |
| SubscriberToken | string Subscriber identity. SubscriberToken is used directly when it is a non-empty string; otherwise the service calls request validation, which resolves the token from exactly one alternative field in this priority order: externalSubscriberID, then EmailAddress (lower-cased before lookup), then PhoneNumber - note the plain name PhoneNumber, NOT 'PhoneNumber.E164'. Each alternative is a reverse-index lookup that yields a token only on an exact single hit, so a value that is absent from the cache resolves to '' and the request is rejected with 401 'Subscriber missing in request. '. Format: the subscriber's opaque vault token, which is also the Cognito username. |
| externalSubscriberID | string Alternative identifier, used only when SubscriberToken is absent or empty. Resolved through the operator's external-subscriber-id index. |
| EmailAddress | string Alternative identifier, used only when SubscriberToken and externalSubscriberID are both absent or empty. Resolved through the operator's external-subscriber-id index lower-cased}'. |
| PhoneNumber | string Last-resort alternative identifier. Resolved through the operator's external-subscriber-id index. The field is named PhoneNumber, not 'PhoneNumber.E164'; the value is used verbatim with no normalisation. |
| property name* additional property | any |
{- "AccessToken": "<cognito-access-token>",
- "SubscriberToken": "<subscriber-token>"
}{- "message": "Transactions removed. ",
- "EndDateTimeUTC.ISO8601": "2026-08-19T12:00:00.000Z",
- "errorProcessing": false
}Permanently deletes a subscriber account in strict stages, each skipped once a prior stage fails: (1) end every active subscription and batch-delete the subscription rows; (2) remove the subscriber's admin access, using the email captured BEFORE deletion; (3) mark the subscriber's OpenSearch log documents for deletion (performed later by a cleaner job).
Irreversible for the subscription/subscriber data; the OpenSearch marking step is safely retryable.
| AccessToken required | string Cognito access token. Absent rejects with HTTP 401 and message 'AccessToken missing from request'. The operator scope (OperatorID) is NOT taken from the token: it is resolved from the request Origin header, which request validation.validateAPIRequestHygeine records (validateUIDomain, only RESOLVES that origin to a domain record) and getCognitoData maps to the operator record. The token supplies only the AdministrativeAccess arrays, which are checked against that OperatorID. Format: a Cognito JWT access token string. The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the resolved OperatorID, otherwise HTTP 401 'Administrative Access denied (2). ' (message, statusCode). |
| SubscriberToken | string Subscriber identity. SubscriberToken is used directly when it is a non-empty string; otherwise the service calls request validation, which resolves the token from exactly one alternative field in this priority order: externalSubscriberID, then EmailAddress (lower-cased before lookup), then PhoneNumber - note the plain name PhoneNumber, NOT 'PhoneNumber.E164'. Each alternative is a reverse-index lookup that yields a token only on an exact single hit, so a value that is absent from the cache resolves to '' and the request is rejected with 401 'Subscriber missing in request. '. Format: the subscriber's opaque vault token, which is also the Cognito username used for the ListUsers/DeleteUser calls. |
| externalSubscriberID | string Alternative identifier, used only when SubscriberToken is absent or empty. Resolved through the operator's external-subscriber-id index. |
| EmailAddress | string Alternative identifier, used only when SubscriberToken and externalSubscriberID are both absent or empty. Resolved through the operator's external-subscriber-id index lower-cased}'. |
| PhoneNumber | string Last-resort alternative identifier. Resolved through the operator's external-subscriber-id index. The field is named PhoneNumber, not 'PhoneNumber.E164'. |
| Reason | string Optional free text. It is never validated and never affects the outcome; it is only concatenated into the audit-log event string written by removeAdminAccess. Omitting it makes that log line end with the literal 'undefined', because the concatenation is unguarded. |
| property name* additional property | any |
{- "AccessToken": "<cognito-access-token>",
- "SubscriberToken": "<subscriber-token>"
}{- "message": "Admin access removed - <subscriber-token>. Subscriber account deleted.",
- "errorProcessing": false
}Not implemented — do not use. This path is routed, but no operation runs behind it. An authenticated, authorised request returns HTTP 200 with errorProcessing: false and an otherwise empty body; nothing in the request is read and nothing is written. Because the status is 200, the failure is silent.
To give a subscriber working console access, call /networkoperatorconsole/subscribers/resendCodeforTandC. It sets a password-reset code on the subscriber and sends them the reset-or-welcome message by email or SMS. A subscriber managed through an external identity provider cannot be enabled this way.
| AccessToken required | string Cognito JWT access token of the calling console user. Required in the body - this endpoint does not read an Authorization header. |
{- "AccessToken": "<Cognito JWT access token>"
}{- "SupportedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}, - "errorProcessing": false
}Sends the subscriber-console password-reset code — or, for an account that has never accepted the Terms and Conditions, the welcome message with its temporary password. Despite the name, this is the general subscriber password-reset module (also used by the venue-management and unauthenticated subscriber-console reset routes).
No authentication is required — an unauthenticated request is accepted and classified Public.
Who may call it: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), Subscriber (always their own account only), or Public.
Delivery: NotificationChannel: "SMS" forces SMS to the subscriber's stored phone number (bypassing suppression) when one exists; otherwise email is sent. An EmailAddress/PhoneNumber in the request is only used to look the subscriber up, never as a destination.
Privacy for unauthenticated callers: a Public caller always gets the same 200 success body, whether or not the subscriber exists or is reachable — this prevents account enumeration. Authenticated callers get the real rejection instead.
| Origin required | string Required. The console origin, e.g. https:// |
| Authorization | string Optional on this route. When non-empty the value is split on a space and the second element is taken as the access token, OVERWRITING any |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. It affects the success and not-found message text; the notification-engine literals are never localised. |
| AccessToken | string Caller's Cognito JWT access token. OPTIONAL on this route - there is no missing-token rejection. Overwritten by the |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token, and its preferred_username - or, failing that, its email resolved through the operator's email cache - identifies the caller. |
| OperatorID | string Required ONLY for a Network Software Provider caller, which is rejected 401 'OperatorID Missing. ' without it. It then replaces the operator context and is removed from the request before the identifier lookups run. Ignored for every other caller. |
| VenueID | string Read ONLY by the role check: a caller whose venue-level grants contain this exact value is classified Venue. It does NOT scope the reset, and operator-level callers do not need it - but a venue staff member who omits it is classified Subscriber and resets their OWN password instead of the target's. |
| SubscriberToken | string Identifies the target subscriber directly. Highest precedence of the four identifiers. Ignored for a caller classified Subscriber, whose own token always wins. |
| externalSubscriberID | string The operator's own subscriber identifier, resolved to a subscriber token through the external-id cache. Used only when |
| EmailAddress | string Subscriber email address; lower-cased and resolved to a subscriber token through the email cache. Used only when |
| PhoneNumber | string Subscriber phone number, matched against the phone cache EXACTLY as supplied with no normalisation, so it must be sent in the same form it was stored. Lowest precedence of the four identifiers. Note the un-dotted name: a 'PhoneNumber.E164' property is not read by this route. |
| NotificationChannel | string Passed straight through to the notification engine. The only value with an effect is the exact string 'SMS', which sends the code by SMS to the subscriber's stored phone number and bypasses every suppression flag - but only when the subscriber record HAS a phone number; without one the request falls back to email. Any other value, or none, sends email when the subscriber record has an email address. |
| Domain | string Accepted but ignored on this route: it has no effect on which subscriber is reset, on what is sent, or on the response. It does NOT select the operator whose subscriber is reset - use |
| property name* additional property | any |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "{Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}",
- "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string",
- "NotificationChannel": "SMS",
- "Domain": "string"
}{- "message": "Code to reset password sent to account. ",
- "errorProcessing": false,
- "statusCode": 200
}Not implemented — do not use. This path is routed, but no operation runs behind it. An authenticated, authorised request returns HTTP 200 with errorProcessing: false and an otherwise empty body, and the subscription is left completely untouched — no field is written and no cache entry is invalidated. Because the status is 200, the failure is silent.
To end a subscriber's key, call /networkoperatorconsole/subscribers/resetSubscriptionEndDate with endImmediately: true and one subscriber or subscription identifier (SubscriberToken, EmailAddress, UnitID_internal, SetupIntentId or StripeClientSecret).
To rotate a PSK rather than end it, use /networkoperatorconsole/subscribers/resetKey.
| AccessToken required | string Cognito access token (JWT). Verified by token validation The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the operator resolved from the request Origin header, otherwise the request is rejected with "Administrative Access denied (2). ". |
| property name* additional property | any |
{- "AccessToken": "eyJraWQiOiJFWEFNUExFIiwiYWxnIjoiUlMyNTYifQ.EXAMPLE.EXAMPLE"
}{- "SupportedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}, - "errorProcessing": false
}Rotates a subscriber's Wi-Fi pre-shared key. You identify the CURRENT key, supply the NEW one, and the rotation is written across every subscription of that subscriber that carries the current key, with the PMK caches rebuilt so the new key starts authenticating and the old one stops.
Who may call it. Three callers are accepted. (a) A Network Software Provider: the operator resolved from the request Origin carries a NetworkSoftwareProviderID and the token carries a Username and no SubscriberToken; OperatorID is then mandatory and is deleted from the forwarded body. (b) A Network Operator admin whose AccessToken.AdministrativeAccess.NetworkOperator DomainAdministrator, AccountManager or CustomerSupport list contains the operator id - all three roles are live here. (c) Any caller whose token carries a SubscriberToken, who is treated as the subscriber themselves. A venue administrator or leasing agent has NO venue-scoped branch on this operation - that clause is disabled in the source - so such a caller is admitted only via (c), as an ordinary subscriber acting on their own key. Everyone else is refused with 401 'Access Denied. '.
Whose key gets reset. For an operator or provider caller, the target subscriber is resolved from whichever of PhoneNumber.E164, EmailAddress, SubscriberToken or externalSubscriberID is present in the body; if NONE of the four is present the caller is silently reclassified as a subscriber and the reset targets the SubscriberToken carried by their own access token: for a Network Operator admin that is their own key, while a Network Software Provider's token carries no SubscriberToken at all - that is part of what selects branch (a) - so such a call is refused 401 'Subscriber not found.' and no key is touched. A target that cannot be resolved gives 401 'Subscriber not found.'.
Identifying the current key. Supply psk (the current pre-shared key itself). CurrentKeyID - the WPA2 pairwise master key - remains accepted as a legacy alternative until 17 November 2026, after which only psk is accepted. When CurrentKeyID is used, it is resolved to the PSK through a reverse-lookup cache and, failing that, by recomputing the key derivation over the subscriber's active keys across their presentable SSIDs.
Supplying the new key. Send either NewKey (the complete key) or UserPartForNewKey, from which the stored key is built as the user part, a dot, and the SubscriberToken. Exactly one of the two must be present. Where the resolved StrictPSK is true for the target subscription (escalate-only: operator OR venue OR unit), a full NewKey is MANDATORY - UserPartForNewKey is refused there, because the composed value contains a '.' and can never be StrictPSK-compliant. A missing NewKey in that case returns 401 'This subscription requires NewKey. UserPartForNewKey is not accepted where StrictPSK applies.'; a supplied NewKey that fails the strict contract (8-63 characters, an uppercase, a lowercase, a digit and one special from !#+,-/:=@_ with no other non-alphanumeric, no '.', not starting with a special, no run of 8 identical characters) returns 401 'New key does not meet the StrictPSK requirement for this venue unit. ...'; and if that policy cannot be resolved the reset is refused 401 'Unable to verify the password policy for this subscription. Try again.' rather than proceeding. A UserPartForNewKey containing a '.' is refused 401 'UserPartForNewKey has invalid characters. It cannot contain a period.' on every operator, StrictPSK or not.
dryRun validates everything - length, character set, format and uniqueness across the operator - and returns 'Strong Wi-Fi password. ' with HTTP 200 WITHOUT rotating anything.
Two request-shape failures return HTTP 200, not 4xx. Omitting the current-key identifier and omitting the new key are both reported as HTTP 200 with errorProcessing true and an explanatory message; the status is explicitly set to 200 at those two checks. Every other refusal on this operation is a 401, a 409 or a 503.
| AccessToken | string Cognito access-token JWT. May instead be supplied as |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider; absent in that case gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and DELETED from the forwarded body. |
| SubscriberToken | string Identifies the target subscriber for an operator or provider caller. For a subscriber caller the value from the token is used instead. Note that when psk is supplied, the target subscriber is derived from the PSK and this value is used only to narrow the match. |
| EmailAddress | string <email> Alternative way for an operator or provider caller to identify the target subscriber. Lower-cased by the shared request sanitiser. |
| PhoneNumber.E164 | string Alternative way for an operator or provider caller to identify the target subscriber. When present it is also copied onto a PhoneNumber property before resolution. |
| externalSubscriberID | string Alternative way for an operator or provider caller to identify the target subscriber, by the operator's own identifier for them. |
| psk | string The subscriber's CURRENT pre-shared key. This is the supported way to identify the key being rotated. It must resolve to exactly one subscriber of the operator, otherwise the call fails with 'Current key not found.'. Required from 17 November 2026 onward. |
| CurrentKeyID | string LEGACY alternative to psk: the WPA2 pairwise master key for the current PSK, as a hex string. It is resolved to the PSK through a reverse-lookup cache, and failing that by recomputing the key derivation over the subscriber's active keys across their presentable SSIDs (which requires SubscriberToken to be resolvable). From 17 November 2026 it is no longer accepted and psk becomes mandatory. |
| NewKey | string The complete new pre-shared key. Send this OR UserPartForNewKey. Longer than 63 characters gives 401 'NewKey cannot be more than 63 characters.'; characters outside the WPA-permitted set give 401 'NewKey has invalid characters.'. After assembly the key must be at least 8 and at most 63 characters, must differ from the current key, and - when it contains a dot with a final segment longer than 5 characters - that final segment must be the target's SubscriberToken, otherwise 401 'New key in incompatible format.'. |
| UserPartForNewKey | string Alternative to NewKey: the stored key becomes this value, a dot, and the target's SubscriberToken. Longer than 40 characters gives 401 'UserPartForNewKey cannot be more than 40 characters.'; characters outside the permitted set give 401 'UserPartForNewKey has invalid characters. It cannot contain a period.'. |
| dryRun | boolean Truthy (this is a plain truthiness test, so the string '0' counts as true and the number 0 does not) runs every validation, including the operator-wide uniqueness check, and returns 200 with 'Strong Wi-Fi password. ' WITHOUT writing anything. It also suppresses the duplicate-PSK metric. |
| property name* additional property | any |
{- "AccessToken": "string",
- "OperatorID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "psk": "string",
- "CurrentKeyID": "string",
- "NewKey": "string",
- "UserPartForNewKey": "string",
- "dryRun": true
}{- "message": "Password reset successful.",
- "errorProcessing": false,
- "statusCode": 200
}Changes the venue-level and/or unit-level price adjustment on exactly one active subscription — response carries only the audit sentence, no pricing object.
| AccessToken required | string Cognito access token (JWT). Verified by token validation The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the operator resolved from the request Origin header, otherwise the request is rejected with "Administrative Access denied (2). ". |
| NewVenueUnitPriceAdjustment | integer New unit-level price adjustment, in the currency's minor unit (cents). Send a number. GATE: the call is rejected with "NewVenuePriceAdjustment/NewVenueUnitPriceAdjustment not found. " only when BOTH this and NewVenuePriceAdjustment are isNaN. Because isNaN(null)/isNaN("")/isNaN([])/isNaN(true) are all false, such values pass the gate: they then produce the audit sentence 'Updated unit-level price adjustment to NaN. ' (parseInt(value)/100) and, because the write uses the RAW the request body value rather than the parseInt result, the raw value is persisted onto VenueUnitPriceAdjustment - a numeric STRING is likewise stored as a string, which the |
| NewVenuePriceAdjustment | integer New venue-level price adjustment, in the currency's minor unit (cents). Identical gate and identical raw-write behaviour as NewVenueUnitPriceAdjustment (isNaN gate, sentence, raw write, no-change filter). |
| StripeClientSecret | string Stripe setup-intent client secret stored on the subscription. Used to find the subscription only when it is longer than 4 characters AND startsWith('seti_') - the lookup is the record store; otherwise SetupIntentId is used. |
| SetupIntentId | string The vault SubscriptionID. Looked up, which queries the SubscriptionID-index on the SubscriptionID attribute. It is NOT a Stripe 'seti_...' identifier; that is StripeClientSecret. Used only when StripeClientSecret is absent, and only when longer than 4 characters. Either this or StripeClientSecret must be present, otherwise the call is rejected with "SetupIntentId or StripeClientSecret missing from request. ". |
| VenueID | string Optional extra filter; when longer than 4 characters, candidate subscriptions whose VenueID differs are discarded. VenueID format is |
| Reason | string Optional free text stored as the reason on the appended audit event. Not echoed in the response. |
{- "VenueID": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO",
- "NewVenueUnitPriceAdjustment": -500,
- "Reason": "Retention credit approved by support",
- "AccessToken": "<Cognito JWT access token>",
- "StripeClientSecret": "<the subscription's Stripe setup-intent client secret, which begins seti_>"
}{- "message": "Updated unit-level price adjustment to -5.",
- "errorProcessing": false
}Applies a one-time credit to a subscription's next invoice by writing BillingCyclePriceAdjustment.
Selection: located by SetupIntentId or StripeClientSecret, filtered to the caller's operator, VenueID (if supplied), started, not ended, and with a DIFFERENT adjustment than requested — exactly one row must survive. The adjustment must be a NEGATIVE integer.
| AccessToken required | string Cognito JWT access token of the calling console user. Required in the body - this endpoint does not read an Authorization header. |
| NewBillingCyclePriceAdjustment required | integer <= -1 Credit for the next invoice, in minor units of the subscription's currency; it must end up a NEGATIVE integer. Two guards apply, in this order. (1) tests isNaN(the request body?.NewBillingCyclePriceAdjustment) and, when true, returns 401 'NewBillingCyclePriceAdjustment not found. '. isNaN is NOT a presence check: it is true only when the property is absent/undefined or holds something that does not coerce to a number (for example 'abc', {} or [1,2]). The values '', null, [] and true all coerce to a number, so they PASS this guard. (2) After the SetupIntentId/StripeClientSecret guard, applies parseInt rejects anything that is not < 0 with 401 'NewBillingCyclePriceAdjustment cannot be converted to negative number. '. parseInt(''), parseInt(null), parseInt([]) and parseInt(true) are all NaN, so those four values are rejected HERE and not with the 'not found. ' message; 0 and any positive number are rejected here too. A numeric string such as '-500' is accepted, because parseInt converts it. This value REPLACES any existing BillingCyclePriceAdjustment on the subscription (it is not additive), and a value equal to the current one filters the subscription out, producing 'Active subscription not found. '. |
| SetupIntentId required | string The VAULT SubscriptionID of the subscription to credit - NOT a Stripe setup-intent id. It is looked up and is used only when its length is > 4. It is the same value the console receives as SetupIntentId from listSubscriptions. |
| StripeClientSecret | string Alternative lookup key, used only when SetupIntentId is absent or <= 4 characters (the record store on the caller's OperatorID). This one IS a Stripe value: the client_secret of the Stripe SetupIntent, stored and expected to start with 'seti_'. |
| VenueID | string Optional. Applied as a filter only when longer than 4 characters: candidate subscriptions whose VenueID differs are discarded. Format: {pmgID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode}.{VenueName}.{City} (example). |
| Reason | string Optional free text recorded on the subscription's Events audit entry. It is not returned in the response and not sent to Stripe. |
{- "AccessToken": "eyJraWQiOiJleGFtcGxlIiwiYWxnIjoiUlMyNTYifQ.<redacted>.<redacted>",
- "SetupIntentId": "3f2b9c1e-7d4a-4c8b-9f10-2a6e5b0d7c31",
- "NewBillingCyclePriceAdjustment": -500,
- "Reason": "Service outage goodwill credit"
}{- "message": "Applying one-time adjustment of -$5.00 to next bill due on Sep 1, 2026",
- "errorProcessing": false
}Moves an existing subscription to a different unit at the same venue.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or a Venue admin/leasing agent for the subscription's actual venue (which may differ from the VenueID sent).
What the move does: the subscription is found by SubscriptionID (or StripeClientSecret if absent) and must be active and at this operator. The target unit must exist, belong to the same venue, not be a sub-unit, and have no other live subscription. On success: unit/address fields are rewritten, VLAN/SSID/gateway markers reset so activation re-runs, an audit entry written, caches invalidated.
No match is not an error — 200 with an empty message, whether nothing matched, the target unit equals the current one, or the caller's access category doesn't satisfy the tighter internal guard.
JSON body. It is parsed by the field-mapping step before the endpoint's own error handling starts, so a missing, empty or non-JSON body is not answered with a Vault error body on this resource.
| AccessToken | string Cognito access-token JWT. May also be sent as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token. |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider; absent in that case gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and DELETED from the forwarded body. |
| VenueID | string What gates Venue-role access: the caller's AdministrativeAccess.Venue.VenueAdministrator or AdministrativeAccess.LeasingAgent array must contain this exact value. It is NOT used to look the subscription up, and the service's own venue check uses the subscription's venue instead. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriptionID | string Identifies the subscription to move. The record must belong to the caller's operator and must not have an end date in the past. The legacy name SetupIntentId is accepted and renamed to this field before processing. |
| SetupIntentId | string Legacy alias for SubscriptionID; renamed and removed from the body by the field-mapping step. Despite the name it holds a Vault SubscriptionID, not a Stripe identifier. |
| StripeClientSecret | string Alternative subscription lookup, used only when SubscriptionID is absent. Matches live subscriptions of the caller's operator carrying that client secret. |
object Target unit wrapper. Produced automatically when the legacy NewUnitID_internal field is sent. | |
| NewUnitID_internal | string Legacy alias for VenueUnit.UnitID_internal; renamed into that nested field and removed from the body by the field-mapping step. |
| property name* additional property | any |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriptionID": "string",
- "SetupIntentId": "string",
- "StripeClientSecret": "string",
- "VenueUnit": {
- "UnitID_internal": "string"
}, - "NewUnitID_internal": "string"
}{- "message": "",
- "errorProcessing": false,
- "statusCode": 0
}Moves the start date of a subscription that hasn't started yet — identified by the REQUIRED UnitID_internal and a start date matching the subscription's CURRENT start exactly.
For a wired unit, the new start snaps to local start-of-day (unless doNotResetDatetoMidnight is true); a start in the past is clamped to now. Preponing a start triggers an overlap check and is rejected if another subscription would overlap.
| AccessToken required | string Cognito access token (JWT). Verified by token validation The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the operator resolved from the request Origin header, otherwise the request is rejected with "Administrative Access denied (2). ". |
| UnitID_internal required | string Internal venue-unit id, of the form '{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}' (composed by). REQUIRED by this operation's own guard - missing it is rejected with "UnitID_internal missing from request. " - and it is the id the write targets: the subscription record is selected on this value (fed). It is NOT necessarily the unit that Venue.getVenueUnitSummary loads for the venue/timezone/purpose lookup: that helper resolves a unit in the order AddressLine1 > externalVenueUnitID > UnitID > UnitID_internal, so a body that also carries AddressLine1, externalVenueUnitID or UnitID resolves a DIFFERENT unit for the wired-unit start-of-day snap and the overlap check while the write still targets the subscriptions of the UnitID_internal named here. Send UnitID_internal alone unless that is intended. |
| StartDateTimeUTC.ISO8601 required | string <date-time> The subscription's CURRENT start date, used to select the row. Required - missing it is rejected with "StartDateTimeUTC.ISO8601 missing from request. ". If it is already in the past the call is rejected with "Cannot modify start date. Subscription has already started. ". |
| NewStartDateTimeUTC.ISO8601 required | string <date-time> The requested new start date. Required - missing it is rejected with "NewStartDateTimeUTC.ISO8601 missing from request. "; identical to StartDateTimeUTC.ISO8601 is rejected with "NewStartDateTimeUTC.ISO8601 cannot be same as StartDateTimeUTC. "; on/after the subscription's end date is rejected with "ERROR: NewStartDateTimeUTC.ISO8601 cannot be after EndDateTimeUTC.ISO8601. ". |
| doNotResetDatetoMidnight | boolean Compared with === true, so only the boolean true has an effect; any other value leaves the snap in place. When true it skips the local start-of-day snap, which is itself applied only when the resolved unit's purpose is 'wiredunit'. |
| Reason | string Optional free text stored as the reason on the appended audit event. Not echoed in the response. |
| VenueID | string Optional. Narrows the venue scope of the Venue.getVenueUnitSummary unit lookup; when both it and externalVenueID are omitted, every venue of the operator is listed and searched. Format built by as '{pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}'. |
| externalVenueID | string Optional alternative to VenueID for scoping the unit lookup; it takes PRECEDENCE over VenueID and is matched against the operator's venues. |
| SubscriberToken required | string Subscriber identifier. One of SubscriberToken / EmailAddress / PhoneNumber.E164 / externalSubscriberID must be supplied - token validation rejects otherwise with "EmailAddress, PhoneNumber.E164, SubscriberToken or externalSubscriberID missing from request. ". Generated as 8 letters - two groups of one upper-cased letter followed by three lower-case letters, drawn from the alphabet 'abcdefghjkmnpqrtuvwxyz' (with). |
| EmailAddress | string <email> Alternative subscriber identifier; lower-cased and used as the Cognito 'email' filter. |
| PhoneNumber.E164 | string Alternative subscriber identifier; a leading '+' is added if missing, then used as the Cognito 'phone_number' filter. |
| externalSubscriberID | string Alternative subscriber identifier; trimmed to 64 characters and resolved to a SubscriberToken via the operator's external-id index. |
| AddressLine1 | string Optional unit-lookup field read by Venue.getVenueUnitSummary. It OUTRANKS every other unit selector: when present, externalVenueUnitID / UnitID / UnitID_internal are not used to find the unit at all. Trimmed and sliced to 40 characters, then matched exactly against the unit's AddressLine1. |
| AddressLine2 | string Optional additional filter on the unit lookup; trimmed and sliced to 40 characters, matched exactly. |
| UnitID | string Optional unit-lookup field. Ranks above UnitID_internal and below externalVenueUnitID; trimmed and sliced to 40 characters, then compared against the unit record's ID. |
| externalVenueUnitID | string Optional unit-lookup field, ranked above UnitID and UnitID_internal. |
| UnitBuilding | string Optional additional filter on the unit lookup. |
| UnitFloor | string Optional additional filter on the unit lookup. |
| City | string Optional additional filter on the unit lookup. |
| State | string Optional additional filter on the unit lookup. |
| Country.ISO3166A3 | string Optional additional filter on the unit lookup. |
| PostalCode | string Optional additional filter on the unit lookup. |
{- "AccessToken": "eyJraWQiOiJFWEFNUExFIiwiYWxnIjoiUlMyNTYifQ.EXAMPLE.EXAMPLE",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "StartDateTimeUTC.ISO8601": "2026-09-01T04:00:00.000Z",
- "NewStartDateTimeUTC.ISO8601": "2026-09-15T04:00:00.000Z",
- "Reason": "Move-in delayed at tenant request",
- "EmailAddress": "subscriber@example.com"
}{- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "SubscriberToken": "<SubscriberToken>",
- "NewStartDateTimeUTC.ISO8601": "2026-09-15T04:00:00.000Z",
- "errorProcessing": false
}Intended to quote the unused-service refund for ending a subscription — send StripeClientSecret.
⚠ AS WRITTEN THIS OPERATION CANNOT RETURN A QUOTE — the calculation references two undeclared identifiers, which under ES-module strict mode throws a ReferenceError whenever exactly one active subscription matches. The intended response fields (UnusedRefundAmount, MaxRefundAmount, EndDateTimeUTC.ISO8601) are therefore unreachable and not documented as response fields — and even if reached, MaxRefundAmount would hold the matched-subscription ARRAY, not an amount.
| AccessToken required | string Cognito JWT access token of the calling console user. Required in the body - this endpoint does not read an Authorization header. |
| StripeClientSecret required | string The subscription's Stripe client secret - the client_secret of the Stripe SetupIntent, stored and expected to start with 'seti_'. Used as the key of the OperatorID-StripeClientSecret GSI. Missing or empty returns 401 'StripeClientSecret missing from request.' (401). |
| EndDateTimeUTC.ISO8601 required | string <date-time> Proposed subscription end date, ISO-8601. A falsy/absent value returns 401 'EndDateTimeUTC.ISO8601 missing from request.' (401). |
| endImmediately | boolean Optional. Skips BOTH the venueunit cache lookup and the local end-of-day adjustment. Note the contrast with doNotResetDatetoMidnight in the same block, which really is strict ( |
| doNotResetDatetoMidnight | boolean Optional. Suppresses the local end-of-day adjustment that is otherwise applied for a unit whose purpose is 'wiredunit'. It is only consulted when endImmediately did not already skip the block. |
{- "AccessToken": "eyJraWQiOiJleGFtcGxlIiwiYWxnIjoiUlMyNTYifQ.<redacted>.<redacted>",
- "StripeClientSecret": "seti_XXXXXXXXXXXX_secret_XXXXXXXXXXXX",
- "EndDateTimeUTC.ISO8601": "2026-09-30T23:59:59.999Z"
}{- "errorProcessing": false
}Sets, moves or removes the end date of one subscription, optionally refunding through Stripe. EXACTLY ONE subscription is selected using whichever identifiers were supplied as filters — more than one match is rejected.
An empty-string NewEndDateTimeUTC.ISO8601 removes the end date; otherwise the new end is written together with PendingDeactivation, cancellation metadata and a recomputed ProvisioningStatus. endImmediately forces the end to now.
| AccessToken required | string Cognito access token (JWT). Verified by token validation The caller must hold NetworkOperatorAdministrator, NetworkOperatorAccountManager or CustomerSupport for the operator resolved from the request Origin header, otherwise the request is rejected with "Administrative Access denied (2). ". |
| NewEndDateTimeUTC.ISO8601 | string The new end date. Required unless endImmediately is true (which overwrites it with 'now'). Only a value that is falsy AND not loosely equal to "" (absent, undefined, null) falls through and is rejected with "NewEndDateTimeUTC.ISO8601 missing from request. ". |
| endImmediately | boolean Forces the end date to the current time and skips the end-of-day snap. The check is LOOSE: boolean |
| doNotResetDatetoMidnight | boolean Skips the local end-of-day snap applied to wired units. |
| requestedRefundAmount | integer Refund amount in the currency's minor unit (cents). When greater than 0 it is passed into the refund calculation. |
| CancellationReasons | Array of strings Free-text reasons; stored on the subscription as CancellationReasons and forwarded to the SubscriptionEndDateAdjustment webhook. A non-array or empty value is normalised to an empty array. Not echoed in the response. |
| StripeClientSecret | string The subscription's Stripe setup-intent client secret; selects the subscription on the OperatorID-StripeClientSecret index. Takes precedence over SetupIntentId. The literal "undefined" is treated as absent. |
| SetupIntentId required | string The vault SubscriptionID, used to select the subscription (read only when StripeClientSecret is absent; the lookup is the record store, which queries the SubscriptionID-index on the SubscriptionID attribute). It is NOT a Stripe 'seti_...' identifier - that is StripeClientSecret. |
| UnitID_internal | string Selects subscriptions at this venue unit. FORMAT: composed at as |
| SubscriberToken | string Subscriber identifier; resolved by token validation and then used as a subscription filter. FORMAT: an 8-character token generated by the platform over the alphabet 'abcdefghjkmnpqrtuvwxyz' - i.e. 8 letters with positions 1 and 5 upper-case and no i/l/o/s. There is no 'sub_' prefix. Note trims and slices an inbound value to 16 chars. |
| EmailAddress | string <email> Alternative subscriber identifier. If subscriber lookup fails, the call continues only when SubscriberToken, SetupIntentId, UnitID_internal or StripeClientSecret was supplied; otherwise it is rejected with "Subscriber not found. ". |
| PhoneNumber.E164 | string Alternative subscriber identifier. |
| externalSubscriberID | string Alternative subscriber identifier. Opaque caller-supplied string (the subscriber's operator/PMS-side id); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
| VenueID | string Filter: only subscriptions at this venue are considered. VenueID format is |
| externalVenueID | string Filter on the subscription's externalVenueID. Opaque caller-supplied string (the venue's operator/PMS-side id); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
| externalVenueUnitID | string Filter on the subscription's externalVenueUnitID. Opaque caller-supplied string (the unit's operator/PMS-side id); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
| UnitID | string Filter on the subscription's UnitID. Opaque caller-supplied string (the unit label as stored on the subscription); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
| UnitBuilding | string Filter on the subscription's UnitBuilding. Opaque caller-supplied string (the building label as stored on the subscription); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
| UnitFloor | string Filter on the subscription's UnitFloor. Opaque caller-supplied string (the floor label as stored on the subscription); the code only compares it for equality and no format is imposed anywhere in the API, so no example is given. |
{- "AccessToken": "eyJraWQiOiJFWEFNUExFIiwiYWxnIjoiUlMyNTYifQ.EXAMPLE.EXAMPLE",
- "EmailAddress": "subscriber@example.com",
- "VenueID": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO",
- "NewEndDateTimeUTC.ISO8601": "2026-10-31T03:59:59.000Z",
- "CancellationReasons": [
- "Customer request"
]
}{- "message": "Subscription end date updated to 2026-10-31T03:59:59.000Z",
- "EndDateTimeUTC.ISO8601": "2026-10-31T03:59:59.000Z",
- "errorProcessing": false
}Issues a Stripe refund against a single paid invoice, identified by its per-payment Stripe client secret (pi_..._secret_... — NOT the subscription's seti_ secret). Stripe credentials are resolved from the invoice's unit → venue, falling back to the operator record.
RefundAmount is capped at the invoice's remaining refundable balance (BillingCyclePrice minus AmountRefunded).
⚠ The refund itself is created via Stripe here, but the bookkeeping (AmountRefunded) and the subscriber notification e-mail are written later by the charge.refunded webhook — not by this call. A failure of the post-refund audit write is swallowed; the refund is still reported successful.
| AccessToken required | string Cognito JWT access token of the calling console user. Required in the body - this endpoint does not read an Authorization header. |
| StripeClientSecret required | string The invoice's per-payment Stripe client secret. Missing/empty returns 401 'StripeClientSecret missing from request.' |
| RefundAmount required | integer Amount to refund in minor units. Validated with isNaN(parseInt(...)), so a non-numeric or absent value returns 401 'RefundAmount missing from request.'. Silently capped at the invoice's remaining refundable balance. |
| Currency required | string Enum: "USD" "GBP" "CNY" "CAD" "INR" "AUD" "LKR" ISO 4217 code, upper-case. Must be one of the billing-supported set, else 401 'Currency missing from request.'; it must additionally equal the invoice's currency, else 400 'Currency does not match the original invoice currency. ' |
| VenueID | string Optional. When supplied, the invoice is looked up on the invoice VenueID GSI first; the operator-partition lookup is the fallback. VenueID format is |
| Reason | string Optional. Forwarded to Stripe ONLY when it is exactly 'requested_by_customer', 'duplicate' or 'fraudulent'; any other value is dropped from the Stripe call but still recorded verbatim on the subscription's Events audit entry. |
{- "AccessToken": "eyJraWQiOiJleGFtcGxlIiwiYWxnIjoiUlMyNTYifQ.<redacted>.<redacted>",
- "StripeClientSecret": "pi_XXXXXXXXXXXX_secret_XXXXXXXXXXXX",
- "RefundAmount": 1500,
- "Currency": "USD",
- "VenueID": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO",
- "Reason": "requested_by_customer"
}{- "message": "Initiated refund <stripe_refund_id> for APIRequestBody.Currency 1500",
- "errorProcessing": false
}Forgets a subscriber's remembered devices — the whole device map, or one device by Calling-Station-Id (MAC, normalised). Only the subscriber-side map is touched; per-venue device maps are unaffected. This uses the same request path as updateSubscriberPII (with forgetSubscriberDevices implied), so any other field that endpoint accepts is still read and applied — send only what you mean.
Who may actually forget devices is narrower than who passes the initial role gate: only an operator admin, an NSP, or the subscriber acting on their own token. A Venue admin/leasing agent passes the gate but the forget itself is silently skipped — 200, empty message, nothing forgotten.
Subscriber resolution and cross-operator protection work exactly as in updateSubscriberPII.
AccessToken is required, plus a lookup key identifying the subscriber. Omitting every lookup key does NOT fail - it targets the caller's own account. OperatorID is required for a NetworkSoftwareProvider caller only. The fields listed here are the ones relevant to this operation; every other field of the shared subscriber-configure body is still accepted and still acted on.
| AccessToken required | string Cognito access-token JWT. May also be sent as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and used in preference to it when present. |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and DELETED from the forwarded body. |
| SubscriberToken | string Primary lookup key, used verbatim when present and NOT ownership-checked at resolution time. Whatever the caller sends is overwritten with the resolved token before the work runs, and for a Subscriber-role caller it is overridden again with the caller's own token. |
| externalSubscriberID | string Lookup key, resolved through the operator-scoped index. It is ALSO a writable field on this path (operator-admin or NSP only), and a value that the API changes gives 401 'Invalid characters in externalSubscriberID.' - so send it only when you intend it as the lookup key and it is already in canonical form. |
| EmailAddress | string <email> Lookup key, resolved through the operator-scoped email index and lower-cased on the way in. It is ALSO a writable field (DomainAdministrator or NSP only), so sending an address that differs from the subscriber's current one will attempt to CHANGE it - and can be refused 401 'Email Address is associated with another account.'. Prefer SubscriberToken as the lookup key. |
| PhoneNumber.E164 | string Copied onto PhoneNumber by the endpoint before anything else, so it behaves exactly like PhoneNumber below. Unlike the plain spelling, it is what the self-target test counts as a lookup key, so this is the field to send when identifying a subscriber by phone number. |
| PhoneNumber | string Lookup key, and likewise a writable field: sending a number that differs from the stored one attempts to change it and can fail 401 'Invalid PhoneNumber. Invalid PhoneNumber. ' or 'PhoneNumber is associated with another account.'. It does not work as the ONLY lookup key: the plain spelling does not suppress the self-target fallback, so such a request is retargeted at the caller's own account - send 'PhoneNumber.E164' instead. |
| VenueID | string Not used by the forget. It only gates Venue-role access at the request gate - and a Venue caller cannot perform the forget anyway. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| Calling-Station-Id | string Optional. When supplied non-empty (after trimming), the forget is narrowed to this single device. The value is normalised - hyphens and colons stripped, lower-cased - and must then be a 12-hex-digit MAC: if it is not, the call is refused 401 'Invalid Calling-Station-Id. ' and does NOT fall through to deleting everything. A well-formed MAC that is not in the subscriber's device map gives 401 'Device not found. '. On success the normalised value is echoed back in the response body. Omit the field entirely to forget every device. |
| forgetSubscriberDevices | boolean Not required and not read from the request on this path: reaching this resource sets it to true regardless of what the body contains. Sending false does NOT prevent the forget. |
| forgetSubscriptions | boolean Strict |
| forgetSubscriber | boolean Strict |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "PhoneNumber": "string",
- "VenueID": "string",
- "Calling-Station-Id": "02aabbccddee",
- "forgetSubscriberDevices": true,
- "forgetSubscriptions": true,
- "forgetSubscriber": true
}{- "message": "string",
- "errorProcessing": true,
- "statusCode": 0,
- "Calling-Station-Id": "string"
}List a subscriber's Wi-Fi keys, grouped by keypool, with their connected devices.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport) may target any subscriber of that operator; any other authenticated caller is treated as a subscriber asking about themselves and gets their own record regardless of what was sent — this includes venue-level staff, who have no elevated access here.
Selecting the subscriber: one of SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber.E164 (a bare PhoneNumber doesn't count). An admin may instead run a UnitID_internal- or VenueID-scoped query to list keys without resolving a single subscriber.
Other request fields filter the subscription list (ServicePlanID, Status, currentpsk, etc.); ended subscriptions are always excluded.
| AccessToken | string Cognito access-token JWT. May instead be sent as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 |
| SubscriberToken | string Subscriber selector, checked FIRST - if present the other selectors are not consulted. Also reused afterwards as a filter over the subscription list. |
| externalSubscriberID | string Subscriber selector, checked second - the operator's own id for the subscriber. Also reused afterwards as a filter. |
| EmailAddress | string <email> Subscriber selector, checked third. Lower-cased by the shared request sanitiser and lower-cased again for the lookup. Also reused afterwards as a filter, and that comparison IS case-sensitive. |
| PhoneNumber.E164 | string Subscriber selector, checked last. This dotted form is the ONLY phone selector this operation recognises; it is copied onto PhoneNumber internally for the lookup. |
| PhoneNumber | string NOT a selector on this operation. Sending it alone makes the request look selector-free, which switches the call to a self-lookup - see the operation summary. Use 'PhoneNumber.E164' instead. |
| UnitID_internal | string Admin-only scoped query: resolves the unit to its venue and returns that venue's subscriptions filtered to this unit. No single subscriber is resolved, so no subscriber record and no device map are returned. |
| VenueID | string Admin-only scoped query over the venue's subscription list, and also a filter over the result. Format {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriptionID | string Narrows the result to one subscription. |
| StartDateTimeUTC.ISO8601 | string Keeps only subscriptions starting strictly AFTER this instant. |
| EndDateTimeUTC.ISO8601 | string ACCEPTED AND IGNORED - the endpoint overwrites it with the current time before filtering, which is how already-ended subscriptions are dropped. There is no way to ask this operation for expired keys. |
| ServicePlanID | string Filter. |
| Status | string Filter, compared against the subscriber's status on each subscription. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "+15551234567",
- "PhoneNumber": "string",
- "UnitID_internal": "string",
- "VenueID": "string",
- "SubscriptionID": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlanID": "string",
- "Status": "string"
}{- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "GivenName": "string",
- "FamilyName": "string",
- "PhoneNumber.E164": "string",
- "locale": "en-us",
- "OperatorID": "string",
- "Status": "string",
- "CognitoStatus": "string",
- "email_verified": true,
- "phone_number_verified": true,
- "externalSubscriberID": "string",
- "SubscriberManagedviaSSO": true,
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "AdministrativeAccess": { },
- "Devices": [
- { }
], - "KeysInKeyPools": {
- "property1": {
- "ssid": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}
}, - "property2": {
- "ssid": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}
}
}, - "KeyCount": 2,
- "KeyCountActive": 2,
- "AllDevices": {
- "property1": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}, - "property2": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}
}, - "DeviceCountOnline": 1,
- "DeviceCountOffline": 0,
- "RegisteredDevices": [
- { }
], - "messages_from_venues": {
- "property1": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}, - "property2": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}
}, - "StripeCustomerID": "string",
- "message": "string",
- "errorProcessing": false
}List a subscriber's WiFi keys, grouped by keypool, together with their connected devices.
The body returned IS the resolved subscriber's stored record with the key and device collections added to it - see the 200 description for exactly which fields are stripped and when.
Who may call it, and what each caller sees. A NetworkSoftwareProvider (the origin operator carries a NetworkSoftwareProviderID, the token carries a Username and no SubscriberToken) must supply OperatorID. A NetworkOperator administrator holding DomainAdministrator, AccountManager or CustomerSupport on the operator may target any subscriber of that operator. Any other authenticated caller whose token resolves to a SubscriberToken is treated as a subscriber asking about themselves: every selector in the request is discarded and their own record is returned. That includes venue-level staff - a VenueAdministrator or LeasingAgent has no privileged access on this operation and cannot look another subscriber up through it. Only a token that resolves to neither an operator role nor a SubscriberToken is refused Access Denied. .
Selecting the subscriber. An admin caller identifies the target with exactly one of SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber.E164 - and those are checked in that order, so the first one present wins. Alternatively an admin may run a UnitID_internal- or VenueID-scoped query, which returns the keys for that unit or venue without resolving a single subscriber.
A bare PhoneNumber is NOT a selector on this operation. Only the dotted PhoneNumber.E164 counts. A request carrying PhoneNumber and nothing else is treated as having supplied no selector at all, which silently switches the call to 'return my own record' - so an administrator gets their own keys back with a 200, and a NetworkSoftwareProvider (who has no subscriber record) gets Subscriber not found..
Other request fields narrow the result. After the ended subscriptions are removed, the remaining request fields are applied as filters over the subscription list. Recognised filter names include SubscriptionID, ServicePlanID, externalServicePlanID, VenueID, externalVenueID, UnitID_internal, UnitID, UnitBuilding, UnitFloor, vlan, VenueUnitSSID, RealPageUnitID, externalVenueUnitID, Status, locale, RoamingSSID, GlobalSSID, currentpsk, paymentFailed, gatewayConfigured, StripeCustomerID, StripePaymentMethod, StripeSetupIntentId, CustomerID, AccountStatusAtCreation, AccountAddedByAdministrator, excludeRealPage and StartDateTimeUTC.ISO8601 (which keeps only subscriptions starting AFTER the value given). Any EndDateTimeUTC.ISO8601 you send is overwritten by the current time, which is how ended subscriptions are dropped; you cannot use it to ask for expired keys. For a self-lookup none of these apply - the request body is discarded first.
Reads only. Everything is served from cache - the subscriber record, the subscription list, the keypool list, the per-venue unit lists and the device map. A brand-new subscriber missing from the cache is rebuilt from the database and written back on the fly. The only direct database read is the venue-message query, which runs solely for a subscriber asking about themselves. Nothing is written and no cache is invalidated.
Version gating. api-version: 20260417 or higher adds editable per pool, StrictPSK per key, NetworkData.VenueUnitSSID and per-policy StripeCustomerID, and removes the deprecated top-level StripeCustomerID. Below that version a notice describing this appears in message on EVERY response from this operation, successful or not (the one exception is the fail-closed 500, whose body is exactly {"message":"Internal server error. ","errorProcessing":true} with no notice appended). After the 2026-11-17 sunset the newer shape applies unconditionally.
The access token may be sent in the body or as an Authorization: Bearer <JWT> header; the header wins.
Two consequences are specific to GET: responses carry Cache-Control: private, max-age=5, and a query-string EmailAddress skips the body sanitiser's lower-casing, so send it already lower-cased - it will still resolve the subscriber, but it is reused afterwards as a case-sensitive filter and a mixed-case value can filter every subscription away and return a 200 with no keys.
| AccessToken | string Cognito access-token JWT. Not marked required at the parameter level because it may instead arrive in the Authorization header, but with neither present the call is refused 401 |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 |
| SubscriberToken | string Subscriber selector, checked FIRST - if present the other selectors are not consulted. Also reused afterwards as a filter. |
| externalSubscriberID | string Subscriber selector, checked second. Also reused afterwards as a filter. |
| EmailAddress | string <email> Subscriber selector, checked third. Send it lower-cased: the query-string form skips the body sanitiser, and while the lookup lower-cases it anyway, the same value is reused as a case-sensitive filter. |
| PhoneNumber.E164 | string Subscriber selector, checked last. This dotted form is the ONLY phone selector this operation recognises. |
| PhoneNumber | string NOT a selector on this operation. Sending it alone makes the request look selector-free and switches the call to a self-lookup. Use |
| UnitID_internal | string Admin-only scoped query: resolves the unit to its venue and returns that venue's subscriptions filtered to this unit. No single subscriber is resolved, so no subscriber record and no device map are returned. |
| VenueID | string Admin-only scoped query over the venue's subscription list, and also a filter. Format {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriptionID | string Narrows the result to one subscription. |
| StartDateTimeUTC.ISO8601 | string Keeps only subscriptions starting strictly AFTER this instant. |
| EndDateTimeUTC.ISO8601 | string ACCEPTED AND IGNORED - overwritten with the current time before filtering, which is how ended subscriptions are dropped. |
| ServicePlanID | string Filter. |
| Status | string Filter, compared against the subscriber's status on each subscription. |
| Authorization | string
|
| api-version | string Send |
| Accept-Language | string A value whose first tag begins with |
{- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "GivenName": "string",
- "FamilyName": "string",
- "PhoneNumber.E164": "string",
- "locale": "en-us",
- "OperatorID": "string",
- "Status": "string",
- "CognitoStatus": "string",
- "email_verified": true,
- "phone_number_verified": true,
- "externalSubscriberID": "string",
- "SubscriberManagedviaSSO": true,
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "AdministrativeAccess": { },
- "Devices": [
- { }
], - "KeysInKeyPools": {
- "property1": {
- "ssid": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}
}, - "property2": {
- "ssid": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "WPA2 PSK",
- "editable": true,
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "psk": "string",
- "KeyTag": "MYKEY",
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier-Whitelist": [
- "string"
], - "currentState": "Active",
- "StrictPSK": true,
- "VenueUnitPolicies": {
- "property1": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}, - "property2": {
- "StrictPSK": true,
- "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "vlan": "string",
- "externalVenueUnitID": "string",
- "UnitID_internal": "string",
- "UnitID": "string",
- "UnitFloor": "string",
- "UnitBuilding": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "Country.ISO3166A3": "USA",
- "VenueID": "string",
- "externalVenueID": "string",
- "VenueName": "string",
- "VenueAddressLine1": "string",
- "VenueAddressLine2": "string",
- "VenueCity": "string",
- "VenueState": "string",
- "VenuePostalCode": "string",
- "VenueCountry.ISO3166A3": "USA",
- "Currency": "USD",
- "CurrencySymbol": "$",
- "RealPageUnitID": "string",
- "RealPageSyncDateTimeUTC.ISO8601": "",
- "PMS": {
- "SyncDateTimeUTC": "string",
- "RealPageUnitID": "string",
- "RealPageLeaseID": "string",
- "EntrataUnitSpaceID": "string",
- "EntrataLeaseID": "string",
- "EntrataCustomerID": "string"
}, - "SubscriberManagedviaSSO": true,
- "externalSubscriptionID": "string",
- "paymentFailed": true,
- "gatewayConfigured": true,
- "supportTicketsAllowed": true,
- "dateAddedUTC.ISO8601": "string",
- "dateModifiedUTC.ISO8601": "string",
- "StartDateTimeUTC.ISO8601": "string",
- "EndDateTimeUTC.ISO8601": "string",
- "ServicePlan": {
- "ServicePlanID": "string",
- "ServicePlanName": "string",
- "ServicePlanDescription": "string",
- "externalServicePlanID": "string",
- "FCCLabel": "string",
- "SMSCode": "",
- "ServicePlanImageURL": "string",
- "DownloadKbps": 0,
- "UploadKbps": 0,
- "ConcurrentDevices": 0,
- "MaximumTrialCyclesPerSubscriberPerVenue": 0,
- "MaximumFreeEnrollmentsPerSubscriberPerVenue": 0,
- "TrialCycles": 0,
- "BillingCycleHours": 0,
- "SessionTimeoutSecondsPerDevice": 0,
- "property1": 0,
- "property2": 0
}, - "NetworkData": {
- "AllGatewaysConfigured": true,
- "Calling-Station-Id-Whitelist": [
- "string"
], - "NAS-Identifier": "string",
- "NAS-Identifier-Whitelist": [
- "string"
], - "GatewaysConfigurationInProgressUTC": "string",
- "R1ConfiguredUTC": "string",
- "R1ConfigurationInProgressUTC": "string",
- "SubscriptionStartedProcessedUTC": "string",
- "SubscriptionStartedProcessingUTC": "string",
- "gatewaysConfigured": [
- "string"
], - "VenueUnitSSID": [
- "string"
]
}, - "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Status": "string",
- "StripeClientSecret": "string",
- "StripeCustomerID": "string",
- "SetupIntentId": "string"
}
}, - "Devices": { }
}
}
}, - "KeyCount": 2,
- "KeyCountActive": 2,
- "AllDevices": {
- "property1": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}, - "property2": {
- "Calling-Station-Id": "string",
- "dateAddedUTC.ISO8601": "string",
- "mostRecentUseUTC.ISO8601": "string",
- "SubscriberToken": "string",
- "UnitID_internal": "string",
- "pmk": "string",
- "ssid": "string",
- "vlan": "string",
- "DeviceType": "string",
- "osType": "string",
- "osVendorType": "string",
- "HostName": "string",
- "ModelName": "string",
- "UserDefinedHostName": "string",
- "Framed-IP-Address": "string",
- "currentlyOnline": true
}
}, - "DeviceCountOnline": 1,
- "DeviceCountOffline": 0,
- "RegisteredDevices": [
- { }
], - "messages_from_venues": {
- "property1": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}, - "property2": {
- "dateReceivedUTC.ISO8601": "string",
- "newMessage": true,
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string",
- "VenueID": "string"
}
}, - "StripeCustomerID": "string",
- "message": "string",
- "errorProcessing": false
}Returns one subscriber's audit and event log, newest first. The subscriber is identified by SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber, tried in that order. A NetworkSoftwareProvider caller can identify the subscriber only by a direct SubscriberToken — the other three lookup fields resolve against the provider's own operator, not the one named in OperatorID.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (any subscriber of the operator), a Venue admin/leasing agent (only a subscriber with a subscription, current or past, at a venue they administer — otherwise reported as not found), or the Subscriber themself (always their own log).
Filtering: searchText runs a fuzzy match; a whitelist of exact-match fields is available, or raw OpenSearch customQuery (which replaces the whitelist). The date window defaults to now for the upper bound and is unbounded below unless you send a lower bound — sending one also switches totalCount from a capped estimate to an exact count. Results are newest-first, paged via searchBefore.
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else the English one. It affects rejection text only. |
| AccessToken | string Cognito access token. Absent/empty in both the request and the Authorization header is 401 'AccessToken Missing. '. It is verified only when the operator record resolved from the request Origin carries a Cognito pool; when it does not the token is never verified at all, the caller therefore matches no access category, and the request is refused 401 'Access Denied. '. |
| IdToken | string Optional Cognito ID token. Used by the shared token validator only when the access token's username is not already cached: the ID token is then verified instead, and its preferred_username (or its email, resolved through the operator's email index) becomes the caller identity. |
| OperatorID | string Target operator. REQUIRED only for a NetworkSoftwareProvider caller (missing is 401 'OperatorID Missing. '); it becomes the OperatorID every log query is filtered on and is then removed from the request. Ignored for every other caller, whose operator comes from the request Origin. |
| MinViewWindowDateUTC.ISO8601 | string Window start, parsed with the JavaScript Date constructor. DEFAULT: none - when it is omitted NO lower bound is applied at all and the query spans every monthly log index. Supplying it also switches the hit counter to exact mode; without it totalCount is capped (see the 200 response). An unparseable value is 400. |
| MaxViewWindowDateUTC.ISO8601 | string Window end, parsed with the JavaScript Date constructor. DEFAULT: now + 60 seconds - the extra minute compensates for OpenSearch Serverless near-real-time indexing lag. An unparseable value is 400. |
| pageSize | integer Page size. DEFAULT 250 when omitted or when the value is falsy (the JSON number 0 and an empty string are falsy and therefore fall back to 250). Any other value is parsed as an integer and clamped to a maximum of 500 by the shared OpenSearch service. Note that the string "0" IS truthy: it yields a zero-size query, an empty log array and hasMore true. A non-numeric value yields NaN and the query fails as a 500. |
| searchText | string Full-text search added as a multi_match (best_fields, operator 'and', fuzziness 'AUTO') across event, function_name, Administrator, SourceIP, SubscriberToken and LogType. It is ANDed with every other filter, INCLUDING a customQuery. |
| searchBefore | Array of any Pagination cursor: pass back the searchBefore array from the previous response verbatim. It is the sort tuple of that page's last hit (the document's @timestamp and its _id) and is sent as OpenSearch search_after. |
| customQuery | object Raw OpenSearch Query DSL. Accepted only when it is an object containing at least one of bool, match, term, terms, range, wildcard, regexp, exists or multi_match - otherwise 400 'Invalid customQuery format. Must be valid OpenSearch Query DSL.'. When present it SUPPRESSES all of the individual filter fields below; only the OperatorID scope, the date window, the route's own required filter and searchText are still applied. A bool query is decomposed: its must and filter clauses are merged into the query's must, its must_not into must_not, and its should is wrapped with minimum_should_match (default 1). A non-bool query is added as a single must clause. |
string or Array of strings Name of the emitting function/route recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings Log severity/type recorded on the document (e.g. the value the emitter wrote). Filterable, but NOT among the fields projected back by this route. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings The raw stored administrator identifier (username or email) as written by the emitter - match on the STORED value, not on the display string this route returns after enrichment. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings Operating system parsed from the emitting request's User-Agent. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings Browser parsed from the emitting request's User-Agent. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings Source IP recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings Locale recorded on the log document ('en-us' or 'es-xl'). Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
| SubscriberToken | string Highest-precedence subscriber lookup key. IGNORED for a caller resolved to the Subscriber access category - the token's own SubscriberToken overwrites this one, so such a caller can only read its own log. Because SubscriberToken is also a whitelisted filter field, a value sent here is ALSO applied as a term filter before the overwrite happens, which means a subscriber that sends someone else's token gets an empty result rather than its own log. An operator-role caller that sends it gets exactly that subscriber, still scoped to the operator. |
| VenueID | string Required for a Venue-role caller: it is the value matched against the caller's VenueAdministrator/LeasingAgent arrays to grant that role, and its query is then also filtered on it, so a venue-delegated caller sees only documents that carry that VenueID. For other callers it is an ordinary filter field. Composite Vault VenueID, {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
string or Array of strings UnitID_internal recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings EquipmentID recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings KeyPoolID recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
string or Array of strings ServicePlanID recorded on the log document. Exact-match term filter: a string produces a term query, an array of strings a terms query. Ignored entirely when customQuery is supplied. | |
| externalSubscriberID | string Subscriber lookup key, used when SubscriberToken is absent; resolved through the operator's external-ID index. For a NetworkSoftwareProvider caller this lookup runs against the operator resolved from the request Origin, NOT the |
| EmailAddress | string <email> Subscriber lookup key, used when SubscriberToken and externalSubscriberID are absent; resolved through the operator's email index (the address is lower-cased before the lookup). For a NetworkSoftwareProvider caller this lookup runs against the operator resolved from the request Origin, NOT the |
| PhoneNumber | string Lowest-precedence subscriber lookup key, resolved through the operator's phone index by EXACT string match - the stored value is not normalised here. For a NetworkSoftwareProvider caller this lookup runs against the operator resolved from the request Origin, NOT the |
| property name* additional property | any |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "{Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}",
- "MinViewWindowDateUTC.ISO8601": "2026-08-01T00:00:00.000Z",
- "MaxViewWindowDateUTC.ISO8601": "2026-08-19T23:59:59.000Z",
- "pageSize": 250,
- "searchText": "authentication failed",
- "searchBefore": [
- null
], - "customQuery": { },
- "function_name": "string",
- "LogType": "string",
- "Administrator": "string",
- "AdministratorOS": "string",
- "AdministratorBrowser": "string",
- "SourceIP": "string",
- "SourceLocale": "string",
- "SubscriberToken": "string",
- "VenueID": "string",
- "UnitID_internal": "string",
- "EquipmentID": "string",
- "KeyPoolID": "string",
- "ServicePlanID": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber": "string"
}{- "log": [
- {
- "@timestamp": "string",
- "function_name": "string",
- "event": { },
- "VenueID": "string",
- "UnitID_internal": "string",
- "ServicePlanID": "string",
- "ServicePlanIDs": null,
- "KeyPoolID": "string",
- "Administrator": "string",
- "AdministratorOS": "string",
- "AdministratorBrowser": "string",
- "sourceIP": "string",
- "SourceIP": "string",
- "SourceLocale": "string",
- "SourceUA": "string"
}
], - "currentCount": 250,
- "totalCount": 10000,
- "pageSize": 250,
- "hasMore": true,
- "searchBefore": [
- null
], - "MinViewWindowDateUTC.ISO8601": "string",
- "MaxViewWindowDateUTC.ISO8601": "string",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "string",
- "errorProcessing": false
}Returns one subscriber's audit and event log, newest first. The subscriber is identified by SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber, tried in that order. A NetworkSoftwareProvider caller can identify the subscriber only by a direct SubscriberToken — the other three lookup fields resolve against the provider's own operator, not the one named in OperatorID.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (any subscriber of the operator), a Venue admin/leasing agent (only a subscriber with a subscription, current or past, at a venue they administer — otherwise reported as not found), or the Subscriber themself (always their own log).
Filtering: searchText runs a fuzzy match; a whitelist of exact-match fields is available, or raw OpenSearch customQuery (which replaces the whitelist). The date window defaults to now for the upper bound and is unbounded below unless you send a lower bound — sending one also switches totalCount from a capped estimate to an exact count. Results are newest-first, paged via searchBefore.
GET reads parameters from the query string: only single-valued filters are supported — array filters, customQuery and paging past the first page require the POST form. Responses carry Cache-Control: private, max-age=5.
| AccessToken | string Example: AccessToken=<Cognito JWT access token> Cognito access token, as an alternative to the Authorization header. Absent from both gives 401 'AccessToken Missing. '. |
| IdToken | string Optional Cognito ID token. Used by the shared token validator only when the access token's username is not already cached: the ID token is then verified instead, and its preferred_username (or its email, resolved through the operator's email index) becomes the caller identity. |
| SubscriberToken | string Example: SubscriberToken=<SubscriberToken> The subscriber whose log is wanted, given directly. Highest priority of the four identifier parameters. For a Subscriber caller the log read is always the caller's own, whatever is sent here. It is also on the exact-match filter whitelist, so the value AS SENT is applied as a filter before that substitution happens: for an operator-role caller that is a second, identical clause and harmless, but a Subscriber caller who sends another subscriber's token gets an empty log rather than their own. |
| externalSubscriberID | string Example: externalSubscriberID=EXT-SUB-1 The operator's own subscriber identifier. Used only when SubscriberToken is absent. Resolved through the operator's external-id index and must match exactly one record. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com The subscriber's email address. Used only when SubscriberToken and externalSubscriberID are both absent. Lower-cased before the index lookup and must match exactly one record. |
| PhoneNumber | string Example: PhoneNumber=+15555550123 The subscriber's phone number. Lowest priority - used only when none of the three above is present. Matched verbatim (no normalisation is applied at this point), so it must be in the same form the operator's phone index was written with. |
| VenueID | string Example: VenueID={pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} Doubles as the venue-scope selector and as an exact-match filter. A caller whose only role is VenueAdministrator or LeasingAgent is classified as a Venue caller ONLY if this matches a venue they hold; the same value is then forced onto the query as a VenueID term, so their view of the subscriber's log is limited to that venue. |
| OperatorID | string The operator whose log is wanted. REQUIRED for a NetworkSoftwareProvider caller, which otherwise gets 401 'OperatorID Missing. '. For every other caller the operator is taken from the request Origin and this parameter has no effect. |
| MinViewWindowDateUTC.ISO8601 | string <date-time> Example: MinViewWindowDateUTC.ISO8601=2026-08-01T00:00:00.000Z Lower bound of the @timestamp range. DEFAULTS TO NONE - omit it and the query has no lower bound. Supplying it also switches total counting to exact mode; without it totalCount is capped at 10000. An unparseable value is a 400. |
| MaxViewWindowDateUTC.ISO8601 | string <date-time> Example: MaxViewWindowDateUTC.ISO8601=2026-08-19T23:59:59.999Z Upper bound of the @timestamp range. Defaults to the request time plus a 60-second OpenSearch indexing-lag buffer. An unparseable value is a 400. |
| pageSize | integer Default: 250 Example: pageSize=250 Entries per page, capped at 500. Omit it for the default of 250. Because the value arrives as a string, '0' is truthy here and produces an empty page rather than the default. |
| searchText | string Example: searchText=password reset Fuzzy full-text search across event, function_name, Administrator, SourceIP, SubscriberToken and LogType (best_fields, operator 'and', fuzziness AUTO). |
| function_name | string Exact-match filter on the function_name field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. The Vault function or route that emitted the entry. |
| LogType | string Exact-match filter on the LogType field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. For example 'INFO' or 'ERROR' - the emitter's own label, not a validated enum. Note that LogType is filterable but is NOT among the fields this resource returns. |
| Administrator | string Exact-match filter on the Administrator field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| AdministratorOS | string Exact-match filter on the AdministratorOS field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| AdministratorBrowser | string Exact-match filter on the AdministratorBrowser field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| SourceIP | string Exact-match filter on the SourceIP field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| SourceLocale | string Exact-match filter on the SourceLocale field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| UnitID_internal | string Exact-match filter on the UnitID_internal field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. Format: {VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}. |
| EquipmentID | string Exact-match filter on the EquipmentID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| KeyPoolID | string Exact-match filter on the KeyPoolID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| ServicePlanID | string Exact-match filter on the ServicePlanID field. Applied only when present and only when customQuery is absent. On this form only a single value can be given, so it always becomes a term query, never a terms query. |
| Authorization | string Example: Bearer <Cognito JWT access token> Bearer token for authentication, and the preferred way to authenticate this form. When present, the second whitespace-separated word of the header REPLACES any AccessToken supplied as a query parameter. |
| Accept-Language | string Example: en-US Selects the language of the error messages. A first tag beginning with 'es' selects Spanish (Latin America); anything else selects English (US). It has no effect on the log entries themselves. |
{- "log": [
- {
- "@timestamp": "2026-08-19T11:58:02.114Z",
- "function_name": "subscriber_login_failed",
- "event": {
- "message": "<free-form text recorded by the emitting function>"
}, - "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "SourceIP": "203.0.113.10",
- "SourceLocale": "en-us",
- "SourceUA": "Mozilla/5.0"
}, - {
- "@timestamp": "2026-08-18T09:12:44.031Z",
- "function_name": "vault_networkoperatorconsole_addKey",
- "event": {
- "message": "<free-form text recorded by the emitting function>"
}, - "VenueID": "{pmgId}._V3VENUE_.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}",
- "UnitID_internal": "{VenueID}.{UNITID}.{UNITBUILDING}.{UNITFLOOR}",
- "ServicePlanID": "<ServicePlanID>",
- "KeyPoolID": "<KeyPoolID>",
- "Administrator": "Given Family (staff@example.com)",
- "AdministratorOS": "macOS 15.5",
- "AdministratorBrowser": "Chrome 139.0",
- "SourceIP": "203.0.113.11"
}
], - "currentCount": 2,
- "totalCount": 2,
- "pageSize": 250,
- "hasMore": false,
- "MinViewWindowDateUTC.ISO8601": "2026-08-01T00:00:00.000Z",
- "MaxViewWindowDateUTC.ISO8601": "2026-08-19T12:01:00.000Z",
- "allowedFilterFields": [
- "function_name",
- "LogType",
- "Administrator",
- "AdministratorOS",
- "AdministratorBrowser",
- "SourceIP",
- "SourceLocale",
- "SubscriberToken",
- "VenueID",
- "UnitID_internal",
- "EquipmentID",
- "KeyPoolID",
- "ServicePlanID",
- "MaxViewWindowDateUTC.ISO8601",
- "MinViewWindowDateUTC.ISO8601"
], - "message": "",
- "errorProcessing": false
}Hourly bandwidth usage for one subscriber over the trailing 7 days — one entry per hour including idle hours (all counters 0).
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent for the supplied VenueID, or the subscriber themself. Operator/venue callers identify the subscriber via SubscriberToken/externalSubscriberID/EmailAddress/PhoneNumber.E164 (in that precedence). A Subscriber caller always resolves to their own token.
⚠ A Venue caller is confined to its own venues — naming a subscriber with no subscription (current or past) at one of the caller's venues returns 401 'Subscriber not found.' rather than usage data.
| AccessToken | string Cognito JWT access token for the calling console user. Required in the body only when no Authorization header is sent: splits the request headers.Authorization on ' ' and copies segment [1] into the request's AccessToken BEFORE the presence check, so a header-only caller passes. Missing from both returns 401 with the translated 'AccessToken Missing. '. |
| OperatorID | string Required ONLY when the caller is a NetworkSoftwareProvider (an operator-less console user). Omitting it then returns 401 'OperatorID Missing. '. For every other caller the operator is derived from the request Origin and this field is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| SubscriberToken | string Subscriber identifier. Highest-precedence lookup key. Vault-generated tokens are 8 characters; an operator-supplied token is trimmed to 16 characters. |
| externalSubscriberID | string Operator-side subscriber identifier, free-form. Used when SubscriberToken is absent; resolved through the operator's external-subscriber-id index. |
| EmailAddress | string <email> Subscriber e-mail. Lower-cased before the cache lookup. Used when SubscriberToken and externalSubscriberID are absent. |
| PhoneNumber.E164 | string Subscriber phone in E.164. Copied to 'PhoneNumber' for the lookup, and only for NetworkSoftwareProvider / NetworkOperator / Venue callers. Lowest-precedence lookup key. |
| VenueID | string Optional. Grants access to a VenueAdministrator / LeasingAgent whose role list contains this venue, and is compared against each session's V field while aggregating. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. NOTE: both branches of that comparison add the same octets, so passing VenueID does not currently narrow the totals. |
| Calling-Station-Id | string Optional device MAC. Normalised by replacing '-' with ':' and upper-casing, then stripping ':' and lower-casing, and echoed as the only entry of each hour's Calling-Station-Id array. NOTE: it is not used to filter the octet totals (sums every device in the bucket). |
{- "AccessToken": "eyJraWQiOiJleGFtcGxlIiwiYWxnIjoiUlMyNTYifQ.<redacted>.<redacted>",
- "SubscriberToken": "<SubscriberToken>"
}{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Returns an hour-by-hour bandwidth roll-up for one subscriber, covering the trailing 7 days (168 hourly entries, oldest first). Read-only. Hours with no traffic are still returned as zero-filled entries.
Also available as POST, with identical fields sent as a JSON body instead of the query string.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), a Venue admin/leasing agent for the requested VenueID, or the Subscriber themself. The subscriber is selected by PhoneNumber.E164, EmailAddress, SubscriberToken or externalSubscriberID; if none are sent (or the caller is a subscriber), the caller's own usage is returned. A Venue-role caller is limited to subscribers with a subscription, current or past, at a venue they administer.
| AccessToken | string Cognito access token for the calling console user. Not marked required because it may instead arrive in the Authorization header, which overrides it - but one of the two must be present or the call is refused with 'AccessToken Missing. '. It is only cryptographically verified when the Origin-resolved operator has a Cognito pool configured. |
| IdToken | string Optional Cognito ID token. It is read only by the shared token validation, and only when the presented access token's username was not already cached; in that case the ID token is the one verified, the username is taken from its preferred_username claim, and failing that from an e-mail-to-username lookup. It is also checked against the global sign-out marker, so an ID token issued before the user signed out is refused. |
| OperatorID | string Example: OperatorID=<Country>.<State>.<PostalCode_ID>.<OperatorName_ID>.<City_ID> Target operator. Read ONLY on the NetworkSoftwareProvider branch, where it is mandatory - omitting it there is refused with 'OperatorID Missing. '. Once accepted it replaces the operator context and is removed from the request; it is not itself one of the subscriber-identifying fields, but it selects the operator whose subscribers those fields resolve against. Every other caller's operator comes from the request Origin and this parameter is ignored. Format: {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| VenueID | string Example: VenueID=<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID> Authorisation field. It grants the Venue role when it appears in the caller's VenueAdministrator or LeasingAgent list. A venue-scoped caller that omits it matches neither list, is classified a Subscriber caller instead, and receives its OWN usage rather than the target subscriber's. It does NOT scope the figures: the aggregation compares it against each session's stored venue but adds the same values on both sides of that comparison. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Target subscriber, used verbatim when present - it short-circuits the other three lookup keys and performs no lookup of its own. No operator-ownership check is applied to it on this operation; a venue-role caller is still confined by the venue-scope check that follows. Vault-generated tokens are 8 characters; an operator-supplied token is stored trimmed to 16 characters. |
| externalSubscriberID | string The operator's own identifier for the subscriber, free-form, resolved through an operator-namespaced key. Used only when SubscriberToken was not supplied. |
| EmailAddress | string <email> Example: EmailAddress=subscriber@example.com Subscriber e-mail, lower-cased before the operator-namespaced lookup. Used only when neither SubscriberToken nor externalSubscriberID was supplied. |
| PhoneNumber.E164 | string LITERAL dotted parameter name. For a provider-, operator- or venue-role caller it is copied onto PhoneNumber, which is the field the lookup reads. Lowest-precedence lookup key. E.164 form; no example is shown because any realistic value is a real subscriber's number. |
| PhoneNumber | string The field the phone lookup actually reads. Sending only this is NOT equivalent to sending 'PhoneNumber.E164': a request carrying none of 'PhoneNumber.E164', EmailAddress, SubscriberToken or externalSubscriberID is first re-labelled a subscriber request, so a caller whose token carries a subscriber token receives its OWN usage and this value is never looked up. |
| Calling-Station-Id | string Example: Calling-Station-Id=aabbccddeeff Device MAC. Hyphens are turned into colons and the value upper-cased, then the colons are stripped and the whole value lower-cased, so hyphen-separated, colon-separated and separator-free spellings in any case all normalise to the same thing. It does NOT filter the octet figures - it only replaces the per-hour device list in the response with this one value. |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first two characters of the first language tag are inspected: 'es' selects the Spanish message catalogue for the four messages this operation raises itself; anything else, and an absent header, selects English. It does not affect the shared envelope and token messages, which are English literals in every locale. |
{- "message": "",
- "UsageData": [
- {
- "ReportingTimestamp": "2026-08-19T13:00:00.000Z",
- "Acct-Input-Octets": 0,
- "Acct-Output-Octets": 0,
- "Acct-Total-Octets": 0,
- "rssi": 0,
- "Calling-Station-Id": [ ]
}, - {
- "ReportingTimestamp": "2026-08-19T14:00:00.000Z",
- "Acct-Input-Octets": 10485760,
- "Acct-Output-Octets": 2097152,
- "Acct-Total-Octets": 12582912,
- "rssi": -58,
- "Calling-Station-Id": [
- "aabbccddeeff"
]
}
], - "errorProcessing": false
}Returns invoice/payment history as a Payments array plus record counts. Read-only, aside from a best-effort receipt-URL lookup for rows missing one.
Who may call it: an access token is mandatory (no anonymous access). Classified in order: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent (for the VenueID sent), or Subscriber — whichever the token matches first.
Scope: a Subscriber caller (including a staff token that doesn't match its intended role) always sees only their own history; a Venue caller is confined to the VenueID it sent, even if a subscriber token from another venue is supplied.
Date window: defaults to the last 2 years when no lower bound is sent.
Size guard: beyond 2000 matching rows, Payments is emptied and message explains why; PaymentCount becomes 0.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) message catalogue, anything else US English. Affects rejection text only - no field in the success body is localized. |
| AccessToken | string Cognito JWT access token. Mandatory unless supplied through the Authorization header, which overrides it. Verified only when the operator record carries a Cognito pool. |
| IdToken | string Optional Cognito ID token. When present it is verified instead of the access token and its preferred_username (or its email resolved through the operator's email cache) identifies the caller. |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller, which is rejected 401 'OperatorID Missing. ' without it. It then becomes the operator every result is scoped to, and is deleted from the request before filtering. Ignored for every other caller. |
| VenueID | string Two jobs at once: it is the value the Venue role check matches against, AND a result filter (rows whose VenueID differs are dropped). A caller whose only role is venue-level must send it. When it is the only identifier given, it also selects the VenueID index as the query source. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| SubscriberToken | string Selects the SubscriberToken index and filters the result. Overwritten with the caller's own token when the caller is classified Subscriber. |
| EmailAddress | string Lower-cased and resolved to a SubscriberToken; on success the raw email is dropped from the in-memory filters (invoice rows may not carry it). If it resolves to nothing, the result is empty. Resolution is attempted only when no SubscriberToken was supplied; when one was, the email stays on as an additional exact-match filter against each invoice row's EmailAddress attribute, which many rows do not carry - so that combination can return an empty result. |
| PhoneNumber.E164 | string Subscriber phone number. For an operator-level or venue-level caller it is also copied to the un-dotted PhoneNumber field the cache resolver reads, and matched against the phone cache verbatim (no normalisation). Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| externalSubscriberID | string The operator's own subscriber identifier, resolved to a SubscriberToken. Resolution is attempted only when no SubscriberToken was supplied; if it resolves to nothing the result is empty, and when a SubscriberToken was supplied this value stays on as an additional exact-match filter instead. |
| StripeCustomerID | string Filters the result and, when no subscriber identifier resolved, selects the Stripe-customer index as the query source. |
| externalSubscriptionID | string In-memory filter only; matched exactly against the invoice record's attribute of the same name. |
| externalVenueID | string In-memory filter only; matched exactly. |
| UnitID_internal | string In-memory filter only; matched exactly. |
| externalVenueUnitID | string In-memory filter only; matched exactly. |
| ServicePlanID | string In-memory filter only; matched exactly. |
| externalServicePlanID | string In-memory filter only; matched exactly. |
| MinInvoiceDateTimeUTC.ISO8601 | string <date-time> Lower bound on the invoice date, inclusive of equal values (rows strictly earlier are dropped). Takes precedence over MinStartDateTimeUTC.ISO8601. When neither is sent the bound defaults to two years before the request. A value that does not parse to a real date disables the lower bound entirely rather than erroring. |
| MaxInvoiceDateTimeUTC.ISO8601 | string <date-time> Upper bound on the invoice date, inclusive of equal values. Takes precedence over MaxStartDateTimeUTC.ISO8601. Absent means no upper bound. |
| MinStartDateTimeUTC.ISO8601 | string <date-time> Fallback lower bound, used only when MinInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date, not to any subscription start date. |
| MaxStartDateTimeUTC.ISO8601 | string <date-time> Fallback upper bound, used only when MaxInvoiceDateTimeUTC.ISO8601 is absent. Despite the name it is applied to the invoice date. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "StripeCustomerID": "string",
- "externalSubscriptionID": "string",
- "externalVenueID": "string",
- "UnitID_internal": "string",
- "externalVenueUnitID": "string",
- "ServicePlanID": "string",
- "externalServicePlanID": "string",
- "MinInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxInvoiceDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MinStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z",
- "MaxStartDateTimeUTC.ISO8601": "2019-08-24T14:15:22Z"
}{- "PaymentCount": 1,
- "NonZeroPaymentCount": 1,
- "Payments": [
- {
- "dateAddedUTC.ISO8601": "2026-07-01T04:15:22.113Z",
- "InvoiceDateTimeUTC.ISO8601": "2026-07-01T04:15:20.000Z",
- "PaymentSuccessDateTimeUTC.ISO8601": "2026-07-01T04:15:24.881Z",
- "GivenName": "",
- "FamilyName": "",
- "SubscriberToken": "",
- "externalSubscriberID": "",
- "externalSubscriptionID": "",
- "StripeCustomerID": "",
- "StripePaymentIntentId": "",
- "StripeClientSecret": "",
- "EmailAddress": "subscriber@example.com",
- "PhoneNumber.E164": "",
- "externalServicePlanID": "",
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "Currency": "USD",
- "BillingCyclePrice.USD": 4999,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "AmountProcessed.USD": 4999,
- "AmountReceived.USD": 4999,
- "AmountRefunded.USD": 0,
- "UnitID_internal": "",
- "externalVenueUnitID": "",
- "externalVenueID": "",
- "StripeReceiptURL": "",
- "StripeRefundReceiptURL": "",
- "StripePaymentChargeId": "",
- "CancellationSource": "",
- "CancellationReasons": [ ],
- "BillingCyclePriceAdjustment": 0,
- "BillingCycleAdjustmentReasons": [ ],
- "ServicePlanID": "",
- "BillingCycleHours": 720,
- "UploadKbps": 100000,
- "DownloadKbps": 100000,
- "CurrencySymbol": "$",
- "ConcurrentDevices": 5
}
], - "BillingCycleHours": 720,
- "DownloadKbps": 100000,
- "UploadKbps": 100000,
- "PricePerDownloadGbps.USD": 4,
- "VenuePriceAdjustment": 0,
- "VenueUnitPriceAdjustment": 0,
- "ListBillingCyclePrice.USD": 4999,
- "NetBillingCyclePrice.USD": 4999,
- "MinInvoiceDateTimeUTC.ISO8601": "2024-08-20T00:00:00.000Z",
- "errorProcessing": false
}Updates one subscriber's account. No GET route. The whole request body is forwarded to the subscriber-configure service, whose response replaces the body wholesale (hence the statusCode field inside the body).
Which subscriber is targeted: resolved from PhoneNumber.E164/EmailAddress/SubscriberToken/externalSubscriberID, in that order. If the caller is a Subscriber, or sends none of those, the target defaults to the caller's OWN subscriber.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator, a Venue admin/leasing agent, or the Subscriber themself.
Per-field permissions are enforced inside the service, not uniformly. A field that fails its guard is silently dropped, not rejected.
The subscriber record is unlocked at the end of every run, including failures.
AccessToken is the only universally required field. Everything else is optional; a lookup key (SubscriberToken, externalSubscriberID, EmailAddress or PhoneNumber/PhoneNumber.E164) identifies WHICH subscriber to configure, and omitting all four targets the caller's own account.
| AccessToken required | string Cognito JWT. May also be sent as |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It is moved onto the caller's operator context and DELETED from the forwarded body. |
| SubscriberToken | string Primary lookup key - used verbatim when present. Whatever the caller sends is overwritten with the resolved token before delegation, and for a Subscriber-role caller the service overrides it again with the caller's own token. |
| EmailAddress | string Doubles as a lookup key and as a writable field. Validated as an email address; a failure gives 401 'Invalid characters in EmailAddress.'. An address already held by a different subscriber gives 401 'Email Address is associated with another account.'. |
| PhoneNumber.E164 | string Copied onto |
| PhoneNumber | string Lookup key and writable field. Writable by an operator admin, an NSP, a Venue caller holding a VenueAdministrator/LeasingAgent role, or the subscriber themselves; otherwise silently deleted. Normalised to E.164 by request validation against the OPERATOR's country; a value that will not normalise gives 401 'Invalid PhoneNumber. Invalid PhoneNumber. ' - the literal is emitted TWICE (when the normaliser throws, the thrown error's own text appears between the two copies). A number already held by a different subscriber gives 401 'PhoneNumber is associated with another account.'. |
| externalSubscriberID | string Lookup key ('externalsubscriberid |
| VenueID | string Not a subscriber field - it is what gates Venue-role access: the caller's |
| GivenName | string Writable by an operator admin, an NSP, a Venue caller with a VenueAdministrator/LeasingAgent role, or the subscriber themselves. Sanitised, which permits letters, digits, '.', '_', '-', '&', spaces, parentheses, commas, '?', '*' and both apostrophe forms; a change from the input gives 401 'Invalid characters in GivenName.'. |
| FamilyName | string Same guard and same sanitiser as GivenName; a change gives 401 'Invalid characters in FamilyName.'. Silently deleted when the guard fails. |
| Status | string Only two values are recognised, compared case-insensitively after trim: 'aup not accepted' and 'in service'. They are stored in canonical form as 'AUP not accepted' and 'In Service'. Writable by an operator admin, an NSP, or the subscriber themselves. Any OTHER value fails the guard and is ignored entirely - the 'Invalid characters in Status.' branch is unreachable, because it sits in an else of a check the enclosing condition already restricted to those same two values. |
| locale | string Accepted only as the literal 'en-us' or 'es-xl'; anything else is ignored and the field is deleted. Writable by an operator admin, an NSP, a Venue caller with a VenueAdministrator/LeasingAgent role, or the subscriber themselves. |
| contactpref_sms | boolean Must be a literal true or false (uses [true,false].includes, so the string 'true' is ignored). Same four-role guard as locale. The email counterpart contactpref_email was REMOVED on 2026-08-13 and is no longer read. |
| phone_number_verified | boolean Must be a literal true or false. Same four-role guard; otherwise deleted. Propagated to the Cognito user attributes. |
| SubscriberManagedviaSSO | boolean Truthy value sets the stored flag to true and then REPLACES the entire request body with just { SubscriberToken, SubscriberManagedviaSSO: true }, so every other field sent in the same call is discarded. There is no role guard on this branch and no way to set it back to false through this endpoint. |
Array of objects DECLARATIVE full replacement of the subscriber's push-notification device list - send the complete current list, not a delta. Ignored unless it is an Array, and a non-array value is deleted. Same four-role guard as locale. At most 20 devices are kept (DEVICE_CAP); entries are deduped by DeviceToken, first wins. | |
object Grants or revokes staff roles. The RESULTING role set is validated, not the operation, so a remove-and-reassign in one call is legitimate. A staff member may hold at most ONE role: if the resulting set has more than one entry the call is rejected with statusCode 409 and the message 'A staff member may hold only one role — this request would leave them as ' + the roles joined by ', ' + '. Remove the existing role first. ' - the role list is composed at runtime, so treat that middle part as variable. An ABSENT key leaves that role unchanged; only an Array value is considered. SIEMAdministrators is deliberately not part of the exclusivity set - it is a notification list, not a role. | |
| forgetSubscriberDevices | boolean Strict |
| Calling-Station-Id | string Read ONLY alongside forgetSubscriberDevices. Supplying a non-empty value narrows the forget to that one device: the MAC is normalised (separators stripped, lowercased) and only that field is removed from the sd hash. A supplied value that is not a MAC after normalisation gives 401 'Invalid Calling-Station-Id. ' rather than falling through to the delete-everything path; a MAC not present in the map gives 401 'Device not found. '. |
| forgetSubscriptions | boolean Strict |
| forgetSubscriber | boolean Strict |
{- "AccessToken": "string",
- "OperatorID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "string",
- "PhoneNumber.E164": "string",
- "PhoneNumber": "string",
- "externalSubscriberID": "string",
- "VenueID": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "Status": "string",
- "locale": "string",
- "contactpref_sms": true,
- "phone_number_verified": true,
- "SubscriberManagedviaSSO": true,
- "Devices": [
- {
- "DeviceToken": "string",
- "ChannelType": "GCM",
- "Platform": "string",
- "DeviceName": "string",
- "dateAddedUTC.ISO8601": "string"
}
], - "AdministrativeAccess": {
- "NetworkOperator": {
- "DomainAdministrator": [
- "string"
], - "AccountManager": [
- "string"
], - "CustomerSupport": [
- "string"
], - "SIEMAdministrator": [
- "string"
]
}, - "Venue": {
- "VenueAdministrator": [
- "string"
], - "LeasingAgent": [
- "string"
]
}
}, - "forgetSubscriberDevices": true,
- "Calling-Station-Id": "string",
- "forgetSubscriptions": true,
- "forgetSubscriber": true
}{- "message": "string",
- "errorProcessing": true,
- "statusCode": 0,
- "Calling-Station-Id": "string"
}Updates one existing subscription — the caller's whole request body is forwarded once the target subscription is found.
Lookup varies by caller: a console caller (NSP/NetworkOperator/Venue) selects by SubscriptionID (must belong to the caller's operator, not ended) or StripeClientSecret; a Subscriber caller may instead send UserFriendlySubscriptionID (⚠ the value itself is never actually matched — it just routes into a separate, still-psk-filtered lookup).
⚠ Both zero matches and multiple matches are silent no-ops — the call returns HTTP 200 having done nothing, with no way to distinguish the two.
Each supported property is applied by its own guarded block; a service-plan or bandwidth change tears down provisioning markers, re-seeds PendingGatewayEnable, and decommissions the unit's VLAN.
| AccessToken | string Caller's Cognito JWT in the body. May instead be sent as |
| OperatorID | string Required ONLY for a NetworkSoftwareProvider caller (operator record has a NetworkSoftwareProviderID, token has a Username and no SubscriberToken). Missing then -> 401 'OperatorID Missing. '; present, it becomes the target operator and is deleted from the forwarded body. Ignored for every other caller. See the note about NSP callers being unable to complete this operation. |
| VenueID | string Used ONLY to authorise a venue-scoped caller: the token's AdministrativeAccess.Venue.VenueAdministrator or AdministrativeAccess.LeasingAgent must include this exact value. It does not select the subscription. Format is built by as '{pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}'. |
| SubscriptionID | string Primary selector for an operator/venue caller. The row is accepted only when its OperatorID equals the caller's and it has no EndDateTimeUTC.ISO8601 in the past. |
| StripeClientSecret | string Alternative selector, resolved through the OperatorID-StripeClientSecret GSI. Only consulted when SubscriptionID was not supplied. |
| UserFriendlySubscriptionID | string Dual purpose. Its PRESENCE (non-empty) routes a Subscriber caller into a dedicated lookup branch, but its VALUE is never compared to anything: that branch selects by the caller's own SubscriberToken, or by |
| psk | string Subscriber-caller only, and read only inside the branch a non-empty UserFriendlySubscriptionID selects: the lookup becomes the record store, kept only for rows whose SubscriberToken equals the caller's. Omit it and the branch instead returns every unexpired subscription the caller holds. |
| SubscriberToken | string One of the lookup keys the endpoint passes to request validation A Subscriber caller never needs it - their own token from the JWT is used. |
| EmailAddress | string <email> Subscriber lookup key for an operator/venue caller. Lowercased by request validation. |
| PhoneNumber.E164 | string Subscriber lookup key. For a NetworkSoftwareProvider / NetworkOperator / Venue caller the endpoint copies it onto |
| externalSubscriberID | string Subscriber lookup key. |
| StartDateTimeUTC.ISO8601 | string New subscription start. Renamed internally to StartDateTimeUTC. Only processed while the subscription has NOT yet started. Rejected 401 'Invalid StartDateTimeUTC. ' when unparseable or later than 3000-12-31, 401 'StartDateTimeUTC |
| EndDateTimeUTC.ISO8601 | string New subscription end; renamed internally to EndDateTimeUTC. A single SPACE (' ') REMOVES the end date entirely. Rejected 401 'Invalid EndDateTimeUTC. ' or 401 'EndDateTimeUTC cannot be before SartDateTimeUTC. ' (misspelling verbatim in the code). The role gate is wider than the start-date one: it also admits the RealpageConnector, VenueUnitCleaner and LengthySubscriptionCleaner categories. Applying it also seeds PendingDeactivation and, for an immediate end, evicts the policy |
| endImmediately | boolean Exactly |
| doNotResetDatetoMidnight | boolean Exactly |
| externalSubscriptionID | string Operator-admin / NSP only. A single SPACE (' ') REMOVES the stored value; any other value is sanitised and stored, and a value that changes under sanitisation is rejected 401 'Invalid characters in externalSubscriptionID.'. |
object Service-plan change. Accepted from an operator admin, an NSP, or the subscription's own subscriber. The plan must already be listed on the subscription's venue, else 401 'ServicePlanID not available. '. A successful change rewrites BillingCyclePrice to the new plan's LIST price, computes a pro-rated BillingCyclePriceAdjustment, may set or clear paymentFailed, and forces a full gateway re-provision. | |
object Operator-admin / NSP only. | |
object Operator-admin / NSP only. | |
object Container for the remaining editable properties. Each nested field has its own role gate. | |
| property name* additional property | any |
{- "AccessToken": "<Cognito JWT access token>",
- "SubscriptionID": "<subscription id>",
- "EndDateTimeUTC.ISO8601": "2026-12-31T00:00:00.000Z"
}{- "message": "EndDateTimeUTC updated to 2026-12-31T00:00:00.000Z. Cancellation source = Cancelled by administrator.",
- "errorProcessing": false
}Lists a subscriber's or venue's devices, paginated, sorted most-recently-used first — devices idle more than 7 days are dropped; online/offline counts are computed over the WHOLE filtered set, not just the returned page.
Roles, in order: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent for the REQUESTED VenueID, or Subscriber. ⚠ A venue admin who omits VenueID falls through to the Subscriber branch and gets their OWN devices.
Which map is read: the venue map for NetworkOperator/Venue with a VenueID; otherwise the subscriber map for NetworkOperator/Subscriber with a resolved SubscriberToken.
GET adds Cache-Control: private, max-age=5 to its response.
| Authorization | string When present and non-empty the endpoint OVERWRITES the request's AccessToken with authHeader.split(' ')[1]. Because index 1 is taken unconditionally, a bare token with no 'Bearer ' prefix sets AccessToken to undefined and discards a token supplied in the body/query, producing 401 'AccessToken Missing. '. Format: 'Bearer |
| AccessToken | string Cognito access token. Required: absent or empty is 401 'AccessToken Missing. '. Overwritten by the Authorization header when present. The BODY itself is optional: a request that carries the token in the Authorization header and needs no other field may send no body at all (the request body null yields the request body {}). |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. '), ignored for every other category. See the notes: an NSP caller still receives an empty device list. |
| VenueID | string Selects the VENUE device map instead of a subscriber's. Honoured only when access_category is NetworkOperator or Venue. For the Venue category it is also the value matched against the caller's VenueAdministrator / LeasingAgent arrays. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} (example). |
| SubscriberToken | string Identifies the subscriber whose map to read. |
| externalSubscriberID | string Alternative subscriber lookup, used only when SubscriberToken is absent: resolved through the operator's external-subscriber-id index. |
| EmailAddress | string Alternative subscriber lookup, third in the chain: resolved through email{OperatorID}.V3EMAIL.{lower-cased value}. Request validation lower-cases it first. |
| PhoneNumber | string Alternative subscriber lookup, last in the chain: resolved through phone{OperatorID}.V3PHONE.{value} with NO normalisation, so it must already be in the stored E.164 form. |
| PhoneNumber.E164 | string Copied over PhoneNumber before the lookup when truthy, so the two are interchangeable and this one wins. |
| Page | integer 1-based page number. parseInt(value,10); anything not > 0 (absent, non-numeric, 0, negative) becomes 1. An out-of-range page yields an empty Devices map with the whole-set counts still populated. |
| PageSize | integer Devices per page. parseInt(value,10); anything not > 0 becomes the default (5000 unless LISTDEVICES_PAGE_SIZE overrides it) and anything above 5000 is clamped to 5000. |
| property name* additional property | any |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO",
- "SubscriberToken": "string",
- "externalSubscriberID": "string",
- "EmailAddress": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "Page": 1,
- "PageSize": 5000
}{- "Now": "2026-08-19T14:03:11.482Z",
- "DeviceCountOnline": 1,
- "DeviceCountOffline": 0,
- "Devices": {
- "aabbccddeeff": {
- "Calling-Station-Id": "aabbccddeeff",
- "dateAddedUTC.ISO8601": "2026-08-01T09:15:22.000Z",
- "mostRecentUseUTC.ISO8601": "2026-08-19T13:58:04.000Z",
- "SubscriberToken": "<SubscriberToken>",
- "UnitID_internal": "<UnitID_internal>",
- "pmk": "<PSK>",
- "ssid": "ExampleSSID",
- "vlan": "100",
- "DeviceType": "NetworkDevice",
- "osType": "Unknown",
- "osVendorType": "Unknown",
- "HostName": "Unknown",
- "ModelName": "Unknown",
- "UserDefinedHostName": "AA:BB:CC:DD:EE:FF",
- "Framed-IP-Address": "",
- "currentlyOnline": true
}
}, - "SubscriberToken": "<SubscriberToken>",
- "Expiry": "2026-08-27T14:03:11.482Z",
- "TotalCount": 1,
- "Page": 1,
- "PageSize": 5000,
- "TotalPages": 1,
- "HasMore": false,
- "message": "",
- "errorProcessing": false
}Lists a subscriber's or venue's devices, paginated, sorted most-recently-used first — devices idle more than 7 days are dropped; online/offline counts are computed over the WHOLE filtered set, not just the returned page.
Roles, in order: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent for the REQUESTED VenueID, or Subscriber. ⚠ A venue admin who omits VenueID falls through to the Subscriber branch and gets their OWN devices.
Which map is read: the venue map for NetworkOperator/Venue with a VenueID; otherwise the subscriber map for NetworkOperator/Subscriber with a resolved SubscriberToken.
GET adds Cache-Control: private, max-age=5 to its response.
| AccessToken | string Cognito access token. Supply it EITHER here as a query parameter (merged into the request body) OR as an 'Authorization: Bearer |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. '), ignored for every other category. See the notes: an NSP caller still receives an empty device list. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| VenueID | string Example: VenueID=pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO Selects the VENUE device map instead of a subscriber's. Honoured only when access_category is NetworkOperator or Venue. For the Venue category it is also the value matched against the caller's VenueAdministrator / LeasingAgent arrays. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} (example). Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| SubscriberToken | string Identifies the subscriber whose map to read. FIRST in the resolution chain of request validation - when present it is used verbatim with no further lookup; the operator. A venue-scope check does still apply, but ONLY to callers whose access_category is 'Venue': the token is discarded when the subscriber holds no venue the caller administers. Supplied as a query-string parameter and merged into the request body. |
| externalSubscriberID | string Alternative subscriber lookup, used only when SubscriberToken is absent: resolved through the operator's external-subscriber-id index. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| EmailAddress | string Alternative subscriber lookup, third in the chain: resolved through email{OperatorID}.V3EMAIL.{lower-cased value}. Behaviour is the same either way. Supplied as a query-string parameter, so it reaches the endpoint as a string. |
| PhoneNumber | string Alternative subscriber lookup, last in the chain: resolved through phone{OperatorID}.V3PHONE.{value} with NO normalisation, so it must already be in the stored E.164 form. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| PhoneNumber.E164 | string Copied over PhoneNumber before the lookup when truthy, so the two are interchangeable and this one wins. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| Page | integer Example: Page=1 1-based page number. parseInt(value,10); anything not > 0 (absent, non-numeric, 0, negative) becomes 1. An out-of-range page yields an empty Devices map with the whole-set counts still populated. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| PageSize | integer Example: PageSize=5000 Devices per page. parseInt(value,10); anything not > 0 becomes the default (5000 unless LISTDEVICES_PAGE_SIZE overrides it) and anything above 5000 is clamped to 5000. Supplied as a query-string parameter and merged into the request body, so it reaches the endpoint as a string (Page/PageSize are parseInt'ed, so a numeric string is fine). |
| Authorization | string When present and non-empty the endpoint OVERWRITES the request's AccessToken with authHeader.split(' ')[1]. Because index 1 is taken unconditionally, a bare token with no 'Bearer ' prefix sets AccessToken to undefined and discards a token supplied in the body/query, producing 401 'AccessToken Missing. '. Format: 'Bearer |
{- "Now": "2026-08-19T14:03:11.482Z",
- "DeviceCountOnline": 1,
- "DeviceCountOffline": 0,
- "Devices": {
- "aabbccddeeff": {
- "Calling-Station-Id": "aabbccddeeff",
- "dateAddedUTC.ISO8601": "2026-08-01T09:15:22.000Z",
- "mostRecentUseUTC.ISO8601": "2026-08-19T13:58:04.000Z",
- "SubscriberToken": "<SubscriberToken>",
- "UnitID_internal": "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO.101.A.1",
- "pmk": "<PSK>",
- "ssid": "ExampleSSID",
- "vlan": "100",
- "DeviceType": "NetworkDevice",
- "osType": "Unknown",
- "osVendorType": "Unknown",
- "HostName": "Unknown",
- "ModelName": "Unknown",
- "UserDefinedHostName": "AA:BB:CC:DD:EE:FF",
- "Framed-IP-Address": "",
- "currentlyOnline": true
}
}, - "SubscriberToken": "<SubscriberToken>",
- "Expiry": "2026-08-27T14:03:11.482Z",
- "TotalCount": 1,
- "Page": 1,
- "PageSize": 5000,
- "TotalPages": 1,
- "HasMore": false,
- "message": "",
- "errorProcessing": false
}Lists in-portal messages sent to a subscriber, keyed by MessageID.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent for the supplied VenueID, or Subscriber. A caller supplying none of PhoneNumber.E164/EmailAddress/SubscriberToken/externalSubscriberID is re-labelled Subscriber and reads its own messages.
Query path: with VenueID, a venue-scoped index is used; without it, the operator-agnostic index is used, but an operator/venue caller naming a SubscriberToken directly must first pass an ownership check against the cache — a mismatch is 401.
GET merges the query string into the request; its response also carries Cache-Control: private, max-age=5.
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected; 'es' selects the Spanish message catalogue ('es-xl'), anything else 'en-us'. |
| AccessToken | string Cognito JWT. Ignored when an Authorization header is present, which overwrites it. Absent/empty in both places -> 401. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is then deleted from the request. Ignored for every other role. |
| VenueID | string Format is the composite Vault VenueID ({pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}); no example is given because any realistic value names a real venue. |
| SubscriberToken | string Target subscriber, highest-precedence lookup key. When an operator/venue caller uses it WITHOUT VenueID, ownership is verified against the cache subscriberinfo record and a mismatch is 401. Ignored for a Subscriber caller. |
| EmailAddress | string Subscriber lookup key, lower-cased before use. Used only when SubscriberToken and externalSubscriberID are absent. |
| externalSubscriberID | string Subscriber lookup key; takes precedence over EmailAddress and PhoneNumber. |
| PhoneNumber.E164 | string Subscriber lookup key. Copied to the internal PhoneNumber field ONLY for a NetworkSoftwareProvider/NetworkOperator/Venue caller; lowest precedence in request validation Note the key contains a literal dot. |
| IdToken | string Optional Cognito ID token, read straight off the request body by request validation. A non-empty |
| PhoneNumber | string Lowest precedence — used only when |
{- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "SubscriberToken": "string",
- "EmailAddress": "string",
- "externalSubscriberID": "string",
- "PhoneNumber.E164": "string",
- "IdToken": "string",
- "PhoneNumber": "string"
}{- "message": "",
- "messages": {
- "property1": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string"
}, - "property2": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string"
}
}, - "errorProcessing": false
}Lists in-portal messages sent to a subscriber, keyed by MessageID.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, Venue admin/leasing agent for the supplied VenueID, or Subscriber. A caller supplying none of PhoneNumber.E164/EmailAddress/SubscriberToken/externalSubscriberID is re-labelled Subscriber and reads its own messages.
Query path: with VenueID, a venue-scoped index is used; without it, the operator-agnostic index is used, but an operator/venue caller naming a SubscriberToken directly must first pass an ownership check against the cache — a mismatch is 401.
GET merges the query string into the request; its response also carries Cache-Control: private, max-age=5.
| AccessToken | string Cognito JWT. Merged into the request body. Ignored when an Authorization header is present, which overwrites it. Absent/empty in both places -> 401. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is then deleted from the request. Ignored for every other role. |
| VenueID | string Format is the composite Vault VenueID ({pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}); no example is given because any realistic value names a real venue. |
| SubscriberToken | string Target subscriber, highest-precedence lookup key. When an operator/venue caller uses it WITHOUT VenueID, ownership is verified against the cache subscriberinfo record and a mismatch is 401. Ignored for a Subscriber caller. |
| EmailAddress | string Subscriber lookup key. Used only when SubscriberToken and externalSubscriberID are absent. |
| externalSubscriberID | string Subscriber lookup key; takes precedence over EmailAddress and PhoneNumber. |
| PhoneNumber.E164 | string Subscriber lookup key. Copied to the internal PhoneNumber field ONLY for a NetworkSoftwareProvider/NetworkOperator/Venue caller; lowest precedence in request validation Note the key contains a literal dot. |
| IdToken | string Optional Cognito ID token, merged into the request body from the query string before the token is validated. A non-empty |
| PhoneNumber | string Lowest precedence — used only when |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected; 'es' selects the Spanish message catalogue ('es-xl'), anything else 'en-us'. |
{- "message": "",
- "messages": {
- "property1": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string"
}, - "property2": {
- "dateSentUTC.ISO8601": "string",
- "dateAcknowledgedUTC.ISO8601": "string",
- "Subject": "string",
- "Message": "string"
}
}, - "errorProcessing": false
}Authenticates a subscriber against the operator's Cognito pool and returns Cognito JWTs. Two mutually exclusive flows: (1) credential login — Password plus an identifier (EmailAddress, PhoneNumber, or SubscriberToken used directly as the Cognito username); (2) SSO.
The operator must have a fully configured Cognito pool (id, app client id AND secret) or every request is rejected before either flow runs.
⚠ PII is deliberately stripped before responding — SubscriberToken, EmailAddress, PhoneNumber, GivenName, FamilyName, CognitoID, Status and wpa2ekey are removed even though they're present in the cached subscriber record merged into the response.
| Password | string <password> Subscriber password. Selects the credential flow (tested as |
| EmailAddress | string <email> Subscriber email. Lowercased by request validation before use. Only consulted when its length is >= 5; a shorter value silently falls through to the PhoneNumber branch. |
| PhoneNumber | string Only reached when EmailAddress is absent or shorter than 5 characters. |
| SubscriberToken | string Subscriber token used directly as the Cognito username, lowercased. Only reached when neither EmailAddress (>= 5 chars) nor PhoneNumber was supplied, and only honoured when longer than 4 characters. |
| authorizationToken | string OAuth2 authorization CODE from the operator's Cognito hosted UI - NOT a bearer JWT. Its presence (length > 0) selects the SSO flow and takes precedence over Password. The code is exchanged at |
| Domain | string Read by the shared validator, not by this endpoint: when the calling Origin resolves to a NetworkSoftwareProvider operator, |
| property name* additional property | any |
{- "EmailAddress": "subscriber@example.com",
- "Password": "<password>"
}{- "AuthenticationResult": {
- "AuthenticationResult": {
- "AccessToken": "<cognito access jwt>",
- "IdToken": "<cognito id jwt>",
- "RefreshToken": "<cognito refresh token>"
}
}, - "message": "",
- "errorProcessing": false
}Restarts one subscription's billing period without charging anything or rewriting history — appends a fresh timestamp to the subscription's InvoiceDateTimeUTC.ISO8601 list and recomputes NextInvoiceDue; the payment scheduler always reads the LATEST entry.
Identified by: EmailAddress + UnitID_internal, resolved against the operator's ACTIVE subscriptions at that unit — exactly one match is required.
Access: an NSP (must send OperatorID) or a NetworkOperator DomainAdministrator/AccountManager/CustomerSupport.
| AccessToken | string Cognito JWT. May be sent in the body or as |
| OperatorID | string Target operator. REQUIRED for a NetworkSoftwareProvider caller and deleted from the body once accepted. Ignored for a NetworkOperator caller. |
| EmailAddress required | string <email> REQUIRED. Identifies the subscriber. Lower-cased, checked as an email address, then trimmed and lower-cased again and once more inside the service. |
| UnitID_internal required | string REQUIRED. The internal unit identifier the subscription is attached to. |
{- "AccessToken": "string",
- "OperatorID": "string",
- "EmailAddress": "user@example.com",
- "UnitID_internal": "string"
}{- "message": "Operation complete. ",
- "InvoiceDateTimeUTC": "2019-08-24T14:15:22Z",
- "NextInvoiceDue": "2019-08-24T14:15:22Z",
- "errorProcessing": false,
- "statusCode": 200
}Looks up a subscriber by EMAIL ADDRESS and returns their cached profile. Despite the name, performs no email-format validation and reports no availability flag — it either returns the profile (200) or rejects (401).
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent for the supplied VenueID. ⚠ No subscriber path — a plain subscriber token is refused.
Lookup: only runs when EmailAddress is at least 5 characters — SubscriberToken/externalSubscriberID/PhoneNumber are deleted from the request first, so email is the only usable key. Any other outcome (too short, no cache entry, operator mismatch) is 401 'Subscriber not found.' A Venue caller is additionally confined to subscribers at its own venues.
Read-only. GET merges the query string into the request; its response also carries Cache-Control: private, max-age=5.
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected; 'es' selects the Spanish message catalogue, anything else English. |
| EmailAddress required | string >= 5 characters The subscriber's email. Ignored unless its length is >= 5; lower-cased before the cache read. Absent or shorter than 5 characters produces 401 'Subscriber not found.', not a validation error. |
| AccessToken | string Cognito JWT. Overwritten by the Authorization header when that is present. Missing in both places -> 401. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is deleted from the request. Ignored for every other role — an operator or venue caller's operator comes from the request Origin. |
| VenueID | string Only used to grant the Venue role: it must appear in the token's AdministrativeAccess.Venue.VenueAdministrator or AdministrativeAccess.LeasingAgent array. It does NOT filter the lookup. Format is the composite Vault VenueID ({pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}); no example is given because any realistic value names a real venue. |
| IdToken | string Optional Cognito ID token, read straight off the request body by request validation. A non-empty |
{- "EmailAddress": "string",
- "AccessToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "IdToken": "string"
}{- "message": "",
- "GivenName": "string",
- "FamilyName": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "locale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "errorProcessing": false
}Looks up a subscriber by EMAIL ADDRESS and returns their cached profile. Despite the name, performs no email-format validation and reports no availability flag — it either returns the profile (200) or rejects (401).
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator, or Venue admin/leasing agent for the supplied VenueID. ⚠ No subscriber path — a plain subscriber token is refused.
Lookup: only runs when EmailAddress is at least 5 characters — SubscriberToken/externalSubscriberID/PhoneNumber are deleted from the request first, so email is the only usable key. Any other outcome (too short, no cache entry, operator mismatch) is 401 'Subscriber not found.' A Venue caller is additionally confined to subscribers at its own venues.
Read-only. GET merges the query string into the request; its response also carries Cache-Control: private, max-age=5.
| EmailAddress required | string >= 5 characters The subscriber's email. Ignored unless its length is >= 5. Absent or shorter than 5 characters produces 401 'Subscriber not found.', not a validation error. |
| AccessToken | string Cognito JWT, merged in from the query string. Overwritten by the Authorization header when that is present. Missing in both places -> 401. |
| OperatorID | string REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it becomes the operator context and is deleted from the request. Ignored for every other role — an operator or venue caller's operator comes from the request Origin. |
| VenueID | string Only used to grant the Venue role: it must appear in the token's AdministrativeAccess.Venue.VenueAdministrator or AdministrativeAccess.LeasingAgent array. It does NOT filter the lookup. Format is the composite Vault VenueID ({pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}); no example is given because any realistic value names a real venue. |
| IdToken | string Optional Cognito ID token, merged into the request body from the query string before the token is validated. A non-empty |
| Authorization | string 'Bearer |
| Accept-Language | string Only the first tag's leading two characters are inspected; 'es' selects the Spanish message catalogue, anything else English. |
{- "message": "",
- "GivenName": "string",
- "FamilyName": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "locale": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "errorProcessing": false
}Management of authentication key pools for subscriber access control and venue-specific authentication services.
Lists the keypools (SSIDs) visible to the caller — served entirely from cache, no database read.
Response shape depends on VenueID: without it, myKeyPoolList is an OBJECT keyed by KeyPoolID (operator-wide); with it, an ARRAY combining the operator's global-scope keypools, the venue's own KeyPoolID set, and one synthesized entry per venue-unit SSID. The two shapes don't even spell the id key the same way (KeyPoolID vs KeypoolID) — treat them as distinct contracts, not interchangeable.
Roles: an access token is mandatory. NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent — which requires VenueID to be reachable at all. No anonymous fallthrough.
GET and POST share one implementation; on POST, query-string parameters are ignored — every field must be in the JSON body.
AccessToken is the only universally required field; it may instead be sent as an Authorization: Bearer header. OperatorID is required for a NetworkSoftwareProvider caller only.
| AccessToken | string Cognito access-token JWT. May also be sent as |
| IdToken | string Cognito id token. When present it is verified instead of the access token and the caller's username is taken from it. |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It becomes the target operator and is then DELETED from the request. Ignored for every other caller. Format is {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| VenueID | string When present, the venue-scoped cache entry is read instead of the operator-wide one and myKeyPoolList comes back as an ARRAY. It is also the value matched by the venue-role check, so a VenueAdministrator or LeasingAgent must supply it. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string"
}{- "myKeyPoolCount": 0,
- "myKeyPoolList": {
- "property1": {
- "ssid": "string",
- "Scope": "string",
- "RuckusR1ControllerID": "string",
- "RuckusR1DPSKPoolName": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "string",
- "SubscriberList": [ ],
- "InactiveSubscriberCount": 0,
- "InactiveSubscriberList": [ ],
- "dateAddedUTC.ISO8601": "string",
- "KeyCount": 0,
- "SubscriberCount": 0,
- "ConnectedVenueCount": 0,
- "message": "More than 5 venues connected.",
- "ConnectedVenueList": {
- "property1": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}, - "property2": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}
}
}, - "property2": {
- "ssid": "string",
- "Scope": "string",
- "RuckusR1ControllerID": "string",
- "RuckusR1DPSKPoolName": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "string",
- "SubscriberList": [ ],
- "InactiveSubscriberCount": 0,
- "InactiveSubscriberList": [ ],
- "dateAddedUTC.ISO8601": "string",
- "KeyCount": 0,
- "SubscriberCount": 0,
- "ConnectedVenueCount": 0,
- "message": "More than 5 venues connected.",
- "ConnectedVenueList": {
- "property1": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}, - "property2": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}
}
}
}, - "message": "",
- "errorProcessing": false
}Lists the keypools (SSIDs) visible to the caller. The answer is served entirely from the cache - this operation performs no database read of its own and writes nothing.
Which cache entry is read depends on whether VenueID is supplied.
So myKeyPoolList changes TYPE with the request - object without VenueID, array with it - and the two shapes do not even spell the identifier the same way (the service's key is the KeyPoolID; each array element carries a KeypoolID property, lower-case p). Clients cannot treat them interchangeably.
Authorisation is evaluated in this order.
The access token may instead be supplied as an Authorization: Bearer <jwt> header. The header is applied last and overwrites a token supplied any other way; a header with no space after 'Bearer' yields nothing and the call is rejected as if no token had been sent.
GET and POST are served by the same function and the same code. The only difference is that on a GET the query-string parameters are merged over the request body, so the query string carries exactly the field names a POST body would; a GET response additionally carries a Cache-Control: private, max-age=5 header.
| AccessToken | string Cognito access-token JWT, merged into the request body from the query string. Not marked required at the parameter level because it may instead arrive in the Authorization header - but one of the two must be present or the call is rejected 401. |
| IdToken | string Cognito id token. When present it is verified instead of the access token and the caller's username is taken from it. |
| OperatorID | string Target operator. Read ONLY on the NetworkSoftwareProvider branch, where it is mandatory and is removed from the request once adopted. Ignored for NetworkOperator and Venue callers, whose operator comes from the request Origin. Format is {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| VenueID | string When present, the venue-scoped cache entry is read instead of the operator-wide one and myKeyPoolList comes back as an ARRAY. It is also the value matched by the venue-role check, so a VenueAdministrator or LeasingAgent must supply it. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
{- "myKeyPoolCount": 0,
- "myKeyPoolList": {
- "property1": {
- "ssid": "string",
- "Scope": "string",
- "RuckusR1ControllerID": "string",
- "RuckusR1DPSKPoolName": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "string",
- "SubscriberList": [ ],
- "InactiveSubscriberCount": 0,
- "InactiveSubscriberList": [ ],
- "dateAddedUTC.ISO8601": "string",
- "KeyCount": 0,
- "SubscriberCount": 0,
- "ConnectedVenueCount": 0,
- "message": "More than 5 venues connected.",
- "ConnectedVenueList": {
- "property1": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}, - "property2": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}
}
}, - "property2": {
- "ssid": "string",
- "Scope": "string",
- "RuckusR1ControllerID": "string",
- "RuckusR1DPSKPoolName": "string",
- "DisplayOrder": 50,
- "AuthenticationMechanism": "string",
- "SubscriberList": [ ],
- "InactiveSubscriberCount": 0,
- "InactiveSubscriberList": [ ],
- "dateAddedUTC.ISO8601": "string",
- "KeyCount": 0,
- "SubscriberCount": 0,
- "ConnectedVenueCount": 0,
- "message": "More than 5 venues connected.",
- "ConnectedVenueList": {
- "property1": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}, - "property2": {
- "VenueName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "NAS-Identifier": "string"
}
}
}
}, - "message": "",
- "errorProcessing": false
}Creates a keypool (the SSID container a venue's PSKs are issued from) under one operator, then immediately runs the keypool-configure step against it so any keypool-configuration field sent in the same body is applied.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator. AccountManager/CustomerSupport/venue roles are not accepted.
Scope is always local — Scope: 'global' is accepted but has no effect; global keypools can't be created here. RuckusR1ControllerID/RuckusR1DPSKPoolName are also accepted but ignored on this route.
KeyPoolID is derived, never supplied.
On success: the keypool is created, linked to VenueID if supplied, and immediately configured with the same body — its message is appended to the response, but its own errors are NOT propagated (so a rejected configure field arrives as extra text on an otherwise-successful 200). Note deleteKeyPoolPermanently: true is honored there — sending it creates the keypool and immediately deletes it again.
| AccessToken | string Cognito access-token JWT. May instead be supplied as |
| OperatorID | string REQUIRED only when the caller is a Network Software Provider; it names the operator to create the keypool under and is then deleted from the forwarded body. Absent for that caller gives 401 'OperatorID Missing. '. Ignored for a DomainAdministrator caller, whose operator comes from the request Origin. The value is the operator identifier built as Country, State, PostalCode_ID, OperatorName_ID and City_ID joined with dots. |
| SSID required | string The wireless network name for the new keypool. Required: absent or empty gives 401, first from the endpoint's own literal 'SSID Missing. ' - the service's localised 'SSID missing from request.' is therefore not reachable through this route. The value is trimmed and truncated to 32 characters before validation; shorter than 2 gives 401 'SSID cannot be less than 2 characters.' and a value that does not satisfy the WiFi naming rules gives 401 'SSID does not conform to standards.'. The rules reject a leading !, #, ;, +, ], /, " or tab, any +, ], /, " or tab anywhere, and a trailing space, +, ], /, " or tab. |
| VenueID | string Optional. When present the venue must exist and belong to the caller's operator, otherwise 401 'Venue not found.'; and no keypool already attached to that venue may carry the same SSID, otherwise 401 'SSID is already available at venue ' followed by the VenueID and '. '. On success the new keypool is attached to this venue. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| AuthenticationMechanism | string Only the exact string 'PEAP MSCHAPv2' is honoured; it stores 'PEAP MSCHAPv2' as the mechanism. Any other value, including 'WPA3', leaves the stored mechanism at 'WPA2 PSK'. |
| Scope | string Accepted and effectively ignored on this route: the created keypool always gets a randomly generated 8-character lowercase scope. In particular 'global' does not produce a global keypool. |
| RuckusR1ControllerID | string Accepted and ignored on this route. The branch that consumes it also requires the call to have arrived on one of the Ruckus R1 controller endpoints, so on this path the keypool is stored with a null controller id. |
| RuckusR1DPSKPoolName | string Accepted and ignored on this route, for the same reason as RuckusR1ControllerID; the keypool is stored with a null DPSK pool name. |
| DisplayOrder | integer Forwarded to the keypool-configure step, which applies it to the new keypool. It is applied only when it parses to an integer that differs from the DisplayOrder of 50 the keypool was just created with, and only when it is at least 1 and strictly less than 100 - otherwise the text 'DisplayOrder should be between 1-100.' is appended to the message (note that 100 itself is refused despite that wording). A value that is present but does not parse as an integer is replaced by 50, i.e. no change. |
| connectVenueID | string Forwarded to the keypool-configure step: attaches the newly created keypool to this additional venue. A venue already carrying the keypool yields the appended text 'Venue is already connected to keypool. '; a venue that cannot be resolved for this operator yields 'Venue to connect not found. '. |
| disconnectVenueID | string Forwarded to the keypool-configure step: detaches the newly created keypool from this venue. Appended text is 'Venue is already disconnected from keypool. ' or 'Venue to disconnect not found. ' when it does not apply. |
| deleteKeyPoolPermanently | boolean Forwarded to the keypool-configure step, which honours the strict boolean true by DELETING the keypool that this call has just created. There is no route guard preventing that combination. |
| property name* additional property | any |
{- "AccessToken": "string",
- "OperatorID": "string",
- "SSID": "GuestWiFi",
- "VenueID": "string",
- "AuthenticationMechanism": "PEAP MSCHAPv2",
- "Scope": "string",
- "RuckusR1ControllerID": "string",
- "RuckusR1DPSKPoolName": "string",
- "DisplayOrder": 10,
- "connectVenueID": "string",
- "disconnectVenueID": "string",
- "deleteKeyPoolPermanently": false
}{- "message": "Keypool added: <OperatorID>._V3SSID.GuestWiFi.a8f3d2e1. Updating DisplayOrder to 10. ",
- "KeyPoolID": "string",
- "SSID": "GuestWiFi",
- "errorProcessing": false
}Configures one keypool (SSID): connect a venue, disconnect a venue, change its display order, or delete it permanently. The whole response is the service's return value.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator. AccountManager/CustomerSupport/venue roles are not accepted.
deleteKeyPoolPermanently: true (strictly boolean) deletes the keypool and its cache entry — but does NOT remove it from any venue's KeyPoolID set, and does not touch existing PSKs/subscriptions.
One call can do multiple things, in fixed order: venue connect/disconnect, then DisplayOrder, then permanent delete. If connectVenueID is set, disconnectVenueID is silently ignored. Connecting requires the venue to exist and belong to the same operator; for a WPA3 keypool bound to a Ruckus R1 controller, connecting is refused if the venue is already attached to a DIFFERENT controller. Disconnecting queues a DPSK sweep before unlinking (existing subscribers keep working until the sweep drains).
Rejections don't all use an error status: venue-level refusals (not found, already connected/disconnected, R1 controller conflict) return 200 with errorProcessing: true. Conversely, an out-of-range DisplayOrder returns 401 while errorProcessing stays false — and does NOT stop the rest of the call (the venue operation and delete in the same request still run). Always check errorProcessing, not the HTTP status.
AccessToken and KeyPoolID are required. OperatorID is required for a NetworkSoftwareProvider caller only. Every other field selects one of the operations; a request that carries none of them is accepted and does nothing, returning 200 with an empty message.
| AccessToken required | string Cognito access-token JWT. May also be sent as |
| IdToken | string Cognito id token. When present it is verified instead of the access token and the caller's username is taken from it. |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It becomes the target operator and is then DELETED from the forwarded request. Ignored for a DomainAdministrator caller, whose operator comes from the request Origin. Format is {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| KeyPoolID required | string The keypool to configure. Mandatory: absent, empty, unknown, or owned by another operator is rejected 401 with 'Invalid keypool' plus a space plus the value as sent. Format is {OperatorID}._V3SSID.{SSID}.{scope}, where scope is 'global' or a generated local-scope token. |
| connectVenueID | string Connect this venue to the keypool. The venue must exist and belong to the same operator ('Venue to connect not found. ' otherwise) and must not already be connected ('Venue is already connected to keypool. '). Both of those come back as HTTP 200 with errorProcessing true. Takes precedence over disconnectVenueID, which is then ignored entirely. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| disconnectVenueID | string Disconnect this venue from the keypool. The venue must exist and belong to the same operator ('Venue to disconnect not found. ') and must currently be connected ('Venue is already disconnected from keypool. '); both come back as HTTP 200 with errorProcessing true. Examined ONLY when connectVenueID is empty or absent. Same format as connectVenueID. |
integer or string Sort position for the operator console. The value is run through an integer parse: a value that parses to an integer is used as that integer (so '7' and '7abc' both mean 7), and any OTHER truthy value - a non-numeric string, true, an object - is silently REWRITTEN TO 50 and stored as 50. An empty string, null, false and 0-as-a-string-that-parses are handled by the parse rule instead. The accepted range is 1 to 99 inclusive: 0 and anything from 100 up are refused with 'DisplayOrder should be between 1-100.' at HTTP 401 while errorProcessing stays false and the rest of the call proceeds. The write happens only when the effective value differs from the stored one, or the keypool has none. | |
| deleteKeyPoolPermanently | boolean Strictly the boolean true; any other value, including the string "true", is ignored. Deletes the keypool record and invalidates its cached key pool. It is evaluated only if nothing earlier in the same call failed. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "KeyPoolID": "OPERATORID._V3SSID.GuestWiFi.global",
- "connectVenueID": "string",
- "disconnectVenueID": "string",
- "DisplayOrder": 50,
- "deleteKeyPoolPermanently": true
}{- "message": "Connected keypool to venue <VenueID>. ",
- "errorProcessing": false
}Permanently deletes one keypool (SSID). Served by the same function as configureKeypool, with the delete flag forced on — anything that operation supports is still reachable here.
Who may call it: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator. AccountManager/CustomerSupport/venue roles are not accepted.
What the delete does NOT do: it does not remove the keypool id from any venue's KeyPoolID set, and does not re-home or delete the PSKs/subscriptions that referenced it — nothing blocks deleting a keypool that's still attached to a venue.
connectVenueID/disconnectVenueID/DisplayOrder are still processed first, in that order, exactly as on configureKeypool. Sending only AccessToken and KeyPoolID performs a clean delete.
Rejections don't all use an error status: a venue-level refusal returns 200 with errorProcessing: true and skips the delete. An out-of-range DisplayOrder returns 401 while errorProcessing stays false — and does NOT stop the delete from happening.
AccessToken and KeyPoolID are required. OperatorID is required for a NetworkSoftwareProvider caller only. The remaining fields are inherited from the shared configure path and are still processed, before the delete.
| AccessToken required | string Cognito access-token JWT. May also be sent as |
| IdToken | string Cognito id token. When present it is verified instead of the access token and the caller's username is taken from it. |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It becomes the target operator and is then DELETED from the forwarded request. Ignored for a DomainAdministrator caller, whose operator comes from the request Origin. Format is {Country}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| KeyPoolID required | string The keypool to delete. Mandatory: absent, empty, unknown, or owned by another operator is rejected 401 with 'Invalid keypool' plus a space plus the value as sent. Format is {OperatorID}._V3SSID.{SSID}.{scope}, where scope is 'global' or a generated local-scope token. |
| connectVenueID | string Connect this venue to the keypool. The venue must exist and belong to the same operator ('Venue to connect not found. ' otherwise) and must not already be connected ('Venue is already connected to keypool. '). Both of those come back as HTTP 200 with errorProcessing true. Takes precedence over disconnectVenueID, which is then ignored entirely. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| disconnectVenueID | string Disconnect this venue from the keypool. The venue must exist and belong to the same operator ('Venue to disconnect not found. ') and must currently be connected ('Venue is already disconnected from keypool. '); both come back as HTTP 200 with errorProcessing true. Examined ONLY when connectVenueID is empty or absent. Same format as connectVenueID. |
integer or string Sort position for the operator console. The value is run through an integer parse: a value that parses to an integer is used as that integer (so '7' and '7abc' both mean 7), and any OTHER truthy value - a non-numeric string, true, an object - is silently REWRITTEN TO 50 and stored as 50. An empty string, null, false and 0-as-a-string-that-parses are handled by the parse rule instead. The accepted range is 1 to 99 inclusive: 0 and anything from 100 up are refused with 'DisplayOrder should be between 1-100.' at HTTP 401 while errorProcessing stays false and the rest of the call proceeds. The write happens only when the effective value differs from the stored one, or the keypool has none. | |
| deleteKeyPoolPermanently | boolean Not required on this path and not read from the request: reaching this resource sets it to true regardless of what the body contains. Sending false does NOT prevent the delete. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "KeyPoolID": "OPERATORID._V3SSID.GuestWiFi.global",
- "connectVenueID": "string",
- "disconnectVenueID": "string",
- "DisplayOrder": 50,
- "deleteKeyPoolPermanently": true
}{- "message": "Connected keypool to venue <VenueID>. ",
- "errorProcessing": false
}Comprehensive support ticket system with ConnectWise PSA integration for venue management and subscriber assistance.
Reads support tickets from the operator's ConnectWise PSA instance. ConnectWise credentials are held per venue; each mode requires exactly one qualifying venue, but computed over a different candidate set.
Two modes: TicketID fetches a single ConnectWise ticket (falls through to VAULTID mode if the caller's venues don't resolve to exactly one). VAULTID (an array of Vault VenueIDs) resolves the named venues to ConnectWise companies and searches tickets across them.
⚠ Response shape defect: a successful response is a two-element JSON ARRAY, not an object — element 0 is the endpoint's internal request-context object (which carries the operator's Stripe/Cognito secrets), element 1 is the tickets. message/errorProcessing never appear on success because JSON.stringify drops non-index array properties.
| AccessToken required | string Cognito JWT access token of the calling console user. Required in the body - this endpoint does not read an Authorization header. |
| TicketID | string ConnectWise ticket identifier, concatenated straight into the path 'service/tickets/ |
| VAULTID | Array of strings VAULT VenueIDs to search tickets for. Must be a JSON array: it is iterated by integer index. Each id is fetched individually and kept only if it belongs to the caller's operator, carries all four ConnectWise attributes and has a falsy GlobalPool; exactly one venue must qualify or nothing is queried. The ids are turned into a ConnectWise company/configurations filter type/name='VAULT-UI' and name=' VenueID format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID} (example). |
| showClosed | boolean Default: false Controls the closed-ticket exclusion. The clause " and closedflag=false and status/name not contains 'Resolved'" is appended UNLESS showClosed is truthy AND loosely equal to true (loose ==). Absent, false, 0, '' and null all keep the exclusion; note that a truthy-but-not-==true value such as 'yes' also keeps it. |
| emailAddress | Array of strings Contact e-mail addresses to restrict the ticket search to; appended as "contactEmailAddress=' |
| StartDateTimeUTC.ISO8601 | string Deprecated IGNORED. unconditionally OVERWRITES this property with '[' + (request time minus 90 days).toISOString + ']' before it is read, so a caller-supplied value has no effect. The 90-day lookback is fixed. |
| EndDateTimeUTC.ISO8601 | string Deprecated IGNORED. unconditionally OVERWRITES this property with '[' + (request time plus 1 day).toISOString + ']' before it is read. The window end is fixed at tomorrow. |
{- "AccessToken": "<Cognito JWT access token>",
- "VAULTID": [
- "pmg123._V3VENUE_.USA.IL.60601.DOWNTOWN.CHICAGO"
], - "showClosed": false
}[- {
- "OperatorID": "<operator id>",
- "Domain": "<operator domain>",
- "CognitoPool": "<cognito user pool id>",
- "AccessToken": {
- "SubscriberToken": "<subscriber token>"
}
}, - {
- "12345": {
- "id": 12345,
- "summary": "<ConnectWise ticket summary>"
}
}
]Returns ConnectWise PSA support tickets for the venues where the calling subscriber currently has an active subscription. Scope is always the caller's own active subscriptions — no role, VenueID or subscriber identifier from the request is used for scoping.
Exactly one qualifying venue is required — a venue with a complete ConnectWise configuration, belonging to the same operator, not a global-pool venue. Zero or multiple qualifying venues return an empty result with 200, no ConnectWise call made.
The search window and contact address are NOT caller-controlled — always "now-90d to now+1d" and the caller's own account email.
⚠ This operation returns a JSON ARRAY, not an object. Index 0 is internal (not part of the contract), index 1 is the ticket payload — a two-element array on success, one element (with no message/errorProcessing at all) on a ticket-logic rejection. Pre-ticket-logic rejections (bad token, malformed body) return a normal object instead.
| AccessToken required | string Cognito access token of the calling subscriber, in the request BODY (this operation does not read an Authorization header). The user pool is resolved from the request Origin, so the token must have been issued by that operator's pool. A missing token is refused with 401 whenever the operator has a Cognito pool configured. |
| TicketID | string Optional ConnectWise ticket id. Switches to single-ticket mode: the ticket is fetched directly and no search is run. It is appended to the ConnectWise request path verbatim and is NOT checked against the caller's own tickets - the ticket record is returned whoever raised it, as long as it lives in the one qualifying venue's ConnectWise instance. Only the ticket's notes are gated, and only on the ticket's contact email matching the caller's account email. |
| showClosed | boolean Optional, search mode only. Compared with a loose equality against true, so the boolean true qualifies (as would the number 1 or the string "1"); the string "true" does NOT. When it does not qualify - including when it is omitted, false, or 0 - the search is narrowed to tickets that are not closed and whose status does not contain 'Resolved'. |
| property name* additional property | any |
{- "AccessToken": "<cognito access token>",
- "showClosed": false
}[- {
- "note": "internal request-context object - not part of the API contract"
}, - {
- "TicketCount": 1,
- "Tickets": {
- "1001": {
- "id": 1001,
- "summary": "No internet in unit",
- "status": "New",
- "UnitID_support": "<site name>",
- "contactName": "<contact>",
- "dateEntered": "2026-08-01T12:00:00Z",
- "lastUpdated": "2026-08-02T09:15:00Z",
- "siteID": 42,
- "VLAN": "",
- "Purpose": "",
- "UnitID": "",
- "Floor": "",
- "Building": "",
- "VAULT_ID": ""
}
}
}
]Raises a support ticket on the ConnectWise PSA instance configured for the caller's venue, and attaches the issue text as a note.
Always scoped to the caller's own subscription — matched by the authenticated account's email against active, set-up, non-ended subscriptions at the given VenueID. contactEmailAddress/EmailAddress only set the ticket's contact info, never used to find the subscription. Exactly one matching subscription must exist.
VenueID is required — VAULTID is accepted as an alias but only VenueID is actually used for the lookup, so sending VAULTID alone will not find a subscription.
Silent no-op: if the venue lacks a complete ConnectWise configuration, or any ConnectWise call fails, no ticket is created and the call still succeeds with an empty result.
⚠ This operation returns a JSON ARRAY, not an object. On success: index 0 is an internal object not part of the contract, index 1 is the created ticket (or {} if none was created). A validation rejection returns a ONE-element array with no message/errorProcessing at all — branch on the HTTP status code, not the body, for those. Earlier rejections (bad token, malformed body) return a normal object instead.
| Origin required | string Must be the console origin of the operator the subscriber belongs to. Absent, or not resolvable to exactly one known operator domain, is refused with 401 'Forbidden. '. |
| Partner-Integration-Channel | string Marks the call as machine-to-machine API access. It does not change any check this operation performs. |
| AccessToken required | string Cognito access token for the signed-in subscriber. Required; the request is refused without it whenever the operator has console sign-on configured. |
| contactName required | string Required. Recorded as the ticket contact and as the author of the note. Refused if absent or empty, and refused if it contains anything that looks like an HTML tag or an HTML entity. Otherwise trimmed and truncated to 40 characters. |
| contactEmailAddress | string <email> Contact e-mail recorded on the ticket. Either this or EmailAddress must be present; when both are, this one wins and replaces EmailAddress. Must be a valid e-mail address. Not used to select the subscription. |
| EmailAddress | string <email> Alternative to contactEmailAddress, used only when that field is absent. Must be a valid e-mail address. Lower-cased before use. Not used to select the subscription - the subscription is always found through the authenticated account. |
| summary required | string Required. One-line ticket subject. HTML-escaped, then trimmed and truncated to 100 characters. Also used as the note text when Description is absent. |
| VenueID | string The venue the subscription is. Required in practice: it is the only field the subscription lookup reads. Format: {pmgId}.V3VENUE.{Country}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| VAULTID | string The venue key used to read the venue's ConnectWise configuration and to select its VAULT-UI company configurations. Defaults to VenueID when omitted. Supplying VAULTID without VenueID satisfies the presence check but leaves the subscription lookup with nothing to query, so the request is then always refused. |
| unitID | string Optional. When present the subscription must be the one for exactly this unit, and the same value is used as the ConnectWise UNIT configuration id whose name is recorded on the ticket. When absent, the subscriber must have exactly one qualifying unit at the venue. |
| VAULTUnitID | string Optional, used only when unitID is absent. Matched case-insensitively against the answers of the ConnectWise UNIT configurations' questions whose text contains 'VAULT'; a match records that configuration's name and site on the ticket. No effect on which subscription is selected. |
| CustomUnit | string Optional free-text unit label. Used only on the unitID branch, and only when ConnectWise returns no UNIT configuration for that id. |
| Description | string Optional. The body of the note attached to the ticket. Falls back to summary when absent. Not escaped or truncated. |
| PrefContactMethod | string Optional. When present it is placed on its own line above the note text. |
| TicketType | string Optional ConnectWise ticket type name. |
| TicketSubType | string Optional ConnectWise ticket sub-type name. Only applied when TicketType is also supplied. |
| contactPhoneNumber | string Optional. Recorded on the ticket as the contact phone number, verbatim. |
| serviceboardid | string Optional ConnectWise service board id. Consulted only when the venue's own configured board id is present but is not a positive number. The string 'undefined' is ignored. |
{- "AccessToken": "<Cognito access token>",
- "contactName": "<contact name>",
- "contactEmailAddress": "subscriber@example.com",
- "summary": "<short description of the issue>",
- "VenueID": "<pmgId>._V3VENUE_.<Country>.<State>.<PostalCode_ID>.<VenueName_ID>.<City_ID>",
- "Description": "<full description of the issue>"
}[- {
- "<internal request context - not part of the API contract>": "..."
}, - {
- "id": 12345,
- "summary": "<short description of the issue>"
}
]Staff member management system for venue administrators, support personnel, and operational staff with role-based access control.
Grant one staff member one administrative role, either operator-wide or at a single venue. The /venues/ and /staff/ paths behave identically — the Role value decides scope, not the path.
A staff member may hold exactly ONE role (across venues too) — a conflicting existing role is 409. SIEMAdministrators is exempt (a notification list, not a role).
Who may grant what:
OperatorID) or a DomainAdministrator: any role.AccountManager/CustomerSupport: venue roles only (an AccountManager may also grant CustomerSupport).VenueAdministrator of the named venue: LeasingAgent only.The access token must be in the body — no Authorization header support. If the staff member has no account yet, one is created and a temporary password emailed.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. On this endpoint it affects only the 'AccessToken Missing. ' rejection; every other message here is a hardcoded English literal. |
JSON body.
| AccessToken required | string Cognito access-token JWT. MUST be in the body - this endpoint never reads the Authorization header. Absent gives 401 'AccessToken Missing. '. It is only verified when the resolved operator has a Cognito pool. |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it is deleted from the body once consumed. Ignored for every other caller. |
| EmailAddress required | string <email> Identifies the staff member. ANY ONE of EmailAddress / SubscriberToken / PhoneNumber / 'PhoneNumber.E164' satisfies the presence check; when EmailAddress IS supplied it must pass e-mail validation and is then trimmed and lower-cased. A grant ultimately REQUIRES an email: a person resolved without one is refused. |
| SubscriberToken | string Identifies an existing staff member. |
| PhoneNumber | string Identifies the staff member; copied to the 'PhoneNumber.E164' key the resolver actually reads when that key is absent. |
| PhoneNumber.E164 | string E.164 form, read directly by the subscriber resolver. |
| Role required | string Role to grant. Matching is CASE-INSENSITIVE - every comparison lower-cases the trimmed value. Operator-level values: domainadministrator, siemadministrator, accountmanager, customersupport. Venue-level values (these require VenueID): venueadministrator, leasingagent. No enum is declared because the accepted set is not a fixed list of literals - any casing of the names above is valid. Missing gives 401 'Role Missing. '; unrecognised gives 401 'Invalid Role. ' from a NetworkSoftwareProvider or DomainAdministrator caller, and 401 'Access Denied. ' from an AccountManager, CustomerSupport or VenueAdministrator caller, whose branch accepts venue-level roles only. |
| VenueID | string Required when Role is venueadministrator or leasingagent (401 'VenueID missing from request. ' otherwise). Deleted and ignored when an operator-level role is granted. The venue must belong to the caller's operator and must not be a GlobalPool (roaming) venue, else 403. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| GivenName | string Used when the staff member has no account yet. Disallowed characters are stripped and the stripped value is what is stored - an altered name is NOT refused. Only a value that the stripping empties completely is refused. |
| FamilyName | string Used when the staff member has no account yet; same rule. |
| locale | string Notification locale for a newly created account. 'en-us' and 'es-xl' are the recognised values; any other value is silently coerced to 'en-us' rather than refused, and 'en-us' is also used when the field is omitted. |
| Domain | string Legacy field; it is NOT used to select the operator. Sending a non-empty Domain adds three requirements to an operator-level grant: EmailAddress, GivenName and FamilyName all become mandatory, and their absence is refused 401 'Invalid EmailAddress. ', 'GivenName Missing. ' or 'FamilyName Missing. ' respectively. Omit it unless you intend those extra requirements. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "EmailAddress": "subscriber@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "Role": "leasingagent",
- "VenueID": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "string",
- "Domain": "string"
}{- "SubscriberToken": "string",
- "Username": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "string",
- "PhoneNumber.E164": "string",
- "phone_number_verified": true,
- "email_verified": true,
- "Status": "string",
- "Enabled": true,
- "externalSubscriberID": "string",
- "SubscriberManagedviaSSO": true,
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "errorProcessing": false
}Revoke a staff member's administrative role(s). Nothing is deleted from Cognito — only the identifier is removed from the operator's or venue's role list(s); the staff member keeps their sign-in.
Which store runs depends on VenueID/Role: venue-scoped roles go through the venue store, operator-scoped through the operator store. Omitting both Role and VenueID sweeps every venue and every operator-level group.
Who may revoke what: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator may revoke any role. An AccountManager or CustomerSupport member is confined to venue roles (an AccountManager may also revoke CustomerSupport). A VenueAdministrator may revoke only LeasingAgent at their own venue. Everyone else is refused.
Despite the /venues/ path segment, VenueID is NOT required — omitting it revokes across every venue of the operator.
JSON body. Four request-envelope failures - a missing Host header, a missing Origin header, a body that is not valid JSON, and an unexpected Host - do not report their own message on this route: each comes back 401 'Internal server error' - see the 401 description.
| AccessToken | string Cognito access-token JWT. May be sent in the body or as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| OperatorID | string Target operator. REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise) and deleted from the body once accepted. Ignored for every other caller - the operator is resolved from the request Origin. Built as {Country.ISO3166A3}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| EmailAddress required | string <email> Identifies the staff member. Lower-cased by the shared request sanitiser before use. |
| SubscriberToken | string Identifies the staff member. This is the value actually stored in the role arrays. |
| PhoneNumber | string Identifies the staff member. Copied to 'PhoneNumber.E164' when that key is absent, because the subscriber resolver reads the dotted key. |
| PhoneNumber.E164 | string Identifies the staff member, in E.164 form. |
| externalSubscriberID | string Read by the subscriber resolver, but NOT accepted on its own: the identifier gate in both stores does not list it, so a request carrying only this is rejected 400. |
| Role | string OPTIONAL. Operator-scoped values: DomainAdministrator, SIEMAdministrator, AccountManager, CustomerSupport (the stored plurals DomainAdministrators, SIEMAdministrators and AccountManagers are accepted too, but ONLY in exactly that spelling - they are matched case-sensitively and with no trimming, so 'accountmanagers' or ' AccountManagers ' is rejected 400 'Invalid Role. '). Venue-scoped values: VenueAdministrator, LeasingAgent (or VenueAdministrators, LeasingAgents). Matching of the singular values, and of the two venue plurals, is case-insensitive and surrounding whitespace is trimmed. Omit it to revoke EVERY group in scope - but a caller who is only a VenueAdministrator may not do that: for that caller both an omitted Role and Role='VenueAdministrator' are refused 401 'Access Denied. ', since LeasingAgent is the only role they may revoke. A value that is not one of the target store's groups is rejected 400 'Invalid Role. ' - the venue store rejects an operator-level Role and vice versa. |
| VenueID | string OPTIONAL. Scopes a venue-role revoke to one venue; omit it to revoke that role at EVERY venue of the operator. It is NOT required on this path even though the path is namespaced under /venues - the endpoint does not look at which of the two mounted paths was called. The endpoint drops it when the Role is operator-level. A VenueAdministrator caller MUST supply it - it is what authorises them. Ownership is asserted by the venue store, which answers 403 'Invalid VenueID. ' when the venue does not exist or belongs to another operator. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "EmailAddress": "subscriber@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "Role": "string",
- "VenueID": "string"
}{- "message": "Operation complete. ",
- "errorProcessing": false,
- "statusCode": 200
}Revoke a staff member's administrative role(s). Nothing is deleted from Cognito — only the identifier is removed from the operator's or venue's role list(s); the staff member keeps their sign-in.
Which store runs depends on VenueID/Role: venue-scoped roles go through the venue store, operator-scoped through the operator store. Omitting both Role and VenueID sweeps every venue and every operator-level group.
Who may revoke what: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator may revoke any role. An AccountManager or CustomerSupport member is confined to venue roles (an AccountManager may also revoke CustomerSupport). A VenueAdministrator may revoke only LeasingAgent at their own venue. Everyone else is refused.
The same operation is also exposed at /venues/disableStaffAccess.
JSON body. Four request-envelope failures - a missing Host header, a missing Origin header, a body that is not valid JSON, and an unexpected Host - do not report their own message on this route: each comes back 401 'Internal server error' - see the 401 description.
| AccessToken | string Cognito access-token JWT. May be sent in the body or as |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token, and checked against the global sign-out marker. |
| OperatorID | string Target operator. REQUIRED for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise) and deleted from the body once accepted. Ignored for every other caller - the operator is resolved from the request Origin. Built as {Country.ISO3166A3}.{State}.{PostalCode_ID}.{OperatorName_ID}.{City_ID}. |
| EmailAddress required | string <email> Identifies the staff member. Lower-cased by the shared request sanitiser before use. |
| SubscriberToken | string Identifies the staff member. This is the value actually stored in the role arrays. |
| PhoneNumber | string Identifies the staff member. Copied to 'PhoneNumber.E164' when that key is absent, because the subscriber resolver reads the dotted key. |
| PhoneNumber.E164 | string Identifies the staff member, in E.164 form. |
| externalSubscriberID | string Read by the subscriber resolver, but NOT accepted on its own: the identifier gate in both stores does not list it, so a request carrying only this is rejected 400. |
| Role | string OPTIONAL. Operator-scoped values: DomainAdministrator, SIEMAdministrator, AccountManager, CustomerSupport (the stored plurals DomainAdministrators, SIEMAdministrators and AccountManagers are accepted too, but ONLY in exactly that spelling - they are matched case-sensitively and with no trimming, so 'accountmanagers' or ' AccountManagers ' is rejected 400 'Invalid Role. '). Venue-scoped values: VenueAdministrator, LeasingAgent (or VenueAdministrators, LeasingAgents). Matching of the singular values, and of the two venue plurals, is case-insensitive and surrounding whitespace is trimmed. Omit it to revoke EVERY group in scope - but a caller who is only a VenueAdministrator may not do that: for that caller both an omitted Role and Role='VenueAdministrator' are refused 401 'Access Denied. ', since LeasingAgent is the only role they may revoke. A value that is not one of the target store's groups is rejected 400 'Invalid Role. ' - the venue store rejects an operator-level Role and vice versa. |
| VenueID | string OPTIONAL. Scopes a venue-role revoke to one venue; omit it to revoke that role at EVERY venue of the operator. The endpoint drops it when the Role is operator-level. A VenueAdministrator caller MUST supply it - it is what authorises them. Ownership is asserted by the venue store, which answers 403 'Invalid VenueID. ' when the venue does not exist or belongs to another operator. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "EmailAddress": "subscriber@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "Role": "string",
- "VenueID": "string"
}{- "message": "Operation complete. ",
- "errorProcessing": false,
- "statusCode": 200
}Grant one staff member one administrative role, either operator-wide or at a single venue. The /venues/ and /staff/ paths behave identically — the Role value decides scope, not the path.
A staff member may hold exactly ONE role (across venues too) — a conflicting existing role is 409. SIEMAdministrators is exempt (a notification list, not a role).
Who may grant what:
OperatorID) or a DomainAdministrator: any role.AccountManager/CustomerSupport: venue roles only (an AccountManager may also grant CustomerSupport).VenueAdministrator of the named venue: LeasingAgent only.The access token must be in the body — no Authorization header support. If the staff member has no account yet, one is created and a temporary password emailed.
| Origin required | string Required. The console origin, e.g. https:// |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish (Latin America) catalogue, anything else US English. On this endpoint it affects only the 'AccessToken Missing. ' rejection; every other message here is a hardcoded English literal. |
JSON body.
| AccessToken required | string Cognito access-token JWT. MUST be in the body - this endpoint never reads the Authorization header. Absent gives 401 'AccessToken Missing. '. It is only verified when the resolved operator has a Cognito pool. |
| IdToken | string Cognito id token; read by the shared token verifier alongside the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it is deleted from the body once consumed. Ignored for every other caller. |
| EmailAddress required | string <email> Identifies the staff member. ANY ONE of EmailAddress / SubscriberToken / PhoneNumber / 'PhoneNumber.E164' satisfies the presence check; when EmailAddress IS supplied it must pass e-mail validation and is then trimmed and lower-cased. A grant ultimately REQUIRES an email: a person resolved without one is refused. |
| SubscriberToken | string Identifies an existing staff member. |
| PhoneNumber | string Identifies the staff member; copied to the 'PhoneNumber.E164' key the resolver actually reads when that key is absent. |
| PhoneNumber.E164 | string E.164 form, read directly by the subscriber resolver. |
| Role required | string Role to grant. Matching is CASE-INSENSITIVE - every comparison lower-cases the trimmed value. Operator-level values: domainadministrator, siemadministrator, accountmanager, customersupport. Venue-level values (these require VenueID): venueadministrator, leasingagent. No enum is declared because the accepted set is not a fixed list of literals - any casing of the names above is valid. Missing gives 401 'Role Missing. '; unrecognised gives 401 'Invalid Role. ' from a NetworkSoftwareProvider or DomainAdministrator caller, and 401 'Access Denied. ' from an AccountManager, CustomerSupport or VenueAdministrator caller, whose branch accepts venue-level roles only. |
| VenueID | string Required when Role is venueadministrator or leasingagent (401 'VenueID missing from request. ' otherwise). Deleted and ignored when an operator-level role is granted. The venue must belong to the caller's operator and must not be a GlobalPool (roaming) venue, else 403. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| GivenName | string Used when the staff member has no account yet. Disallowed characters are stripped and the stripped value is what is stored - an altered name is NOT refused. Only a value that the stripping empties completely is refused. |
| FamilyName | string Used when the staff member has no account yet; same rule. |
| locale | string Notification locale for a newly created account. 'en-us' and 'es-xl' are the recognised values; any other value is silently coerced to 'en-us' rather than refused, and 'en-us' is also used when the field is omitted. |
| Domain | string Legacy field; it is NOT used to select the operator. Sending a non-empty Domain adds three requirements to an operator-level grant: EmailAddress, GivenName and FamilyName all become mandatory, and their absence is refused 401 'Invalid EmailAddress. ', 'GivenName Missing. ' or 'FamilyName Missing. ' respectively. Omit it unless you intend those extra requirements. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "EmailAddress": "subscriber@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "Role": "leasingagent",
- "VenueID": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "string",
- "Domain": "string"
}{- "SubscriberToken": "string",
- "Username": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "string",
- "PhoneNumber.E164": "string",
- "phone_number_verified": true,
- "email_verified": true,
- "Status": "string",
- "Enabled": true,
- "externalSubscriberID": "string",
- "SubscriberManagedviaSSO": true,
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "errorProcessing": false
}Revoke a staff member's administrative role(s). Nothing is deleted from Cognito — only the identifier is removed from the operator's or venue's role list(s); the staff member keeps their sign-in.
Which store runs depends on VenueID/Role: venue-scoped roles go through the venue store, operator-scoped through the operator store. Omitting both Role and VenueID sweeps every venue and every operator-level group.
Who may revoke what: a NetworkSoftwareProvider (must send OperatorID) or a DomainAdministrator may revoke any role. An AccountManager or CustomerSupport member is confined to venue roles (an AccountManager may also revoke CustomerSupport). A VenueAdministrator may revoke only LeasingAgent at their own venue. Everyone else is refused.
| AccessToken | string Cognito JWT. May be sent in the body or as |
| OperatorID | string Target operator. REQUIRED for a NetworkSoftwareProvider caller and deleted from the body once accepted. Ignored otherwise - the operator comes from the request Origin. |
| EmailAddress required | string <email> Identifies the staff member. Lower-cased by request validation before use. |
| SubscriberToken | string Identifies the staff member. |
| PhoneNumber | string Identifies the staff member. Copied to |
| PhoneNumber.E164 | string Identifies the staff member, in E.164 form. |
| externalSubscriberID | string Read by |
| Role | string OPTIONAL. Operator-scoped: Venue-scoped: |
| VenueID | string OPTIONAL. Scopes a venue-role revoke to one venue; omit it to revoke at EVERY venue of the operator. Format is the venue id |
{- "AccessToken": "string",
- "OperatorID": "string",
- "EmailAddress": "user@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "externalSubscriberID": "string",
- "Role": "string",
- "VenueID": "string"
}{- "message": "Operation complete. ",
- "errorProcessing": false,
- "statusCode": 200
}Grant one staff member one administrative role, either operator-wide or at a single venue. The /venues/ and /staff/ paths behave identically — the Role value decides scope, not the path.
A staff member may hold exactly ONE role (across venues too) — a conflicting existing role is 409. SIEMAdministrators is exempt (a notification list, not a role).
Who may grant what:
OperatorID) or a DomainAdministrator: any role.AccountManager/CustomerSupport: venue roles only (an AccountManager may also grant CustomerSupport).VenueAdministrator of the named venue: LeasingAgent only.The access token must be in the body — no Authorization header support. If the staff member has no account yet, one is created and a temporary password emailed.
JSON body. Note the endpoint's initial context object has no response member, so a request that fails request validation's Host/Origin/JSON gates throws inside that helper and is caught by the endpoint - see the 401 description.
| AccessToken required | string Cognito access-token JWT. MUST be in the body - this endpoint never reads the Authorization header. Absent -> 401 'AccessToken Missing. '. |
| IdToken | string Cognito id token; honoured by validateAccessToken when supplied alongside AccessToken. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 'OperatorID Missing. ' otherwise); it is deleted from the body once consumed. Ignored for every other caller. |
| EmailAddress required | string <email> Identifies the staff member. ANY ONE of EmailAddress / SubscriberToken / PhoneNumber / 'PhoneNumber.E164' satisfies the presence check; when EmailAddress IS supplied it must be an email address and is trimmed and lower-cased. A grant ultimately REQUIRES an email: if the resolved subscriber has none the request is refused. |
| SubscriberToken | string Identifies an existing staff member. See the note about the operator-level path below - a SubscriberToken-identified grant of an OPERATOR role currently fails. |
| PhoneNumber | string Identifies the staff member; copied to the 'PhoneNumber.E164' key the resolver actually reads when that key is absent. |
| PhoneNumber.E164 | string E.164 form read directly by the subscriber resolver. |
| Role required | string Role to grant. Matching is CASE-INSENSITIVE: every comparison in the chain lower-cases the trimmed value. Operator-level values: domainadministrator, siemadministrator, accountmanager, customersupport. Venue-level values (these require VenueID): venueadministrator, leasingagent. No enum is declared because the accepted set is not a fixed list of literals - any casing of the names above is valid. Missing -> 401 'Role Missing. '; unrecognised -> 401 'Invalid Role. '. |
| VenueID | string Required when Role is venueadministrator or leasingagent (401 'VenueID missing from request. ' otherwise). Deleted and ignored when an operator-level role is granted. The venue must belong to the caller's operator and must not be the GlobalPool venue, else 403. Format is {PropertyManagementGroupID}.V3VENUE.{Country.ISO3166A3}.{State}.{PostalCode_ID}.{VenueName_ID}.{City_ID}. |
| GivenName | string Used when the staff member has no account yet; sanitised by sanitizeUtils.name, and a value the API empties is a 401 'GivenName validation failed'. |
| FamilyName | string Used when the staff member has no account yet; same rule, 401 'FamilyName validation failed'. |
| locale | string Enum: "en-us" "es-xl" Notification locale for the new account; defaults to 'en-us'. |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "EmailAddress": "user@example.com",
- "SubscriberToken": "string",
- "PhoneNumber": "string",
- "PhoneNumber.E164": "string",
- "Role": "leasingagent",
- "VenueID": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "en-us"
}{- "SubscriberToken": "string",
- "Username": "string",
- "EmailAddress": "string",
- "GivenName": "string",
- "FamilyName": "string",
- "locale": "string",
- "Status": "string",
- "externalSubscriberID": "string",
- "contactpref_sms": true,
- "contactpref_email": true,
- "dateAddedUTC.ISO8601": "string",
- "dateClosedUTC.ISO8601": "string",
- "StripeCustomerID": "string",
- "errorProcessing": false
}Network equipment management and monitoring for network operators to oversee infrastructure, performance, and maintenance operations.
Live up/down status for a venue's customer-premises equipment, assembled at request time from ConnectWise (site/unit structure) and PRTG (sensor status) — Vault stores none of this. A venue with no ConnectWise integration cannot be served.
The access token must be sent as the AccessToken parameter — no Authorization header support.
Who may call it: a NetworkSoftwareProvider (must send OperatorID), a NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or a Venue admin/leasing agent for the requested VenueID.
Only four equipment classes are reported as controllers, each with specific children: Wireless Controller → Access Point, CMTS → Cable Modem, OLT → ONT, G.hn Headend → G.hn Modem. Equipment behind a firewall, switch or router is never reported.
A ConnectWise or PRTG call that fails is silently swallowed — a partial outage shows up as missing equipment, not an error.
| AccessToken required | string Cognito JWT. Marked required because this operation, unlike its siblings, has NO Authorization-header path - the token is read from the merged request only, and its absence is 401 'AccessToken Missing. '. It is only cryptographically verified when the Origin-resolved operator has a Cognito pool configured. |
| IdToken | string Optional Cognito ID token, read only by the shared token validation and only when the access token's username was not already cached; in that case the ID token is the one verified and the username comes from its |
| OperatorID | string Target operator. Read ONLY on the NetworkSoftwareProvider branch, where it is mandatory (401 'OperatorID Missing. ' otherwise) and is deleted from the request once copied into the operator context. Ignored for every other role, whose operator comes from the request Origin. |
| VenueID required | string The venue to report on, and the value matched by the Venue-role check. Its absence is reported with |
| SummaryOnly | string Suppresses the per-device list, leaving only the UP/DOWN counts. TRUTHINESS TRAP: the endpoint only tests whether the value is truthy, and every query-string value is a STRING - so |
| UnitID | string Restricts the report to the CPE mapped to ONE ConnectWise unit, compared with loose equality against the id of the site's UNIT-type configuration. Presence alone activates the filter (any non-empty value counts), and activating it also restricts the UP/DOWN counts to the matched equipment. |
| SiteID | string Restricts the report to one ConnectWise site, compared with loose equality against the site id. The three filter tests are per-site else-ifs evaluated for every candidate site, not a request-level precedence: when |
| VAULTUnitID | string Restricts the report to the site whose UNIT configuration answers a question whose text contains 'VAULT' with this value, compared case-insensitively (both sides upper-cased). It is evaluated for every candidate site that matched neither the |
| Accept-Language | string Only the first tag's leading two characters are inspected: 'es' selects the Spanish message catalogue, anything else (and an absent header) selects English. |
{- "Summary": {
- "UP": 0,
- "DOWN": 0
}, - "Devices": [
- {
- "UNIT": { },
- "ObjID": null,
- "DeviceName": "string",
- "DeviceType": "Access Point",
- "Status": "string",
- "LastUp": "string",
- "VAULTID": "string"
}
], - "EquipmentCount": 0,
- "message": "",
- "errorProcessing": false
}One venue's RSSI (signal strength) histogram for a single report day — how many RADIUS-accounted connections were recorded at each RSSI value. Read from a cache written by RADIUS session accounting (8-day TTL); a report date older than about a week returns an all-zero distribution rather than an error.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
A VenueID that doesn't match one of the operator's cached venues returns HTTP 200 with errorProcessing: true — not a 4xx.
AccessToken is body-only — this endpoint never reads an Authorization: Bearer header.
On success, RSSIDistribution is back-filled with a zero-connection entry for every RSSI value 1–127 the cache didn't supply, so a response always carries at least 127 entries even on a day with no data.
GET merges query-string parameters into the same request; its response also carries Cache-Control: private, max-age=5.
| AccessToken required | string Cognito access-token JWT. Verified only when non-empty; if omitted no role can resolve and the request is rejected with 401 |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue whose RSSI histogram is returned; must appear in the operator's cached venue list. Format is |
| UsageReportStartDateUTC.ISO8601 | string Report day, parsed with |
{- "AccessToken": "string",
- "IdToken": "string",
- "OperatorID": "string",
- "VenueID": "string",
- "UsageReportStartDateUTC.ISO8601": "string"
}{- "UsageReportStartDateUTC": "2019-08-24T14:15:22Z",
- "RSSIDistribution": [
- {
- "rssi": 0,
- "connections": 0
}
], - "message": "string",
- "errorProcessing": false
}One venue's RSSI (signal strength) histogram for a single report day — how many RADIUS-accounted connections were recorded at each RSSI value. Read from a cache written by RADIUS session accounting (8-day TTL); a report date older than about a week returns an all-zero distribution rather than an error.
Roles: NetworkSoftwareProvider (must send OperatorID), NetworkOperator (DomainAdministrator, AccountManager or CustomerSupport), or Venue admin/leasing agent for the requested VenueID. No anonymous fallthrough.
A VenueID that doesn't match one of the operator's cached venues returns HTTP 200 with errorProcessing: true — not a 4xx.
AccessToken is body-only — this endpoint never reads an Authorization: Bearer header.
On success, RSSIDistribution is back-filled with a zero-connection entry for every RSSI value 1–127 the cache didn't supply, so a response always carries at least 127 entries even on a day with no data.
GET merges query-string parameters into the same request; its response also carries Cache-Control: private, max-age=5.
| AccessToken required | string Cognito access-token JWT. Verified only when non-empty; if omitted no role can resolve and the request is rejected with 401 |
| IdToken | string Cognito id token. Read only by the shared token validator, which runs only when an access token is also supplied; when present the id token is verified instead of the access token. |
| OperatorID | string Target operator. Required ONLY for a NetworkSoftwareProvider caller (401 when absent); for every other caller the operator comes from the request Origin and this field is ignored. |
| VenueID required | string Venue whose RSSI histogram is returned; must appear in the operator's cached venue list. Format is |
| UsageReportStartDateUTC.ISO8601 | string Report day, parsed with |
{- "UsageReportStartDateUTC": "2019-08-24T14:15:22Z",
- "RSSIDistribution": [
- {
- "rssi": 0,
- "connections": 0
}
], - "message": "string",
- "errorProcessing": false
}Returns the operator record for the origin domain, shaped by the caller's role. Same implementation as /operatorconsole/config/listOperatorDetails.
Authentication is optional — an absent token falls through to the Public role and gets the public allowlist; a present-but-invalid token IS rejected (does not fall back to Public).
Roles: NetworkSoftwareProvider (must send OperatorID — re-reads the TARGET operator, not the provider's own), NetworkOperator (DomainAdministrator/AccountManager/CustomerSupport), or Public (everyone else — including venue roles and subscribers, who get no special access here).
Response shape by role: admins get the operator record with a few fields added/removed; everyone else gets a REBUILT allowlist-only shape.
Credential visibility: raw secrets (Cognito app-client secret, RADIUS secret, Stripe keys) are visible ONLY to NetworkSoftwareProvider and DomainAdministrator — an AccountManager/CustomerSupport caller has them stripped.
Read-only.
| api-version | string Integer version selector; a missing or non-numeric value is treated as 0. Drives feature gating: 20260417 or higher adds NetworkConfiguration.StrictPSK for non-admin callers and suppresses the placeholder Notifications.Pinpoint for admins; 20261117 or higher removes the four legacy top-level role arrays. Below 20260417 (and before the 2026-11-17 sunset) the whole StrictPSK deprecation sentence is APPENDED to |
| origin required | string Selects the operator whose configuration is read. The value is normalised (a '-preview' suffix is stripped and a small set of localhost origins is remapped to fixed development domains) and then resolved to an operator by domain. Absent - and with no Stripe-Signature header - the request is rejected 401 'origin missing. '; an origin that resolves to no operator is NOT rejected here - it yields a record with no identity, which downgrades the caller to the public role and the request is served the public allowlist with 200. |
Optional. An absent body is tolerated - the request is then treated as empty - and a body that is present but not valid JSON is rejected 401, not 400.
| AccessToken | string Cognito JWT. OPTIONAL - omitting it is not an error, it resolves the caller to the Public role. An |
| OperatorID | string REQUIRED only when the caller is a NetworkSoftwareProvider; absent in that case gives 401 'OperatorID Missing. '. It selects the target operator, whose record is then read and returned in place of the origin-resolved operator's. Ignored for every other role. |
| Domain | string Read by the shared request pipeline only when the origin-resolved entity is a network software provider, and only to stage another operator record that this operation never reads. Accepted and ignored. |
{- "AccessToken": "string",
- "OperatorID": "string",
- "Domain": "string"
}{- "message": "string",
- "errorProcessing": true,
- "OperatorID": "string",
- "OperatorName": "string",
- "NetworkOperatorName": "string",
- "Domain": "string",
- "EmailDomain": "string",
- "DomainAlias": "string",
- "Country": "string",
- "Country.ISO3166A3": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "PostalCode": "string",
- "PhoneNumber": "string",
- "EmailAddress": "string",
- "LogoPNG": "string",
- "LogoPNG.URL": "string",
- "TandC": {
- "en-us": "string",
- "es-xl": "string"
}, - "DisplayOptionID": "string",
- "DisplayConfiguration": { },
- "SupportedLocales": {
- "en-us": "English (US)",
- "es-xl": "Spanish (Latin America)"
}, - "Origin": "string",
- "RequestHeaderOrigin": "string",
- "APIEndPoint": "string",
- "APIDoc": "string",
- "SignOn": {
- "Cognito": {
- "CognitoPool": "string",
- "CognitoPool_Domain": "string",
- "CognitoPool_appclientid": "string",
- "CognitoPool_appclientsecret": "string",
- "CognitoPool_IdentityProviders": {
- "SAML": {
- "okta": "string",
- "office365": "string"
}
}
}
}, - "NetworkConfiguration": {
- "CustomPSK": true,
- "StrictPSK": true,
- "Radius": {
- "RadiusServerIP": "string",
- "AuthenticationPort": 0,
- "AccountingPort": 0,
- "RadiusSecret": "string",
- "AuthCounterEnabled": true
}, - "SourceIPRangeWhiteList": [
- "string"
], - "GlobalSSID": [
- "string"
], - "RoamingSSID": [
- "string"
], - "allowOverlappingSubscriptionWiredUnit": true,
- "MinimumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessPlusLocalWiredAccess": 0,
- "MinimumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MaximumAutoGeneratedVLAN_LocalWirelessAccess": 0,
- "MinimumAutoGeneratedVLAN_GlobalWirelessRoaming": 0,
- "MaximumAutoGeneratedVLAN_GlobalWirelessRoaming": 0
}, - "PMS": {
- "RealPage": {
- "RealPageURL": "string",
- "RealPageAPIKey": "string",
- "enableRealPageSync": true
}
}, - "Roles": {
- "DomainAdministrators": [
- "string"
], - "SIEMAdministrators": [
- "string"
], - "AccountManagers": [
- "string"
], - "CustomerSupport": [
- "string"
]
}, - "DomainAdministrators": [
- "string"
], - "SIEMAdministrators": [
- "string"
], - "AccountManagers": [
- "string"
], - "CustomerSupport": [
- "string"
], - "Notifications": {
- "suppressSubscriberEmails": true,
- "sendSubscriptionAddedEmail": true,
- "sendSubscriptionEndEmail": true,
- "WelcomeEmail_countdown_hours": 0,
- "suppressSubscriberSMS": true,
- "SES": {
- "EmailFrom": "string",
- "EmailFromARN": "string",
- "DomainAliasDkimStatus": "string",
- "DkimLastKeyGenerationTimestamp": "string",
- "DkimAttributes": [
- "string"
], - "DomainAliasMailboxVerified": "string"
}, - "SNS": {
- "SMSConsolePhoneNumber": "string"
}, - "PushNotifications": {
- "PushApplicationID": "string",
- "Enable": true
}, - "Pinpoint": {
- "PinpointID": "string"
}
}, - "ShoppingCart": {
- "enableShoppingCart": true,
- "ShoppingCartShortURL": "string",
- "MaximumTrialCyclesPerSubscriber": 0,
- "MaximumFreeEnrollmentsPerSubscriber": 0,
- "Stripe": {
- "StripePublishableKey": "string",
- "StripeWebHookURL": "string",
- "Stripe_Secret_key": "string",
- "Stripe_Webhook_signingsecret": "string",
- "Stripe_allowrefund": true
}
}, - "ServicePlans": [
- { }
], - "ServicePlanConfiguration": {
- "DefaultServicePlanID_GlobalWirelessPlusLocalWiredAccess": "string",
- "DefaultServicePlanID_LocalWirelessAccess": "string",
- "DefaultServicePlanID_Roaming": "string"
}, - "Reporting": {
- "ReportingSubscriptionEnd_lookahead_hours": 0,
- "ReportingSubscriptionEnd_frequency_hours": 0
}, - "WebhookURL": "string",
- "PropertyManagementGroups": {
- "property1": {
- "dateAddedUTC.ISO8601": "string",
- "PropertyManagementGroupName": "string",
- "AddressLine1": "string",
- "AddressLine2": "string",
- "City": "string",
- "State": "string",
- "Country.ISO3166A3": "string",
- "PostalCode": "string",
- "EmailAddress": "string",
- "ManagementURL": "string",
- "PhoneNumber": "string"
}, - "property2": {
- "dateAddedUTC.ISO8601": "string",
- "PropertyManagementGroupName": "string"<