# Integrations
Connected providers and messaging apps. Read only: credentials are managed in the app.
**Common tasks**
- [List connected providers](#get-organizations-organization-integrations)
**Only in the app:** Connecting, reconnecting and removing providers and their credentials.
**How it works in the app:** [help article](https://infranest.io/docs/integrations).
**Scopes:** Read with `cloud.read` or `monitoring.read`. See [Tokens and scopes](../tokens-and-scopes.md#scopes).
[Integrations](#integrations) 5 · [Provider credentials](#provider-credentials) 4 · [Webhook endpoints](#webhook-endpoints) 1
Every endpoint below takes a token in the `Authorization: Bearer` header and answers JSON. Errors use the shared format in [Errors](../errors.md). Base address: `https://api.infranest.io/api`.
## Integrations
### List connected integrations {#get-organizations-organization-integrations}
`GET` `/organizations/{organization}/integrations`
**Scope:** `cloud.read` · **Changes data:** no
Everything the organization has connected — cloud, DNS, registrar and certificate accounts, alert destinations, outbound webhooks, automation connections and calendars — each with its status and health. Also returns summary counts and the integrations your plan does not include (`locks`).
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/integrations" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"connections": [
{
"id": 1,
"kind": "provider",
"provider": "hetzner",
"integration_key": "hetzner",
"name": "Hetzner — Production",
"categories": [
"cloud",
"dns"
],
"capabilities": [
"cloud",
"dns"
],
"counts": {
"servers": 6,
"zones": 2,
"domains": 0,
"certs": 1
},
"suspended_capabilities": [],
"incident": null,
"auth_kind": "api_token",
"enabled": true,
"status": "connected",
"locked": false,
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 97,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
},
"rate_limited": null,
"last_activity_at": "2026-01-15T12:00:00Z"
},
{
"id": 2,
"kind": "provider",
"provider": "cloudflare",
"integration_key": "cloudflare",
"name": "Cloudflare DNS",
"categories": [
"dns",
"domains"
],
"capabilities": [
"dns",
"registrar"
],
"counts": {
"servers": 0,
"zones": 5,
"domains": 0,
"certs": 1
},
"suspended_capabilities": [],
"incident": null,
"auth_kind": "api_token",
"enabled": true,
"status": "connected",
"locked": false,
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 49,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
},
"rate_limited": null,
"last_activity_at": "2026-01-15T12:00:00Z"
}
],
"summary": {
"total": 22,
"connected": 16,
"degraded": 3,
"failing": 2,
"disabled": 1,
"issues": 5,
"locked": 0
},
"locks": []
}
```
---
### Get an integration {#get-organizations-organization-integrations-provider}
`GET` `/organizations/{organization}/integrations/{provider}`
**Scope:** `cloud.read` · **Changes data:** no
What the integration offers, the organization’s connections to it, and whether your plan allows connecting it. Returns 404 for an unknown integration.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `provider`
path · required | string | The provider. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/integrations/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"provider": {
"key": "hetzner",
"label": "Hetzner",
"logo": "hetzner",
"capabilities": [
"cloud",
"dns"
],
"categories": [
"cloud",
"dns"
],
"dns_scope": "any",
"features": [
"zone_discovery",
"record_ids"
],
"environments": [],
"oauth": false,
"one_click": false,
"needs_allowlist": false,
"featured": true,
"premium": false,
"min_plan": null,
"max_connections": null,
"credentials": [
{
"key": "api_token",
"label": "integrations.providers.hetzner.apiToken.label",
"secret": true,
"multiline": false,
"help": "integrations.providers.hetzner.apiToken.help",
"help_params": {
"aws_account_id": "InfraNest's AWS account (set AWS_INFRANEST_ACCOUNT_ID)"
},
"placeholder": "LRK9mXv2QpT8sYw4…",
"prefill": null,
"type": "text",
"options": null,
"depends_on": null,
"show_when": null,
"default": null
}
],
"kind": "provider",
"content": null
},
"connections": [
{
"id": 1,
"kind": "provider",
"provider": "hetzner",
"integration_key": "hetzner",
"name": "Hetzner — Production",
"categories": [
"cloud",
"dns"
],
"capabilities": [
"cloud",
"dns"
],
"counts": {
"servers": 6,
"zones": 2,
"domains": 0,
"certs": 1
},
"suspended_capabilities": [],
"incident": null,
"auth_kind": "api_token",
"enabled": true,
"status": "connected",
"locked": false,
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 97,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
},
"rate_limited": null,
"last_activity_at": "2026-01-15T12:00:00Z"
}
],
"gate": {
"locked": false,
"reason": null,
"premium": false,
"min_plan": null,
"min_plan_name": null,
"current_plan": "pro",
"current_plan_name": "Pro",
"max_connections": null,
"used": 1,
"grandfathered": false,
"included": false
}
}
```
---
### Get an integration account {#get-organizations-organization-integrations-provider-accounts-id}
`GET` `/organizations/{organization}/integrations/{provider}/accounts/{id}`
**Scope:** `cloud.read` · **Changes data:** no
One connected account of an integration, whatever kind it is, with its status and health. Returns 404 when the account does not exist or does not belong to this integration and organization.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `provider`
path · required | string | The provider. |
| `id`
path · required | integer | The id's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/integrations/1/accounts/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"provider": "hetzner",
"label": "Hetzner — Production",
"enabled": true,
"removing": false,
"is_oauth": false,
"auth_kind": "api_token",
"oauth": null,
"error_email_enabled": true,
"alerts_muted_until": null,
"incident": null,
"notices": [],
"spending": null,
"capabilities": [
"cloud",
"dns"
],
"supported_capabilities": [
"cloud",
"dns"
],
"cloud_capabilities": {
"native_delete_protection": true,
"server_destroy": true,
"server_destroy_is_cancellation": false,
"server_create": true,
"server_rename": true,
"console": true,
"snapshots": true,
"backups": true,
"isos": true,
"rescue": true,
"placement_groups": true,
"public_network_toggle": true,
"scheduled_backups": true,
"private_networks": true,
"private_network_attach": true,
"network_join_on_create": false,
"network_attach_ip_choice": true,
"private_network_unfiltered": true,
"floating_ips": true,
"networks_creatable": true,
"network_cidr": true,
"network_subnets": true,
"network_routes": true,
"network_rename": true,
"network_ip_range_extendable": true,
"firewalls_creatable": true,
"firewall_multi_server": true,
"firewall_renamable": true,
"firewall_outbound": true,
"firewall_ipv6": true,
"firewall_dynamic_ip": true,
"server_firewall": false,
"load_balancers_creatable": true,
"load_balancer_rename": true,
"load_balancer_algorithm": true,
"load_balancer_services": true,
"load_balancer_targets": true,
"volumes_creatable": true,
"volume_resize": true,
"volume_rename": true,
"volume_native_delete_protection": true,
"network_native_delete_protection": true,
"user_data": true,
"install_flavour": false,
"images_per_plan": false,
"metrics": true,
"metrics_disk_throughput": true,
"rdns_subnet": true,
"rdns_address_list": false,
"reverse_dns": true,
"snapshot_description": true,
"snapshot_protection": true
},
"dns_capabilities": {
"record_writes": true,
"bulk_replace": false,
"zone_create": true,
"zone_delete": true,
"record_proxying": false,
"signing": false
},
"dns_scope": "any",
"cloud_firewall_protocols": [
"tcp",
"udp"
],
"enabled_capabilities": null,
"suspended_capabilities": [],
"resource_counts": {
"dns": 2,
"certificates": 1,
"cloud": 6
},
"verified_at": "2025-10-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"fields": [
"api_token"
],
"environment": null,
"field_values": {
"api_token": {
"set": true,
"secret": true,
"display": "••••oken"
}
},
"context": [],
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 97,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
},
"registrar_operations": null,
"scope_check": null,
"scope_checked_at": null,
"disabled_operations": [],
"api_base": "/organizations/1/provider-credentials/1"
}
```
---
### List integration activity {#get-organizations-organization-integrations-provider-activity}
`GET` `/organizations/{organization}/integrations/{provider}/activity`
**Scope:** `cloud.read` · **Changes data:** no
The calls made to and received from this integration, newest first, paginated with `per_page` (5 to 100, default 20). Filter with `status` (`success` or `error`), `capability`, `direction`, `credential_id` and `search`; `meta` lists the accounts and filter values available.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `provider`
path · required | string | The provider. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/integrations/1/activity" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"data": [
{
"id": 9,
"credential_id": 1,
"capability": "cloud",
"direction": "outbound",
"method": "GET",
"endpoint": "/v1/servers",
"action": "listServers",
"success": true,
"http_status": 200,
"duration_ms": 60,
"error_type": null,
"error_message": null,
"created_at": "2026-01-15T12:00:00.000000Z"
},
{
"id": 10,
"credential_id": 1,
"capability": "cloud",
"direction": "outbound",
"method": "GET",
"endpoint": "/v1/volumes",
"action": "listVolumes",
"success": true,
"http_status": 200,
"duration_ms": 112,
"error_type": null,
"error_message": null,
"created_at": "2026-01-15T11:57:00.000000Z"
}
],
"total": 672,
"last_page": 34,
"meta": {
"accounts": [
{
"id": 1,
"label": "Hetzner — Production",
"context": []
}
],
"capabilities": [
"cloud"
],
"directions": [
"outbound"
],
"rate_limit": null
}
}
```
---
### Export integration activity as CSV {#get-organizations-organization-integrations-provider-activity-export}
`GET` `/organizations/{organization}/integrations/{provider}/activity/export`
**Scope:** `cloud.read` · **Changes data:** no
Downloads every call logged for this integration as a CSV file, newest first. Takes the same `status`, `capability`, `direction`, `credential_id` and `search` filters as the activity list.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `provider`
path · required | string | The provider. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/integrations/1/activity/export" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200 — The integration's activity log as CSV. (`text/csv`)
## Provider credentials
### List provider accounts {#get-organizations-organization-provider-credentials}
`GET` `/organizations/{organization}/provider-credentials`
**Scope:** `cloud.read` · **Changes data:** no
Every connected cloud, DNS, registrar and certificate account, with its health and how many zones, domains, certificates and servers it holds.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/provider-credentials" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"provider": "hetzner",
"label": "Hetzner — Production",
"enabled": true,
"removing": false,
"is_oauth": false,
"auth_kind": "api_token",
"oauth": null,
"error_email_enabled": true,
"alerts_muted_until": null,
"incident": null,
"notices": [],
"spending": null,
"capabilities": [
"cloud",
"dns"
],
"supported_capabilities": [
"cloud",
"dns"
],
"cloud_capabilities": {
"native_delete_protection": true,
"server_destroy": true,
"server_destroy_is_cancellation": false,
"server_create": true,
"server_rename": true,
"console": true,
"snapshots": true,
"backups": true,
"isos": true,
"rescue": true,
"placement_groups": true,
"public_network_toggle": true,
"scheduled_backups": true,
"private_networks": true,
"private_network_attach": true,
"network_join_on_create": false,
"network_attach_ip_choice": true,
"private_network_unfiltered": true,
"floating_ips": true,
"networks_creatable": true,
"network_cidr": true,
"network_subnets": true,
"network_routes": true,
"network_rename": true,
"network_ip_range_extendable": true,
"firewalls_creatable": true,
"firewall_multi_server": true,
"firewall_renamable": true,
"firewall_outbound": true,
"firewall_ipv6": true,
"firewall_dynamic_ip": true,
"server_firewall": false,
"load_balancers_creatable": true,
"load_balancer_rename": true,
"load_balancer_algorithm": true,
"load_balancer_services": true,
"load_balancer_targets": true,
"volumes_creatable": true,
"volume_resize": true,
"volume_rename": true,
"volume_native_delete_protection": true,
"network_native_delete_protection": true,
"user_data": true,
"install_flavour": false,
"images_per_plan": false,
"metrics": true,
"metrics_disk_throughput": true,
"rdns_subnet": true,
"rdns_address_list": false,
"reverse_dns": true,
"snapshot_description": true,
"snapshot_protection": true
},
"dns_capabilities": {
"record_writes": true,
"bulk_replace": false,
"zone_create": true,
"zone_delete": true,
"record_proxying": false,
"signing": false
},
"dns_scope": "any",
"cloud_firewall_protocols": [
"tcp",
"udp"
],
"enabled_capabilities": null,
"suspended_capabilities": [],
"resource_counts": {
"dns": 2,
"certificates": 1,
"cloud": 6
},
"verified_at": "2025-10-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"fields": [
"api_token"
],
"environment": null,
"field_values": {
"api_token": {
"set": true,
"secret": true,
"display": "••••oken"
}
},
"context": [],
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 97,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
}
},
{
"id": 2,
"provider": "cloudflare",
"label": "Cloudflare DNS",
"enabled": true,
"removing": false,
"is_oauth": false,
"auth_kind": "api_token",
"oauth": null,
"error_email_enabled": true,
"alerts_muted_until": null,
"incident": null,
"notices": [],
"spending": null,
"capabilities": [
"dns",
"registrar"
],
"supported_capabilities": [
"dns",
"registrar"
],
"cloud_capabilities": [],
"dns_capabilities": {
"record_writes": true,
"bulk_replace": false,
"zone_create": true,
"zone_delete": true,
"record_proxying": true,
"signing": true
},
"dns_scope": "any",
"cloud_firewall_protocols": [],
"enabled_capabilities": null,
"suspended_capabilities": [],
"resource_counts": {
"dns": 5,
"registrar": 0,
"certificates": 1
},
"verified_at": "2025-10-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"fields": [
"api_token",
"account_id"
],
"environment": null,
"field_values": {
"api_token": {
"set": true,
"secret": true,
"display": "••••oken"
},
"account_id": {
"set": true,
"secret": false,
"display": "demoaccount0000000000000000cf01"
}
},
"context": [],
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 49,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
}
}
]
```
---
### Get a provider account {#get-organizations-organization-provider-credentials-providercredential}
`GET` `/organizations/{organization}/provider-credentials/{providerCredential}`
**Scope:** `cloud.read` · **Changes data:** no
One connected provider account with its health, how many zones, domains, certificates and servers it holds, the registrar operations it supports and the result of its last permission check. Secrets are never returned.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `providerCredential_id`
path · required | integer | The providerCredential's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/provider-credentials/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"provider": "hetzner",
"label": "Hetzner — Production",
"enabled": true,
"removing": false,
"is_oauth": false,
"auth_kind": "api_token",
"oauth": null,
"error_email_enabled": true,
"alerts_muted_until": null,
"incident": null,
"notices": [],
"spending": null,
"capabilities": [
"cloud",
"dns"
],
"supported_capabilities": [
"cloud",
"dns"
],
"cloud_capabilities": {
"native_delete_protection": true,
"server_destroy": true,
"server_destroy_is_cancellation": false,
"server_create": true,
"server_rename": true,
"console": true,
"snapshots": true,
"backups": true,
"isos": true,
"rescue": true,
"placement_groups": true,
"public_network_toggle": true,
"scheduled_backups": true,
"private_networks": true,
"private_network_attach": true,
"network_join_on_create": false,
"network_attach_ip_choice": true,
"private_network_unfiltered": true,
"floating_ips": true,
"networks_creatable": true,
"network_cidr": true,
"network_subnets": true,
"network_routes": true,
"network_rename": true,
"network_ip_range_extendable": true,
"firewalls_creatable": true,
"firewall_multi_server": true,
"firewall_renamable": true,
"firewall_outbound": true,
"firewall_ipv6": true,
"firewall_dynamic_ip": true,
"server_firewall": false,
"load_balancers_creatable": true,
"load_balancer_rename": true,
"load_balancer_algorithm": true,
"load_balancer_services": true,
"load_balancer_targets": true,
"volumes_creatable": true,
"volume_resize": true,
"volume_rename": true,
"volume_native_delete_protection": true,
"network_native_delete_protection": true,
"user_data": true,
"install_flavour": false,
"images_per_plan": false,
"metrics": true,
"metrics_disk_throughput": true,
"rdns_subnet": true,
"rdns_address_list": false,
"reverse_dns": true,
"snapshot_description": true,
"snapshot_protection": true
},
"dns_capabilities": {
"record_writes": true,
"bulk_replace": false,
"zone_create": true,
"zone_delete": true,
"record_proxying": false,
"signing": false
},
"dns_scope": "any",
"cloud_firewall_protocols": [
"tcp",
"udp"
],
"enabled_capabilities": null,
"suspended_capabilities": [],
"resource_counts": {
"dns": 2,
"certificates": 1,
"cloud": 6
},
"verified_at": "2025-10-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"fields": [
"api_token"
],
"environment": null,
"field_values": {
"api_token": {
"set": true,
"secret": true,
"display": "••••oken"
}
},
"context": [],
"health": {
"status": "ok",
"success_rate": 100,
"total_calls": 97,
"last_error_at": null,
"last_success_at": "2026-01-15T12:00:00Z"
},
"registrar_operations": null,
"scope_check": null,
"scope_checked_at": null,
"disabled_operations": []
}
```
---
### List a provider account’s call log {#get-organizations-organization-provider-credentials-providercredential-logs}
`GET` `/organizations/{organization}/provider-credentials/{providerCredential}/logs`
**Scope:** `cloud.read` · **Changes data:** no
The most recent 200 calls InfraNest made with this account, newest first. Filter with `status` (`success` or `failure`) and the dates `from` and `to`.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `providerCredential_id`
path · required | integer | The providerCredential's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/provider-credentials/1/logs" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 9,
"provider": "hetzner",
"capability": "cloud",
"method": "GET",
"endpoint": "/v1/servers",
"success": true,
"http_status": 200,
"duration_ms": 60,
"error_type": null,
"error_message": null,
"provider_request_id": null,
"request_summary": null,
"response_summary": null,
"created_at": "2026-01-15T12:00:00.000000Z"
},
{
"id": 10,
"provider": "hetzner",
"capability": "cloud",
"method": "GET",
"endpoint": "/v1/volumes",
"success": true,
"http_status": 200,
"duration_ms": 112,
"error_type": null,
"error_message": null,
"provider_request_id": null,
"request_summary": null,
"response_summary": null,
"created_at": "2026-01-15T11:57:00.000000Z"
}
]
```
---
### Get provider account health {#get-organizations-organization-provider-credentials-health}
`GET` `/organizations/{organization}/provider-credentials/health`
**Scope:** `cloud.read` · **Changes data:** no
How many enabled provider accounts there are (`total`) and how many are currently degraded or down (`unhealthy`).
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/provider-credentials/health" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"unhealthy": 2,
"total": 10
}
```
## Webhook endpoints
### Get the outbound webhook JSON Schema {#get-organizations-organization-webhook-endpoints-schema}
`GET` `/organizations/{organization}/webhook-endpoints/schema`
**Scope:** `monitoring.read` · **Changes data:** no
The JSON Schema of the payload InfraNest sends to your webhook endpoints, for tools that type a payload from a schema. Narrow it with `events[]`; with none, it covers every event. `events` lists every event you can name.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `events`
body | array | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/webhook-endpoints/schema" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"schema": {
"type": "object",
"properties": {
"event": {
"title": "Event",
"type": "string"
},
"created_at": {
"title": "Created at",
"type": "string",
"format": "date-time"
},
"data": {
"type": "object",
"properties": {
"acknowledged_by": {
"title": "Acknowledged by",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"action": {
"title": "Action",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"actor": {
"title": "Actor",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"agent": {
"title": "Agent",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"asn_org": {
"title": "ASN org",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assignee": {
"title": "Assignee",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assignees": {
"title": "Assignees",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"auction": {
"title": "Auction",
"anyOf": [
{
"type": "object"
},
{
"type": "null"
}
]
},
"author": {
"title": "Author",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"base_branch": {
"title": "Base branch",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"branch": {
"title": "Branch",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"change": {
"title": "Change",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"changed_fields": {
"title": "Changed fields",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"check_name": {
"title": "Check name",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"comment": {
"title": "Comment",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"commits": {
"title": "Commits",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"conclusion": {
"title": "Conclusion",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"context": {
"title": "Context",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"country_code": {
"title": "Country code",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"created": {
"title": "Created",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"creator": {
"title": "Creator",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"current_ipv4": {
"title": "Current IPv4",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"current_ipv6": {
"title": "Current IPv6",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"custom_fields": {
"title": "Custom fields",
"anyOf": [
{
"type": "object"
},
{
"type": "null"
}
]
},
"days_left": {
"title": "Days left",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"deleted": {
"title": "Deleted",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"deleted_in": {
"title": "Deleted in",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"deployment_id": {
"title": "Deployment ID",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"description": {
"title": "Description",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"domain": {
"title": "Domain",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"draft": {
"title": "Draft",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"drop_eta": {
"title": "Drop ETA",
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"duration_minutes": {
"title": "Duration minutes",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"email": {
"title": "Email",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"endpoint": {
"title": "Endpoint",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"environment": {
"title": "Environment",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"environment_url": {
"title": "Environment URL",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"escalation_policy": {
"title": "Escalation policy",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"expires_at": {
"title": "Expires at",
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"expiry_may_be_stale": {
"title": "Expiry may be stale",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"forced": {
"title": "Forced",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"head_branch": {
"title": "Head branch",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"head_sha": {
"title": "Head SHA",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"host": {
"title": "Host",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"identifier": {
"title": "Identifier",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"incident_title": {
"title": "Incident title",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"incident_type": {
"title": "Incident type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"incident_url": {
"title": "Incident URL",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ip": {
"title": "IP",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ip_version": {
"title": "IP version",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"is_hosting": {
"title": "Is hosting",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"is_pull_request": {
"title": "Is pull request",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"issue_type": {
"title": "Issue type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"issuer": {
"title": "Issuer",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"issues": {
"title": "Issues",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"label": {
"title": "Label",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"labels": {
"title": "Labels",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"log_url": {
"title": "Log URL",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"merged": {
"title": "Merged",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"message": {
"title": "Message",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"monitor_type": {
"title": "Monitor type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"title": "Name",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"new_nameservers": {
"title": "New nameservers",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"note": {
"title": "Note",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"note_trimmed": {
"title": "Note trimmed",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"number": {
"title": "Number",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"old_nameservers": {
"title": "Old nameservers",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"owner": {
"title": "Owner",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"owner_email": {
"title": "Owner email",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"owner_name": {
"title": "Owner name",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pd_connection_id": {
"title": "PagerDuty connection ID",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"pd_incident_id": {
"title": "PagerDuty incident ID",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"prerelease": {
"title": "Prerelease",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"previous_state": {
"title": "Previous state",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"priority": {
"title": "Priority"
},
"production_environment": {
"title": "Production environment",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"project": {
"title": "Project",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"provider": {
"title": "Provider",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pusher": {
"title": "Pusher",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"record_action": {
"title": "Record action",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"record_name": {
"title": "Record name",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"record_type": {
"title": "Record type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"records": {
"title": "Records",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"ref": {
"title": "Ref",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ref_type": {
"title": "Ref type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"registrar": {
"title": "Registrar",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"repo": {
"title": "Repo",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"responder": {
"title": "Responder",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"responder_message": {
"title": "Responder message",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"responder_state": {
"title": "Responder state",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"reviewer": {
"title": "Reviewer",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"run_attempt": {
"title": "Run attempt",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"run_id": {
"title": "Run ID",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"run_number": {
"title": "Run number",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"server_name": {
"title": "Server name",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"service": {
"title": "Service",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sha": {
"title": "SHA",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"size_gb": {
"title": "Size GB",
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"state": {
"title": "State",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"title": "Status",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status_page": {
"title": "Status page",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"subject": {
"title": "Subject",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tag": {
"title": "Tag",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"task": {
"title": "Task",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"team": {
"title": "Team",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"title": "Title",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tld": {
"title": "TLD",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"transient_environment": {
"title": "Transient environment",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"trigger_event": {
"title": "Triggering event",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"triggering_actor": {
"title": "Triggering actor",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"title": "Type",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"unused": {
"title": "Unused",
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"update_status": {
"title": "Update status",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"urgency": {
"title": "Urgency",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"url": {
"title": "URL",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"via": {
"title": "Via",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"workflow": {
"title": "Workflow",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"zone": {
"title": "Zone",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
}
},
"required": [
"event",
"created_at"
]
},
"events": [
"domain.registered",
"domain.expiring"
]
}
```