Playbook

Why Your AI Can't Read Conversations in a HIPAA GoHighLevel Sub-Account

Flip the HIPAA toggle on a GoHighLevel sub-account and the one API endpoint every conversational AI leans on for memory starts returning 401. Here is the test, the exact response, what still works, and the architecture that doesn't care.

A dark 3D render of three glass data pipes running from a glowing CRM icon toward an AI core; one pipe is sealed by a red valve and its data particles stop, a second pipe routes through a filter chamber where the particles change color, and a third pipe flows clear, representing the blocked message-history endpoint, the PHI Rail scrub path, and the CRM objects that still pass
The short version

On September 9, 2026 we ran the same GoHighLevel API call against two of our own sub-accounts, one with the HIPAA module on and one without. The non-HIPAA account returned the messages inside a conversation. The HIPAA account returned HTTP 401, "Can not fetch messages from HIPAA compliant account," canonical code CONVERSATIONS_HIPAA_RESTRICTED1. The same token had just read that contact's record, custom fields, notes, tasks, pipelines, and the conversation list with a last-message preview23. HighLevel's HIPAA help article and its API reference for the endpoint say nothing about it42. If your conversational AI rebuilds context by reading history through the API, this is why it started sounding like a stranger the week you turned HIPAA on. Ambrose never needed that endpoint, and this article shows the architecture that makes that true.

The 401 nobody documents

The complaint that started this was an agency owner's, and it was reasonable: "We turned on HIPAA for the Medicare sub-account and the follow-up bot got dumber." The bot's vendor hadn't changed anything. The prompts hadn't changed. The model hadn't changed. The only thing that changed was a toggle in GoHighLevel's Advanced Settings that the owner had paid $297 a month to be allowed to flip4.

We suspected the API, because that is the only door an outside tool uses, and because HighLevel's HIPAA module is described entirely in terms of what it does to stored data: AES-256 encryption with key rotation, enforced MFA, audit logging, role-based access, and a Business Associate Agreement signed in-app45. There is no line in that material about what a connected application can and cannot fetch. So we tested it, the way we test everything on this site: two accounts, one request, and the raw responses side by side.

The finding in one sentence. On a HIPAA-enabled GoHighLevel sub-account, the message history endpoint refuses every read with a purpose-built error code, while contacts, fields, notes, tasks, pipelines, and the conversation list keep working, and nothing in HighLevel's public documentation tells you this will happen.

What we tested, and what came back

Both sub-accounts sit in our own agency. One is our marketing location, HIPAA off. The other is a health insurance location with the HIPAA module enabled at the agency level and toggled on for that sub-account, exactly as HighLevel's help article describes4. We used a valid integration token for each and called the endpoint HighLevel documents as GET /conversations/:conversationId/messages2.

The non-HIPAA account returned the message array. The HIPAA account returned this, verbatim:

{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Can not fetch messages from HIPAA compliant account",
  "canonicalCode": "CONVERSATIONS_HIPAA_RESTRICTED",
  "arguments": {}
}

Three details matter. The status is 401, which normally means the credential is bad, but the credential had just succeeded on other calls in the same session. The message names HIPAA explicitly, so this is a deliberate rule, not a scope you forgot to grant. And the canonical code, CONVERSATIONS_HIPAA_RESTRICTED, appears on no HighLevel documentation page we could find, including the API reference for the endpoint that returns it2 and the HIPAA compliance article4.

Stat card titled The HIPAA sub-account math with four figures: 297 dollars per month for the HighLevel HIPAA add-on, sourced to the HighLevel help center; 0.024 dollars per minute for HighLevel call transcription, sourced to HighLevel LC Phone pricing; 401, the HTTP status when an app asks a HIPAA sub-account for message history, sourced to a Strategic AI Architects test in September 2026; and 18, the identifiers the PHI Rail aliases before a non-BAA AI sees them, sourced to 45 CFR 164.514(b)

What a HIPAA sub-account still serves

The useful half of the test is the map of what didn't break. Against the HIPAA sub-account, with the same token, we read the contact list, the contact's custom fields, its tasks, the pipelines list, and an opportunity search with notes and tasks expanded, notes included. We also called GET /conversations/search, which returned the thread list normally, and each thread carried the lastMessageBody field HighLevel documents as the text of the most recent message3.

Same token, HIPAA-enabled sub-account, September 9, 2026
Endpoint Result What it gives an AI
GET /contacts 200 Identity, tags, custom fields
GET /contacts/{id}/tasks 200 Open follow-ups and due dates
GET /opportunities/pipelines 200 Stage structure
GET /opportunities/search?getNotes=true 200, notes included Stage, value, every note on the contact
GET /conversations/search 200, with lastMessageBody Thread list and the newest message only3
GET /conversations/{id}/messages 401 CONVERSATIONS_HIPAA_RESTRICTED Nothing. This is the history12
Six reads against a HIPAA-enabled sub-account, same token, same session Contacts Contact tasks Pipelines Opportunity search + notes Conversation search Conversation messages 401 CONVERSATIONS_HIPAA_RESTRICTED Filled bar = 200 OK. Source: Strategic AI Architects test, 2026-09-09.
Five of six reads succeeded. The one that failed is the one a conversational AI uses to remember anything older than the newest message1.

Why HighLevel probably does this

HighLevel hasn't explained it, so treat this section as an inference from someone who builds against the API daily rather than a statement of HighLevel's policy. The message body endpoint is the densest PHI surface in the product. A single conversation can carry a client's diagnosis, medications, plan, and Social Security number in the client's own words, and one API loop can page through every conversation in the location. From HIPAA's point of view, a marketplace app or a private integration token is a third party. Closing that one endpoint on HIPAA accounts caps what any connected app can bulk export, while leaving the objects most integrations actually need, contacts, fields, pipelines, calendars, intact.

That is a defensible engineering choice. The problem is not the choice, it's the silence around it. An agency that buys the module on the strength of the help article has no way to know that its follow-up AI, its reporting tool, or its call-review pipeline is about to lose a data source, and the vendor of that tool has no way to know either until a customer complains.

What we did not test

We tested one integration token type on one date. We did not test whether a HighLevel marketplace app with a different scope set is treated differently, and we did not test message writes through the API on the HIPAA account. If you have results on either, we'd like to see them. Re-run the check in the section below before you build on any of this, because HighLevel can change it without notice.

What it means for any conversational AI

Almost every conversational AI tool in the GoHighLevel ecosystem builds memory the same way. A message arrives, a workflow fires, the tool calls the messages endpoint to load the thread, stuffs that history into the prompt, and generates a reply that references last week's call. Remove the endpoint and the tool has exactly two inputs left: whatever the workflow passed in the webhook, and whatever it can read from the objects that still work. If the tool wasn't designed to keep its own memory in those objects, it degrades to last-message-only replies, and it does so quietly.

This is the practical version of a point we made in why AI context is the real differentiator: memory is an architecture decision, not a model feature. A tool whose only memory is "read the CRM's history endpoint" is one platform policy away from amnesia. A tool that writes its own context into the CRM as it goes keeps working, because the objects it writes to are the objects HighLevel keeps open.

401

Status returned for message history on a HIPAA sub-account1

5 of 6

Reads that still succeeded with the same token, same session

$297

Per month for the HighLevel HIPAA module, and it cannot be turned back off4

0

HighLevel documentation pages we found that mention the restriction

The transcript problem on top of it

Calls compound this. HighLevel sells call transcription on LC Phone at $0.024 per recorded minute, on top of $0.0025 per minute for the recording itself and $0.0005 per minute per month to store it6. Its Transcript Generated workflow trigger "automatically activates a workflow as soon as HighLevel finishes transcribing a recorded call" and passes "the full transcript, duration, direction, caller location, timestamps, and more" into the workflow, across Voice AI, LC Phone, and IVR calls7. Inside the platform, that works. It's a real path for getting a transcript into a note.

The question for an outside system is different: can it pull that transcript through the API on a HIPAA account? Transcripts live under the conversations and messages surface, the same neighborhood as the endpoint that just returned 401. We're not going to assert a result we didn't reproduce this session; we are going to say that if your call-review or coaching tool reads transcripts through the API, test it on the HIPAA sub-account specifically before AEP, not after. The in-platform workflow trigger and the external API read are two different doors, and only one of them is documented as working.

Our own answer sidesteps the door entirely, and it's the same answer we gave in why sales calls never get reviewed: take the audio, not the transcript. Pull the recording into the agency's own vault, transcribe it there, and write the transcript and a structured summary back to the contact as notes, which are an object every producer already reads and the HIPAA API still returns.

The BAA boundary nobody mentions: the model

Here is the part of this that matters more than the 401, because it outlives any API change. HighLevel's HIPAA article lists the objects its BAA covers: "Contacts, Notes, Custom Fields, SMS/MMS, voice recordings, email bodies & attachments, form/survey submissions, calendars, invoices"4. The only AI feature it names is Reviews AI4. Voice AI and the AI Agent action are not mentioned, and both can now route to external model providers, billed per model8. HighLevel's security overview says its subprocessor list lives in its Data Processing Agreement rather than in public documentation9.

So the BAA covers the storage layer, including the recordings Voice AI produces. Nothing published says it covers the processing layer, the model that reads PHI to generate the next turn. That is a separate business associate question, and it is the one most agencies never ask because the toggle made them feel covered. We wrote about the same boundary from the outbound side in why a GoHighLevel BAA doesn't make your funnel HIPAA safe. This is the inbound side: the door HighLevel closed protects PHI from third parties, and the AI feature HighLevel opened may be routing PHI to a third party it hasn't named.

Get it in writing

Before you run Voice AI or the AI Agent action on a HIPAA sub-account with real client data, ask HighLevel one question in a support ticket: is this feature, including the selected model provider, a covered service under our BAA? Save the answer. It's the document a carrier's compliance team or a regulator will ask for, and the help article won't stand in for it.

How to check your own sub-account

Ten minutes, no developer. Do it on a test contact if you have one.

01

Create a Private Integration token

In the HIPAA sub-account, Settings, then Private Integrations. Grant the conversations read scopes. Treat the token like a password and delete it when you're done.

02

Confirm the token works on the search endpoint

Call GET https://services.leadconnectorhq.com/conversations/search?locationId=YOUR_LOCATION_ID with Authorization: Bearer YOUR_TOKEN and Version: 2021-04-15. You should get a thread list with a lastMessageBody on each3.

03

Call the messages endpoint on one thread

Take a conversation ID from the previous response and call GET https://services.leadconnectorhq.com/conversations/CONVERSATION_ID/messages with the same headers2. On a HIPAA sub-account, expect the 401 above. On a non-HIPAA sub-account, expect messages.

04

Record the date and the raw response

HighLevel can change this behavior without notice. When your AI vendor asks what happened, a dated response body is the whole conversation.

The DIY workaround, step by step

You can make a conversational AI work on a HIPAA sub-account without us. The pattern is simple to describe and tedious to maintain.

Deliver the newest message by webhook, don't fetch it. Build the inbound-message workflow so the webhook payload carries the message body and the contact ID. Your AI reads what the workflow hands it, not what the API refuses.

Give the AI its own memory in a large-text custom field. Create a contact-level custom field, and have the AI append a dated entry for every message it sends and every inbound it processes. Custom fields are on HighLevel's covered-data list4 and read normally on the HIPAA account in our test. Cap the field's length and roll the oldest entries into a note when it fills.

Put structured call context in notes. Use the Transcript Generated trigger to add the transcript as a note7, then add a second, short note with the fields your AI actually needs: topic, objection, quoted plan, promised next step, date. Notes came back in our opportunity search on the HIPAA account. Test that the transcript merge field populates your note the way you expect before you rely on it.

Never fill the gap by pasting. If anyone on the team "catches the AI up" by copying a client thread into a general chat tool, you've moved PHI to a vendor with no BAA. 45 CFR 164.514(b)(2) lists the 18 identifiers that have to come out before data counts as de-identified, names and dates and phone numbers among them, and 164.514(c) only allows a re-identification code that is "not derived from or related to information about the individual" and whose mechanism is never disclosed10. That is the legal shape of what a proper scrub has to do, and it is not something a producer does by hand on a Friday in November.

Reads history

A conversational AI that fetches the thread

  • Loads context from GET /conversations/{id}/messages on every reply
  • On a HIPAA sub-account, that call returns 401
  • Falls back to the newest message and a template
  • Degrades silently; nobody gets an alert

MemoryOne platform policy away from none

Writes memory

A conversational AI that keeps its own log

  • Newest message arrives by workflow webhook
  • Every touch appended to a custom field the HIPAA API still serves
  • Transcripts and summaries written to notes
  • Works the same on HIPAA and non-HIPAA sub-accounts

MemoryLives in objects HighLevel keeps open

How we build around it

Ambrose was designed on the assumption that a client's CRM will have sub-accounts at different compliance postures, and that the platform underneath will change what it serves. Four pieces do the work, and the first two are documented publicly.

Per sub-account HIPAA posture. Ambrose's GoHighLevel spoke carries a per sub-account override: "BAA sub-accounts are treated as safe; others route through PHI Gateway"11. One Ambrose tenant can work across an agency's marketing location and its HIPAA location at the same time and apply the right rules to each, rather than treating the agency as one bucket.

The PHI Rail for everything that isn't BAA-covered. The rail checks the destination against a BAA allowlist. If the destination isn't on it, the payload goes to the PHI Gateway, which will "scrub identifiers, get back a payload of typed aliases (PERSON_xxxx, EMAIL_xxxx, …) + a hydration map." The scrubbed payload goes to the model with a system guardrail that says "never invent identifiers," and on the way back the rail "calls phi_rehydrate with the response + the original hydration map" so the real identifiers are spliced back in. The detection chain is "known contacts (vault membership) → regex patterns → Presidio NER → insurance-specific dictionary," and every scrub event is logged with identifier counts, never the values12. That is 45 CFR 164.514(c) implemented as software: a code not derived from the person, with the mapping held inside the tenant and never disclosed10.

Memory that never touched the blocked endpoint. In the current build, when a GoHighLevel workflow delivers an inbound message, Ambrose reads the message from the webhook, not from the API. It maintains a per-contact custom field named AI Conversation JSON, a large-text field it creates on first use and appends to with every generated SMS or email entry and a server-side timestamp. That field, plus notes, is the agent's memory of the thread. On the HIPAA sub-account in our test, both objects read normally.

Transcripts from audio, under our own BAA. Ambrose pulls the call recording into the agency's own vault and transcribes it there with Amazon Transcribe, running under our BAA-covered AWS account. Amazon Transcribe and Amazon Bedrock both appear on AWS's HIPAA eligible services list13. The transcript and the structured summary come back to the contact as notes. Nothing in that path asks HighLevel's message surface for a transcript, so the 401 is irrelevant to it.

Architecture diagram titled How Ambrose works around the HIPAA message wall. A left box labeled GoHighLevel HIPAA sub-account connects to a right box labeled Ambrose (agency tenant) with four arrows: Inbound message via workflow webhook, in green; GET messages: 401 blocked, in red, ending at a padlock; Call recording endpoint, in green; and Contacts, fields, tasks, pipelines, in green. Inside the Ambrose box are three labels: AI Conversation JSON field, Vault plus AWS Transcribe (BAA), and Notes written back. Caption: Per sub-account HIPAA posture. Non-HIPAA sub-accounts route through the PHI Rail.

Two honest boundaries. The AI Conversation JSON field and the vault transcription path are how the build works today, confirmed in the product while writing this; the posture override and the PHI Rail are the parts in the public docs linked above. And HighLevel's BAA is HighLevel's: our posture treats a HIPAA-on sub-account as BAA-covered for the GoHighLevel data itself, and handles the model layer ourselves, which is the layer HighLevel's HIPAA article never addresses.

Running more than one office on GoHighLevel? An FMO or IMO with HIPAA toggled on across a downline has this exact gap in every location at once, and usually a different AI vendor in each. Scoping a build where the memory, the transcripts, and the model posture are handled the same way everywhere is a call, not a package. Book a call.

What you actually get

Concretely: a conversational AI on your HIPAA sub-account that references last week's call because it wrote that call down itself, in objects HighLevel keeps open. Call transcripts and summaries in notes without paying per minute for a transcript your outside tools may not be able to read anyway. A single place where the answer to "which system can see which client data" is written down, per sub-account, instead of living in whoever set up the integration last spring. And a model layer whose BAA status is your decision, not a line item you're hoping HighLevel's help article covers.

None of that is a promise about a legal outcome or an audit result. It's an architecture decision about where an AI's memory lives and which vendor's agreement covers it, made before the platform under you changes the rules again.

When this doesn't matter

If the sub-account doesn't have the HIPAA module on, none of the API behavior in this article applies, and a history-reading AI works as advertised. If your HIPAA sub-account's AI only ever needed the newest message, an appointment-reminder responder for example, you've lost nothing. And if your team writes disciplined post-call notes and keeps a context field current by hand, the DIY workaround above is a defensible position for a single office with a small, careful team. The math starts to matter when volume, turnover, or a downline makes "someone keeps the notes current" a plan that fails the first busy week of AEP.

Questions agencies ask

Does GoHighLevel block API access to conversations on HIPAA sub-accounts?

It blocks the message history endpoint. On a HIPAA-enabled sub-account, GET /conversations/{conversationId}/messages returns HTTP 401 with the message "Can not fetch messages from HIPAA compliant account" and the canonical code CONVERSATIONS_HIPAA_RESTRICTED. We reproduced it on our own HIPAA-enabled sub-account on September 9, 2026, with a token that had just read the same contact's record, fields, and conversation list. The identical request succeeded on a non-HIPAA sub-account. HighLevel's HIPAA help article and its API reference for the endpoint do not mention the restriction.

What GoHighLevel objects can an integration still read on a HIPAA sub-account?

In our test: contacts, custom fields, notes, tasks, pipelines and opportunities (including notes attached to an opportunity search), and the conversation list via /conversations/search, which returns a lastMessageBody preview per thread. The refusal is specific to the full message list inside a conversation. Treat this as observed behavior on one date, not a documented contract, and re-test on your own account before you build on it.

Is the restriction documented anywhere by HighLevel?

Not that we could find. HighLevel's HIPAA Compliance help article lists the covered data objects and the activation steps and says nothing about API behavior. The API reference for Get Messages by Conversation ID lists no HIPAA condition or error code. A web search for the canonical code returned no HighLevel page. If HighLevel publishes documentation for it later, we'll update this article with the link.

Why would HighLevel block reads on the data a customer already pays to have encrypted?

HighLevel hasn't said, so this is inference. The most likely reason is that the message body endpoint is the single highest-density PHI surface in the product, and a marketplace app or private integration token is a third party from HIPAA's point of view. Refusing that one endpoint on HIPAA accounts limits what a connected app can bulk-export, without breaking the CRM objects most integrations need. Whatever the reason, the effect on a conversational AI that rebuilds context from history is the same.

Can a conversational AI still work on a HIPAA sub-account?

Yes, if it doesn't depend on the history endpoint. It needs the newest inbound message delivered by a workflow webhook rather than fetched, and it needs its own memory stored in objects the HIPAA API still serves, such as a large-text custom field and notes. That is how Ambrose is built: a GoHighLevel workflow delivers the message, and the agent appends every generated touch to a per-contact AI Conversation JSON custom field it creates on first use. Any tool that only reads history through the API will degrade to last-message-only replies.

What about call transcripts on a HIPAA sub-account?

HighLevel's Transcript Generated workflow trigger passes the full transcript into a workflow the moment a transcript is ready, and transcription is billed at $0.024 per recorded minute on LC Phone. Whether an outside app can pull transcripts through the API on a HIPAA account is a separate path from an in-platform workflow, so test the one you intend to use. Our approach is to pull the audio into the agency's own vault and transcribe it with Amazon Transcribe under our BAA-covered AWS account, then write the transcript and summary back to the contact as notes.

Does the GoHighLevel BAA cover the AI model behind Voice AI or the AI Agent action?

HighLevel's HIPAA article names Reviews AI as following HIPAA-compliant handling and names no other AI feature. Voice AI and the AI Agent action can route to external model providers billed per model, and HighLevel's security overview says its subprocessor list lives in its Data Processing Agreement, not in public docs. We treat the model layer as a separate BAA question from the CRM data layer. Get HighLevel's answer in writing before you assume an AI feature is inside your BAA.

How is this different from the tracking pixel problem you wrote about before?

Same boundary, opposite direction. The pixel article was about PHI leaking out of a GoHighLevel funnel page to vendors outside the BAA. This one is about HighLevel closing an inbound door on HIPAA accounts, which protects PHI and, as a side effect, starves any AI that relied on that door for memory. Both come down to knowing exactly which systems can see which objects, which is what the free Audit and an Enterprise build are for.

Sources

  1. Strategic AI Architects. Live API test: GET /conversations/{conversationId}/messages against a HIPAA-enabled GoHighLevel sub-account and a non-HIPAA sub-account in the same agency, response body reproduced verbatim above, run 2026-09-09. The agent-facing write-up of the same test is on our community site: techsavvyinsurance.com.
  2. HighLevel, Inc. API Reference, "Get Messages by Conversation ID," GET /conversations/:conversationId/messages, no HIPAA condition or error code listed, verified live 2026-09-09. marketplace.gohighlevel.com.
  3. HighLevel, Inc. API Reference, "Search Conversations," GET /conversations/search, lastMessageBody response field, verified live 2026-09-09. marketplace.gohighlevel.com.
  4. HighLevel, Inc. "HIPAA Compliance in HighLevel," support article: covered data objects, $297/month pricing, per-sub-account activation, Reviews AI as the only AI feature named, verified live 2026-09-09. help.gohighlevel.com.
  5. HighLevel, Inc. "HIPAA Compliance" module page: AES-256 encryption, role-based permissions and activity logs, in-app BAA, verified live 2026-09-09. gohighlevel.com.
  6. HighLevel, Inc. "LC Phone Pricing & Billing Guide," call recording $0.0025/min, call transcription $0.024/min, recording storage $0.0005/min/month, verified live 2026-09-09. help.gohighlevel.com.
  7. HighLevel, Inc. "Workflow Trigger: Transcript Generated," support article, verified live 2026-09-09. help.gohighlevel.com.
  8. HighLevel, Inc. "Anthropic & Google models now available in AI agent action," changelog, external model usage billed per selected model, verified live 2026-09-09. ideas.gohighlevel.com.
  9. HighLevel, Inc. "HighLevel Security and Compliance Overview," subprocessor list maintained within the Data Processing Agreement, verified live 2026-09-09. help.gohighlevel.com.
  10. 45 CFR 164.514, "Other requirements relating to uses and disclosures of protected health information," paragraphs (b)(2)(i) and (c), Cornell Legal Information Institute, verified live 2026-09-09. law.cornell.edu.
  11. Ambrose documentation, "spoke-ghl," per sub-account HIPAA override, verified live 2026-09-09. app.hiambrose.com.
  12. Ambrose documentation, "Architecture: PHI Rail," BAA allowlist check, alias and hydration map, guardrail, detection chain, audit log, verified live 2026-09-09. app.hiambrose.com.
  13. Amazon Web Services. "HIPAA Eligible Services Reference," Amazon Bedrock and Amazon Transcribe listed, verified live 2026-09-09. aws.amazon.com.

Talk it through

Want a second pair of eyes on it?

Free 30 minutes. Bring what you found, or bring nothing and we will look together at how AI engines read your site and which fixes move first.

Find out which systems can see your client data

Run the free Audit, a live AEO Audit plus a HIPAA tracking scan of your site, in under a minute. Then let's talk about the CRM side.

Related reading: your GoHighLevel BAA doesn't make your funnel HIPAA safe · why AI context is the real differentiator for insurance agencies · the ChatGPT HIPAA violation most agencies are one paste away from · the agent's guide to the same problem on Tech Savvy Insurance

← All guides