IQLink REST API

Manage DNS, CDN proxy, email forwarding, WAF, analytics and more.

Base URL

https://api.iqlink.pl

Rate Limits

120 requests per minute per IP. Responses include standard rate limit headers.

Content Type

All requests and responses use application/json.

Authentication

The API uses JWT Bearer tokens from Supabase Auth. Include the token in the Authorization header:

Authorization: Bearer <access_token>

Login via OTP (for CLI / API clients)

POST /v1/cli/login Public
Send a 6-digit OTP code to the given email address.
{
  "email": "user@example.com"
}
POST /v1/cli/verify Public
Verify OTP code and receive access + refresh tokens.
// Request
{
  "email": "user@example.com",
  "token": "123456"
}

// Response
{
  "access_token": "eyJ...",
  "refresh_token": "abc...",
  "user": { "id": "uuid", "email": "user@example.com" }
}

Token Refresh

POST /auth/v1/token?grant_type=refresh_token Public
Refresh an expired access token.
{
  "refresh_token": "abc..."
}

CLI Tool

IQLink provides a command-line tool for managing your domains from the terminal.

Install

# Linux (amd64)
curl -Lo iqlink https://docs.iqlink.pl/dl/iqlink-linux-amd64
chmod +x iqlink && sudo mv iqlink /usr/local/bin/

# Linux (arm64)
curl -Lo iqlink https://docs.iqlink.pl/dl/iqlink-linux-arm64
chmod +x iqlink && sudo mv iqlink /usr/local/bin/

# macOS (Apple Silicon)
curl -Lo iqlink https://docs.iqlink.pl/dl/iqlink-darwin-arm64
chmod +x iqlink && sudo mv iqlink /usr/local/bin/

# macOS (Intel)
curl -Lo iqlink https://docs.iqlink.pl/dl/iqlink-darwin-amd64
chmod +x iqlink && sudo mv iqlink /usr/local/bin/

Quick Start

# Login
iqlink login user@example.com

# List domains
iqlink zones

# List DNS records
iqlink dns example.com

# Add A record with proxy
iqlink dns add example.com A www 1.2.3.4 --proxy

# Toggle proxy on/off
iqlink proxy on example.com <record-id>

# Check security score
iqlink security example.com

# View analytics
iqlink analytics example.com --period 7d

All Commands

CommandDescription
login [email]Login via OTP code
logoutClear stored credentials
whoamiShow account info & usage
zonesList domains
zones add <domain>Add a domain
zones delete <domain>Remove a domain
zones check <domain>Check NS delegation
dns <domain>List DNS records
dns add ...Add DNS record
dns update ...Update DNS record
dns delete ...Delete DNS record
dns export <domain>Export BIND zone file
dns template <domain> <id>Apply DNS template
proxy on|off <domain> <id>Toggle per-record proxy
email <domain>List email forwards
email add ...Add email forward
email delete ...Delete email forward
waf <domain>Show WAF status
waf enable|disable <domain>Toggle WAF
cache purge <domain>Purge cache
analytics <domain>Show analytics
security <domain>Run security check
dnssec <domain>DNSSEC status
dnssec enable|disableToggle DNSSEC

Errors

Errors return JSON with an error field:

{
  "error": "domain not found"
}
CodeMeaning
400Bad request — invalid input
401Unauthorized — missing or invalid token
403Forbidden — insufficient permissions or plan limit
404Not found
409Conflict — e.g. proxy ↔ site mutual exclusivity
429Rate limited
500Internal server error

Zones (Domains)

GET /v1/zones JWT
List all domains for the authenticated account.
// Response
[
  {
    "id": "bd2b5609-...",
    "domain": "example.com",
    "status": "active",
    "ns_verified": true,
    "created_at": "2026-03-01T12:00:00Z"
  }
]
POST /v1/zones JWT
Add a domain. Auto-creates SOA + NS records in PowerDNS.
{ "domain": "example.com" }
DELETE /v1/zones/{id} JWT
Delete a domain and all its DNS records.
POST /v1/zones/{id}/check-nameservers JWT
Verify NS delegation via TLD query. Returns delegation status.
// Response
{
  "tld_delegated": true,
  "authoritative": true,
  "expected_ns": ["ns1.iqlink.pl", "ns2.iqlink.pl"],
  "found_ns": ["ns1.iqlink.pl", "ns2.iqlink.pl"]
}

DNS Records

GET /v1/zones/{id}/records JWT
List all DNS records for a zone. Proxied records show virtual (original) content.
// Response
[
  {
    "id": "base64-encoded-id",
    "type": "A",
    "name": "example.com",
    "content": "1.2.3.4",
    "ttl": 300,
    "proxied": true,
    "proxiable": true,
    "port": 443
  }
]
POST /v1/zones/{id}/records JWT
Create a DNS record. Supports A, AAAA, CNAME, MX, TXT, SRV, CAA, NS.
{
  "type": "A",
  "name": "www",
  "content": "1.2.3.4",
  "ttl": 300,
  "proxied": false
}
FieldTypeRequiredNotes
typestringYesA, AAAA, CNAME, MX, TXT, SRV, CAA, NS
namestringYesSubdomain or @ for apex
contentstringYesRecord value
ttlintNoDefault: 300
priorityintNoFor MX/SRV records
proxiedboolNoEnable CDN proxy (A/AAAA/CNAME only)
PUT /v1/zones/{id}/records/{rid} JWT
Update a DNS record.
DELETE /v1/zones/{id}/records/{rid} JWT
Delete a DNS record.
GET /v1/zones/{id}/records/export JWT
Export zone as BIND zone file (text/plain).
POST /v1/zones/{id}/records/template JWT
Apply a DNS template (e.g. Google Workspace, Microsoft 365).
{ "template_id": "google-workspace" }
GET /v1/templates JWT
List available DNS templates.

Proxy (CDN)

Per-record proxy toggle (Cloudflare-style orange cloud). When enabled, traffic flows through IQLink edge nodes with TLS termination, caching, WAF, and DDoS protection.

PATCH /v1/zones/{id}/records/{rid}/proxy JWT
Toggle proxy on/off for a DNS record (A, AAAA, CNAME only).
{ "proxied": true }
When proxy is enabled, the DNS record is replaced with a LUA A record that health-checks edge nodes and routes traffic through them. The original record content is preserved and used as the backend target.
GET /v1/zones/{id}/proxy JWT
Get proxy settings (SSL mode, cache config).
PUT /v1/zones/{id}/proxy JWT
Update proxy settings.
{
  "ssl_mode": "full",       // flexible | full | strict
  "cache_enabled": true,
  "cache_ttl": 3600,
  "region": "pl"            // pl | eu | global
}

Email Forwarding

Forward emails to external addresses. Auto-creates MX, SPF, DMARC records. DKIM-signed via iqlink.pl.

GET /v1/zones/{id}/email JWT
List email forwards, DNS readiness, and usage limits.
// Response
{
  "forwards": [
    {
      "id": "uuid",
      "alias": "contact",
      "destinations": ["user@gmail.com"],
      "enabled": true,
      "is_catchall": false
    }
  ],
  "dns_ready": true,
  "limit": 5,
  "count": 1
}
POST /v1/zones/{id}/email JWT
Create an email forward. First forward auto-creates MX/SPF/DMARC records.
{
  "alias": "contact",
  "destinations": ["user@gmail.com", "backup@example.com"]
}
PUT /v1/zones/{id}/email/{fid} JWT
Update a forward (destinations, enabled).
DELETE /v1/zones/{id}/email/{fid} JWT
Delete a forward. Last forward auto-removes DNS records.

WAF / Firewall

Per-zone Web Application Firewall powered by Coraza + OWASP CRS 4.15.0.

GET /v1/zones/{id}/firewall JWT
Get WAF configuration.
PUT /v1/zones/{id}/firewall JWT
Update WAF configuration. Triggers config sync to edge nodes.
{
  "mode": "block",            // off | monitor | block
  "paranoia_level": 1,        // 1-4
  "rate_limit": 100,          // requests per second
  "block_ai_bots": false,
  "browser_check": false,
  "hotlink_protection": false,
  "wordpress_hardening": false
}
Free plan: paranoia 1, rate limit 100/s fixed. Pro: all features except custom rules. Business: full access.
DELETE /v1/zones/{id}/firewall JWT
Disable WAF.
GET /v1/zones/{id}/firewall/events JWT
Paginated WAF events (blocked requests).
GET /v1/zones/{id}/firewall/stats JWT
WAF statistics (top rules, IPs, URIs, 24h).

Cache

POST /v1/zones/{id}/cache/purge JWT
Purge cached content.
// Purge everything
{ "purge_everything": true }

// Purge specific URLs
{ "files": ["https://example.com/style.css"] }

Analytics

GET /v1/zones/{id}/analytics?period=24h JWT
Per-zone traffic analytics. Period: 1h, 6h, 24h, 7d, 30d, 365d.
// Response
{
  "summary": {
    "total_requests": 12451,
    "total_bytes": 1288490188,
    "cache_hit_rate": 78.5,
    "unique_ips": 3201
  },
  "status_codes": { "2": 11118, "3": 1021, "4": 262, "5": 50 },
  "timeseries": [ ... ]
}
Free: max 24h. Pro: max 30d + hostname breakdown. Business: max 365d + hostname breakdown.

Security Check

GET /v1/zones/{id}/security-check JWT
Run a 10-point domain security audit. Checks DNS, SSL, Email, Reputation.
// Response
{
  "score": 8,
  "total": 10,
  "checks": [
    {
      "category": "DNS",
      "name": "NS delegation",
      "status": "pass",
      "detail": "Using IQLink nameservers"
    },
    {
      "category": "SSL",
      "name": "TLS version",
      "status": "pass",
      "detail": "TLS 1.3"
    },
    {
      "category": "DNS",
      "name": "DNSSEC",
      "status": "fail",
      "detail": "Not enabled",
      "fix": "iqlink dnssec enable example.com"
    }
  ]
}

DNSSEC

GET /v1/zones/{id}/dnssec JWT
Get DNSSEC status and DS records.
POST /v1/zones/{id}/dnssec JWT
Enable DNSSEC (Pro/Business only). Returns DS records to add at registrar.
DELETE /v1/zones/{id}/dnssec JWT
Disable DNSSEC. Remove DS records at registrar first to avoid BOGUS responses.

Health Status

GET /v1/health-status JWT
Edge node health status and traffic stats.
GET /v1/regions Public
List available routing regions (pl, eu, global).

Plans & Billing

Plans

FeatureFreePro (49 PLN/mo)Business (199 PLN/mo)
Zones550200
Email forwards5509,999
Proxy records220100
Analytics24h30d365d
WAF paranoia1 (fixed)1-41-4
Custom WAF rulesYes
DNSSECYesYes
GET /v1/billing/info JWT
Get current plan, usage, and limits.
POST /v1/billing/checkout JWT
Create a Stripe Checkout session for plan upgrade.
{ "plan": "pro" }  // pro | business
POST /v1/billing/portal JWT
Create a Stripe Billing Portal session for managing subscription.
GET /v1/billing/invoices JWT
List invoices.
IQLink API v1.2.0 · iqlink.pl · support@iqlink.pl