No more widgets.Support, built right into your product.

Your AI assistant hands off to a human, your help center, your support page, all built with your own components. Fernand runs the inbox, routing, and team behind them.

Start for free R

One prompt.It sets up the handoff.

Prompt for your agent
Add a human handoff to the AI assistant in my product, with Fernand (https://getfernand.com) as the support backend.

Read these before you write code:
- https://help.getfernand.com/features/headless-contact-form
- https://help.getfernand.com/features/authenticating-users

Find the assistant in my codebase. When it can't resolve a request, or the user asks for a person, show a "Talk to a human" action in the chat. When the user clicks it, POST https://api.getfernand.com/messenger/contact from the browser.

- Header: X-AppId set to my Fernand organization slug. You can send slug instead of the header.
- JSON body: name, email, subject, message (the assistant transcript), and tags: ["in-app-ai-assistant"]. Create that tag in Fernand first.
- Attachments, if I need them, are base64 in that same JSON body.
- A 204 opens an incoming conversation on the default channel.
- If the user is logged in, my backend signs the lowercased email with the chat secret (Settings → Channels → Chat → Authentication) using HMAC-SHA256. The form sends that signature as hash. The secret stays on the server.
- extra is an object, not an array. Example:

"extra": {
  "account_id": { "label": "Account ID", "value": "12345" }
}

Replies come back through two webhook rules on the same URL, both filtered to the tag in-app-ai-assistant:
- On "new conversation", the payload includes conversation_id, the message text, the contact email, and the status. Store conversation_id on the thread.
- On "when a reply is sent", webhook the same URL.
- GET /conversations/{id}/messages only when you need attachment URLs.
- History: GET /conversations?search=from:<email> tag:in-app-ai-assistant

Then tell the user in the chat that a teammate has the full conversation, and show my team's replies in the same chat.

Read these first:
- https://developers.getfernand.com/llms.txt (API index, follow the links you need)
- https://help.getfernand.com/features/headless-contact-form
- https://help.getfernand.com/features/support-widget/authenticating-users

Rules:
- Build it with my existing components and design tokens. It should look like the rest of my product, not like a widget.
- Any Fernand API key or secret stays on my server. Never ship it to the browser, never commit it.
- Ask me for anything you can't infer from the codebase, like my Fernand organization slug.

Paste this into your agent. It finds the assistant in your product and adds a way to reach a human, in the same chat.

One POST to /messenger/contact opens the conversation, with your organization slug on the request. Your server signs the lowercased email with the chat secret, and that hash is how Fernand knows who the customer is. The secret stays on the server.

The tag in-app-ai-assistant is what both rules filter on. The account id travels with the request as an extra field, a label and a value, so the team can see which account it is.

A rule on a new conversation, and a rule when a reply is sent, both webhook the same URL with the conversation id. Your team answers in Fernand. The customer keeps chatting in your UI.

Pick a pattern.
Let your agent build it.

Each prompt tells your agent what to build, where to read the docs, and to use your own components. Copy it, or open it straight in your agent.

Ready for
  • Claude Code
  • OpenAI Codex
  • Amp
  • OpenCode
  • Cursor

AI assistant with a human handoff

Your assistant answers first. When it gets stuck, or the customer just wants a person, a teammate joins the same chat with the whole story.

A support page in your app

Signed-in customers see their conversations and reply from a page that looks like the rest of your product.

Help articles in your product

Write in Fernand, render with your own components. Contextual help on the page where people get stuck.

Support inside your admin

Read and answer a customer’s conversations next to their account, in the back office you already use.

A contact form in your design

Your fields, your layout, your validation. Every submission is a Fernand conversation, already tagged.

What does headless customer support mean?
Customers get support inside your product, built with your own components. Fernand runs everything behind it: the inbox, routing, AI, contacts, and the team that answers.
Can the AI assistant in my product hand off to a human?
Yes. When your assistant gets stuck, or the customer asks for a person, one POST to /messenger/contact sends their name, email, a hash your server signed, the subject, the transcript, the tag in-app-ai-assistant, and extra as an object. It returns 204 and opens a conversation. A rule on new conversations, and a second rule when a reply is sent, both filtered to that tag, webhook your server. Your team answers in Fernand, and the customer keeps chatting in your UI.
How do you know who the customer is?
Your server signs the lowercased email with the chat secret using HMAC-SHA256, and the form sends that hash. The secret stays on the server, under Settings → Channels → Chat → Authentication. The conversation lands on that contact.
Do I have to build everything myself?
No. Go headless only where it matters. Keep the Fernand widget, help center, and inbox for the rest.
Can my coding agent build it?
That’s the idea. Copy one of the prompts on this page into Claude Code, Codex, Amp, OpenCode, or Cursor. It reads https://developers.getfernand.com/llms.txt and builds it with your components.
Does the API cost extra?
No. The API is free to use. We don’t charge per API call or per AI resolution.