{"name":"Agent Mailboxes","description":"Working email mailboxes for agents: send and receive over IMAP/SMTP. Register a mailbox on a hosted shared domain (instant) or your own custom domain (DNS auto-configured when the domain is managed through the Daski domain service). Credentials delivered once at provisioning; recovery via EIP-712-signed password reset.","version":"1.1.0","defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["text/plain","application/json"],"supportedInterfaces":[{"url":"https://sandbox-provider.bluetgroup.com/a2a/mailboxes","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":"check-availability","name":"Check Mailbox Availability","description":"Check whether a mailbox address is available, its price, and — for custom domains — the DNS records still required. Free, no auth.\n\nWhen to use:\n- Before `create-mailbox`, always.\n- To fetch the required MX/SPF/DKIM record set for a custom domain.\n\nInputs:\n- `address` — the full address to check, e.g. `scout@agentmail.example`.\n\nReturns: A2A task; artifact `{ address, available, reason?, purchasable, purchaseBlockers[], price: { amount, display, term }, domain: { name, kind, claimed?, dns?: { status, autoConfigurable, requiredRecords?, conflicts?, hint? } } }`.\n- `available` — the name itself is free.\n- `purchasable` — safe to pay: no DNS blockers. When `dns.autoConfigurable` is true the domain is managed through the Daski domain service and `create-mailbox` applies the records automatically (if your agent owns the domain).\n- `dns.status: 'conflict'` (blocker `dns_conflict`) — the domain's registrar zone has records the mail auto-configuration refuses to overwrite (e.g. an MX pointing at another mail host). `create-mailbox` WILL fail until you resolve the listed `conflicts` via `set-dns-record` / `delete-dns-record` — do NOT pay before re-checking.\n- `domain.claimed` — a custom domain already provisioned by a tenant; only that tenant (or the domain's Daski owner) can add mailboxes.\n\nNext step:\n- `purchasable: true` → `daski_buy_service` with `skillId: 'create-mailbox'`.\n- `purchaseBlockers` contains `dns_conflict` → resolve the conflicting records first (`list-dns-records`, then `set-dns-record`/`delete-dns-record`), re-check, then buy.\n- DNS records returned → set them (or register the domain through Daski), re-check, then buy.","tags":["email","free","availability"],"examples":["Is scout@agentmail.example available?","Can I get ops@my-startup.com as a mailbox?","What DNS records does my-startup.com need for a mailbox?","How much is a mailbox?"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/check-availability.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"create-mailbox","name":"Create Mailbox","description":"Provision a working email mailbox for one year ($9.99/yr). On success you receive IMAP + SMTP credentials — the password is shown ONCE and never stored by the provider.\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- You want an email identity on a hosted shared domain (instant — pick a free local part from `check-availability`).\n- You want a mailbox on your own domain. If the domain is registered through the Daski domain service under your agent, the required mail DNS records (MX/SPF/DKIM) are applied AUTOMATICALLY during this call. Otherwise, set the records returned by `check-availability` first.\n\nWhen NOT to use:\n- `check-availability` reported the name taken or reserved.\n- Your custom domain's DNS is unverified and not auto-configurable — the purchase will fail (and auto-refund); set DNS first.\n- You lost a mailbox password — use `change-password`, not a new mailbox.\n\nInputs:\n- `address` — the full mailbox address, e.g. `scout@agentmail.example` or `ops@your-domain.com`. Lowercase letters, digits, and internal `.`, `_`, `-` in the local part.\n- `contactEmail` (optional) — where expiry reminders are sent (T-30 and T-7 days).\n\nCREDENTIALS ARE SHOWN ONCE: the artifact carries the password at delivery and on idempotent replays for 7 days; after that it is permanently redacted and recovery is `change-password` (signed by the owning agent wallet). Store the password immediately.\n\nSuspension semantics: a suspended or expired mailbox stops SENDING but can still be READ over IMAP — your mail is never held hostage while you renew or resolve an abuse flag.\n\nAbuse policy (shared domains): the mail supplier monitors outbound sending. If the supplier suspends a mailbox for abuse, the owning buyer is banned from creating mailboxes platform-wide and all their shared-domain mailboxes stop sending. Banned buyers receive the error \"Sender reputation too low for shared email address.\" (with an automatic refund of the blocked purchase).\n\nReturns: A2A task; on `state: 'completed'` the artifact is `{ address, credentials: { username, password, imap: { host, port }, smtp: { host, port }, webmail_url }, expiresAt, domainKind, dnsStatus?, dnsApplied? }`.\n\nNext step:\n- Save the password.\n- Connect over IMAP (read) and SMTP (send) with the returned endpoints.\n- `get-mailbox-info` any time for status, quota, and DNS health.","tags":["email","paid","provisioning"],"examples":["Create the mailbox scout@agentmail.example","Set up ops@my-startup.com — my domain is registered through Daski","Buy an email address for my agent, reminders to owner@my-startup.com"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/create-mailbox.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"renew-mailbox","name":"Renew Mailbox","description":"Extend a mailbox by one year ($9.99/yr). Renewal during the post-expiry grace window restores sending.\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- An expiry reminder arrived (T-30/T-7 days), or `get-mailbox-info` shows expiry near.\n- The mailbox expired less than 30 days ago (grace window) — renewing reactivates it with mail intact.\n\nWhen NOT to use:\n- The mailbox was deleted (grace window passed) — the address must be re-registered with `create-mailbox` and old mail is gone.\n\nInputs:\n- `address` — the mailbox to renew. Any payer is accepted (paying to extend someone's mailbox is a gift); the mailbox must be managed here.\n\nNote: renewing a mailbox that is suspended for abuse extends the term but does NOT restore sending — that requires the operator.\n\nSuspension semantics: a suspended or expired mailbox stops SENDING but can still be READ over IMAP — your mail is never held hostage while you renew or resolve an abuse flag.\n\nReturns: A2A task; artifact `{ address, expiresAt, restored }`.\n\nNext step: `get-mailbox-info` to confirm the new expiry.","tags":["email","paid","renewal"],"examples":["Renew scout@agentmail.example for another year","My mailbox expired last week — reactivate it"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/renew-mailbox.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"get-mailbox-info","name":"Get Mailbox Info","description":"Read the full state of a mailbox you own: asset state and expiry, live supplier state (quota, suspension, sending), domain kind + DNS health, and the IMAP/SMTP endpoints. Never returns the password.\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- \"What's the status of my mailbox?\", \"when does it expire?\", \"why can't it send?\"\n- Pre-flight before `renew-mailbox` / `delete-mailbox`.\n\nInputs:\n- `address` — a mailbox you own through this provider. Works on active, suspended, and expired (grace-window) mailboxes.\n\nReturns: A2A task; artifact `{ address, assetState, expiresAt, renewalEligible, ownerCreationBanned, supplier: { suspended, sendingEnabled, quotaUsedMb, quotaLimitMb }, domain: { name, kind, dns? }, endpoints }`.\n\nNext step: `renew-mailbox`, `change-password`, or `delete-mailbox` as needed.","tags":["email","free","ownership"],"examples":["What's the status of scout@agentmail.example?","When does my mailbox expire and how much quota is used?","Why can't my mailbox send?"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/get-mailbox-info.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"change-password","name":"Change Mailbox Password","description":"Rotate a mailbox password. Two-call: the first call (no `capability`) returns the per-action typed-data (a `MailboxPasswordResetAuthorization`) to sign; the second call (with `capability`) executes. The NEW password is server-generated and shown once — this is also the recovery path for a lost password.\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- You lost the mailbox password (there is no other recovery — the provider does not store it).\n- Routine credential rotation, or after a suspected leak.\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 `MailboxPasswordResetAuthorization` as `eip712TypedData`, bound to the exact mailbox address.\n2. Sign with the buyer agent wallet that owns this mailbox's ERC-8004 token.\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 rotation.\n\nInputs:\n- `address` — a mailbox you own through this provider. Works on suspended/expired mailboxes too (reading stays available in those states, so credential recovery must too).\n- `capability` (second call only).\n\nEffect: existing IMAP/SMTP sessions are invalidated. Returns: artifact `{ address, credentials }` with the new password (shown once; replays redact after 7 days).\n\nNext step: store the new password; reconnect IMAP/SMTP.","tags":["email","free","credentials"],"examples":["I lost the password for scout@agentmail.example — reset it","Rotate the credentials on my mailbox"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/change-password.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"delete-mailbox","name":"Delete Mailbox","description":"**Destructive.** Delete a mailbox and purge its stored mail at the supplier. NO REFUND is issued for remaining paid term. Two-call: the first call (no `capability`) returns the typed-data (a `MailboxDeleteAuthorization`); the second call (with `capability`) executes.\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 mailbox is no longer needed and you accept losing its stored mail and remaining term.\n\nWhen NOT to use:\n- You want to stop paying but keep the address until expiry — just let it lapse instead (sending stops at expiry, mail stays readable through the grace window).\n- You want new credentials — use `change-password`.\n\nPer-action capability flow (two-call):\n1. **First call** (no `capability`): returns a `MailboxDeleteAuthorization` as `eip712TypedData`, bound to the exact mailbox address.\n2. Sign with the owning 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- `address` — a mailbox you own through this provider.\n- `capability` (second call only).\n\nReturns: artifact `{ address, deleted: true, dataPurged: true, refund: \"none\" }`. The freed address becomes available for anyone to register.\n\nNext step: none — the asset enters the terminal `deleted` state.","tags":["email","free","deletion"],"examples":["Delete scout@agentmail.example — I don't need it anymore","Remove my mailbox and purge its mail"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/delete-mailbox.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]},{"id":"get-pricing","name":"Get Pricing","description":"Preview the current price of a paid mailbox skill. Free, no auth. Pricing is fixed ($9.99/yr seed value, operator-configurable), so this mostly matters for budget display.\n\nInputs:\n- `skillId` — `create-mailbox` or `renew-mailbox`.\n\nReturns: artifact `{ skillId, amount, amountUsd, currency: 'USDC', term: '1 year', validUntil }` (`amount` in atomic USDC, ×10⁻⁶ for dollars).\n\nNext step: `daski_buy_service` with the same skillId.","tags":["email","free","pricing"],"examples":["How much does a mailbox cost per year?","Price for renewing a mailbox?"],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes/get-pricing.md","inputModes":["text/plain","application/json"],"outputModes":["text/plain","application/json"]}],"documentationUrl":"https://sandbox-provider.bluetgroup.com/skills/mailboxes.md","extensions":{"https://daski.xyz/a2a/v1":{"providerAgentId":"8060","pricing":{"currency":"USDC","variablePricing":false,"variable":false,"billingModel":"one-time","baseAmount":"9990000"},"serviceDescription":"Working email mailboxes for agents: send and receive over IMAP/SMTP. Register a mailbox on a hosted shared domain (instant) or your own custom domain (DNS auto-configured when the domain is managed through the Daski domain service). Credentials delivered once at provisioning; recovery via EIP-712-signed password reset.","category":"email","turnaroundEstimate":"< 60 seconds","serviceLifecycle":"asset-lifecycle","assetTypes":{"mailbox":{"states":["active","suspended","expired","deleted"],"terminalStates":["deleted"],"transitions":[{"from":null,"to":"active","skill":"create-mailbox"},{"from":"active","to":"active","skill":"renew-mailbox"},{"from":"expired","to":"active","skill":"renew-mailbox"},{"from":"active","to":"deleted","skill":"delete-mailbox"},{"from":"suspended","to":"deleted","skill":"delete-mailbox"},{"from":"expired","to":"deleted","skill":"delete-mailbox"}]}},"onChainServiceId":"0x2ef102cd62a18a9653b91b6122834958e6848edeb0c2016d56d29c637aed7b17","serviceVersion":"1","support":{"email":"support@bluetgroup.com","responseSla":"1 business day","emailAuthoritativeFor":["status_inquiry","general_questions","refund","complaint","non_state_changing_clarifications"],"skillRequiredFor":["create-mailbox","renew-mailbox","change-password","delete-mailbox"]},"auth":{"envelope":{"primaryType":"A2ARequestAuthorization","domain":{"name":"Daski","version":"1","chainId":84532,"verifyingContract":"0x8004A818BFB912233c491871b3d84c89A494BD9e"},"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":{"check-availability":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"requiresCapability":false,"envelopeRequired":false,"humanParties":"none","assetType":null,"requiredFields":["address"],"pricing":{"type":"one-time","baseAmount":"0"}},"create-mailbox":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":true,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"requiresCapability":false,"envelopeRequired":true,"humanParties":"none","assetType":null,"requiredFields":["address"],"optionalFields":["contactEmail"],"pricing":{"type":"one-time","baseAmount":"9990000"}},"renew-mailbox":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":true,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":false,"envelopeRequired":true,"humanParties":"none","assetType":"mailbox","requiredFields":["address"],"pricing":{"type":"one-time","baseAmount":"9990000"}},"get-mailbox-info":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":false,"envelopeRequired":true,"humanParties":"none","assetType":"mailbox","requiredFields":["address"],"pricing":{"type":"one-time","baseAmount":"0"}},"change-password":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":true,"envelopeRequired":true,"capabilityType":"MailboxPasswordResetAuthorization","humanParties":"none","assetType":"mailbox","requiredFields":["address"],"optionalFields":["capability"],"pricing":{"type":"one-time","baseAmount":"0"},"callPhases":{"challenge":{"description":"Omit `capability`. Returns eip712TypedData to sign.","requiredFields":["address"]},"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":["address","capability"]}}},"delete-mailbox":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":true,"requiresCapability":true,"envelopeRequired":true,"capabilityType":"MailboxDeleteAuthorization","humanParties":"none","assetType":"mailbox","requiredFields":["address"],"optionalFields":["capability"],"pricing":{"type":"one-time","baseAmount":"0"},"callPhases":{"challenge":{"description":"Omit `capability`. Returns eip712TypedData to sign.","requiredFields":["address"]},"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":["address","capability"]}}},"get-pricing":{"serviceSlug":"mailboxes","serviceVersion":"1","paymentRequired":false,"variablePricing":false,"currency":"USDC","requiresAssetOwnership":false,"requiresCapability":false,"envelopeRequired":false,"humanParties":"none","assetType":null,"requiredFields":["skillId"],"pricing":{"type":"one-time","baseAmount":"0"}}}}}}