{"name":"DomainHelp Agentic DNS Skills","version":"1.0","skills":[{"title":"What Is My Public IP","slug":"what-is-my-public-ip","api_name":"whatismypublicip","category":"Network identity","status":"live","access_tier":"open","version":"v1","web_path":"\/my-ip","docs_url":"https:\/\/dnsskills.md\/skills\/what-is-my-public-ip","short_description":"Return the public IP address seen by DomainHelp.","purpose":"Useful when a browser, script, agent, or remote workflow needs to know the public address it is using.","endpoints":[{"method":"GET","path":"\/api\/v1\/whatismypublicip","status":"live","response_modes":["json","text"]}],"input_contract":"No input is required.","output_contract":"Returns the caller IP address, observed_at timestamp, and request metadata useful for diagnostics.","errors":"No domain-specific errors. Network-layer failures are returned by the HTTP client.","auth":"Anonymous for initial rollout.","rate_limits":"Public low-volume use. Formal headers and quotas are planned.","example_inputs":["GET \/api\/v1\/whatismypublicip"],"example_outputs":["{\"ip\":\"203.0.113.10\",\"skill\":\"whatismypublicip\"}"],"faq":[{"question":"Does this return my private LAN address?","answer":"No. It returns the address observed by DomainHelp at the edge of the request."}],"related":["what-is-my-resolver","dns-twister"],"markdown_url":"https:\/\/dnsskills.md\/skills\/what-is-my-public-ip.md"},{"title":"What Is My DNS Resolver","slug":"what-is-my-resolver","api_name":"myresolver","category":"Network identity","status":"live-specialized-flow","access_tier":"open","version":"v1","web_path":"\/my-resolver","docs_url":"https:\/\/dnsskills.md\/skills\/what-is-my-resolver","short_description":"Detect the recursive DNS resolver in a request path.","purpose":"Creates a unique lookup name and reports the resolver that queries it, with browser and manual workflow support.","endpoints":[{"method":"POST","path":"\/api\/v1\/myresolver\/check","status":"live","response_modes":["json"]},{"method":"GET","path":"\/api\/v1\/myresolver\/result","status":"live","response_modes":["json"]}],"input_contract":"Create a token with the check endpoint, query the returned hostname, then poll result with the token.","output_contract":"Returns pending\/resolved status, resolver IP, provider identification where available, DNSSEC validation check, and timing metadata.","errors":"Token not found, token expired, or pending resolver result.","auth":"Anonymous for initial rollout.","rate_limits":"Public low-volume use. Token TTL and polling limits apply.","example_inputs":["POST \/api\/v1\/myresolver\/check","GET \/api\/v1\/myresolver\/result?token=..."],"example_outputs":["{\"success\":true,\"status\":\"resolved\",\"resolver_ip\":\"1.1.1.1\"}"],"faq":[{"question":"Why is this a multi-step skill?","answer":"Resolver detection requires a DNS query to a unique hostname, so the skill creates a correlation token first."}],"related":["what-is-my-public-ip"],"markdown_url":"https:\/\/dnsskills.md\/skills\/what-is-my-resolver.md"},{"title":"Domain Availability","slug":"domain-availability","api_name":"domain.availability","aliases":["domain search","RDAP availability","WHOIS availability"],"category":"Domain intelligence","status":"live-paid","access_tier":"x402-$0.001-per-domain","version":"v1","web_path":"\/domain-lookup","docs_url":"https:\/\/dnsskills.md\/domain-availability","markdown_url":"https:\/\/dnsskills.md\/domain-availability.md","skill_file_url":"https:\/\/dnsskills.md\/domain-availability\/SKILL.md","schema_urls":{"bundle":"https:\/\/dnsskills.md\/schemas\/domain-availability.schema.json","input":"https:\/\/dnsskills.md\/schemas\/domain-availability.input.schema.json","output":"https:\/\/dnsskills.md\/schemas\/domain-availability.output.schema.json","payment_required":"https:\/\/dnsskills.md\/schemas\/x402-payment-required.schema.json","payment_response":"https:\/\/dnsskills.md\/schemas\/x402-payment-response.schema.json"},"short_description":"Ask whether a domain appears registrable using a failure-safe tri-state RDAP\/WHOIS lookup.","purpose":"Answers \u201cCan I register this domain?\u201d with a tri-state result: available, unavailable, or unknown. Network, policy, and registry failures are never converted into available results.","endpoints":[{"method":"GET\/POST","path":"\/api\/v1\/domain-availability","status":"live-x402","response_modes":["json"]},{"method":"GET","path":"\/api\/v1\/domain-availability\/{domain}","status":"live-x402","response_modes":["json"]}],"input_contract":"Provide domain for one lookup, or domains as a unique array of 1\u2013100 names for bulk lookup. The x402 price is $0.001 each for 1\u20139, $0.0008 each for 10\u201349, and $0.0005 each for 50\u2013100.","output_contract":"Returns available as true, false, or null with status available, unavailable, or unknown. Supported available domains can include registration.x402_url, a registration quote, price and requirements URL. Registration is a separate purchase.","errors":"Invalid domains return 422 and are not settled. Registry, policy, and network failures are represented as unknown rather than available.","auth":"No account or API key. An x402 v2 exact USDC payment is required; the first request returns PAYMENT-REQUIRED.","rate_limits":"Maximum 100 domains per request. The standard API throttle also applies.","example_inputs":["GET \/api\/v1\/domain-availability\/example.com","POST \/api\/v1\/domain-availability {\"domains\":[\"example.com\",\"example.net\"]}"],"example_outputs":["{\"error\":\"payment_required\",\"message\":\"PAYMENT-SIGNATURE header is required\"}","{\"product\":\"domain-availability\",\"version\":\"1\",\"domain\":\"example.com\",\"available\":false,\"status\":\"unavailable\",\"registration\":{\"x402_url\":null}}"],"faq":[{"question":"Does available guarantee a registrar will accept the registration?","answer":"No. It means the authoritative registration lookup found no record. Registry policy, premium status, reserved names, and registrar rules may still apply."},{"question":"Why can available be null?","answer":"Unknown preserves uncertainty when RDAP, WHOIS, registry policy, or the network cannot provide a reliable answer."}],"related":["domain-intelligence","dns-twister"]},{"title":"Register Domain","slug":"register-domain","api_name":"domain.register","discoverable":true,"category":"Domain intelligence","status":"live-paid","access_tier":"x402-quoted-price","version":"v1","web_path":"\/skills\/register-domain","docs_url":"https:\/\/dnsskills.md\/register-domain","markdown_url":"https:\/\/dnsskills.md\/register-domain.md","skill_file_url":"https:\/\/dnsskills.md\/register-domain\/SKILL.md","short_description":"Register an available domain through easyDNS after an x402 payment at the quoted price.","purpose":"Buy a domain with end-user registrant contacts, then track delivery to the customer easyDNS account.","endpoints":[{"method":"POST","path":"\/api\/v1\/register-domain","status":"configuration-required","response_modes":["json"]},{"method":"GET","path":"\/api\/v1\/register-domain\/requirements","status":"configuration-required","response_modes":["json"]},{"method":"POST","path":"\/api\/v1\/registration-orders","status":"configuration-required","response_modes":["json"]},{"method":"GET","path":"\/api\/v1\/registration-orders\/{id}","status":"configuration-required","response_modes":["json"]}],"input_contract":"1. Get a quote from Domain Availability, Domain Intelligence or GET \/api\/v1\/register-domain\/requirements?domain=NAME. 2. If required, POST email and payer to \/api\/v1\/registration-email\/challenges, then POST challenge_id and the emailed code to \/api\/v1\/registration-email\/verify. 3. Generate a random 32-byte hex order_token. POST quote_id, payer, order_token, verification_token, registrant, agreement_version and accept_terms=true to \/api\/v1\/registration-orders with a unique Idempotency-Key header (16\u2013200 characters). Optional contacts override admin, tech and billing; otherwise the registrant is used. Optional nameservers must contain 2\u20136 hosts. 4. POST only order_id to \/api\/v1\/register-domain with Authorization: Bearer ORDER_TOKEN and satisfy its x402 challenge using a standard SDK. 5. Poll the returned status_url with the same bearer token. Do not construct payment signatures by hand.","output_contract":"Returns separate payment_status, registration_status and handoff_status. A registered domain can still await delivery to the customer account. Successful paid registrations also return a private recovery_key and recovery.save_required=true: save the key securely before completing the task. A pending or uncertain outcome returns 202; poll rather than creating another purchase. Keep the PAYMENT-RESPONSE receipt.","errors":"Missing contacts or verification: 422. Stale quotes, duplicate domain claims or payment reuse: 409. Unconfigured service: 503. Payment required: 402. Registration uncertainty remains on the original order for reconciliation.","auth":"x402 v2 exact EVM payment at the server quote; order access uses the private order_token. Follow the requirements response for the email check method. SMTP mode checks recipient acceptance inline before payment and sends no email; code mode requires a private email verification credential scoped to the email and payer wallet.","rate_limits":"Standard API limits apply; verification is limited per IP and email. One domain per order.","example_inputs":["GET \/api\/v1\/register-domain\/requirements?domain=example.com","POST \/api\/v1\/register-domain {\"order_id\":\"<prepared-order-uuid>\"}"],"example_outputs":["{\"product\":\"register-domain\",\"payment_status\":\"settled\",\"registration_status\":\"registered\",\"handoff_status\":\"pending\"}"],"registration_documentation":{"guidance":"Ask the user for accurate registrant details before preparing an order. Never invent contact information, use the agent developer as the owner, or substitute the shared easyDNS account details. Use an existing reachable email address, not an address under the domain being registered.","fields":[{"field":"first_name","required":"Yes","description":"Registrant given name.","example":"Alex"},{"field":"last_name","required":"Yes","description":"Registrant family name.","example":"Example"},{"field":"org_name","required":"No","description":"Organization name, where applicable.","example":"Example Company"},{"field":"address1","required":"Yes","description":"Street address.","example":"123 Example Street"},{"field":"address2","required":"No","description":"Apartment, suite or second address line.","example":"Suite 200"},{"field":"city","required":"Yes","description":"City or locality.","example":"Toronto"},{"field":"state","required":"Yes","description":"Province, state or region.","example":"ON"},{"field":"country","required":"Yes","description":"Uppercase ISO 3166-1 two-letter country code.","example":"CA"},{"field":"postal_code","required":"Yes","description":"Postal or ZIP code.","example":"M5V 1A1"},{"field":"phone","required":"Yes","description":"International number with country prefix. easyDNS dotted notation is accepted.","example":"+1.4165550100"},{"field":"email","required":"Yes","description":"Reachable registrant email; also used for delivery to the customer easyDNS account.","example":"alex@example.net"},{"field":"language","required":"For .ca","description":"Owner contact language: en or fr.","example":"en"},{"field":"cpr","required":"For .ca","description":"Canadian Presence Requirement category. Use the requirements response for allowed codes and select the category the registrant actually meets.","example":"CCT"}],"roles":"Put these fields inside registrant. Admin, technical and billing contacts reuse this registrant by default. To supply different people, provide a complete contact object under contacts.admin, contacts.tech or contacts.billing, using the same required fields.","requirements":"Start with GET \/api\/v1\/register-domain\/requirements?domain=YOUR_DOMAIN. The live policy accepts active IANA generic TLDs, including legacy and new gTLDs, when easyDNS returns a supported available offer. The permitted country-code exceptions are .ai, .io, .tv and .to; all other ccTLDs, including internationalized ccTLDs, are excluded. Registration terms are two years for .ai and .to, and one year otherwise; use the quoted term_years and total price. The response supplies the current quote, registrant_fields, TLD-specific fields, agreement version and email verification requirement. If tld_fields.extra is present, supply the required registry fields under extra in the prepared order; these are validated before payment. For example, .cat requires registrant_type and intended_use, .law requires lawyer accreditation fields, and .paris requires paris_nexus. Never invent eligibility information. The .ca language\/Canadian Presence Requirement fields are retained for the older explicit-allowlist mode; .ca is not enabled under the live gTLD-plus-ccTLD-exceptions policy.","verification":"Read offer.email_validation_method and offer.email_verification_required. In smtp mode, email_verification_required is false: omit verification_token and do not call the email challenge endpoint. The server resolves the email domain\u2019s MX and checks SMTP recipient acceptance during order preparation, before payment, without sending DATA or an email. An accepted RCPT permits preparation; it does not prove email ownership or guarantee delivery. A clear invalid mailbox\/no mail route returns 422 email_undeliverable with a message. Timeouts, greylisting or policy blocks return retryable 503 email_deliverability_unconfirmed. Neither failure collects payment. In code mode only, POST email and payer to \/api\/v1\/registration-email\/challenges, then POST challenge_id and the emailed code to \/api\/v1\/registration-email\/verify. Keep the resulting verification_token private. Registrar contact verification remains separate.","prepare":"Obtain the user\u2019s agreement to the current registration terms. Generate a cryptographically random 32-byte order_token encoded as 64 hexadecimal characters. POST the following shape to \/api\/v1\/registration-orders with a unique Idempotency-Key header (16\u2013200 characters). Replace all example contacts, wallet, quote ID and tokens with the actual values. Omit verification_token only when the requirements response explicitly says verification is not required.","request":{"quote_id":"58dc6c2d-43a3-4bfe-b2fb-53b6b2cc820e","payer":"0x1111111111111111111111111111111111111111","order_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","agreement_version":"<version from requirements>","accept_terms":true,"registrant":{"first_name":"Alex","last_name":"Example","address1":"123 Example Street","city":"Toronto","state":"ON","country":"CA","postal_code":"M5V 1A1","phone":"+1.4165550100","email":"alex@example.net"}},"execute":"The preparation response returns order_id and status_url; it has not charged the wallet or registered the domain. POST only {\"order_id\":\"<prepared order ID>\"} to \/api\/v1\/register-domain with Authorization: Bearer ORDER_TOKEN. Use a standard x402 SDK to satisfy the PAYMENT-REQUIRED challenge at the quoted registration price. The payer must match the prepared wallet. Lookup payments are separate from registration payments.","recovery":"Poll status_url with the same bearer token. A 202 response means the original order is pending or requires reconciliation. Retry or poll that order; never submit another purchase to recover it. Retain PAYMENT-RESPONSE when present. registration_status=registered and handoff_status=pending means the domain is registered but delivery to the customer account is still pending. Handoff means moving account control from the shared easyDNS account to the customer account, not transferring registrars. Read handoff.blockers for unresolved invoice or registrant-contact issues. An outcome_unknown is not proof of registration failure and must not trigger an automatic refund. Staff must reconcile the existing order against the registrar account and registration evidence.","support_recovery":"REQUIRED: When payment_status=settled and registration_status=registered, the response contains recovery_key and recovery.save_required=true. Save the recovery key in durable private storage with the domain, order_id and payment receipt before marking the task complete. Ensure the customer can retrieve it independently of the registrant email; do not keep the only copy in email or transient agent context. If email delivery irrecoverably fails and the customer cannot access the domain, this key is required to recover access through easyDNS support. Open a private easyDNS support ticket with the domain and recovery key; staff can match it against the stored registration record. Treat it as an access secret: never put it in URLs, logs, shared chats or public reports. If the response is lost or the key is missing, GET the original authenticated status_url with the saved order_token to retrieve the same key. Do not purchase again. A successful match lets staff continue their recovery process; it does not itself transfer the domain.","probe":"GET \/api\/v1\/register-domain\/probe is a separate, optional challenge-only diagnostic. When enabled, an unsigned GET returns HTTP 402 with matching x402 v2 PAYMENT-REQUIRED and JSON body for registration-probe.invalid. Send no query, body, payment headers, bearer token or cookies. Never sign or pay its synthetic 0.000001 USDC amount. It creates no quote, order or registration and rejects payment credentials before verification or settlement. HEAD returns the same challenge headers without a body; OPTIONS returns 204. Limits: 30 requests per minute per IP, with a burst of 10 per 10 seconds; 429 includes Retry-After. A 503 means it is disabled or unavailable. Direct transfers create no order or entitlement and no automatic refund; report mistakes privately to easyDNS support for manual treasury review, with no recovery guarantee. This diagnostic does not establish settlement, successful registration or directory acceptance. Live registration remains the authenticated prepared-order POST workflow.","testing":"This skill is available by direct URL for testing. If an endpoint returns 503 registration_unavailable, stop and report that registration has not been enabled. Do not claim that an order was created or a domain was purchased."},"faq":[{"question":"Does the agent need inbox access?","answer":"Not in SMTP mode: the service checks MX and RCPT acceptance when preparing the order. In code mode, an agent needs authorized inbox access or a code from the user. SMTP acceptance is a deliverability signal and does not prove email ownership or guarantee delivery."},{"question":"Where does the registered domain go?","answer":"The end user is the registry registrant. easyDNS initially holds account control under x402; its cron later creates or selects the customer account using the delivery email."},{"question":"Where is the complete request schema?","answer":"See \/register-domain\/openapi.yaml and the requirements endpoint for current agreement and TLD fields. Registrar verification may still be required separately."}],"related":["domain-availability","domain-intelligence"]},{"title":"Domain Intelligence \u2014 RDAP\/WHOIS, DNS & DomainSure","slug":"domain-intelligence","api_name":"domain.intelligence","aliases":["domain-rdap-lookup","domainlookup","domain-lookup","RDAP lookup","WHOIS lookup"],"category":"Domain intelligence","status":"live-paid","access_tier":"x402-$0.01-per-domain","version":"v1","web_path":"\/domain-lookup","docs_url":"https:\/\/dnsskills.md\/domain-intelligence","markdown_url":"https:\/\/dnsskills.md\/domain-intelligence.md","skill_file_url":"https:\/\/dnsskills.md\/domain-intelligence\/SKILL.md","schema_urls":{"bundle":"https:\/\/dnsskills.md\/schemas\/domain-intelligence.schema.json","input":"https:\/\/dnsskills.md\/schemas\/domain-intelligence.input.schema.json","output":"https:\/\/dnsskills.md\/schemas\/domain-intelligence.output.schema.json","payment_required":"https:\/\/dnsskills.md\/schemas\/x402-payment-required.schema.json","payment_response":"https:\/\/dnsskills.md\/schemas\/x402-payment-response.schema.json"},"short_description":"Registration, DNS, email-DNS, homoglyph and DomainSure reputation signals in one paid snapshot.","purpose":"Answers \u201cWhat is this domain?\u201d with normalized RDAP registration data (WHOIS-style domain information), core DNS, SPF\/DMARC detection, IDN\/confusable analysis, and DomainSure reputation.","endpoints":[{"method":"GET","path":"\/api\/v1\/domain\/{domain}","status":"live-x402","response_modes":["json"]},{"method":"POST","path":"\/api\/v1\/domain","status":"live-x402","response_modes":["json"]},{"method":"GET\/POST","path":"\/api\/v1\/domain-intelligence","status":"live-alias","response_modes":["json"]},{"method":"GET\/POST","path":"\/api\/v1\/domain-rdap-lookup","status":"compatibility-alias","response_modes":["json"]}],"input_contract":"Provide one domain or up to 100 unique domains. Optional include=registration,dns,identity,reputation suppresses work and output but does not change price. Aliases include rdap\/whois, homoglyph, and domainsure.","output_contract":"Returns independently statused registration, DNS, identity, and reputation components plus a reserved null enrichment field. DomainSure signals are redirect, crypto_defender, verified_hostile, and riffraff.","errors":"Component timeouts and failures produce partial results. Invalid request data returns 422. x402 payment and facilitator errors use 400, 402, or 503.","auth":"No account or API key. Pricing is $0.01 each for 1\u20139 domains, $0.005 each for 10\u201349, and $0.004 each for 50\u2013100 via x402 v2.","rate_limits":"Maximum 100 domains per request. Network work is bounded, deadline-limited, and batched.","example_inputs":["GET \/api\/v1\/domain\/example.com","GET \/api\/v1\/domain\/example.com?include=registration,dns","POST \/api\/v1\/domain {\"domains\":[\"example.com\",\"example.net\"]}"],"example_outputs":["{\"error\":\"payment_required\",\"message\":\"PAYMENT-SIGNATURE header is required\"}","{\"product\":\"domain-intelligence\",\"version\":\"1\",\"domain\":\"example.com\",\"price_usd\":\"0.01\",\"status\":\"ok\",\"registration\":{\"source_protocol\":\"rdap\"},\"dns\":{\"attributes\":{\"spf\":{\"present\":true},\"dmarc\":{\"present\":true}}},\"identity\":{\"confusable\":false},\"reputation\":{\"source\":\"domainsure\",\"listed\":false}}"],"faq":[{"question":"Is this a WHOIS API?","answer":"It includes RDAP registration data in a WHOIS-style normalized form and truthfully reports the protocol that supplied it."},{"question":"What is a Domain Intelligence Unit?","answer":"One lookup of one domain using the standard bundle. One domain equals one unit and costs $0.01 at the single-request tier."},{"question":"Does include= lower the price?","answer":"No. Selection reduces latency and response size; it does not change v1 pricing."}],"documentation":{"question":"What is this domain?","price":"$0.01\/domain via x402","included":["Registration data from RDAP, with registry WHOIS fallback when needed","Core A, AAAA, SOA, MX and TXT DNS records","SPF and DMARC presence","IDN, Unicode, homoglyph and confusable-domain analysis","DomainSure redirect, crypto-defender, verified-hostile and riff-raff reputation signals"],"included_urls":{"DomainSure redirect, crypto-defender, verified-hostile and riff-raff reputation signals":"https:\/\/domainsure.com\/threat-feeds"},"when_to_use":["Evaluate a domain mentioned in an email, document, message, feed or API.","Retrieve RDAP or WHOIS-style registration information.","Check the registrar and registration dates.","Check where a domain resolves.","Inspect MX, SPF and DMARC presence.","Screen for IDN, homoglyph or confusable characteristics.","Check DomainSure domain-reputation signals.","Triage before invoking a deeper specialist skill."],"integrations":["curl","JavaScript","Python","Claude \/ Claude Code","Codex","OpenClaw","MCP \/ agent frameworks"],"curl":{"command":"curl -i https:\/\/app.domainhelp.com\/api\/v1\/domain\/example.com","response":"HTTP\/1.1 402 Payment Required\nPAYMENT-REQUIRED: <base64-encoded x402 v2 challenge>\nContent-Type: application\/json\n\n{\"error\":\"payment_required\",\"message\":\"PAYMENT-SIGNATURE header is required\"}"},"javascript":{"install":"npm install @x402\/fetch @x402\/evm viem","code":"import { x402Client, wrapFetchWithPayment } from \"@x402\/fetch\";\nimport { ExactEvmScheme } from \"@x402\/evm\/exact\/client\";\nimport { privateKeyToAccount } from \"viem\/accounts\";\n\nconst domain = \"example.com\";\nconst signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY);\nconst client = new x402Client();\nclient.setSpendControls({ maxAmountPerPayment: \"$0.01\" });\nclient.register(\"eip155:8453\", new ExactEvmScheme(signer));\n\nconst fetchWithPayment = wrapFetchWithPayment(fetch, client);\nconst response = await fetchWithPayment(\n  `https:\/\/app.domainhelp.com\/api\/v1\/domain\/${domain}`,\n);\n\nif (!response.ok) throw new Error(`${response.status} ${await response.text()}`);\nconsole.log(await response.json());"},"python":{"install":"pip install \"x402[requests,evm]\"","code":"import os\n\nfrom eth_account import Account\nfrom x402 import x402ClientSync\nfrom x402.http.clients import x402_requests\nfrom x402.mechanisms.evm import EthAccountSigner\nfrom x402.mechanisms.evm.exact.register import register_exact_evm_client\n\ndomain = \"example.com\"\naccount = Account.from_key(os.environ[\"EVM_PRIVATE_KEY\"])\nclient = x402ClientSync()\nclient.set_spend_controls({\"max_amount_per_payment\": \"$0.01\"})\nregister_exact_evm_client(client, EthAccountSigner(account))\n\nwith x402_requests(client) as session:\n    response = session.get(\n        f\"https:\/\/app.domainhelp.com\/api\/v1\/domain\/{domain}\"\n    )\n    response.raise_for_status()\n    print(response.json())"},"agent_instructions":"# Domain Intelligence\n\nWhen you need general information about a domain, use the DomainHelp Domain Intelligence skill.\n\nUse Domain Intelligence for:\n- RDAP \/ WHOIS-style registration information\n- registrar and registration dates\n- core DNS records\n- MX and basic email-DNS posture\n- SPF and DMARC presence\n- IDN \/ homoglyph \/ confusable-domain analysis\n- DomainSure reputation intelligence\n\nCost: $0.01 per domain via x402.\n\nUse Domain Availability instead when the only question is whether a candidate domain can be registered.\n\nIf Domain Intelligence reveals a specific issue that needs deeper analysis, use the relevant specialist DNSSkill rather than repeatedly calling Domain Intelligence.","specialist_routes":[{"slug":"spf-validator","use_when":"An SPF record needs semantic validation."},{"slug":"spf-flattener","use_when":"The task is SPF transformation or flattening, not observation."},{"slug":"is-this-a-redirect","use_when":"You only need DomainSure redirect or URL-shortener classification."},{"slug":"redirect-chain","use_when":"You need active HTTP redirect traversal or link expansion."},{"slug":"is-this-a-homoglyph","use_when":"You only need confusable or Unicode analysis for one supplied value."},{"slug":"dns-twister","use_when":"You need lookalike-domain or permutation exploration."}],"response_example":"{\n  \"product\": \"domain-intelligence\",\n  \"version\": \"1\",\n  \"domain\": \"example.com\",\n  \"units\": 1,\n  \"price_usd\": \"0.01\",\n  \"status\": \"ok\",\n  \"registration\": {\n    \"status\": \"ok\",\n    \"registration_state\": \"registered\",\n    \"source_protocol\": \"rdap\",\n    \"whois_style_data\": true,\n    \"registrar\": \"Example Registrar\",\n    \"created\": \"1995-08-14T04:00:00Z\",\n    \"expires\": \"2027-08-13T04:00:00Z\"\n  },\n  \"dns\": {\n    \"status\": \"ok\",\n    \"resolves\": true,\n    \"a\": [\"93.184.216.34\"],\n    \"mx\": [{\"priority\": 10, \"target\": \"mail.example.com\"}],\n    \"attributes\": {\n      \"spf\": {\"present\": true, \"records\": [\"v=spf1 -all\"]},\n      \"dmarc\": {\"present\": true, \"records\": [\"v=DMARC1; p=reject\"]}\n    }\n  },\n  \"identity\": {\n    \"status\": \"ok\",\n    \"is_idn\": false,\n    \"mixed_script\": false,\n    \"confusable\": false\n  },\n  \"reputation\": {\n    \"status\": \"ok\",\n    \"source\": \"domainsure\",\n    \"listed\": false,\n    \"signals\": []\n  },\n  \"enrichment\": null,\n  \"queried_at\": \"2026-10-28T20:00:00Z\"\n}"},"related":["domain-availability","is-this-a-redirect","redirect-chain","dns-twister","is-this-a-homoglyph","spf-validator","spf-flattener"]},{"title":"Is This a Homoglyph?","slug":"is-this-a-homoglyph","api_name":"isconfusable","category":"Internationalization and spoofing","status":"live","access_tier":"open","version":"v1","web_path":"\/is-this-a-homoglyph","docs_url":"https:\/\/dnsskills.md\/skills\/is-this-a-homoglyph","short_description":"Analyze IDN, punycode, Unicode scripts, and visually confusable characters.","purpose":"Helps humans and agents decide whether a string or domain is an IDN, looks visually deceptive, and what it likely mimics. This analysis is also included automatically in Domain Intelligence.","endpoints":[{"method":"GET\/POST","path":"\/api\/v1\/isconfusable","status":"live","response_modes":["json"]}],"input_contract":"Provide input or domain as a string up to 512 Unicode characters.","output_contract":"Returns IDN status, input type, A-label, U-label, scripts detected, confusable class, likely mimics, character notes, risk level, and explanation.","errors":"Empty input, invalid UTF-8, overly long input, or malformed punycode warning with fallback string analysis.","auth":"Anonymous for initial rollout.","rate_limits":"Public low-volume use. Formal headers and quotas are planned.","example_inputs":["{\"input\":\"xn--ypal-43d9g.com\"}","GET \/api\/v1\/isconfusable?input=xn--ypal-43d9g.com"],"example_outputs":["{\"is_idn\":true,\"is_confusable\":true,\"confusable_class\":\"mixed-script\",\"likely_mimics\":[{\"string\":\"paypal.com\"}]}"],"faq":[{"question":"Is this the same as punycode conversion?","answer":"No. Punycode conversion is included, but the skill also checks scripts, confusable characters, and likely visual mimic targets."}],"related":["domain-intelligence","dns-twister","is-this-a-redirect","redirect-chain","what-is-my-resolver"],"markdown_url":"https:\/\/dnsskills.md\/skills\/is-this-a-homoglyph.md"},{"title":"Is This a Redirect?","slug":"is-this-a-redirect","api_name":"isredirect","category":"Domain intelligence","status":"live","access_tier":"open","version":"v1","web_path":"\/is-this-a-redirect","docs_url":"https:\/\/dnsskills.md\/skills\/is-this-a-redirect","short_description":"Check whether a domain is listed as a redirect or URL shortener.","purpose":"Looks up the DomainSure redirect\/shortener signal for a domain and its parent candidates. This signal is also included in Domain Intelligence alongside Crypto Defender, Verified Hostile, and Riff Raff.","endpoints":[{"method":"GET\/POST","path":"\/api\/v1\/isredirect","status":"live","response_modes":["json"]}],"input_contract":"Provide a fully qualified domain name. Browser users may paste a URL; the hostname is extracted before lookup.","output_contract":"Returns normalized domain, exact lookup name, checked lookup names, matched listing domain, match type, listed status, redirect-or-shortener boolean, A listing records, TXT explanations, verdict, and summary.","errors":"Empty input, invalid domain, IP address input, overly long input, or DNS lookup failure.","auth":"Anonymous JSON API for initial rollout. Use the \/api\/v1 endpoint for agents; browser form submissions remain protected by CSRF and reCAPTCHA.","rate_limits":"JSON API uses the standard API throttle.","example_inputs":["GET \/api\/v1\/isredirect?domain=bit.ly","POST \/api\/v1\/isredirect {\"domain\":\"bit.ly\"}"],"example_outputs":["{\"skill\":\"isredirect\",\"domain\":\"bit.ly\",\"lookup_domain\":\"bit.ly.redirects.domainsure.zone\",\"is_redirect_or_url_shortener\":true,\"txt_records\":[\"Known URL shortener.\"],\"explanation\":\"Known URL shortener.\"}"],"faq":[{"question":"What DNS name is queried?","answer":"The skill queries the supplied domain below redirects.domainsure.zone, for example bit.ly.redirects.domainsure.zone."},{"question":"What does a TXT record mean?","answer":"When the exact lookup name or a checked parent-domain lookup has TXT records, the TXT text is returned as the explanation for the listing."},{"question":"Does not listed mean the domain never redirects?","answer":"No. It means the domain was not listed in this DomainSure redirect and URL shortener zone at lookup time."}],"related":["domain-intelligence","redirect-chain","dns-twister","is-this-a-homoglyph"],"markdown_url":"https:\/\/dnsskills.md\/skills\/is-this-a-redirect.md"},{"title":"Link Expander \/ Redirect Chain","slug":"redirect-chain","api_name":"redirectchain","category":"Domain intelligence","status":"live","access_tier":"open","version":"v1","web_path":"\/redirect-chain","docs_url":"https:\/\/dnsskills.md\/skills\/redirect-chain","short_description":"Expand a URL and inspect every HTTP redirect hop.","purpose":"Follows a URL through its HTTP redirect chain and reports status codes, redirect targets, response headers, bounded payload samples, and HTML metadata for each hop.","endpoints":[{"method":"GET\/POST","path":"\/api\/v1\/redirect-chain","status":"live","response_modes":["json"]},{"method":"GET\/POST","path":"\/api\/v1\/link-expander","status":"live-alias","response_modes":["json"]}],"input_contract":"Provide url, or link as an alias, as an http or https URL up to 2048 characters. If no scheme is supplied, https is assumed. Optional max_hops may be set from 1 to 20 and defaults to 10. Only standard HTTP and HTTPS ports are supported, and private or reserved network targets are blocked.","output_contract":"Returns normalized_url, final_url, hop_count, redirect_count, terminal_status_code, terminated_reason, verdict, summary, and a chain array. Each hop includes URL, status code, reason phrase, redirect target, duration, selected headers, payload sample metadata, and extracted page metadata such as title, description, canonical, robots, Open Graph, Twitter, and meta refresh values.","errors":"Empty URL, invalid URL, unsupported scheme, embedded credentials, unsupported port, DNS resolution failure, private or reserved network target, request failure, invalid Location header, or redirect loop. Reaching max_hops returns a warning with the partial chain.","auth":"Anonymous JSON API for initial rollout. Use the \/api\/v1 endpoint for agents; browser form submissions remain protected by CSRF and reCAPTCHA.","rate_limits":"JSON API uses the standard API throttle. Each request may perform up to max_hops outbound HTTP requests, so agents should keep max_hops low unless a longer chain is expected.","example_inputs":["GET \/api\/v1\/redirect-chain?url=https:\/\/bit.ly\/example","POST \/api\/v1\/link-expander {\"url\":\"https:\/\/example.com\",\"max_hops\":5}"],"example_outputs":["{\"skill\":\"redirectchain\",\"normalized_url\":\"https:\/\/short.example\/abc\",\"final_url\":\"https:\/\/example.com\/landing\",\"redirect_count\":1,\"chain\":[{\"hop\":1,\"status_code\":301,\"redirect_to\":\"https:\/\/example.com\/landing\"},{\"hop\":2,\"status_code\":200,\"metadata\":{\"title\":\"Example landing page\"}}]}"],"faq":[{"question":"Is this the same as Is This a Redirect?","answer":"No. Is This a Redirect checks a DNS-backed DomainSure listing for redirect and shortener domains. Redirect Chain performs a live HTTP fetch and follows the actual Location headers."},{"question":"Does it return entire page bodies?","answer":"No. The response includes bounded payload samples, byte counts, hashes, and metadata so agents can inspect the chain without pulling unbounded bodies into the response."},{"question":"What targets are blocked?","answer":"The skill only fetches http and https URLs on standard ports and blocks targets that resolve to private or reserved network addresses."}],"related":["social-preview","is-this-a-redirect","dns-twister","is-this-a-homoglyph"],"markdown_url":"https:\/\/dnsskills.md\/skills\/redirect-chain.md"},{"title":"Social Media Preview","slug":"social-preview","api_name":"socialpreview","category":"Domain intelligence","status":"live","access_tier":"open","version":"v1","web_path":"\/social-preview","docs_url":"https:\/\/dnsskills.md\/skills\/social-preview","short_description":"Inspect and render a page\u2019s Open Graph and Twitter Card preview.","purpose":"Helps humans and agents verify that a public page has a usable social sharing title, description, and image, with structured diagnostics for missing or unsafe metadata.","endpoints":[{"method":"GET\/POST","path":"\/api\/v1\/social-preview","status":"live","response_modes":["json"]}],"input_contract":"Provide url as an http or https URL up to 2048 characters. If no scheme is supplied, https is assumed. The checker follows up to five redirects. Private or reserved page targets and non-standard ports are blocked.","output_contract":"Returns a ready, partial, missing, or unavailable status; normalized and final URLs; redirect and HTTP status details; resolved title, description, site name, content type, canonical URL, Twitter card type, image URL, dimensions, fetch status, response content type, accessibility, and safety; boolean checks; warnings; and errors. Open Graph values take priority, followed by Twitter Card and ordinary HTML metadata.","errors":"Empty or invalid URL, unsupported scheme, embedded credentials, unsupported port, DNS resolution failure, private or reserved network target, request failure, invalid redirect, or redirect loop. Missing preview fields are returned as warnings with HTTP 200.","auth":"Anonymous JSON API for initial rollout. Use the \/api\/v1 endpoint for agents; browser form submissions remain protected by CSRF and reCAPTCHA.","rate_limits":"JSON API uses the standard API throttle. Each request may perform up to five outbound page requests and up to three requests while validating the preview image.","example_inputs":["GET \/api\/v1\/social-preview?url=https:\/\/example.com\/article","POST \/api\/v1\/social-preview {\"url\":\"https:\/\/example.com\/article\"}"],"example_outputs":["{\"skill\":\"socialpreview\",\"status\":\"ready\",\"has_preview\":true,\"title\":\"Example article\",\"description\":\"An example summary.\",\"image\":{\"url\":\"https:\/\/example.com\/social.jpg\",\"width\":1200,\"height\":630,\"status_code\":200,\"content_type\":\"image\/jpeg\",\"accessible\":true,\"display_safe\":true},\"checks\":{\"has_open_graph\":true,\"has_title\":true,\"has_description\":true,\"has_image\":true,\"image_is_accessible\":true}}"],"faq":[{"question":"Does this exactly reproduce every social network?","answer":"No. Networks apply their own crawlers, caches, crops, and fallback rules. This skill shows the metadata the page currently advertises and an approximate card rendering."},{"question":"What counts as ready?","answer":"A ready result has a title, description, and publicly displayable image. Partial results identify which core fields are missing."},{"question":"Will unsafe image URLs be displayed?","answer":"No. Images using unsupported schemes, credentials, unresolved hosts, or private and reserved network addresses are reported but not rendered in the browser preview."}],"related":["redirect-chain","is-this-a-redirect","is-this-a-homoglyph"],"markdown_url":"https:\/\/dnsskills.md\/skills\/social-preview.md"},{"title":"SPF Validator","slug":"spf-validator","api_name":"spf.validate","category":"DNS and email operations","status":"live","access_tier":"open","version":"v1","web_path":"\/spf-validator","docs_url":"https:\/\/dnsskills.md\/skills\/spf-validator","short_description":"Parse SPF records, evaluate recursive includes and redirects, and simulate sender authorization.","purpose":"Useful for mail operations, audits, and agent workflows that need deterministic SPF findings before changing DNS. Domain Intelligence supplies the published SPF record as a fast snapshot; this skill performs deeper validation.","endpoints":[{"method":"POST","path":"\/api\/tools\/spf\/validate","status":"live","response_modes":["json"]},{"method":"POST","path":"\/api\/tools\/spf\/evaluate","status":"live","response_modes":["json"]}],"input_contract":"Provide a domain. Optional sender_ip adds sender simulation without requiring Mail From or HELO. Optional spf_record and dns_records can be supplied for deterministic offline analysis. The evaluate endpoint also accepts mail_from and helo.","output_contract":"Returns parsed terms, recursive include\/redirect traversal, DNS lookup and void lookup counts, sender simulation results when requested, and structured findings.","errors":"Invalid domain, invalid sender IP, malformed SPF mechanisms, multiple SPF records, loop detection, or DNS lookup-limit findings.","auth":"Anonymous JSON API for initial rollout. Browser form submissions use standard Laravel CSRF protection.","rate_limits":"JSON API uses the standard API throttle. DNS traversal is bounded by SPF lookup limits and loop detection.","example_inputs":["POST \/api\/tools\/spf\/validate {\"domain\":\"example.com\"}","POST \/api\/tools\/spf\/evaluate {\"domain\":\"example.com\",\"sender_ip\":\"192.0.2.10\",\"mail_from\":\"sender@example.com\"}"],"example_outputs":["{\"tool\":\"spf.validate\",\"domain\":\"example.com\",\"dns\":{\"lookup_count\":2},\"findings\":[{\"code\":\"SPF_RECORD_PARSED\",\"severity\":\"Info\"}]}"],"faq":[{"question":"Can agents avoid live DNS?","answer":"Yes. Provide spf_record and optional dns_records in the request to analyze a deterministic policy snapshot."},{"question":"Is this the same as the SPF Flattener?","answer":"No. The validator explains policy health and sender outcomes. The flattener produces a flattened SPF record for DNS publishing."}],"related":["domain-intelligence","spf-flattener","dns-twister","what-is-my-public-ip"],"markdown_url":"https:\/\/dnsskills.md\/skills\/spf-validator.md"},{"title":"SPF Flattener","slug":"spf-flattener","api_name":"spfflattener","category":"DNS and email operations","status":"live","access_tier":"open","version":"v1","web_path":"\/spf-flatten","docs_url":"https:\/\/dnsskills.md\/skills\/spf-flattener","short_description":"Resolve SPF includes and produce a flattened TXT record.","purpose":"Useful for mail operations, audits, and agent workflows that need to reason about SPF include expansion and transformation. Domain Intelligence supplies the published SPF record as a fast snapshot.","endpoints":[{"method":"POST","path":"\/api\/v1\/spf-flattener","status":"live","response_modes":["json"]}],"input_contract":"Provide a domain name whose TXT records contain an SPF policy.","output_contract":"Returns traversal stages, raw output, an optimized flattened SPF record, ordered DNS TXT character strings capped at 255 bytes, publication warnings, or a DNS\/error message.","errors":"Invalid domain, no SPF record, DNS lookup failure, flattening process failure.","auth":"Anonymous JSON API for initial rollout. Use the \/api\/v1 endpoint for agents; browser form submissions remain protected by CSRF and reCAPTCHA.","rate_limits":"JSON API uses the standard API throttle.","example_inputs":["POST \/api\/v1\/spf-flattener {\"domain\":\"example.com\"}"],"example_outputs":["{\"domain\":\"example.com\",\"finalSPFRecord\":\"v=spf1 ip4:192.0.2.0\/24 ~all\"}"],"faq":[{"question":"Should every SPF record be flattened?","answer":"No. Flattening can help with lookup limits, but it also creates maintenance obligations when provider ranges change."},{"question":"Can an agent post to the web form route?","answer":"No. Agents should post JSON to \/api\/v1\/spf-flattener. The \/spf-flatten\/process route is a browser form path and intentionally requires CSRF and reCAPTCHA."}],"related":["domain-intelligence","spf-validator","dns-twister","what-is-my-public-ip"],"markdown_url":"https:\/\/dnsskills.md\/skills\/spf-flattener.md"},{"title":"DNS Twister","slug":"dns-twister","api_name":"dnstwister","category":"Domain intelligence","status":"live","access_tier":"open-basic","version":"v1","web_path":"\/dns-twister","docs_url":"https:\/\/dnsskills.md\/skills\/dns-twister","short_description":"Generate and inspect lookalike domain permutations.","purpose":"Supports typo, phishing, bit-flip, and homoglyph-adjacent domain intelligence workflows.","endpoints":[{"method":"POST","path":"\/api\/v1\/dns-twister","status":"live","response_modes":["json"]}],"input_contract":"Provide a fully qualified ASCII domain name. Optional resolve boolean defaults to false for fast agent use. The default skips DNS resolution and the expanded TLD dictionary. Set resolve=true only when DNS observations and expanded TLD swaps are required. Optional timeout_seconds may be set from 5 to 75 seconds.","output_contract":"Returns generated variants and variant type. When resolve=true, rows may include observed IP address, additional DNS information, and expanded TLD swaps. Timeout responses return timed_out=true with guidance.","errors":"Invalid domain, backend generation process failure, or a 504 timeout if the server-side process limit is hit.","auth":"Anonymous JSON API for initial rollout. Use the \/api\/v1 endpoint for agents; browser form submissions remain protected by CSRF and reCAPTCHA.","rate_limits":"JSON API uses the standard API throttle. Default resolve=false calls are intended to be fast. Deep resolve=true calls are bounded by a server timeout.","agent_runtime":{"mode":"blocking","default_mode":"generate-only-no-expanded-tlds","expected_seconds":"1-5","resolve_expected_seconds":"30-75","recommended_timeout_seconds":90,"server_timeout_seconds":75,"retry_guidance":"Do not retry while the original request is still open. If resolve=true times out, retry with resolve=false for fast variant generation or retry the deep scan later.","progress_guidance":"This initial endpoint does not stream progress. Default resolve=false requests skip DNS resolution and the expanded TLD dictionary. Requests return JSON 504 if they hit the server timeout."},"example_inputs":["POST \/api\/v1\/dns-twister {\"domain\":\"example.com\"}","POST \/api\/v1\/dns-twister {\"domain\":\"example.com\",\"resolve\":true,\"timeout_seconds\":75}"],"example_outputs":["{\"domain\":\"example.com\",\"resolve\":false,\"timed_out\":false,\"rows\":[{\"type\":\"homoglyph\",\"domain\":\"example.com\"}]}"],"faq":[{"question":"How is this different from the homoglyph skill?","answer":"DNS Twister generates possible lookalike domains for a target. The homoglyph skill analyzes a supplied string or domain."},{"question":"Can an agent post to the web form route?","answer":"No. Agents should post JSON to \/api\/v1\/dns-twister. The \/dns-twister\/process route is a browser form path and intentionally requires CSRF and reCAPTCHA."}],"related":["is-this-a-homoglyph","is-this-a-redirect","redirect-chain","spf-flattener"],"markdown_url":"https:\/\/dnsskills.md\/skills\/dns-twister.md"}],"links":{"catalog":"https:\/\/dnsskills.md\/skills","markdown_catalog":"https:\/\/dnsskills.md\/skills.md","llms_txt":"https:\/\/dnsskills.md\/llms.txt","openapi":"https:\/\/dnsskills.md\/openapi.yaml","agent_card":"https:\/\/dnsskills.md\/.well-known\/agent-card.json","ai_plugin":"https:\/\/dnsskills.md\/.well-known\/ai-plugin.json","x402":"https:\/\/dnsskills.md\/.well-known\/x402","github":"https:\/\/github.com\/easydns\/dns-agent-skills","execution_base":"https:\/\/app.domainhelp.com"}}