BINADocs
justbina.com
Esc
  • Try “quote gate”, “bulletin”, or “CLEARY_LLM_MODEL”.
TutorialsTutorial · Learning-oriented

Read your first bulletin

Follow one month of publications from the level table, through the bulletin, to a single case report and the recital behind it.

In this tutorial you will read the July 2026 sample bulletin the way the legal team does: check the rules first, then the month, then one case, then the source text. It takes about fifteen minutes.

You will need: the API running locally in sample mode. If it is not, complete the Quickstart first.

#Step 1 — Look at the rules before the results

A bulletin is only as trustworthy as the table that sorts it, so start there:

bash
curl -s http://127.0.0.1:8787/v1/radar/levels | python3 -m json.tool | head -20

Notice three fields at the top:

  • version — bina-levels-2026.11-v2.
  • hash — a SHA-256 of the whole table. If the table changes, the hash changes, and every bulletin built from it carries the new hash.
  • reviewedBy — the legal team members who fixed the table.

Then read rule. It says the level depends only on the document type. That is why the fine amount, the company name or the sector never move a case up or down.

#Step 2 — Fetch the month

bash
curl -s "http://127.0.0.1:8787/v1/radar/bulletin?from=2026-07-01&to=2026-07-31" > bulletin.json
python3 -m json.tool bulletin.json | head -25

Look at header:

bulletin.json (excerpt)
{
  "header": {
    "documentsReviewed": 150,
    "casesRetained": 15,
    "importantCases": 7,
    "otherCases": 8,
    "casesToWatch": 2,
    "reportsAttached": 7,
    "unclassified": 0
  }
}

150 documents were published in the sample month; 7 of them are important enough for a report. Each count maps to a part of the bulletin:

Header fieldBulletin section
importantCasesimportant — level 1 and 2 cards
otherCasesother — level 3 table rows
unclassifiedneedsReview — types the table does not know

Finally, check meta.sample. It is true, which tells you the inventory is the sample.

#Step 3 — Pick a case

List the important cards' case numbers and titles:

bash
python3 -c "import json;b=json.load(open('bulletin.json'));[print(', '.join(c['caseNumbers']),'·',c['title']) for c in b['important']]"
output
DMA.100075 · Google Play · Restrictions on steering users
DMA.100193 · Google Search · Self-preferencing
AT.40998 · Sanofi Efluelda · Proposed commitments
26-MC-01, 26-MC-02 · Meta · Neighbouring rights (APIG request for interim measures)
AT.40823 · SAP · ERP maintenance
DMA.100209, DMA.100220 · Google · Search data sharing (specification)
AT.40861 · Construction chemicals

A card can group several case numbers when they concern the same matter, so caseNumbers is a list. Pick the first one, DMA.100075. It is a DMA non-compliance decision, which the level table places at level 1.

#Step 4 — Open the case report

bash
curl -s http://127.0.0.1:8787/v1/radar/cases/DMA.100075/report > report.json
python3 -c "import json;r=json.load(open('report.json'));print(r['level'],r['levelLabel']);print(r['figures'].keys())"
output
1 Infringement finding with a sanction
dict_keys(['fine', 'since', 'until', 'appeal'])

You now have the full case report. The parts you will use most:

  • figures — the fine, since when, until when, and the appeal status. Anything computed carries estimate: true.
  • summary — three lines: the rule, what the company did, what it must do now. Each line names the notes and recitals it rests on.
  • dma — because this is a DMA decision, BINA ranks likely victims with its DMA method instead of reading parties out of the decision. See DMA and cartel methods.

#Step 5 — Go to the source

Every claim in the report points to a numbered recital. Read one directly:

bash
curl -s http://127.0.0.1:8787/v1/radar/cases/DMA.100075/recitals/67 | python3 -m json.tool
output
{
  "caseNumber": "DMA.100075",
  "documentId": "rdoc_dma100075_20260723",
  "textUrl": "https://competition-cases.ec.europa.eu/cases/DMA.100075",
  "textSha256": null,
  "number": 67,
  "text": "The fees Google charged on sales made outside the store go beyond what Article 5(4) allows.",
  "sample": true
}

In the sample, textSha256 is null because no original was fetched. In live mode it is the SHA-256 of the stored decision text, so the recital can be traced to the exact bytes it was parsed from.

#What you learned

  • The level table is fixed, versioned and hashed before any case is run.
  • A bulletin is the table applied to one period; its header counts mirror its sections.
  • A case report is a set of claims, each traceable to a recital you can fetch.

Next, try writing to the record yourself in Propose a party and pass the quote gate.

BINA · private enforcement radar. Nothing in these docs is legal advice; BINA does not make legal decisions.