Administration API Essentials
Version: 1.0 | Last Updated: January 16, 2026 | Applies to: All Administration API Suite APIs
These Administration APIs are currently in Beta testing. API keys cannot be generated in Admin Console at this point. Only Beta program participants may use these APIs.
Table of Contents
- Suite Overview
- Prerequisites
- Getting Started
- Authentication
- API Versioning
- Common Request Patterns
- Asynchronous Operations
- Pagination
- Filtering with RSQL
- Sorting Results
- Error Handling
- Rate Limiting
- Best Practices
- Troubleshooting
- Support Resources
Suite Overview
The Administration API Suite provides programmatic access to 8x8 administrative functions, enabling automation of user management, organizational configuration, and telephony provisioning. All APIs in this suite share common authentication, patterns, and infrastructure for a consistent developer experience.
APIs in This Suite
- User Management API: Manage users, roles, and permissions across your 8x8 organization
- Ring Group Management API: Configure ring groups and call distribution
- Phone Number Management API: Discover and retrieve phone number inventory and availability
- Site Management API: Manage organizational sites and physical locations
- Contact Management API: Manage contacts and contact information
When to Use Which API
- User Management API: For creating, updating, and deleting individual user accounts and managing their profiles
- Ring Group Management API: For setting up and managing team call distribution and ring group configurations
- Phone Number Management API: For discovering available phone numbers and retrieving phone number metadata before assignment
- Site Management API: For managing sites, addresses, and organizational structure
- Contact Management API: For creating and managing contacts associated with your organization
Common Characteristics
All Administration APIs share:
- API key authentication with
x-api-keyheader - Base URL:
https://api.8x8.com/admin-provisioning - Asynchronous operation patterns for mutations (CREATE, UPDATE, DELETE)
- Scroll-based pagination for list operations
- RSQL filtering syntax for precise searches
- RFC 7807 Problem Details error format
- Rate limiting and security best practices
Prerequisites
Before using any Administration API, ensure you have the following:
Required Access
8x8 Account Requirements:
- Active 8x8 account with Admin Console access
- API Administrator role or equivalent permissions
- Access to the customer organization where you'll manage resources
Technical Requirements:
- HTTPS-capable client (Python, Node.js, or equivalent programming language)
- Understanding of REST API principles
- Familiarity with JSON data format
Knowledge Prerequisites
8x8 Platform Understanding:
- Basic knowledge of 8x8's organizational hierarchy (Customer → PBX → Site → Resources)
- Familiarity with 8x8 Admin Console navigation
- Understanding of user roles and permissions within 8x8
Technical Skills:
- Experience with REST API integration
- Understanding of asynchronous operation patterns
- Knowledge of RSQL query syntax (for filtering) - examples provided in this guide
Getting Started
Obtaining API Credentials
API keys are generated and managed through the 8x8 Admin Console. Follow these steps to obtain your API credentials:
- Log in to the 8x8 Admin Console at https://admin.8x8.com
- Open the main navigation menu and go to API Keys
- Click Create App
- Add the appropriate API products to your key based on which Administration APIs you need:
- UC & CC Admin Operations: Required if your key will be used to make changes on any APIs with asynchronous operations
- UC & CC Number Admin: Required for number management operations
- UC & CC User Admin: Required for user management operations
- UC Ring Group Admin: Required for ring group management operations
- UC Site Admin: Required for site management operations
- Copy and securely store your API key
- Note your customer ID for reference
Security Note: Treat API keys like passwords. Never commit them to source control, share them in unsecured channels, or log them in plain text. Store them in environment variables or secure vault systems (AWS Secrets Manager, Azure Key Vault, etc.).
Testing Your Credentials
Once you have your API key, test that it works correctly by making a simple authenticated request:
Example: Testing API Credentials (click to expand)
A successful response (HTTP 200 or 202) confirms your credentials are valid and properly configured.
Authentication
All Administration APIs use API key authentication passed in the x-api-key request header. Every request must include this header with a valid API key.
Authentication Method
Authentication uses the x-api-key header:
x-api-key: your-api-key-here
This header must be included in every API request. Requests without valid authentication will receive a 401 Unauthorized response.
Base URL
Production: https://api.8x8.com/admin-provisioning
All Administration API endpoints are accessed through this base URL.
API Versioning
Administration APIs use the Accept header for version negotiation. This approach allows the APIs to evolve while maintaining backward compatibility for existing integrations.
Version Format
Versions use major version numbers only (v1, v2, etc., not v1.4 or v1.2.3). Minor updates and patches are deployed transparently without requiring version changes.
Specifying Version
All Administration APIs use the Accept header with a consistent format pattern:
Accept: application/vnd.{resource}.v{major}+json
Where:
{resource}is the API resource type (e.g.,users,ringgroups){major}is the major version number (e.g.,v1,v2)
Examples:
User Management API:
Accept: application/vnd.users.v1+json
Ring Group Management API:
Accept: application/vnd.ringgroups.v1+json
For other Administration APIs, check the specific API guide for its exact Accept header format.
Backward Compatibility
- Major versions are maintained for extended periods (typically 12-24 months after next version release)
- Deprecated features are announced well in advance
- Breaking changes only occur in major version increments
- Minor enhancements and bug fixes are deployed to current major version
Common Request Patterns
Required Headers
Every API request to Administration APIs must include:
x-api-key: your-api-key-here
Accept: application/vnd.{resource}.v{version}+json
For requests that contain a payload (POST and PUT operations), also include:
Content-Type: application/json
Example Request
GET https://api.8x8.com/admin-provisioning/users?pageSize=10
x-api-key: your-api-key-here
Accept: application/vnd.users.v1+json
POST https://api.8x8.com/admin-provisioning/users
x-api-key: your-api-key-here
Accept: application/vnd.users.v1+json
Content-Type: application/json
{
"basicInfo": {
"userName": "jane.smith@example.com",
"firstName": "Jane",
"lastName": "Smith",
"primaryEmail": "jane.smith@example.com"
}
}
Asynchronous Operations
All mutation operations (CREATE, UPDATE, DELETE) in Administration APIs use asynchronous processing to prevent timeouts, enable bulk operations, and provide operation tracking.
Operation Flow
- Submit Request: Client sends POST, PUT, or DELETE request
- Receive Acknowledgment: API immediately returns
202 Acceptedwith operation object - Poll Status: Client periodically checks operation status via GET
/operations/{operationId} - Check Status: Operation progresses through states:
PENDING→IN_PROGRESS→COMPLETEDorFAILED - Retrieve Resource: Once
COMPLETED, useresourceIdto get created/updated resource
Operation Status Values
- PENDING: Operation queued but not yet started
- IN_PROGRESS: Operation currently processing
- COMPLETED: Operation finished successfully
- FAILED: Operation encountered an error
- UNKNOWN: Status cannot be determined (rare, contact support if seen)
Operation Object Structure
When you submit a mutation request, you receive an operation object:
{
"operationId": "op_1a2b3c4d5e6f",
"status": "PENDING",
"resourceType": "USER",
"operationType": "CREATE",
"createdTime": "2025-12-01T15:30:45Z",
"_links": {
"self": {
"href": "/operations/op_1a2b3c4d5e6f"
}
}
}
When the operation completes, the structure includes additional fields:
{
"operationId": "op_1a2b3c4d5e6f",
"status": "COMPLETED",
"resourceType": "USER",
"resourceId": "hvOB1l3zDCaDAwp9tNLzZA",
"operationType": "CREATE",
"createdTime": "2025-12-01T15:30:45Z",
"completedTime": "2025-12-01T15:30:52Z",
"_links": {
"self": {
"href": "/operations/op_1a2b3c4d5e6f"
},
"resource": {
"href": "/users/hvOB1l3zDCaDAwp9tNLzZA"
}
}
}
Polling Best Practices
Recommended Strategy:
- Start polling after 1-2 seconds
- Poll no more frequently than once per second
- Set a maximum timeout (5 minutes recommended)
- Log operation IDs for troubleshooting
Typical Completion Times:
- Simple operations (create user, update settings): 2-5 seconds
- Complex operations (bulk updates, with dependencies): 5-15 seconds
- If operation exceeds 60 seconds, investigate for issues
Code Example
Example: Async Operation Polling Pattern (click to expand)
Handling Operation Failures
If an operation fails (status: "FAILED"), the operation object includes an error field:
{
"operationId": "op_1a2b3c4d5e6f",
"status": "FAILED",
"error": {
"status": 400,
"title": "Validation Error",
"detail": "Invalid field value",
"errors": [
{
"field": "basicInfo.primaryEmail",
"code": "VALIDATION_ERROR",
"message": "Email address format is invalid"
}
]
}
}
Review the error details to understand the failure cause, correct the issue, and resubmit if appropriate.
Pagination
Administration APIs use scroll-based pagination for consistent, efficient results when listing resources. This approach provides stable iteration even when data changes during the scroll.
How Scroll-Based Pagination Works
- Initial Request: Specify
pageSize(default 100, max 1000) and optional filters/sorting - Receive First Page: Response includes
nextScrollIdif more results exist - Subsequent Requests: Pass
scrollIdparameter to get the next page - Continue: Repeat until
hasMoreis false
Key Characteristics
- Opaque Scroll IDs: Scroll IDs are opaque tokens - treat them as black boxes, don't try to decode or manipulate them
- Filter Encoding: Filters and sort order are encoded in the scroll ID
- Consistent Results: Even if data changes during iteration, you'll get consistent results for your scroll
- Immutable: Don't modify filters or sort order mid-scroll (start new scroll instead)
Pagination Response Structure
{
"data": [
{ /* resource object */ }
],
"pagination": {
"pageSize": 100,
"hasMore": true,
"nextScrollId": "abc123def456",
"filter": "basicInfo.status==ACTIVE",
"sort": "+lastName"
},
"_links": {
"self": { "href": "/users?pageSize=100" },
"next": { "href": "/users?pageSize=100&scrollId=abc123def456" }
}
}
Pagination Best Practices
Choosing Page Size:
- Real-time/Interactive: 50-100 items for quick responses
- Bulk Export/Processing: 100-1000 items to reduce API calls
- Memory Constrained: Smaller pages (25-50) to reduce memory usage
- Balance between number of API calls and response size
Efficient Iteration:
- Process pages as they arrive (streaming) rather than buffering all results
- Don't restart scrolls unnecessarily - they're expensive server-side
- Cache scroll IDs if you need resumable operations
- If scroll expires, start fresh from the beginning
Error Handling:
- If you receive a scroll expiration error, start a new scroll
- Don't try to continue a failed scroll - begin fresh query
Code Example
Example: Pagination Loop (click to expand)
Filtering with RSQL
Administration APIs support powerful filtering using RSQL (RESTful Service Query Language) syntax. This enables precise resource searches without retrieving unnecessary data.
RSQL Syntax Overview
RSQL provides a URL-friendly query language for filtering API results.
Comparison Operators
==equals!=not equals>greater than<less than>=greater than or equal<=less than or equal
Logical Operators
;AND condition (both must be true),OR condition (either can be true)()grouping for complex expressions
Special Features
Case Insensitivity: Filter comparisons are case-insensitive by default. name==jane matches "jane", "Jane", or "JANE".
Wildcard Matching: Use asterisk * for partial string matches:
name==*smith- ends with "smith"name==john*- starts with "john"name==*doe*- contains "doe"
Quoting Values: Quote values containing spaces or special characters:
department=='Research and Development'title=='VP, Engineering'
Filter Examples
Simple Equality:
status==ACTIVE
Comparison Operators:
createdTime>2025-11-01T00:00:00Z
extensionNumber>=1000
Wildcard Search:
name==*Support*
email==*@example.com
Logical AND (semicolon):
status==ACTIVE;department==Engineering
Logical OR (comma):
department==Engineering,department==Sales
Complex Expression:
status==ACTIVE;(department==Engineering,department==Sales);createdTime>2025-01-01T00:00:00Z
This finds active resources in either Engineering or Sales created after January 1, 2025.
Field Paths
Use dot notation for nested fields. The exact field names depend on the API:
User Management API:
basicInfo.status- user statusbasicInfo.primaryEmail- user emaildirectoryInfo.department- user departmentbasicInfo.createdTime- creation timestamp
Ring Group Management API:
name- ring group nameextensionNumber- extension numberringPattern- distribution patternringTimeout- ring duration
Refer to each API's documentation for available filterable fields.
Best Practices
Performance:
- Filter early and precisely to reduce data transfer
- Avoid overly complex RSQL expressions (max 2000 characters)
- Use specific field paths
- Test filters with small page sizes first
Correctness:
- Match field names exactly (case-sensitive for field paths)
- Use correct operators (
==not=) - Quote values with spaces
- Validate RSQL syntax before submitting
- Check for matching parentheses in complex expressions
Common Pitfalls
❌ Wrong: status=ACTIVE (single equals)
✅ Correct: status==ACTIVE (double equals)
❌ Wrong: Status==ACTIVE (wrong case for field name)
✅ Correct: basicInfo.status==ACTIVE (exact field path)
❌ Wrong: department==Research and Development (unquoted spaces)
✅ Correct: department=='Research and Development' (quoted)
Code Example
Example: RSQL Filtering (click to expand)
Further Reading
For complete RSQL specification, see the RSQL Parser documentation.
Sorting Results
Control the order of results using the sort query parameter. Sorting is applied before pagination, ensuring consistent ordering across all pages.
Sort Syntax
Ascending Order: Use + prefix or no prefix
sort=+lastName
sort=lastName
Descending Order: Use - prefix
sort=-createdTime
Multiple Fields: Comma-separated for multi-level sorting
sort=+department,+lastName,+firstName
This sorts first by department (A-Z), then by last name (A-Z), then by first name (A-Z).
Sort Examples
By Last Name (A-Z):
sort=+lastName
By Creation Date (Newest First):
sort=-createdTime
Multi-Level Sort:
sort=+department,-createdTime
Sorts by department (A-Z), then within each department by creation date (newest first).
Sortable Fields
Available sort fields depend on the specific API. Common sortable fields:
User Management API:
basicInfo.lastName,basicInfo.firstNamebasicInfo.createdTime,basicInfo.lastUpdatedTimebasicInfo.statusdirectoryInfo.department
Ring Group Management API:
nameextensionNumberringPattern
Refer to each API's documentation for complete list of sortable fields.
Best Practices
- Use field paths that match the API's data model
- Test single-field sorts before combining multiple fields
- Combine with pagination for consistent iteration
- Use appropriate ascending/descending based on use case
Code Example
Example: Sorting Results (click to expand)
Error Handling
Administration APIs use RFC 7807 Problem Details format for structured, consistent error responses. This standard format makes error handling predictable across all APIs.
Error Response Format
All error responses follow this structure:
{
"status": 400,
"instance": "/users",
"time": "2025-12-01T15:30:45Z",
"title": "Request Validation Failed",
"errors": [
{
"field": "basicInfo.primaryEmail",
"code": "VALIDATION_ERROR",
"message": "Email address format is invalid"
}
]
}
Key Fields
- status: HTTP status code (400, 401, 403, 404, 429, 500)
- title: Human-readable error summary
- detail: Specific explanation for this error occurrence
- errors: Array of field-level validation errors (if applicable)
- field: Specific field path where error occurred
- code: Machine-readable error code for programmatic handling
- message: Human-readable error message for this field
- requestId, responseId: Tracking identifiers for support escalation
Common HTTP Status Codes
Success Codes:
200 OK: Successful GET request202 Accepted: Async operation accepted (create, update, delete)
Client Error Codes:
400 Bad Request: Validation error, malformed request, or invalid parameters401 Unauthorized: Missing or invalid API key authentication403 Forbidden: Insufficient permissions or customer ID mismatch404 Not Found: Resource does not exist409 Conflict: Resource conflict (e.g., duplicate extension number)429 Too Many Requests: Rate limit exceeded
Server Error Codes:
500 Internal Server Error: Unexpected server error
Generic Error Codes
VALIDATION_ERROR (400):
- Field validation failed (format, length, pattern)
- Required field missing
- Invalid enum value
INVALID_FILTER (400):
- RSQL filter syntax error
- Invalid field name in filter
- Malformed filter expression
INVALID_SORT (400):
- Sort expression format error
- Invalid field name for sorting
- Unsupported sort direction
INVALID_PAGE_SIZE (400):
- pageSize out of range (must be 1-1000)
FORBIDDEN (403):
- Insufficient permissions
- Customer ID mismatch (accessing another customer's resources)
NOT_FOUND (404):
- Resource does not exist
- Malformed resource ID
RATE_LIMIT_EXCEEDED (429):
- Too many requests in time window
- See Rate Limiting section for handling strategy
Common Error Scenarios
Scenario 1: Authentication Failure (401)
Request: Missing or invalid API key
GET /users
// x-api-key header missing or invalid
Response:
{
"status": 401,
"title": "Unauthorized",
"detail": "Valid authentication credentials required"
}
Resolution: Verify x-api-key header is present and contains valid API key. Regenerate key if expired.
Scenario 2: Authorization Failure (403)
Request: Valid API key but accessing another customer's resources
Response:
{
"status": 403,
"title": "Forbidden",
"detail": "Insufficient permissions to access this resource",
"errors": [
{
"code": "FORBIDDEN",
"message": "Customer ID mismatch"
}
]
}
Resolution: Verify you're accessing resources for the correct customer ID. Check API key permissions in Admin Console.
Scenario 3: Invalid RSQL Filter (400)
Request: Malformed filter syntax
GET /users?filter=status=active
Response:
{
"status": 400,
"title": "Invalid Filter",
"detail": "RSQL filter syntax is invalid",
"errors": [
{
"field": "filter",
"code": "INVALID_FILTER",
"message": "Use '==' for equality, not '='"
}
]
}
Resolution: Correct RSQL syntax: filter=basicInfo.status==ACTIVE
Scenario 4: Invalid Sort Expression (400)
Request: Unsupported sort field
GET /users?sort=invalidField
Response:
{
"status": 400,
"title": "Invalid Sort",
"detail": "Sort field is not supported",
"errors": [
{
"field": "sort",
"code": "INVALID_SORT",
"message": "Field 'invalidField' cannot be used for sorting"
}
]
}
Resolution: Use valid sortable field from API documentation with proper field path.
Scenario 5: Rate Limit Exceeded (429)
Request: Too many requests in short period
Response:
{
"status": 429,
"title": "Too Many Requests",
"detail": "Rate limit exceeded",
"errors": [
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Maximum 100 requests per minute exceeded"
}
]
}
Response Headers:
x-ratelimit-limit: 100
x-ratelimit-remaining: 0
x-ratelimit-reset: 1733073045
Resolution: Wait until x-ratelimit-reset time or implement exponential backoff (see Rate Limiting section).
Recovery Strategies
Transient Failures (429, 500):
- Implement exponential backoff: wait 1s, 2s, 4s, 8s, 16s between retries
- Maximum 5 retry attempts recommended
- Log failures for monitoring
- Check status page if widespread
Permanent Failures (400, 401, 403, 404, 409):
- Do not retry automatically
- Log error details with requestId/responseId
- Fix input data or configuration
- Alert administrators if unexpected
Validation Errors (400 with field-level errors):
- Review
errorsarray for specific field issues - Correct invalid field values
- Ensure required fields present
- Validate data types and formats
- Resubmit with corrected data
Code Example
Example: Comprehensive Error Handling (click to expand)
Rate Limiting
Administration APIs enforce rate limits to ensure fair usage and system stability. Understanding and respecting these limits is essential for reliable integrations.
Current Rate Limits
Per API Key:
- 100 requests per minute: Maximum sustained request rate
- 10 concurrent async operations: Maximum in-flight operations per organization
- Burst allowance: Up to 20 requests in 10-second window (for bursty workflows)
Note: Rate limits are subject to change. Monitor response headers for current values.
Rate Limit Headers
Every API response includes rate limit information in headers:
x-ratelimit-limit: 100
x-ratelimit-remaining: 87
x-ratelimit-reset: 1733073045
- x-ratelimit-limit: Maximum requests allowed in current window
- x-ratelimit-remaining: Requests remaining in current window
- x-ratelimit-reset: Unix timestamp when rate limit resets
Handling Rate Limits
Proactive Monitoring:
- Monitor
x-ratelimit-remainingheader in every response - Slow down requests when remaining count is low (< 10)
- Implement client-side throttling before hitting limit
Reactive Handling (429 Response):
- Stop sending requests immediately
- Parse
x-ratelimit-resetfrom response - Calculate wait time:
reset_time - current_time - Wait until reset time
- Resume with exponential backoff: 2s, 4s, 8s, 16s
Exponential Backoff Pattern:
Attempt 1: Wait 2 seconds
Attempt 2: Wait 4 seconds
Attempt 3: Wait 8 seconds
Attempt 4: Wait 16 seconds
Attempt 5: Wait 32 seconds
Maximum: Give up or wait for reset
Best Practices
Distribute Load:
- Spread requests evenly over time rather than bursting
- Use queuing on client side to control request rate
- For bulk operations, implement client-side throttling (e.g., 1 request per second)
Optimize Request Patterns:
- Use appropriate page sizes to reduce number of requests
- Filter results server-side rather than client-side
- Cache responses when data doesn't change frequently
- Batch updates in single requests where possible
Handle Limits Gracefully:
- Implement retry logic with exponential backoff
- Log rate limit events for monitoring
- Alert on repeated rate limiting (may indicate design issue)
- Consider request priority (delay non-critical requests)
Code Example
Example: Rate Limit Handling with Exponential Backoff (click to expand)
Best Practices
Understanding PUT Semantics
Administration APIs use PUT for updates, which requires the COMPLETE resource object. PUT operations are not partial updates.
Why This Matters:
- Omitted fields are interpreted as requests to remove that data
- Missing sections could delete critical configurations
- Partial submissions can cause unintended data loss
Correct Update Pattern:
- GET the complete current resource object
- ⚠️ Use the get one
GET /entity/{id}endpoint NOT the list/get allGET /entity endpointfor this as the payloads may be different.
- ⚠️ Use the get one
- Modify only the specific fields you want to change IN MEMORY
- PUT the entire modified object back
Never Do This (Partial PUT):
PUT /resources/{id}
{
"oneField": "newValue"
}
This will REMOVE, RESET and/or DEPROVISON all other resource attributes potentially resulting in loss of service and/or data.
Always Do This (Complete PUT):
GET /resources/{id} → Retrieve complete resource
Modify in memory → resource.section.field = "newValue"
PUT /resources/{id} with COMPLETE modified resource object
Performance Optimization
Concurrent Operations:
- Submit operations in parallel but limit concurrency (5-10 requests recommended)
- Monitor async operation queue depth
- Implement client-side rate limiting before hitting API limits
- Don't wait for one operation before starting next
Efficient Pagination:
- Choose appropriate page sizes based on use case:
- Real-time/Interactive: 50-100 items
- Bulk Export: 100-1000 items
- Memory Constrained: 25-50 items
- Process pages as they arrive (streaming) rather than buffering
- Don't restart scrolls unnecessarily (expensive server-side)
- Cache scroll IDs for resumable operations
Filtering Performance:
- Filter early and precisely to reduce data transfer
- Avoid overly complex RSQL expressions
- Test filters with small page sizes first
- Use indexed fields when possible (status, timestamps)
Async Operation Polling:
- Start with 1-2 second initial poll interval
- Increase interval with exponential backoff if operation is long-running
- Set maximum poll duration (5 minutes recommended)
- Most operations complete within 5-10 seconds
Caching Considerations:
- Cache relatively static data (sites, organizational structure)
- Use appropriate TTL based on update frequency (15-60 minutes typical)
- Invalidate cache on mutations
- Consider cache staleness acceptable for your use case
Security Best Practices
API Key Management:
- Storage: Use environment variables or secure vault systems (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)
- Never Hardcode: Don't embed keys in source code or configuration files
- Separation: Use separate keys for dev, staging, production environments
- Rotation: Rotate keys every 90 days as security best practice
- Revocation: Implement immediate key revocation procedures for compromised keys
- Monitoring: Monitor usage patterns for anomalies or suspicious activity
- Logging: Never log full API keys - log last 4 characters only
Data Protection:
- HTTPS Only: All requests must use HTTPS (HTTP will be rejected)
- SSL Validation: Validate SSL certificates in HTTP clients
- Sensitive Data: Don't log sensitive data (emails, phone numbers, addresses, names)
- Encryption at Rest: Implement encryption for data stored in your systems
- Data Retention: Follow data retention policies (typically 7+ years for audit)
- Compliance: Comply with applicable regulations (GDPR, CCPA, HIPAA if applicable)
Audit Logging:
- Mutation Operations: Log all create, update, delete operations with timestamps
- Operation IDs: Record operation IDs for traceability
- Resource Changes: Log resource IDs and affected fields (not sensitive values)
- Tamper-Proof: Implement tamper-proof audit trails
- Retention: Retain logs per compliance requirements (typically 7+ years)
- Monitoring: Monitor logs for security events and anomalies
Access Control:
- Least Privilege: Apply principle of least privilege for API keys
- Scope Limiting: Limit API key scope to required operations only
- Regular Review: Review and revoke unused API keys regularly
- Service Accounts: Use service accounts (not personal accounts) for API access
- IP Restrictions: Consider IP whitelisting if your infrastructure allows
Monitoring and Alerting:
- Log all API requests and responses (excluding credentials and sensitive data)
- Monitor for unusual patterns (spike in errors, unexpected deletes, off-hours access)
- Alert on authentication failures
- Track operation failure rates
- Set up notifications for rate limit events
Data Consistency
Handling Asynchronous Operations:
- Store operation IDs with source requests for correlation
- Implement idempotency for safe retries where possible
- Handle duplicate submissions gracefully
- Verify completion before proceeding to dependent operations
- Don't assume success - always check operation status
PUT Request Safety:
- Critical: PUT operations replace the entire resource - omitted fields may be set to null or default values
- Always retrieve the complete resource with GET before updating
- Modify only the fields you intend to change, preserving all others
- Validate the complete payload includes all required fields before sending PUT
- Example pitfall: Omitting
phoneNumberin a PUT request may delete the user's phone number even if you only intended to update their email - When updating a single field, consider if the API supports PATCH instead of PUT
- Test PUT operations in development with complete payloads to avoid data loss
Update Safety:
- Always GET complete resource before updating
- Never submit partial resource objects (unless API explicitly supports PATCH)
- Validate all required fields present after modification
- Consider optimistic locking for concurrent updates if available
- Verify updates completed successfully before proceeding
Error Recovery:
- Distinguish between transient and permanent failures
- Implement appropriate retry logic for transient failures
- Log all failures with sufficient detail for debugging
- Have rollback procedures for failed bulk operations
Troubleshooting
Authentication Issues
Problem: 401 Unauthorized errors
Debugging Steps:
-
Verify
x-api-keyheader is set correctly (case-sensitive) -
Check for whitespace or encoding issues in key value
-
Confirm API key hasn't been revoked in Admin Console
-
Test with curl to isolate client library issues:
curl -H "x-api-key: YOUR_KEY" \
-H "Accept: application/vnd.users.v1+json" \
https://api.8x8.com/admin-provisioning/users?pageSize=1 -
Regenerate API key if needed
Problem: 403 Forbidden despite valid key
Debugging Steps:
- Verify API key has required API products enabled
- Check account status in Admin Console
- Confirm accessing resources for correct customer organization
- Verify no IP restrictions blocking requests
- Contact support if issue persists
Pagination Issues
Problem: Inconsistent results between pages
Cause: Data changed during scroll, or filter was modified
Solution: Don't modify data or filters during active scroll. Start fresh scroll if data changed.
Problem: Duplicate resources across pages
Cause: Shouldn't occur with scroll-based pagination (report to support if seen)
Solution: File support ticket with scroll ID and example duplicates.
Async Operation Problems
Problem: Operation stuck in PENDING or IN_PROGRESS
Debugging Steps:
- Check if operation timeout exceeded (> 5 minutes) - may indicate system issue
- Verify no prior rate limiting (check for 429 responses)
- Check 8x8 status page for incidents
- Review operation details for error messages
- Contact support with operation ID if persists > 10 minutes
Problem: Operation fails with generic error
Debugging Steps:
- Check operation response
errorfield for details - Verify input data was valid (all required fields, correct formats)
- Test with minimal request (only required fields)
- Check for dependency issues (invalid IDs, missing prerequisites)
- Review requestId/responseId in error response for support escalation
Problem: Operation completes but resource not visible
Debugging Steps:
- Verify operation status is COMPLETED (not just IN_PROGRESS)
- Check resource status/state is as expected
- Clear Admin Console cache (hard refresh browser)
- Verify viewing correct organization/site filter
- Use GET directly with resource ID to confirm existence
Filter and Query Issues
Problem: RSQL filter returns no results unexpectedly
Debugging Steps:
- Test without filter to verify resources exist
- Simplify filter to one condition at a time
- Check field names match API exactly (case-sensitive for paths)
- Verify enum values match exactly (e.g.,
ACTIVEnotactive) - Use correct operators (
==for equality, not=) - Quote values with spaces:
department=='Research and Development'
Problem: "Invalid filter syntax" errors
Solutions:
- Check parentheses matching:
(condition1,condition2) - Use semicolon for AND:
status==ACTIVE;department==Engineering - Use comma for OR:
department==Engineering,department==Sales - Escape special characters if needed
- Refer to RSQL specification for complex queries
Problem: Sorting not working as expected
Solutions:
- Use correct field paths with + or - prefix:
+lastName(ascending) or-lastName(descending) - Verify field is sortable (not all fields support sorting)
- Test with single sort field first before combining
Performance Issues
Problem: Slow API responses
Debugging Steps:
- Check page size - large pages (500-1000) take longer
- Simplify complex RSQL filters
- Verify network latency (test from different locations)
- Check for high request concurrency (reduce parallel requests)
- Monitor rate limit headers for throttling
Problem: Timeouts during bulk operations
Solutions:
- Reduce concurrency (5-10 parallel requests maximum)
- Implement proper backoff between requests
- Break large batches into smaller chunks
- Monitor API status page during bulk operations
- Use async operations correctly (don't block waiting)
Support Resources
Documentation
API Documentation:
- 8x8 Admin Console
- Individual API OpenAPI Specifications (see each API guide)
Technical References:
- RSQL Specification
- RFC 7807 - Problem Details for HTTP APIs
- ISO 8601 Date Format
- E.164 Phone Number Format
Service Status
Getting Support
When to Contact Support:
- Operation stuck for > 10 minutes
- Repeated 500 errors
- Unexpected authentication/authorization failures
- Data inconsistencies or corruption
- Questions about API behavior or capabilities
Required Information When Contacting Support:
- Operation ID: For async operation issues
- Request ID and Response ID: From error response (requestId, responseId fields)
- Timestamp: Of the issue occurrence (UTC timezone)
- API Key: Last 4 characters only (never full key)
- Complete Error Response: Sanitize sensitive data, include all fields
- Steps to Reproduce: Detailed steps to replicate the issue
- Frequency: One-time, intermittent, or constant
- Environment: Development, staging, or production
- Recent Changes: Any recent changes to integration code
How to Contact Support:
- Admin Console: User profile menu → Contact Support
- For production-critical issues, mention "Production Critical" in subject
Before Contacting Support:
- Check 8x8 Status Page for known incidents
- Review this troubleshooting section
- Test with curl to isolate client library issues
- Verify API key permissions and status
- Collect logs and error responses with requestId/responseId
Version: 1.0 | Last Updated: January 16, 2026 | Applies to: All Administration API Suite APIs