{"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":"1.1.0","defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["text/plain","application/json"],"supportedInterfaces":[{"url":"https://sandbox-provider.bluetgroup.com/a2a/domain-management","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"capabilities":{"streaming":false,"pushNotifications":true,"extensions":[{"uri":"https://daski.xyz/a2a/v1","description":"Daski marketplace extension: per-skill pricing, on-chain service linkage (serviceSlug/serviceVersion), and binding to settled payments via metadata[uri].{serviceRef,...}.","required":false}]},"skills":[{"id":"register-domain","name":"Register Domain","description":"Register a new domain. On success the buyer's ERC-8004 agent becomes the on-chain owner of the domain asset and a wholesale registrar handles ICANN compliance.\n\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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 not yet supported.\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 official ISO-3166-2 subdivision (US state, CA\n    province, PL voivodeship, …). If the country genuinely has no\n    subdivision, re-use the city name — never send an empty string, and\n    never invent a region your principal did not give you; ask instead.\n  - `registrantCountry` — ISO-3166 alpha-2 (e.g. `US`, not `USA`).\n  - `registrantPhone` — E.164 with no separators (e.g. `+15555550100`, not `+1.555.555.0100`).\n\nCOLLECT FIRST: gather ALL registrant fields from your principal in ONE message before\nstarting the purchase — they are ICANN-mandated and you will be blocked without them.\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 principal.\n\nEMAIL VERIFICATION: the registry sends a verification link to `registrantEmail` within 24 hours of registration. It MUST be confirmed within 15 days or the domain is suspended until verified. 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 (capability required — see that skill's two-call flow).\n- `get-domain-info` to verify on-chain state.","tags":["infrastructure","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://sandbox-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\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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 that you (the buyer's ERC-8004 agent) own through this provider. Ownership is verified on-chain.\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. A separate WHOIS-update skill is not yet implemented; flag to the user if they ask.\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, orderId, 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":["infrastructure","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://sandbox-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":["infrastructure","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://sandbox-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 you own. Two-call: the first call (no `capability`) returns the per-action capability typed-data (a `DnsSetRecordAuthorization`) to sign; the second call (with `capability`) executes the change.\n\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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\nPer-action capability flow (two-call) — this is a SECOND EIP-712 signature, distinct from and on top of the request envelope described under Auth above:\n1. **First call** (no `capability`): returns a `DnsSetRecordAuthorization` as `eip712TypedData` to sign. It binds to the exact `(domain, recordType, recordName, recordContent, recordTtl)` — mutating any of these between calls invalidates the signature. (This challenge call still carries the request envelope.)\n2. Sign with the buyer agent wallet (same wallet that owns the ERC-8004 token for this domain).\n3. **Second call**: same inputs plus `capability: { signature, authorization }`, with a FRESH request envelope (envelopes are single-use — a reused messageId fails with ENVELOPE_REPLAY). Executes.\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- `capability` (second call only) — `{ signature, authorization }` from the first-call typed-data.\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":["infrastructure","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://sandbox-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 you own. Two-call: the first call (no `capability`) returns the per-action capability typed-data (a `DnsDeleteRecordAuthorization`); the second call (with `capability`) executes. Idempotent — deleting a missing record returns `state: 'completed'` with a no-op artifact.\n\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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\nPer-action capability flow (two-call) — a SECOND EIP-712 signature, distinct from the request envelope under Auth above:\n1. **First call** (no `capability`): returns a `DnsDeleteRecordAuthorization` as `eip712TypedData` to sign, binding to the exact `(domain, recordId)`. (This challenge call still carries the request envelope.)\n2. Sign with the buyer agent wallet.\n3. **Second call**: same inputs plus `capability: { signature, authorization }`, with a FRESH request envelope (envelopes are single-use — a reused messageId fails with ENVELOPE_REPLAY). Executes.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `recordId` — registrar-assigned identifier from `list-dns-records`.\n- `capability` (second call only) — `{ signature, authorization }` from the first-call typed-data.\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":["infrastructure","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://sandbox-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 you own. Free skill, no per-action capability signing required (but the request envelope below still applies — it's an authenticated read).\n\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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":["infrastructure","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://sandbox-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\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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":["infrastructure","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://sandbox-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 this skill returns successfully, the domain is no longer manageable through Daski and the on-chain asset enters the terminal `transferred_out` state — there is no undo and the buyer has 7 days to complete the transfer at the destination registrar before the auth code expires.\n\nAuth (all calls): every request carries `metadata.envelopeAuth` — the *request envelope*, an EIP-712 `A2ARequestAuthorization` signed by your buyer agent wallet. Your Daski client signs it automatically when it custodies your wallet, or returns the typed-data for your wallet to sign (daski_submit_task first call) — you never assemble the payload by hand. It authenticates the caller and binds the request body, and is verified before any per-action capability below.\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 is a different (future) skill; 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\nPer-action capability flow (two-call) — a SECOND EIP-712 signature, distinct from the request envelope under Auth above:\n1. **First call** (no `capability` field): returns a `DomainTransferOutAuthorization` as the `eip712TypedData` the buyer's agent wallet must sign. Schema includes `domain` and an authorization binding. (This challenge call still carries the request envelope.)\n2. Sign the returned `eip712TypedData` with the SAME wallet that owns the ERC-8004 token for this domain.\n3. **Second call**: same inputs plus `capability: { signature, authorization }`, with a FRESH request envelope (envelopes are single-use — a reused messageId fails with ENVELOPE_REPLAY). Executes the transfer.\n\nInputs:\n- `domain` — fully qualified domain name that you own through this provider.\n- `capability` (second call only) — `{ signature, authorization }` from the first-call typed-data.\n\nPricing: variable USDC, typically $0 to $5 depending on TLD. Read `quoteNotes` on the `daski_buy_service` response for the exact amount.\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ domain, eppAuthCode, expiresAt: <7 days from now>, destinationInstructions }`. 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 `eppAuthCode` to the destination registrar within 7 days. There is no Daski skill for completing the transfer on the destination side.","tags":["infrastructure","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://sandbox-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":["infrastructure","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://sandbox-provider.bluetgroup.com/skills/domain-management/get-pricing.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]}],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/domain-management.md","extensions":{"https://daski.xyz/a2a/v1":{"providerAgentId":"1","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.","category":"infrastructure","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":"0x85783c54dfff08553aba86f8e5ceddabc995a490ff6b0fd8c215b4e970166316","serviceVersion":"1","support":{"email":"domains@sandbox-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":{"envelope":{"primaryType":"A2ARequestAuthorization","domain":{"name":"Daski","version":"1","chainId":84532,"verifyingContract":"0xa03bd7e27dB0A942B2C30d6d4bCCD78724FC1E83"},"types":{"A2ARequestAuthorization":[{"name":"buyerTokenId","type":"uint256"},{"name":"skillId","type":"string"},{"name":"paymentId","type":"uint256"},{"name":"chainId","type":"uint256"},{"name":"messageId","type":"string"},{"name":"requestHash","type":"bytes32"},{"name":"issuedAt","type":"uint256"}]},"requiredFor":["paid","ownership-gated","capability-gated"],"producedBy":"daski-client","requestHash":"keccak256(utf8(canonicalJSON(serviceArgs))); canonicalJSON = recursively key-sorted, undefined dropped","callerSuppliedFields":["buyerTokenId","messageId","issuedAt"],"freshnessWindowSeconds":300,"onMissing":{"errorCode":"ENVELOPE_AUTH_REQUIRED","challengeAt":"error.data.envelopeAuthChallenge"}}},"skills":{"register-domain":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":true,"variablePricing":true,"currency":"USDC","requiresAssetOwnership":false,"requiresCapability":false,"envelopeRequired":true,"humanParties":"required","assetType":null,"requiredFields":["domain","registrantName","registrantEmail","registrantAddress","registrantCity","registrantState","registrantPostalCode","registrantCountry","registrantPhone"],"optionalFields":["term","whoisPrivacy"],"pricing":{"type":"one-time","baseAmount":"0","minAmount":"0"}},"renew-domain":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":true,"variablePricing":true,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":false,"envelopeRequired":true,"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,"requiresCapability":false,"envelopeRequired":false,"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,"requiresCapability":true,"envelopeRequired":true,"capabilityType":"DnsSetRecordAuthorization","humanParties":"none","assetType":"domain","requiredFields":["domain","recordType","name","content"],"optionalFields":["ttl","priority","capability"],"pricing":{"type":"one-time","baseAmount":"0"},"callPhases":{"challenge":{"description":"Omit `capability`. Returns eip712TypedData to sign.","requiredFields":["domain","recordType","name","content"],"optionalFields":["ttl","priority"]},"execute":{"description":"Include `capability: { signature, authorization }` from the challenge response, plus a FRESH request envelope — envelopes are single-use; a reused messageId is rejected as ENVELOPE_REPLAY.","requiredFields":["domain","recordType","name","content","capability"],"optionalFields":["ttl","priority"]}}},"delete-dns-record":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":true,"envelopeRequired":true,"capabilityType":"DnsDeleteRecordAuthorization","humanParties":"none","assetType":"domain","requiredFields":["domain","recordId"],"optionalFields":["capability"],"pricing":{"type":"one-time","baseAmount":"0"},"callPhases":{"challenge":{"description":"Omit `capability`. Returns eip712TypedData to sign.","requiredFields":["domain","recordId"]},"execute":{"description":"Include `capability: { signature, authorization }` from the challenge response, plus a FRESH request envelope — envelopes are single-use; a reused messageId is rejected as ENVELOPE_REPLAY.","requiredFields":["domain","recordId","capability"]}}},"list-dns-records":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":false,"envelopeRequired":true,"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,"requiresCapability":false,"envelopeRequired":true,"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,"requiresCapability":true,"envelopeRequired":true,"capabilityType":"DomainTransferOutAuthorization","humanParties":"none","assetType":"domain","requiredFields":["domain"],"optionalFields":["capability"],"pricing":{"type":"one-time","baseAmount":"0","minAmount":"0"},"callPhases":{"challenge":{"description":"Omit `capability`. Returns eip712TypedData to sign.","requiredFields":["domain"]},"execute":{"description":"Include `capability: { signature, authorization }` from the challenge response, plus a FRESH request envelope — envelopes are single-use; a reused messageId is rejected as ENVELOPE_REPLAY.","requiredFields":["domain","capability"]}}},"get-pricing":{"serviceSlug":"domain-management","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"requiresCapability":false,"envelopeRequired":false,"humanParties":"none","assetType":null,"requiredFields":["skillId","serviceArgs"],"pricing":{"type":"one-time","baseAmount":"0"}}}}}}