Het schema

Hieronder staat het volledige schema van versie 2026-10. Introspectie staat aan, dus je kunt het ook rechtstreeks uit de API halen. Dat is de betrouwbaarste bron, want die loopt per definitie gelijk met wat er draait.

Zelf ophalen

Elke GraphQL-tool kan het schema ophalen zolang je je sleutel meestuurt. Handig voor codegeneratie, voor aanvulling in je editor, en om te zien wat er in een nieuwe versie is veranderd.

In Postman: open een request, klik bij de body op Refresh naast "GraphQL" en kies het endpoint.

Introspectie

npx get-graphql-schema \
  --header "X-Rouwkaart-Access-Token={access_token}" \
  https://memoriam.rouwkaart-online.nl/partner/api/2026-10/graphql \
  > schema.graphql

Versies

Het pad draagt een datumversie: /partner/api/2026-10/graphql. Een nieuwe versie komt ernaast te staan en zet de oude niet stop; je migreert op je eigen moment door het pad te wijzigen. Een versie die wij niet kennen geeft 404 met daarin welke versies er wél zijn.

Het volledige schema

"""
Een datum en tijd volgens ISO 8601, altijd met tijdzone.
Bijvoorbeeld: "2026-09-25T10:00:00.000Z".
"""
scalar DateTime

"""Een datum zonder tijd volgens ISO 8601. Bijvoorbeeld: "1940-05-01"."""
scalar Date

"""Een adres met http- of https-schema."""
scalar URL

"""Een object dat op zijn globale id is op te zoeken."""
interface Node {
  """Het globale id van dit object."""
  id: ID!
}

"""Een fout die aan de gebruiker getoond kan worden."""
interface DisplayableError {
  """Het pad naar het veld waar het misging, van buiten naar binnen."""
  field: [String!]

  """Wat er misging, in het Nederlands."""
  message: String!
}

"""Waar de vorige en volgende pagina beginnen."""
type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
  endCursor: String
}

"""Een afbeelding."""
type Image {
  url: URL!

  """Alternatieve tekst, als die in de admin is ingevuld."""
  altText: String
}

"""Een video."""
type Video {
  url: URL!
}

"""De vormgeving van een rouwkaart: kleuren, beelden en typografie."""
type Theme implements Node {
  id: ID!

  """
  Het kale nummer zoals het in onze administratie zichtbaar is. Handig om naar
  te verwijzen in gesprekken met ons; gebruik voor de API het globale id.
  """
  legacyResourceId: String!
  title: String!
  handle: String!
  description: String!
  images: [Image!]!
  videos: [Video!]!

  """
  Een ingerichte voorbeeldkaart in dit thema, of null wanneer die er niet is.
  """
  demoUrl: URL
}

type ThemeEdge {
  cursor: String!
  node: Theme!
}

type ThemeConnection {
  edges: [ThemeEdge!]!
  nodes: [Theme!]!
  pageInfo: PageInfo!
}

"""Waar een kaart in zijn leven staat."""
enum CardStatus {
  """In bewerking. De openbare pagina bestaat nog niet."""
  DRAFT

  """Besteld, maar nog niet live."""
  ORDERED

  """De openbare kaart staat online."""
  ACTIVE
}

"""De overledene."""
type Deceased {
  firstName: String
  lastName: String
  dateOfBirth: Date
  dateOfDeath: Date

  """
  De portretfoto in onze eigen opslag. Bij het aanmaken geef je het adres op
  waar wij hem mogen ophalen; hierna is dit onze kopie.
  """
  photoUrl: URL
}

"""Het contact binnen de familie."""
type FamilyContact {
  name: String

  """
  Het adres waarop de bestelling komt te staan, met de links naar de kaart en
  de genodigdenlijst.
  """
  email: String
}

"""Een online rouwkaart."""
type Card implements Node {
  id: ID!

  """
  Het gekozen thema, of null wanneer de familie nog moet kiezen. Wordt alleen
  opgehaald wanneer je er velden van opvraagt.
  """
  theme: Theme

  """Het dossiernummer aan jouw kant. Ligt vast na het aanmaken."""
  externalDossierId: String

  """Welke uitvaartondernemer het dossier voert. Alleen om terug te vinden."""
  externalFuneralDirectorId: String
  deceased: Deceased!
  livestreamUrl: URL
  familyContact: FamilyContact!
  status: CardStatus!

  """
  De openbare link naar de kaart. Alleen gevuld zodra de status ACTIVE is.
  """
  cardUrl: URL

  """
  Aangemaakt met een testsleutel: geen post naar echte families, telt nergens mee.
  """
  test: Boolean!
  createdAt: DateTime!
  updatedAt: DateTime!
}

input DeceasedInput {
  firstName: String
  lastName: String
  dateOfBirth: Date
  dateOfDeath: Date

  """
  Het adres waar wij de portretfoto mogen ophalen. Wij slaan hem zelf op,
  zodat de kaart blijft werken los van jouw systeem. Is het adres niet
  bereikbaar, dan mislukt de hele mutatie en ontstaat er geen halve kaart.
  """
  photoUrl: URL
}

input FamilyContactInput {
  name: String
  email: String
}

input CardCreateInput {
  """
  Laat dit weg als de familie zelf mag kiezen: de customiser opent dan met een
  korte wizard voor thema, opzet en zichtbaarheid.
  """
  themeId: ID

  """Verplicht en uniek binnen jouw partneraccount."""
  externalDossierId: String!
  externalFuneralDirectorId: String
  deceased: DeceasedInput
  livestreamUrl: URL
  familyContact: FamilyContactInput
}

"""
Alleen de velden die je meestuurt veranderen. Stuur expliciet null om een veld
te wissen.

`externalDossierId` staat hier niet in: dat ligt vast na het aanmaken.
"""
input CardUpdateInput {
  """Ligt vast zodra er besteld is; de bestelling hangt aan dat product."""
  themeId: ID
  externalFuneralDirectorId: String
  deceased: DeceasedInput
  livestreamUrl: URL
  familyContact: FamilyContactInput
}

enum CardUserErrorCode {
  """Een verplicht veld ontbreekt."""
  BLANK

  """De waarde klopt niet."""
  INVALID

  """Deze waarde is al in gebruik."""
  TAKEN

  """Bestaat niet, of niet voor jou."""
  NOT_FOUND

  """Kan op dit moment niet meer gewijzigd worden."""
  IMMUTABLE

  """Het verzoek klopt, maar kon niet worden uitgevoerd."""
  UNPROCESSABLE
}

type CardUserError implements DisplayableError {
  field: [String!]
  message: String!
  code: CardUserErrorCode
}

type CardCreatePayload {
  card: Card
  userErrors: [CardUserError!]!
}

type CardUpdatePayload {
  card: Card
  userErrors: [CardUserError!]!
}

"""Welk onderdeel een sessielink opent."""
enum CardSessionTarget {
  """De omgeving waarin de kaart wordt ingevuld en besteld."""
  CUSTOMIZER

  """De lijst met genodigden en wie de kaart heeft gezien."""
  INVITEE_LIST
}

"""
Een eenmalige link naar onze omgeving.

Sla hem nergens op: hij is tien minuten geldig en werkt precies één keer.
Vraag er een aan op het moment dat iemand klikt.
"""
type CardSession {
  url: URL!
  target: CardSessionTarget!
  expiresAt: DateTime!
}

type CardSessionCreatePayload {
  cardSession: CardSession
  userErrors: [CardUserError!]!
}

enum WebhookSubscriptionTopic {
  """Een kaart is aangemaakt."""
  CARDS_CREATE

  """Een kaart is gewijzigd."""
  CARDS_UPDATE

  """Een kaart is besteld."""
  CARDS_ORDERED

  """De openbare kaart staat online."""
  CARDS_ACTIVATED
}

enum WebhookSubscriptionFormat {
  JSON
}

"""Een adres waar wij meldingen naartoe sturen."""
type WebhookHttpEndpoint {
  callbackUrl: URL!
}

union WebhookSubscriptionEndpoint = WebhookHttpEndpoint

type WebhookSubscription implements Node {
  id: ID!
  topic: WebhookSubscriptionTopic!
  endpoint: WebhookSubscriptionEndpoint!
  format: WebhookSubscriptionFormat!
  createdAt: DateTime!
  updatedAt: DateTime!
}

type WebhookSubscriptionEdge {
  cursor: String!
  node: WebhookSubscription!
}

type WebhookSubscriptionConnection {
  edges: [WebhookSubscriptionEdge!]!
  nodes: [WebhookSubscription!]!
  pageInfo: PageInfo!
}

input WebhookSubscriptionInput {
  """Moet een openbaar https-adres zijn."""
  callbackUrl: URL!
  format: WebhookSubscriptionFormat = JSON
}

enum WebhookSubscriptionUserErrorCode {
  BLANK
  INVALID
  TAKEN
  NOT_FOUND
}

type WebhookSubscriptionUserError implements DisplayableError {
  field: [String!]
  message: String!
  code: WebhookSubscriptionUserErrorCode
}

type WebhookSubscriptionCreatePayload {
  webhookSubscription: WebhookSubscription
  userErrors: [WebhookSubscriptionUserError!]!
}

type WebhookSubscriptionDeletePayload {
  deletedWebhookSubscriptionId: ID
  userErrors: [WebhookSubscriptionUserError!]!
}

type Query {
  """Zoekt elk object op zijn globale id op."""
  node(id: ID!): Node

  """De thema's waaruit gekozen kan worden."""
  themes(first: Int, after: String, last: Int, before: String): ThemeConnection!

  """Eén thema op zijn globale id, of op het kale nummer uit de admin."""
  theme(id: ID!): Theme

  """Eén van jouw kaarten. Een kaart van een andere partner geeft null."""
  card(id: ID!): Card

  """De meldingen waarop je bent geabonneerd."""
  webhookSubscriptions(first: Int, after: String, last: Int, before: String, topics: [WebhookSubscriptionTopic!]): WebhookSubscriptionConnection!
}

type Mutation {
  """Maakt een rouwkaart aan met de gegevens uit jouw dossier."""
  cardCreate(input: CardCreateInput!): CardCreatePayload

  """Wijzigt een kaart. Alleen de meegestuurde velden veranderen."""
  cardUpdate(id: ID!, input: CardUpdateInput!): CardUpdatePayload

  """
  Geeft een eenmalige link naar de customiser of de genodigdenlijst. Vraag hem
  aan op het moment van klikken; hij is tien minuten geldig en werkt één keer.
  """
  cardSessionCreate(cardId: ID!, target: CardSessionTarget!): CardSessionCreatePayload

  """Abonneert een adres op een melding."""
  webhookSubscriptionCreate(topic: WebhookSubscriptionTopic!, webhookSubscription: WebhookSubscriptionInput!): WebhookSubscriptionCreatePayload

  """Zegt een abonnement op."""
  webhookSubscriptionDelete(id: ID!): WebhookSubscriptionDeletePayload
}

Had je hier iets aan?