Skip to content

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.

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.

GET/organizations/{organization}/invitations
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
organizationintegerrequired

Your organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.

Request

sh
curl "https://api.infranest.io/api/organizations/42/invitations" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$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
<?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();
python
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())
js
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())
go
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

json
[
  {
    "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
    }
  }
]
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

GET/organizations/{organization}/members
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
organizationintegerrequired

Your organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.

Request

sh
curl "https://api.infranest.io/api/organizations/42/members" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$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
<?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();
python
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())
js
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())
go
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

json
[
  {
    "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
  }
]
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

GET/organizations
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Request

sh
curl "https://api.infranest.io/api/organizations" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$headers = @{
  Authorization = "Bearer $env:INFRANEST_TOKEN"
  Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations" -Headers $headers
php
<?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();
python
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())
js
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())
go
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

json
[
  {
    "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"
    }
  }
]
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

GET/organizations/{id}
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
idintegerrequired

The id's ID.

Request

sh
curl "https://api.infranest.io/api/organizations/1" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$headers = @{
  Authorization = "Bearer $env:INFRANEST_TOKEN"
  Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/1" -Headers $headers
php
<?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();
python
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())
js
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())
go
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

json
{
  "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"
      }
    }
  ]
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

GET/organizations/{organization}/roles
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
organizationintegerrequired

Your organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.

Request

sh
curl "https://api.infranest.io/api/organizations/42/roles" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$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
<?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();
python
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())
js
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())
go
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

json
{
  "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
    }
  ]
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

GET/organizations/{organization}/roles/{id}
Scope members.readRead only
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
organizationintegerrequired

Your organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.

idintegerrequired

The id's ID.

Request

sh
curl "https://api.infranest.io/api/organizations/42/roles/1" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$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
<?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();
python
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())
js
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())
go
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

json
{
  "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
  }
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.

POST/organizations/{organization}/sandbox/reset
Any tokenChanges data
Authorizationheader
Authorizationstringrequired

Bearer and your API token: Bearer $INFRANEST_TOKEN. See Tokens and scopes.

Path parameters
organizationintegerrequired

Your organization's ID: the number after /organizations/ in the app's address, or from GET /organizations.

Request

sh
curl -X POST "https://api.infranest.io/api/organizations/42/sandbox/reset" \
  -H "Authorization: Bearer $INFRANEST_TOKEN" \
  -H "Accept: application/json"
powershell
$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
<?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();
python
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())
js
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())
go
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

json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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"
}
json
{
  "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.