Law firm intake by text: after-hours iMessage for new clients
ZeroSettle lets a personal injury, immigration or criminal defense firm put “Text us” on billboards and search ads, so prospective clients reach the firm on iMessage at any hour. ZeroSettle's hosted AI agent (Beta) then asks first-pass intake questions and sends your consult booking link, or intake staff answer from the console. Because the prospect texts first, ZeroSettle's new-contact limit never applies, however busy the night; Pro is $49 a month for one number. Keep identity documents and medical records to a secure upload link, because ZeroSettle's terms say message content may not be encrypted.
Key takeaways
- What it is: an iMessage number on your ads that prospects text, answered by ZeroSettle's hosted AI agent (Beta) or by your intake staff and your case-management integration.
- Who it fits: personal injury, workers' comp, immigration and criminal defense firms whose ads bring texts outside office hours.
- Main limit: no new-contact limit on threads the prospect starts. Texting a lead who never texted you counts toward 5 new contacts a day on Pro and needs their consent.
- Price: Pro is $49/month with 1,000 AI credits (one per text the agent sends). Growth is from $599/mo with 5,000.
- What it does not do: encrypted or privileged messaging, video or files by text, phone calls, or SMS for Android prospects.
Who uses iMessage for law firm intake?
iMessage intake suits personal injury, workers' comp, immigration and criminal defense firms whose TV, billboard and search ads bring contacts after hours. A prospect who reaches voicemail at 10 PM may call the next firm on the billboard; a text gets an answer, a consult link and things awkward to collect by phone, like a photo of the car.
ZeroSettle is an iMessage API: a real phone number on real iMessage, running on Apple hardware we operate for you, that your code texts customers from and hears back on through a bearer token and signed webhooks.
- Injury and workers' comp: photos of the vehicle or work site arrive in the thread, one per text.
- Immigration: first questions cover what happened and when; passports and visas go through an upload link.
- Criminal defense: a relative texts after a night arrest; intake takes the name, where the person is held and the next court date.
More jobs, including an after-hours AI receptionist, are on the use cases hub.
How iMessage law firm intake works, step by step
Each thread starts with a text from your ad, and either ZeroSettle's hosted AI agent or your intake staff answer, one or the other per line group.
- Put “Text us” and the number on billboards and an
sms:link on your landing pages, with your calling number beside it for Android; see getting customers to text first. - The prospect texts first, so the thread never counts as a new contact, and the consult link sent back is tappable.
- No code: the hosted AI agent (Beta) shows the typing bubble, answers from your business context and sends your consult booking link.
- With a developer: each text reaches your webhook as a signed
message.receivedevent in about 1–2 seconds and is filed to the matter; staff answer from the ZeroSettle console. - Either way, IDs, medical records, police reports and video go to your secure upload link, not the thread.
Example conversation: an after-hours injury intake
Rivera Injury Law, a fictional firm, uses the hosted agent with the business context in the setup section.
- Fri 9:48 PM
- Prospect: got rear ended tonight on the 101, other driver drove off
- Firm: I'm sorry, that sounds frightening. Are you hurt, and have you been seen by a doctor?
- Firm: I'm Rivera Injury Law's automated intake assistant. An attorney reviews every case; texting us doesn't make us your lawyer.
- Prospect: neck pain, going to urgent care now
- Firm: Please get checked first. When you can, note the police report number.
- Firm: Attorney Rivera offers a free consult. Want one? Pick a time here: riveralaw.example.com/consult
- Prospect: yes booked mon 10am
- Firm: Thank you. Please bring the report number and any photos of your car to the consult.
Setup: the hosted agent, or a webhook into case management
ZeroSettle intake runs one of two ways per line group. A group Managed by AI Agent refuses your own sends, the console composer included, with 403 managed_by_zerosettle, and doesn't POST inbound texts to your webhook; pull its threads into case management with GET /api/imessage/messages.
No code: the hosted AI agent (Beta)
ZeroSettle's docs say the hosted agent never invents facts your business context (up to 40,000 characters) doesn't give, so the context must carry the disclosure, the questions, the limits and the upload link.
You are Rivera Injury Law's automated intake assistant. Say so in your
first reply to anyone new, and that an attorney reviews every case and
texting us does not make us their lawyer.
If they are hurt, tell them to get medical help first.
Ask one or two at a time: date and place, injuries, treatment,
police, and whether they have spoken to an insurer or a lawyer.
Never give legal advice, predict an outcome, value a case or discuss
deadlines: the attorney covers that at the free consult.
Photos: one per text. IDs, medical records and video go to
https://riveralaw.example.com/upload, never this thread.
Switch the group in the console's Messaging tab, or with one call:
BASE=https://portal.zerosettle.io
curl -s -X PUT "$BASE/api/imessage/agent" -H "Authorization: Bearer $ZEROSETTLE_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile ctx intake-context.txt '{managed_by: "zerosettle",
business_context: $ctx, personality: "professional", goal: "demo_booked",
link: "https://riveralaw.example.com/consult",
timezone: "America/Los_Angeles", triggers: [{id: "followup", repeat: "once", after_days: 1,
at: "morning", instruction: "If they have not replied, send one short, gentle reminder about the free consult."}]}')"
Keep response_time at instant, the default; the other settings wait 5 minutes to about a day. The default trigger is one follow-up the next morning (9 to 11 AM) if they haven't replied, in America/New_York unless you set the firm's time zone; the call above sends the whole triggers list with its own instruction. See how ZeroSettle's hosted AI agent works and the AI agent docs.
With a developer: a webhook into case management
Under Managed by API, this receiver checks the signature with the docs' verifier, answers 2xx at once, and files both sides to the matter: message.received from the prospect, message.sent for staff replies.
# intake.py: run with uvicorn intake:app --port 8100
import hashlib, hmac, json, os, time
import requests
from fastapi import BackgroundTasks, FastAPI, Request, Response
BASE = "https://portal.zerosettle.io"
AUTH = {"Authorization": f"Bearer {os.environ['ZEROSETTLE_TOKEN']}"}
SECRET = os.environ["ZEROSETTLE_WEBHOOK_SECRET"]
app = FastAPI()
seen: set[tuple[int, str]] = set() # use your database in production
def verify(header: str, raw: bytes) -> bool:
try:
parts = dict(p.split("=", 1) for p in header.split(","))
t, v1 = int(parts["t"]), parts["v1"]
except Exception:
return False
if abs(time.time() - t) > 300:
return False
expected = hmac.new(SECRET.encode(), f"{t}.".encode() + raw, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, v1)
def file_to_matter(msg: dict) -> None:
matter = intake_matter_for(msg["handle"]) # your case-management system
matter.add_note(msg["direction"], msg["ts_ms"], msg.get("text") or "")
if msg["direction"] != "in":
return
for kind in ("image", "audio"):
if media := msg.get(kind):
r = requests.get(BASE + media["url"], headers=AUTH, timeout=30)
r.raise_for_status()
matter.attach(f"imessage-{msg['id']}", r.content, media["content_type"])
if not (msg.get("text") or msg.get("image") or msg.get("audio")):
matter.flag("Video or file arrived without the file: send the upload link")
@app.post("/webhook")
async def webhook(request: Request, tasks: BackgroundTasks):
raw = await request.body()
if not verify(request.headers.get("X-ZeroSettle-Signature", ""), raw):
return Response(status_code=401)
ev = json.loads(raw)
msg = ev.get("message")
if msg is None or ev["event"] not in ("message.received", "message.sent"):
return Response(status_code=200)
if (msg["id"], ev["event"]) in seen:
return Response(status_code=200) # retries carry the same id and event
seen.add((msg["id"], ev["event"]))
tasks.add_task(file_to_matter, msg)
return Response(status_code=200)
Inbound HEIC photos arrive as JPEG, voice messages as .m4a, and only the first of several photos in one message, so ask for one per text and collect originals for evidence through your upload link. Register the receiver with PUT /api/imessage/webhook and store the one-time secret; see the webhook docs and how ZeroSettle signs webhooks. Insurance agencies file claim photos the same way.
Limits and consent for law firm intake
Intake threads that prospects start never count as new contacts, so on a busy night only AI credits limit the hosted agent; the new-contact cap and consent rules apply once the firm texts first.
| Limit | Pro | Growth |
|---|---|---|
| First text to a lead who never texted you, per number | 5 a day | 50 a day, 3 per rolling 15 min |
| Unanswered messages to one lead | 2, then 403 awaiting_reply | 2, then 403 awaiting_reply |
| Texts the hosted agent sends, per account | 1,000 AI credits a month | 5,000 AI credits a month |
The new-contact day runs 3 AM to 3 AM Eastern and counts console sends too.
Limit math for one night. Suppose 30 people text overnight after a late TV spot: none counts as a new contact. At five credits a thread, as in the Rivera example, that is 150 of Pro's 1,000 monthly credits, which cover about 200 such threads; a $50 pack covers about 200 more. If the firm then texts 25 web-form leads who asked for a text but never sent one, Pro allows 5 that day and the other 20 wait for later days' 3 AM Eastern resets; a firm with that volume books a demo for Growth, at 50 a day per number.
Solicitation rules. Replies are the simple case: North Carolina's Rule 7.3 comment [1] says a communication is not a solicitation if it is directed to the general public, such as through a billboard, or responds to a request for information. Texting first varies by state: North Carolina's comment [2] excludes text messages from live person-to-person contact, and Pennsylvania's Rule 7.3 comment (2) includes them. Rules differ by state and change, so check your state bar's rules, and text first only leads who asked to be texted, with a record of it. This isn't legal advice.
In every thread, disclose the automated assistant (ZeroSettle's terms require it unless contextually evident), give no legal advice, and send nothing promotional before 8 AM or after 9 PM in the prospect's time zone.
“He ran the stop sign” opts the prospect out
ZeroSettle treats any text with the word STOP in it, or a clear request like “leave me alone”, as an opt-out, so “the other car didn't stop” blocks every number on your account, the hosted agent included, from texting that prospect. Their later texts still arrive, but nothing reaches them until they text START, or ask your staff and you have ZeroSettle clear it. Check the console or GET /api/imessage/opt-outs each morning; see how STOP works.
When ZeroSettle is not a fit for law firm intake
ZeroSettle is a first-contact channel, not a confidential client channel. Choose something else for:
- Privileged communication or case strategy. ZeroSettle's terms say content may not be encrypted and ZeroSettle cannot guarantee communication privacy.
- Texting accident victims who never contacted you. ZeroSettle's terms require opt-in consent, ZeroSettle suspends lines used for unsolicited messaging, and Pennsylvania counts a text as live person-to-person contact.
- Medical records, IDs or video by text. Video and files arrive without the file, content may not be encrypted, and ZeroSettle's terms bar protected health information without a signed Business Associate Agreement.
- Prospects who mostly use Android. Apple describes iMessage as messaging between Apple users, with SMS or RCS for everyone else, and ZeroSettle has no SMS fallback.
- One “call or text” number on the billboard. A ZeroSettle number exists only for iMessage, so the ad needs your calling number too.
How much does iMessage law firm intake cost?
Law firm intake on ZeroSettle costs the plan price, plus AI credit packs if the hosted agent outruns a month's credits. Staff and webhook replies use none.
| Plan | Price | Numbers | AI credits a month |
|---|---|---|---|
| Pro | $49/month, no setup fee | One to start | 1,000 |
| Growth | From $599/mo | 3+, working as one | 5,000 |
Packs add 1,000 credits for $50 or 5,000 for $200 and never expire. Pro is self-serve, includes unlimited messages with people who message you first (only first messages you send to new contacts are capped, at 5 a day), and has a 30-day money-back guarantee on the subscription. On Growth, numbers can sit in separate line groups, so injury and immigration intake each get their own name, photo and agent setting; Growth starts with Book a demo. See ZeroSettle pricing, the plans and the API docs, or get a number.
Frequently asked questions
Does texting the firm create an attorney-client relationship?
It can make the texter a prospective client, whether or not the firm takes the case. Under North Carolina's Rule 1.18, the firm then may not use or reveal what they shared, except as Rule 1.9 permits, and an ad inviting information without clear warnings likely creates that consultation (comment [2]). Put your state's warning in the business context and the first reply, and ask only what deciding on the case needs (comment [4]). Your state's rule may differ; this isn't legal advice.
What does the AI agent say to “do I have a case?”
What your business context says: forbid legal advice and point to the consult. When the agent won't answer something it sends “Sorry, I can't help with that one”, using one AI credit.
Can intake staff take over a thread from the AI agent?
Not while the agent manages the line group. Switch the group to Managed by API in the console's Messaging tab, or send managed_by: "api" to PUT /api/imessage/agent. A scheduled call can hand the group to the agent at closing and back to staff each morning.
Sources
- ZeroSettle iMessage API docs: “AI agent”, “Attachments”, “Webhooks, step by step” and “Errors, limits, and compliance”. Checked October 12, 2026.
- ZeroSettle iMessage API Terms, section 4 (AI disclosure) and section 13 (consent, protected health information, engagement privacy). Last modified September 28, 2026.
- Rule 7.3, Direct Contact With Potential Clients, comments [1] and [2], North Carolina State Bar. Checked October 8, 2026.
- 204 Pa. Code Rule 7.3, Solicitation of Clients, comment (2), The Pennsylvania Code. Checked October 8, 2026.
- Rule 1.18, Duties to Prospective Client, paragraphs (a) and (b) and comments [2] and [4], North Carolina State Bar. Checked October 8, 2026.
- What is the difference between iMessage, RCS, and SMS/MMS?, Apple Support. Checked October 8, 2026.