MSP
The MSP (Managed Service Provider) Public API enables resellers to manage webhooks for events occurring in the Egnyte Reseller Dashboard (MSP Portal) and also fetch data for the plans and domains as visible in the UI.
Note: This API is available only to approved MSP partners.
Base URL
https://{demo_domain}.egnyte.com/puboauth/token
Prerequisites
Before using the MSP API, ensure you have:
- Active developer account — Register for a developer account if you don't have one already
- Active Demo domain — A Not-For-Resale domain for testing
- Active user on Demo domain — A user account on your Demo domain
- Active MSP Portal user — A user on the MSP Portal with the same email address as your Demo domain user
- API Key (Client ID) — Provided during developer account registration
Developer Account Registration
If you don't have a developer account, register here. When registering, use these settings:
| Field | Value |
|---|---|
| Use the same email address registered in the reseller portal registration | |
| Type | Select "Publicly Available Application" |
| Egnyte domain you will use for testing | Your Demo domain name |
| Registered OAuth Redirect URI | https://resellers.egnyte.com/accounts/login/ |
| Web APIs | Check "Issue a new key for Egnyte Connect API"Uncheck "Issue a new key for Egnyte S&G" |
Authentication
The MSP API uses OAuth 2.0 Implicit Grant flow. This flow issues access tokens directly without requiring a client secret, making it suitable for applications that cannot securely store secrets.
Warning: Store access tokens encrypted. Never store tokens in browser localStorage or expose them in client-side code.
Implicit Grant Flow
The Implicit Grant flow consists of two steps:
Step 1: Initiate Authentication
Direct the user to the following authorization URL:
https://{demo_domain}.egnyte.com/puboauth/token?client_id={api_key}&redirect_uri=https://resellers.egnyte.com/accounts/login/&response_type=token
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
demo_domain | string | Yes | Your Demo domain name (without .egnyte.com) |
client_id | string | Yes | Your API key provided during registration |
redirect_uri | string | Yes | Must be https://resellers.egnyte.com/accounts/login/ |
response_type | string | Yes | Must be token for Implicit Grant flow |
Example Request
https://{demo_domain}.egnyte.com/puboauth/token?client_id=x2g35g8gynb5cedas649m4h4&redirect_uri=https://resellers.egnyte.com/accounts/login/&response_type=token
The user will be redirected to an authorization page where they must:
- Review the permissions your application is requesting
- Enter their login credentials
- Authorize your application to access their account
Step 2: Extract Access Token
Success Response
If the user authorizes your application, they are redirected to:
https://resellers.egnyte.com/accounts/login/#access_token={oauth_token}&token_type=bearer
Extract the access_token value from the URL fragment. This token is used for all subsequent API requests.
Example Success URL
https://resellers.egnyte.com/accounts/login/#access_token=2v8q2bc6uvxtgghwmwvnvcp4&token_type=bearer
Denial Response
If the user denies authorization, they are redirected to:
https://resellers.egnyte.com/accounts/login/#error=access_denied
Using the Access Token
Include the access token in the Authorization header of all API requests:
Authorization: Bearer {access_token}
Example
curl -i -X GET "https://{demo_domain}.egnyte.com/pubapi/v1/msp/webhooks" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Token Lifecycle
- Expiration: Bearer tokens issued by the MSP API do not expire automatically
- Invalidation: Tokens become invalid when:
- The user changes their password
- The user explicitly revokes access to your application
- An administrator revokes the user's permissions
Note: Cache and reuse access tokens rather than requesting new tokens for each API call. Treat tokens with the same security as passwords.
Handling Authentication Failures
Your application must handle 401 Unauthorized responses by re-initiating the OAuth flow to obtain a new token.
Error Codes
| Status | Error | Description | Resolution |
|---|---|---|---|
| 401 | Unauthorized | Invalid or revoked access token | Re-initiate OAuth flow to obtain a new token |
| 403 | Forbidden | When any of the pre-requisites are not met like MSP user is not active, or user on Demo domain is not active | Verify that all pre-requisites are met |
| 404 | Not Found | Webhook or resource does not exist | Verify the resource ID and ensure it hasn't been deleted |
| 429 | Rate Limited | Too many requests | Implement exponential backoff; check Retry-After header |
Webhooks
This is a set of endpoints to manage webhooks. The number of webhooks registered for one pair: clientId+NFRDomain is limited.
List Webhooks
Returns all webhooks registered by the MSP.
GET /pubapi/v1/msp/webhooks
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/webhooks" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
[
{ "status": "enabled", "webhook_id": "4091c6d2-1bce-4df8-a119-a7bcb9b8474c" },
{ "status": "enabled", "webhook_id": "656bc761-9454-464c-adff-457691b5effa" }
]
| Field | Type | Description |
|---|---|---|
webhook_id | string (UUID) | Webhook identifier |
status | string | enabled or disabled |
Register a Webhook
Registers a new webhook. The number of webhooks per clientId + NFR domain pair is limited. For webhook payload documentation see Webhook Receiver Specification.
POST /pubapi/v1/msp/webhooks
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
webhook_url | string | Yes | HTTPS URL to receive webhook payloads |
eventTypes | array | Yes | One or more event type strings (see Event Types) |
auth_header | string | Yes | Name of the auth header sent with each payload |
auth_header_value | string | Yes | Value of the auth header |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/webhooks" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "webhook_url": "https://www.example.com/egnyte-events", "eventTypes": [ "RESELLER_CREATED_CONNECT_TRIAL", "RESELLER_CONVERTED_CONNECT_TRIAL_TO_PAID" ], "auth_header": "AUTH-TOKEN", "auth_header_value": "XYZ" }'
200 OK
{
"status": "enabled",
"webhook_id": "a63790bf-2847-4abd-a0cb-3a06c3958659"
}
400 Bad Request
| Code | Description |
|---|---|
unknown_event_types | One or more event type strings are invalid |
non_https_webhook_url | Webhook URL must use HTTPS |
request_schema_error | auth_header or auth_header_value is blank |
409 Conflict
{ "message": "Max webhook limit exceeded.", "code": "webhook_limit_exceeded_error" }
Get Webhook Details
Returns details of a single webhook.
GET /pubapi/v1/msp/webhooks/{webhook_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string (UUID) | Yes | Webhook identifier |
200 OK
{
"webhook_id": "e4bf314d-4657-483a-a2b2-db1eda8c9509",
"event_types": ["RESELLER_LINK_NFR_MANUALLY", "RESELLER_CREATED_CONNECT_TRIAL"],
"webhook_url": "https://www.example.com/egnyte-events-2",
"auth_header": "X-TOKEN",
"auth_header_value": "a234fsd34fsdf4eghujj68",
"status": "enabled"
}
| Field | Type | Description |
|---|---|---|
webhook_id | string (UUID) | Webhook identifier |
webhook_url | string | Registered HTTPS URL |
event_types | array | Subscribed event types |
auth_header | string | Auth header name |
auth_header_value | string | Auth header value |
status | string | enabled or disabled |
404 Not Found
{ "message": "Webhook not found. Please check the webhook id e4bf314d-...", "code": "webhook_not_found_error" }
Update a Webhook
Updates an existing webhook. Replaces all fields.
PUT /pubapi/v1/msp/webhooks/{webhook_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string (UUID) | Yes | Webhook identifier |
Request Body
Same fields as Register a Webhook.
Example Request
curl -i -X PUT "https://{domain}.egnyte.com/pubapi/v1/msp/webhooks/{webhook_id}" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "webhook_url": "https://www.example.com/egnyte-events-updated", "eventTypes": [ "RESELLER_MRR_CHANGED" ], "auth_header": "AUTH-TOKEN", "auth_header_value": "NEW-VALUE" }'
200 OK
{ "status": "enabled", "webhook_id": "{webhook_id}" }
400 Bad Request — Same error codes as Register a Webhook.
Delete a Webhook
Unregisters a webhook.
DELETE /pubapi/v1/msp/webhooks/{webhook_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id | string (UUID) | Yes | Webhook identifier |
Example Request
curl -i -X DELETE "https://{domain}.egnyte.com/pubapi/v1/msp/webhooks/{webhook_id}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{ "success": true }
404 Not Found
{ "message": "Webhook not found. Please check the webhook id e4bf314d-...", "code": "webhook_not_found_error" }
Event Types
The following event type strings are supported for webhook subscriptions:
| Event Type | Description |
|---|---|
RESELLER_LINK_NFR_MANUALLY | NFR domain linked manually to reseller |
RESELLER_CREATED_CONNECT_TRIAL | Reseller created a Connect trial |
RESELLER_CREATED_PROTECT_TRIAL | Reseller created a Protect trial |
RESELLER_CONVERTED_CONNECT_TRIAL_TO_PAID | Connect trial converted to paid |
RESELLER_CONVERTED_PROTECT_TRIAL_TO_PAID | Protect trial converted to paid |
RESELLER_CONNECT_TRIAL_EXPIRED | Connect trial expired |
RESELLER_PROFILE_UPDATED | Reseller profile updated |
RESELLER_MRR_CHANGED | Reseller monthly recurring revenue changed |
RESELLER_FIRST_LOGIN | Reseller first login |
RESELLER_CC_ADDED | Credit card added |
RESELLER_PVI_ADDED | PVI added |
USER_ADDED | User added |
RESELLER_TFA_ENABLED | Two-factor auth enabled for reseller |
RESELLER_TFA_ENROLLED | Two-factor auth enrolled for reseller |
USER_TFA_ENABLED | Two-factor auth enabled for user |
USER_TFA_ENROLLED | Two-factor auth enrolled for user |
RESELLER_UPSELL_INVOICE_GENERATED | Upsell invoice generated |
RESELLER_RECURRING_INVOICE_GENERATED | Recurring invoice generated |
RESELLER_INVOICE_EDITED | Invoice edited |
RESELLER_INVOICE_PAID | Invoice paid |
RESELLER_PU_PURCHASED | Power users purchased for MSP pool |
Webhook Receiver Specification
The Webhook Receiver endpoint accepts POST requests with contents of an MSP event.
Your server implementation should return HTTP status code 200 if the data was received and should not be retransmitted. Non-200 status codes will schedule a retransmission and eventually cause the webhook to be disabled.
(re)Transmission Policy
If sending a webhook call fails due to network issues or the receiver responds with a status other than 200, the request will be retried in the next schedule. Permanent delivery failure despite multiple retries is counted. Multiple permanent delivery failures will result in the webhook being disabled.
Common Fields
All event payloads include these base fields:
| Field | Type | Description |
|---|---|---|
event_type | string | Event type identifier (see Event Types) |
reseller_code | string | Unique alphanumeric code identifying the reseller |
first_name | string | Reseller's first name |
last_name | string | Reseller's last name |
email | string | Reseller account's primary email |
company_name | string | Reseller's company name |
transaction_timestamp | string (ISO 8601) | When the event occurred |
event_created_by | string | Name of the user who triggered the event |
is_event_by_staff_user | boolean | true if triggered by an Egnyte staff member |
Event Types and Additional Fields
RESELLER_LINK_NFR_MANUALLY
NFR (Not-For-Resale) demo domain linked to the reseller.
| Field | Type | Description |
|---|---|---|
nfr_domain_name | string | Name of the NFR domain linked |
nfr_plan | string | Plan deployed on the NFR domain |
power_users | integer | Number of power user licenses on the NFR domain |
storage | integer | Storage allocated on the NFR domain (GB) |
{
"event_type": "RESELLER_LINK_NFR_MANUALLY",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"nfr_domain_name": "acmedemo",
"nfr_plan": "Business",
"power_users": 25,
"storage": 200
}
RESELLER_CREATED_CONNECT_TRIAL
Reseller created a new Connect trial domain.
| Field | Type | Description |
|---|---|---|
domain | string | Name of the newly created trial domain |
power_users | integer | Number of power user licenses |
storage | integer | Storage allocated (GB) |
pvi | integer | Plan ID |
plan_name | string | Plan name |
{
"event_type": "RESELLER_CREATED_CONNECT_TRIAL",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"domain": "acmetrial",
"power_users": 10,
"storage": 100,
"pvi": 42,
"plan_name": "Business"
}
RESELLER_CREATED_PROTECT_TRIAL
Reseller created a new Protect trial account.
| Field | Type | Description |
|---|---|---|
domain | string | Name of the newly created trial account |
power_users | integer | Number of power user licenses |
pvi | integer | Plan ID (optional) |
plan_name | string | Plan name |
tenant_id | string (UUID) | Unique identifier for the Protect tenant |
{
"event_type": "RESELLER_CREATED_PROTECT_TRIAL",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"domain": "acmeprotect",
"power_users": 10,
"plan_name": "Protect",
"tenant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
RESELLER_CONVERTED_CONNECT_TRIAL_TO_PAID
Connect trial domain converted to a paid subscription.
| Field | Type | Description |
|---|---|---|
domain | string | Name of the converted domain |
power_users | integer | Number of power user licenses |
storage | integer | Storage allocated (GB) |
pvi | integer | Plan ID |
plan_name | string | Plan name |
{
"event_type": "RESELLER_CONVERTED_CONNECT_TRIAL_TO_PAID",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"domain": "acmetrial",
"power_users": 25,
"storage": 500,
"pvi": 42,
"plan_name": "Business"
}
RESELLER_CONVERTED_PROTECT_TRIAL_TO_PAID
Protect trial account converted to a paid subscription.
| Field | Type | Description |
|---|---|---|
domain | string | Name of the converted account |
power_users | integer | Number of power user licenses |
pvi | integer | Plan ID (optional) |
plan_name | string | Plan name |
tenant_id | string (UUID) | Unique identifier for the Protect tenant |
{
"event_type": "RESELLER_CONVERTED_PROTECT_TRIAL_TO_PAID",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"domain": "acmeprotect",
"power_users": 25,
"plan_name": "Protect",
"tenant_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
RESELLER_CONNECT_TRIAL_EXPIRED
Connect trial domain expired without conversion.
| Field | Type | Description |
|---|---|---|
domain | string | Name of the expired trial domain |
power_users | integer | Number of power user licenses |
storage | integer | Storage allocated (GB) |
pvi | integer | Plan ID |
plan_name | string | Plan name |
{
"event_type": "RESELLER_CONNECT_TRIAL_EXPIRED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"domain": "acmetrial",
"power_users": 10,
"storage": 100,
"pvi": 42,
"plan_name": "Business"
}
RESELLER_PROFILE_UPDATED
Reseller profile field was updated.
| Field | Type | Description |
|---|---|---|
field_name | string | Name of the updated field |
old_value | string | Previous value |
new_value | string | New value |
{
"event_type": "RESELLER_PROFILE_UPDATED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"field_name": "company_name",
"old_value": "Acme Corp",
"new_value": "Acme Corporation"
}
RESELLER_MRR_CHANGED
Monthly recurring revenue changed for the reseller.
| Field | Type | Description |
|---|---|---|
reason | string | Reason for the MRR change |
domain | string | Domain name (null if domain-level consumption is not enabled) |
plans | array | List of plans affected by the change |
delta_mrr | number | Change in monthly cost |
delta_quantity | integer | Change in power users or storage (null for OPTIONAL_FEATURE_PURCHASE and SUPPORT_LEVEL_CHANGE) |
optional_feature_name | string | Name of the optional feature enabled/disabled (null for other reasons) |
{
"event_type": "RESELLER_MRR_CHANGED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"reason": "POWER_USER_PURCHASE",
"domain": "acmecorp",
"plans": ["Business"],
"delta_mrr": 15.00,
"delta_quantity": 5,
"optional_feature_name": null
}
RESELLER_FIRST_LOGIN
Reseller logged in to the MSP Portal for the first time.
| Field | Type | Description |
|---|---|---|
first_login_datetime | string (ISO 8601) | Timestamp of first login |
{
"event_type": "RESELLER_FIRST_LOGIN",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"first_login_datetime": "2026-07-21T10:30:00Z"
}
RESELLER_CC_ADDED
Credit card added to the reseller account.
| Field | Type | Description |
|---|---|---|
cc_number | string | Last 4 digits of the credit card |
usaepay_id | string | Payment reference ID |
{
"event_type": "RESELLER_CC_ADDED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"cc_number": "4242",
"usaepay_id": "ref-98765"
}
RESELLER_PVI_ADDED
Plans added to the reseller account.
| Field | Type | Description |
|---|---|---|
plans | array | List of plans added |
{
"event_type": "RESELLER_PVI_ADDED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"plans": ["Business", "Enterprise"]
}
USER_ADDED
New user added to the MSP Portal.
| Field | Type | Description |
|---|---|---|
user_username | string | Username of the new user |
user_first_name | string | First name of the new user |
user_last_name | string | Last name of the new user |
user_type | string | User type (e.g. Administrator, IT Admin) |
{
"event_type": "USER_ADDED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"user_username": "john.smith",
"user_first_name": "John",
"user_last_name": "Smith",
"user_type": "IT Admin"
}
RESELLER_TFA_ENABLED
Two-factor authentication enabled at the reseller account level. No additional fields beyond common fields.
{
"event_type": "RESELLER_TFA_ENABLED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false
}
RESELLER_TFA_ENROLLED
Reseller enrolled in two-factor authentication. No additional fields beyond common fields.
{
"event_type": "RESELLER_TFA_ENROLLED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false
}
USER_TFA_ENABLED
Two-factor authentication enabled for a specific MSP Portal user. No additional fields beyond common fields.
{
"event_type": "USER_TFA_ENABLED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false
}
USER_TFA_ENROLLED
MSP Portal user enrolled in two-factor authentication.
| Field | Type | Description |
|---|---|---|
user_username | string | Username of the user who enrolled |
user_first_name | string | First name of the user |
user_last_name | string | Last name of the user |
user_type | string | User type |
{
"event_type": "USER_TFA_ENROLLED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"user_username": "john.smith",
"user_first_name": "John",
"user_last_name": "Smith",
"user_type": "IT Admin"
}
RESELLER_UPSELL_INVOICE_GENERATED
Upsell invoice generated for the reseller.
| Field | Type | Description |
|---|---|---|
invoice_id | integer | Invoice ID |
amount | number | Total invoice amount |
tax_amount | number | Total tax amount |
invoice_period | string | Invoice generation schedule |
{
"event_type": "RESELLER_UPSELL_INVOICE_GENERATED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"invoice_id": 10042,
"amount": 150.00,
"tax_amount": 12.50,
"invoice_period": "monthly"
}
RESELLER_RECURRING_INVOICE_GENERATED
Recurring invoice generated for the reseller.
| Field | Type | Description |
|---|---|---|
invoice_id | integer | Invoice ID |
amount | number | Total invoice amount |
tax_amount | number | Total tax amount |
invoice_period | string | Invoice generation schedule |
{
"event_type": "RESELLER_RECURRING_INVOICE_GENERATED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"invoice_id": 10043,
"amount": 500.00,
"tax_amount": 41.25,
"invoice_period": "monthly"
}
RESELLER_INVOICE_EDITED
Existing invoice was edited.
| Field | Type | Description |
|---|---|---|
invoice_id | integer | Invoice ID |
amount | number | Updated total invoice amount |
tax_amount | number | Updated total tax amount |
invoice_period | string | Invoice generation schedule |
delta_invoice_amount | number | Change in invoice amount |
{
"event_type": "RESELLER_INVOICE_EDITED",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": true,
"invoice_id": 10043,
"amount": 480.00,
"tax_amount": 39.60,
"invoice_period": "monthly",
"delta_invoice_amount": -20.00
}
RESELLER_INVOICE_PAID
Invoice payment received.
| Field | Type | Description |
|---|---|---|
payment_ref_number | string | Reference number of the paid invoice |
invoice_initiator | string | Whether payment was automatic (credit card) or manual |
payment_mode | string | Payment mode selected in the reseller portal |
{
"event_type": "RESELLER_INVOICE_PAID",
"reseller_code": "msp10reseller",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"company_name": "Acme Corp",
"transaction_timestamp": "2026-07-21T10:30:00Z",
"event_created_by": "Jane Doe",
"is_event_by_staff_user": false,
"payment_ref_number": "INV-10043",
"invoice_initiator": "automatic",
"payment_mode": "Credit Card"
}
Domains
This is a set of endpoints to manage domains.
List Domains
Returns a paginated list of domains registered by the MSP.
GET /pubapi/v1/msp/domains
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
planName | string | No | Filter domains by plan name |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/domains" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"next": null,
"previous": null,
"count": 10,
"results": [
{
"domain": "testDomain",
"planId": 1,
"planName": "Platform Enterprise",
"status": "active",
"createdOn": "2024-03-28T00:00:00",
"subscriptionDate": "2024-03-23",
"availablePuLicences": 10,
"usedPuLicences": 1,
"unusedPuLicences": 9,
"availableSuLicences": 10,
"usedSuLicences": 0,
"unusedSuLicences": 10,
"availableStorage": 2000,
"usedStorage": 0,
"allocatedStorage": 1000
}
]
}
| Field | Type | Description |
|---|---|---|
next | string | null | URL to the next page of results |
previous | string | null | URL to the previous page of results |
count | integer | Total number of domains |
results | array | List of domain objects (see Get Domain Details for field descriptions) |
Get Domain Details
Returns details for a specific domain.
GET /pubapi/v1/msp/domains/{domain}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain name |
Example Request
curl -i -X GET "https://{egnyte_domain}.egnyte.com/pubapi/v1/msp/domains/{domain}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"domain": "testDomain",
"planId": 1,
"planName": "Platform Enterprise",
"status": "active",
"createdOn": "2024-03-19T00:00:00",
"subscriptionDate": "2024-03-19",
"availablePuLicences": 3,
"usedPuLicences": 1,
"unusedPuLicences": 2,
"availableSuLicences": 3,
"usedSuLicences": 1,
"unusedSuLicences": 2,
"availableStorage": 1000,
"usedStorage": 0,
"allocatedStorage": 10,
"monthlyCost": 0,
"features": [
{ "name": "olc", "title": "Turbo or Storage Sync", "category": "2 Free, Extra Optional", "type": "flat", "numPurchased": 2 }
],
"sources": [
{ "name": "data_security_mgmt_gmail_users", "title": "Gmail Users", "category": "Optional", "type": "flat", "numPurchased": 0 }
]
}
| Field | Type | Description |
|---|---|---|
domain | string | Domain name |
planId | integer | Plan identifier |
planName | string | Name of the plan |
status | string | Domain status (e.g. active, trial) |
createdOn | string (datetime) | Domain creation timestamp |
subscriptionDate | string (date) | Subscription start date |
availablePuLicences | integer | Total power user licenses in pool |
usedPuLicences | integer | Power user licenses in use |
unusedPuLicences | integer | Power user licenses available |
availableSuLicences | integer | Total standard user licenses in pool |
usedSuLicences | integer | Standard user licenses in use |
unusedSuLicences | integer | Standard user licenses available |
availableStorage | integer | Total storage in pool (GB) |
usedStorage | integer | Storage in use (GB) |
allocatedStorage | integer | Storage allocated to domain (GB) |
monthlyCost | number | Monthly base cost |
features | array | Optional features for the domain |
sources | array | Data sources for the domain |
404 Not Found
{ "message": "Domain not found. Please check the domain id", "code": "domain_not_found_error" }
Tenants
Tenants represent Egnyte Protect subscriptions managed by the MSP.
List Tenants
Returns a paginated list of Protect tenants registered by the MSP.
GET /pubapi/v1/msp/tenants
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
planName | string | No | Filter tenants by plan name |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/tenants" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"next": null,
"previous": null,
"count": 3,
"results": [
{
"tenant": "protecttestdomain1",
"domain": "testdomain1",
"planId": 20202,
"planName": "Protect",
"createdOn": "2024-05-08T00:00:00",
"subscriptionDate": null,
"status": "trial",
"cupUsed": 69,
"cupIncluded": 500,
"totalCupPurchased": 10005,
"totalCupIncluded": 1000,
"totalCupAvailable": 11005,
"totalCupUsed": 8669,
"totalCupUnused": 2336
}
]
}
| Field | Type | Description |
|---|---|---|
tenant | string | Tenant name |
domain | string | Associated domain name |
planId | integer | Plan identifier |
planName | string | Name of the plan |
createdOn | string (datetime) | Tenant creation timestamp |
subscriptionDate | string (date) | null | Date trial was activated; null if still trial |
status | string | trial or active |
cupUsed | integer | Content Under Protection used by tenant (GB) |
cupIncluded | integer | Included CUP available to tenant (GB) |
totalCupPurchased | integer | Additional CUP purchased by MSP (GB) |
totalCupIncluded | integer | Total free CUP for all active tenants (GB) |
totalCupAvailable | integer | Total CUP pool available to MSP (GB) |
totalCupUsed | integer | Total CUP used across all tenants (GB) |
totalCupUnused | integer | Total unused CUP in MSP pool (GB) |
Get Tenant Details
Returns details for a specific Protect tenant.
GET /pubapi/v1/msp/tenants/{tenant_name}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
tenant_name | string | Yes | Tenant name |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/tenants/{tenant_name}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"tenant": "protecttestdomain3",
"domain": "testdomain3",
"planId": 20202,
"planName": "Protect",
"createdOn": "2024-04-19T00:00:00",
"subscriptionDate": "2024-04-24",
"status": "active",
"cupUsed": 8649,
"cupIncluded": 500,
"totalCupPurchased": 10005,
"totalCupIncluded": 1000,
"totalCupAvailable": 11005,
"totalCupUsed": 8669,
"totalCupUnused": 2336,
"monthlyCost": 400.99
}
Same fields as List Tenants plus:
| Field | Type | Description |
|---|---|---|
monthlyCost | number | Monthly base cost of the Protect plan |
404 Not Found
{ "message": "Tenant not found. Please check the name of the tenant", "code": "tenant_not_found_error" }
Plans
This is a set of endpoints to manage plans.
List Plans
Returns a paginated list of plans available to the MSP.
GET /pubapi/v1/msp/plans
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/plans" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"next": null,
"previous": null,
"count": 10,
"results": [
{
"id": 1,
"planId": 10,
"planName": "Example Plan",
"maxPlanPuLicences": 5,
"maxPlanSuLicences": 10,
"costPerUser": 10,
"maxPlanStorage": 10,
"allocatedPlanStorage": 1,
"availablePlanStorage": 9,
"features": [{ "name": "example name", "type": "example type" }],
"packages": [{ "name": "example name", "type": "example type" }],
"sources": [{ "name": "example name", "type": "example type" }]
}
]
}
| Field | Type | Description |
|---|---|---|
id | integer | Plan identifier used in trial creation |
planId | integer | Planset identifier (a planset contains multiple plans) |
planName | string | Name of the plan |
maxPlanPuLicences | integer | Total power user quota in plan (not returned for Protect plans) |
maxPlanSuLicences | integer | Total standard user quota in plan (not returned for Protect plans) |
maxPlanStorage | integer | Total storage quota in plan (GB) |
allocatedPlanStorage | integer | Storage allocated across all domains (GB) |
availablePlanStorage | integer | Storage remaining in pool (GB) |
costPerUser | integer | null | Cost per user per month ($); only returned when DLC is enabled |
features | array | Features available in the plan |
packages | array | Packages available in the plan |
sources | array | Sources available in the plan |
totalCupPurchased | integer | Purchased CUP (Protect plans only, GB) |
totalCupIncluded | integer | Free CUP (Protect plans only, GB) |
totalCupAvailable | integer | Total CUP pool (Protect plans only, GB) |
totalCupUsed | integer | CUP used by tenants (Protect plans only, GB) |
totalCupUnused | integer | Unused CUP (Protect plans only, GB) |
Get Power Users Quote
Returns a pricing quote for adding power users to the MSP's pool without committing the purchase.
POST /pubapi/v1/msp/plans/{planId}/power-users/quote/
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
planId | string | Yes | Plan identifier |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
powerUsers | integer | Yes | min: 1 | Target number of power users (absolute count, not delta) |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/plans/{planId}/power-users/quote/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "powerUsers": 50 }'
200 OK
| Field | Type | Description |
|---|---|---|
previousPowerUsers | integer | Current power user count |
newPowerUsers | integer | Power user count after purchase |
deltaPowerUsers | integer | Change in power users |
deltaMonthly | string (decimal) | Change in monthly recurring cost ($) |
proratedCost | string (decimal) | Prorated charge for remainder of billing period ($) |
proratedDaysLeft | integer | Days remaining in billing period |
proratedMonthsLeft | integer | Months remaining in billing period |
400 Bad Request — Validation error if powerUsers is missing or below minimum.
Purchase Power Users
Purchases additional power users for the MSP's pool. Billed immediately on a prorated basis.
POST /pubapi/v1/msp/plans/{planId}/power-users/purchase/
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
planId | string | Yes | Plan identifier |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
powerUsers | integer | Yes | min: 1 | Target number of power users (absolute count, not delta) |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/plans/{planId}/power-users/purchase/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "powerUsers": 50 }'
200 OK — Same response fields as Get Power Users Quote.
400 Bad Request — Validation error if powerUsers is missing or below minimum.
Allocate Power Users to Domain
Allocates power users from the MSP's pool to a specific customer domain.
POST /pubapi/v1/msp/domains/{domain}/power-users/allocate
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The customer domain name |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
powerUsers | integer | Yes | min: 1 | Target number of power users to allocate to the domain (absolute count, not delta) |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/domains/{domain}/power-users/allocate" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "powerUsers": 10 }'
200 OK
| Field | Type | Description |
|---|---|---|
domain | string | The customer domain name |
previousPowerUsers | integer | Power user count before allocation |
newPowerUsers | integer | Power user count after allocation |
poolAvailableAfter | integer | MSP pool power users remaining after allocation |
400 Bad Request
| Error Code | Description |
|---|---|
invalid_power_users_value | powerUsers is missing, not an integer, zero, or negative |
customer_is_trial | Power user allocation is not allowed for trial customers |
power_user_allocation_error | powerUsers is below domain's current consumption, below current allocated count (decrease not allowed), exceeds reseller's available pool (non-DLC), or exceeds plan maximum (DLC) |
404 Not Found — domain_not_found — domain does not exist or belongs to a different reseller.
Trial Management
MSP resellers can create trial domains and convert them to paid subscriptions via the MSP Public API.
Start New Trial
Creates a new trial domain under the MSP reseller account.
Request
POST /pubapi/v1/msp/trials/
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
domain | string | Yes | maxLength: 50 | The domain name for the trial |
id | integer | Yes | — | Plan ID (from GET /msp/plans) |
powerUsers | integer | Yes | min: 1 | Number of power user licenses |
storageGB | integer | Yes | min: 1 | Storage allocation in GB |
region | string | Yes | maxLength: 50 | Region for domain provisioning. See Regions below |
username | string | No | maxLength: 255 | Admin username |
password | string | No | maxLength: 255 | Admin password (write-only) |
firstName | string | No | maxLength: 255 | Admin first name |
lastName | string | No | maxLength: 255 | Admin last name |
email | string | No | format: email | Admin email address |
phone | string | No | maxLength: 50, default: "" | Admin phone number |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/trials/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "domain": "acmetrial", "id": 42, "powerUsers": 25, "storageGB": 500, "region": "sjc" }'
Regions
| Value | Description |
|---|---|
sjc | North America — US West |
avl | North America — US East |
am2 | Europe — Belgium |
me1 | Middle East — UAE |
Response
201 Created
| Field | Type | Description |
|---|---|---|
domain | string | The trial domain name |
domainUrl | string | Full URL of the provisioned domain |
trialStart | string (date) | Trial start date (ISO 8601) |
trialEnd | string (date) | Trial end date (ISO 8601) |
powerUsers | integer | Number of power user licenses |
storageGB | integer | Storage allocation in GB |
Example Response
{
"domain": "acmetrial",
"domainUrl": "https://acmetrial.egnyte.com",
"trialStart": "2026-06-01",
"trialEnd": "2026-06-30",
"powerUsers": 25,
"storageGB": 500
}
400 Bad Request
| Code | Description | Resolution |
|---|---|---|
| Validation error | Missing required fields or invalid values | Check fieldName and nonFieldErrors in the response body |
409 Conflict
| Code | Description | Resolution |
|---|---|---|
domain_taken | Domain name already taken | Use a different domain name; check suggestions in the response for alternatives |
422 Unprocessable Entity
| Code | Description | Resolution |
|---|---|---|
trials_locked | Trials locked for this plan type | Contact your MSP account manager to unlock trials for this plan |
Activate Trial
Converts a trial domain to a paid subscription.
Request
POST /pubapi/v1/msp/trials/{domain}/activate/
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The trial domain name to activate |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
planId | integer | Yes | min: 1 | Target plan ID (from GET /msp/plans) |
powerUsers | integer | Yes | min: 1 | Number of power user licenses. Must be ≥ actual current usage. |
storageGB | integer | Yes | min: 1 | Storage in GB. Must be ≥ actual current usage. |
Example Request
curl -i -X POST "https://{domain}.egnyte.com/pubapi/v1/msp/trials/{domain}/activate/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{ "planId": 42, "powerUsers": 25, "storageGB": 1000 }'
Response
200 OK
| Field | Type | Description |
|---|---|---|
domain | string | The activated domain name |
domainUrl | string | Full URL of the domain |
activationDate | string (date) | Date the domain was converted to paid (ISO 8601) |
Example Response
{
"domain": "acmetrial",
"domainUrl": "https://acmetrial.egnyte.com",
"activationDate": "2026-06-15"
}
400 Bad Request
| Code | Description | Resolution |
|---|---|---|
domain_not_trial | Domain exists but is already a paid subscription | Verify the domain is currently in trial status |
insufficient_pool_resources | Requested power users exceed available pool capacity | Reduce powerUsers or increase pool capacity |
| Validation error | powerUsers or storageGB below actual current usage | Increase values to meet or exceed current usage |
404 Not Found
| Code | Description | Resolution |
|---|---|---|
domain_not_found | No domain with that name exists under this MSP reseller | Verify the domain name and ensure it was created under your MSP account |
502 Bad Gateway
| Code | Description | Resolution |
|---|---|---|
trial_activation_failed | CFS activation call returned non-200 | Retry the request or contact support if the issue persists |
Users
Endpoints to list and inspect MSP Reseller users for the requesting reseller.
List Users
Returns a paginated list of users belonging to the requesting MSP reseller.
GET /pubapi/v1/msp/users
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/users" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"userId": "9782be00-5b7d-46c7-abc3-9d2102564081",
"fullName": "user1",
"email": "user1@egnyte.com",
"defaultAccess": "Administrator",
"isActive": true,
"isTfaEnabled": false,
"isSsoEnabled": true,
"lastLoginAt": "2025-07-10T11:30:06",
"dateJoined": "2024-06-30T04:00:00"
},
{
"userId": "9efdfaa0-c33e-4712-992e-3a2a1399ebab",
"fullName": "user2",
"email": "user2@egnyte.com",
"defaultAccess": "IT Admin",
"isActive": true,
"isTfaEnabled": false,
"isSsoEnabled": true,
"lastLoginAt": "2025-05-26T10:36:16",
"dateJoined": "2024-11-30T12:30:01"
}
]
}
| Field | Type | Description |
|---|---|---|
count | integer | Total number of users |
next | string | null | URL to the next page of results |
previous | string | null | URL to the previous page of results |
results | array | List of user objects |
Each user object:
| Field | Type | Description |
|---|---|---|
userId | string (UUID) | Unique identifier of the user |
fullName | string | User's full name |
email | string | User's email address |
defaultAccess | string | Default access role. One of: Administrator, IT Admin, IT Technician, User, BillingAdmin |
isActive | boolean | Whether the user account is active |
isTfaEnabled | boolean | Whether two-factor authentication is enabled |
isSsoEnabled | boolean | Whether SSO is enabled for the user |
lastLoginAt | string (datetime) | null | Timestamp of the user's last login |
dateJoined | string (datetime) | Timestamp when the user account was created |
Get User Details
Returns a single user belonging to the requesting MSP reseller.
GET /pubapi/v1/msp/users/{userId}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
userId | string (UUID) | Yes | User identifier |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/users/{userId}" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"fullName": "Jane Doe",
"email": "jane.doe@example.com",
"defaultAccess": "Administrator",
"isActive": true,
"isTfaEnabled": true,
"isSsoEnabled": false,
"lastLoginAt": "2024-05-08T10:15:30Z",
"dateJoined": "2024-03-19T00:00:00Z",
"accessTypeByDomain": {
"testdomain1": "Administrator",
"testdomain2": "No Access"
}
}
Same base fields as each object in List Users except userId is omitted, plus:
| Field | Type | Description |
|---|---|---|
accessTypeByDomain | object | Map of domain name → role for each domain the user has access to. Domain-level roles: IT Admin, IT Technician, No Access |
404 Not Found
{ "message": "No user found for the given userId", "code": "user_not_found" }
List User Activity Logs
Returns a paginated list of activity logs for the given MSP user, newest first.
GET /pubapi/v1/msp/users/{userId}/logs
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
userId | string (UUID) | Yes | User identifier |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string (date) | No | Return logs on or after this date (ISO 8601, must not be in the future) |
to | string (date) | No | Return logs on or before this date (ISO 8601, must not be in the future and must be ≥ from) |
Example Request
curl -i -X GET "https://{domain}.egnyte.com/pubapi/v1/msp/users/{userId}/logs?from=2026-07-01&to=2026-07-31" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
200 OK
{
"count": 4,
"next": null,
"previous": null,
"results": [
{
"kind": "UserChange",
"details": "Last Name: testtwo -> testthree",
"target": "User: testuser12@egnyte.com",
"timestamp": "2026-07-16T02:49:44.962742",
"author": "testuser@egnyte.com"
},
{
"kind": "PasswordReset",
"details": "",
"target": "User: testuser45@egnyte.com",
"timestamp": "2026-07-16T02:49:12.540354",
"author": "testuser@egnyte.com"
},
{
"kind": "UserStatusChange",
"details": "Unblocked testuser34@egnyte.com successfully.",
"target": "User: testuser45@egnyte.com",
"timestamp": "2026-07-16T02:48:41.085499",
"author": "testuser@egnyte.com"
},
{
"kind": "UserAdded",
"details": "",
"target": "User: testuser2@egnyte.com",
"timestamp": "2026-07-16T02:47:30.989140",
"author": "testuser@egnyte.com"
}
]
}
| Field | Type | Description |
|---|---|---|
count | integer | Total number of log entries |
next | string | null | URL to the next page of results |
previous | string | null | URL to the previous page of results |
results | array | List of log entry objects |
Each log entry:
| Field | Type | Description |
|---|---|---|
kind | string | Action performed. See Log entry kinds below |
details | string | Summary of what changed — field diffs, affected domain, or a status message. Empty string when the action carries no extra detail |
target | string | Object affected by the event, if applicable |
timestamp | string (datetime) | When the event occurred |
author | string | Email of the user who performed the action |
Log entry kinds
| Kind | Description |
|---|---|
UserChange | User profile or access changes (e.g. first name, last name, email, access role) |
UserStatusChange | User block or unblock status changes |
LoginToDomain | User login to a specific domain |
ObjChanged | One or more fields on an object were modified; details list each field with old and new values |
UserAdded | User added under the MSP reseller |
PasswordReset | User password reset action |
CustomerChange | Customer-level config update (like invoice emails, status) |
CustomerCCUpdate | Customer credit card or billing information updated |
CustomerSubscribed | Customer subscribed to a plan |
400 Bad Request
| Code | Description |
|---|---|
request_schema_error | from or to is in the future, or from is after to |
404 Not Found
{ "message": "No user found for the given userId", "code": "user_not_found" }
Related Resources
- Developer Account Registration — Register for API access
- Best Practices for Public API Usage — Rate limiting, pagination, and error handling
