🤖 API Reference

Give your AI agent a home

A name, an endpoint, even a wallet — in one API call. Check, register and manage *.ing.ng identities programmatically, and let your agent get paid and resolve at a name it owns. MCP server included — use ing.ng as a native tool from any MCP-compatible agent.

🚀 Quickstart

New here? Create an account + get an API key in one call with a registration token. Already have an account? Jump straight to registering domains.

# One-shot: create account + get API key (no CAPTCHA)
$ curl -s -X POST 'https://ing.ng/api/auth/register' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "[email protected]",
    "password": "your-password",
    "registration_token": "ing_reg_xxx..."
  }'


# Check if a subdomain is available
$ curl -s 'https://ing.ng/api/check-domain?name=my-agent'

# Response
{
  "domain": "my-agent.ing.ng",
  "available": true
}

# Register with your new API key
$ curl -s -X POST 'https://ing.ng/api/register-domain' \
  -H 'Authorization: Bearer ing_xxx...' \
  -H 'Content-Type: application/json' \
  -d '{"name":"my-agent","agent":"Claude Code"}'
💡 Agent tip: Include the /api/check-domain call in your agent's system prompt so it can validate names before requesting one.

📦 Build on ing.ng — SDKs

Claim and manage a full identity — a name, a wallet, and a profile — in a few lines. Official zero-dependency clients for Python and JavaScript.

Python

# pip install ./sdk/python (or: pip install ingng — once published)
from ingng import Ingng

ing = Ingng("ing_your_api_key")
ing.claim("alice") # alice.ing.ng is yours
ing.set_wallet("alice", eth="0x…", btc="bc1…") # get paid at your name
ing.set_profile("alice", display="Alice", twitter="alice") # a profile at your name

JavaScript (Node 18+, Deno, browser)

import { Ingng } from "ingng";

const ing = new Ingng("ing_your_api_key");
await ing.claim("alice");
await ing.setWallet("alice", { eth: "0x…", btc: "bc1…" });
await ing.setProfile("alice", { display: "Alice", twitter: "alice" });

Both wrap the same API — including the identity endpoints /api/domains/<name>/wallets and /api/domains/<name>/profile. Names resolve in the browser and in ENS-aware wallets (MetaMask, Rainbow, Rabby).

🤖 Prefer native tools? The MCP server exposes these as first-class tools for any MCP-compatible agent — or wrap the SDK methods as LangChain tools directly. SDK source + README live in sdk/ in the repo.

🔍 Check Availability

GET /api/check-domain

Check if a subdomain name is available for registration.

Query Parameters

ParameterTypeDescription
namestringThe subdomain name to check (e.g., my-project)
extstringOptional. Extension (default: .ing.ng)

Response

{
  "available": true // or false
  "domain": "my-project.ing.ng",
  "name": "my-project",
  "extension": ".ing.ng"
}

📝 Register a Domain

POST /api/register-domain

Register a *.ing.ng subdomain programmatically. Requires a valid API key in the Authorization: Bearer <key> header.

Request Headers

HeaderValueRequired
AuthorizationBearer ing_<your-api-key>
Content-Typeapplication/json

Request Body

FieldTypeDescription
namestringThe subdomain name (e.g., my-agent)
extensionstringOptional. Default: .ing.ng
ns1, ns2stringOptional. Custom nameservers
agentstringOptional. Agent identifier for logging

Example

$ curl -s -X POST 'https://ing.ng/api/register-domain' \
  -H 'Authorization: Bearer ing_abc123...' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "my-agent",
    "agent": "claude-code"
  }'


# Success response (201)
{
  "status": "success",
  "domain": "my-agent.ing.ng",
  "name": "my-agent",
  "owner": "[email protected]",
  "expires_at": "2036-06-06T09:13:00",
  "dns_servers": ["ns1.cloudflare.com", "ns2.cloudflare.com"]
}

Limits

  • Max 10 subdomains per account
  • 10 registrations per hour per IP (rate limited)
  • Abusive names (crypto scams, phishing keywords) are automatically blocked
  • Valid names: 1-63 chars, letters/digits/hyphens, no leading/trailing hyphen

🔑 API Key Authentication

Register via the panel to generate API keys. Keys are prefixed with ing_ for easy identification and are hashed at rest.

Where to get your key

  1. Create an account at ing.ng
  2. Go to Panel → Agent API Keys
  3. Click Generate Key, give it a name (e.g., "My GitHub Bot")
  4. Copy the key immediately — it's shown once
⚠️ Security: Treat API keys like passwords. If compromised, revoke them from the panel and generate a new one.

Usage

# Pass your API key as a Bearer token
export INGNG_API_KEY="ing_abc123..."

$ curl -s -X POST 'https://ing.ng/api/register-domain' \
  -H 'Authorization: Bearer $INGNG_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"my-bot"}'

🤖 Agent Account Creation

Create an account and get an API key — all in one API call. No CAPTCHA required when using a registration token, making this the fastest onboarding path for autonomous agents.

⚡ One-shot setup: Your agent calls this endpoint once, receives a user ID and API key in the response, and can immediately start registering domains. No panel, no email verification needed.

Register + Get API Key

POST /api/auth/register

Requires a valid registration token. Contact the ing.ng team to obtain one for your agent integration.

FieldTypeRequiredDescription
emailstringAgent owner's email
passwordstringAccount password (min 8 chars)
registration_tokenstringPre-shared token for CAPTCHA bypass
$ curl -s -X POST 'https://ing.ng/api/auth/register' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "[email protected]",
    "password": "secure-pass-123",
    "registration_token": "ing_reg_xxx..."
  }'


# Success response (201)
{
  "user_id": "uuid-here",
  "api_key": "ing_xxx...",
  "email": "[email protected]"
}

Create Additional API Keys

POST /api/api-keys

Once authenticated, create additional API keys for different agents or services. Each key can be independently revoked from the panel.

FieldTypeRequiredDescription
namestringLabel for this key (e.g., "my-cicd-bot")
$ curl -s -X POST 'https://ing.ng/api/api-keys' \
  -H 'Authorization: Bearer ing_existing-key...' \
  -H 'Content-Type: application/json' \
  -d '{"name": "my-cicd-bot"}'

# Success response (201)
{
  "key": "ing_new-key...",
  "key_prefix": "ing_new...",
  "name": "my-cicd-bot",
  "created_at": "..."
}

🚩 Report Abuse

POST /api/abuse/report

Report a *.ing.ng subdomain for abuse. No authentication required.

Request Body

FieldTypeRequiredDescription
domainstringThe offending subdomain (e.g., spam.ing.ng)
typestringOne of: phishing, malware, spam, copyright, trademark, impersonation, hate_speech, other
descriptionstringDetailed description (min 20 characters)
reporter_emailstringOptional, for follow-up
evidence_urlstringOptional URL with proof
$ curl -s -X POST 'https://ing.ng/api/abuse/report' \
  -H 'Content-Type: application/json' \
  -d '{
    "domain": "spam.ing.ng",
    "type": "phishing",
    "description": "This domain is hosting a fake login page."
  }'


# Response (201)
{
  "status": "success",
  "report_id": "uuid...",
  "auto_suspended": false
}
⚡ Auto-suspend: Domains with 3+ confirmed abuse reports are automatically suspended.

🌐 DNS Records

Each subdomain comes with full DNS control. After registration, you can set:

A Record

Point to an IPv4 address (e.g., your server IP)

agent.ing.ng → 203.0.113.10
AAAA Record

Point to an IPv6 address

agent.ing.ng → 2001:db8::1
CNAME Record

Alias to another domain

api.ing.ng → your-app.onrender.com
NS Records

Custom nameservers

Custom NS delegation

💎 Premium Domains

Browse and purchase premium domains programmatically. Your agent can check availability and initiate purchases via PayPal.

List Premium Domains

GET /api/premium-domains
ParameterTypeDescription
qstringSearch by domain name
limitintMax results (default: 50, max: 200)
offsetintPagination offset
# List premium domains matching "agent"
$ curl 'https://ing.ng/api/premium-domains?q=agent&limit=5'

# Response (abbreviated)
{
  "status": "success",
  "total": 12,
  "domains": [{
    "domain": "agent.ing.ng",
    "price": 19.99,
    "type": "tranco"
  }]

Purchase Premium Domain

POST /api/premium-domains/<name>/purchase

Requires a valid API key in the Authorization: Bearer <key> header. Returns a PayPal checkout URL for completing payment. Payment is verified via PayPal IPN before the domain is activated.

$ curl -X POST 'https://ing.ng/api/premium-domains/agent/purchase' \
  -H 'Authorization: Bearer ing_abc123...'

# Response
{
  "status": "success",
  "purchase_id": "uuid-here",
  "domain": "agent.ing.ng",
  "amount": 19.99,
  "checkout_url": "https://www.paypal.com/...",
  "status": "pending"
}

📡 Webhooks

Receive real-time HTTP notifications when domain events occur. Your webhook endpoint receives a signed JSON payload that you can verify using the provided HMAC-SHA256 signature.

🔐 Security: Every webhook payload includes a X-Webhook-Signature header containing an HMAC-SHA256 signature of the raw request body. Always verify this signature using your webhook secret before processing the payload.

Available Events

EventDescription
domain.createdA new subdomain was registered
domain.deletedA subdomain was deleted by the owner
domain.expiredA subdomain has expired (coming soon)

List Webhooks

GET /api/webhooks

Returns all webhooks configured for your account.

$ curl 'https://ing.ng/api/webhooks' \
  -H 'Authorization: Bearer ing_xxx...'

# Response (abbreviated)
{
  "status": "success",
  "webhooks": [{
    "id": "uuid",
    "url": "https://...",
    "events": ["domain.created"],
    "active": true
  }]

Create Webhook

POST /api/webhooks
ParameterTypeDescription
urlstringHTTPS endpoint to receive webhook payloads
eventsstringComma-separated event types (default: domain.created,domain.deleted)
secretstringOptional custom HMAC secret (auto-generated if omitted)
$ curl -X POST 'https://ing.ng/api/webhooks' \
  -H 'Authorization: Bearer ing_xxx...' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://my-agent.example.com/webhook",
    "events": "domain.created,domain.deleted"
  }'

# Response
{
  "status": "success",
  "webhook": {
    "id": "uuid",
    "url": "https://...",
    "events": ["domain.created", "domain.deleted"],
    "active": true
  }

Delete Webhook

DELETE /api/webhooks/<id>
$ curl -X DELETE 'https://ing.ng/api/webhooks/uuid-here' \
  -H 'Authorization: Bearer ing_xxx...'

# Response
{
  "status": "success",
  "message": "Webhook deleted."
}

Webhook Payload Format

When an event occurs, we POST the following JSON to your webhook URL:

{
  "event": "domain.created",
  "timestamp": "2025-01-15T10:30:00Z",
  "domain": {
    "name": "my-agent",
    "fqdn": "my-agent.ing.ng",
    "type": "A",
    "value": "203.0.113.10"
  },
  "user_id": "uuid"
}
💡 Verify signatures: Compute HMAC-SHA256(raw_body, your_secret) and compare it to the X-Webhook-Signature header. Reject any payload that doesn't match.

Test a Webhook

POST /api/webhooks/<id>/test

Send a test ping event to verify your webhook endpoint is working. Returns the delivery HTTP status code.

$ curl -X POST 'https://ing.ng/api/webhooks/uuid-here/test' \
  -H 'Authorization: Bearer ing_xxx...'

# Response (success)
{
  "status": "success",
  "message": "Test ping sent.",
  "delivery_status": 200
}

🔌 MCP Server

Use ing.ng natively from any MCP-compatible agent — Claude Desktop, Claude Code, Cline, Cursor, and others. Our MCP server exposes domain tools as first-class agent capabilities.

💡 No browser needed. Once configured, your agent can check availability, register domains, and create accounts — all through native tool calls.

Setup

Grab the MCP server from the repo at scripts/ingng-mcp.py and add it to your MCP client config:

{
  "mcpServers": {
    "ingng": {
      "command": "python",
      "args": ["path/to/scripts/ingng-mcp.py"]
    }
  }
}

Available Tools

ToolDescriptionAuth
check_domainCheck if a subdomain is availableNo
register_domainRegister a subdomainAPI key
search_premiumBrowse premium domains for saleNo
create_accountCreate account + get API key in one callRegistration token
create_api_keyCreate additional API keysExisting API key
📦 One dependency: pip install mcp httpx. Works on stdio transport — no server to host, no ports to open.

🤖 Agent Examples

Example prompts and workflows for different AI agent use cases.

Webhook Server

An agent that needs a stable domain for receiving webhooks:

# Agent system prompt addition
"When you need a domain for webhook receivers, "
"check availability at ing.ng and guide the user to register. "
"Use {name}.ing.ng as your webhook endpoint."
Ephemeral Environments

CI/CD agents that spin up preview environments:

# Preview domain pattern
"pr-42.ing.ng" → points to preview deployment
"staging.ing.ng" → points to staging server
Tool-Calling Agent

Agents that expose tool endpoints or MCP servers:

# Agent tells the user
"I've set up my tool server at tools.ing.ng."
"You can configure it as an MCP endpoint in your client."

⏱ Rate Limits

EndpointLimitWindow
/api/check-domain60 requestsper minute
/api/register-domain10 requestsper hour
GeneralFair use

Rate limits apply per IP address. Contact us if your agent needs higher limits.

Ready to ship?

Create an account and generate an API key in under a minute.