# AcornReply: full marketing index > The support inbox for teams under 10 who still reply themselves. AI surfaces context and drafts the reply in your voice. You edit and a human hits send. Canonical home: https://acornreply.com/ ## Positioning AcornReply is the support inbox for small teams who still hit send themselves. Pick the page that matches how you work. Every one of them lands in the same product, the same flat price, and the same promise: a human always hits send. ## Pricing ### Free: $0/month Try it before you commit. - Unlimited conversations - 20 AI drafts to try - Manual replies, no limits - Up to 500 outbound emails / month - Email forwarding, no DNS changes - Hosted contact form, JS snippet, iframe - Live chat widget, unlimited chats - Screenshot & file attachments on chat and forms - Mobile PWA with web push ### Pro: $20/month For teams that reply together. Flat per organization, not per seat. - Everything in Free - Unlimited AI drafts - Unlimited outbound emails - "Powered by AcornReply" stays on outbound ### Premium: $30/month For teams that want their brand, or no brand, on every reply. - Everything in Pro - Customize or hide the outbound-email footer - Customize or hide the contact-form footer Free includes 20 AI drafts lifetime and 500 outbound emails per month. Pro and Premium are uncapped on both. All plans are flat per organization, not per seat. Live chat is included on every plan; chat replies do not count toward the outbound cap unless they go out as email. ## Live chat ### Live chat that lands in your support inbox. URL: https://acornreply.com/live-chat One script tag puts a chat bubble on your site. Every chat lands in the same inbox as your email, with the same AI drafts, on every plan. **What the widget does** - Same inbox as email: A chat opens the same conversation thread that an email or a form message would, with the same AI drafts and the same assignee. There is no second console to watch. - Replies appear as they are sent: Replies appear in the widget as they are sent, so the visitor does not have to refresh the page or wait for an email to arrive. - Presence from your real availability: Presence comes from each teammate's availability and schedule, in their own timezone, rather than from anyone's session. It is off by default, so the widget shows nothing about who is around until you turn it on. - Read receipts for your team, an unread badge for the visitor: Your team gets read receipts on a chat reply. The visitor gets an unread badge on the bubble. - Screenshots and files: Visitors can attach up to 3 per message, 5 MB each, 10 MB total, images and text files. - Help-center articles in the widget: The widget offers help-center articles when you turn on article deflection. Until you do, it is a plain chat. - On every plan: Live chat is included on Free, Pro and Premium, with unlimited chats and no plan cap on teammates. The Powered-by footer shows on Free and Pro, and Premium ($30 a month) can hide it. It is not a chat-first product: no routing, no queues, no shifts, no chatbots, no SLAs. **Install it in one tag** The widget is one script tag. Copy it from Settings, under Channels, Live chat, and paste it into your site; the key in the URL is that workspace's own embed key. The web contact form uses the same embed key and its own script tag, so you can run chat, the form, or both. No framework, no stylesheet injected into your page, and the script is under 14 KB. **When nobody is online** By default the message waits in the inbox for a person. If the visitor left an email, the reply reaches them there. You can turn on an AI answer for when nobody is available. It is off until you do. Chat replies do not count toward the outbound-email cap. Only a reply that goes out as an email does: when the visitor is no longer in the chat and there is an email address on the thread. **Q: What is a free live chat widget for a small website?** A: It is a chat bubble you add to your site with one script tag, at no monthly fee, so a visitor can type a question instead of writing an email. Tawk.to is very widely deployed and free to use, and it is chat only. AcornReply includes the widget on every plan and lands each chat in the same inbox as your support email, so the answer comes from the same place as everything else. **Q: Best free live chat for a small business website?** A: If chat is the only thing you need, Tawk.to is the usual answer: free to use, very widely deployed, and funded by paid extras such as removing the branding or hiring agents. It is chat only, so it complements a support desk rather than replacing one. AcornReply Free puts the widget and a shared inbox for your support email in one tool, with 20 AI drafts in total and 500 outbound emails a month. There is a wider field in the live chat software roundup at acornreply.com/best/live-chat-software. **Q: Do I need live chat or is email support enough?** A: Email is enough for most small teams, and it is the channel customers already know how to use. Chat earns its place when questions arrive before a purchase, where a two-minute answer changes the outcome and a two-hour one does not. If you cannot answer quickly during your posted hours, honest hours and an email fallback beat a widget that goes quiet. In AcornReply the choice is not either-or: chat and email arrive in the same inbox, so turning chat on adds a door rather than a second tool. **Q: Live chat vs chatbot for customer support?** A: A chat widget puts a person on the other end; a chatbot answers without one. AcornReply ships the widget, and out of the box a person answers: every chat waits in the inbox with an AI draft ready to edit. What the AI does in the widget is one setting with modes, not a row of switches, and it is off until you choose one. Set it to show help-center articles (article deflection), or to let the AI answer when nobody is available; it does one or the other, never both. **Q: Is there a support tool with live chat and a shared inbox?** A: Yes. AcornReply is one: chat, your forwarded support email and the web contact form all land in the same inbox, on the same conversation thread, with the same AI drafts and the same assignee. Crisp is another, in a chat-first shape, putting chat, an inbox and a knowledge base together. The difference is which channel the tool is built around, so choose by the one you will actually run. **Q: What is a cheaper alternative to tawk.to?** A: Nothing is cheaper, because Tawk.to is free to use. The cost sits elsewhere: it is chat only, so it complements a desk rather than replacing one, and somebody still has to be there to answer. AcornReply Free costs nothing either, and it covers chat and your support email in one place, with 20 AI drafts in total and 500 outbound emails a month. If those limits fit, the comparison is about staffing and about the second tool you would otherwise run for email. **Q: What is a cheaper alternative to crisp chat?** A: Crisp's free tier caps the number of agents, so the bill arrives when you add a person rather than on day one; see crisp.chat/en/pricing for today's cap. AcornReply caps usage rather than people: every plan takes as many teammates as you like, and Pro is $20 a month flat for the whole organization. Moving over is self-serve: give Settings your Crisp website id and an API token, and the importer brings your help-center articles and their images across in the background, knowledge base only, never conversation history. Crisp is chat-first, with breadth across chat, an inbox and a knowledge base; AcornReply is email-first, with chat as one more door into the same inbox. **Q: How do I add live chat to my website without a monthly fee?** A: Paste one script tag into your site and the bubble appears. AcornReply Free has no monthly fee and includes unlimited chats, 20 AI drafts in total and 500 outbound emails a month. The tag pulls in no framework, injects no stylesheet into your page and is under 14 KB, so it will not fight the site you already have. **Q: Can a two person team run live chat?** A: Yes, if you are honest about hours. Two people cannot watch a widget all day, so turn on presence, which comes from each teammate's availability and schedule and is off by default, and let the rest arrive as messages you answer later. In AcornReply an unanswered chat is simply a conversation in the inbox with an AI draft waiting, and if the visitor left an email the reply reaches them there. The trap is not the tool, it is a widget that implies a live answer and then goes quiet. **Q: What happens to live chat messages when nobody is online?** A: By default the message waits in the inbox for a person. If the visitor left an email, the reply reaches them there. You can turn on an AI answer for when nobody is available, and it is off until you do. **Q: Do I need a chatbot or a person answering chat?** A: For a small team, a person, and that is the default here: every chat waits in the inbox for somebody to reply, with an AI draft ready to edit. If you want more than that, one setting decides what the AI does in the widget, and it is off until you pick a mode. You can have it show help-center articles (article deflection), or have it answer when nobody is available, one or the other. A bot earns its keep when volume is high and the same question arrives all day; below that, a drafted reply a person sends is quicker to set up and harder to get wrong. **Q: Best customer support tool that does chat email and a help center?** A: AcornReply does all three: the chat widget, your forwarded support email and a help center, in one inbox, with Pro at $20 a month flat for the whole organization. Crisp does all three too, in a chat-first shape, putting chat, an inbox and a knowledge base together. The question is which channel you want the tool built around: if support mostly arrives as email and chat is a convenience, the email-first shape fits; if chat is the main event, the chat-first one does. ## Use cases ### AI customer service that answers like you, not like a bot. URL: https://acornreply.com/solutions/ai-customer-service Most AI customer service means a chatbot that deflects, or an autopilot that replies to your customers on its own. AcornReply takes the other path: the AI writes each reply in your voice, and a human sends it. You get the speed of AI with none of the "why did the bot say that" risk. **The two kinds of AI customer service, and why both scare small teams.** When people shop for AI customer service they find two shapes, and neither fits a team that knows its customers by name. Deflection chatbots try to stop the customer from reaching you; autopilot agents answer on their own. Both optimize for a support department's ticket volume, not for a small team's relationships. - Chatbots deflect the people you want to talk to. Deflection is a win at enterprise volume and a loss at small-team volume, where every conversation is a customer you can still keep or lose by hand. - Autopilot replies are a wrong answer waiting to happen. The moment an AI sends to your customer unsupervised, one bad answer on a refund or an edge case costs more than all the time it saved. - Enterprise pricing for a startup problem. The AI tiers on legacy helpdesks stack on per-seat pricing, so a tiny team pays department prices to run a chatbot it does not fully trust. **A third option: AI drafts, a human sends.** AcornReply puts the AI where it helps and the human where it matters. Every inbound message arrives already drafted; you approve it. That is the whole model, and it is why small teams can actually trust it with their customers. - Forward your support address. Point support@yourcompany.com at your workspace. Nothing changes for your customer; you stop living in Gmail. - AI drafts every reply in your voice. Each email arrives with a draft written in your tone, the matching FAQ attached, and the customer history beside it. The AI does the reading and the first pass. - A human approves and sends. By default nothing goes to a customer without a person hitting send. You get AI speed with a human catch built into the loop, not bolted on after a complaint. - Flat price, AI included. AI drafts are on every plan, flat per organization, free to start. The drafting is the product, not a tier you pay extra to reach. **What "AI customer service" looks like here.** A customer emails asking to change a plan. The draft is ready in your voice, with their history and the right FAQ attached. You skim it, adjust one line, and send. The customer gets a normal, correct email from a person, in a fraction of the time, and no bot ever spoke for you. **Q: Is AcornReply an AI chatbot?** A: No. A chatbot talks to your customers directly. AcornReply talks to you: it drafts each reply and a human sends it. Your customer gets a normal email from your address, not a bot conversation. **Q: Can the AI answer customers automatically?** A: By default it does not. Drafts wait for a person to approve and send. Auto-send is deliberately off out of the box, because for a small team one wrong autonomous answer costs more than it saves. **Q: How is this different from the AI on Zendesk or Intercom?** A: Those add AI as a tier or add-on on top of a ticketing system, often aimed at deflection or autopilot. AcornReply was built draft-first from the start, includes AI on every plan, and keeps a human on every send. **Q: Do I need to train the AI or write prompts?** A: No. You pick a voice profile at setup and it tunes as you send. There is no prompt engineering and no sidebar to manage. ### AI drafts every reply. A human still hits send. URL: https://acornreply.com/solutions/ai-support-inbox AcornReply is a shared support inbox with AI built into the core, not bolted on as an add-on seat. Every inbound email arrives with a draft already written in your voice, the matching FAQ attached, and the customer's history alongside. You read, edit, send. **Why bolt-on AI keeps disappointing support teams.** Most helpdesks added AI as an upsell on top of a ticketing system designed fifteen years ago. The AI lives in a sidebar, the pricing lives per seat per add-on, and the workflow still assumes a support department. Small teams end up paying enterprise prices to babysit a chatbot they don't quite trust with their customers. - Autopilot AI answers customers wrong. Fully automated replies fail exactly when it matters: the edge case, the angry customer, the refund question. One bad autonomous answer costs more than a hundred drafted ones. - Bolt-on AI costs a seat plus an add-on. The AI tier usually stacks on per-seat pricing, so a three-person team pays for three seats and then again for the intelligence. - Chatbots deflect. Small teams need to answer. Deflection metrics make sense at enterprise volume. At small-team volume every conversation is a customer you know by name, and deflecting them is how you lose them. **What it looks like when the draft comes first.** AcornReply was designed around the draft-first loop from the first commit, which is why the whole product fits in a forwarded address and one screen. - Forward your support address. Point support@yourcompany.com at your workspace address. Customers notice nothing; you stop living in Gmail. - Every email arrives pre-drafted. The draft is written in the voice profile you picked, with the matching FAQ snippet attached and the customer history next to it. No prompt engineering, no sidebar. - You edit and send. By default the AI never emails your customer on its own; drafts wait for you. That default is why the drafts can be aggressive about saving you time: the human catch is built into the loop. - The price ignores the AI. Flat per organization, free to start. The drafts are the product, not an add-on tier. **What a drafted reply actually looks like.** A customer asks 'can I export my data?' The draft arrives matched against your FAQ, written in your tone, with the customer's past conversations beside it. You add one sentence about timing and send. The customer gets a normal email from a person, because that's what it is. **Q: What is an AI support inbox?** A: A shared inbox where AI reads each inbound customer email and prepares a reply for a human to review and send. It differs from a chatbot (which answers customers directly) and from a plain shared inbox (where every reply starts from a blank box). **Q: Can AI answer customer support emails by itself?** A: Technically yes, and AcornReply deliberately defaults the other way. Automated replies fail on the conversations that matter most. Drafting-plus-human-send captures nearly all the time savings with none of the wrong-answer risk. **Q: Will customers know AI is involved?** A: Customers receive a normal email from your address, written in your voice, sent by you. There is no ticket portal and no bot signature; in the default workflow, nothing goes out without a person hitting send. **Q: How is this different from a chatbot?** A: A chatbot talks to your customers. AcornReply talks to you: it prepares the reply, and you stay the sender. For small teams where every customer matters, that direction of trust is the whole point. ### The support email you missed was the one that mattered. URL: https://acornreply.com/solutions/stop-missing-support-emails Nobody decides to ignore a customer. Messages get missed because they live in a personal inbox, behind a filter, in a thread someone else thought you were handling. The fix is structural, not motivational. **Why support emails go missing in small teams.** Missed messages are almost never a diligence problem. They are an ownership problem: the message landed somewhere no one was responsible for. - The personal-Gmail trap. Support goes to whoever's address is on the site. When that person is heads-down, on holiday, or just drowning, the queue silently stops. - The CC illusion. Two people CC'd on a thread each assume the other is replying. The customer waits a week while both inboxes show the thread as read. - The forwarding maze. A message forwarded to the person who can answer it now exists in two threads, and the reply happens in neither. - Filters eat the edge cases. The rule that tidies newsletters also swallows the customer whose subject line didn't match the pattern. **The structural fix: one owned inbox, drafts ready.** Every step here removes a place where a message can be simultaneously everywhere and no one's job. - Give support one address and one home. Forward support@ to a shared workspace. Every customer message now lands in a queue the whole team can see, not a personal inbox. - Make ownership visible. Each conversation shows who has it. Returning customers route to whoever replied last, so context and responsibility travel together. - Lower the cost of replying. Most missed emails were postponed because answering felt expensive. When each message already carries an AI-written draft in your voice, the marginal cost of replying now drops to reading it. - Let nothing sit unowned. The queue view makes an unanswered, unassigned message impossible to miss, which is the entire game. **Q: How do small teams stop missing support emails?** A: Move support out of personal inboxes into one shared, owned queue; make per-conversation ownership visible; and lower the effort of each reply so messages stop being postponed. Tools help with all three, but the structural change (one home, visible ownership) does most of the work. **Q: Is a shared Gmail account good enough?** A: A shared login works until two people answer the same customer, or neither does. It has no ownership, no assignment, and no draft help. It's better than a personal inbox and worse than an actual shared inbox tool. **Q: What should we do about the backlog of unanswered emails?** A: Forward the address first so nothing new is missed, then work the backlog oldest-first from the queue. With drafts pre-written, clearing a backlog is mostly reading and sending. ### Automate the writing, not the deciding. URL: https://acornreply.com/solutions/customer-service-automation Most customer service automation is deflection in a nicer word: fewer customers reaching a person. AcornReply does the opposite. It automates the part that eats the time, which is writing the reply, and leaves every judgment call to you. A human reads each answer and hits send. **What small teams mean when they say they want automation.** Almost nobody wants a robot answering their customers. They want back the twenty minutes it takes to write eight replies from a blank box. Those are different problems, and most automation software solves the first one by putting a deflection layer between you and the person who wrote in. - Every reply starts from nothing. A question you have answered fifty times gets typed out again, because the answer lives in one person's head rather than anywhere the inbox can reach. - The same twenty questions arrive every week. Pricing, refunds, setup, the one confusing screen. The volume is repetitive, but each customer still deserves an answer written for them and not a canned macro. - The knowledge sits with one person. When the teammate who knows the product is in a meeting, the queue waits. Nobody else can answer without checking with them first. - Hiring is the only lever most teams have. A second support hire is a large, permanent step for a team of four. Most small teams stretch instead, and every reply gets slower. **What AcornReply automates, and what it deliberately does not.** The drafting is automatic. The deciding is not. That line is the whole product, and it is the reason this kind of automation is safe to leave switched on. - Your help center and past replies become the knowledge base. Articles, FAQ entries and the replies your team has already sent are what the AI reads. It answers out of your own material rather than a generic idea of customer service. - Every inbound message arrives already drafted. The draft comes written in your voice, with the customer history and the articles it used sitting next to it. The blank box is gone before you open the thread. - A human edits and sends. Nothing reaches a customer unreviewed. You skim, fix a line, send. The calls that need judgment stay with the person who can make one. - The genuinely mechanical parts are opt-in. Routing to the right workspace, snoozing a thread until a date, and auto-reply all exist. Auto-reply is opt-in and ships off, so the human-sends rule holds unless you deliberately turn it on. **Where the time actually goes.** A refund question that used to take six minutes takes one. The draft already cites your refund policy article and has the order history beside it, so you change a sentence and send. Repeat that across a morning queue and the automation has paid for itself without a single customer talking to a bot. **Q: What can you actually automate in customer service?** A: Reliably: drafting the reply, pulling up the customer history, tagging and routing, snoozing a thread until a date, and acknowledging receipt. Much less reliably: deciding what the answer should be. AcornReply automates the first list and leaves the second to a person. **Q: Will automation make replies sound robotic?** A: Only if the automation writes generically. AcornReply drafts from your own help center articles and past replies, in a voice profile you pick at setup, and you edit before sending. The message that goes out is one you approved. **Q: Is automated customer service worth it for a small team?** A: It is worth it when the same questions repeat and replies are slow because writing them takes time. It is not worth it at five emails a week, where the setup costs more than it saves. Be honest about which one you are. **Q: What should never be automated?** A: Refunds, apologies, and anything with a legal or contractual edge. Those need a person who can make a judgment call and stand behind it. AcornReply will draft them, but it will not send them unless you switch auto-reply on yourself, and it ships off. ### An AI agent that drafts. A human who sends. URL: https://acornreply.com/solutions/ai-customer-service-agent The phrase "AI customer service agent" covers two very different products: an autonomous agent that answers your customers on its own, and an AI assistant working alongside a human agent. AcornReply is the second kind. If what you want is the first, Intercom Fin and Zendesk AI resolution are the honest answer, and this page will not pretend otherwise. **When one person is the entire support team.** Most teams searching for an AI agent are not trying to remove humans from support. They have one human, that human has three other jobs, and the queue keeps arriving anyway. The question is whether a second pair of hands has to be a hire. - One person is the whole support team. Support is one job among four. Writing a good reply takes real time, and that time is the first thing squeezed by everything else on the calendar. - The queue does not stop for a meeting. An hour in a call is an hour of customers waiting, because there is no second agent to cover the gap and no shift to hand over to. - Hiring a second agent is a large step. A support hire means a process, a permanent cost and a training period, all for a queue that might need two focused hours a day. **What "agent" means inside AcornReply.** It behaves like a second agent who writes quickly and never sends without you. It reads the message, finds the answer in your own help center, and hands you a finished draft. You remain the person your customer is talking to. - The AI drafts as though it were your second agent. Every inbound message arrives with a full reply already written, not a suggestion chip and not a sidebar you have to prompt into usefulness. - It answers from your help center, not from a generic idea of support. Drafts are grounded in your own articles, FAQ entries and past replies, so the answer sounds like your team and cites the page it came from. - A human always sends. Out of the box nothing leaves the workspace without a person approving it. Auto-reply exists, it is opt-in, and it is off by default. - You keep the customer relationship. The customer gets a normal email from your address. There is no bot persona in the thread and nothing to disclose, because a person really did send it. **A morning with a second agent.** Eleven messages overnight. Nine of them are questions your help center already answers, and all nine are drafted before you open the inbox. You read, adjust two, and send. The remaining two are the ones that needed you: a refund edge case and an angry customer. Those get your full attention, because the other nine did not take it. **Q: What is an AI customer service agent?** A: The phrase covers two products. One is an autonomous agent that answers customers directly and resolves tickets without a person, which is what Intercom Fin and Zendesk AI resolution do. The other is an AI assistant sitting next to a human agent, drafting the reply that the human then sends. AcornReply is the second. **Q: Can an AI agent reply without a human?** A: In AcornReply, only if you switch auto-reply on. It exists, it is opt-in, and it is off by default, so out of the box every reply waits for a person. If autonomous resolution is what you actually want as the normal path, buy a product built around it rather than turning ours into one. **Q: Will an AI agent replace my support hire?** A: It postpones one. Drafting takes most of the minutes out of each reply, so a team of three can hold a queue that would otherwise need a fourth person. It does not remove the judgment calls, and it does not cover a queue that needs staffing around the clock. **Q: How does the AI know my product?** A: From your help center articles, your FAQ entries and the replies you have already sent. You pick a voice profile at setup and it tunes toward how your team writes as you send. There is no prompt writing and no model training on your side. ### Every complaint owned, tracked, and actually answered. URL: https://acornreply.com/solutions/complaint-management-software Read this before anything else: AcornReply is not regulated-complaints software. There is no statutory case management, no audit workflow, and no complaints register built for a compliance regime. If a regulator inspects how you handle complaints, you need a compliance product and this is not it. What AcornReply does is make sure customer complaints arriving by email get an owner, a status and a real answer. **Complaints are the emails you cannot afford to lose.** A complaint left unanswered for four days becomes a refund, a public review, or a customer who never writes again. A personal inbox or a plain shared mailbox tells you none of what you need: whether the thread is still open, who owns it, or whether the customer ever got a real answer. - Nobody can say whether it was resolved. The reply went out from one person's own inbox, so a week later there is no way to tell whether the customer was satisfied or simply gave up. - Two people reply, or nobody does. With no owner, an angry email gets two contradictory answers or none at all. Both leave the complaint worse than it arrived. - Tone slips exactly when it matters most. Complaints get answered late, under pressure, by whoever is free. That is precisely when a rushed sentence turns a fixable problem into a public one. - The history disappears. When the same customer writes again three months later, the earlier complaint and whatever you promised are not in front of whoever picks the thread up. **What AcornReply does with a complaint.** It gives a complaint the three things a plain mailbox cannot: an owner, a status, and a written history that outlives the person who handled it. - Every complaint is one thread with a status and an owner. Open, snoozed or resolved, assigned to a named person. You can see at a glance what is still unanswered and who is holding it. - Nothing is closed silently. A thread becomes resolved only when a person marks it resolved, and a new reply from the customer reopens it automatically. Closing a complaint by forgetting about it is not available. - The reply is drafted, so the tone holds under pressure. AcornReply drafts the answer from your own policies and past replies in a consistent voice. You edit and send, which is what keeps a rushed sentence out of the one thread where it would cost you most. - Resolved threads keep their history. When the customer comes back, the whole complaint is on the thread: what happened, what was promised, and who promised it. **The complaint you would rather not repeat.** A customer writes on a Friday about a charge they did not expect. It lands assigned, drafted from your refund policy, and open. Nobody is around until Monday, so it is still open on Monday morning rather than buried under sixty newer emails. It gets answered, marked resolved, and when the same customer writes in April the whole story is right there. **Q: What is complaint management software?** A: Software that captures a customer complaint, gives it an owner and a status, tracks it until a person resolves it, and keeps the record afterwards. In regulated industries the same phrase means something stricter: a statutory complaints register with audit trails and mandated response deadlines. Those are two different categories of product. **Q: Is a shared inbox enough for handling complaints?** A: A plain shared mailbox is not, because it carries no owner, no status and no proof that a complaint was answered. A shared inbox with assignment, statuses and full history is enough for most small teams, and that is what AcornReply is. **Q: Does AcornReply meet regulatory complaint-handling requirements?** A: No. There is no statutory case management, no audit workflow, no regulator-shaped complaints register and no mandated response-deadline tracking. AcornReply is a customer support inbox with owners, statuses and history. If a regulator audits your complaint handling, buy a compliance product instead. **Q: How do you track whether a complaint was resolved?** A: Each thread carries a status and an assignee. Resolving is a deliberate action by a person, and an inbound reply from the customer reopens the thread automatically, so a complaint cannot quietly close itself while the customer is still waiting. ### You are the support team. AcornReply is the rest of it. URL: https://acornreply.com/solutions/founders When the founder still answers every customer email, the bottleneck is not draft quality. It is context. AcornReply pulls the customer history, drafts a reply in the voice you already use, and waits for you to read it. You hit send between meetings, from a phone if you have to. **The founder support stack is duct tape.** Most early-stage founders run support out of three places: a personal Gmail thread, a Notion FAQ that nobody else reads, and a Slack DM to a co-founder asking 'what do I say to this person.' It works until it doesn't, usually around the time you raise, or hit twenty customers, or take a four-day weekend. - Context lives in your head. Half the answer is 'I remember this customer. They had the same issue in March.' That memory does not survive your next hire. - Tone takes longer than the answer. Founders rewrite every reply six times because the wrong tone with the wrong customer ends a contract. The draft is the easy part. The voice is what eats the hour. - Per-seat helpdesks price you out at one. Help Scout, Front, and Intercom all bill per seat, and the tiers worth having cost more per seat again. For a one-person company that's a tax on the only seat you have. - You answer from your phone, between meetings. Every other inbox tool is desktop-first. Founders are not. The reply has to happen on a phone, in a hallway, in three minutes. **How AcornReply fits a founder workflow.** AcornReply assumes you are the only person on this inbox today and the third person on it next quarter. The same setup works for both. - Forward your support address. Forty-five seconds. Point support@yourcompany.com at a per-workspace address on acornreply.com. No DNS changes for v1, no MX rewiring, no domain verification dance. Customers keep emailing the same place. You just stop logging into Gmail to find them. - Pick a voice profile. Sixty seconds. Onboarding shows you a handful of built-in voice profiles: pick the one closest to how you actually write. Every reply you send after that quietly tunes the profile, so the drafts read more like you with every send. Nothing to paste, nothing to maintain. - Open a message, edit the draft, send. Every inbound message arrives with a draft already written and the matching FAQ snippet attached. You read it, edit if needed, hit send. No 'AI replied on your behalf' surprises in your customer's inbox. - Add a co-founder when you're ready. Invite them as a member. The bill stays flat. They land in the same inbox, see the same drafts, and assignment rules keep returning customers on whoever last replied to them. **A real founder reply, end to end.** Customer emails: 'Hey, can I export my data?' AcornReply matches the question against your FAQ, drops the relevant article into the draft, and signs off in the voice profile you picked at onboarding. Next to the draft, you see the customer's previous messages in this workspace (what they asked last month, how you answered then) so you do not have to scroll a long thread to remember context. You add one line about a timeline, hit send. Forty seconds, founder voice intact, customer reply lands in their inbox like email, not a ticket portal with a reply-above-this-line banner. **Q: Can I use AcornReply if I am the only person on the team?** A: Yes. AcornReply is priced flat per organization, not per seat. A solo founder pays the same Pro rate as a team of nine. The product is built around the assumption that the founder is the support team today, and the same workspace scales to a team without re-onboarding. **Q: Will my customers see "AI replied to you"?** A: No. Replies leave from your own workspace address with the display name you choose, so customers see a normal email from you, not a bot. By default a human edits and hits send on every draft; auto-reply is an opt-in setting that is off unless you turn it on. **Q: How is this different from using ChatGPT to draft replies?** A: ChatGPT does not know your customer history, your FAQ, or your past replies. AcornReply grounds each draft in your own knowledge base, lists the exact FAQ snippets it used under each draft, and warns you when it cannot find a confident answer. You still review, but you are reviewing a draft built from your own material, not from the open web. **Q: What does it cost for a one-person team?** A: Free covers your first 20 AI drafts and 500 outbound emails per month, enough to test on real traffic. Pro is $20 a month flat for the whole organization; Premium adds branding control at $30. No card to start. ### Outgrow Gmail labels. Skip the per-seat helpdesk. URL: https://acornreply.com/solutions/indie-saas Indie SaaS support runs on Gmail labels until it does not. AcornReply is the smaller jump: a shared inbox priced flat per organization, with AI drafts grounded in your help articles. Forward your support address and keep replying like a person. **Gmail labels work, until two people open the same thread.** The standard indie SaaS support stack is one founder's Gmail with a `support` label, plus a co-founder who CCs themselves in. It scales to about three customers per day before duplicate replies, missed messages, and the 'who said what' Slack thread eat your morning. - No shared state. Two teammates do not know if the other already replied. Customers get two answers, or none. - No way to write in one voice. Your co-founder writes 'Hey friend, sorry about that!' You write 'Hi, thanks for the report.' Customers feel it. - Per-seat helpdesks tax the wrong axis. You add a contractor for six weeks and a per-seat plan charges you for a whole seat anyway, month after month until someone remembers to remove them. The math punishes the way indie teams actually staff. - No clean way to send a contact form to your site. Most indie SaaS landing pages link to a personal Gmail. Spam-filtered, no analytics, no signal. **How AcornReply replaces the Gmail-label stack.** Forward your support address, paste a one-line contact-form snippet on your landing page, invite your co-founder. Three steps, one inbox, flat price. - One inbox for email, live chat, and the contact form. Anything sent to your per-workspace support address, sent via the live-chat bubble on your site, submitted through the hosted contact form, or posted via the API lands in the same conversation list. - Assignment that does not require a process doc. Returning customers automatically route to whoever last replied to them. Sending a reply claims any unassigned thread. The "Mine" filter shows just yours. No SLA queues, no round-robin rules to configure. - AI drafts grounded in your FAQ, not the open web. Paste your help articles into the FAQ. Every draft cites which articles it used, and if it can't find a confident answer it asks for clarification instead of inventing one. You see exactly what the customer would see before you hit send. - Mobile-first PWA, no native app required. AcornReply installs to your home screen from Safari or Chrome: no App Store wait, no native build. Swipe right to snooze, swipe left to resolve. The way you actually do support: on your phone, between meetings. **A two-person indie SaaS, week one.** Founder A forwards support@theirapp.com to support@theirapp.acornreply.com. Founder B drops the contact-form ` ``` ### Hide the chat bubble Prefer to launch chat from your own "Contact us" button, a nav link, or an existing component instead of the default bubble? Hide the built-in bubble and drive the widget yourself with a small browser-side API. This is all client-side JavaScript; it does not touch the REST API. The examples below add one line above the script tag, a tiny stub that defines window.AcornReply up front so your calls are safe to make the moment the page loads, before the widget has finished loading. Hide the bubble and wire your own element Add data-hide-button to the script tag to suppress the built-in floating bubble. The chat card and the control API still load, so any element on your page (an existing button, a menu item, your own React or Vue component) can open it. Listen for the acorn:chat-state event to keep your trigger in sync when the visitor closes the card from inside it or presses Escape. ```text ``` ### Control the widget (JS API) The control API The public entry point is a single global function, window.AcornReply(command): There's one more command, AcornReply("identify", traits), for telling AcornReply who the visitor is. See Identify your visitors below. When do you need destroy? If you drop the script tag on your site once, never: the widget is meant to live for the whole page. Reach for it only when your own code injected the script and now has to take it back out, namely: a single-page app (React, Vue, etc.) that mounts the embed on some routes and removes it on others, so call destroy in your component's unmount/cleanup; pulling the widget after the visitor withdraws cookie or chat consent. It's needed because the script installs once and ignores a second injection while it's live, so removing the ``` ### Let AI write the setup Prefer to let AI write it? Not a developer? Paste the prompt below into ChatGPT, Claude, or any AI assistant, fill in the one blank describing what you want, and it will write the exact snippet to add to your site. The prompt already contains everything the assistant needs to know about the widget's API, so you don't have to explain it. ```text I use AcornReply's live chat widget on my website. I install it with this snippet: This JavaScript API is available on the page via the global function window.AcornReply(command, payload). The install snippet defines it up front, so it is safe to call any time, even on page load, without waiting for anything: - AcornReply("open") -> open the chat - AcornReply("close") -> close the chat (the conversation keeps running) - AcornReply("toggle") -> open if closed, close if open - AcornReply("destroy") -> remove the widget entirely - AcornReply("identify", { email, name, externalId, plan }) -> tell AcornReply who the visitor is - Add the attribute data-hide-button to the second ``` ## MCP ### Connect an AI agent (MCP) The knowledge base API is also available as a remote MCP server at https://mcp.acornreply.com, with the same entries and search tools as the REST API, including set_published to publish or unpublish an entry, plus full category management (list_categories, create_category, update_category, delete_category, reorder_categories) and images (upload_image, create_image_upload, finalize_image_upload) for hosting images. There are two ways to connect: sign in with OAuth (recommended, no API key), or send a workspace API key for clients without OAuth support and for the Claude API. Connect with OAuth: in Claude (claude.ai or Claude Desktop), add https://mcp.acornreply.com as a custom connector and click Connect. Then sign in with your AcornReply account (any sign-in method works, including Google), pick a workspace if you have more than one, and approve access on the consent screen. In Claude Code, add the server with the command below, then run /mcp, choose acornreply, and select Authenticate; your browser opens to sign in. Any other MCP client that supports MCP OAuth (dynamic client registration with PKCE) connects the same way, with just the URL. Any workspace member can connect, not only admins. Tokens are per user, per workspace: the connection acts as you, with your own access, in the workspace you picked. To switch workspace, ask your agent to change it; it uses the list_workspaces and select_workspace tools, and a switch applies to every conversation using that connection. On an OAuth connection, write results include workspace { id, name }, so you can always see where a change landed. To disconnect, remove the connector in your client, or go to Settings > MCP & API > Connected apps and choose Disconnect. The MCP server only reaches your knowledge base: FAQs, articles, categories, images, and article stats. It cannot access your inbox, conversations, customers, billing, or team members. Knowledge entries AcornReply learns automatically from resolved conversations are not exposed over MCP either: they never appear in list or search results, and every entry tool treats their ids as not found. AcornReply is listed in the official MCP registry as com.acornreply/server, so clients that browse it can add it without being handed the URL. The published manifest declares the Authorization header as optional: clients that support OAuth sign in instead, and the rest prompt you for an API key as part of the install. ```bash claude mcp add --transport http acornreply https://mcp.acornreply.com # Then, inside Claude Code: run /mcp, choose acornreply, and select Authenticate. ``` ### Connect any other MCP client A client that supports MCP OAuth needs only the URL, https://mcp.acornreply.com, and signs you in as described above. For a client without OAuth support, or for the Claude API, connect with a workspace API key. Admins create keys in Settings > API keys. Authenticate the same way as the REST API: the key as a Bearer token, sent only in the Authorization header. Never put a key in the URL or a query parameter. An API-key connection is fixed to the key's workspace, so list_workspaces and select_workspace are not offered. Calling the Claude API (Messages API) directly? Use its MCP connector, shown in the second example below: send the anthropic-beta: mcp-client-2025-11-20 header and add the server and toolset to your request. Claude passes authorization_token to AcornReply in the Authorization header. For clients that read a JSON config (Cursor, Windsurf, VS Code, and others), add this to the client's mcpServers configuration: ```json { "mcpServers": { "acornreply": { "url": "https://mcp.acornreply.com", "headers": { "Authorization": "Bearer ak_YOUR_KEY" } } } } ``` **Claude API (Messages API MCP connector):** ```json { "mcp_servers": [ { "type": "url", "url": "https://mcp.acornreply.com", "name": "acornreply", "authorization_token": "ak_YOUR_KEY" } ], "tools": [{ "type": "mcp_toolset", "mcp_server_name": "acornreply" }] } ``` ### Tools The MCP server exposes the same knowledge base operations as the REST API, grouped into tool families that map onto the resources below: search (search_kb), entries (create/list/get/update/delete, plus set_published to publish or unpublish), categories (create/list/update/delete/reorder), images (upload_image, create_image_upload, finalize_image_upload), format (get_format_guide) for the content-format contract, and analytics (article_stats) for per-article help-center view stats. Unlike the REST API, the entry and search tools cover only FAQs and articles; entries learned from past conversations are left out. OAuth connections also get workspace tools: list_workspaces shows the workspaces you can access and which one is selected, and select_workspace switches the connection to another one, by id or slug. The switch applies to every conversation using that connection. API-key connections do not see these tools. Deletes ask for confirmation. The first delete_entry call returns { requiresConfirmation, impact } and deletes nothing; call it again with confirm: true to delete the entry. delete_category works the same way when the category has sections or filed entries. This applies to API-key connections too. Every tool carries a title and a read-only or destructive annotation, so a client can show at a glance which tools only read, and ask before running one that writes or deletes. ## API ### Common #### Authentication Every request carries a workspace API key as a Bearer token. Create keys in Settings > API keys (admins only). Keys are server-side secrets. Never ship one to a browser or mobile app. ```text Authorization: Bearer ak_YOUR_KEY ``` #### Base URL & conventions All endpoints are under https://acornreply.com/api/v1. Requests and responses are JSON with snake_case keys; ids are UUIDs unless a field accepts a slug. #### Errors Errors return { "error": { "message", "type", "code", "fields": [...] } }. 401 means a missing or invalid key; 422 lists the failing fields; 5xx are safe to retry with the same external_id. #### Rate limits 30 requests per minute per key. Beyond that you get HTTP 429 with a retry-after header (seconds). Back off and retry; idempotency keys make retries safe. #### Idempotency external_id is the idempotency key. Reusing one returns the existing ticket with HTTP 200 (a fresh ticket returns 201), so retries and double-submits cannot create duplicates; no new ticket or message is created. On a replay, body, subject, tags, priority, and metadata are ignored, and context only fills gaps in the stored environment (never overwriting). The customer record is refreshed, though: customer.name updates the contact's display name, and customer.external_id backfills if it wasn't already set. A genuinely new ticket needs a new external_id. #### Pagination List endpoints return a next_cursor; pass it back as ?cursor= to fetch the next page. A null next_cursor means the last page. ### Tickets #### Create a ticket One endpoint creates a conversation in your inbox from an end-user message. Only customer.email and body are required; everything else enriches what your team sees. ```bash curl -X POST https://acornreply.com/api/v1/tickets \ -H "Authorization: Bearer ak_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "customer": { "email": "jane@acme.com", "external_id": "usr_42" }, "subject": "Export failing", "body": "My export has been stuck for an hour.", "priority": "normal", "tags": ["billing"], "metadata": { "plan": "trial", "user_id": 42 }, "context": { "locale": "en-US", "timezone": "America/Chicago", "country": "US" }, "external_id": "tkt_abc123" }' ``` | Method | Path | Summary | | --- | --- | --- | | POST | `/api/v1/tickets` | Create a ticket | **Request fields:** | Field | Type | Required | Description | | --- | --- | --- | --- | | `customer` | object | yes | The end user the ticket belongs to. Matched/created by email. | | `customer.email` | string | yes | Customer's email (required). | | `customer.name` | string | no | Display name; derived from the email when omitted. | | `customer.external_id` | string | no | Your ID for this customer, stored for cross-referencing. | | `body` | string | yes | The first message text (required). | | `subject` | string | no | Synthesized from body when omitted. | | `priority` | low \| normal \| high \| urgent | no | Workflow priority shown in the inbox and sidebar. | | `tags` | string[] | no | Up to 20 labels shown on the conversation. | | `metadata` | object | no | Flat business data (string/number/boolean values, max 50 keys). Shown in the conversation sidebar Details section and usable in quick-link URL templates. | | `external_id` | string | no | Idempotency key. Reuse returns the same ticket (HTTP 200) instead of creating a duplicate. | | `context` | object | no | Observed end-user environment (not the calling server's). All fields optional; invalid values are dropped without failing the request. country is an ISO 3166-1 alpha-2 code derived by the caller. Never send an IP. Shown to agents in the conversation sidebar's Environment section. | | `context.user_agent` | string | no | End user's browser User-Agent. | | `context.locale` | string | no | BCP 47 tag, e.g. en-US. | | `context.timezone` | string | no | IANA zone, e.g. America/Chicago. | | `context.country` | string | no | ISO 3166-1 alpha-2, e.g. US. | | `context.page_url` | string | no | Page the user was on (https). | | `context.referrer` | string | no | Referrer URL (https). | **Example response:** ```json { "ticket": { "id": "498b650b-c46c-4b66-a0f4-dbf5a8d8a803", "external_id": "tkt_abc123", "subject": "Export failing", "status": "open", "priority": "normal", "tags": [ "billing" ], "source": "api", "url": "https://acornreply.com/conversations/498b650b-c46c-4b66-a0f4-dbf5a8d8a803", "created_at": "2026-06-12T00:00:00.000Z", "customer": { "id": "166ac1e0-3013-4304-b4f6-a04c0374f8be", "email": "jane@acme.com", "external_id": "usr_42" } } } ``` | Status | Description | | --- | --- | | 200 | Idempotent replay (existing ticket returned) | | 201 | Ticket created | | 401 | Missing or invalid API key | | 422 | Validation error | | 429 | Rate limit exceeded; the retry-after header carries the wait in seconds. | #### Fill the context object from the browser The context object is the end user's environment. It renders in the conversation sidebar so your team sees device, language, local time, and country next to the message. Collect it client-side, then create the ticket from your server where the API key lives. Derive country yourself (for example from Cloudflare's CF-IPCountry header on your own request). Never send the user's IP: the API has no field for it and we never store one. ```js // 1) In the browser: collect the end user's environment with their message. // No API key here; this is plain data collection. const context = { user_agent: navigator.userAgent, locale: navigator.language, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, page_url: location.href, referrer: document.referrer || undefined, } await fetch('/support/tickets', { // your own backend endpoint method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message, context }), }) // 2) On your server: create the ticket. The API key stays server-side. const res = await fetch('https://acornreply.com/api/v1/tickets', { method: 'POST', headers: { Authorization: `Bearer ${process.env.ACORN_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ customer: { email: user.email, external_id: user.id }, body: message, metadata: { plan: user.plan }, context: { ...context, country: req.headers['cf-ipcountry'] }, external_id: ticketId, // idempotency key }), }) const { ticket } = await res.json() // ticket.url links into your inbox ``` #### metadata vs context metadata is business data you tell us: plan, order id, feature flags, as flat string/number/boolean values, max 50 keys. It shows in the sidebar's Details section and powers quick-link URL templates like {metadata.order_id}. context is the observed environment: user agent, locale, timezone, country, page URL. It shows in the sidebar's Environment section. The two never mix. ### Knowledge base Manage the knowledge base your AI drafts and help center pull from: list, create, update, and delete entries; search; and full category management: create, update, delete, and reorder categories (POST/PATCH/DELETE /api/v1/kb/categories and POST /api/v1/kb/categories/reorder). Entries are faq or article. Send Markdown in body (articles are converted to sanitized HTML; pass body_html instead if you already have HTML), and file an entry under a category by passing its slug or id as category. Write responses (create/update) include a warnings[] array listing anything the sanitizer changed or dropped. #### Entries Create, read, update, and delete FAQ and article entries. Send Markdown in body (articles are converted to sanitized HTML, or pass body_html), and file an entry under a category by passing its slug or id as category. Write responses include a warnings[] array of anything the sanitizer changed. Syncing entries from your own docs or CMS? Two request fields exist for it. origin_link is your own customer-facing link for the entry: set it and customers are sent there instead of the AcornReply-hosted help-center page, in AI draft citations, auto-serve deflection cards, and the help-center source link. source_ref_id is your own cross-reference id for the entry, so you can match the row again on the next sync; it is unique per workspace and entry type. Both accept null to clear them, and a slug or source_ref_id already taken in this workspace comes back as a 422 (code slug_taken or source_ref_taken) whose fields[] entry carries existing_id, the entry already holding it, so you can PATCH that one instead. Pass dry_run: true on create or update to validate and preview warnings[] without writing. The response comes back with a null id and timestamps. See https://acornreply.com/api/v1/kb/format for the exact list of supported Markdown features and the article HTML/iframe-host allowlist. | Method | Path | Summary | | --- | --- | --- | | GET | `/api/v1/kb/entries` | List KB entries | | POST | `/api/v1/kb/entries` | Create a KB entry | | GET | `/api/v1/kb/entries/{id}` | Get a KB entry | | PATCH | `/api/v1/kb/entries/{id}` | Update a KB entry | | DELETE | `/api/v1/kb/entries/{id}` | Delete a KB entry | **Request fields:** | Field | Type | Required | Description | | --- | --- | --- | --- | | `type` | faq \| article | yes | Entry type (required). | | `title` | string | yes | Entry title (required). | | `body` | string | no | Markdown source. Faqs render it as-is; articles are converted to sanitized HTML. Provide body or body_html, not both. Unsupported constructs are stripped and reported in the response’s warnings[] array. See GET /api/v1/kb/format for the supported feature/tag list. | | `body_html` | string | no | Raw HTML for callers that already have HTML instead of Markdown. Sanitized against the article allowlist before storage (see GET /api/v1/kb/format); anything dropped is reported in warnings[]. Provide body or body_html, not both. | | `published` | boolean | no | Whether the entry is eligible for AI drafting and the help center. Defaults to unpublished. | | `slug` | string | no | URL slug; derived from the title when omitted. | | `category_id` | string \| null | no | Category to file the entry under. | | `category` | string | no | Slug or id of the category to file the entry under. Alternative to category_id: send one, not both (sending both is a 422). Unlike category_id (uuid only), this accepts a slug. | | `origin_link` | string \| null | no | Your own customer-facing link for this entry — your docs site, your existing help center, a product page. When set, it replaces the AcornReply-hosted help-center URL everywhere a link to this entry is shown to a customer: AI draft citations, auto-serve deflection cards, and the help-center source link. Must be an absolute http:// or https:// URL. Omit or send null to keep pointing customers at the AcornReply-hosted page. | | `source_ref_id` | string \| null | no | Your own cross-reference id for this entry (a row id, slug, or ticket key in your system), so you can match this entry on a later re-sync. Unique per workspace and entry type: reusing an id already taken in this workspace is rejected with a 422 (code source_ref_taken) rather than silently updating the entry that already holds it. The error’s fields[] entry carries existing_id so you can PATCH that entry instead. | | `dry_run` | boolean | no | When true, validates and renders the entry, including warnings[], without writing to the database. The response comes back with a null id, created_at, and updated_at. | **Entry object (response):** | Field | Type | Description | | --- | --- | --- | | `id` | string \| null | Null on a dry_run response. | | `type` | faq \| article \| past_conversation | Entry type. Only faq and article are creatable through this API; past_conversation entries are indexed automatically from resolved conversations. | | `title` | string | | | `body` | string | Rendered/stored body: Markdown for faq, sanitized HTML for article. | | `published` | boolean | Whether the entry is eligible for AI drafting and the help center. | | `status` | verified \| unverified | | | `slug` | string \| null | | | `category_id` | string \| null | | | `origin_link` | string \| null | Your own customer-facing URL for this entry. When set, it replaces the AcornReply-hosted help-center URL everywhere a link to this entry is shown to a customer. Null means customers get the AcornReply-hosted page. | | `source_ref_id` | string \| null | Your own cross-reference id for this entry, unique per workspace and entry type. Null unless you set one. | | `created_at` | string \| null | | | `updated_at` | string \| null | | **Example request:** ```json { "type": "faq", "title": "How do refunds work?", "body": "We refund within **30 days** of purchase.", "published": true } ``` #### Categories Create, update, reparent, reorder, and delete categories (a category with child sections or filed entries returns an impact preview on delete until you re-call with confirm). Reference a category by slug or id anywhere an id is accepted. | Method | Path | Summary | | --- | --- | --- | | GET | `/api/v1/kb/categories` | List KB categories | | POST | `/api/v1/kb/categories` | Create a KB category | | PATCH | `/api/v1/kb/categories/{id}` | Update a KB category | | DELETE | `/api/v1/kb/categories/{id}` | Delete a KB category | | POST | `/api/v1/kb/categories/reorder` | Reorder KB categories | **Request fields:** | Field | Type | Required | Description | | --- | --- | --- | --- | | `title` | string | yes | Category title (required). | | `description` | string | no | | | `parent` | string | no | Slug or id of a top-level category to nest under (makes this a section). | #### Images Upload an image with POST /api/v1/kb/images (multipart file, WebP/PNG/JPEG/GIF, max 5 MB) to host it on your CDN; the response returns url, sha256, width, and height. To upload raw bytes without multipart, POST /api/v1/kb/images/presign (mime + sha256) for a presigned PUT URL, PUT the bytes, then POST /api/v1/kb/images/finalize with the returned key; the server verifies the bytes against your sha256 before committing. URLs are content-addressed by SHA-256 and immutable, but may 404 for a few seconds at the CDN edge right after upload. Uploads are burst-limited (60/min per workspace) and count against a daily per-plan quota (lowest on the free plan); over either you get HTTP 429. | Method | Path | Summary | | --- | --- | --- | | POST | `/api/v1/kb/images` | Upload a KB image | #### Search Semantic search over your published knowledge base, the same retrieval the AI drafting uses. Pass q (the query, required) and an optional limit; results come back ranked by relevance. | Method | Path | Summary | | --- | --- | --- | | GET | `/api/v1/kb/search` | Search the KB | #### Article analytics Per-article view stats for your published help-center articles, for automating content pruning such as finding articles nobody has read. Only published articles are included, and only unique-visitor counts (never any visitor identifiers) are exposed. views and uniques (distinct visitors) are counted within the optional since/until window (all-time by default); last_viewed_at is always all-time. total is the full count matching your filters and truncated tells you whether more rows matched than the page returned. Example: ?max_views=0&since=2026-04-16&sort=views lists the articles with no views since April. All filters are optional query parameters: | Method | Path | Summary | | --- | --- | --- | | GET | `/api/v1/kb/analytics/articles` | List published-article view stats | **Query parameters:** | Field | Type | Description | | --- | --- | --- | | `since` | string | ISO date or datetime (UTC). Lower bound (inclusive) for counting views/uniques. | | `until` | string | ISO date or datetime (UTC). Upper bound (exclusive); must be after since. | | `min_views` | integer | Keep articles whose in-window view count is at least this. | | `max_views` | integer | Keep articles whose in-window view count is at most this (max_views=0 finds dead articles). | | `last_viewed_before` | string | ISO date/datetime (UTC). Keep articles last viewed before this, or never viewed. | | `sort` | views \| last_viewed_at | Sort key. Defaults to views. | | `order` | asc \| desc | Sort direction. Defaults to asc (fewest-viewed / stalest first). | | `limit` | integer | Page size, default 50. Check truncated in the response to know if you hit it. | **Example response:** ```json { "articles": [ { "id": "0f2c8b3a-2b1e-4c7a-9f10-6d5e4c3b2a10", "title": "Deactivating your account", "slug": "deactivating-your-account", "category": "Account", "views": 0, "uniques": 0, "last_viewed_at": "2026-01-03T09:12:00.000Z" } ], "total": 12, "truncated": false } ``` #### Format guide Pass dry_run: true on create or update to validate and preview warnings[] without writing. The response comes back with a null id and timestamps. See https://acornreply.com/api/v1/kb/format for the exact list of supported Markdown features and the article HTML/iframe-host allowlist. | Method | Path | Summary | | --- | --- | --- | | GET | `/api/v1/kb/format` | Get the KB content-format contract |