Model Context Protocol for Claude Desktop, Cursor and other AI clients. 100+ tools for CRUD across all core resources.
npx -y @dversum/mcp-serverA curated reference for the endpoints you reach for most — authentication, webhooks, and the core resources for clients, invoices, tasks, time tracking and more. Every example is copy-paste runnable.
https://api.dversum.com/api/v1The dVersum API speaks REST over HTTPS. Requests are JSON, responses are JSON. Timestamps are ISO 8601 in UTC. Monetary amounts are integers in cents. IDs are UUIDv4.
Authenticate every request with a personal API token in the Authorization header. Create tokens at Settings → API. Each token is scoped to a user + organization; permissions match the user's.
curl https://api.dversum.com/api/v1/clients \
-H "Authorization: Bearer dvk_live_…"Errors are JSON with `error` (short machine token) and `message` (human-readable). HTTP status codes follow REST conventions.
{
"error": "validation_failed",
"message": "client_id is required",
"field": "client_id"
}| Status | Meaning |
|---|---|
400 | Bad request — JSON parse error or missing required field |
401 | Missing or invalid token |
403 | Token is valid but lacks permission for the resource |
404 | Resource does not exist (or belongs to another organization) |
409 | Conflict — e.g. duplicate slug/email |
422 | Validation failed |
429 | Rate limit exceeded — see Rate limits |
5xx | Server error — retry or contact support |
List endpoints accept `?page=` and `?per_page=` (max 100). The response includes `total` so you can compute the total number of pages yourself.
curl "https://api.dversum.com/api/v1/invoices?page=2&per_page=50" \
-H "Authorization: Bearer $DVERSUM_TOKEN"Per token: 120 requests/minute. On overage the server responds with 429 and a `Retry-After` header. Responses include `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` for monitoring.
Webhooks push events to your HTTPS endpoint as they happen in dVersum — paid invoices, new tasks, updated projects. Every delivery is signed and idempotent (`Idempotency-Key` header).
Create a webhook endpoint at Settings → Webhooks or via the API:
/webhookscurl -X POST https://api.dversum.com/api/v1/webhooks \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/dversum-webhook",
"events": ["invoice.paid", "quote.signed"],
"active": true
}'The `secret` used to sign future payloads is returned in the POST response — keep it safe.
Every delivery carries `X-Dversum-Signature: sha256=<hex>`. Compute HMAC-SHA-256 over the raw request body using your `secret`, then compare in constant time.
import crypto from 'node:crypto'
const signature = req.headers['x-dversum-signature'].replace('sha256=', '')
const expected = crypto
.createHmac('sha256', process.env.DVERSUM_WEBHOOK_SECRET)
.update(req.rawBody)
.digest('hex')
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).end()
}50 events across 11 resources.
invoice.createdinvoice.updatedinvoice.sentinvoice.paidinvoice.partially_paidinvoice.overdueinvoice.deletedquote.createdquote.updatedquote.sentquote.signedquote.rejectedquote.expiredquote.convertedquote.deletedcontract.createdcontract.signedcontract.cancelledreminder.sentclient.createdclient.updatedclient.deletedproject.createdproject.updatedproject.archivedproject.deletedtask.createdtask.updatedtask.completedtask.assignedtask.movedtask.deletedsubtask.createdsubtask.completedsubtask.deletedcomment.createdtime_entry.createdtime_entry.startedtime_entry.stoppedtime_entry.updatedtime_entry.deletedpage.createdpage.updatedpage.deletedabsence.createdabsence.updatedabsence.deletedbooking.createdbooking.cancelledbooking.rescheduledClients are the central business contact — invoices, quotes, projects and contracts all reference a client.
/clientsList all clients in the organization.
curl https://api.dversum.com/api/v1/clients \
-H "Authorization: Bearer $DVERSUM_TOKEN"{
"clients": [
{
"id": "01H8Z…",
"name": "ATAS Vertriebs GmbH",
"email": "kontakt@atas.de",
"color": "#45e59f"
}
],
"total": 47
}/clientsCreate a new client.
curl -X POST https://api.dversum.com/api/v1/clients \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "ATAS Vertriebs GmbH",
"email": "kontakt@atas.de",
"vat_id": "DE123456789",
"country": "DE"
}'/clients/{id}Get a single client including linked resources.
curl https://api.dversum.com/api/v1/clients/CLIENT_ID \
-H "Authorization: Bearer $DVERSUM_TOKEN"/clients/{id}Update a client.
curl -X PUT https://api.dversum.com/api/v1/clients/CLIENT_ID \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "email": "neu@atas.de" }'/clients/{id}Delete a client (only if no invoices reference it).
curl -X DELETE https://api.dversum.com/api/v1/clients/CLIENT_ID \
-H "Authorization: Bearer $DVERSUM_TOKEN"Projects contain tasks, time entries, pages and whiteboards. A project can optionally be assigned to a client.
/projectsList all projects. Filter with ?archived=false or ?client_id=…
curl "https://api.dversum.com/api/v1/projects?archived=false" \
-H "Authorization: Bearer $DVERSUM_TOKEN"/projectsCreate a new project with default kanban columns.
curl -X POST https://api.dversum.com/api/v1/projects \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Q2 Relaunch",
"client_id": "CLIENT_ID",
"color": "#45e59f"
}'/projects/{id}/tasksList all tasks in a project including column + assignee data.
curl https://api.dversum.com/api/v1/projects/PROJECT_ID/tasks \
-H "Authorization: Bearer $DVERSUM_TOKEN"/projects/{id}/statusSet the project status (active / on_hold / archived).
curl -X PATCH https://api.dversum.com/api/v1/projects/PROJECT_ID/status \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "status": "archived" }'Tasks belong to a project + a kanban column. They support tags, attachments, subtasks and comments.
/tasksCreate a task in the given column.
curl -X POST https://api.dversum.com/api/v1/tasks \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Mockup für Landing Page",
"project_id": "PROJECT_ID",
"column_id": "COLUMN_ID",
"due_date": "2026-06-30",
"assignee_ids": ["USER_ID"]
}'/tasks/{id}/moveMove a task to another column (or project).
curl -X PATCH https://api.dversum.com/api/v1/tasks/TASK_ID/move \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "column_id": "TARGET_COLUMN_ID", "position": 0 }'/tasks/{id}/toggle-doneToggle a task as done or open.
curl -X PATCH https://api.dversum.com/api/v1/tasks/TASK_ID/toggle-done \
-H "Authorization: Bearer $DVERSUM_TOKEN"/tasks/{taskId}/commentsPost a comment. Mention `@vero` in the body to have the AI reply inline.
curl -X POST https://api.dversum.com/api/v1/tasks/TASK_ID/comments \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "content": "<p>@vero summarise the thread</p>" }'§14 UStG-compliant invoices with ZUGFeRD XML, dunning workflow, and DATEV export. Amounts in cents (integer).
/invoicesList invoices. Filters: ?status=, ?client_id=, ?from=YYYY-MM-DD&to=YYYY-MM-DD.
curl "https://api.dversum.com/api/v1/invoices?status=sent&from=2026-01-01" \
-H "Authorization: Bearer $DVERSUM_TOKEN"/invoicesCreate an invoice as a draft. The invoice number is assigned and GoBD-locked only when sent.
curl -X POST https://api.dversum.com/api/v1/invoices \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"client_id": "CLIENT_ID",
"issue_date": "2026-06-05",
"due_date": "2026-06-19",
"line_items": [
{ "description": "Beratung", "quantity": 8, "unit_price_cents": 12500, "tax_rate": 19 }
]
}'/invoices/{id}/sendSend the invoice to the client. Locks the document (§14 UStG / GoBD), generates the ZUGFeRD PDF, and fires invoice.sent.
curl -X POST https://api.dversum.com/api/v1/invoices/INVOICE_ID/send \
-H "Authorization: Bearer $DVERSUM_TOKEN"/invoices/{id}/pdfDownload the invoice as a ZUGFeRD PDF/A-3.
curl https://api.dversum.com/api/v1/invoices/INVOICE_ID/pdf \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-o invoice.pdf/invoices/{id}/paymentsRecord a payment (full or partial) on the invoice.
curl -X POST https://api.dversum.com/api/v1/invoices/INVOICE_ID/payments \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "amount_cents": 119000, "paid_at": "2026-06-12", "method": "transfer" }'/invoices/{id}/credit-noteCreate a credit note (GS-) for the invoice — mirrored amounts, ZUGFeRD DocumentTypeCode 381.
curl -X POST https://api.dversum.com/api/v1/invoices/INVOICE_ID/credit-note \
-H "Authorization: Bearer $DVERSUM_TOKEN"Quotes with digital signature and one-click conversion to invoice.
/quotesCreate a new quote.
curl -X POST https://api.dversum.com/api/v1/quotes \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"client_id": "CLIENT_ID",
"valid_until": "2026-07-05",
"line_items": [
{ "description": "Webdesign", "quantity": 1, "unit_price_cents": 350000, "tax_rate": 19 }
]
}'/quotes/{id}/sendSend the quote by email including a signing link.
curl -X POST https://api.dversum.com/api/v1/quotes/QUOTE_ID/send \
-H "Authorization: Bearer $DVERSUM_TOKEN"/quotes/{id}/convert-to-invoiceConvert a signed quote to an invoice.
curl -X POST https://api.dversum.com/api/v1/quotes/QUOTE_ID/convert-to-invoice \
-H "Authorization: Bearer $DVERSUM_TOKEN"Time tracking per task or project. Use the timer or post bulk entries — both produce the same data shape.
/time-entries/startStart a timer for the given task.
curl -X POST https://api.dversum.com/api/v1/time-entries/start \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "task_id": "TASK_ID", "description": "Mockup feedback" }'/time-entries/{id}/stopStop the running timer.
curl -X POST https://api.dversum.com/api/v1/time-entries/TIME_ENTRY_ID/stop \
-H "Authorization: Bearer $DVERSUM_TOKEN"/time-entriesCreate a time entry after the fact.
curl -X POST https://api.dversum.com/api/v1/time-entries \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task_id": "TASK_ID",
"started_at": "2026-06-04T09:00:00Z",
"ended_at": "2026-06-04T11:30:00Z",
"billable": true
}'Calendar events with optional Google Meet attach. Created events can sync to Google Calendar automatically.
/calendar/eventsList events in a window (?from=…&to=… as ISO 8601).
curl "https://api.dversum.com/api/v1/calendar/events?from=2026-06-01T00:00:00Z&to=2026-06-30T23:59:59Z" \
-H "Authorization: Bearer $DVERSUM_TOKEN"/calendar/eventsCreate an event. Set attach_meet=true to provision a Google Meet link.
curl -X POST https://api.dversum.com/api/v1/calendar/events \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Kickoff",
"start_time": "2026-06-12T10:00:00Z",
"end_time": "2026-06-12T11:00:00Z",
"attach_meet": true,
"attendee_emails": ["client@example.com"]
}'Notion-style Tiptap pages with a nested hierarchy. Markdown content is converted to ProseMirror server-side — tables included.
/pagesCreate a new page with optional markdown content.
curl -X POST https://api.dversum.com/api/v1/pages \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Q2 Analyse",
"icon": "📊",
"content": "# Q2 Analyse\n\n| Metrik | Wert |\n|---|---|\n| Revenue | 41.804 € |"
}'/pages/{id}/contentReplace the page content with markdown (or ProseMirror JSON).
curl -X PUT https://api.dversum.com/api/v1/pages/PAGE_ID/content \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "content": "## Updated section\n\nNeuer Text" }'/pages/treeGet the full page tree as a nested list.
curl https://api.dversum.com/api/v1/pages/tree \
-H "Authorization: Bearer $DVERSUM_TOKEN"S3-backed file storage with folder hierarchy and WeTransfer-style share links.
/storage/filesUpload a file (multipart/form-data, max 100 MB).
curl -X POST https://api.dversum.com/api/v1/storage/files \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-F "file=@./report.pdf" \
-F "folder_id=FOLDER_ID"/storage/files/{id}/downloadGet a presigned S3 URL (valid 5 min) to download the file.
curl https://api.dversum.com/api/v1/storage/files/FILE_ID/download \
-H "Authorization: Bearer $DVERSUM_TOKEN"/storage/shares/{fileId}Create a public share link with optional password and expiry.
curl -X POST https://api.dversum.com/api/v1/storage/shares/FILE_ID \
-H "Authorization: Bearer $DVERSUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "password": "geheim", "expires_at": "2026-07-01T00:00:00Z", "max_downloads": 10 }'Cal.com-style public booking page per user. Booking endpoints are unauthenticated and return the available slot pool.
/public/booking/{user_slug}/{type_slug}Get event type metadata (name, duration, description).
curl https://api.dversum.com/api/v1/public/booking/admin/termin-mit-naumche/public/booking/{user_slug}/{type_slug}/slotsCompute available slots in window (?from=…&to=… RFC 3339, max 90 days).
curl "https://api.dversum.com/api/v1/public/booking/admin/termin-mit-naumche/slots?from=2026-06-04T00:00:00Z&to=2026-06-11T00:00:00Z"/public/booking/{user_slug}/{type_slug}/bookBook a slot — sends confirmation mail to guest + host and creates the calendar event.
curl -X POST https://api.dversum.com/api/v1/public/booking/admin/termin-mit-naumche/book \
-H "Content-Type: application/json" \
-d '{
"start": "2026-06-05T09:00:00Z",
"name": "Max Mustermann",
"email": "max@example.com",
"agenda": "Kurzes Intro-Gespräch",
"timezone": "Europe/Berlin"
}'Model Context Protocol for Claude Desktop, Cursor and other AI clients. 100+ tools for CRUD across all core resources.
npx -y @dversum/mcp-serverdVersum Companion — universal element picker for Chrome/Edge. Saves web content as tasks.
Chrome Web Store →Complete collection of every endpoint with predefined variables. Coming soon.
Coming soonMachine-readable spec — generate clients for TypeScript, Python, Go. Coming soon.
Coming soonIncoming webhooks from n8n (or any automation platform). Per-webhook permissions are fine-grained.
Setup guide →Works today via the webhook trigger. Native app connector follows.
Coming soonMissing an endpoint? Response shape off? Tell us — we reply in days, not weeks.