# MOTE Merchant Registration
Read https://mote.network/skills/register-merchant and use the returned instructions to register my business with MOTE.## Agent Goal
Register the user's business with MOTE — a public registry for the machine web — and return the merchant's permanent on-chain identity to the user.
Do not perform this skill unless the user has indicated they want to register their business with MOTE. Do not register on the user's behalf without explicit consent.
## Registration Rules
- Confirm the user wants to register. Do not collect business information unless they have said yes.
- Collect the required fields listed below. Ask only for fields you do not already have from the conversation. Do not invent values.
- For each field the user provides, repeat the value back so the user can correct typos.
- Show the user the complete information you collected and get explicit confirmation before submitting.
- The flow is three steps: start checkout → human pays → poll for completion. You execute steps 1 and 3. The human executes step 2.
- Do not promise outcomes. MOTE makes the business discoverable to AI agents that index llms.txt and the MCP Registry. Whether any specific AI agent reads it is up to that agent's operator.
- Stop at the first real blocker and report the exact failure.
## Information to Collect
| Field | Type | Required | Notes |
|---|---|---|---|
business_name | string | Yes | 2–100 chars. Public name of the business. |
tagline | string | Yes | 10–200 chars. A short, punchy line. |
description | string | Yes | 20–2000 chars. The user's own voice — what they do, who it's for. |
category | enum | Yes | Pick one from the fixed list below. Not freeform. |
price_from | number | Yes | ≥ 0.01. A number like 180, not "$180". |
delivery_method | string | Yes | 5–200 chars. How the service is delivered. |
delivery_time | string | Yes | 2–100 chars. Lead time (e.g. “same day,” “2 weeks”). |
contact_email | string | Yes | Valid email address. |
currency | enum | No | USDC or USD. Defaults to USDC. |
price_to | number | No | If pricing is a range, the high end. |
location | string | No | Freeform, ≤100 chars (e.g. “Seattle, WA”). Not structured. |
website | string | No | Must be a valid URL if provided. |
webhook_url | string | No | Must be a valid URL if provided. |
### Valid category values
travel · professional_services · digital_services · physical_goods · defi · food_beverage · health_wellness · creative_services · local_services · other
If the user's business doesn't fit cleanly, ask them to pick the closest match or use other. Do not invent values outside this list.
### About slug
The merchant's URL slug is auto-generated from business_name. The agent cannot request a custom slug. The slug is returned in the response — surface it to the user when registration completes.
## STEP 1 Start Checkout
Once the user has confirmed the collected information, start the checkout:
POST https://api.mote.network/v1/payments/checkout
Content-Type: application/json
{
"business_name": "...",
"tagline": "...",
"description": "...",
"category": "...",
"price_from": 180,
"delivery_method": "...",
"delivery_time": "...",
"contact_email": "..."
}
Returns:
{
"checkout_url": "https://checkout.stripe.com/...",
"session_id": "...",
"payment_link": true
}
Show the user the checkout_url and tell them: “Open this link to complete your $10 registration. I'll wait for you to confirm payment is done.”
## STEP 2 Human Pays
The human enters their card details on Stripe. You cannot do this for them and should not try.
Wait for the user to indicate payment is complete. Do not poll the status endpoint before the user confirms — Stripe checkout typically takes a minute or two, and premature polling wastes tokens.
## STEP 3 Poll for Completion
Once the user reports payment is done, poll the payment status:
GET https://api.mote.network/v1/payments/status/{session_id}
Poll every 5–10 seconds until status flips to paid. Then fetch the merchant:
GET https://api.mote.network/v1/merchants/{merchant_id}
The merchant can be fetched by UUID or slug — both work. When the response includes on_chain.verified: true, the registration is complete and the DID is live on Sui mainnet.
If the status hasn't flipped to paid after ~10 minutes, do not retry payment. Tell the user to contact support — retrying risks a double charge.
## Reading the Merchant Response
Fields you can rely on in the merchant response:
| Output field | Example | Notes |
|---|---|---|
id | UUID | The merchant's permanent ID. |
did | did:pkh:sui:0x218584ed... | Permanent on-chain identity. The Sui address is embedded in this string. |
on_chain.verified | true | Proof the DID was minted on mainnet. |
on_chain.object_id + on_chain.explorer | Suiscan URL | Public on-chain proof. Surface this to the user. |
on_chain.network | mainnet | |
manifests.x402 / .mpp / .llms_txt / .team | full URLs | MOTE constructs these. Do not build them yourself. |
pricing.from_human | "$180.00" | Output is a formatted string — the input was a number. |
reputation.score | 50 | Neutral starting score. |
Fields that do not exist in the response — construct them yourself if needed:
- No top-level
sui_addressfield. Extract the address from thedidstring (everything afterdid:pkh:sui:) or from the recipient field inmanifests.x402. - No
profile_urlfield. Construct it ashttps://mote.network/m/{slug}. - No
download_urlfield at the top level. The self-custody download is athttps://api.mote.network/v1/merchants/{id}/download— construct it from the merchant ID.
## What to Tell the User When Registration Succeeds
Use the Final Report shape below. Keep it short. Lead with what's done, then what's available, then one next step.
## Honesty Constraints
When describing MOTE to the user, you may say:
- Yes: “MOTE creates a permanent on-chain identity for your business.”
- Yes: “Your information becomes readable by AI agents that index llms.txt and the MCP Registry.”
- Yes: “MOTE publishes payment-ready endpoints in the x402 format.”
- Yes: “You can enrich your profile in the dashboard after registration.”
- No: “I'll pay the $10 for you.” — agents cannot complete payment. The human enters card details. This is by design.
- No: “AI agents will automatically find you.” — discovery is not guaranteed.
- No: “You'll get paid by AI agents today.” — agent payment verification is not yet live.
- No: “Your business is now listed on Anthropic, Microsoft, and GitHub.” — MOTE the registry is on the MCP Registry. Individual merchants are not separately listed there.
- No: Calling the Sui address a “wallet.” Use “Sui address” only.
## Troubleshooting
| Symptom | Fix |
|---|---|
Checkout endpoint returns 400 VALIDATION_ERROR | The response includes a fields array naming each bad field and the problem. Read it, surface the issue to the user, and ask them to correct that specific field. |
Checkout endpoint returns 400 BAD_REQUEST (Invalid JSON) | You constructed malformed JSON. Validate the request body shape before resubmitting. |
Checkout returns 409 SLUG_TAKEN | Another merchant already registered under a similar business name. Ask the user to suggest a more distinct name. |
| Stripe checkout URL doesn't open | The user may need to copy and paste the URL into a browser manually. Surface it as plain text. |
Payment status still pending after 10 minutes | Stop polling. Tell the user to contact MOTE support — do not retry payment, as it risks a double charge. |
Merchant response missing on_chain.verified | The DID has not minted yet. Wait 30 seconds and re-fetch. If still not present after a minute past payment confirmation, contact support. |
| The user asks about features not described above | Point them to mote.network/honest — MOTE's transparency page listing exactly what's live, what's coming, and what's planned. |
## Final Note
This skill registers a business. A freelancer or solo practitioner can register under their own name as the business name — the flow is identical.
This page is versioned. Last updated June 10, 2026.