Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/8x8-reporting-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: 8x8 Reporting Reporting API
contact:
name: 8x8 Inc
url: https://cpaas.8x8.com
email: cpaas-support@8x8.com
termsOfService: https://cpaas.8x8.com/sg/terms-and-conditions/
version: '1.0'
description: 'Operations tagged Reporting API across 4 of this provider''s published API definitions: 8x8-connect-business-messaging-api.json, 8x8-connect-sms-api.json, 8x8-connect-video-interaction-api.json, 8x8-connect-voice-v1-api.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://chatapps.8x8.com
description: Asia-Pacific region
- url: https://chatapps.us.8x8.com
description: North America region
- url: https://chatapps.8x8.uk
description: Europe region
- url: https://chatapps.8x8.id
description: Indonesia region
- url: https://sms.8x8.com
description: Asia-Pacific region
- url: https://sms.us.8x8.com
description: North America region
- url: https://sms.8x8.uk
description: Europe region
- url: https://sms.8x8.id
description: Indonesia region
- url: https://video-agent.8x8.com/
- url: https://voice.8x8.com
tags:
- name: Reporting API
paths:
/api/v1/subaccounts/{subAccountId}/messages/exports:
parameters:
- $ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1lon/parameters/0'
servers:
- url: https://chatapps.8x8.com
description: Asia-Pacific region
- url: https://chatapps.us.8x8.com
description: North America region
- url: https://chatapps.8x8.uk
description: Europe region
- url: https://chatapps.8x8.id
description: Indonesia region
post:
responses:
'202':
description: ''
content:
application/json:
schema:
type: object
properties:
jobId:
type: string
description: Identifier of the job started. Use this value to query job result.
required:
- jobId
examples:
response:
value:
jobId: F1T6z9C5tW2QV1pdMzO9xpMXrYEmfnvqORGqpePJGpgzjTJ80TSaZEE7aX2wrgix
summary: Start log export job
operationId: start-log-export-job-1
tags:
- Reporting API
security:
- apiKey: []
requestBody:
content:
application/json:
schema:
type: object
title: LogExportRequest
properties:
from:
type: string
format: date-time
description: "The values can be entered either as:\n\n- UTC date (`yyyy-MM-dd` format).\n- UTC timezone datetime, then the expected format is `yyyy-MM-ddTHH:mm:ssZ`\n- or as local timezone datetime, then the expected format is `yyyy-MM-ddTHH:mm:sszzz`\n\nThe API will automatically determine whether the datetime is UTC or local based on the format of the value. \nThe default value is UTC today - 7 days. \nThe value should less than value of `to` parameter. \n\nExample values:\n* `2020-07-01` Date without time\n* `2020-07-01T13:00:00` (UTC Time)\n* `2020-07-01T13:00:00+07:00` Datetime with timezone"
to:
type: string
format: date-time
description: "The values can be entered either as:\n\n- UTC date (`yyyy-MM-dd` format).\n- UTC timezone datetime, then the expected format is `yyyy-MM-ddTHH:mm:ssZ`\n- or as local timezone datetime, then the expected format is `yyyy-MM-ddTHH:mm:sszzz`\n\nThe API will automatically determine whether the datetime is UTC or local based on the format of the value. \nThe default value is today in UTC timezone. \nThe value should less than value of `to` parameter. \n\nExample values:\n* `2020-07-01` Date without time\n* `2020-07-01T13:00:00` (UTC Time)\n* `2020-07-01T13:00:00+07:00` Datetime with timezone"
phoneNumber:
type: string
description: Valid phone number in E.164 format.
example: '6511111111'
countries:
type: array
description: The list of two-letter ISO 3166 country codes that the message has been sent to
items:
type: string
minLength: 2
maxLength: 2
example: US
example:
- US
- SG
limit:
type: integer
description: 'You also need to define if you would like to limit the number of records to fetch using the parameter ***limit*** and an integer value
If you do not want to put a limit on the number of records to retrieve, setting ***limit*** to 0 allows to set is as unlimited.
- *NB: a longer time-span (eg: several months) and no limit on the records number will increase the time required to generate the logs file.*'
default: 0
channelUserId:
type: string
description: 'Channel user identifier. When provided, the export is filtered to messages associated with this user. For WhatsApp, this is the business-scoped user identifier (BSUID) and takes the format: ISO 3166 alpha-2 two-letter country code, followed by a period, followed by up to 128 alphanumeric characters (for example, `US.13491208655302741918`).'
example: US.13491208655302741918
x-examples:
application/json:
from: '2020-07-01'
to: '2020-08-01T13:15:00+08:00'
limit: 500000
channelUserId: US.13491208655302741918
description: '* Sending a **POST** request on this endpoint allows to **request an Messaging Apps logs file**.
## URL
The 8x8 Messaging Apps `subAccountId` needs to be provided in the URL as shown below:
`https://chatapps.8x8.com/api/v1/subaccounts/{subAccountID}/messages/exports`
*You must replace `{subAccountId}` in the URL above with the subaccountid that you want to use.*'
/api/v1/subaccounts/{subAccountId}/messages/exports/{jobId}:
parameters:
- $ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1lon/parameters/0'
- name: jobId
in: path
required: true
description: Export job identifier
schema:
type: string
servers:
- url: https://chatapps.8x8.com
description: Asia-Pacific region
- url: https://chatapps.us.8x8.com
description: North America region
- url: https://chatapps.8x8.uk
description: Europe region
- url: https://chatapps.8x8.id
description: Indonesia region
get:
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
properties:
status:
type: string
enum:
- queued
- running
- succeeded
- failed
- cancelled
- empty
- error
description: Job status
data:
type: array
description: 'The value presented in the response only when the status is "succeeded".
Array of links to download the report. Links are valid until the time defined by `expires` value.'
items:
type: string
expires:
type: string
description: 'The value presented in the response only when the status is "succeeded".
Contains the UTC datetime after which the report won''t be accessible anymore.'
example: '2020-07-01T06:58:41.74Z'
title: LogExportJobStatus
examples:
response:
value:
status: succeeded
data:
- https://chatapps.8x8.com/api/v1/subaccounts/your_subAccountId/messages/download/long-unique-token-here
expires: '2020-10-25T06:58:41.74Z'
'404':
description: ''
content:
application/json:
schema:
$ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1messages~1%7Bumid%7D/delete/responses/400/content/application~1json/schema'
examples:
response:
value:
code: 4018
message: Invalid jobId
errorId: aa400d4b-fffe-ea11-8277-00155d4ff7ed
timestamp: '2020-09-25T07:18:22.78Z'
summary: Get log export job result
operationId: get-log-export-job-result-1
tags:
- Reporting API
security:
- apiKey: []
description: "* Sending a **GET** request on this endpoint allows to **check the status of an Messaging Apps Logs export job** and to **get a download link** if its generation has succeeded.\n\n \n\n## URL\n\nTo define which SMS logs export you want to retrieve, you need to enter the Job ID generated by XXXXX in the path as well as the 8x8 SMS subaccountid you used in the previous request.\n`https://chatapps.8x8.com/api/v1/subaccounts/{subAccountID}/messages/exports/{jobId}`\n\n*You must replace `{jobID}` and `{subAccountId}` in the URL above with the jobID and subaccountid from the start SMS logs export job request*\n> To safeguard your privacy, sensitive data such as message content and phone numbers are masked by default. Access to this information can be requested by contacting our support team."
delete:
responses:
'204':
description: ''
'404':
description: ''
content:
application/json:
schema:
$ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1messages~1%7Bumid%7D/delete/responses/400/content/application~1json/schema'
examples:
response:
value:
code: 4018
message: Invalid jobId
errorId: aa400d4b-fffe-ea11-8277-00155d4ff7ed
timestamp: '2020-09-25T07:18:22.78Z'
summary: 'Cancel the log export job '
operationId: cancel-log-export-job-1
tags:
- Reporting API
security:
- apiKey: []
description: "* Sending a **DELETE** request on this endpoint allows to **cancel a Messaging Apps Logs export job**.\n\n \n\n## URL\n\nTo define which SMS logs export you want to retrieve, you need to enter the Job ID generated by XXXXX in the path as well as the 8x8 SMS subaccountid you used in the previous request.\n`https://chatapps.8x8.com/api/v1/subaccounts/{subAccountID}/messages/exports/{jobId}`\n\n*You must replace `{jobID}` and `{subAccountId}` in the URL above with the jobID and subaccountid from the start SMS logs export job request*"
/api/v1/subaccounts/{subAccountId}/messages/{umid}:
parameters:
- $ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1lon/parameters/0'
- name: umid
in: path
description: Unique message Id, generated by 8x8 API.
required: true
schema:
type: string
servers:
- url: https://chatapps.8x8.com
description: Asia-Pacific region
- url: https://chatapps.us.8x8.com
description: North America region
- url: https://chatapps.8x8.uk
description: Europe region
- url: https://chatapps.8x8.id
description: Indonesia region
get:
responses:
'200':
description: The success response returned with the message details of the message specified by the umid. Since channel fallback is supported, a single message umid may have multiple message details records depending on the number of channels attempted.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
umid:
type: string
description: Unique message ID automatically generated by 8x8.
example: dec02e44-c76f-4a0a-b69f-6ac2a4386eb9
subAccountId:
type: string
description: Sub account id with which the message is associated with.
channel:
type: string
description: Name of the channel used to send the message. Possible values are *SMS*, *WhatsApp*, *RCS*, *Viber*, *Line*, *Facebook*, *WeChat*, *Zalo* or *Kakao*.
example: WhatsApp
channelId:
type: string
description: Unique channel identifier. This property uniquely identifies the channel used to send the message when multiple channels of the same type are associated with one sub account.
example: 8e4d1303-5754-e911-8154-020897df5459
direction:
type: string
description: 'Direction of the message. Possible values are
- **outbound:** Mobile terminated.
- **inbound:** Mobile originated.'
example: outbound
country:
type: string
description: Two-letter ISO 3166 country code associated with the message.
example: SG
status:
title: MessageStatus
type: object
description: Delivery status of the message. Status contains the following information.
properties:
state:
type: string
description: "General status of the message. Possible values are\n- **unknown:** Status is not known. This is an exceptional/intermediate status. \n- **queued:** The request is accepted and queued for processing\n- **failed:** The request has been rejected by the api and will not be processed.\n- **sent:** The message has been sent to the operator and we have not received an acknowledgment yet.\n- **delivered:** Message has been delivered to destination and we have received confirmation from the operator.\n- **undelivered:** We have received a delivery receipt from the operator that the message was not delivered.\n- **read:** Message was delivered and read.\n- **ok:** Operation was successful\n- **error:** An error occurred during operation"
example: delivered
detail:
type: string
description: '- **delivered_to_operator**: The message has been delivered to the operator. Associated with **delivered** state
- **delivered_to_recipient**: The message has been delivered to the recipient. Associated with **delivered** state.
- **rejected_by_operator**: The message has been rejected by the operator. Associated with **undelivered** status.
- **undelivered_to_recipient**: The message has been delivered but rejected by the target device. Associated with **undelivered** state.'
example: delivered_to_carrier
errorCode:
type: integer
description: Error code for the operation
errorMessage:
type: string
description: Description of the error.
example: Invalid message length
timestamp:
type: string
description: Date and time when the status was observed expressed in ISO 8601 format.
example: '2020-06-17T04:17:21.06Z'
format: date-time
user:
type: object
description: Information about the user the message is associated with.
properties:
msisdn:
type: string
description: Phone number (obfuscated to protect sensitive information) expressed in E.164 international format.
example: +63922110xxxx
channelUserId:
type: string
description: Channel user identifier (obfuscated to protect sensitive data). For WhatsApp messages, this is the business-scoped user identifier (BSUID).
example: PH.26717025731320236
contentType:
type: string
example: Text
description: Content type of the message. Possible values are *Text*, *Audio*, *Video*, *Image*, *Location*, *File*, *Carousel*, *List*, *Buttons* or *Template*.
content:
type: string
example: '**MASKED**'
description: Message content (obfuscated to protect sensitive information).
createdAt:
type: string
description: 'Date and time the message was submitted to the api expressed in ISO 8601 format. '
example: '2020-06-17T04:17:21.06Z'
clientMessageId:
type: string
description: Client message identifier.
clientBatchId:
type: string
description: Client batch identifier.
batchId:
type: string
description: Universaly unique batch identifier (UUID).
example: c9c01382-38bf-4e27-8962-ae0684ab56c3
step:
type: integer
example: 1
description: Indicates the attempt on which the channel was used. For instance, a message delivery may be failed via *Viber* and a fallback channel like *WhatsApp* may be attempted next. In this case, step 1 will contain message details for *Viber* and step 2 will contain the message details for *WhatsApp*.
required:
- umid
- subAccountId
- channel
- channelId
- direction
- status
- contentType
- createdAt
- step
required:
- data
examples:
response:
value:
data:
- umid: dec02e44-c76f-4a0a-b69f-6ac2a4386eb9
subAccountId: sub_account_id
channel: WhatsApp
channelId: 904d1303-5754-e911-8154-020897df5459
direction: Outbound
status:
state: read
timestamp: '2020-06-17T04:25:21.06Z'
contentType: Text
createdAt: '2020-06-17T04:15:21.06Z'
step: 2
country: SG
user:
msisdn: +63922110xxxx
channelUserId: PH.26717025731320236
content: '**MASKED**'
clientMessageId: client message id
clientBatchId: client batch id
batchId: c9c01382-38bf-4e27-8962-ae0684ab56c3
'400':
$ref: '#/paths/~1api~1v1~1accounts~1%7BaccountId%7D~1webhooks/get/responses/400'
'401':
$ref: '#/paths/~1api~1v1~1accounts~1%7BaccountId%7D~1webhooks/get/responses/401'
'404':
$ref: '#/paths/~1files~1%7Bfilename%7D/get/responses/404'
'429':
description: Rate limiting quota exceeded error
content:
application/json:
schema:
$ref: '#/paths/~1api~1v1~1subaccounts~1%7BsubAccountId%7D~1messages~1%7Bumid%7D/delete/responses/400/content/application~1json/schema'
example:
code: 429
message: Quota exceeded. Please try again in 1 second(s).
errorId: c8a41b47-57bf-ea11-8273-00155d466a31
timestamp: '2020-07-06T07:07:00.30Z'
tags:
- Reporting API
summary: Retrieve message details
description: 'This resource can be used to query message details like delivery status using the UMID of the message. You need to specify the sub account id and the umid of the message in place of *{subAccountId}* and *{umid}* respectively. *umid* is the unique identifier (in the form of a uuid) you received when you submitted the message to the api.
### API Rate Limiting
To protect the platform from being overloaded and maintain a high quality of service to all customers, we enforce API rate limits for this API endpoint.
The limit is set to 1 request/second per subaccount.
> To safeguard your privacy, sensitive data such as message content and phone numbers are masked by default. Access to this information can be requested by contacting our support team.'
operationId: get-chatapps-message-details
security:
- apiKey: []
/api/v1/accounts/{accountId}/usage/messages:
servers:
- url: https://chatapps.8x8.com
description: Asia-Pacific region
- url: https://chatapps.us.8x8.com
description: North America region
- url: https://chatapps.8x8.uk
description: Europe region
- url: https://chatapps.8x8.id
description: Indonesia region
get:
operationId: get-message-usage
summary: Get message usage
description: 'Returns monthly per-message usage totals for the specified billing period. Results can be filtered and grouped by subaccount, business account, channel, pricing category, and destination country.
Currently, only WhatsApp is supported.
**Constraints:**
- Data is available from **February 2026** onwards
- Only **closed billing periods** can be queried
- Maximum lookback: **6 months**
**Grouping behavior:**
- If `groupBy` is omitted, a single aggregated total is returned
- `pricing` is included when `groupBy` contains `channel`, `businessAccountId`, `pricingCategory`, and `country`'
tags:
- Reporting API
parameters:
- name: accountId
in: path
required: true
description: You must replace *{accountId}* with the account ID that you want to use.
schema:
type: string
- name: billingPeriod
in: query
required: true
description: The billing month to query, in `YYYY-MM` format (e.g. `2026-03`). Must be a closed billing period from February 2026 or later. Maximum lookback is 6 months.
schema:
type: string
pattern: ^\d{4}-(0[1-9]|1[0-2])$
example: 2026-03
- name: channel
in: query
required: false
description: Filter results by messaging channel. Currently, only `whatsapp` is supported. Defaults to `whatsapp` if omitted.
schema:
type: string
enum:
- whatsapp
example: whatsapp
- name: groupBy
in: query
required: false
description: 'Comma-separated list of dimensions to group results by. When omitted, a single aggregated total is returned. `pricing` is included when `groupBy` contains `channel`, `businessAccountId`, `pricingCategory`, and `country`.
Available values: `subAccountId`, `channel`, `businessAccountId`, `pricingCategory`, `country`.'
schema:
type: string
example: subAccountId,channel,businessAccountId,pricingCategory,country
responses:
'200':
description: Successful response containing message usage data.
content:
application/json:
schema:
type: object
properties:
data:
type: array
description: List of usage records, grouped according to the `groupBy` parameter.
items:
type: object
properties:
subAccountId:
type: string
description: Sub-account identifier. Present when `subAccountId` is included in `groupBy`.
example: umsg_AGG001
channel:
type: string
enum:
- whatsapp
description: Messaging channel. Present when `channel` is included in `groupBy`.
example: whatsapp
country:
type: string
description: ISO 3166-1 alpha-2 destination country code. Present when `country` is included in `groupBy`.
example: IN
businessAccountId:
type: string
description: Business account identifier associated with the messaging provider. For WhatsApp, this represents the WhatsApp Business Account (WABA) ID. Present when `businessAccountId` is included in `groupBy`.
example: 120xx01234567890
pricingCategory:
type: string
description: 'Message pricing category. For WhatsApp: `utility`, `marketing`, `authentication`, `authentication_international`, `service`. Present when `pricingCategory` is included in `groupBy`.'
example: utility
volume:
type: object
description: Message volume breakdown.
properties:
delivered:
type: integer
description: Total number of delivered messages.
example: 479100
charged:
type: integer
description: Number of messages that were charged.
example: 437900
free:
type: integer
description: Number of messages delivered at no charge.
example: 41200
pricing:
type: object
description: Pricing structure. Present when `groupBy` includes `channel`, `businessAccountId`, `pricingCategory`, and `country`.
properties:
rateModel:
type: string
enum:
- flat
- tiered
description: The pricing rate model applied to this combination.
example: tiered
tiers:
type: array
description: Tier breakdown. Only present when `rateModel` is `tiered`.
items:
type: object
properties:
from:
type: integer
description: Lower bound of this tier (inclusive).
example: 0
to:
type: integer
description: Upper bound of this tier (inclusive). `null` indicates an openended bracket with no upper limit.
example: 250000
quantity:
type: integer
description: Number of messages that fall within this tier.
example: 250000
status:
type: string
enum:
- completed
description: Indicates the tier was fully settled. Always `completed` since only closed billing periods can be queried.
example: completed
meta:
type: object
description: Metadata about the request and result set.
properties:
accountId:
type: string
description: The account ID used in the request.
example: bp-xxx
billingPeriod:
type: object
properties:
start:
type: string
format: date
description: Start date of the billing period.
example: '2026-03-01'
end:
type: string
format: date
description: End date of the billing period.
example: '2026-03-31'
status:
type: string
enum:
- closed
description: The billing period status. Always `closed` since only closed billing periods can be queried.
example: closed
dataAsOf:
type: string
format: date-time
description: Timestamp the final data snapshot for this billing period.
example: '2026-03-16T12:00:00Z'
groupBy:
type: array
description: The `groupBy` dimensions applied to this query.
items:
type: string
example:
- subAccountId
- channel
- businessAccountId
- pricingCategory
- country
currency:
type: string
description: Currency used for pricing amounts (ISO 4217 code).
example: USD
examples:
full-groupby:
summary: Response with full groupBy (includes pricing)
value:
data:
- subAccountId: umsg_AGG001
channel: whatsapp
country: IN
businessAccountId: 120xx01234567890
pricingCategory: utility
volume:
delivered: 479100
charged: 437900
free: 41200
pricing:
rateModel: tiered
tiers:
- from: 0
to: 250000
quantity: 250000
status: completed
- from: 250001
# --- truncated at 32 KB (67 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/8x8/refs/heads/main/openapi/8x8-reporting-api-api-openapi.yml