Every daily MyIntelBrief email ships with a .jsonl attachment.
It's the same brief in machine-readable form — one JSON object per change. Built for piping into your own AI tools.
Line 1 is a header object with the date, business name, change counts, and your concerns. Each subsequent line is one competitor signal:
{"schema_version":1,"kind":"mib_daily_brief","business":"Riverside Dental","brand":"MyIntelBrief","change_count":3,"priority_counts":{"high":1,"medium":1,"low":1},"intro":"3 competitor changes detected for Riverside Dental today.","concerns":["Pricing","Hiring"]}
{"kind":"change","priority":"high","change_type":"price_change","competitor_name":"Acme Dental","title":"Acme dropped Invisalign pricing 30%","summary":"...","action":"Review your own Invisalign pricing","source_url":"https://acme.com/pricing","category":"pricing"}
{"kind":"change","priority":"medium","change_type":"website_change",...}
{"kind":"change","priority":"low","change_type":"news",...}
Empty fields are dropped. Records are sorted high → medium → low.
That's the 99% case. It works in any AI tool that accepts file uploads.
If you're already running a custom AI workflow (a no-code automation platform, an LLM API + a small script, etc.), the JSONL is trivial to parse:
import json
with open('brief-2026-05-16-riverside-dental.jsonl') as f:
header = json.loads(f.readline())
changes = [json.loads(line) for line in f]
high_priority = [c for c in changes if c['priority'] == 'high']
for c in high_priority:
print(c['competitor_name'], '→', c.get('action', '(no action)'))
From there, fork into Slack, your CRM, a Notion page, whatever. The schema is versioned (schema_version: 1) so we can extend it without breaking your downstream code.
You may be thinking: "Why save the attachment when I can just point an AI agent at my inbox and have it read every brief automatically?"
You can do that. We won't recommend it.
Here's the trade-off, plainly:
We engineered the JSONL attachment specifically so you don't need to grant inbox access to anything. Save the file, hand it to your AI, get your summary, delete. The model never sees anything beyond what we wrote.
If you do choose to wire up an inbox agent anyway — that's your call. We're not telling you not to. We're telling you it's a risk you have to weigh, not a default.
The fields in each change record:
| Field | Type | Meaning |
|---|---|---|
priority | string | "high" / "medium" / "low" |
change_type | string | e.g. "price_change", "website_change", "news" |
competitor_name | string | Name of the competitor this is about |
title | string | One-line headline |
summary | string | What the change was, in 1–3 sentences |
action | string | Recommended action for your business (may be absent) |
source_url | string | Where we saw the signal (may be absent) |
source_name | string | e.g. "Yelp", "LinkedIn", "Wayback Machine" |
outlet_count | number | How many news outlets reported the same story |
category | string | e.g. "pricing", "marketing", "hiring" |
Empty fields are dropped from each record. Schema bumps if and when we add or remove fields — check header.schema_version before consuming.
This is a quiet feature. It's not on the pricing page. It's not on the marketing site. We didn't tier-gate it — every paid customer gets it on every brief.
The reason: it's plumbing, not a product line. We don't know yet how many of you will pipe it into your own workflows. If lots of people do, we'll harden it (versioned API, retention guarantees, OpenAPI spec, all that). Until then it's a power-user surface that sits there waiting for the people who want it.
Email support@myintelbrief.com.