The c:node Contract API delivers answers, legal provisions and public administration services with source, licence and verification status. You call it via REST or plug it into Claude, Copilot and your own agents directly via MCP.
The Contract API is the public interface to the c:node Graph. Every answer is built so that you can verify it: it names the source (ref), the verification status (grounding), the licence and, where required, the attribution of the data source.
| Field | Meaning |
|---|---|
ref | Standard reference of the source, e.g. ELI:BSIGesetz§10, CELEX:32024R1689 or XZUFI:S1000030000000045. |
grounding | Verification status against the cited passage, e.g. verified. |
license | Licence class of the source: open, attribution or internal. |
attributions | Mandatory attributions (source, licence, URL) for the data delivered. |
citations · factscore | For /v1/ask: verified sources only, plus a verdict per statement (belegt = evidenced or offen = open) and the share of evidenced statements. |
content_hash | For provenance records: SHA-256 over the content, for logging under EU AI Act Art. 12. |
| Figure | Meaning |
|---|---|
| 99.9%+ of concepts backed by a source | metrics.verified_pct from /v1/graph: the share of concepts anchored to an official source. It tells you a source exists – not how many entries are correct. |
| 98.8% checked precision of legal content | Sample of 1,235 norms, terms and rulings, each checked against the official source. 95% confidence interval (Wilson) 98.0–99.3%. Run graph-v32-2026-10-12T105151Z, as of 12 Oct 2026. |
Every precision figure names the stored run it comes from, so you can trace it and compare it with later runs.
The complete machine-readable specification is available at /openapi.json.
The first two calls work against the sandbox without a key. For knowledge endpoints you need a Contract key.
Send your contract key in the X-API-Key header. Only then is every call attributed to your key – profile, allowance, rate limit and /v1/usage. The API also accepts the ?key= query parameter, but it easily ends up in logs and browser histories, and usage is then not attributed to your key. Don’t use it.
public-observatory): graph overview, provenance, audit, attributions and the Company Brain preview.nk_…): bound to your plan’s profile, unlocks /v1/ask, /v1/retrieve, /v1/legal, /v1/leistung and /v1/betroffenheit.| Key | Where from | What for |
|---|---|---|
Contract key nk_… | your account at billing.c-node.ai (API key section) | Contract API; via MCP only the c:node Graph tools |
Organisation key ck_… | c:node → Settings → API keys & MCP | MCP and the app API for servers and agents without a person – not for the Contract API |
| Sign-in (OAuth) | your c:node account at auth.c-node.ai | MCP in Claude, Claude Code, Copilot Studio – as a person, with your workspace |
Every key is bound to a profile. The profile defines which licence classes and knowledge domains an answer may use – the models only see what your profile allows. GET /v1/profiles lists them live.
| Profile | Plan | What the key sees |
|---|---|---|
public-observatory | Sandbox, no key | Graph overview and provenance. |
research-open | Research | Research and innovation, open licences. |
free-market | Starter | Market, trade, investment, market trends and public finance. |
commercial-full | Professional | Full commercial access (without non-commercial sources), including law and public services. |
| Tenant profile | Enterprise | Full access plus your own tenant graph. |
de-federal | on request | Federal data space Germany, full access. |
trial | Trial | Time-limited, for evaluation. |
Reliable answers via the API come out of the same monthly allowance as the app and MCP. The billing unit is the reliable answer; looking up provisions and services does not count (see Errors & limits).
c:node also runs on your infrastructure: interface, chat and graph runtime as a Docker stack on your server, air-gapped if needed. For local answers an open model via Ollama is enough – or bring your own API key.
We provide the source code and installation guide to licensees. Get in touch – we set up access and support the installation.
One URL for every plan: https://mcp.c-node.ai/mcp (Streamable HTTP). The model writes, c:node delivers the evidenced basis. Every answer carries its evidence status as in the app – evidenced, partly evidenced or general assessment – in the evidence field (status and label). Hits that were checked but do not count as evidence appear under checked_sources. Which tools you see depends on your sign-in, your plan, your role and your workspace settings.
c:node, URL https://mcp.c-node.ai/mcp. No client ID needed.Add it once, for all your projects:
Then in Claude Code run /mcp → cnode → “Authenticate”. The browser opens the sign-in at auth.c-node.ai; after “Allow” you continue in Claude Code. Without --scope user the entry only applies to the current project.
Without a person, e.g. on a server or in CI: an organisation key in the header. This gives no private layer and no connector search, because both belong to a person.
https://mcp.c-node.ai/mcp.https://auth.c-node.ai/authorize, token and refresh URL https://auth.c-node.ai/token, scopes e.g. cnode:graph.read cnode:workspace.read cnode:usage.read. Send us the redirect URL Copilot Studio shows afterwards.X-API-Key with an organisation key ck_….Any MCP client with Streamable HTTP works with a key in the X-API-Key header or as Authorization: Bearer <key>. For VS Code in .vscode/mcp.json – Copilot asks for the key on first start and does not store it in the project:
With an organisation key ck_… you see your workspace tools according to the key’s role; with a contract key only the c:node Graph. auth.c-node.ai accepts clients with their own sign-in via client metadata (CIMD) or as a native app redirecting to localhost; for other web services we set up a fixed client.
The old URLs nena-mcp.c-node.ai/mcp and mcp.c-node.ai/agents/mcp keep working until 5 January 2027. Please switch to https://mcp.c-node.ai/mcp.
When you sign in, you grant the client permissions (scopes). A tool only appears if the permission is granted, your plan and role allow it and your workspace enables MCP for it. The list is recomputed on every request.
| Scope | Allows | From plan |
|---|---|---|
cnode:graph.read | c:node Graph: answers, law, public services, dossier, Company Brain preview | Research |
cnode:workspace.read | Questions to your workspace; from Professional also agents, memory, reading the library, notifications, situation report | Starter |
cnode:connectors.read | Search your connected systems with your own access | Professional |
cnode:library.write | Put files into the library (private by default) | Professional |
cnode:tasks.run | Start tasks and check their status | Professional |
cnode:drafts.create | Create drafts for approval, reject proposals | Professional |
cnode:usage.read | See your own allowance | all |
cnode:admin | Administration: workspace usage and MCP policy | Enterprise, admins |
cnode:graph.write | Update the Company Brain in your own tenant graph | with a tenant key |
| Tool | What it does | Research | Starter | Professional | Enterprise |
|---|---|---|---|---|---|
cnode_graph_ask | Answer from the c:node Graph with evidence status (evidence) and sources | ✓ | ✓ | ✓ | ✓ |
cnode_legalcnode_law_searchcnode_leistung | Provision by reference or citation, provision search with full text, public service with its legal basis | ✓ | ✓ | ✓ | ✓ |
cnode_healthcnode_usage | Connection check, own allowance | ✓ | ✓ | ✓ | ✓ |
cnode_models | Which answer modes and models your plan unlocks, with class and weight | ✓ | ✓ | ✓ | ✓ |
cnode_ask | Question to your workspace: your documents plus the c:node Graph | – | ✓ | ✓ | ✓ |
cnode_dossiercnode_brain_preview | Assemble an application dossier, Company Brain preview of a domain | – | ✓ | ✓ | ✓ |
cnode_thread_resultscnode_memory_overview | Results of a chat (artefacts, items created with link, tasks, approvals, runs); memory overview – c:node Graph as an aggregate and your own entries per level. Read only | – | ✓ | ✓ | ✓ |
cnode_memory_searchcnode_library_listcnode_library_readcnode_library_upload | Search and read memory and library, add files | – | – | ✓ | ✓ |
cnode_connector_search | Search your connected systems | – | – | ✓ | ✓ |
cnode_list_agentscnode_ask_agentcnode_consult_agentcnode_consult_team | Domain agents and the expert team | – | – | ✓ | ✓ |
cnode_run_taskcnode_task_status | Tasks: research, decision memo, document analysis, legal and compliance check | – | – | ✓ | ✓ |
cnode_draft_followupcnode_list_pending_actionscnode_reject_actioncnode_approve_actioncnode_notifications | Drafts and approval links, open proposals, notifications | – | – | ✓ | ✓ |
cnode_tasks_listcnode_task_createcnode_task_update | List tasks; create a new task as a draft; propose a change to a task – effective only after approval in c:node | – | – | ✓ | ✓ |
cnode_lagebild | Situation report for your own domain | – | – | ✓ | ✓ |
cnode_admin_usage | Workspace usage and MCP policy | – | – | – | ✓ admins |
Roles: viewers see the read tools; members additionally questions, agents, tasks, drafts and upload; admins additionally administration. With a contract key you only see the c:node Graph tools for your profile, plus cnode_profiles and, with a tenant key, cnode_brain_bootstrap and cnode_findings. For contract keys, cnode_graph_ask is also still available as cnode_ask (old name) until 5 January 2027.
approve_url). Nothing is sent or booked until you press “Approve” in c:node. cnode_approve_action, too, only returns this link.cnode_models shows which modes and models your plan unlocks.cnode_usage shows where you stand – or in c:node under Settings.
| What you see | Why | What helps |
|---|---|---|
401 “c:node MCP braucht eine Anmeldung oder einen Schlüssel” | Not signed in yet, sign-in expired or key invalid. The WWW-Authenticate header names under resource_metadata where the client finds the sign-in – that is intended. | Reconnect (Claude Code: /mcp → cnode → “Authenticate”) or check the key. |
invalid_redirect_uri during sign-in | The client registers with a redirect address that auth.c-node.ai does not accept automatically. Accepted are Claude, clients with client metadata (CIMD) and native apps redirecting to localhost, 127.0.0.1 or [::1], and Copilot Studio redirecting to https://global.consent.azure-apim.net/redirect/…. | Update Claude Code. For other web services, ask for a fixed client or use an organisation key. |
Consent page ends with access_denied | “Deny” was pressed – or your account is not a member of the workspace the client asks for. | Reconnect and “Allow”. Your admin or c:node contact sets up the membership. |
| Sign-in fails, there is no account yet | A connector does not create an account. | Create a c:node account or get invited first, then connect. |
| Connected, but 0 tools | On the consent page a workspace was chosen that has no c:node workspace – or MCP is switched off there. | Reconnect and choose the right workspace. Admins check Settings → API keys & MCP. |
| A tool is missing or says it is not included in your c:node plan | Plan, role or a permission not granted at sign-in. | Check scopes & tools; reconnect if a permission is missing. |
| “Limit reached” or “allowance used up” | Per-person minute limit or 150 % of the monthly allowance. | Wait briefly or adjust your plan. |
| “Approve only in c:node” | Intended: nothing is approved via MCP. | Open the approve_url link and approve in c:node. |
Reliable answers and legal sources. All endpoints here require a Contract key.
Answers a question exclusively from the concepts your profile allows. Citations come only from verified references. If c:node finds no evidence, the answer says so instead of guessing.
| Parameter | Description |
|---|---|
q | The question in natural language (min. 3 characters). Required. |
k | Number of concepts the answer draws on (1–20, default 6). |
Without evidence: "grounded": false and the answer “That is not (yet) in the knowledge graph.” Statements without support receive the verdict offen (open).
Same parameters and verification as /v1/ask. The response arrives as server-sent events: token events with text chunks, then a done event with citations, verdict and factscore, and finally [DONE].
Returns the concepts /v1/ask would ground on – each with reference, definition, score and layer (macro = c:node Graph, micro = your tenant) – but no phrased answer and no per-statement check. For callers who write the answer with their own model; considerably faster than /v1/ask. Same parameters as /v1/ask. Counts like an answer (billable when grounded).
One section by reference, all sections of a law or a full-text search. One of the three parameters is required.
| Parameter | Description |
|---|---|
ref | Exact reference, e.g. ELI:BSIGesetz§1. |
law | Name of the law, e.g. BSIGesetz – returns its sections. |
q | Full-text search (all terms must appear). |
cite | Citation as you would type it, e.g. § 309 BGB – returns the provision in full text (like /v1/legal/norm). |
limit · offset | Pagination (1–500, default 50). If there are more hits, next_offset is included in the response. |
Finds provisions for a question, a topic or a citation. Citations in the question are resolved first ("match": "citation"), then ranked hits follow ("match": "search"), each with full text, source and status date. missing lists cited provisions or laws that the corpus does not hold.
| Parameter | Description |
|---|---|
q | Question, topic or citation, e.g. Art. 28 DSGVO or Klauselverbote in AGB. Required. |
k | Number of hits (1–30, default 8). |
law | Restrict to one law, e.g. BGB. |
Resolves a citation as you would type it – cite=§ 309 BGB, cite=Art. 28 DSGVO – or takes an exact ref. Response: the provision with full text, source URL and status date, or an honest "found": false with a reason (no_citation, law_not_held, norm_not_found, not_in_profile). /v1/legal?cite=… returns the same.
Provisions per law and the status date per law – so you know what /v1/legal/search and /v1/legal/norm cover.
Public administration services from XZuFi/LeiKa (German service catalogues). rechtsgrundlagen (legal bases) only contains links to laws that are in the c:node Graph – nothing is guessed. Parameters: ref or q, plus limit/offset.
Records for traceability: where a statement comes from, whom a legal act affects, and which sources must be attributed. With Try it you call the sandbox live.
Returns the verification status, licence, an uncertainty statement and a content hash for a reference – built for logging under EU AI Act Art. 12. Parameter: ref.
Links an EU legal act to the affected sectors and companies from the commercial register. Parameter: act, e.g. ArtificialIntelligenceAct.
Extends /v1/audit with the region: law → sector → affected companies → federal state → regional indicators (GDP, unemployment rate, income). Every derived figure carries its evidence chain. Parameters: act (optional), limit (1–100).
Assembles a verifiable dossier from application fields: every field with its source, the eIDAS trust verdict on the seal and a tamper-proof hash chain. If the application names a service without legal bases, c:node adds them from the graph. Responses contain personal data and are not cached.
All data sources of your profile with licence and URL – for your imprint, source list or export.
A domain becomes an evidenced company profile: c:node reads the public pages, checks the imprint and commercial register, anchors the company in its sector and delivers findings on regulation and open public tenders – each with a source.
The public preview: streams the run for a domain, stores nothing. Limited to a few runs per IP and hour, plus a daily allowance; the result for a domain is cached for 24 hours and replayed. Parameter: domain, e.g. firma.de; optionally lang (de, en, fr), mode (brief by default, swot or lagebild) and, with mode=lagebild, goal (gesamt, chancen, pflichten, foerderung, wettbewerb).
Event types in this order: step, page, feed, impressum, register, profile, anchor, finding, done (on errors error), terminated by [DONE].
Runs the full process and stores profile, pages and findings in your tenant graph. Afterwards /v1/ask and /v1/findings know your company. Body: {"domain": "firma.de"}. Time limit 90 seconds (504 if exceeded).
As a stream: GET /v1/brain/stream?domain=… delivers the same events as the preview and stores at the end.
The proactive findings from the last run: regulation, public tenders, registers and sector context, each with evidence. If there has been no run yet, findings is empty and hint names the next step.
With a tenant key, /v1/ask, /v1/retrieve, /v1/graph and /v1/findings combine the c:node Graph with your own knowledge. With scopes you choose which layers of your tenant are read as well: org (default), team:<id>, user:<id>, comma-separated.
Writes a document or a note into your private tenant graph. The entry can be answered via /v1/ask right away. The c:node Graph itself stays unchanged.
Fields: title or label, text or content, optionally source, ref (identifier of the source; ingesting again with the same ref replaces the entry) and scope (org, team:<id> or user:<id>, default org).
Moves an entry within your tenant, e.g. from a personal note into the organisation memory. Body: {"scope": "org"}. 404 if nothing is stored under the ref.
Deletes everything you ingested under this ref – text, aliases and embedding – e.g. for a GDPR erasure. Repeated calls return "deleted": 0. The c:node Graph is not touched.
Your per-minute quota and your usage for a period (since/until, e.g. since=30d): answers delivered (answers), of which billable (billable_answers), retrievals, lookups, ingests, the split by channel (by_channel, e.g. api, mcp:claude) and the average factscore. detail=true adds the individual entries. Call it with your key – without a key you only see the sandbox.
Concepts, relations, domains and the share of concepts backed by a source (verified_pct, what it measures) – for the graph your profile sees.
Errors come as JSON with a detail field.
| Status | Meaning |
|---|---|
400 | Parameter missing, e.g. /v1/legal without ref, law, q or cite. |
401 | No or invalid key for an endpoint that requires a contract key. |
403 | Endpoint requires a tenant key (Company Brain, findings, ingest) – without a key or with a key that has no tenant. |
404 | Reference or legal act not in the graph. |
422 | Invalid parameter, e.g. q too short or k out of range. |
429 | Rate limit reached. Wait the seconds given in the Retry-After header. |
503 | Answer generation is busy right now. Retry after Retry-After. |
504 | Brain run exceeded the time limit. |
Rate limit: 120 calls per minute and key, for every /v1 call except /v1/health. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining; /v1/usage shows where you stand as well.
Billing: the unit is the reliable answer – an answer from /v1/ask, /v1/ask/stream or /v1/retrieve that rests on verified sources. Answers without evidence, lookups (/v1/legal, /v1/legal/norm, /v1/legal/search, /v1/leistung) and ingests are counted but not billed as reliable answers. Reliable answers via the Contract API are measured against your plan’s monthly allowance. Anything beyond it costs €0.04 excl. VAT per reliable answer, capped in the Starter plan at the cost of switching to Professional. There is no pause at 150 % here; the rate limit applies.
Only a pseudonymous client ID, the path and the status are logged – no content.