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_delete
Step_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.