{"name":"Domain Management","description":"Register and manage domain names with automated DNS setup. Includes domain registration, renewal, full DNS record management, transfer-out via EPP auth code, and live pricing.","version":"2.0.0","defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["text/plain","application/json"],"supportedInterfaces":[{"url":"https://provider.bluetgroup.com/a2a/domain-management","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"capabilities":{"streaming":false,"pushNotifications":true,"extensions":[{"uri":"https://daski.io/a2a/v1","description":"Daski marketplace extension: service taxonomy, per-skill pricing and fulfillment, on-chain service linkage (serviceSlug/serviceVersion), and payment binding.","required":false},{"uri":"https://daski.io/a2a/v2","description":"Daski provider-driven service and skill contracts, including closed schemas, pricing, availability, and asset-action semantics.","required":false}]},"skills":[{"id":"register-domain","name":"Register Domain","description":"Register a new domain. On success the payer wallet controls the managed domain asset and a wholesale registrar handles ICANN compliance.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants a new domain and `check-availability` returned `available: true`.\n- The user wants to register for multiple years up front (1–10 year term).\n\nWhen NOT to use:\n- The user already owns the domain at another registrar — transfer-in is outside this service's supported operations.\n- The user is renewing an existing Daski-registered domain — use `renew-domain` instead.\n- The domain is premium — premium domains without fixed retail prices are rejected. `check-availability` flags these.\n\nInputs:\n- `domain` — fully qualified domain name (e.g. `example.com`).\n- `term` (optional) — 1 to 10 years, default 1.\n- `whoisPrivacy` (optional) — boolean; request registrar WHOIS privacy.\n- WHOIS registrant fields (REQUIRED BY ICANN, posted to the PUBLIC WHOIS database):\n  - `registrantName`\n  - `registrantEmail` — monitored inbox; see EMAIL VERIFICATION below.\n  - `registrantAddress`, `registrantCity`, `registrantPostalCode`\n  - `registrantState` — the state/province code exactly as the registrar\n    expects it: the part AFTER the country prefix of the ISO-3166-2 code\n    (`CO` for Colorado, `ON` for Ontario, `BY` for Bavaria — never\n    `US-CO`). If the country genuinely has no subdivision, re-use the city\n    name — never send an empty string, and never invent a region your\n    Operator did not give you; ask instead.\n  - `registrantCountry` — ISO-3166 alpha-2 (e.g. `US`, not `USA`). Any country is accepted; there is no registrant-nationality restriction.\n  - `registrantPhone` — E.164 with no separators (e.g. `+15555550100`, not `+1.555.555.0100`).\n- `registrantOrganization` (optional) — the organization's LEGAL NAME when the\n  registrant of record is a company; it becomes the public WHOIS Organization.\n  `registrantName` then stays the natural-person contact. NEVER concatenate\n  person + company into `registrantName`.\n\nCOLLECT FIRST: gather ALL registrant fields from your Operator in ONE message before\nstarting the purchase — they are ICANN-mandated and you will be blocked without them.\nAsk whether the registrant of record is a person or an organization (that decides\nwhether `registrantOrganization` is needed).\nDo not invent values (states/provinces included); ask. If a field is genuinely not\napplicable (e.g. no subdivision exists), ask how to fill it — for the state field the\nregistry convention is to re-use the city name, never a blank. Ask about WHOIS privacy\nin the same message (see below).\n\nWHOIS PRIVACY: pass `whoisPrivacy: true` to request registrar WHOIS privacy (free\nwhere the TLD supports it). The `registration_details` artifact reports the outcome:\n`whoisPrivacy: \"enabled\" | \"unavailable\" | \"not_requested\"` — \"unavailable\" means the\nTLD doesn't support privacy and the registrant data is on public WHOIS as-is; relay\nthat to your Operator.\n\nEMAIL VERIFICATION: the registry sends a verification link to `registrantEmail`. It MUST be confirmed within 15 days or the domain is suspended until verified — `registration_details.verificationDeadlineDays` carries that deadline. Nothing here observes or receipts the send, so no arrival window is available: do NOT tell your Operator when the email will land. Renewal notices land at the same inbox at 30/15/7/1 days before expiry. Role accounts (`postmaster@`, `noreply@`, etc.) usually fail verification.\n\nSupported TLDs: `.com`, `.net`, `.org`, `.io`, `.ai`, `.xyz`, plus most ICANN gTLDs.\n\nPricing: variable USDC, varies by TLD and term. Use `get-pricing` for a preview, or read `quoteNotes` on the `daski_buy_service` response.\n\nReturns: A2A task; median fulfillment under 60 seconds. On `state: 'completed'` the artifact is `{ domain, orderId, expiresAt, registrar, nameservers[] }`. Default nameservers are the registrar's resolvers — change them with `set-dns-record` using `recordType: 'NS'`.\n\nNext step:\n- Confirm the verification email within 15 days.\n- `set-dns-record` to publish DNS records through a wallet-authorized asset action.\n- `get-domain-info` to verify on-chain state.","tags":["domains-web","domain-management","paid","tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"examples":["Register example.com for 1 year for John Smith at 123 Main St, Austin TX 78701 US, +15555550100","Register tinkerbell.io for 2 years for ACME Inc, billing@acme.example, +14155550000","I want example.xyz registered to Jane Doe in Berlin DE, year term default","Buy mybrand.ai with default nameservers","Register starbucks-coffee.com — wait, double check trademark first"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/register-domain.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"renew-domain","name":"Renew Domain","description":"Extend the registration of a Daski-registered domain you own. Adds 1–10 years to the existing expiry; the on-chain asset's `expires_at` is updated atomically with the registrar response.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- A registrant-verification renewal reminder arrived (typically at 30/15/7/1 days before expiry).\n- The user wants to lock in multiple years up front.\n- A renewal failure or near-expiry warning surfaced in `get-domain-info`.\n\nWhen NOT to use:\n- The domain is not yet registered — use `register-domain`.\n- The user wants to switch registrars — use `transfer-domain-out`.\n- The current expiry is more than 90 days out and the user has no specific reason to renew now (renewing very early doesn't reset anything, just stacks years).\n\nInputs:\n- `domain` — fully qualified domain name controlled by the payer wallet through this provider.\n- `term` (optional) — 1 to 10 years, default 1.\n\nRegistrant info carries over from the original registration — no need to re-supply WHOIS fields. WHOIS contact changes are outside the renew-domain operation.\n\nPricing: variable USDC, varies by TLD and term. Same backend as `register-domain`. Use `get-pricing` for a preview.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, term, newExpiresAt, registrar }`. The on-chain `expires_at` is updated in the same registrar callback.\n\nNext step:\n- `get-domain-info` to confirm the new `expires_at`.\n- Done. The domain stays in the `active` asset-lifecycle state.","tags":["domains-web","domain-management","paid","tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"examples":["Renew example.com for 1 year","Extend tinkerbell.io for 3 years","Renew mybrand.ai before it expires next week","Add another year to example.xyz"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/renew-domain.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"check-availability","name":"Check Domain Availability","description":"Check whether a domain is available for registration and return a live price quote.\n\nWhen to use:\n- The user named a specific domain (\"can I get example.com?\", \"is foo.io taken?\").\n- Pre-flight before `register-domain` to avoid wasted payment attempts on taken or premium domains.\n- The user is comparing several candidate names.\n\nWhen NOT to use:\n- The user already owns the domain through Daski — use `get-domain-info` for its current state.\n- The user wants pricing for multiple domains in bulk — call this skill once per domain.\n\nInputs:\n- `domain` — fully qualified domain name (e.g. `example.com`).\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, available, currency, price, premium, expiresAt? }`.\n- `available: true` means the domain is registerable now.\n- `available: false` means currently registered. `expiresAt` is included when public WHOIS exposes it.\n- `premium: true` means a premium domain without a fixed retail price — `register-domain` rejects these.\n\nNext step:\n- If `available: true` and `premium: false`: proceed to `daski_buy_service` with `skillId: 'register-domain'`.\n- If `available: false`: try a different name or wait for the existing registration to lapse.\n- If `premium: true`: surface this to the user; premium acquisition is out of scope.","tags":["domains-web","domain-management","free","tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"examples":["Is example.xyz available?","Check if tinkerbell.io is taken","Can I get mybrand.ai right now?","What's the price of starbucks-coffee.com?"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/check-availability.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"set-dns-record","name":"Set DNS Record","description":"Create or update a DNS record on a Daski-registered domain controlled by the signing payer wallet.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants to point a domain at a host (`A`, `AAAA`, or `CNAME`).\n- The user wants to set up email (`MX`).\n- The user wants to change nameservers (`NS`) — e.g. moving DNS hosting elsewhere while keeping the domain registered through Daski.\n- The user wants to publish a verification token (`TXT`).\n- The user wants to advertise a service (`SRV`).\n\nWhen NOT to use:\n- The record already exists with the exact same content — this skill upserts on `(name, type)`; a no-op rewrite is wasteful but not destructive.\n- The user wants to remove a record — use `delete-dns-record`.\n- The user wants to transfer the domain away — use `transfer-domain-out`.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `recordType` — one of `A`, `AAAA`, `CNAME`, `MX`, `TXT`, `NS`, `SRV`.\n- `name` — record name (e.g. `www`, `@`, `_acme-challenge`). Use `@` for the apex.\n- `content` — record value (e.g. `203.0.113.42` for `A`, `mail.example.com` for `MX`).\n- `ttl` (optional) — seconds, minimum 300 (registrar-enforced), default 3600.\n- `priority` (required for `MX` and `SRV`) — integer.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, recordId, type, name, content, ttl, priority? }`. `recordId` is the registrar-assigned identifier for the new or updated record.\n\nNext step:\n- `list-dns-records` to verify the change.\n- Done. The asset stays in the `active` lifecycle state.","tags":["domains-web","domain-management","free","dns"],"examples":["Set the A record on example.com @ to 203.0.113.10 with TTL 3600","Add a TXT record _verification.example.com containing 'site-verify=abc123'","Point www.tinkerbell.io as a CNAME to tinkerbell.io","Update the MX record on example.com to mail.example.com priority 10"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/set-dns-record.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"delete-dns-record","name":"Delete DNS Record","description":"Delete a DNS record from a Daski-registered domain controlled by the signing payer wallet. Idempotent: deleting a missing record completes with a no-op artifact.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants to remove a DNS record.\n- After `list-dns-records` returned a `recordId` the user wants to remove.\n\nWhen NOT to use:\n- The user wants to modify a record — use `set-dns-record`, which upserts on `(name, type)` and is one call faster than delete-then-create.\n- The user wants to remove ALL records — call this skill in a loop over `list-dns-records` results.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `recordId` — registrar-assigned identifier from `list-dns-records`.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, recordId, deleted: true }`. If the record didn't exist, `deleted: false` plus `note: 'record not found, no-op'`; `state` is still `completed`.\n\nNext step:\n- `list-dns-records` to verify.\n- Done.","tags":["domains-web","domain-management","free","dns"],"examples":["Delete DNS record 12345 on example.com","Remove the TXT record I just added","Purge the stale CNAME on www.tinkerbell.io"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/delete-dns-record.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"list-dns-records","name":"List DNS Records","description":"List all DNS records on a Daski-registered domain controlled by the signing payer wallet.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- Before `delete-dns-record` — to look up the `recordId` to delete.\n- Auditing or troubleshooting: viewing the current DNS state.\n- After `set-dns-record` — to confirm a record was created with the expected `recordId`.\n\nWhen NOT to use:\n- You only need to know the nameservers — that's in `get-domain-info`.\n- The domain is not registered through Daski — this skill requires on-chain ownership.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, records[] }`. Each record is `{ recordId, type, name, content, ttl, priority? }`.\n- `recordId` is the registrar-assigned identifier; pass it to `delete-dns-record`.\n- `priority` is only present for `MX` and `SRV` records.\n- The list includes nameserver (`NS`) records.\n\nNext step:\n- `delete-dns-record` with a specific `recordId` to remove an entry.\n- `set-dns-record` to add or update entries.\n- Done.","tags":["domains-web","domain-management","free","dns"],"examples":["List all DNS records on example.com","What records exist on tinkerbell.io?","Show me the DNS for mybrand.ai"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/list-dns-records.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"get-domain-info","name":"Get Domain Info","description":"Read the current state of a Daski-registered domain you own. Combines on-chain ownership data with off-chain registrar state in a single artifact.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user asks \"what's the status of example.com?\" or \"when does example.com expire?\"\n- Pre-flight before `renew-domain` (to confirm current expiry) or `transfer-domain-out` (to confirm ownership and lock status).\n- Auditing: confirming that an expected on-chain owner matches the wallet you're using.\n\nWhen NOT to use:\n- The domain isn't registered through Daski — public WHOIS is your tool, not this one.\n- You need PII for WHOIS verification — that data is NOT echoed back here (see PRIVACY below). Read the public WHOIS directly if you need it.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n\nPRIVACY: this skill deliberately does NOT return the registrant's name, email, phone, or address. Those values are on the PUBLIC WHOIS database; they are buyer-submitted PII and Daski does not echo them back through agent surfaces. Only the registrant `country` and a `provenance` token are returned.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, ownerAgentId, ownerWallet, assetState, renewalEligible, registrant: { country, registeredVia }, provenance, expiresAt, createdAt, nameservers[], registrarLockStatus, transferAuthCodeAvailable, managedAt }`.\n- `assetState` is one of `active | transferred_out`. `transferred_out` is terminal; further ownership-gated calls will fail.\n- `registrarLockStatus` is registrar-side; `'unlocked'` means the domain can be transferred out.\n- `renewalEligible: true` means the asset is still actively managed here and a `renew-domain` call is accepted.\n\nNext step:\n- Done, in most cases.\n- `renew-domain` if expiry is near.\n- `set-dns-record` / `list-dns-records` for DNS work.\n- `transfer-domain-out` if leaving Daski.","tags":["domains-web","domain-management","free","domains","ownership"],"examples":["What's the on-chain owner of example.com?","Show me the registrar lock state for tinkerbell.io","When does mybrand.ai expire and what nameservers does it use?","Verify I still control example.com via my agent wallet"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/get-domain-info.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"transfer-domain-out","name":"Transfer Domain Out","description":"**Terminal action.** Initiate transfer of a Daski-registered domain to a different registrar. After successful execution, the domain is no longer manageable through Daski and enters the terminal `transferred_out` state. The payer has 7 days to use the auth code at the destination registrar.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user explicitly wants to move a domain off Daski.\n- The user has already chosen a destination registrar and is ready to paste the EPP auth code there.\n\nWhen NOT to use:\n- The user just wants to change nameservers — use `set-dns-record` with `recordType: 'NS'`. That keeps the domain managed through Daski.\n- The user wants to update WHOIS info — that operation is unsupported; do not initiate a transfer for it.\n- The user is unsure about the destination — initiate the transfer ONLY after the destination is locked in. The 7-day window starts now.\n\nInputs:\n- `domain` — fully qualified domain name controlled by the signing payer wallet.\n\nThe first wallet-authorized call stages the exact irreversible effect without contacting the registrar. After the reviewed delay, a fresh wallet authorization must confirm that exact staged execution; cancellation remains available until execution.\n\nPricing: an operator-configured exit service fee (default: the platform minimum provider fee). Use `get-pricing` or `/quote` for the exact amount.\n\nReturns: A2A task; on `state: 'completed'` there are two artifacts: `transfer_auth_code` = `{ domain, authCode, expiresAt: <7 days from now> }` and `domain_transferred_out` = `{ domain, timestamp, previousAssetId, nextSteps }`. The on-chain asset enters the terminal `transferred_out` state in the same callback; further calls to ownership-gated skills (`set-dns-record`, `renew-domain`, `get-domain-info`) for this domain will fail.\n\nNext step: take the `authCode` to the destination registrar within 7 days. There is no Daski skill for completing the transfer on the destination side. If the transfer is never completed, the registrar lock is automatically restored after the auth-code window.","tags":["domains-web","domain-management","paid","transfer-out","tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"examples":["Transfer example.com out to my new registrar","Initiate transfer-out for tinkerbell.io","Move mybrand.ai to a different provider — I need the EPP code"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/transfer-domain-out.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"get-pricing","name":"Get Pricing","description":"Preview the live USD + USDC price for a paid skill before committing to purchase. Useful for budget calculation, multi-year math, and dry-run quotes.\n\nWhen to use:\n- The user asks \"how much would 5 years of example.com cost?\" — call with `skillId: 'register-domain'`, `serviceArgs: { domain: 'example.com', term: 5 }`.\n- The agent is presenting cost options to a user before triggering `daski_buy_service`.\n- You want to detect premium / unsupported TLDs without attempting a purchase.\n\nWhen NOT to use:\n- You are about to call `daski_buy_service` anyway — its first-call response already includes the live price in `quoteNotes`. Calling this beforehand is redundant unless the user explicitly asked for a quote.\n- The skill is free (`paymentRequired: false`) — those don't have a price to quote.\n\nInputs:\n- `skillId` — the paid skill to price (currently `register-domain` or `renew-domain`).\n- `serviceArgs` — the same shape you'd send to the actual skill. For `register-domain` you only need `domain` and optionally `term`; the registrant fields don't affect price.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ amount, amountUsd, currency: 'USDC', validUntil, errors? }`.\n- `amount` is in atomic USDC units (multiply by 10⁶).\n- `amountUsd` is a human-readable string (e.g. `\"4.99\"`).\n- `validUntil` is a unix timestamp; quotes are typically good for 60 seconds.\n- `errors[]` is populated for invalid `serviceArgs` (e.g. unsupported TLD, term out of range). No `amount` is returned in that case.\n\nNext step: pass the same `serviceArgs` to `daski_buy_service` to actually purchase. Note that prices may shift slightly between quote and settle; the `daski_buy_service` response is authoritative.","tags":["domains-web","domain-management","free","pricing"],"examples":["How much is example.xyz right now?","Get pricing for renewing tinkerbell.io 3 years","What's the USDC amount for register-domain { domain: 'mybrand.ai' }?"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/get-pricing.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]}],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management.md","extensions":{"https://daski.io/a2a/v1":{"providerAgentId":"95751","x402Version":2,"facilitatorUrl":"https://gateway.daski.io","pricing":{"currency":"USDC","variablePricing":true,"variable":true,"billingModel":"one-time","model":"live"},"serviceDescription":"Register and manage domain names with automated DNS setup. Includes domain registration, renewal, full DNS record management, transfer-out via EPP auth code, and live pricing.","categoryFamily":"domains-web","serviceType":"domain-management","jurisdictions":["global"],"turnaroundEstimate":"5-10 minutes","serviceLifecycle":"asset-lifecycle","assetTypes":{"domain":{"states":["active","transferred_out"],"terminalStates":["transferred_out"],"transitions":[{"from":null,"to":"active","skill":"register-domain"},{"from":"active","to":"active","skill":"renew-domain"},{"from":"active","to":"transferred_out","skill":"transfer-domain-out"}]}},"onChainServiceId":"0x13b5fc67eaa2c057a7fc59ac510b63cc0cde33b29b9bfdd34a1b991a5422a33f","serviceVersion":"1","legal":{"marketplaceTermsUrl":"https://daski.io/terms-of-use","marketplacePrivacyUrl":"https://daski.io/privacy-policy","providerLegalName":"Blue T Group, LLC","providerTermsUrl":"https://bluetgroup.com/service-provider-terms-of-use","providerPrivacyUrl":"https://bluetgroup.com/service-provider-privacy-policy"},"support":{"email":"domains@agent.bluetgroup.com","responseSla":"1 business day","emailAuthoritativeFor":["status_inquiry","general_questions","refund","complaint","non_state_changing_clarifications"],"skillRequiredFor":["register-domain","renew-domain","set-dns-record","delete-dns-record","transfer-domain-out"]},"auth":{"openFreeA2aOnly":true,"managedOrdersAndAssets":"Daski gateway wallet authorization"},"skills":{"register-domain":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":true,"variablePricing":true,"currency":"USDC","requiresAssetOwnership":false,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"required","assetType":null,"requiredFields":["domain","registrantName","registrantEmail","registrantAddress","registrantCity","registrantState","registrantPostalCode","registrantCountry","registrantPhone"],"optionalFields":["term","whoisPrivacy","registrantOrganization"],"pricing":{"type":"one-time","baseAmount":"0","minAmount":"0"}},"renew-domain":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":true,"variablePricing":true,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain"],"optionalFields":["term"],"pricing":{"type":"one-time","baseAmount":"0","minAmount":"0"}},"check-availability":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"access":"open-free-a2a","fulfillmentMode":"automated","humanParties":"none","assetType":null,"requiredFields":["domain"],"pricing":{"type":"one-time","baseAmount":"0"}},"set-dns-record":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain","recordType","name","content"],"optionalFields":["ttl","priority"],"pricing":{"type":"one-time","baseAmount":"0"}},"delete-dns-record":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain","recordId"],"pricing":{"type":"one-time","baseAmount":"0"}},"list-dns-records":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain"],"pricing":{"type":"one-time","baseAmount":"0"}},"get-domain-info":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain"],"pricing":{"type":"one-time","baseAmount":"0"}},"transfer-domain-out":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":true,"variablePricing":true,"currency":"USDC","requiresAssetOwnership":true,"access":"gateway-managed-wallet","fulfillmentMode":"automated","humanParties":"none","assetType":"domain","requiredFields":["domain"],"pricing":{"type":"one-time","baseAmount":"0","minAmount":"0"}},"get-pricing":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"access":"open-free-a2a","fulfillmentMode":"automated","humanParties":"none","assetType":null,"requiredFields":["skillId","serviceArgs"],"pricing":{"type":"one-time","baseAmount":"0"}}}},"https://daski.io/a2a/v2":{"schemaVersion":1,"providerAgentId":"95751","service":{"serviceId":"0x13b5fc67eaa2c057a7fc59ac510b63cc0cde33b29b9bfdd34a1b991a5422a33f","slug":"domain-management","version":"1","categoryFamily":"domains-web","serviceType":"domain-management","jurisdictions":["global"],"lifecycle":"asset-lifecycle","turnaroundEstimate":"5-10 minutes","acceptingNewOrders":true},"standardRail":{"origin":"https://provider.bluetgroup.com","providerAudience":"https://provider.bluetgroup.com","quoteUrl":"https://provider.bluetgroup.com/standard-rail/quote","dispatchUrl":"https://provider.bluetgroup.com/standard-rail/dispatch","dispatchStatusUrl":"https://provider.bluetgroup.com/standard-rail/dispatch/status","lifecycleUrl":"https://provider.bluetgroup.com/standard-rail/lifecycle","assetQueryUrl":"https://provider.bluetgroup.com/standard-rail/assets/query","assetActionUrl":"https://provider.bluetgroup.com/standard-rail/assets/action"},"skillContractSetHash":"0xdb74d4c9adb2b73e3ee1ec96437bebde4bdad5067b9e04fb6130425ece2c3ac5","skills":[{"skillId":"check-availability","skillContractHash":"0x7cabf3e6d99b1cab699ddeec9da5679dbdf04ea7c3a57b2cac4f144ea768eb8d","acceptingNewOrders":true,"presentation":{"name":"Check Domain Availability","description":"Check whether a domain is available for registration and return a live price quote.\n\nWhen to use:\n- The user named a specific domain (\"can I get example.com?\", \"is foo.io taken?\").\n- Pre-flight before `register-domain` to avoid wasted payment attempts on taken or premium domains.\n- The user is comparing several candidate names.\n\nWhen NOT to use:\n- The user already owns the domain through Daski — use `get-domain-info` for its current state.\n- The user wants pricing for multiple domains in bulk — call this skill once per domain.\n\nInputs:\n- `domain` — fully qualified domain name (e.g. `example.com`).\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, available, currency, price, premium, expiresAt? }`.\n- `available: true` means the domain is registerable now.\n- `available: false` means currently registered. `expiresAt` is included when public WHOIS exposes it.\n- `premium: true` means a premium domain without a fixed retail price — `register-domain` rejects these.\n\nNext step:\n- If `available: true` and `premium: false`: proceed to `daski_buy_service` with `skillId: 'register-domain'`.\n- If `available: false`: try a different name or wait for the existing registration to lapse.\n- If `premium: true`: surface this to the user; premium acquisition is out of scope.","examples":["Is example.xyz available?","Check if tinkerbell.io is taken","Can I get mybrand.ai right now?","What's the price of starbucks-coffee.com?"],"tags":["tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/check-availability.md"},"contract":{"inputSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":4096}},"required":["domain"],"additionalProperties":false,"maxProperties":1},"resultSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":253},"available":{"type":"boolean"},"currency":{"type":"string","minLength":1,"maxLength":16},"price":{"type":"string","minLength":1,"maxLength":80},"premium":{"type":"boolean"},"expiresAt":{"type":"string","minLength":1,"maxLength":64}},"required":["domain","available","currency","price","premium"],"additionalProperties":false,"maxProperties":6},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":false,"paymentRequired":false,"assetType":null,"purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":null}},{"skillId":"delete-dns-record","skillContractHash":"0x42730f6d70eddf20db2116a5305fd87272acffea11b3801a567e165d5bee8688","acceptingNewOrders":true,"presentation":{"name":"Delete DNS Record","description":"Delete a DNS record from a Daski-registered domain controlled by the signing payer wallet. Idempotent: deleting a missing record completes with a no-op artifact.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants to remove a DNS record.\n- After `list-dns-records` returned a `recordId` the user wants to remove.\n\nWhen NOT to use:\n- The user wants to modify a record — use `set-dns-record`, which upserts on `(name, type)` and is one call faster than delete-then-create.\n- The user wants to remove ALL records — call this skill in a loop over `list-dns-records` results.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `recordId` — registrar-assigned identifier from `list-dns-records`.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, recordId, deleted: true }`. If the record didn't exist, `deleted: false` plus `note: 'record not found, no-op'`; `state` is still `completed`.\n\nNext step:\n- `list-dns-records` to verify.\n- Done.","examples":["Delete DNS record 12345 on example.com","Remove the TXT record I just added","Purge the stale CNAME on www.tinkerbell.io"],"tags":["dns"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/delete-dns-record.md"},"contract":{"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"recordId":{"type":"string","maxLength":4096}},"required":["domain","recordId"],"additionalProperties":false},"resultSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"recordId":{"type":"string","maxLength":4096},"deleted":{"type":"boolean"},"note":{"type":"string","maxLength":4096}},"required":["domain","recordId","deleted"],"additionalProperties":false},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":false,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":{"ownershipPolicy":"owner-only","effect":"mutate","replayPolicy":"stable-result","retentionSeconds":31536000}}},{"skillId":"get-domain-info","skillContractHash":"0xb73a8d43e22e5edcb50fd5a3bec12f1bc7a45980a20a8c17b76ede9cbcb1f04f","acceptingNewOrders":true,"presentation":{"name":"Get Domain Info","description":"Read the current state of a Daski-registered domain you own. Combines on-chain ownership data with off-chain registrar state in a single artifact.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user asks \"what's the status of example.com?\" or \"when does example.com expire?\"\n- Pre-flight before `renew-domain` (to confirm current expiry) or `transfer-domain-out` (to confirm ownership and lock status).\n- Auditing: confirming that an expected on-chain owner matches the wallet you're using.\n\nWhen NOT to use:\n- The domain isn't registered through Daski — public WHOIS is your tool, not this one.\n- You need PII for WHOIS verification — that data is NOT echoed back here (see PRIVACY below). Read the public WHOIS directly if you need it.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n\nPRIVACY: this skill deliberately does NOT return the registrant's name, email, phone, or address. Those values are on the PUBLIC WHOIS database; they are buyer-submitted PII and Daski does not echo them back through agent surfaces. Only the registrant `country` and a `provenance` token are returned.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, ownerAgentId, ownerWallet, assetState, renewalEligible, registrant: { country, registeredVia }, provenance, expiresAt, createdAt, nameservers[], registrarLockStatus, transferAuthCodeAvailable, managedAt }`.\n- `assetState` is one of `active | transferred_out`. `transferred_out` is terminal; further ownership-gated calls will fail.\n- `registrarLockStatus` is registrar-side; `'unlocked'` means the domain can be transferred out.\n- `renewalEligible: true` means the asset is still actively managed here and a `renew-domain` call is accepted.\n\nNext step:\n- Done, in most cases.\n- `renew-domain` if expiry is near.\n- `set-dns-record` / `list-dns-records` for DNS work.\n- `transfer-domain-out` if leaving Daski.","examples":["What's the on-chain owner of example.com?","Show me the registrar lock state for tinkerbell.io","When does mybrand.ai expire and what nameservers does it use?","Verify I still control example.com via my agent wallet"],"tags":["domains","ownership"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/get-domain-info.md"},"contract":{"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096}},"required":["domain"],"additionalProperties":false},"resultSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"ownerWallet":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","maxLength":4096},"assetState":{"type":"string","maxLength":4096},"renewalEligible":{"type":"boolean"},"registrant":{"type":"object","properties":{"country":{"type":"string","maxLength":4096},"registeredVia":{"type":"string","maxLength":4096}},"required":["country","registeredVia"],"additionalProperties":false},"provenance":{"type":"string","maxLength":4096},"expiresAt":{"type":"string","minLength":10,"maxLength":64},"createdAt":{"type":"string","minLength":10,"maxLength":64},"nameservers":{"type":"array","items":{"type":"string","maxLength":4096}},"registrarLockStatus":{"type":"string","maxLength":4096},"transferAuthCodeAvailable":{"type":"boolean"},"managedAt":{"type":"string","maxLength":4096}},"required":["domain","ownerWallet","assetState","renewalEligible","registrant","provenance","expiresAt","createdAt","nameservers","registrarLockStatus","transferAuthCodeAvailable","managedAt"],"additionalProperties":false},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":false,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":{"ownershipPolicy":"owner-only","effect":"read","replayPolicy":"stable-result","retentionSeconds":31536000}}},{"skillId":"get-pricing","skillContractHash":"0x3e4f0cae089390bafc3eaafe67652208f508dc9698c8e46d7e6ff621e178b8cc","acceptingNewOrders":true,"presentation":{"name":"Get Pricing","description":"Preview the live USD + USDC price for a paid skill before committing to purchase. Useful for budget calculation, multi-year math, and dry-run quotes.\n\nWhen to use:\n- The user asks \"how much would 5 years of example.com cost?\" — call with `skillId: 'register-domain'`, `serviceArgs: { domain: 'example.com', term: 5 }`.\n- The agent is presenting cost options to a user before triggering `daski_buy_service`.\n- You want to detect premium / unsupported TLDs without attempting a purchase.\n\nWhen NOT to use:\n- You are about to call `daski_buy_service` anyway — its first-call response already includes the live price in `quoteNotes`. Calling this beforehand is redundant unless the user explicitly asked for a quote.\n- The skill is free (`paymentRequired: false`) — those don't have a price to quote.\n\nInputs:\n- `skillId` — the paid skill to price (currently `register-domain` or `renew-domain`).\n- `serviceArgs` — the same shape you'd send to the actual skill. For `register-domain` you only need `domain` and optionally `term`; the registrant fields don't affect price.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ amount, amountUsd, currency: 'USDC', validUntil, errors? }`.\n- `amount` is in atomic USDC units (multiply by 10⁶).\n- `amountUsd` is a human-readable string (e.g. `\"4.99\"`).\n- `validUntil` is a unix timestamp; quotes are typically good for 60 seconds.\n- `errors[]` is populated for invalid `serviceArgs` (e.g. unsupported TLD, term out of range). No `amount` is returned in that case.\n\nNext step: pass the same `serviceArgs` to `daski_buy_service` to actually purchase. Note that prices may shift slightly between quote and settle; the `daski_buy_service` response is authoritative.","examples":["How much is example.xyz right now?","Get pricing for renewing tinkerbell.io 3 years","What's the USDC amount for register-domain { domain: 'mybrand.ai' }?"],"tags":["pricing"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/get-pricing.md"},"contract":{"inputSchema":{"type":"object","properties":{"skillId":{"type":"string","minLength":1,"maxLength":4096},"serviceArgs":{"type":"object","properties":{},"additionalProperties":true,"maxProperties":24,"propertyNames":{"maxLength":128}}},"required":["skillId","serviceArgs"],"additionalProperties":false,"maxProperties":2},"resultSchema":{"type":"object","properties":{"amount":{"type":"string","minLength":1,"maxLength":80},"amountUsd":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","minLength":1,"maxLength":16},"validUntil":{"type":"integer","minimum":0,"maximum":9007199254740991},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":128},"code":{"type":"string","minLength":1,"maxLength":128},"message":{"type":"string","minLength":1,"maxLength":1024}},"required":["field","code","message"],"additionalProperties":false,"maxProperties":3},"maxItems":64}},"required":[],"additionalProperties":false,"maxProperties":5},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":false,"paymentRequired":false,"assetType":null,"purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":null}},{"skillId":"list-dns-records","skillContractHash":"0xd61e62b15dff03ea33102c9672f40cd24ebfb60096925f1a4d8b8f9a20f26413","acceptingNewOrders":true,"presentation":{"name":"List DNS Records","description":"List all DNS records on a Daski-registered domain controlled by the signing payer wallet.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- Before `delete-dns-record` — to look up the `recordId` to delete.\n- Auditing or troubleshooting: viewing the current DNS state.\n- After `set-dns-record` — to confirm a record was created with the expected `recordId`.\n\nWhen NOT to use:\n- You only need to know the nameservers — that's in `get-domain-info`.\n- The domain is not registered through Daski — this skill requires on-chain ownership.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, records[] }`. Each record is `{ recordId, type, name, content, ttl, priority? }`.\n- `recordId` is the registrar-assigned identifier; pass it to `delete-dns-record`.\n- `priority` is only present for `MX` and `SRV` records.\n- The list includes nameserver (`NS`) records.\n\nNext step:\n- `delete-dns-record` with a specific `recordId` to remove an entry.\n- `set-dns-record` to add or update entries.\n- Done.","examples":["List all DNS records on example.com","What records exist on tinkerbell.io?","Show me the DNS for mybrand.ai"],"tags":["dns"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/list-dns-records.md"},"contract":{"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096}},"required":["domain"],"additionalProperties":false},"resultSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"records":{"type":"array","items":{"type":"object","properties":{"recordId":{"type":"string","maxLength":4096},"type":{"type":"string","maxLength":4096},"name":{"type":"string","maxLength":4096},"content":{"type":"string","maxLength":4096},"ttl":{"type":"integer"},"priority":{"type":"integer"}},"required":["recordId","type","name","content","ttl"],"additionalProperties":false}}},"required":["domain","records"],"additionalProperties":false},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":false,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":{"ownershipPolicy":"owner-only","effect":"read","replayPolicy":"stable-result","retentionSeconds":31536000}}},{"skillId":"register-domain","skillContractHash":"0xd0b25bf57b0f7d29083b8914b03ebdab9b2f7b8a2afc0551f580b4b7028efd3b","acceptingNewOrders":true,"presentation":{"name":"Register Domain","description":"Register a new domain. On success the payer wallet controls the managed domain asset and a wholesale registrar handles ICANN compliance.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants a new domain and `check-availability` returned `available: true`.\n- The user wants to register for multiple years up front (1–10 year term).\n\nWhen NOT to use:\n- The user already owns the domain at another registrar — transfer-in is outside this service's supported operations.\n- The user is renewing an existing Daski-registered domain — use `renew-domain` instead.\n- The domain is premium — premium domains without fixed retail prices are rejected. `check-availability` flags these.\n\nInputs:\n- `domain` — fully qualified domain name (e.g. `example.com`).\n- `term` (optional) — 1 to 10 years, default 1.\n- `whoisPrivacy` (optional) — boolean; request registrar WHOIS privacy.\n- WHOIS registrant fields (REQUIRED BY ICANN, posted to the PUBLIC WHOIS database):\n  - `registrantName`\n  - `registrantEmail` — monitored inbox; see EMAIL VERIFICATION below.\n  - `registrantAddress`, `registrantCity`, `registrantPostalCode`\n  - `registrantState` — the state/province code exactly as the registrar\n    expects it: the part AFTER the country prefix of the ISO-3166-2 code\n    (`CO` for Colorado, `ON` for Ontario, `BY` for Bavaria — never\n    `US-CO`). If the country genuinely has no subdivision, re-use the city\n    name — never send an empty string, and never invent a region your\n    Operator did not give you; ask instead.\n  - `registrantCountry` — ISO-3166 alpha-2 (e.g. `US`, not `USA`). Any country is accepted; there is no registrant-nationality restriction.\n  - `registrantPhone` — E.164 with no separators (e.g. `+15555550100`, not `+1.555.555.0100`).\n- `registrantOrganization` (optional) — the organization's LEGAL NAME when the\n  registrant of record is a company; it becomes the public WHOIS Organization.\n  `registrantName` then stays the natural-person contact. NEVER concatenate\n  person + company into `registrantName`.\n\nCOLLECT FIRST: gather ALL registrant fields from your Operator in ONE message before\nstarting the purchase — they are ICANN-mandated and you will be blocked without them.\nAsk whether the registrant of record is a person or an organization (that decides\nwhether `registrantOrganization` is needed).\nDo not invent values (states/provinces included); ask. If a field is genuinely not\napplicable (e.g. no subdivision exists), ask how to fill it — for the state field the\nregistry convention is to re-use the city name, never a blank. Ask about WHOIS privacy\nin the same message (see below).\n\nWHOIS PRIVACY: pass `whoisPrivacy: true` to request registrar WHOIS privacy (free\nwhere the TLD supports it). The `registration_details` artifact reports the outcome:\n`whoisPrivacy: \"enabled\" | \"unavailable\" | \"not_requested\"` — \"unavailable\" means the\nTLD doesn't support privacy and the registrant data is on public WHOIS as-is; relay\nthat to your Operator.\n\nEMAIL VERIFICATION: the registry sends a verification link to `registrantEmail`. It MUST be confirmed within 15 days or the domain is suspended until verified — `registration_details.verificationDeadlineDays` carries that deadline. Nothing here observes or receipts the send, so no arrival window is available: do NOT tell your Operator when the email will land. Renewal notices land at the same inbox at 30/15/7/1 days before expiry. Role accounts (`postmaster@`, `noreply@`, etc.) usually fail verification.\n\nSupported TLDs: `.com`, `.net`, `.org`, `.io`, `.ai`, `.xyz`, plus most ICANN gTLDs.\n\nPricing: variable USDC, varies by TLD and term. Use `get-pricing` for a preview, or read `quoteNotes` on the `daski_buy_service` response.\n\nReturns: A2A task; median fulfillment under 60 seconds. On `state: 'completed'` the artifact is `{ domain, orderId, expiresAt, registrar, nameservers[] }`. Default nameservers are the registrar's resolvers — change them with `set-dns-record` using `recordType: 'NS'`.\n\nNext step:\n- Confirm the verification email within 15 days.\n- `set-dns-record` to publish DNS records through a wallet-authorized asset action.\n- `get-domain-info` to verify on-chain state.","examples":["Register example.com for 1 year for John Smith at 123 Main St, Austin TX 78701 US, +15555550100","Register tinkerbell.io for 2 years for ACME Inc, billing@acme.example, +14155550000","I want example.xyz registered to Jane Doe in Berlin DE, year term default","Buy mybrand.ai with default nameservers","Register starbucks-coffee.com — wait, double check trademark first"],"tags":["tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/register-domain.md"},"contract":{"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"registrantName":{"type":"string","maxLength":4096},"registrantEmail":{"type":"string","maxLength":4096},"registrantAddress":{"type":"string","maxLength":4096},"registrantCity":{"type":"string","maxLength":4096},"registrantState":{"type":"string","minLength":1,"maxLength":64,"pattern":"^(?![A-Za-z]{2}-[A-Za-z0-9]{1,3}$).+$","description":"State or province code exactly as the registrar expects it: the part after the country prefix of the ISO-3166-2 code (CO, ON, BY). A full ISO-3166-2 code such as US-CO is rejected. Countries without subdivisions re-use the city name."},"registrantPostalCode":{"type":"string","maxLength":4096},"registrantCountry":{"type":"string","minLength":2,"maxLength":2},"registrantPhone":{"type":"string","maxLength":4096},"term":{"type":"integer","minimum":1,"maximum":10},"whoisPrivacy":{"type":"boolean"},"registrantOrganization":{"type":"string","maxLength":4096}},"required":["domain","registrantName","registrantEmail","registrantAddress","registrantCity","registrantState","registrantPostalCode","registrantCountry","registrantPhone"],"additionalProperties":false,"maxProperties":12},"resultSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","maxLength":4096},"status":{"type":"object","properties":{"state":{"type":"string","maxLength":4096},"message":{"type":"object","properties":{"role":{"type":"string","maxLength":4096},"parts":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["text","data","file"]},"text":{"type":"string","maxLength":4096},"data":{"type":"object","properties":{"domain":{"type":"string","maxLength":4096},"registrar":{"type":"string","maxLength":4096},"nameservers":{"type":"array","items":{"type":"string","maxLength":4096}},"expiresAt":{"type":"string","minLength":10,"maxLength":64},"orderId":{"type":"string","maxLength":4096},"whoisPrivacy":{"type":"string","maxLength":4096},"verificationDeadlineDays":{"type":"integer"},"verificationNote":{"type":"string","maxLength":4096}},"required":["domain","registrar","nameservers","expiresAt","orderId","whoisPrivacy","verificationDeadlineDays","verificationNote"],"additionalProperties":false},"file":{"type":"object","properties":{"url":{"type":"string","maxLength":4096},"mimeType":{"type":"string","maxLength":4096}},"required":["url","mimeType"],"additionalProperties":false}},"required":["kind"],"additionalProperties":false}}},"required":["role","parts"],"additionalProperties":false}},"required":["state","message"],"additionalProperties":false},"artifacts":{"type":"array","items":{"type":"object","properties":{"artifactId":{"type":"string","maxLength":4096},"name":{"type":"string","maxLength":4096},"parts":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["text","data","file"]},"text":{"type":"string","maxLength":4096},"data":{"type":"object","properties":{"domain":{"type":"string","maxLength":4096},"registrar":{"type":"string","maxLength":4096},"nameservers":{"type":"array","items":{"type":"string","maxLength":4096}},"expiresAt":{"type":"string","minLength":10,"maxLength":64},"orderId":{"type":"string","maxLength":4096},"whoisPrivacy":{"type":"string","maxLength":4096},"verificationDeadlineDays":{"type":"integer"},"verificationNote":{"type":"string","maxLength":4096}},"required":["domain","registrar","nameservers","expiresAt","orderId","whoisPrivacy","verificationDeadlineDays","verificationNote"],"additionalProperties":false},"file":{"type":"object","properties":{"url":{"type":"string","maxLength":4096},"mimeType":{"type":"string","maxLength":4096}},"required":["url","mimeType"],"additionalProperties":false}},"required":["kind"],"additionalProperties":false}}},"required":["artifactId","name","parts"],"additionalProperties":false}}},"required":["id","status"],"additionalProperties":false},"pricing":{"USDC":{"type":"one-time","min_amount":"0"}},"requiresAssetOwnership":false,"paymentRequired":true,"assetType":null,"purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":null}},{"skillId":"renew-domain","skillContractHash":"0x27fc8804279e53d50a2cc8ea47df214d897a10f5ebbbd2eafd2d57467b64a719","acceptingNewOrders":true,"presentation":{"name":"Renew Domain","description":"Extend the registration of a Daski-registered domain you own. Adds 1–10 years to the existing expiry; the on-chain asset's `expires_at` is updated atomically with the registrar response.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- A registrant-verification renewal reminder arrived (typically at 30/15/7/1 days before expiry).\n- The user wants to lock in multiple years up front.\n- A renewal failure or near-expiry warning surfaced in `get-domain-info`.\n\nWhen NOT to use:\n- The domain is not yet registered — use `register-domain`.\n- The user wants to switch registrars — use `transfer-domain-out`.\n- The current expiry is more than 90 days out and the user has no specific reason to renew now (renewing very early doesn't reset anything, just stacks years).\n\nInputs:\n- `domain` — fully qualified domain name controlled by the payer wallet through this provider.\n- `term` (optional) — 1 to 10 years, default 1.\n\nRegistrant info carries over from the original registration — no need to re-supply WHOIS fields. WHOIS contact changes are outside the renew-domain operation.\n\nPricing: variable USDC, varies by TLD and term. Same backend as `register-domain`. Use `get-pricing` for a preview.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, term, newExpiresAt, registrar }`. The on-chain `expires_at` is updated in the same registrar callback.\n\nNext step:\n- `get-domain-info` to confirm the new `expires_at`.\n- Done. The domain stays in the `active` asset-lifecycle state.","examples":["Renew example.com for 1 year","Extend tinkerbell.io for 3 years","Renew mybrand.ai before it expires next week","Add another year to example.xyz"],"tags":["tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/renew-domain.md"},"contract":{"inputSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":4096},"term":{"type":"integer","minimum":1,"maximum":10}},"required":["domain"],"additionalProperties":false,"maxProperties":2},"resultSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":253},"term":{"type":"integer","minimum":1,"maximum":10},"newExpiresAt":{"type":"string","minLength":1,"maxLength":64},"registrar":{"type":"string","minLength":1,"maxLength":128}},"required":["domain","term","newExpiresAt","registrar"],"additionalProperties":false,"maxProperties":4},"pricing":{"USDC":{"type":"one-time","min_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":true,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":null}},{"skillId":"set-dns-record","skillContractHash":"0x7fcabcccc6de93fa77d6633467f8c10f69b5db9bf45d69dac0fc5e8ea7749abc","acceptingNewOrders":true,"presentation":{"name":"Set DNS Record","description":"Create or update a DNS record on a Daski-registered domain controlled by the signing payer wallet.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user wants to point a domain at a host (`A`, `AAAA`, or `CNAME`).\n- The user wants to set up email (`MX`).\n- The user wants to change nameservers (`NS`) — e.g. moving DNS hosting elsewhere while keeping the domain registered through Daski.\n- The user wants to publish a verification token (`TXT`).\n- The user wants to advertise a service (`SRV`).\n\nWhen NOT to use:\n- The record already exists with the exact same content — this skill upserts on `(name, type)`; a no-op rewrite is wasteful but not destructive.\n- The user wants to remove a record — use `delete-dns-record`.\n- The user wants to transfer the domain away — use `transfer-domain-out`.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `recordType` — one of `A`, `AAAA`, `CNAME`, `MX`, `TXT`, `NS`, `SRV`.\n- `name` — record name (e.g. `www`, `@`, `_acme-challenge`). Use `@` for the apex.\n- `content` — record value (e.g. `203.0.113.42` for `A`, `mail.example.com` for `MX`).\n- `ttl` (optional) — seconds, minimum 300 (registrar-enforced), default 3600.\n- `priority` (required for `MX` and `SRV`) — integer.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, recordId, type, name, content, ttl, priority? }`. `recordId` is the registrar-assigned identifier for the new or updated record.\n\nNext step:\n- `list-dns-records` to verify the change.\n- Done. The asset stays in the `active` lifecycle state.","examples":["Set the A record on example.com @ to 203.0.113.10 with TTL 3600","Add a TXT record _verification.example.com containing 'site-verify=abc123'","Point www.tinkerbell.io as a CNAME to tinkerbell.io","Update the MX record on example.com to mail.example.com priority 10"],"tags":["dns"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/set-dns-record.md"},"contract":{"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"recordType":{"type":"string","maxLength":4096},"name":{"type":"string","maxLength":4096},"content":{"type":"string","maxLength":4096},"ttl":{"type":"integer"},"priority":{"type":"integer"}},"required":["domain","recordType","name","content"],"additionalProperties":false},"resultSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","maxLength":4096},"recordId":{"type":"string","maxLength":4096},"type":{"type":"string","maxLength":4096},"name":{"type":"string","maxLength":4096},"content":{"type":"string","maxLength":4096},"ttl":{"type":"integer"},"priority":{"type":"integer"},"updated":{"type":"boolean"},"publicResolutionVerified":{"type":"boolean"},"publicResolutionNote":{"type":"string","maxLength":4096}},"required":["domain","recordId","type","name","content","ttl","updated","publicResolutionVerified","publicResolutionNote"],"additionalProperties":false},"pricing":{"USDC":{"type":"one-time","fixed_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":false,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":{"ownershipPolicy":"owner-only","effect":"mutate","replayPolicy":"stable-result","retentionSeconds":31536000}}},{"skillId":"transfer-domain-out","skillContractHash":"0xda74764565d355a4cf06836e6a6bbd64bd74f928361924013e99241c3176e4a2","acceptingNewOrders":true,"presentation":{"name":"Transfer Domain Out","description":"**Terminal action.** Initiate transfer of a Daski-registered domain to a different registrar. After successful execution, the domain is no longer manageable through Daski and enters the terminal `transferred_out` state. The payer has 7 days to use the auth code at the destination registrar.\n\nAccess: paid orders and owner-only asset operations are routed through the Daski gateway. The gateway obtains a short-lived wallet signature bound to the exact provider, action, asset, and request; the provider rejects direct anonymous access.\n\nWhen to use:\n- The user explicitly wants to move a domain off Daski.\n- The user has already chosen a destination registrar and is ready to paste the EPP auth code there.\n\nWhen NOT to use:\n- The user just wants to change nameservers — use `set-dns-record` with `recordType: 'NS'`. That keeps the domain managed through Daski.\n- The user wants to update WHOIS info — that operation is unsupported; do not initiate a transfer for it.\n- The user is unsure about the destination — initiate the transfer ONLY after the destination is locked in. The 7-day window starts now.\n\nInputs:\n- `domain` — fully qualified domain name controlled by the signing payer wallet.\n\nThe first wallet-authorized call stages the exact irreversible effect without contacting the registrar. After the reviewed delay, a fresh wallet authorization must confirm that exact staged execution; cancellation remains available until execution.\n\nPricing: an operator-configured exit service fee (default: the platform minimum provider fee). Use `get-pricing` or `/quote` for the exact amount.\n\nReturns: A2A task; on `state: 'completed'` there are two artifacts: `transfer_auth_code` = `{ domain, authCode, expiresAt: <7 days from now> }` and `domain_transferred_out` = `{ domain, timestamp, previousAssetId, nextSteps }`. The on-chain asset enters the terminal `transferred_out` state in the same callback; further calls to ownership-gated skills (`set-dns-record`, `renew-domain`, `get-domain-info`) for this domain will fail.\n\nNext step: take the `authCode` to the destination registrar within 7 days. There is no Daski skill for completing the transfer on the destination side. If the transfer is never completed, the registrar lock is automatically restored after the auth-code window.","examples":["Transfer example.com out to my new registrar","Initiate transfer-out for tinkerbell.io","Move mybrand.ai to a different provider — I need the EPP code"],"tags":["transfer-out","tld:com","tld:net","tld:org","tld:io","tld:ai","tld:xyz","tld:co","tld:dev"],"documentationUrl":"https://provider.bluetgroup.com/skills/domain-management/transfer-domain-out.md"},"contract":{"inputSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":4096}},"required":["domain"],"additionalProperties":false,"maxProperties":1},"resultSchema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":253},"authCode":{"type":"string","minLength":1,"maxLength":512},"expiresAt":{"type":"string","minLength":1,"maxLength":64},"timestamp":{"type":"string","minLength":1,"maxLength":64},"previousAssetId":{"type":"string","minLength":1,"maxLength":128},"nextSteps":{"type":"array","items":{"type":"string","minLength":1,"maxLength":1024},"maxItems":16}},"required":["domain"],"additionalProperties":false,"maxProperties":6},"pricing":{"USDC":{"type":"one-time","min_amount":"0"}},"requiresAssetOwnership":true,"paymentRequired":true,"assetType":"domain","purchaseReadiness":null,"fulfillmentMode":"automated","capacity":{"maxOpenOrders":100},"deadlines":{},"assetAction":null}}]}}}