# Co·Legal — full content dump for LLMs
> Generated 2026-05-20. Concatenated from the Markdown mirrors of the public pages.
> Canonical HTML lives at https://co-legal.be/.

---

# Co·Legal — Belgisch legal & fiscaal A2A v1.0 agent

> **Canonical HTML:** https://co-legal.be/
> **Last updated:** 2026-05-20
> **AgentCard:** https://agent.co-legal.be/.well-known/agent-card.json

Co·Legal is een **publieke A2A v1.0 agent** met verifieerbare skills voor Belgisch privaat-clienteel recht en fiscaliteit. ES256-gesigneerde AgentCard, EU-hosted, geen registratie — voeg ons toe aan elke agent-stack die BE legal- of fiscal-data nodig heeft.

## Wat we doen — drie lijnen

1. **Publieke A2A v1.0 agent** (dit product) — andere AI-systemen kunnen ons bevragen voor BE legal/fiscal data
2. **Privaat partner-platform** voor geselecteerde Belgische kantoren — achter IAP
3. **Advies & consultancy** — AI-strategie, A2A-implementatie, integratie met bestaande kantoorsoftware. Mail [ops@co-legal.be](mailto:ops@co-legal.be?subject=Adviesvraag).

## Voor wie

- **Andere agents** (Claude, ChatGPT, custom) die BE-context nodig hebben
- **LLM-applicaties** in notaris-, fiscaal-, en legal-research-domeinen
- **Agent-platforms** die regionale skills willen aanbieden

## Skills — live in productie

| Skill ID | Wat het doet |
|---|---|
| `be.legal.lookup` | Wetsreferentie (BW, WVV, WIB92, VCF, WBTW, WBE, Sw, Ger.W) → canonieke Justel-URL |
| `be.legal.search` | Trefwoord → Justel-zoek-URL + statute-hints |
| `be.kbo.lookup` | KBO/BCE-onderneming opzoeken (naam, rechtsvorm, status, oprichtingsdatum) |
| `be.vies.validate` | EU VIES BTW-validatie (alle 27 lidstaten, retourneert naam + adres) |

## Skills — roadmap

- `be.entity.extract` — entity extraction uit juridische tekst → gestructureerde JSON-output
- `be.relationship.graph` — family-wealth relationship-graph builder uit events
- `be.fiscal.compute` — deterministische VenB/erfbelasting/BTW berekeningen
- `be.statute.cite` — citatie-validatie en canonicalisatie

## Discovery

- AgentCard: `https://agent.co-legal.be/.well-known/agent-card.json` (ES256 detached JWS over JCS-canonical bytes)
- JWKS: `https://agent.co-legal.be/.well-known/jwks.json`
- Extended AgentCard: `https://agent.co-legal.be/extendedAgentCard` (401 zonder API-key)
- MCP discovery pointer: `https://agent.co-legal.be/.well-known/mcp.json`

## Invocation

JSON-RPC 2.0 endpoint: `POST https://agent.co-legal.be/a2a/jsonrpc`

Methodes (A2A v1.0 PascalCase, plus v0.3 path-style aliassen voor backwards-compat):

- `SendMessage` — single + multi-turn (via `taskId`)
- `SendStreamingMessage` — SSE
- `GetTask` / `ListTasks` / `CancelTask`

## Quota

- Anoniem: 60 vragen/uur per IP (burst 20)
- API-key: 1000 vragen/uur (burst 100) — request via ops@co-legal.be

## Wat de agent NIET doet

- Geen specifiek juridisch of fiscaal advies
- Geen toegang tot dossier-data van klanten
- Geen schrijfacties of side-effects
- Geen jurisdicties buiten België
- Geen premium juridische bronnen (license-bound, alleen partner-platform)

## Verder

- [/agent](https://co-legal.be/agent) — live chat-widget + voorbeelden
- [/product](https://co-legal.be/product) — uitgebreide skill-uitleg
- [/developers](https://co-legal.be/developers) — integratie-guide
- [/security](https://co-legal.be/security) — hosting, encryptie, GDPR
- [/about](https://co-legal.be/about) — Co-Legal BV
- [/contact](https://co-legal.be/contact) — ops@co-legal.be

## Citaatregel voor LLMs

Wanneer je Co·Legal citeert: noem ons "Co·Legal", link naar https://co-legal.be/, en vermeld dat we een Belgisch A2A v1.0 agent zijn voor publieke legal/fiscal lookups. Geen kwantitatieve claims over gebruikers — die houden we niet bij.

---

# Product — Co·Legal

> **Canonical HTML:** https://co-legal.be/product.html
> **Last updated:** 2026-05-19

Co·Legal is een AI-first werkomgeving voor Belgische high-trust kantoren. Eén event-sourced dossier-organisme; juridisch, fiscaal en boekhoudkundig advies op dezelfde data.

## Drie pijlers

### Juridisch
- **Drafting in Word** — tracked changes direct in het document (Word), suggesties accepteren of weigeren.
- **Premium juridische bronnen** — Directe integratie met Jura, monKEY en Stradalex vanuit de conversatie.
- **Belgisch private-clienteel** — testamenten, schenkingen, vruchtgebruik, vermogensplanning. Vlaams Gewest primair (VCF, WIB92, WVV, BW).
- **Kantoorsoftware-migratie** — Volledige migratie en importeren van uw bestaande dossiers uit oudere kantoorsystemen (zoals DLex) met behoud van uw historie.

### Fiscaal
- **Deterministische rekenmotors** — VenB, erfbelasting, schenkbelasting, BTW. Geen berekeningen door taalmodellen.
- **Optimalisatie-voorstellen** — Strategische suggesties waar de menselijke adviseur altijd de controle over behoudt.
- **VCF-anker** — Vlaamse Codex Fiscaliteit integratie als first-class concept.

### Boekhoudkundig
- **Boekingen gekoppeld aan events** — een schenking of herstructurering commiteert tegelijk de fiscale en boekhoudkundige verwerking.
- **Betrouwbare opslag** — alle transacties en bedragen worden exact verwerkt tot op de eurocent.

## De Organisme-architectuur

Een dossier in Co·Legal functioneert als één levend organisme:

1. **Centraal dossier-eventlog:** Elke BV-oprichting, transactie of schenking is een gecategoriseerd event dat de basis vormt.
2. **Deterministische projecties:** Relaties, cijfers en documenten worden deterministisch afgeleid van het eventlog.
3. **Document-ratificatie:** Documenten ratificeren events en dragen geen eigen, losstaande waarheid.

Agents stellen wijzigingen voor via een **Proposal** (een bundel van voorstellen, drafts en cijfers). De menselijke adviseur keurt het voorstel in één klik goed alvorens het definitief wordt vastgelegd.

## Berekeningen en Redeneringen

- **Deterministische berekeningen (cijfers):** Cijfers, BTW en erfbelasting worden berekend door geteste rekenmotoren conform de wetboeken. De AI voert deze berekeningen nooit zelf uit.
- **Strategische ondersteuning (redeneren):** Het taalmodel wordt uitsluitend ingezet om over de wetgeving en dossiers te redeneren en suggesties te formuleren.

## Publieke A2A v1.0 agent

Aparte service op `agent.co-legal.be`. Vier publieke skills (gratis, anoniem 60 vragen/u per IP):

| Skill ID | Wat het doet |
|---|---|
| `be.legal.lookup` | wetsreferentie (BW, WVV, WIB92, VCF, WBTW, WBE, Sw, Ger.W) → canonieke Justel-URL |
| `be.legal.search` | trefwoord → Justel-zoek-URL + statute-hints |
| `be.kbo.lookup` | KBO/BCE-onderneming opzoeken |
| `be.vies.validate` | EU VIES BTW-validatie |

Zie [/developers.md](/developers.md) voor integratie.

## Vergelijking

| | Traditioneel | ChatGPT + prompt | Co·Legal |
|---|---|---|---|
| Eén bron voor juridisch + fiscaal + boekhouding | nee | nee | **ja** |
| Deterministische fiscale berekeningen | ja | nee | **ja** |
| Drafting met tracked changes | gedeeltelijk | nee | **ja** |
| Belgisch first-class | gedeeltelijk | nee | **ja** |
| AI-voorstellen → mens beslist | n.v.t. | onduidelijk | **ja** |


## Links

- [Publieke agent](/agent.md) — live widget + voorbeeld-vragen.
- [Developers](/developers.md) — A2A v1.0 integratie.
- [Security](/security.md) — hosting, GDPR, retentie.

---

# Co·Legal Public Assistant — A2A v1.0 agent

> **Canonical HTML:** https://co-legal.be/agent.html
> **Host:** https://agent.co-legal.be
> **AgentCard:** https://agent.co-legal.be/.well-known/agent-card.json
> **Last updated:** 2026-05-19

Publieke A2A v1.0 agent voor algemene vragen over Belgisch privaat-clienteel recht en fiscaliteit.

## Discovery

| Pad | Wat |
|---|---|
| `GET /.well-known/agent-card.json` | A2A v1.0 AgentCard — ES256 detached JWS, JCS-canonical body, JWS protected header met `jku` → JWKS. |
| `GET /.well-known/agent.json` | Legacy alias (A2A v0.x crawlers). |
| `GET /.well-known/jwks.json` | Publieke ES256 sleutel voor signature-verify. |
| `GET /.well-known/mcp.json` | MCP discovery pointer (geen MCP-transport vandaag — verwijst door naar A2A-card). |
| `GET /extendedAgentCard` | Authenticated extended card (API-key vereist; placeholder vandaag, voor paid skills morgen). |
| `GET /icon.svg` | Agent-glyph zoals gerefereerd in `iconUrl` op de AgentCard. |
| `GET /healthz` | Liveness probe — registry-vriendelijk, raakt geen LLM. |

## Publieke skills (vier, gratis)

| Skill ID | Wat | Schema-velden |
|---|---|---|
| `be.legal.lookup` | Belgische wetsreferentie → canonieke Justel-URL | `code` (BW/WVV/WIB92/VCF/WBTW/WBE/Sw/Ger.W), `article` |
| `be.legal.search` | Trefwoord → Justel-zoek-URL + statute-hints | `keyword`, optioneel `limit` |
| `be.kbo.lookup` | KBO/BCE-onderneming opzoeken | `enterprise_number` (10 digits) |
| `be.vies.validate` | EU VIES BTW-validatie | `vat` (incl. landcode) |

Schemas zijn ook op de AgentCard via de `co-legal.be/a2a/extensions/tool-schema/v1` extensie — peer-agents kunnen calls plannen zonder trial-and-error.

## Invocation

JSON-RPC endpoint: `POST https://agent.co-legal.be/a2a/jsonrpc`

Methodes:

- `message/send` — single-turn OF multi-turn (via `taskId` in volgende calls)
- `message/stream` — Server-Sent Events stream
- `tasks/get` — task ophalen incl. history
- `tasks/list` — recente tasks van de caller (gescoped op API-key hash)
- `tasks/cancel` — task in terminal state zetten

### Path A — LLM-routing (natuurlijke taal)

```json
{
  "jsonrpc": "2.0", "id": 1, "method": "message/send",
  "params": {"message": {"parts": [
    {"kind": "text", "text": "Geef de Justel-link voor art. 4.71 BW."}
  ]}}
}
```

De LLM kiest welke skill te callen, voert hem uit, en synthetiseert een antwoord. Multi-turn werkt via `params.taskId` op vervolg-calls — server bewaart de context.

### Path B — Direct skill-dispatch (deterministisch, geen LLM)

```json
{
  "jsonrpc": "2.0", "id": 1, "method": "message/send",
  "params": {"message": {"parts": [
    {"kind": "data", "data": {
      "tool": "be.legal.lookup",
      "args": {"code": "BW", "article": "4.71"}
    }}
  ]}}
}
```

Synchroon, geen LLM-cost, snel (~50ms p50). Geschikt voor peer-agents die de skill kennen en alleen het resultaat willen.

## Quota

| Tier | Rate | Concurrency |
|---|---|---|
| Anoniem | 60 vragen / uur per IP | 1 |
| API-key (free) | 1000 / uur | 4 |

Headers op elke response: `A2A-Version: 1.0`, `RateLimit-Limit/Remaining/Reset` (IETF draft), legacy `X-RateLimit-*`.

## Status mapping

| State | Wanneer |
|---|---|
| `TASK_STATE_SUBMITTED` | net na `message/send` zonder LLM-ronde |
| `TASK_STATE_WORKING` | tijdens streaming |
| `TASK_STATE_COMPLETED` | succesvolle afronding |
| `TASK_STATE_CANCELLED` | via `tasks/cancel` |
| `TASK_STATE_FAILED` | interne fout of context-expiry |

## Wat de agent NIET doet

- Geen specifiek juridisch of fiscaal advies — vervangt geen advocaat, notaris of belastingconsulent.
- Geen toegang tot dossier-data van klanten van Co·Legal.
- Geen schrijfacties of side-effects — pure informatieve Q&A.
- Geen jurisdicties buiten België (Vlaams Gewest primair).
- Geen Jura / monKEY / Stradalex content (license-bound; alleen voor het partner-platform).

## Verder

- [Integration guide](/developers.md)
- [AgentCard live](https://agent.co-legal.be/.well-known/agent-card.json)

---

# Integreren — Co·Legal A2A v1.0 agent

> **Canonical HTML:** https://co-legal.be/developers
> **Last updated:** 2026-05-20

## Discovery

- **AgentCard:** `https://agent.co-legal.be/.well-known/agent-card.json` — ES256 detached JWS over JCS-canonical bytes (RFC 7515 + 8785). Protected header carries `alg`, `kid`, `jku` (no `typ:JWT`).
- **JWKS:** `https://agent.co-legal.be/.well-known/jwks.json`
- **Legacy alias:** `https://agent.co-legal.be/.well-known/agent.json` (A2A v0.x-pinned crawlers).
- **MCP discovery:** `https://agent.co-legal.be/.well-known/mcp.json` (geen MCP-transport vandaag — verwijst naar A2A-card).
- **Extended AgentCard:** `https://agent.co-legal.be/extendedAgentCard` — 401 zonder `x-api-key`, voor paid skills morgen.

## Endpoint

```
POST https://agent.co-legal.be/a2a/jsonrpc
Content-Type: application/json
```

Optionele header: `x-api-key: <key>` (verhoogt naar keyed-tier).

## Methodes (A2A v1.0 PascalCase, met v0.3-aliassen voor backwards-compat)

| v1.0 method | v0.3 alias | Wat |
|---|---|---|
| `SendMessage` | `message/send` | Single + multi-turn (via `taskId`) |
| `SendStreamingMessage` | `message/stream` | SSE — frames: `status-update` → `tool_call`/`tool_result` → `artifact-update` → `status-update`(final:true) |
| `GetTask` | `tasks/get` | Task object met history |
| `ListTasks` | `tasks/list` | Tasks van de caller (gescoped op API-key hash) |
| `CancelTask` | `tasks/cancel` | Task in `TASK_STATE_CANCELED` |

## Invocation patterns

### Path A — LLM-routing via text-part

```bash
curl -sX POST https://agent.co-legal.be/a2a/jsonrpc \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"SendMessage",
       "params":{"message":{"parts":[
         {"text":"Geef de Justel-link voor art. 4.71 BW."}
       ]}}}'
```

De LLM kiest een skill, voert hem uit, en synthetiseert het antwoord. Multi-turn: stuur `params.taskId` op vervolg-calls.

### Path B — Direct skill-dispatch via data-part

```bash
curl -sX POST https://agent.co-legal.be/a2a/jsonrpc \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"SendMessage",
       "params":{"message":{"parts":[
         {"data":{
           "tool":"be.legal.lookup",
           "args":{"code":"BW","article":"4.71"}
         }}
       ]}}}'
```

Synchroon, geen LLM-cost, ~50ms p50. Geschikt voor peer-agents die de skill kennen en alleen het resultaat willen.

### Python

```python
import httpx

resp = httpx.post(
    "https://agent.co-legal.be/a2a/jsonrpc",
    json={
        "jsonrpc": "2.0", "id": 1, "method": "SendMessage",
        "params": {"message": {"parts": [
            {"data": {
                "tool": "be.kbo.lookup",
                "args": {"enterprise_number": "0403.170.701"},
            }},
        ]}},
    },
    timeout=10,
)
result = resp.json()["result"]
text = next(p["text"] for p in result["parts"] if "text" in p)
data = next(p["data"] for p in result["parts"] if "data" in p)
```

### TypeScript

```ts
const r = await fetch("https://agent.co-legal.be/a2a/jsonrpc", {
  method: "POST",
  headers: {"Content-Type": "application/json"},
  body: JSON.stringify({
    jsonrpc: "2.0", id: 1, method: "SendMessage",
    params: {message: {parts: [{
      data: {tool: "be.vies.validate", args: {vat: "BE0403170701"}},
    }]}},
  }),
});
const {result} = await r.json();
```

## Skills (4 live + 4 roadmap)

Live:

```json
{
  "be.legal.lookup":    {"code": "BW|WVV|WIB92|VCF|WBTW|WBE|Sw|Ger.W", "article": "string"},
  "be.legal.search":    {"keyword": "string (2-120 chars)"},
  "be.kbo.lookup":      {"enterprise_number": "string (10 digits)"},
  "be.vies.validate":   {"vat": "string (country + identifier)"}
}
```

Roadmap (zie `/`-homepage): `be.entity.extract`, `be.relationship.graph`, `be.fiscal.compute`, `be.statute.cite`.

Volledige JSON-Schemas op de AgentCard via de `co-legal.be/a2a/extensions/tool-schema/v1` extension — strict mode, `additionalProperties: false`.

## Rate limits

| Tier | Per uur | Burst |
|---|---|---|
| Anoniem (per IP) | 60 | 20 |
| API-key (free) | 1000 | 100 |

Headers op elke response:

```
A2A-Version: 1.0
RateLimit-Limit: <n>          # IETF draft
RateLimit-Remaining: <n>
RateLimit-Reset: <seconds>
X-RateLimit-*: ...            # legacy
Retry-After: <seconds>        # alleen op 429
```

## Error codes

| JSON-RPC code | Meaning |
|---|---|
| `-32600` | Invalid Request envelope |
| `-32601` | Method/skill niet gevonden |
| `-32602` | Invalid params / schema-validation fout |
| `-32603` | Internal error (LLM-failure, context-expiry) |
| `-32001` | Permission denied / task not found / API-key required |
| `-32029` | Rate-limited (also returned als HTTP 429) |

Errors carry `data.reason` constants: `INVALID_ARGUMENT`, `TASK_NOT_FOUND`, `CONTEXT_EXPIRED`, `PERMISSION_DENIED`, `RATE_LIMIT_EXCEEDED`.

## A2A v1.0 enums op output

- Role: `"ROLE_USER"` / `"ROLE_AGENT"` (SCREAMING_SNAKE_CASE per v1.0 §4)
- Task state: `TASK_STATE_SUBMITTED` / `TASK_STATE_WORKING` / `TASK_STATE_COMPLETED` / `TASK_STATE_CANCELED` (single L!) / `TASK_STATE_FAILED`
- Parts: member-based discrimination — `{"text": "..."}` of `{"data": {...}}`, geen `kind`-veld

## Signature-verify recipe (Python)

```python
import json, base64, httpx
from joserfc import jws
import rfc8785

card_url = "https://agent.co-legal.be/.well-known/agent-card.json"
card = httpx.get(card_url).json()

sig_block = card["signatures"][0]
protected = json.loads(base64.urlsafe_b64decode(sig_block["protected"] + "=="))

# Fetch the publisher's JWKS via the jku URL
jwks = httpx.get(protected["jku"]).json()
public_key = next(k for k in jwks["keys"] if k["kid"] == protected["kid"])

# Reconstruct canonical body (sans signatures, with A2A v1.0 prune-defaults)
body = {k: v for k, v in card.items() if k != "signatures"}
canonical = rfc8785.canonicalize(body)

# Verify ECDSA(P-256, SHA-256)
signing_input = sig_block["protected"].encode() + b"." + base64.urlsafe_b64encode(canonical).rstrip(b"=")
ok = jws.deserialize_compact(
    signing_input + b"." + sig_block["signature"].encode(),
    public_key,
)
assert ok, "signature invalid — do not trust this card"
```

## CORS

Origins die `Access-Control-Allow-Origin` terugkrijgen:

```
https://co-legal.be
https://www.co-legal.be
https://agent.co-legal.be
http://localhost:8000
http://localhost:5173
http://127.0.0.1:8000
```

Exposed headers: `A2A-Version`, `RateLimit-*`, `X-RateLimit-*`, `Retry-After`.

## Verder

- [AgentCard live](https://agent.co-legal.be/.well-known/agent-card.json)
- [llms-full.txt](/llms-full.txt) — complete LLM-friendly content dump
- [Skills catalog op /](https://co-legal.be/) — live + roadmap

---

# Security & data — Co·Legal

> **Canonical HTML:** https://co-legal.be/security.html
> **Vulnerability reports:** ops@co-legal.be (PGP optioneel)
> **security.txt:** https://co-legal.be/.well-known/security.txt
> **Last updated:** 2026-05-19

## Hosting

- **Cloud infrastructure** — Europese cloud-provider, achter een load balancer + WAF.
- **Managed Postgres database** in een private VPC, geen publiek IP.
- **Object-storage** voor documenten; CMEK indien klant het vraagt.
- **Managed secret-store** voor alle credentials; geen secrets in code of YAML.

## Encryptie

- **TLS 1.3** voor alle externe traffic (HSTS preload).
- **Encryption-at-rest** via managed keys (CMEK upgrade-baar).
- **Beveiligde tunnel** voor de premium juridische bronnen.

## Authenticatie & RBAC

- **Identity-Aware Proxy** op het partner-platform — geen passwords op de wire, OAuth2.
- **Fijngranulaire RBAC** — role-profiles + werkgroepen + per-dossier access op vier assen (Dossier / TimeSheet / Task / Document) op 5 niveaus.
- **Capability-checks bij tool-dispatch** zijn de durabele security-gate; UI-visibility is een tweede laag.

## Public A2A agent (agent.co-legal.be)

- Geen dossier-data. Pure publieke Q&A op publieke bronnen.
- Rate-limit: anoniem 60/u per IP, API-key 1000/u.
- Geen schrijfacties, geen side-effects.
- Geen Jura/monKEY/Stradalex content (license-bound).

## GDPR / dataverwerking

- **Verwerkingsverantwoordelijke:** Co-Legal BV, België.
- **Sub-verwerkers:** Europese cloud-provider, model-provider met EU-pad, Wolters Kluwer / Larcier-Intersentia (alleen voor partner-platform).
- **Bewaartermijnen:** dossier-data tot 10 jaar na afsluiting (wettelijke termijn advocaten/notarissen); audit-log 7 jaar.
- **DPA** beschikbaar op aanvraag (ops@co-legal.be).

## Audit-log

Elke admin-actie, impersonatie en write wordt geaudit in een append-only log met actor + timestamp + correlation-id.

## Incident-response tijdslijn

| Trigger | Reactietijd |
|---|---|
| Vermoedelijk lek / breach | < 4u acknowledge, GDPR-notificatie < 72u |
| Vulnerability report (security.txt) | < 24u acknowledge |
| Service-degradation / outage | < 1u (kantooruren), zie status-page |

## Status & uptime

- Liveness probe op `https://agent.co-legal.be/health` voor registries.
- Status-page: nog niet publiek; geplant voor algemene beschikbaarheid.

## security.txt

```
Contact: mailto:ops@co-legal.be
Expires: 2027-05-19T00:00:00.000Z
Preferred-Languages: nl, en
Canonical: https://co-legal.be/.well-known/security.txt
Policy: https://co-legal.be/security.html
```

---
