Onboarding Guide (API V2)
0 people liked this article
Introduction to API V2
Welcome to API V2, our REST-based API designed for scalability, consistency, and long-term evolution. API V2 replaces the legacy GraphQL-based V1 and is the future-ready platform for all integrations.
Links:
Key principles:
- RESTful, resource-oriented design
- Predictable request/response structure
- Built-in pagination, filtering, and sorting
- Designed for performance and maintainability
⚠️ All new features and enhancements will be released exclusively on V2.
Access & Authentication
To start using API V2, you need:
- An active expereoOne user account with ‘Developer Portal (API)’ permission
- API client credentials
- Valid authentication token
Get an expereoOne user account
Refer to this page: Manage Your Account
Generate API Client Credentials
Refer to this page: How can I generate API credentials?
How to obtain an Access Token?
To authenticate, you must request a token from the authentication server using your API credentials.
Required Parameters
- Client_Id
- Client_Secret
- Scope
Example Request (Token Retrieval)
curl -X POST "<TOKEN_ENDPOINT_URL>" \-H "Content-Type: application/x-www-form-urlencoded" \-d "grant_type=client_credentials" \-d "client_id=<Client_Id>" \-d "client_secret=<Client_Secret>" \-d "scope=customerapi/basic.read"
Example Request with Authentication
curl -X GET "<BASE_URL>/v2/accounts" \-H "Authorization: Bearer <access_token>" \-H "Accept: application/json"
⚠️ Important Notes on Scopes
- Scopes define access boundaries for your application
- Scopes cannot be modified after API keys are created
- To change scopes: You must generate a new set of API credentials
Core Resources
The API is organized around the following domains. These resources follow consistent REST patterns for listing and retrieving data.
| API Clients | /v2/api-clients |
| Accounts | v2/accounts |
| Sites | /v2/sites |
| Services | /v2/services |
| Cases | /v2/cases |
| Invoices | /v2/invoices |
Relationships & Navigations
Common patterns:
- Parent - Child via path parameters
- IDs are required for navigation
You can traverse related data via nested endpoints:
- Account → Sites: /v2/accounts/{accountId}/sites
- Account → Services: /v2/accounts/{accountId}/services
- Sites → Services: /v2/sites/{siteId}/services
- Case → Messages: /v2/cases/{caseId}/case-messages
- Invoices → Invoice Line Details: /v2/invoices/{invoiceId}/invoice-line-details
Key Operations: Case Management
- Create Case: POST /v2/cases
- Update Case: PATCH /v2/cases/{caseId}
- Add Message: POST /v2/cases/{caseId}/case-messages
OpenAPI Specifications
You can obtain the OpenAPI specification straight from the portal. Go to the API tab and select the ‘OpenAPI Specification’ button to start the download.
HTTP Methods
- GET: Retrieve data
- POST: Create new resource
- PATCH: Update resource
- DELETE: Remove resource
First API Call (Step-by-Step)
This example retrieves a list of accounts.
Step 1 — Prepare Request
curl -X GET "<BASE_URL>/v2/accounts?page%5Boffset%5D=0&page%5Blimit%5D=25&sort=AccountId%2C-Name" \-H "Authorization: Bearer <access_token>" \-H "Accept: application/json"
Step 2 — Sample Response
{ "data": [ { "accountId": "string", "name": "string ", "legalName": “string ” } ], "metadata": { "offset": 0, "limit": 25, "hasMore": false, "total": null, "sort": ["AccountId", "-Name"] }, "links": { "self": "...", "next": null, "previous": null }}
Step 3 — Response Example
{ "data": [ { "accountId": "ACC-98000001", "name": " ACME Corporation HQ", "legalName": “ ACME Corporation HQ” } ], "metadata": { "offset": 0, "limit": 25, "hasMore": false, "total": 1, "sort": [ "AccountId", “-Name” ] }, "links": { "self": "<BASE_URL>/v2/accounts?page%5Boffset%5D=0&page%5Blimit%5D=25&sort=AccountId%2C-Name", "next": null, "previous": null }}
Step 4 — Understand the Response
- data: Actual resources
- metadata: Pagination and sorting info
- links: Navigation (next/previous pages)
Step 5 — Supports query parameters
- Pagination: page[offset], page[limit]
- Sorting: sort=AccountId,-Name
- Filtering: filter[Name]=Example
Rate Limits
To ensure performance, stability, and fair usage, API V2 enforces rate limits per authenticated client/user.
Rate Limit Overview
| Request Type | Limit |
| Read Requests (Sustained) | Approximately 3 requests per second |
| Read Requests (Burst) | Up to 50 requests in a short burst |
| Write Requests | Up to 30 requests per minute |
What Happens If You Exceed Limits?
If rate limits are exceeded, the API will return: 429 Too Many Requests. This indicates a temporary limit breach.
Important Notes
- Limits apply per authenticated client/user
- Limits are part of a fair-use policy
- Rate limits may be adjusted at any time to maintain platform stability
Status Codes
| 200 | Ok |
| 201 | Created |
| 204 | No Content |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 422 | Validation Failure |
| 500 | Internal Server Error |
Best Practices
Use Pagination for Large Datasets
- Default limit: 25
- Maximum limit: 200
- Use: ?page[offset]=0&page[limit]=25
Use Filtering to Reduce Payload Size
- Example: /v2/accounts?filter[Name]=ACME Corporation
Use Sorting for Predictable Results
- Example: /v2/accounts?sort=AccountId,-Name
Handle Pagination via Links
- Use the links.next field instead of manually constructing URLs.
Prepare for Future Evolution
- Avoid hardcoding assumptions about response structure
- Always use documented fields
- Plan for new fields to be added
Popular Articles
-
What is the Support process for managing and handling cases?
3 people say this guide was helpful
-
Where can I find the Reason for Outage (RFO) for an Incident Cases?
1 people say this guide was helpful
-
How to create a new case in expereoOne?
16 people say this guide was helpful
-
How to Add a New User in expereoOne?
1 people say this guide was helpful