Skip to content

Reference

GovStack building blocks

nexxus offers two GovStack building blocks through their GovStack APIs. Digital Registries runs on the records of installed packages, Messaging on the outgoing mail queue. This page explains what each one maps to, how to call it, where nexxus departs from the templates, and which building blocks it does not cover.

For
AdminsDevelopers
Time
20 min
You need
A personal API token, and the rights of the building block you call

GovStack describes digital government services as a set of building blocks: a registry, messaging, a workflow engine, identity, payments and more. Each building block has a specification with an API, so a ministry can combine products from different vendors and swap one without rewriting the service.

nexxus implements two building blocks with the APIs of their GovStack templates. They sit on top of what nexxus already has, so there is nothing to install: every nexxus instance answers under /api/govstack.

  1. API token

    A GovStack client calls with a personal API token.

  2. Same rights

    nexxus checks the rights of the token's owner, as in the app.

  3. Building block

    Registries or Messaging answer in the GovStack format.

A GovStack call is an ordinary nexxus API call with GovStack paths and bodies.
Building blockIn nexxusBase path
Digital RegistriesThe records of installed packages: every entity of a package is a registry/api/govstack/registries
MessagingE-mail through the outgoing mail queue/api/govstack/messaging

nexxus does not offer these building blocks as GovStack APIs:

Building blockWhy, and what nexxus has instead
Identitynexxus is an OpenID Connect provider for other applications, but has no identity register and no GovStack Identity API.
ConsentNo consent register. Packages can ask for consent in their forms and keep it with the record.
RegistrationNo GovStack Registration API. Packages can publish forms with personal links and a portal.
SchedulerNo appointment or event API.
WorkflowNo process engine. The workflow module and its GovStack Workflow API were removed in November 2026. To be told when records meet your conditions, set up a notification rule under My profile › Rules.
Information MediatorNot part of nexxus. Put an X-Road security server in front if your services talk through one. nexxus accepts the Information-Mediator-Client header and does not require it.
E-Signature, Payments, Wallet, GIS, E-Marketplace, Cloud InfrastructureNot offered. nexxus has maps for packages, but no GovStack GIS API.
  • A personal API token of the account the client acts as. See Personal API tokens. The token has exactly the rights of its owner: a GovStack client never sees or changes more than that person could in the app.
  • The rights of the building block:
Building blockReadingWriting
Digital Registries<package>.<entity>.read, e.g. curiaos.kanzlei.akte.read<package>.<entity>.write
Messagingcommunication.email.read (status)communication.email.send (sending)

communication.email.send is a key of its own, shown as Send new e-mails (API) under Emails in the role editor. Nothing else in nexxus lets a person write a new mail to any address, so only administrators hold it until a role grants it.

Send the token as Authorization: Bearer cx_.... The GovStack templates name the header differently, so the GovStack routes also take Authorization: cx_... and apiKey: cx_....

Terminal window
# Which building blocks this nexxus offers, with links to the API definitions used
curl -H "Authorization: Bearer cx_..." https://<your nexxus address>/api/govstack

A registry is an entity of an installed package. Its name is <package>.<entity>, for example curiaos.kanzlei.akte for the case files of CuriaOS. Its version is the installed version of the package: GovStack keeps schema and API version in step, and in nexxus a schema only changes when a new package version is installed. The routes follow the data and database API templates 1.3.0 of the building block.

nexxus builds the schemas from the package manifest. GET /api/govstack/registries/openapi.json returns an OpenAPI 3.1 document with concrete paths and a JSON Schema for every registry you may read: choice fields list their keys as enum, references say what they point at.

A record is its fields plus five envelope keys. Field keys never start with $, so the two cannot collide.

{
"$id": 61,
"$title": "2026/0206",
"$version": 1,
"$createdAt": "2026-10-20T07:08:31.104Z",
"$updatedAt": "2026-10-20T07:08:44.927Z",
"betreff": "Rear-end collision B 15",
"status": "in_bearbeitung",
"mandant": 9
}
KeyMeaning
$idRecord id. Use it in paths (/{id}/delete) and in queries.
$titleDisplay name, as the app shows it.
$versionVersion of the record. Send it back in write.content and nexxus refuses the change with a conflict when someone changed the record in between.
$createdAt, $updatedAtTimes in UTC.

nexxus ignores envelope keys in what you write, except $version.

All paths start with /api/govstack/registries. {r} is the registry name, {v} its installed version.

MethodPathWhat it does
GET/databasesEvery registry you may read, grouped by package, with schema and routes.
GET/database/{id}One registry, by its numeric id or its name.
GET/openapi.jsonThe OpenAPI 3.1 document of your registries.
GET/data/{r}/{v}A page of records. See Listing.
POST/data/{r}/{v}/createCreates a record from write.content.
POST/data/{r}/{v}/readThe one record query.content matches.
POST/data/{r}/{v}/existsWhether a record matches query.content.
PUT/data/{r}/{v}/updateChanges the fields in write.content on the one record query.content matches.
PUT/data/{r}/{v}/updateEntriesChanges every record the query matches, at most 1,000, all or none.
POST/data/{r}/{v}/updateOrCreateChanges the one record the query matches, or creates it from write.content.
DELETE/data/{r}/{v}/{id}/deleteDeletes the record.
GET/data/{r}/{v}/{id}/readValue/{field}.{ext}One field as a file. A document field returns the document; any other field json or txt.

query.content names fields and their exact values. All of them must hold.

Terminal window
curl -X POST https://<your nexxus address>/api/govstack/registries/data/curiaos.kanzlei.akte/1.1.0/read \
-H "Authorization: Bearer cx_..." -H "Content-Type: application/json" \
-d '{"query": {"content": {"aktenzeichen": "2026/0192"}}}'
  • Any field can be queried, not only the ones a package marks as indexed.
  • $id picks a record by its id.
  • A list field matches when it holds the value.
  • read, update and updateOrCreate need exactly one match. Several matches are a problem of type ambiguous-query with the number in count, never a silent pick of the first.

GET /data/{r}/{v} returns count, next and previous (links to the neighbouring pages, or null) and results.

ParameterMeaning
searchFree-text search over the registry’s search fields, as the search box in the app.
query.<field>Exact value of a field. Repeat for more fields.
filter, orderingSorting, as the template names it: filter is the field, ordering is ascending or descending. ordering alone takes a field with an optional leading - (-$updatedAt). Sorting needs an indexed field, $id, $createdAt or $updatedAt.
pagePage number, from 1.
pageSizeRecords per page, 1 to 200. Default 10.
  • Schemas come from signed packages. POST /database/modify and DELETE /database/{id} answer not-supported: install or upgrade the package under AdministrationOperationsModules, tab Packages, instead.
  • GET /data/mypersonalDataUsage answers not-supported. nexxus does not log who read a record. Changes are in the audit log.
  • GET /databases returns a list of groups, one per package, each with its databases.
  • Deleting is a soft delete, as everywhere in nexxus.

The Messaging routes follow the e-mail part of the GovStack Messaging API. All paths start with /api/govstack/messaging.

MethodPathWhat it does
POST/send/email/singleQueues one mail. Answers with a requestUID.
POST/send/email/batchQueues one mail per recipient of recipientInfo.batchEmailAsBase64, at most 1,000, under one requestUID. nexxus checks every recipient before it queues the first.
GET/status/emailCounts the mails of a request by state. Header requestUid, optional status to pick states.
Terminal window
curl -X POST https://<your nexxus address>/api/govstack/messaging/send/email/single \
-H "Authorization: Bearer cx_..." -H "Content-Type: application/json" \
-d '{"senderInfo": {"replyTo": "office@example.org"},
"recipientInfo": {"email": "citizen@example.org"},
"emailContent": {"encoding": "UTF-8", "title": "Your application", "content": "Hello,\nyour application has arrived."}}'

What nexxus does with a request:

  • From is always the tenant’s sender address, the one entered for the outgoing mail server during setup. senderInfo.replyTo, or else senderInfo.email, becomes the Reply-To. A GovStack client cannot send in someone else’s name.
  • emailContent.content is plain text. nexxus escapes it for the HTML part, so it cannot carry links or markup. Line breaks stay.
  • emailContent.title is one line of at most 998 characters, the content at most 100,000 characters. Only UTF-8 is accepted.
  • Every address is a single address. emailCC and emailBCC take one each.
  • callback.uri is ignored. Ask /status/email instead.
GovStack stateIn nexxus
scheduledIn the queue, not tried yet. Without an outgoing mail server, mails stay here.
deferredIn the queue after a failed try, or paused.
deliveredAccepted by the outgoing mail server. nexxus learns nothing after that.
notSentGiven up after the last try, or failed for good.
processing, bouncedAlways 0. nexxus sends each mail in one step and does not see bounces.

POST /callback/email answers not-supported. Replies reach nexxus as inbound mail of a mailbox.

Every error of the GovStack routes is a problem details document as in RFC 9457, with the media type application/problem+json. Branch on type. detail explains the case for a person, and errors names the fields that caused it. These texts come from the platform and can be German; the type and the keys of errors never change with the language.

{
"type": "https://nexxus-ai.systaro.de/docs/reference/govstack/#problem-version-not-installed",
"title": "This registry version is not installed",
"status": 404,
"detail": "Registry 'curiaos.kanzlei.akte' is installed at version 1.1.0, not 1.0.0.",
"instance": "/api/govstack/registries/data/curiaos.kanzlei.akte/1.0.0",
"installedVersion": "1.1.0"
}
TypeStatusWhen
validation400The request breaks a rule: a missing or unknown field, a value that does not fit, an address that is no single address.
forbidden403The token’s owner lacks the right.
not-found404No such registry, record or request. read answers no record found.
version-not-installed404The path names another version than the installed one. installedVersion says which is.
conflict409$version is outdated.
ambiguous-query409The query matches more than one record. count says how many.
unique409A value that must be unique is taken. errors names the field.
not-supported501nexxus does not offer this route. detail says what to do instead.
internal500Something failed on the server. The server log has the details.

A missing or invalid token is refused before the GovStack routes, with status 401 and the JSON of the sign-in layer, not a problem document.