Skip to main content
API Reference

REST API Reference

87 resources, 24 RPC endpoints, OpenAPI 3.0 spec, and a ready-to-use Postman collection. Everything you need to automate IronWiFi.

Explore API Download Postman Collection

Getting Started

Three things you need to start making API calls

Base URL & Regions

Choose the regional endpoint closest to your deployment.

RegionBase URL
Global (default)console.ironwifi.io
Europe Westeurope-west1.ironwifi.io
Europe West 2europe-west2.ironwifi.io
US Centralus-central1.ironwifi.io
US Westus-west1.ironwifi.io
Asia Southeastasia-southeast1.ironwifi.io
Asia Eastasia-east1.ironwifi.io
Australiaaustralia-southeast1.ironwifi.io
Africa Southafrica-south1.ironwifi.io

Authentication

All requests require a Bearer token in the Authorization header.

Authorization: Bearer {your_api_token}

Generate API keys in Console > Account > API Keys or via the /keys endpoint.

Pagination & Filtering

Responses use HAL+JSON format with _embedded, _links, and pagination metadata.

# Paginate
GET /users?page=2&page_size=50

# Filter
GET /users?filter[disabled]=0

# Sort
GET /users?sort=username:asc

Code Samples

Common operations in cURL, Python, and Node.js

List Users

Retrieve a paginated list of RADIUS users

curl -X GET "https://console.ironwifi.io/users" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Accept: application/json"
import requests

resp = requests.get(
    "https://console.ironwifi.io/users",
    headers={"Authorization": f"Bearer {API_TOKEN}"}
)
users = resp.json()["_embedded"]["users"]
const resp = await fetch(
  "https://console.ironwifi.io/users",
  { headers: { Authorization: `Bearer ${API_TOKEN}` } }
);
const { _embedded: { users } } = await resp.json();

Create User

Add a new RADIUS user to a group

curl -X POST "https://console.ironwifi.io/users" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "jsmith@company.com",
    "password": "secure_password",
    "table_id": "GROUP_ID"
  }'
resp = requests.post(
    "https://console.ironwifi.io/users",
    headers={
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    },
    json={
        "username": "jsmith@company.com",
        "password": "secure_password",
        "table_id": "GROUP_ID"
    }
)
const resp = await fetch(
  "https://console.ironwifi.io/users",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_TOKEN}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      username: "jsmith@company.com",
      password: "secure_password",
      table_id: "GROUP_ID"
    })
  }
);

Generate Onboarding Profile

Create a device enrollment profile for 802.1X

curl -X POST "https://console.ironwifi.io/profiles" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ssid": "Corp-WiFi",
    "eap_type": "EAP-TLS",
    "platform": "windows"
  }'
resp = requests.post(
    "https://console.ironwifi.io/profiles",
    headers={
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    },
    json={
        "ssid": "Corp-WiFi",
        "eap_type": "EAP-TLS",
        "platform": "windows"
    }
)
const resp = await fetch(
  "https://console.ironwifi.io/profiles",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_TOKEN}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      ssid: "Corp-WiFi",
      eap_type: "EAP-TLS",
      platform: "windows"
    })
  }
);

Create Guest Voucher

Generate a time-limited guest WiFi voucher

curl -X POST "https://console.ironwifi.io/vouchers" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "table_id": "GROUP_ID",
    "duration": 86400,
    "count": 10
  }'
resp = requests.post(
    "https://console.ironwifi.io/vouchers",
    headers={
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    },
    json={
        "table_id": "GROUP_ID",
        "duration": 86400,
        "count": 10
    }
)
const resp = await fetch(
  "https://console.ironwifi.io/vouchers",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_TOKEN}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      table_id: "GROUP_ID",
      duration: 86400,
      count: 10
    })
  }
);

Interactive API Reference

Browse all 87 resources and 24 RPC endpoints

Loading API specification...

Developer Tools

Everything you need to integrate with IronWiFi

Postman Collection

Pre-configured collection with 87 resources, workflow examples, and environment variables. Import and start testing immediately.

Download Collection (1.2 MB)

OpenAPI 3.0 Spec

Machine-readable specification for code generation, testing, and documentation. Compatible with all OpenAPI tools.

Download openapi.json

Swagger UI

Try API calls directly from the IronWiFi Console with built-in authentication and live request/response inspection.

Open in Console

SDK Generation

Generate client libraries in any language using the OpenAPI spec and openapi-generator.

openapi-generator generate \
  -i /api/openapi.json \
  -g python -o ./ironwifi-sdk

Error Codes & Rate Limits

CodeMeaningAction
400Bad RequestCheck request syntax and required fields
401UnauthorizedVerify your API token is valid and not expired
403ForbiddenCheck API key permissions and organization access
404Not FoundVerify the resource ID and endpoint path
409ConflictResource already exists with that identifier
422Validation ErrorCheck required fields and data types in request body
429Rate LimitedWait and retry after the X-RateLimit-Reset time
500Server ErrorRetry with exponential backoff; contact support if persistent

Rate Limits

100 requests per minute per API key. Rate limit status is returned in every response via headers: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Bulk operations have additional per-endpoint limits. If rate limited, wait until the reset timestamp before retrying.

Frequently Asked Questions

How do I get an API key?

Log in to the IronWiFi Console, navigate to Account > API Keys, and click Create Key. Each key is scoped to your organization and can be revoked at any time. Use the key as a Bearer token in the Authorization header of every request.

Which API region should I use?

Use the region closest to your RADIUS server deployment for the lowest latency. The default global endpoint (console.ironwifi.io) works from anywhere. If you have data residency requirements, use the regional endpoint that matches your compliance needs (e.g., europe-west1.ironwifi.io for EU data sovereignty).

What are the API rate limits?

The API allows 100 requests per minute per API key. Rate limit status is returned in response headers: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Bulk operations have additional per-endpoint limits. If you need higher limits, contact support.

Can MSP partners manage multiple tenants via the API?

Yes. MSP partners use the Organizations API to manage multiple customer tenants from a single API key. Each API call can target a specific organization, and bulk operations work across tenants for provisioning, configuration, and reporting.

Is there a Terraform provider?

Yes. IronWiFi offers a Terraform provider for infrastructure-as-code management of your WiFi authentication setup. You can manage users, groups, RADIUS servers, certificates, and policies as Terraform resources. See the Terraform page for details.

Ready to Build?

Start a 14-day free trial and explore the full API. No credit card required.

Start 14-Day Free Trial Schedule a Demo