API Documentation

Build on noeud.ai. Upload documents, extract knowledge graphs, and query technical documentation through a simple REST API.

API Versionv1.2.0STABLELast updated: March 15, 2026

๐Ÿ“– Overview

The noeud.ai API is organized around REST. All requests use JSON except file uploads (multipart/form-data). Base URL:

Base URL
https://noeud.ai/api/v1/

Key Concepts

  • Assets โ€” Equipment you document (machines, aircraft, vehicles)
  • Documents โ€” Technical PDFs uploaded or found by Corpus Builder
  • Knowledge Units (KUs) โ€” Structured facts extracted from documents with source and confidence
  • Knowledge Graph (KG) โ€” Interconnected graph of all KUs, entities, and relationships
  • Corpus Builder โ€” Finds relevant PDFs on the web automatically (44 queries per angle)
  • RAG Chat โ€” Answers questions using your KG with source citations

๐Ÿš€ Quickstart โ€” 5 Minutes

Step 1: Get your API key

Go to Account โ†’ API Access and copy your key.

Step 2: Upload a document

cURLPythonJavaScriptGoPHPRuby
curl -X POST https://noeud.ai/api/v1/documents/upload \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@manual.pdf" \ -F "domain=cnc_machining"
import requests resp = requests.post( "https://noeud.ai/api/v1/documents/upload", headers={"Authorization": "Bearer YOUR_API_KEY"}, files={"file": open("manual.pdf", "rb")}, data={"domain": "cnc_machining"} ) print(resp.json())
const form = new FormData(); form.append("file", fs.createReadStream("manual.pdf")); form.append("domain", "cnc_machining"); const resp = await fetch("https://noeud.ai/api/v1/documents/upload", { method: "POST", headers: { "Authorization": `Bearer ${KEY}` }, body: form });
file, _ := os.Open("manual.pdf") body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, _ := writer.CreateFormFile("file", "manual.pdf") io.Copy(part, file) writer.WriteField("domain", "cnc_machining") writer.Close() req, _ := http.NewRequest("POST", "https://noeud.ai/api/v1/documents/upload", body)
$ch = curl_init("https://noeud.ai/api/v1/documents/upload"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer $key"], CURLOPT_POSTFIELDS => ["file" => new CURLFile("manual.pdf"), "domain" => "cnc_machining"], ]);
uri = URI.parse("https://noeud.ai/api/v1/documents/upload") req = Net::HTTP::Post.new(uri) req["Authorization"] = "Bearer #{key}" form = [["file", File.open("manual.pdf")], ["domain", "cnc_machining"]] req.set_form(form, "multipart/form-data")

Step 3: Ask a question

cURLPython
curl -X POST https://noeud.ai/api/v1/chat \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"question": "What causes Fanuc alarm SV0401?"}'
resp = requests.post("https://noeud.ai/api/v1/chat", headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}, json={"question": "What causes Fanuc alarm SV0401?"}) data = resp.json() print(data["answer"]) for c in data["citations"]: print(f" {c['source']} p.{c['page']}")

That's it โ€” document uploaded, question answered with citations, in two API calls.

๐Ÿ” Authentication

Include your API key in the Authorization header:

Header
Authorization: Bearer noeud_sk_YOUR_API_KEY

Key Format

Production: noeud_sk_{id}_live_{random} ยท Sandbox: noeud_sk_{id}_test_{random}

Key Scopes

ScopeAccessUse Case
readQuery KG, list assets/docs, chatClient apps
writeUpload docs, create assets, start jobsBackend
adminFull access including deleteInternal only
โš ๏ธ Keep your API key secret. Never expose in client-side code or public repos. Rotate immediately if compromised. Up to 3 active keys for zero-downtime rotation.

โฑ๏ธ Rate Limits

PlanRequests/HourRAG/DayUpload SizeConcurrent Jobs
Discovery602010 MB1
Pro50050050 MB5
Enterprise5,000Unlimited200 MB20
Response Headers
X-RateLimit-Limit: 500 X-RateLimit-Remaining: 487 X-RateLimit-Reset: 1710523200

โŒ Error Handling

CodeMeaning
200Success
201Created
400Bad request
401Unauthorized
403Forbidden (scope)
404Not found
429Rate limited
500Server error
Error Body
{"error": {"type": "invalid_request", "message": "File must be PDF", "code": "invalid_file_type", "request_id": "req_a1b2c3"}}

๐Ÿท๏ธ Versioning

Version in URL path (/api/v1/). Breaking changes increment version. Previous versions maintained 12 months. Pin with header: X-API-Version: 2026-03-15

๐Ÿ”„ Idempotency

For POST requests, include Idempotency-Key header to safely retry without duplicates. Keys valid 24 hours.

Header
Idempotency-Key: idem_a1b2c3d4-e5f6

๐Ÿ“„ Documents

POST/api/v1/documents/upload
Upload a technical document for knowledge extraction. Supports PDF, DOCX, XLSX, images, CSV, TXT.
ParameterTypeDescription
filebinaryRequiredDocument file (multipart/form-data)
domainstringOptionalcnc_machining, aviation, automotive, medical_devices, electronics, robotics, energy, marine, agriculture, construction, telecom, railway, military, injection_molding, photography, heavy_trucks
asset_idstringOptionalAssociate with specific asset
scopestringOptionaltransversal, model, or specific
tagsarrayOptionalCustom tags: ["maintenance","urgent"]
200 OK
{"document_id": "doc_8f3a2b1c", "filename": "fanuc_manual.pdf", "size_bytes": 4521984, "pages": 847, "status": "uploaded", "domain": "cnc_machining", "created_at": "2026-03-15T14:30:00Z"}
GET/api/v1/documents
List all documents. Supports pagination, filtering by status/domain/asset, and search by filename.
Query ParamTypeDescription
statusstringOptionaluploaded, processing, processed, failed
domainstringOptionalFilter by domain
searchstringOptionalSearch by filename
created_afterISO dateOptionalFilter by date
GET/api/v1/documents/{document_id}
Get document details including extraction status, KU count, grounding/coverage scores.
200 OK
{"document_id": "doc_8f3a2b1c", "filename": "fanuc_manual.pdf", "pages": 847, "status": "processed", "ku_count": 1247, "extraction": {"preset": "optimal", "duration_seconds": 342, "grounding_score": 0.91, "coverage_score": 0.87}}
GET/api/v1/documents/{document_id}/download
Download the original file. Returns binary with Content-Type header.
DELETE/api/v1/documents/{document_id}
Delete a document and its KUs. Irreversible.
โš ๏ธ Deleting a document removes all extracted KUs. This may affect RAG answers that relied on this document.
POST/api/v1/documents/batch NEW
Upload up to 20 documents in one request. Returns batch job ID.
ParameterTypeDescription
filesbinary[]RequiredUp to 20 files
auto_extractbooleanOptionalAuto-start KG extraction (default: false)

๐Ÿ’ฌ RAG Chat

POST/api/v1/chat
Ask a question against your Knowledge Graph. Returns grounded answer with source citations.
ParameterTypeDescription
questionstringRequiredTechnical question (max 2000 chars)
asset_idstringOptionalScope to specific asset
session_idstringOptionalContinue conversation
max_sourcesintegerOptionalMax citations (1-10, default: 5)
languagestringOptionalen, fr, de (default: auto)
200 OK
{ "answer": "Alarm SV0401 (VRDY OFF) on Z-axis indicates servo amplifier not receiving ready signal. Most common cause: loose CN1B connector...", "citations": [{"source": "fanuc_maintenance.pdf", "page": 312, "text": "Check CN1B connector...", "confidence": 0.94, "ku_id": "ku_f7e8d9"}], "session_id": "sess_x7k2", "model": "claude-sonnet-4-20250514", "search_time_ms": 42, "llm_time_ms": 1847, "total_time_ms": 1889, "n_sources": 2, "usage": {"rag_queries_today": 48, "rag_queries_limit": 500} }
๐Ÿ’ก Include equipment context in your question for best results: manufacturer, model, subsystem.
POST/api/v1/chat/stream NEW
Streaming version. Returns Server-Sent Events (SSE) for real-time token output.
Python
resp = requests.post("https://noeud.ai/api/v1/chat/stream", headers={"Authorization": f"Bearer {KEY}"}, json={"question": "What causes alarm SV0401?"}, stream=True) for line in resp.iter_lines(): if line: print(line.decode(), end="", flush=True)
GET/api/v1/chat/sessions
List all chat sessions with message counts and timestamps.
POST/api/v1/chat/feedback
Rate an answer quality (1-5 stars) to improve future responses.
ParameterTypeDescription
session_idstringRequiredSession to rate
ratingintegerRequired1-5 stars
commentstringOptionalFree-text feedback

๐Ÿ”ง Assets

GET/api/v1/assets
List all equipment assets.
200 OK
{"data": [{"id": "asset_f01a", "vendor": "Fanuc", "model": "0i-TF", "entity_type": "CNC Lathe", "callsign": "LATHE-07", "serial_number": "E04637281", "domain": "cnc_machining", "subsystems": [{"name": "Spindle"}, {"name": "Z-Axis Servo"}], "ku_count": 4580}]}
POST/api/v1/assets
Create a new asset manually.
ParameterTypeDescription
vendorstringRequiredManufacturer name
modelstringRequiredModel name
domainstringRequiredTechnical domain
callsignstringOptionalField identifier
serial_numberstringOptionalSerial number
POST/api/v1/assets/scan-nameplate NEW
Upload nameplate photo. Claude Vision extracts manufacturer, model, serial, year automatically.
ParameterTypeDescription
imagebinaryRequiredJPEG, PNG, HEIC (max 10MB)
auto_createbooleanOptionalAuto-create asset (default: false)
200 OK
{"vendor": "Fanuc", "model": "0i-TF", "serial": "E04637281", "year": "2019", "entity_type": "CNC Lathe", "confidence": 0.97}
PUT/api/v1/assets/{asset_id}
Update asset details (callsign, serial, subsystems).
DELETE/api/v1/assets/{asset_id}
Delete an asset. Requires password confirmation via X-Confirm-Password header.

๐Ÿง  Knowledge Graph

POST/api/v1/kg/extract
Start KG extraction. Multi-pass pipeline transforms PDFs into structured Knowledge Units.
ParameterTypeDescription
presetstringOptionaleconomy (Sonnet+mini, ~$30) ยท optimal (Sonnet+GPT-4.1, ~$60) ยท max_quality (Opus+Sonnet, ~$250)
document_idsarrayOptionalSpecific docs only
webhook_urlstringOptionalNotify on completion
GET/api/v1/kg/jobs/{job_id}
Get extraction job progress (percent, phase, KUs extracted so far).
POST/api/v1/kg/query
Query the Knowledge Graph directly (without LLM). Returns matching Knowledge Units ranked by relevance.
ParameterTypeDescription
querystringRequiredSearch query
limitintegerOptionalMax results (default: 10)
min_confidencefloatOptionalMin score threshold (0-1)
GET/api/v1/kg/stats
KG statistics: total KUs, entities, relations, domains, avg confidence.
GET/api/v1/kg/export NEW
Export KG in JSON, CSV, RDF/Turtle, or Neo4j Cypher format.
ParameterTypeDescription
formatstringOptionaljson, csv, rdf, neo4j (default: json)
min_confidencefloatOptionalFilter by confidence (0-1)
GET/api/v1/kg/entities
List all extracted entities (manufacturers, models, parameters, alarm codes, etc.).

๐Ÿš€ Corpus Builder

POST/api/v1/corpus/build
Start automated documentation search. 44 queries per angle, finds and ranks PDFs.
ParameterTypeDescription
asset_idsarrayRequiredAssets to document
anglestringOptionalmaintenance, operation, training, parts, all
max_pdfsintegerOptionalMax PDFs (default: 80)
min_trustfloatOptionalMin trust score (0-1)
GET/api/v1/corpus/jobs/{job_id}
Job progress: queries done, candidates found, PDFs downloaded, trust avg, ETA.
GET/api/v1/corpus/stats
Corpus statistics: total PDFs, internal docs, domains covered.

๐ŸŽฅ Vision Monitoring BETA

GET/api/v1/vision/cameras
List connected cameras and status.
200 OK
{"cameras": [{"id": "cam_hmi_01", "name": "Lathe 07 HMI", "status": "streaming", "resolution": "1920x1080", "anomaly_count_24h": 2, "uptime_24h": 99.8}]}
WSwss://noeud.ai/api/v1/vision/feed/{camera_id}
WebSocket for real-time camera feed with AI analysis. Receive frames and anomaly events.
JavaScript
const ws = new WebSocket(`wss://noeud.ai/api/v1/vision/feed/cam_01?token=${KEY}`); ws.onmessage = (e) => { const d = JSON.parse(e.data); if (d.type === "anomaly") { // d.alarm, d.kg_context, d.recommended_action } };
GET/api/v1/vision/alerts
List recent anomaly alerts across all cameras. Includes KG context and recommended procedures.

๐Ÿ”” Webhooks

POST/api/v1/webhooks
Register a webhook endpoint for real-time event notifications.
ParameterTypeDescription
urlstringRequiredHTTPS endpoint
eventsarrayRequiredEvents to subscribe
secretstringOptionalSigning secret

Event Types

EventDescription
corpus.completedCorpus Builder finished
corpus.failedCorpus Builder failed
kg.completedKG extraction finished
document.processedDocument processing done
vision.anomalyCamera detected anomaly
vision.alarmCritical alarm on HMI

Payload Verification

Verify X-Noeud-Signature header with HMAC-SHA256:

Python
import hmac, hashlib expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest() valid = hmac.compare_digest(expected, signature)

๐Ÿ‘ค Account

GET/api/v1/account
Get account info, plan, usage limits.
GET/api/v1/account/usage
Current billing period usage.
{"plan": "pro", "assets": 8, "documents": 193, "knowledge_units": 35606, "rag_queries_today": 47, "rag_queries_limit": 500}
GET/api/v1/account/api-keys
List active API keys (up to 3). Create and revoke keys for zero-downtime rotation.

๐Ÿฅ Health

GET/api/v1/health
System health. No authentication required.
{"status": "operational", "services": {"api": "up", "redis": "up", "worker": "up"}, "version": "1.2.0", "uptime_24h": 99.98}

Full status page: noeud.ai/portal/health

๐Ÿ“ฆ SDKs & Tools

Python SDK STABLE

Install
pip install noeud-ai
Usage
from noeud import NoeudClient client = NoeudClient(api_key="noeud_sk_...") # Upload doc = client.documents.upload("manual.pdf", domain="cnc_machining") # Ask answer = client.chat.ask("What causes alarm SV0401?") print(answer.text) for c in answer.citations: print(f" {c.source} p.{c.page}") # Scan nameplate scan = client.assets.scan_nameplate("photo.jpg") # Corpus builder job = client.corpus.build(asset_ids=["asset_01"], angle="all") job.wait() print(f"Found {job.result.pdfs_count} PDFs") # Export KG client.kg.export(format="json", output="kg.json")

Node.js SDK COMING SOON

Install
npm install @noeud-ai/sdk

CLI Tool STABLE

Usage
pip install noeud-cli noeud config set api_key noeud_sk_... noeud upload manual.pdf --domain cnc_machining noeud ask "What causes alarm SV0401?" noeud assets list noeud scan photo.jpg --auto-create noeud kg export --format json -o kg.json

Postman Collection

Download Postman Collection โ†’

๐Ÿ“‹ Changelog

v1.2.0March 15, 2026
  • ADDED Nameplate scanner with Claude Vision
  • ADDED Streaming chat (SSE)
  • ADDED KG export (JSON/CSV/RDF/Neo4j)
  • ADDED Batch upload, Chat feedback, Webhooks
  • CHANGED Pro rate limits increased
v1.1.0February 20, 2026
  • ADDED Vision monitoring (beta)
  • ADDED Multi-language RAG (EN/FR/DE)
  • ADDED Document tagging
v1.0.0January 15, 2026
  • ADDED Initial release: docs, KG, RAG, assets, corpus, Python SDK

๐Ÿงช Sandbox

Test without affecting production. Sandbox uses CNC demo KG (35,606 KUs).

Sandbox URL
https://noeud.ai/api/v1/sandbox/

Use test key (noeud_sk_*_test_*). Same API, isolated data, Discovery-tier limits.

๐Ÿ†˜ Support

Always include request_id from error responses when reporting issues.