A little support. Anywhere.
Every brand has its own support profile. Link to it, embed its ticket form, or let an agent submit a ticket. Each request goes to the connected brand’s support desk.
Find support without knowing the brand
The homepage starts with email and order number. It checks the connected desks, then asks for the store’s website if it needs more information. No ticket is created during lookup.
POST https://hmu-support.vercel.app/api/resolve
Content-Type: application/json
{
"customerEmail": "customer@example.com",
"orderName": "#1042"
}If the response is status: "needs_domain", ask which website the customer ordered from and repeat with a domain field. A domain or an order-confirmation URL is accepted. The URL is used to identify a configured store and is never fetched.
A status: "matched" response gives the brand for the ticket. matchedBy: "order" means the email and order matched one desk; matchedBy: "domain" identifies the store only. The customer’s order details are checked again when they submit a ticket. Unknown domains cannot be routed until their store is connected.
Share a brand link
One brand address. One address per ticket.
A profile shows the brand’s main support email, read from its connected desk. Opening a ticket gives the customer a separate ticketEmail. Replies to that address stay attached to that private conversation.
The existing desk handles Resend inbound email and keeps the customer and the brand’s support mailbox in sync. Use the ticket email for follow-ups; a message sent only to the main mailbox may not enter that ticket.
Drop it into a page
Paste this where the form should appear. It adapts to the available width and adjusts its height automatically.
<script
src="https://hmu-support.vercel.app/embed.js"
data-brand="kidsuper"
data-title="Contact support"
defer
></script>For site builders that accept only an iframe:
<iframe
src="https://hmu-support.vercel.app/embed/kidsuper"
title="Contact support"
style="width:100%;height:800px;border:0"
loading="lazy"
></iframe>If your site uses a content security policy, allow this origin in script-src and frame-src. The iframe does not require third-party cookies.
Submit from an agent
POST /api/tickets accepts JSON. This is a public intake endpoint; no customer sign-in or API key is required. Ask the customer before submitting: a successful request creates a support message and may send a confirmation email.
curl https://hmu-support.vercel.app/api/tickets -H 'Content-Type: application/json' -d '{
"brand": "kidsuper",
"customerEmail": "customer@example.com",
"orderName": "#1042",
"message": "Could you help me with my order?"
}'| Field | Required | Value |
|---|---|---|
brand | Yes | Slug from /api/brands. Include it explicitly. |
customerEmail | Yes | Email on the order, up to 320 characters. |
orderName | Yes | Order number, up to 64 characters. |
message | Yes | What the customer needs, up to 10,000 characters. |
subject | No | Short summary, up to 200 characters. |
The email and order number must match a real order for that brand. Do not send passwords, payment card details, or other credentials.
Read the result
HTTP 201 opens a conversation; HTTP 200 adds a message to an existing conversation. Save ticketRef for the customer. A false confirmationSent means the message is saved but the confirmation email could not be sent.
{
"ok": true,
"brand": "kidsuper",
"ticketRef": "example-ticket-ref",
"orderName": "#1042",
"confirmationSent": true,
"created": true,
"supportEmail": "support@brand.example",
"ticketEmail": "reply+example-ticket@inbound.brand.example"
}Application errors return error and a stable code: 400 for invalid input, 404 for an unknown brand or an unmatched order, 413 for a request over 48 KB, 415 for a non-JSON body, and 502/503 for an unavailable connection.
Order lookup and ticket intake share a limit of 10 requests per minute per IP. HTTP 429 may come directly from the hosting firewall as a non-JSON response. Wait at least a minute before trying again.
Share the returned ticket email only with the customer and their authorized agent. Ticket emails are never listed in the public brand directory.
Submissions are not idempotent. Do not automatically retry after a timeout or an ambiguous error: the message may already be saved. Check for the confirmation email or ask the customer before trying again.
OpenAPI specification · Agent instructions · Connected brands
Connect another brand
Each brand needs a support desk connection configured by the hmu operator. Brand routing and credentials stay on the server; adding an unconfigured brand slug to a request cannot redirect a ticket.