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/hubble-network:hubble-network-platform-metrics-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Hubble Platform Platform Metrics API
description: 'The Hubble platform is built API-first. Use our Cloud API to manage your devices
and access device data programmatically. We''ve designed our API following RESTful principles. Each endpoint returns standard HTTP status codes and may include JSON payloads. ---
## API Access
Use API Keys to authenticate with the Hubble Cloud API for your organization. ### Generate an API Key
Log in to your Hubble dashboard. Navigate to **Developer Tools > API Tokens** to create a new API Key. Provide a name for the token, and set an appropriate expiration date for temporary access. ### Organization ID
You will need `org_id` to make API requests. From your Hubble dashboard, navigate to
**Developer Tooks > API Tokens**, or **Organization Settings**, to find your Organization ID. ### Authorization Scopes
API endpoints require specific authorization scopes to perform the intended operation. **Required Scope** is always provided in the API documentation. API Keys can be created with specific authorization scopes that control what operations the key can perform. If no scopes are specified, the key will be created with all available scopes (admin-level access). | **Scope** | **Access** |
|------------------------------|-------------------------------------------------|
| **read-api-keys** | View API keys and their metadata |
| **write-api-keys** | Create, update, and delete API keys |
| **read-users** | View user information and roles |
| **write-users** | Add, update, and remove users from the organization |
| **read-organization-metadata** | View organization details and settings |
| **write-organization-metadata** | Update organization information |
| **read-devices** | View device information and status |
| **write-devices** | Register and manage devices |
| **read-invitations** | View pending invitations |
| **write-invitations** | Create and revoke user invitations |
| **read-packets** | Access packet data and retrieval endpoints |
| **read-platform-metrics** | View platform metrics and analytics |
| **read-billing-usage** | View billing usage information |
| **read-billing-invoices** | View billing invoices |
| **read-webhooks** | View webhook configurations |
| **write-webhooks** | Create and manage webhook endpoints |
| **read-satellites** | View satellite ephemeris and pass data |
**Example Scope Combinations**
- Create a key with read-only access: `["read-api-keys", "read-users", "read-devices"]`
- Create a key for device management: `["read-devices", "write-devices"]`
- Create a key for user management: `["read-users", "write-users", "read-invitations", "write-invitations"]`
**Best Practices for Data Security**
- Create keys with the minimum required scopes for your use case
- Regularly review and rotate API keys
- Use descriptive names for your keys to track their purpose
- Set appropriate expiration dates for temporary access
---
## Import API Definition
You can quickly import the Hubble Cloud API into your preferred developer environment (such as Postman or Insomnia) using our **public OpenAPI definition**. Simply download or import the YAML file directly:
https://hubble.com/docs/openapi.yaml
---
## Pagination
When the number of objects requested exceeds the maximum page size for an endpoint, the API response will be paginated. This means you will receive a subset of the total results, along with a `Continuation-Token` in the Response Header that can be used to fetch subsequent subsets. To retrieve the next set of data, you must use the provided `Continuation-Token` in the Request Header of your next API call to the same endpoint. Continue using the provided token in each successive request until no `Continuation-Token` is returned, which indicates you have retrieved all available data. ---
## Rate Limits
The Hubble Cloud API follows a leaky bucket approach to rate limiting. Endpoints are rate limited to three (3) requests per second. Your organization is limited to a total of 15 requests per second.'
version: 1.0.0
servers:
- url: https://api.hubble.com
description: Production
security:
- BearerAuth: []
tags:
- name: Platform Metrics
paths:
/v1/org/{org_id}/api_metrics:
get:
tags:
- Platform Metrics
operationId: get-api-metrics
x-criticality: medium
summary: Get Organization API Metrics
description: 'Retrieves API request metrics including total requests, success rate, and time interval-based breakdowns.
**Required Scope:** `read-platform-metrics`'
parameters:
- $ref: '#/components/parameters/orgIdPathParam'
- $ref: '#/components/parameters/metricsDaysBackQueryParam'
- $ref: '#/components/parameters/metricsTimeIntervalQueryParam'
responses:
'200':
description: Successfully retrieved API metrics
content:
application/json:
schema:
type: object
properties:
total_requests:
type: integer
description: Total number of API requests in the time period
success_rate:
$ref: '#/components/schemas/metricsSuccessRate'
buckets:
type: array
description: A breakdown of metrics per time_interval
items:
type: object
properties:
timestamp:
type: string
format: date-time
description: Start of the interval in ISO 8601 format
total_requests:
type: integer
description: Number of requests in this time_interval
success_rate:
$ref: '#/components/schemas/metricsSuccessRate'
'400':
$ref: '#/components/responses/ErrorBadRequest'
'500':
$ref: '#/components/responses/ErrorInternalServer'
/v1/org/{org_id}/packet_metrics:
get:
tags:
- Platform Metrics
operationId: get-packet-metrics
x-criticality: medium
summary: Get Organization Packet Metrics
description: 'Retrieves packet metrics across a time range providing totals and time interval-based breakdowns.
**Required Scope:** `read-platform-metrics`'
parameters:
- $ref: '#/components/parameters/orgIdPathParam'
- $ref: '#/components/parameters/metricsDaysBackQueryParam'
- $ref: '#/components/parameters/metricsTimeIntervalQueryParam'
responses:
'200':
description: Successfully retrieved packet metrics
content:
application/json:
schema:
type: object
properties:
total_packets:
type: integer
description: Total number of packets in the time period
buckets:
type: array
description: A breakdown of packet metrics per time_interval
items:
type: object
properties:
timestamp:
$ref: '#/components/schemas/formattedTimestamp'
total_packets:
type: integer
description: Number of packets in this time_interval
'400':
$ref: '#/components/responses/ErrorBadRequest'
'500':
$ref: '#/components/responses/ErrorInternalServer'
/v1/org/{org_id}/webhook_metrics:
get:
tags:
- Platform Metrics
operationId: get-webhook-metrics
x-criticality: medium
summary: Get Organization Webhook Metrics
description: 'Retrieves webhook metrics including total requests, success rate, and time interval-based breakdowns for webhook events.
**Required Scope:** `read-platform-metrics`'
parameters:
- $ref: '#/components/parameters/orgIdPathParam'
- $ref: '#/components/parameters/metricsDaysBackQueryParam'
- $ref: '#/components/parameters/metricsTimeIntervalQueryParam'
responses:
'200':
description: Successfully retrieved webhook metrics
content:
application/json:
schema:
type: object
properties:
total_requests:
type: integer
description: Total number of webhook requests in the time period
success_rate:
$ref: '#/components/schemas/metricsSuccessRate'
buckets:
type: array
description: A breakdown of webhook metrics per time_interval
items:
type: object
properties:
timestamp:
$ref: '#/components/schemas/formattedTimestamp'
total_requests:
type: integer
description: Number of webhook requests in this time_interval
success_rate:
$ref: '#/components/schemas/metricsSuccessRate'
'400':
$ref: '#/components/responses/ErrorBadRequest'
'500':
$ref: '#/components/responses/ErrorInternalServer'
/v1/org/{org_id}/device_metrics:
get:
tags:
- Platform Metrics
operationId: get-device-metrics
x-criticality: medium
summary: Get Organization Device Metrics
description: 'Retrieves metrics for active, never active, and total registered devices over time.
### Most Recent/Partial Bucket
The most recent bucket, the partial bucket, is not calculated on this endpoint except for when using the hourly time interval.
For parsing/syntax consistency, this bucket is still returned with a timestamp and empty values for the active, registered, and never active devices values.
**Required Scope:** `read-platform-metrics`'
parameters:
- $ref: '#/components/parameters/orgIdPathParam'
- $ref: '#/components/parameters/metricsDaysBackQueryParam'
- $ref: '#/components/parameters/metricsTimeIntervalQueryParam'
responses:
'200':
description: Successfully retrieved device metrics
content:
application/json:
schema:
type: object
properties:
buckets:
type: array
description: A breakdown of device metrics per time_interval
items:
type: object
properties:
timestamp:
$ref: '#/components/schemas/formattedTimestamp'
registered_devices:
type: integer
description: 'The total number of registered devices at the end of this interval.
'
active_devices:
type: number
description: 'The number of active devices during this interval.
Active devices are those that have successfully transmitted a packet.
Because of the ingestion delays, recent windows metrics may still be accumulating new active devices.
'
never_active_devices:
type: number
description: 'The number of never active devices during this interval.
Never active devices are devices registered to your organization awaiting first transmission.
'
total_active_devices:
type: number
description: 'The total number of active devices across the queried time range.
Active devices are those that have successfully transmitted a packet.
'
total_registered_devices:
type: number
description: 'The total number of devices registered for the organization.
'
total_never_active_devices:
type: number
description: 'The total number of never active devices across the queried time range.
Never active devices are devices registered to your organization awaiting first transmission.
'
'400':
$ref: '#/components/responses/ErrorBadRequest'
'500':
$ref: '#/components/responses/ErrorInternalServer'
components:
schemas:
orgId:
type: string
format: uuid
description: The ID for an organization
formattedTimestamp:
type: string
format: date-time
description: "Start of the bucket in ISO 8601 format.\nFor example: `2025-04-25T14:01:54Z`. \n"
errorResponse:
type: object
properties:
code:
type: integer
description: The HTTP status code
description:
type: string
description: 'A description for the error.
For user errors, we attempt to be as descriptive as possible to help with diagnosing the issue.
For internal errors, the error description is only indicates that a retry should occur but we log the full error so that we can diagnose it.
Error descriptions can change over time and should not be programmed against.
'
name:
type: string
enum:
- Bad Request
- Unauthorized
- Not Found
- Request Entity Too Large
- Too Many Requests
- Internal Server Error
description: '`name` is a short name for the error.
'
metricsSuccessRate:
type: number
format: float
description: "Success rate of requests (0-1). \nWhen total requests is 0, the success rate defaults to 1.0 or 100%.\n"
parameters:
metricsDaysBackQueryParam:
name: days
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 365
default: 1
description: 'The number of days of metrics to include in the request.
The maximum value is further restricted when small `time_interval` values are used.
The maximum number of total metric buckets is 365.
'
orgIdPathParam:
name: org_id
in: path
required: true
schema:
$ref: '#/components/schemas/orgId'
description: Your organization ID
metricsTimeIntervalQueryParam:
name: time_interval
in: query
required: false
schema:
type: string
enum:
- hour
- day
- month
description: "The time interval for the metric buckets.\nIf not provided, a default value is selected based on the `days` parameter:\n\n| days | time_interval |\n| ----------- | ------------- |\n| [1 => 1) | hour |\n| [2 => 31] | day |\n| [32 => 365] | month |\n\n**Partial buckets:** The most recent bucket of metrics is a \"partial\" bucket depending on the interval - partial because it doesn't span a full time_interval yet. \n(e.g. 10:00pm -> 10:36pm for `hour`, June 3rd 12:00am -> June 3rd 10:36pm for `day`, June 1st 12:00am -> June 3rd 10:36pm for `month`).\nThe older buckets are always \"complete\" buckets.\n(e.g. 09:00pm -> 10:00pm for `hour`, June 2nd 12:00am -> June 3rd 12:00am for `day`, May 1st 12:00am -> June 1st 12:00am for `month`).\n\n**Edge cases:** If `days` is not large enough to include a full `month` bucket, days is increased in the backend. \nFor example, querying days=90 with a `month` time_interval on June 13th, 2025 will return \"complete\" March, April, and May buckets and a \"partial\" June bucket.\nSimilarly, when querying for days=7 with a `day` time_interval on June 13th, 2025 at 6:00am will return \"complete\" June 6th, 7th, 8th, 9th, 10th, 11th, and 12th buckets and a \"partial\" June 13th bucket.\n"
responses:
ErrorBadRequest:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/errorResponse'
example:
code: 400
description: The request could not be understood by the server due to malformed syntax.
name: Bad Request
ErrorInternalServer:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/errorResponse'
example:
code: 500
description: An unknown error has occurred.
name: Unknown
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
x-provenance:
method: harvested
publisher: Hubble Network
source: https://hubble.com/docs/openapi.yaml
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)