Domains
Domains are the first custom-checkout product. Agents quote a specific domain name, purchase from that quote, then manage nameservers and DNS records through the same API or MCP surface.
Agent_Flow
Example MCP-style transcript. Each next action reuses the identifiers returned by the previous response.
text
1. catalog_search { category: "domains", q: "com" }2. catalog_checkout_requirements { catalogItemId }3. quote_create { catalogItemId, quantity: 1, configuration: { domainName: "launchpad.com", periodYears: 1, autoRenew: true, privacyProtection: true } }4. purchase_create { quoteId, idempotencyKey }5. service_get { serviceId }6. domain_nameservers_set { serviceId, nameservers }7. domain_dns_record_upsert / domain_dns_record_deleteStep_1_Request_Search
json
{ "tool": "catalog_search", "input": { "category": "domains", "q": "com", "limit": 3 }}Step_1_Response
json
{ "items": [ { "id": "cat_domain_com", "sku": "domain-com-registration", "name": ".com Domain Registration", "category": "domains", "checkoutKind": "custom" } ]}Step_2_Request_Checkout_Requirements
json
{ "tool": "catalog_checkout_requirements", "input": { "catalogItemId": "cat_domain_com" }}Step_2_Response
json
{ "catalogItemId": "cat_domain_com", "checkoutKind": "custom", "serviceType": "domain", "requiredFields": [ "domainName", "periodYears", "registrantEmail", "registrantCountry" ]}Step_3_Request_Quote
json
{ "tool": "quote_create", "input": { "catalogItemId": "cat_domain_com", "quantity": 1, "configuration": { "domainName": "launchpad.com", "periodYears": 1, "autoRenew": true, "privacyProtection": true, "registrantEmail": "[email protected]", "registrantCountry": "US" } }}Step_3_Response
json
{ "quote": { "id": "quote_dom_001", "catalogItemId": "cat_domain_com", "totalPriceMinor": 1499, "currency": "usd", "configuration": { "domainName": "launchpad.com", "periodYears": 1 }, "managementCapabilities": [ "domain:nameservers:set", "domain:dns-records:write" ] }}Step_4_Request_Purchase
json
{ "tool": "purchase_create", "input": { "quoteId": "quote_dom_001", "idempotencyKey": "domain-launchpad-com-001" }}Step_4_Response
json
{ "purchase": { "id": "purchase_dom_001", "status": "completed", "totalPriceMinor": 1499 }, "service": { "id": "svc_domain_001", "serviceType": "domain", "displayName": "launchpad.com" }}Step_5_Request_Service_Get
json
{ "tool": "service_get", "input": { "serviceId": "svc_domain_001" }}Step_5_Response
json
{ "service": { "id": "svc_domain_001", "status": "active", "displayName": "launchpad.com", "domain": { "domainName": "launchpad.com", "registrationStatus": "active", "nameservers": [ "ns1.ag3n7.store", "ns2.ag3n7.store" ] } }}Step_6_Request_DNS_Record_Upsert
json
{ "tool": "domain_dns_record_upsert", "input": { "serviceId": "svc_domain_001", "type": "MX", "host": "@", "value": "mail.launchpad.com", "ttl": 600, "priority": 10 }}Step_6_Response
json
{ "record": { "id": "dns_record_001", "serviceId": "svc_domain_001", "type": "MX", "host": "@", "value": "mail.launchpad.com", "ttl": 600, "priority": 10 }}REST_Checkout
The quote contains final mock-registry pricing and becomes the source of truth for the domain purchase.
typescript
const quote = await fetch('https://ag3n7.store/v1/agent/quotes', { method: 'POST', headers: { Authorization: `Bearer ${process.env.AGENT_STORE_AGENT_API_KEY}`, 'content-type': 'application/json', }, body: JSON.stringify({ catalogItemId: '<domain-catalog-item-id>', quantity: 1, configuration: { domainName: 'launchpad.com', periodYears: 1, autoRenew: true, privacyProtection: true, }, }),}).then((res) => res.json()); const purchase = await fetch('https://ag3n7.store/v1/agent/purchases', { method: 'POST', headers: { Authorization: `Bearer ${process.env.AGENT_STORE_AGENT_API_KEY}`, 'content-type': 'application/json', }, body: JSON.stringify({ quoteId: quote.quote.id, idempotencyKey: 'domain-order-001', }),}).then((res) => res.json()); const service = await fetch(`https://ag3n7.store/v1/agent/services/${purchase.service.id}`, { headers: { Authorization: `Bearer ${process.env.AGENT_STORE_AGENT_API_KEY}` },}).then((res) => res.json());DNS_Management
After provisioning, both the dashboard user and any agent key with `service:manage` can replace nameservers and mutate the zone.
typescript
await fetch('https://ag3n7.store/v1/agent/services/<service-id>/domain/nameservers', { method: 'POST', headers: { Authorization: `Bearer ${process.env.AGENT_STORE_AGENT_API_KEY}`, 'content-type': 'application/json', }, body: JSON.stringify({ nameservers: ['ns1.example.net', 'ns2.example.net'], }),}); await fetch('https://ag3n7.store/v1/agent/services/<service-id>/domain/dns-records', { method: 'POST', headers: { Authorization: `Bearer ${process.env.AGENT_STORE_AGENT_API_KEY}`, 'content-type': 'application/json', }, body: JSON.stringify({ type: 'MX', host: '@', value: 'mail.launchpad.com', ttl: 600, priority: 10, }),});Reusable_Model
Custom products use the same pattern: catalog item, checkout requirements, quote with configuration, purchase, then managed service actions. VPS images, reboots, reinstall, and SSH details fit into the same lifecycle.