Organization and members
The organizations a token can reach, their members, roles, single sign-on and dashboards. Read only.
Common tasks
Only in the app: Inviting and removing members, roles and single sign-on.
How it works in the app: help article.
Scopes: Read with members.read. See Tokens and scopes.
Invitations 1 · Members 1 · Organizations 2 · Roles 2 · Sandbox 1
Every endpoint below takes a token in the Authorization: Bearer header and answers JSON. Errors use the shared format in Errors. Base address: https://api.infranest.io/api.
Invitations
List pending invitations
Invitations that have not been accepted yet, with who sent each one and the role it grants.
/organizations/{organization}/invitationsmembers.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
organizationintegerrequiredYour organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.
Request
curl "https://api.infranest.io/api/organizations/42/invitations" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/42/invitations" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations/42/invitations', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/42/invitations",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/42/invitations', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations/42/invitations", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
[
{
"id": 1,
"organization_id": 1,
"email": "newcolleague@northwind.example",
"invited_by": 1,
"accepted_at": null,
"expires_at": "2026-01-20T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"org_role_id": 3,
"origin": null,
"inviter": {
"id": 1,
"name": "Alex Rivera",
"email": "demo@example.com",
"analytics_id": null
},
"org_role": {
"id": 3,
"organization_id": null,
"name": "Member",
"slug": "member",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": false,
"cloud.read": true,
"cloud.write": false,
"billing.read": false,
"domains.read": true,
"roles.manage": false,
"billing.write": false,
"domains.write": false,
"domains.delete": false,
"members.manage": false,
"monitoring.read": true,
"monitoring.write": false
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
}
}
]{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing wrong_organization test_token_required test_token_sandbox_only permission_denied
404 not_found
429 rate_limited
Members
List members
Every member of the organization with their role. email_undeliverable is true when email to that address can no longer be delivered.
/organizations/{organization}/membersmembers.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
organizationintegerrequiredYour organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.
Request
curl "https://api.infranest.io/api/organizations/42/members" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/42/members" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations/42/members', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/42/members",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/42/members', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations/42/members", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
[
{
"id": 2,
"name": "Sam Okoye",
"email": "sam@example.com",
"email_undeliverable": false,
"org_role": {
"id": 2,
"organization_id": null,
"name": "Admin",
"slug": "admin",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": true,
"cloud.read": true,
"cloud.write": true,
"billing.read": true,
"domains.read": true,
"roles.manage": false,
"billing.write": false,
"domains.write": true,
"domains.delete": false,
"members.manage": true,
"monitoring.read": true,
"monitoring.write": true
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
},
"sso_external": false
},
{
"id": 3,
"name": "Priya Raghunathan",
"email": "priya@example.com",
"email_undeliverable": false,
"org_role": {
"id": 3,
"organization_id": null,
"name": "Member",
"slug": "member",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": false,
"cloud.read": true,
"cloud.write": false,
"billing.read": false,
"domains.read": true,
"roles.manage": false,
"billing.write": false,
"domains.write": false,
"domains.delete": false,
"members.manage": false,
"monitoring.read": true,
"monitoring.write": false
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
},
"sso_external": false
}
]{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing wrong_organization test_token_required test_token_sandbox_only permission_denied
404 not_found
429 rate_limited
Organizations
List your organizations
Every organization you are a member of, with your role and its member count. An organization that requires its own single sign-on, which this session has not used, is listed by name only.
/organizationsmembers.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Request
curl "https://api.infranest.io/api/organizations" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
[
{
"id": 1,
"name": "Northwind Cloud",
"slug": "northwind-demo",
"deleted_at": null,
"created_at": "2025-10-17T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"avatar_url": null,
"reseller_id": null,
"entitlement_overrides": {
"api": true,
"cloud": true,
"api.mcp": true,
"domains": null,
"servers": null,
"api.read": true,
"monitors": null,
"webhooks": true,
"api.write": true,
"dns.drift": true,
"dns_zones": null,
"drop_catch": true,
"module.api": true,
"module.dns": true,
"automations": null,
"data_import": true,
"dynamic_ips": null,
"white_label": true,
"certificates": null,
"module.cloud": true,
"security.sso": true,
"status_pages": null,
"team_members": null,
"cloud.backups": true,
"cloud.volumes": true,
"custom_fields": true,
"dns.templates": true,
"organizations": null,
"security.scim": true,
"api.tokens_max": null,
"cloud.networks": true,
"cost_reporting": true,
"email_branding": true,
"module.domains": true,
"cloud.firewalls": true,
"cloud.providers": "all",
"cloud.snapshots": true,
"monitor_regions": true,
"watched_domains": null,
"module.dropcatch": true,
"cloud.volumes_max": null,
"external_monitors": null,
"module.monitoring": true,
"monitored_servers": null,
"cloud.networks_max": null,
"dropcatch.register": true,
"module.automations": true,
"monitoring.regions": "all",
"cloud.firewalls_max": null,
"dropcatch.backorder": true,
"module.certificates": true,
"module.integrations": true,
"module.status_pages": true,
"status_page_private": true,
"cloud.load_balancers": true,
"data_export_advanced": true,
"domains.registration": true,
"monitoring.incidents": true,
"security.ip_allowlist": true,
"integrations.providers": "all",
"monitoring.check_types": "all",
"monitoring.maintenance": true,
"status_page_whitelabel": true,
"dropcatch.parallel_race": true,
"automations.action_types": "all",
"cloud.load_balancers_max": null,
"monitoring.calendar_feed": true,
"status_page_custom_domain": true,
"automations.premium_actions": true,
"integrations.connections_max": null,
"integrations.chat_destinations": null
},
"stripe_customer_id": null,
"require_reauth_destructive": false,
"require_reauth_power": false,
"dynamic_ip_default_strict": false,
"dynamic_ip_default_fail_closed": false,
"require_2fa": false,
"password_min_length": null,
"password_require_symbols": null,
"password_max_age_days": null,
"entitlement_overrides_meta": null,
"base_currency": "EUR",
"price_display": "net",
"vat_rate": "21.00",
"country": null,
"is_demo": true,
"timezone": null,
"sso_required": false,
"suspended_at": null,
"suspended_reason": null,
"ip_allowlist": null,
"session_lifetime_days": null,
"pagerduty_webhook_token": null,
"vat_number": null,
"vat_status": null,
"vat_trader_name": null,
"vat_country": null,
"vat_consultation_number": null,
"vat_checked_at": null,
"billing_email": null,
"billing_cc": null,
"billing_reference": null,
"purge_after": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"purge_reminder_sent_at": null,
"alerts_quiet_until": null,
"billing_country": null,
"trial_used_at": null,
"recap_cadence": "monthly",
"brand_logo_url": "http://localhost/storage/org-brand-logos/docs-demo-northwind.svg",
"brand_accent_color": "#0F766E",
"brand_email_from_name": "Northwind Cloud",
"acquisition_src": null,
"acquisition_plan": null,
"acquisition_cadence": null,
"acquisition_code": null,
"customer_number": "4200017",
"size_band": null,
"presignup_first_page": null,
"presignup_sessions": null,
"presignup_days": null,
"sso_required_since": null,
"is_internal": false,
"client_field_id": null,
"onboarding_report_sent_at": null,
"notification_defaults": null,
"api_writes_enabled_at": null,
"is_sandbox": false,
"referral_code": "northwind-cloud",
"acquisition_ref": null,
"users_count": 4,
"analytics_id": "api.infranest.io-4200017",
"pivot": {
"user_id": 1,
"organization_id": 1,
"org_role_id": 1,
"sso_external": false,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z"
}
}
]{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing
429 rate_limited
Get an organization
The organization’s settings, with the name and email address of each member.
/organizations/{id}members.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
idintegerrequiredThe id's ID.
Request
curl "https://api.infranest.io/api/organizations/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/1" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations/1', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/1",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/1', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations/1", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
{
"id": 1,
"name": "Northwind Cloud",
"slug": "northwind-demo",
"deleted_at": null,
"created_at": "2025-10-17T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"avatar_url": null,
"reseller_id": null,
"entitlement_overrides": {
"api": true,
"cloud": true,
"api.mcp": true,
"domains": null,
"servers": null,
"api.read": true,
"monitors": null,
"webhooks": true,
"api.write": true,
"dns.drift": true,
"dns_zones": null,
"drop_catch": true,
"module.api": true,
"module.dns": true,
"automations": null,
"data_import": true,
"dynamic_ips": null,
"white_label": true,
"certificates": null,
"module.cloud": true,
"security.sso": true,
"status_pages": null,
"team_members": null,
"cloud.backups": true,
"cloud.volumes": true,
"custom_fields": true,
"dns.templates": true,
"organizations": null,
"security.scim": true,
"api.tokens_max": null,
"cloud.networks": true,
"cost_reporting": true,
"email_branding": true,
"module.domains": true,
"cloud.firewalls": true,
"cloud.providers": "all",
"cloud.snapshots": true,
"monitor_regions": true,
"watched_domains": null,
"module.dropcatch": true,
"cloud.volumes_max": null,
"external_monitors": null,
"module.monitoring": true,
"monitored_servers": null,
"cloud.networks_max": null,
"dropcatch.register": true,
"module.automations": true,
"monitoring.regions": "all",
"cloud.firewalls_max": null,
"dropcatch.backorder": true,
"module.certificates": true,
"module.integrations": true,
"module.status_pages": true,
"status_page_private": true,
"cloud.load_balancers": true,
"data_export_advanced": true,
"domains.registration": true,
"monitoring.incidents": true,
"security.ip_allowlist": true,
"integrations.providers": "all",
"monitoring.check_types": "all",
"monitoring.maintenance": true,
"status_page_whitelabel": true,
"dropcatch.parallel_race": true,
"automations.action_types": "all",
"cloud.load_balancers_max": null,
"monitoring.calendar_feed": true,
"status_page_custom_domain": true,
"automations.premium_actions": true,
"integrations.connections_max": null,
"integrations.chat_destinations": null
},
"stripe_customer_id": null,
"require_reauth_destructive": false,
"require_reauth_power": false,
"dynamic_ip_default_strict": false,
"dynamic_ip_default_fail_closed": false,
"require_2fa": false,
"password_min_length": null,
"password_require_symbols": null,
"password_max_age_days": null,
"entitlement_overrides_meta": null,
"base_currency": "EUR",
"price_display": "net",
"vat_rate": "21.00",
"country": null,
"is_demo": true,
"timezone": null,
"sso_required": false,
"suspended_at": null,
"suspended_reason": null,
"ip_allowlist": null,
"session_lifetime_days": null,
"pagerduty_webhook_token": null,
"vat_number": null,
"vat_status": null,
"vat_trader_name": null,
"vat_country": null,
"vat_consultation_number": null,
"vat_checked_at": null,
"billing_email": null,
"billing_cc": null,
"billing_reference": null,
"purge_after": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"purge_reminder_sent_at": null,
"alerts_quiet_until": null,
"billing_country": null,
"trial_used_at": null,
"recap_cadence": "monthly",
"brand_logo_url": "http://localhost/storage/org-brand-logos/docs-demo-northwind.svg",
"brand_accent_color": "#0F766E",
"brand_email_from_name": "Northwind Cloud",
"acquisition_src": null,
"acquisition_plan": null,
"acquisition_cadence": null,
"acquisition_code": null,
"customer_number": "4200017",
"size_band": null,
"presignup_first_page": null,
"presignup_sessions": null,
"presignup_days": null,
"sso_required_since": null,
"is_internal": false,
"client_field_id": null,
"onboarding_report_sent_at": null,
"notification_defaults": null,
"api_writes_enabled_at": null,
"is_sandbox": false,
"referral_code": "northwind-cloud",
"acquisition_ref": null,
"analytics_id": "api.infranest.io-4200017",
"subscription": {
"id": 1,
"organization_id": 1,
"plan_id": 2,
"status": "active",
"provider": "stripe",
"provider_subscription_id": "sub_demo_northwind",
"trial_ends_at": null,
"current_period_start": "2026-01-01T00:00:00.000000Z",
"current_period_end": "2026-02-15T12:00:00.000000Z",
"canceled_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"cancel_at_period_end": false,
"stripe_price_id": null,
"currency": "eur",
"trial_reminder_sent_at": null,
"renewal_reminder_sent_at": null,
"card_expiry_reminder_sent_at": null,
"addons": [],
"card_on_file": false,
"trial_recap_sent_at": null,
"trial_last_call_sent_at": null,
"trial_first_steps_sent_at": null,
"trial_ended_at": null,
"trial_reactivation_sent_at": null,
"recap_period_start": null,
"renewal_recap_sent_for": null,
"discount_code": null,
"discount_percent": null,
"discount_amount_off": null,
"discount_duration": null,
"discount_starts_at": null,
"discount_ends_at": null,
"discount_label": null,
"plan": {
"id": 2,
"name": "Pro",
"slug": "pro",
"description": "For freelancers & solo devs — faster checks, cloud, API and automations.",
"limits": {
"api": true,
"rate": {
"manual_sync_per_hour": 30,
"domain_checks_per_hour": 100,
"monitor_checks_per_hour": 120,
"provider_api_per_minute": 300
},
"cloud": true,
"api.mcp": true,
"domains": 100,
"servers": 10,
"api.read": true,
"monitors": 50,
"webhooks": true,
"api.write": true,
"dns.drift": true,
"dns_zones": 100,
"drop_catch": true,
"automations": 25,
"data_import": true,
"dynamic_ips": 10,
"certificates": 100,
"status_pages": 3,
"team_members": 3,
"cloud.backups": true,
"cloud.volumes": true,
"dns.templates": true,
"organizations": 1,
"api.tokens_max": 5,
"cloud.firewalls": true,
"cloud.snapshots": true,
"watched_domains": 50,
"cloud.volumes_max": 10,
"external_monitors": 5,
"dropcatch.register": true,
"cloud.firewalls_max": 5,
"audit.retention_days": 30,
"domains.registration": true,
"monitor_min_interval": 60,
"monitoring.incidents": true,
"monitoring.maintenance": true,
"cloud.load_balancers_max": 0,
"monitoring.calendar_feed": true,
"monitoring.retention_days": 90,
"status_page_custom_domain": true,
"dns.history_retention_days": 90,
"automations.premium_actions": true,
"integrations.connections_max": 5
},
"price_monthly": 2250,
"price_yearly": 22800,
"active": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"is_public": true,
"sort_order": 2,
"stripe_product_id": null,
"stripe_prices": null,
"prices": {
"eur": {
"yearly": 22800,
"monthly": 2250
}
},
"trial_days": 0,
"recommended": false,
"name_i18n": null,
"description_i18n": null,
"badge": null,
"tagline_i18n": {
"de": "Freelancer & Solo-Entwickler",
"en": "Freelancers & solo devs",
"fr": "Freelances & développeurs solo",
"nl": "Freelancers & solo-ontwikkelaars"
},
"highlights_i18n": {
"de": [
"Alles in Free",
"100 Domains"
],
"en": [
"Everything in Free",
"100 domains"
],
"fr": [
"Tout dans Free",
"100 domaines"
],
"nl": [
"Alles in Free",
"100 domeinen"
]
},
"contact_sales": false,
"contact_url": null
}
},
"users": [
{
"id": 2,
"name": "Sam Okoye",
"email": "sam@example.com",
"analytics_id": null,
"pivot": {
"organization_id": 1,
"user_id": 2,
"org_role_id": 2,
"sso_role_managed": false,
"sso_external": false,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z"
}
},
{
"id": 3,
"name": "Priya Raghunathan",
"email": "priya@example.com",
"analytics_id": null,
"pivot": {
"organization_id": 1,
"user_id": 3,
"org_role_id": 3,
"sso_role_managed": false,
"sso_external": false,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z"
}
}
]
}{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing
404 not_found
429 rate_limited
Roles
List roles
The built-in roles followed by the organization’s custom roles, each with its permissions.
/organizations/{organization}/rolesmembers.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
organizationintegerrequiredYour organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.
Request
curl "https://api.infranest.io/api/organizations/42/roles" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/42/roles" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations/42/roles', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/42/roles",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/42/roles', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations/42/roles", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
{
"data": [
{
"id": 2,
"organization_id": null,
"name": "Admin",
"slug": "admin",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": true,
"cloud.read": true,
"cloud.write": true,
"billing.read": true,
"domains.read": true,
"roles.manage": false,
"billing.write": false,
"domains.write": true,
"domains.delete": false,
"members.manage": true,
"monitoring.read": true,
"monitoring.write": true
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
},
{
"id": 3,
"organization_id": null,
"name": "Member",
"slug": "member",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": false,
"cloud.read": true,
"cloud.write": false,
"billing.read": false,
"domains.read": true,
"roles.manage": false,
"billing.write": false,
"domains.write": false,
"domains.delete": false,
"members.manage": false,
"monitoring.read": true,
"monitoring.write": false
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
}
]
}{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing wrong_organization test_token_required test_token_sandbox_only permission_denied
404 not_found
429 rate_limited
Get a role
One role and its permissions. Either a built-in role or one of this organization’s custom roles.
/organizations/{organization}/roles/{id}members.readRead onlyAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
organizationintegerrequiredYour organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.
idintegerrequiredThe id's ID.
Request
curl "https://api.infranest.io/api/organizations/42/roles/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/42/roles/1" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.infranest.io/api/organizations/42/roles/1', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/42/roles/1",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/42/roles/1', {
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.infranest.io/api/organizations/42/roles/1", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
{
"data": {
"id": 1,
"organization_id": null,
"name": "Owner",
"slug": "owner",
"is_system": true,
"permissions": {
"dns.read": true,
"dns.write": true,
"cloud.read": true,
"cloud.write": true,
"billing.read": true,
"domains.read": true,
"roles.manage": true,
"billing.write": true,
"domains.write": true,
"domains.delete": true,
"members.manage": true,
"monitoring.read": true,
"monitoring.write": true
},
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null
}
}{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "scope_missing",
"message": "This API token does not have the members.read scope.",
"hint": "Create a token that includes the scope named in \"required\". Give each token only the scopes it needs.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#scope_missing",
"required": "members.read",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 scope_missing wrong_organization test_token_required test_token_sandbox_only permission_denied
404 not_found
429 rate_limited
Sandbox
Reset a sandbox
Removes everything in your sandbox organization and restores its sample zones, records, monitors, server and tags. Works only on a sandbox, with its own test token or from the app; any other organization answers 404.
/organizations/{organization}/sandbox/resetAuthorizationheader
AuthorizationstringrequiredBearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.
Path parameters
organizationintegerrequiredYour organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.
Request
curl -X POST "https://api.infranest.io/api/organizations/42/sandbox/reset" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Post -Uri "https://api.infranest.io/api/organizations/42/sandbox/reset" -Headers $headers<?php
// composer require guzzlehttp/guzzle
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.infranest.io/api/organizations/42/sandbox/reset', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('INFRANEST_TOKEN'),
'Accept' => 'application/json',
],
]);
echo $response->getBody();import os
import requests
response = requests.post(
"https://api.infranest.io/api/organizations/42/sandbox/reset",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())const response = await fetch('https://api.infranest.io/api/organizations/42/sandbox/reset', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.INFRANEST_TOKEN}`,
Accept: 'application/json',
},
})
console.log(response.status, await response.text())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("POST", "https://api.infranest.io/api/organizations/42/sandbox/reset", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("INFRANEST_TOKEN"))
req.Header.Set("Accept", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}Response
{
"code": "unauthenticated",
"message": "You are not signed in, or the API token is missing, wrong, expired or revoked.",
"hint": "Send a valid token in the Authorization header, as the word Bearer followed by the token. Create a new one under My account → Developer if it expired or was revoked.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#unauthenticated",
"reference": "k3j9x0b2qa"
}{
"code": "wrong_organization",
"message": "This API token is bound to another organization.",
"hint": "Use a token created for this organization, or one created for all your organizations.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#wrong_organization",
"reference": "k3j9x0b2qa"
}{
"code": "not_found",
"message": "Nothing exists at this address, or you cannot see it.",
"hint": "Check the IDs in the address. A resource in another organization answers as not found.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#not_found",
"reference": "k3j9x0b2qa"
}{
"code": "idempotency_in_progress",
"message": "A request with this Idempotency-Key is still being handled.",
"hint": "Wait a few seconds, then send the same request with the same key again to get its result.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#idempotency_in_progress",
"reference": "k3j9x0b2qa"
}{
"code": "validation_failed",
"message": "The name field is required.",
"hint": "Fix the fields listed in \"errors\" and send the request again.",
"retryable": false,
"docs_url": "https://developers.infranest.io/errors#validation_failed",
"errors": {
"name": [
"The name field is required."
]
},
"reference": "k3j9x0b2qa"
}{
"code": "rate_limited",
"message": "This token made more than 300 requests in a minute.",
"hint": "Wait the number of seconds in \"retry_after\" (also the Retry-After header), then retry.",
"retryable": true,
"docs_url": "https://developers.infranest.io/errors#rate_limited",
"limit_key": "api_requests_per_minute",
"limit": 300,
"retry_after": 12,
"reference": "k3j9x0b2qa"
}401 unauthenticated
403 wrong_organization test_token_required test_token_sandbox_only permission_denied write_disabled organization_suspended
404 not_found
409 idempotency_in_progress
422 validation_failed idempotency_key_reused
429 rate_limited
No success response is recorded for this endpoint yet.