Appearance
Persmonitor GraphQL API – volledige specificatie (voor AI/LLM)
Deze pagina bevat de volledige API-specificatie in één document. Geschikt voor AI-assistenten en LLMs: één URL, geen navigatie nodig.
Endpoint: POST https://graphql.persmonitor.nl/graphql
Body: JSON met query (verplicht) en optioneel variables. Voor login / logout / sessionValid / me / refreshToken: header Authorization: Bearer <token> (token uit login of refreshToken).
1. Algemeen
- Method: POST
- URL: https://graphql.persmonitor.nl/graphql
- Content-Type: application/json
- Body:
{ "query": "<GraphQL document>", "variables": { ... } }—variablesis optioneel. - Authenticatie: Voor beveiligde operaties: header Authorization: Bearer <token>. Token krijg je via de
login-mutatie (ofrefreshTokenom te verlengen). De API zet geen cookie; de client slaat de token op.
Voorbeeld (curl):
bash
curl -X POST https://graphql.persmonitor.nl/graphql \
-H "Content-Type: application/json" \
-d '{"query":"query { __typename }"}'2. Queries
2.1 sessionValid
Of de token nog geldig is. Geen argumenten. Header: Authorization: Bearer <token>. Response: Boolean! — true of false.
graphql
query SessionValid { sessionValid }2.2 me
Huidige gebruiker op basis van token. Geen argumenten. Header: Authorization: Bearer <token>. Zonder of met ongeldige token: me is null. isAdmin is true voor admin-accounts.
graphql
query Me {
me {
uuid displayName created changed
email { address verified }
hasPassword
isAdmin
}
}2.3 mySessions
Alle sessies van de huidige gebruiker. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query MySessions { mySessions { uuid ipAddress userAgent lastActivityAt expiresAt isCurrent } }2.4 currentEnvironment
Huidige environment van de sessie. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query CurrentEnvironment { currentEnvironment { uuid name organization { uuid name } } }2.5 myOrganizations
Alle organisaties waar de gebruiker lid van is. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query MyOrganizations { myOrganizations { uuid name environments { uuid name organization { name } } } }2.6 channels
Alle kanalen (e-mail, SMS, webhook, etc.) voor het huidige environment. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query Channels { channels { uuid type name emailAddress url headers { name value } } }2.6b monitors
Alle P2000-monitoren voor het huidige environment. Header: Authorization: Bearer <token>. Geen argumenten. Velden query, channels, notificationRules zijn JSON-strings.
graphql
query Monitors { monitors { uuid name description active type query location locationMode radius channels notificationRules created changed } }2.6c monitor
Eén monitor op UUID. Argument: uuid (String!, verplicht).
graphql
query Monitor($uuid: String!) { monitor(uuid: $uuid) { uuid name description active type query location locationMode radius channels notificationRules created changed } }2.7 apiTokens
Alle API-tokens voor het huidige environment. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query ApiTokens { apiTokens { uuid name tokenPreview scopes expiresAt created } }2.8 apiToken
Eén API-token op UUID. Argument: uuid (String!, verplicht).
graphql
query ApiToken($uuid: String!) { apiToken(uuid: $uuid) { uuid name tokenPreview scopes expiresAt created } }2.9 apiScopes
Alle beschikbare scopes voor API-tokens. Header: Authorization: Bearer <token>. Geen argumenten.
graphql
query ApiScopes { apiScopes { name description } }2.10 p2000Messages
Lijst P2000-berichten. Paginering: first (default 10), page (default 1). Optioneel filter: filter (type P2000MessageFilterInput).
P2000MessageFilterInput: sended (object met from en to, beide ISO-8601 verplicht), capcodes (array van capcode-UUIDs). Beide velden optioneel.
GraphQL:
graphql
query GetP2000Messages($first: Int, $page: Int, $filter: P2000MessageFilterInput) {
p2000Messages(first: $first, page: $page, filter: $filter) {
uuid
message
sended
created
changed
capcodes { uuid name }
}
}Variabelen (voorbeeld):
json
{
"first": 10,
"page": 1,
"filter": {
"sended": { "from": "2025-01-01T00:00:00Z", "to": "2025-12-31T23:59:59Z" },
"capcodes": ["uuid-1", "uuid-2"]
}
}2.11 p2000Message
Eén P2000-bericht op UUID. Argument: uuid (String!, verplicht).
graphql
query GetP2000Message($uuid: String!) {
p2000Message(uuid: $uuid) {
uuid message sended created changed
capcodes { uuid name }
}
}Variabelen: { "uuid": "<bericht-uuid>" }
2.5 p2000Capcodes
Lijst P2000-capcodes. Paginering: first, page. Optioneel filter: filter (type P2000CapcodeFilterInput).
P2000CapcodeFilterInput: sended (object met from en to, ISO-8601), capcodes (array van UUIDs). Beide optioneel.
graphql
query GetP2000Capcodes($first: Int, $page: Int, $filter: P2000CapcodeFilterInput) {
p2000Capcodes(first: $first, page: $page, filter: $filter) {
uuid name created changed
discipline { uuid name }
}
}Variabelen (voorbeeld): { "first": 20, "page": 1, "filter": { "sended": { "from": "2025-01-01T00:00:00Z", "to": "2025-12-31T23:59:59Z" } } }
2.13 p2000Capcode
Eén P2000-capcode op UUID. Argument: uuid (String!, verplicht).
graphql
query GetP2000Capcode($uuid: String!) {
p2000Capcode(uuid: $uuid) {
uuid name created changed discipline { uuid name }
}
}Variabelen: { "uuid": "<capcode-uuid>" }
2.14 knmiGeneral (landelijk, 112Hub homepage)
Landelijke KNMI-waarschuwingen (één request voor de homepage). Geen authenticatie. Null als nog geen data (sync nog niet gedraaid). Zelfde velden als een regio-detail: code, name, statusCode, status, warnings met periodes.
graphql
query KnmiGeneral {
knmiGeneral {
regionCode
name
statusCode
status { description }
warnings { icon label periods { description status_code from to } }
}
}2.15 knmiRegions (overzicht regio’s)
Lijst van alle KNMI-regio’s (12 provincies) met actuele status. Geen authenticatie vereist. Elk regio is een losse node; data komt uit Neo4j (sync elke 5 min).
graphql
query KnmiRegions {
knmiRegions {
uuid
code
name
statusCode
status { description }
}
}2.16 knmiRegionDetail (detailpagina 112Hub)
Volledige KNMI-detail voor één regio: waarschuwingen met periodes (van–tot, beschrijving). Argument: code (String!, regiocode zoals noord-holland, limburg). Null als code onbekend of nog geen data.
graphql
query KnmiRegionDetail($code: String!) {
knmiRegionDetail(code: $code) {
regionCode
name
statusCode
status { description }
warnings {
icon
label
periods { description status_code from to }
}
}
}Variabelen: { "code": "noord-holland" }
2.17 knmiRegionDetails (alle regio’s met volledige detail)
Alle KNMI-regio’s met dezelfde velden als knmiRegionDetail (waarschuwingen, periodes). Handig voor één call als je alle detailpagina-data nodig hebt.
graphql
query KnmiRegionDetails {
knmiRegionDetails {
regionCode
name
statusCode
status { description }
warnings { icon label periods { description status_code from to } }
}
}3. Mutations
3.1 register
Maakt organisatie, environment en user in één keer. Input: RegisterInput! — velden: email (verplicht), password (optioneel), organizationName, environmentName, displayName (alle optioneel).
graphql
mutation Register($input: RegisterInput!) {
register(input: $input) {
user { uuid displayName created email { address verified } hasPassword }
organization { uuid name }
environment { uuid name }
}
}Variabelen (minimaal): { "input": { "email": "[email protected]" } }
Met wachtwoord: { "input": { "email": "[email protected]", "password": "secret" } }
Volledig: { "input": { "email": "...", "password": "...", "organizationName": "...", "environmentName": "default", "displayName": "..." } }
3.2 login
Log in met e-mail en wachtwoord. Input: LoginInput! — velden email, password. Bij succes: token (access token), refreshToken en user. De API zet geen cookie; client slaat tokens op en stuurt access token mee als Authorization: Bearer <token>. Vereist een API-token met scope auth:login in de header (voor de monitor-app).
graphql
mutation Login($input: LoginInput!) {
login(input: $input) {
user { uuid displayName created email { address verified } hasPassword }
token
refreshToken
message
}
}Variabelen: { "input": { "email": "[email protected]", "password": "secret" } }
Fout (verkeerde gegevens): "These credentials do not match our records."
3.3 logout
Token ongeldig maken. Geen argumenten. Header: Authorization: Bearer <token>. Response: string "Logged out.".
Geen token: "Not authenticated. Send Authorization: Bearer <token>."
graphql
mutation Logout { logout }3.4 refreshToken
Nieuwe access + refresh tokens. Stuur de refresh token in de header Authorization: Bearer <refresh_token>. De oude refresh token wordt ongeldig (rotation). Response: object met accessToken en refreshToken. Handig voor heartbeat/sessie-verlenging.
graphql
mutation RefreshToken {
refreshToken {
accessToken
refreshToken
}
}3.5 createOrganization
Input: CreateOrganizationInput! — veld name.
graphql
mutation CreateOrganization($input: CreateOrganizationInput!) {
createOrganization(input: $input) { uuid name created changed }
}Variabelen: { "input": { "name": "Mijn Bedrijf" } }
3.6 createEnvironment
Input: CreateEnvironmentInput! — velden organizationUuid, name.
graphql
mutation CreateEnvironment($input: CreateEnvironmentInput!) {
createEnvironment(input: $input) {
uuid name created changed organization { uuid name }
}
}Variabelen: { "input": { "organizationUuid": "<org-uuid>", "name": "production" } }
3.7 deleteSession
Beëindigt één sessie. Argument: uuid (String!, sessie-UUID). Header: Authorization: Bearer <token>.
graphql
mutation DeleteSession($uuid: String!) { deleteSession(uuid: $uuid) }3.8 deleteOtherSessions
Beëindigt alle andere sessies behalve de huidige. Geen argumenten. Header: Authorization: Bearer <token>.
graphql
mutation DeleteOtherSessions { deleteOtherSessions }3.9 setCurrentEnvironment
Koppelt environment aan sessie. Argument: environmentUuid (String!). Header: Authorization: Bearer <token>.
graphql
mutation SetCurrentEnvironment($environmentUuid: String!) {
setCurrentEnvironment(environmentUuid: $environmentUuid) { uuid name }
}3.10 switchEnvironment
Wisselt naar ander environment; nieuwe access + refresh tokens. Argument: environmentUuid (String!). Header: Authorization: Bearer <token>.
graphql
mutation SwitchEnvironment($environmentUuid: String!) {
switchEnvironment(environmentUuid: $environmentUuid) {
accessToken refreshToken environment { uuid name }
}
}3.11 updateOrganization
Werk organisatie bij. Input: UpdateOrganizationInput! — velden uuid, name. Header: Authorization: Bearer <token>.
graphql
mutation UpdateOrganization($input: UpdateOrganizationInput!) {
updateOrganization(input: $input) { uuid name created changed }
}3.12 createApiToken
Maak API-token voor huidige environment. Input: CreateApiTokenInput! — velden name, scopes ([String]), optioneel validDays. Response bevat token en plainToken (alleen bij aanmaken). Header: Authorization: Bearer <token>.
graphql
mutation CreateApiToken($input: CreateApiTokenInput!) {
createApiToken(input: $input) {
token { uuid name tokenPreview scopes expiresAt created }
plainToken
}
}3.13 updateApiToken
Werk API-token bij. Argumenten: uuid (String!), optioneel name, scopes. Header: Authorization: Bearer <token>.
graphql
mutation UpdateApiToken($uuid: String!, $name: String, $scopes: [String]) {
updateApiToken(uuid: $uuid, name: $name, scopes: $scopes) {
uuid name tokenPreview scopes expiresAt created
}
}3.14 deleteApiToken
Trek API-token in. Argument: uuid (String!). Header: Authorization: Bearer <token>.
graphql
mutation DeleteApiToken($uuid: String!) { deleteApiToken(uuid: $uuid) }3.15 createChannel
Maak kanaal (e-mail, SMS, webhook, etc.). Input: CreateChannelInput! — velden type, name, type-specifieke velden. Header: Authorization: Bearer <token>.
3.16 deleteChannel
Verwijder kanaal. Argument: uuid (String!). Header: Authorization: Bearer <token>.
graphql
mutation DeleteChannel($uuid: String!) { deleteChannel(uuid: $uuid) }3.16b createMonitor
Maak P2000-monitor. Input: CreateMonitorInput! — velden name (verplicht), description, active, type, query (JSON), location, locationMode, locationLiveSourceId, radius, channels (JSON), notificationRules (JSON). Header: Authorization: Bearer <token>.
3.16c updateMonitor
Werk monitor bij. Input: UpdateMonitorInput! — veld uuid (verplicht) + optionele velden. Header: Authorization: Bearer <token>.
3.16d deleteMonitor
Verwijder monitor. Argument: uuid (String!). Header: Authorization: Bearer <token>.
graphql
mutation DeleteMonitor($uuid: String!) { deleteMonitor(uuid: $uuid) }3.17 requestPasswordReset
Vraag wachtwoord-reset aan. Argument: email (String!). Vereist API-token met scope auth:password_reset.
graphql
mutation RequestPasswordReset($email: String!) { requestPasswordReset(email: $email) }3.18 resetPassword
Wijzig wachtwoord met token uit reset-e-mail. Argumenten: token (String!), newPassword (String!). Geen authenticatie vereist.
graphql
mutation ResetPassword($token: String!, $newPassword: String!) {
resetPassword(token: $token, newPassword: $newPassword)
}3.19 createP2000Message
Input: CreateP2000MessageInput! — velden: message, sended (ISO-8601), optioneel capcodes (array van objecten met name).
graphql
mutation CreateP2000Message($input: CreateP2000MessageInput!) {
createP2000Message(input: $input) {
uuid message sended created capcodes { uuid name }
}
}Variabelen: { "input": { "message": "A1 DIA ...", "sended": "2025-10-09T14:30:00Z", "capcodes": [{ "name": "0100001" }] } }
4. Filtertypes (samenvatting)
- DateRangeInput:
from(DateTime!, ISO-8601),to(DateTime!, ISO-8601). - P2000MessageFilterInput:
sended(DateRangeInput),capcodes([String]). Voor query p2000Messages. - P2000CapcodeFilterInput:
sended(DateRangeInput),capcodes([String]). Voor query p2000Capcodes.
5. Overzicht operaties
| Type | Operaties |
|---|---|
| Queries | sessionValid, me, mySessions, currentEnvironment, myOrganizations, channels, monitors, monitor, apiTokens, apiToken, apiScopes, p2000Messages, p2000Message, p2000Capcodes, p2000Capcode |
| Mutations | register, login, logout, refreshToken, deleteSession, deleteOtherSessions, setCurrentEnvironment, switchEnvironment, createOrganization, updateOrganization, createEnvironment, createApiToken, updateApiToken, deleteApiToken, createChannel, deleteChannel, createMonitor, updateMonitor, deleteMonitor, requestPasswordReset, resetPassword, createP2000Message |
Alle requests: POST https://graphql.persmonitor.nl/graphql met JSON body { "query": "...", "variables": { ... } }.