# ADITUS Developer Portal > ADITUS is an event-technology platform for ticketing, access management, accreditation, and marketing activation. This is the official public developer portal and documentation source for the ADITUS API and integrations. ## Machine-readable documentation - [Catalogue of agent documents](https://developers.aditus.com/ai/index.md) — Every Markdown document listed below in one place. - [API reference overview](https://developers.aditus.com/ai/docs.md) — All ADITUS API modules with a complete endpoint table and links to the per-module Markdown documents. - [AI agent guide for the Shop Micro Frontend](https://developers.aditus.com/ai/micro-frontend.md) — Compact, machine-readable integration contract with mounting, session, styling, lifecycle, security, and verification guidance. - [Business Intelligence API (complete reference)](https://developers.aditus.com/ai/docs/business-intelligence.md) — Read-only OData v4 feed with the full ticketing history as analysis-ready datasets (Tickets, TicketUsages, StatisticGroups, Surveys) for bulk loading into a data warehouse: authentication, query options, keyset paging, limits, column semantics, BI-tool connection, recipes, error handling. Human product page: https://developers.aditus.com/business-intelligence ## API reference modules (Markdown) - [Guidelines](https://developers.aditus.com/ai/docs/guidelines.md) — Guidelines module, inbound (your systems call ADITUS), guide / event reference. Human pages: https://developers.aditus.com/docs/guidelines - [Just Entrance](https://developers.aditus.com/ai/docs/just-entrance.md) — Just Entrance module, inbound (your systems call ADITUS), 2 endpoints. Human pages: https://developers.aditus.com/docs/just-entrance - [Ticket purchase & registration](https://developers.aditus.com/ai/docs/ticket-purchase-registration.md) — Ticket purchase & registration module, inbound (your systems call ADITUS), 77 endpoints. Human pages: https://developers.aditus.com/docs/ticket-purchase-registration - [Byndr](https://developers.aditus.com/ai/docs/byndr.md) — Byndr module, inbound (your systems call ADITUS), 9 endpoints. Human pages: https://developers.aditus.com/docs/byndr - [Survey](https://developers.aditus.com/ai/docs/survey.md) — Survey module, inbound (your systems call ADITUS), 9 endpoints. Human pages: https://developers.aditus.com/docs/survey - [Assets](https://developers.aditus.com/ai/docs/assets.md) — Assets module, inbound (your systems call ADITUS), 7 endpoints. Human pages: https://developers.aditus.com/docs/assets - [Webhooks](https://developers.aditus.com/ai/docs/webhooks.md) — Webhooks module, inbound (your systems call ADITUS), guide / event reference. Human pages: https://developers.aditus.com/docs/webhooks - [Exhibitors](https://developers.aditus.com/ai/docs/exhibitors.md) — Exhibitors module, inbound (your systems call ADITUS), 4 endpoints. Human pages: https://developers.aditus.com/docs/exhibitors - [Attendees](https://developers.aditus.com/ai/docs/attendees.md) — Attendees module, inbound (your systems call ADITUS), 5 endpoints. Human pages: https://developers.aditus.com/docs/attendees - [Business Intelligence](https://developers.aditus.com/ai/docs/business-intelligence.md) — Business Intelligence module, outbound (ADITUS data into your systems), 9 endpoints. Human pages: https://developers.aditus.com/docs/business-intelligence ## Documentation - [ADITUS API documentation](https://developers.aditus.com/docs) — Canonical API reference for REST integrations covering ticketing, access management, accreditation, webhooks, Quicodes, surveys, and related platform services. Includes OAuth 2.0 Client Credentials, request examples, payloads, and endpoint details. - [Micro-Frontend integration guide](https://developers.aditus.com/micro-frontend) — Integrate the ADITUS ticket shop natively into a host website with integration guidance and code examples. - [Business Intelligence](https://developers.aditus.com/business-intelligence) — Product page for the outbound analytics API (OData v4 extraction into your own data warehouse). - [ADITUS-Queue guide](https://developers.aditus.com/aditus-queue) — Documentation for the virtual waiting room protecting websites, APIs, and online shops from traffic spikes. - [Shop integration examples](https://developers.aditus.com/shop-integrations) — Practical examples of embedding the ADITUS ticket shop in different website layouts and contexts. - [Styling Studio](https://developers.aditus.com/styling) — Configure colors, radii, and typography for the ADITUS Micro-Frontend and export the resulting configuration. ## Support and company - [Contact ADITUS](https://developers.aditus.com/kontakt) — Public contact route for questions about ADITUS products and integrations. - [ADITUS website](https://www.aditus.com/) — Official company and product information. ## Discovery - [Full documentation in one file](https://developers.aditus.com/llms-full.txt) — All machine-readable documents concatenated (large). - [XML sitemap](https://developers.aditus.com/sitemap.xml) — Complete list of canonical public documentation and portal URLs. --- product: ADITUS Shop Micro Frontend document: AI agent integration guide canonical: https://developers.aditus.com/ai/micro-frontend.md humanDocumentation: https://developers.aditus.com/micro-frontend stylingTool: https://developers.aditus.com/styling integrationTester: https://developers.aditus.com/integration-tester --- # ADITUS Shop Micro Frontend — AI agent integration guide This is the authoritative compact integration contract for coding agents. Follow it before changing an ADITUS Shop Micro Frontend integration. Use the human documentation for deeper product explanations. ## Project instruction Add this short rule to the host project's agent instructions so future coding agents reliably load the current contract instead of guessing from local code: ```md ## ADITUS Shop Micro Frontend Before changing this integration, read and follow: https://developers.aditus.com/ai/micro-frontend.md Treat it as the authoritative integration, styling, lifecycle, and security contract. Prefer documented BEM classes and data attributes. Keep all host styling centralized beside the mount integration. ``` ## Choose the integration - Use `mount()` in applications with a JavaScript or TypeScript build. - Use `` in plain HTML, CMS templates, tag managers, or hosts without a build step. - Keep credentials and upstream Shop API access on the server. Never expose a client secret, OAuth token, encryption key, or private API key in browser code. - A publishable `publicKey` is safe for browser use. Its domain allowlist and the bound session are the access boundary. ## Package source and updates The micro-frontend is not on npm. Your ADITUS instance serves it on a versioned, moving `v1` track (compatible updates overwrite `v1`; a breaking change ships as `v2`). The files are public; the access gate is the `publicKey` allowlist plus the session, never the file. | File | Purpose | | ------------------------------------------- | ---------------------------------------------------------------- | | `/api/embed/v1/aditus-shop-embed.tgz` | source package `@aditus/shop-embed` (TypeScript, host bundler compiles it) | | `/api/embed/v1/aditus-shop.js` | prebuilt self-hosted Web Component bundle (``) | | `/api/embed/v1/manifest.json` | update manifest: `builtAt`, `package.sourceHash`, `sha256` of both files | Demo instance: `https://developers.aditus.com/api/embed/v1/…` (production hosts use their own instance origin). Install the source package from the tarball URL (`npm install `, `pnpm add `) or vendor it. Keep the install reproducible: pin the URL in `package.json` and commit the lockfile. Check for updates regularly (at least before every release of the host app, ideally as a scheduled job): 1. `GET /api/embed/v1/manifest.json`. 2. Compare `package.sourceHash` with `aditus.sourceHash` in `node_modules/@aditus/shop-embed/package.json` (or the vendored copy). `sourceHash` only changes when the shipped source changed; `builtAt` and the tarball `sha256` also change on rebuilds without source changes. 3. If it differs, reinstall the tarball, run the host build and tests, and re-run the completion checklist below. Compatible `v1` updates keep the documented CSS hooks, tokens, config, and events stable. 4. Web Component hosts pick up `v1` bundle updates automatically (one hour HTTP cache). Compare `bundle.sha256` only if you mirror the file yourself. Never patch files inside the installed package; put host changes in the integration module and stylesheet so an update is a plain reinstall. ## Preferred mount architecture Keep the complete mount configuration, lifecycle, event subscriptions, and styling import in one integration module. Do not scatter Micro Frontend configuration through page components. ```ts // shop-micro-frontend.ts import { mount, type AditusShopConfig, type ShopHandle, } from "@workspace/aditus-shop-embed"; import "./shop-micro-frontend.css"; let shop: ShopHandle | null = null; export function mountShop( container: HTMLElement, sessionToken: string, publicKey: string, ): ShopHandle { const config: AditusShopConfig = { publicKey, sessionToken, culture: "de-DE", articleLayout: "list", articleGroupLayout: "list", }; shop?.(); shop = mount(container, config); shop.on("checkout:complete", (order) => { console.info("Checkout completed", order.id); }); return shop; } export function updateShop(config: AditusShopConfig): void { shop?.update(config); } export function unmountShop(): void { shop?.(); shop = null; } ``` In React, call the central adapter from an effect and return its handle as the cleanup. Use `handle.update()` for culture or presentation changes so the shopper's current journey is preserved. Do not remount merely to change configuration. ## Styling contract ### Recommended approach Prefer the documented BEM classes and documented `data-*` attributes only. Keep all host overrides in one stylesheet imported beside the central mount module. Preserve the default `classPrefix: "aditus-shop"` unless the host has a strong isolation requirement. Use the three-level semantic styling model, in this order: 1. **Design tokens** for brand, typography, color, shape, and spacing. 2. **General semantic hooks** for a consistent treatment of recurring roles across the whole journey. 3. **Existing component-specific hooks** only for expert overrides of one particular component. The general hooks are additive: an element also keeps its specialized hook. Do not infer roles from DOM nesting. In particular, `reg-form` is not a documented panel. | General hook | Role | | --- | --- | | `.aditus-shop__section` | Major journey section | | `.aditus-shop__panel` | Visually bounded content surface | | `.aditus-shop__list` | Repeating collection | | `.aditus-shop__list-item` | Item in a repeating collection | | `.aditus-shop__actions` | Related action group | | `.aditus-shop__action` | Individual action | Where implemented, an action's documented role is exposed as `data-variant="primary"` or `data-variant="secondary"`. Do not invent a variant for actions that do not expose one. Keep broad rules on the general hooks and narrow exceptions on the specialized hooks: ```css /* shop-micro-frontend.css — the single host-owned styling entry point */ .onsite-shop .aditus-shop { --aditus-accent: #c2410c; --aditus-accent-strong: #9a3412; --aditus-accent-contrast: #ffffff; --aditus-surface: #ffffff; --aditus-text: #201a17; --aditus-border: #e4d8cf; --aditus-radius: 12px; --aditus-font: "Inter", system-ui, sans-serif; } .onsite-shop .aditus-shop__panel { background: var(--aditus-surface); border: 1px solid var(--aditus-border); border-radius: var(--aditus-radius); box-shadow: var(--aditus-shadow); } .onsite-shop .aditus-shop__list { gap: 0.75rem; } .onsite-shop .aditus-shop__action[data-variant="primary"] { font-weight: 700; } /* Expert exception: only article cards, not every panel. */ .onsite-shop .aditus-shop__article-card { border-inline-start: 4px solid var(--aditus-accent); } ``` Existing component-specific hooks for expert overrides include: - `.aditus-shop[data-step]` - `.aditus-shop__events[data-layout]` - `.aditus-shop__articles[data-layout]` - `.aditus-shop__article-list[data-layout="list" | "grid"]` - `.aditus-shop__article-groups[data-group-layout="list" | "grid"]` - `.aditus-shop__article[data-available]` - `.aditus-shop__article-card[data-available][data-featured]` - `.aditus-shop__cart` - `.aditus-shop__registration` - `.aditus-shop__payment` - `.aditus-shop__done` Prefer the general semantic hooks when multiple components should share a look. Use these specialized hooks only when the named component must differ. Do not target raw tag names, generated classes, DOM depth, `:nth-child()`, or undocumented internal nesting. Those are not integration contracts. ### Design tokens (complete list) All tokens are CSS custom properties read on the root `.aditus-shop`. Each has an equivalent key in the `theme` mount option (`theme: { accent: "#c2410c" }` sets `--aditus-accent`). Every token is optional; unset tokens keep the neutral default skin. This list is the contract — no other `--aditus-*` token exists. | Token | `theme` key | Role | | --- | --- | --- | | `--aditus-font` | `font` | Font family for the whole shop | | `--aditus-font-size` | `fontSize` | Base font size (default 15px); every size scales from it | | `--aditus-accent` | `accent` | Primary/action color | | `--aditus-accent-strong` | `accentStrong` | Accent on hover/active | | `--aditus-accent-contrast` | `accentContrast` | Text on accent surfaces | | `--aditus-accent-soft` | `accentSoft` | Accent tint for backgrounds/selection | | `--aditus-surface` | `surface` | Card and input surface | | `--aditus-surface-2` | `surface2` | Secondary surface (group headers) | | `--aditus-overlay-surface` | `overlaySurface` | Surface of the detail modal | | `--aditus-overlay-backdrop` | `overlayBackdrop` | Scrim behind the detail modal (use a dark scrim for dark themes) | | `--aditus-border` | `border` | Default border | | `--aditus-border-strong` | `borderStrong` | Stronger border (inputs) | | `--aditus-text` | `text` | Body text | | `--aditus-muted` | `muted` | Secondary text | | `--aditus-heading` | `heading` | Heading/title color (defaults to text) | | `--aditus-success` | `success` | Success state (completion) | | `--aditus-success-soft` | `successSoft` | Success background | | `--aditus-danger` | `danger` | Error state | | `--aditus-danger-soft` | `dangerSoft` | Error background | | `--aditus-radius` | `radius` | Corner radius of cards | | `--aditus-radius-sm` | `radiusSm` | Corner radius of inputs | | `--aditus-radius-button` | `radiusButton` | Corner radius of buttons (defaults to radius-sm) | | `--aditus-gap` | `gap` | Vertical rhythm between blocks | | `--aditus-shadow` | `shadow` | Card shadow | | `--aditus-color-scheme` | `colorScheme` | `light`/`dark` for native controls (select popups); auto-derived from the text color, set only to override | The Styling Studio in the portal (https://developers.aditus.com/styling) exposes the same tokens with live preview and exports them as a `theme` object or as CSS. ### Dedicated full styling A fully dedicated skin is possible with `baseStyles: false`. It gives the host complete visual control, but it is less maintainable because the host must style every state and follow new components and accessibility states added by the Micro Frontend. Use it only when tokens plus documented BEM hooks cannot satisfy the design. For normal onsite shops, keep `baseStyles: true` and override documented hooks centrally. ## Session contract - `mount()` is inactive without a `sessionToken`. - Obtain the token from the approved session endpoint or the host backend. - Send the matching `publicKey` with the mounted session. - The journey entry point is server-controlled by the session's `eventSlug`, `startMode` and `assortment` (see "Entry point"). Do not add a browser-only override for any of them. - Provide `refreshSession` when the host owns session renewal. - Never persist client secrets in browser storage. - Do not decode a session token to make authorization decisions. ### Session token scope (what the proxy enforces) - Token: 256-bit random, opaque, no embedded data. Default TTL 20 minutes, configurable 1 minute to 24 hours at mint time. Never extended; renew by minting a new session. - Binding: bound to the `publicKey` it was minted for. Every session request must send exactly that key; the request origin is checked against the key's domain whitelist. Mismatch → 403. - Anonymous session (minted without a user): browse events, create and edit its own cart. Registration, timeslots, payment assignment and checkout → 403 until an identified session is used. - Identified session: additionally registration, timeslots, payment assignment and checkout — limited to the carts this session owns. With `protectUserData` the buyer data stored for the user is protected: a write that would change it → 403. - Cart ownership: a cart is bound to its owner via a keyed hash (HMAC) — the token for anonymous sessions, the minted user identity for identified sessions, scoped to the `publicKey`. Sessions of other users get no access; writes per cart are serialized. - Personal data: the session context returns flags, ids and the user identifier the host backend minted. Buyer data is reachable only through the ownership-checked cart and registration routes. - Rate limits: mint/revoke 30 per minute per IP; address and company autocomplete 60 per minute per session; document scan has its own limit. - Audit log: proxied API requests are recorded and retained 90 days — client, normalized route, status, origin host, shortened session-token hash, cart/order id. Never the token, no e-mail, no IP. - Revocation: `DELETE /api/shop/session/:token` invalidates immediately (no cache); the next request with that token → 401. Call it on logout. ## Entry point (event, assortment, voucher) The entry view is fixed when the session is minted. The browser cannot change it. | Mint body (server-to-server) | Entry view | | ------------------------------------------------ | -------------------------------------------- | | no `eventSlug` | event overview | | `eventSlug` | article selection of that event (default) | | `eventSlug` + `assortment: ""` | article selection limited to ONE assortment | | `eventSlug` + `startMode: "voucher"` | "Redeem voucher / Register ticket" form | | `startMode: "voucher"` without `eventSlug` | event overview, then the voucher form of the picked event | Rules: - `startMode` accepts `"articles"` (default) or `"voucher"`; anything else is `400 invalid_start_mode`. - `assortment` is the assortment id or its exact name, case-insensitive, max 200 characters (`400 invalid_assortment`). Hidden assortments are allowed. It is ignored with `startMode: "voucher"`. - `startMode` also works WITHOUT `eventSlug`: the event picker comes first and the mode applies to the event the shopper picks (a voucher start then opens the code form of that event; a restart returns to the picker). `assortment` requires `eventSlug`; otherwise the mint answers `400 start_option_requires_event_slug`. - Browser-minted sessions (`POST /shop/embed-session`, publishable key only) take `eventSlug`, `startMode` and `assortment` from the client record that ADITUS configures. Body values are ignored there. - `GET /shop/session-context` and `GET /shop/session-event` echo the resolved `startMode` and `assortment` so the host can render matching copy. - A PROMOTION code (codeType `PromotionCode`: discounts articles, reserves no ticket) typed into the voucher form is handled by the micro-frontend: it switches to the article selection priced for the cart the code lives on (`GET /shop/cart/:cart/assortments/:assortment/articles`, discounted `price` next to the untouched `originalPrice`), lists every changed price, and keeps the code on the cart so picked articles get the discount. "Remove code" returns to the form with plain prices. - An assortment selector without a match shows an explicit error in the micro-frontend and falls back to the event picker. It never silently lists the full catalogue. Voucher flow (`startMode: "voucher"`): 1. The micro-frontend renders the form (title "Gutschein einlösen / Ticket registrieren" / "Redeem voucher / Register ticket", two hints, one code field, a "Einlösen" / "Redeem" button). Copy follows `culture`. 2. On submit it creates a cart for the pinned event (reused while codes are rejected) and calls `POST /shop/cart/:cart/coupons/:code`. 3. A valid code reserves its ticket in that cart and the journey continues directly to registration (`begin_checkout` is emitted after `add_to_cart`). The ticket is issued only after successful registration. A fully covered ticket skips payment. 4. A rejected code keeps the form open with a reason (unknown, already used, rejected). The upstream answers 200 for unknown codes; success is only the explicit OK result. Codes are never written to logs. 5. "Anderen Code einlösen" / "Redeem another code" on the registration or cart step releases the reservation (`DELETE /shop/cart/:cart/coupons/:code`) and returns to the form. Unreleased reservations expire upstream after roughly 20 minutes. ### Voucher links (code handed over from the URL) Voucher links in circulation point at the HOST page with the code as a query parameter, e.g. `https://host.example/tickets?code=ED24-ADITUS` (the parameter name is the host's choice; `code` is common). The micro-frontend can take the code over and redeem it without the visitor typing it. Two handover paths, same behaviour afterwards: | Path | How | Use when | | ---- | --- | -------- | | A) browser | `mount(el, { ..., voucherCodeParam: "code" })` or `` | static pages, browser-minted sessions | | B) server | mint body `voucherCode: ""` (both start modes, with or without `eventSlug`) | server-rendered pages, codes entered in the HOST's own UI (kiosk, start screen), own validation / logging / rate limiting of inbound links | Rules: - Path A: the adapter reads the named parameter ONCE at mount, removes it from the address bar via `history.replaceState` (no reload; path, hash and other parameters stay) and redeems it. A reload, bookmark or forwarded URL never redeems twice. Without `voucherCodeParam` the URL is never inspected. - Path B: `voucherCode` is trimmed, 1–100 characters, no whitespace or URL delimiters (`400 invalid_voucher_code`); `eventSlug` is optional (without it the code is redeemed once the shopper has picked an event). The mint response echoes the accepted `eventSlug`, `startMode`, `assortment` and `voucherCode` so you can verify the pin; the adapter receives the code only via the authenticated `GET /shop/session-context` (`voucherCode`, `null` when none), and only ONCE: the read atomically clears the stored code, so a later context read (reload, second tab) gets `null`. Consequences when debugging: do NOT call `/shop/session-context` manually with a token the adapter is about to mount with, and an adapter build older than the voucher feature consumes the code at mount without using it, so the form stays empty. Verify with a FRESH token, and update the installed package when the manifest `sourceHash` differs from the installed one. `POST /shop/embed-session` cannot carry a code (body ignored); use path A. - Path B with an INBOUND LINK leaves `?code=` in the host page URL. In that case set `voucherCodeParam` as well so the adapter strips it from the address bar (otherwise it would travel on in payment return URLs). When the code comes from your own UI (kiosk, start screen) there is no URL parameter and `voucherCodeParam` is not needed. The server-side code still wins; nothing is redeemed twice. - The mint does NOT validate the code against the shop (an unknown code is accepted with 201). Validation happens when the adapter redeems it; a rejected code stays in the voucher form with the reason. - If both paths deliver a code, the server-side one wins. - The code is redeemed exactly once and only on a FRESH journey. A resumed journey (reload, payment-page return) ignores it so nothing is booked twice. - `startMode: "voucher"`: the form opens prefilled and submits itself. Valid → straight to registration; rejected → stays on the form with the reason, the code remains editable. - Articles start: the visitor picks articles as usual; the code is applied to the first cart (`POST /shop/cart/:cart/coupons/:code`). The reserved ticket appears as a cart line and a dismissible notice (`role="status"`, hook `.aditus-shop__pay-notice`) reports success or the rejection reason. Analytics emit `add_to_cart` for the reserved position. - The adapter never persists the code and never passes it to `onEvent`. Sessions without `eventSlug` ignore it. The entry point itself is never changed by a link code. Minimal server handover (Express): ```ts app.get("/tickets", async (req, res) => { const code = typeof req.query.code === "string" ? req.query.code : undefined; const r = await fetch("https:///api/shop/session", { method: "POST", headers: { Authorization: `Bearer ${process.env.ADITUS_MINT_SECRET}`, "Content-Type": "application/json" }, body: JSON.stringify({ publicKey, email: req.user?.email, eventSlug: "ExperienceDaysv52024", startMode: "voucher", voucherCode: code }), }); const { sessionToken } = await r.json(); // page mounts with voucherCodeParam: "code" as well (strips ?code= from the URL) res.render("tickets", { sessionToken }); }); ``` Styling hooks of the voucher form (same tokens and role hooks as the rest): root `[data-step="voucher"]`, `.aditus-shop__voucher-panel` (general panel hook applies), `.aditus-shop__voucher-hints`, `.aditus-shop__voucher-form`, `.aditus-shop__voucher-input` (also `.aditus-shop__field-input`), `.aditus-shop__voucher-redeem` (`data-variant="primary"`), `.aditus-shop__field-error` (`role="alert"`). Testing: the Integration Tester at `/integration-tester` exposes `startMode` and `assortment` next to `eventSlug`. The demo system accepts the test voucher `ED24-ADITUS` on event slug `ExperienceDaysv52024`; the event also has the assortment "Pressetickets". ## Web Component ```html ``` Supported presentation attributes: - `culture` - `article-layout` - `article-group-layout` - `event-layout` - `article-select-mode` - `show-header` - `survey-columns` - `voucher-code-param` (link voucher handover, see "Voucher links") - `base-styles` Infrastructure attributes are `public-key`, optional `session-token`, and optional `api-base`. Keep `api-base` unset when the standard hosted proxy should be used; never point it directly at the upstream Shop API. Without an explicit `session-token`, the Web Component requests a domain-gated browser session for its `public-key` and renews its own expired session. ## Presentation defaults Serializable client defaults may define: - `articleLayout` - `eventLayout` - `articleGroupLayout` - `articleIconVisible` - `articleSelectMode` - `showHeader` - `culture` - `autoScroll` - `surveyColumns` An explicit mount value, including `false`, always wins. Leave an option undefined when the centrally managed client default should apply. `articleLayout: "list"` is the standard article view. `articleGroupLayout: "list"` is the standard connected, single-column list for both grouped and ungrouped articles. Use `"grid"` only as an explicit multi-column opt-in. `articleGroupLayout` has no effect with `articleLayout: "cards"`. ## Lifecycle rules - Mount once per container. - Keep the returned `ShopHandle`. - Call `handle.update(nextConfig)` for in-place changes. - Call the handle as a function to unmount during host teardown. - Do not mount a second instance over a live instance. - Keep event listeners on the same handle; they survive `update()`. ## Required security rules MUST NOT: - expose private credentials in browser code; - call the upstream Shop API directly from the browser; - omit the `publicKey` when resolving a public-key-bound session; - invent or modify the journey entry point in browser state; - hardcode development hosts into production browser code; - bypass payment-provider assignment for redirect payments; - style against undocumented DOM structure. ## Completion checklist Before declaring an integration complete: - [ ] No private credential is present in browser code or browser storage. - [ ] The session and `publicKey` belong to the same configured access. - [ ] Mounting and cleanup are centralized. - [ ] Culture changes use `handle.update()` and preserve the journey. - [ ] Client defaults are not accidentally overridden. - [ ] Host CSS uses only tokens, documented BEM classes, and documented `data-*` attributes. - [ ] The standard skin remains enabled unless a complete dedicated skin is intentionally maintained. - [ ] Redirect-payment return and journey resume are verified. - [ ] Mobile, keyboard, loading, empty, error, and sold-out states are checked. - [ ] The integration is exercised with the Integration Tester. - [ ] `manifest.json` was checked and the installed package matches the current `v1` `sourceHash`; an update check is scheduled. ## Related sources - Human guide: https://developers.aditus.com/micro-frontend - Styling Studio: https://developers.aditus.com/styling - Integration Tester: https://developers.aditus.com/integration-tester - Package source (demo instance): https://developers.aditus.com/api/embed/v1/aditus-shop-embed.tgz - Update manifest (demo instance): https://developers.aditus.com/api/embed/v1/manifest.json - Agent discovery index: https://developers.aditus.com/llms.txt --- product: ADITUS API document: API reference overview (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs.md humanDocumentation: https://developers.aditus.com/docs modules: 10 endpoints: 122 collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API reference — overview for coding agents The ADITUS-System provides many API products, tools, and resources that enable you to to streamline the ticket purchasing and entrance management process for events, attractions, and venues **Getting started guide** The reference is split into modules. Each module is available as one self-contained Markdown document (all sections, endpoints, parameters and examples). Load only the module you need; the complete set is also concatenated in https://developers.aditus.com/llms-full.txt. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Modules | Module | Direction | Endpoints | Markdown | Human documentation | | --- | --- | --- | --- | --- | | Guidelines | inbound | guide | https://developers.aditus.com/ai/docs/guidelines.md | https://developers.aditus.com/docs/guidelines | | Just Entrance | inbound | 2 | https://developers.aditus.com/ai/docs/just-entrance.md | https://developers.aditus.com/docs/just-entrance | | Ticket purchase & registration | inbound | 77 | https://developers.aditus.com/ai/docs/ticket-purchase-registration.md | https://developers.aditus.com/docs/ticket-purchase-registration | | Byndr | inbound | 9 | https://developers.aditus.com/ai/docs/byndr.md | https://developers.aditus.com/docs/byndr | | Survey | inbound | 9 | https://developers.aditus.com/ai/docs/survey.md | https://developers.aditus.com/docs/survey | | Assets | inbound | 7 | https://developers.aditus.com/ai/docs/assets.md | https://developers.aditus.com/docs/assets | | Webhooks | inbound | guide | https://developers.aditus.com/ai/docs/webhooks.md | https://developers.aditus.com/docs/webhooks | | Exhibitors | inbound | 4 | https://developers.aditus.com/ai/docs/exhibitors.md | https://developers.aditus.com/docs/exhibitors | | Attendees | inbound | 5 | https://developers.aditus.com/ai/docs/attendees.md | https://developers.aditus.com/docs/attendees | | Business Intelligence | outbound | 9 | https://developers.aditus.com/ai/docs/business-intelligence.md | https://developers.aditus.com/docs/business-intelligence | ## Where to start - Conventions, HTTP verbs, status codes, result codes and OAuth 2.0 client-credentials authentication: https://developers.aditus.com/ai/docs/guidelines.md - Webhook events and payloads (ADITUS calling your endpoint): https://developers.aditus.com/ai/docs/webhooks.md - Bulk analytics extraction into your data warehouse (OData v4, read-only): https://developers.aditus.com/ai/docs/business-intelligence.md - Embedding the ticket shop in a website (not a REST integration): https://developers.aditus.com/ai/micro-frontend.md ## All endpoints | Module | Method | URL | Name | Human documentation | | --- | --- | --- | --- | --- | | Just Entrance | POST | `{{API_BASE_URL}}/terp/v1/import/ticketowners` | Import of ticketowner | https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-aditus-quicode/import-of-ticketowner | | Just Entrance | POST | `{{API_BASE_URL}}/tasks/tickets/import` | Import external codes | https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-external-codes/import-external-codes | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/configuration` | Get configuration | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-configuration | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/payment-providers` | Get payment providers | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events?$expand=all` | Get events | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-events | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event?$expand=all` | Get event | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-event | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/communication-groups/:group` | Get communication group | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-communication-group | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/legitimation-categories` | Get legitimation categories | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-legitimation-categories | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/payment-providers` | Get payment providers by event | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers-by-event | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments` | Get assortments by event | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortments-by-event | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortment` | Get assortment details by event | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-details-by-event | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortmentID/articles` | Get assortment articles | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-articles | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/lookups/:name` | Get lookups by name | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-lookups-by-name | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service` | Get Terms of Service without User | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-without-user | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service/users/:userId` | Get Terms of Service with User | https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-with-user | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart` | Create cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/create-cart | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart?$expand=All` | Get cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/theme` | Get cart theme | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart-theme | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` | Get payment provider by cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-payment-provider-by-cart | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments` | Get assortments by cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortments-by-cart | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment` | Get assortment details by cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-details-by-cart | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment/articles` | Get assortment articles by cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-articles-by-cart | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/items` | Add item | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/add-item | | Ticket purchase & registration | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item` | Remove item | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-item | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/remove` | Remove items | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-items | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/properties` | Modify properties | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/modify-properties | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:id/culture` | Set culture | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-culture | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/user` | Set user | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-user | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` | Set payment provider | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-payment-provider | | Ticket purchase & registration | DELETE | `{{API_BASE_URL}}/shop/v1/cart/{{CART_ID}}/payment-providers` | Delete payment provider | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-payment-provider | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-provider/express-checkout?$expand=` | Initialize Express Checkout | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/initialize-express-checkout | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/validate` | Validate cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/validate/:validator` | Validate cart with validator | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart-with-validator | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/checkout` | Checkout cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/checkout-cart | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/clear` | Clear cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/clear-cart | | Ticket purchase & registration | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart` | Delete cart | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-cart | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cartId/terms-of-service` | Update Terms of Service Status | https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/update-terms-of-service-status | | Ticket purchase & registration | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cartId/coupons/:coupon?$expand=` | Remove coupon | https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/remove-coupon | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` | Check and redeem coupon | https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/check-and-redeem-coupon | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` | Get coupon information | https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/get-coupon-information | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration?$expand=` | Update item's registration | https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-registration | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots?$expand=AssociatedPersonOnItems&$expand=AvailableTimeslotsOnItems` | Update item's timeslots | https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-timeslots | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration/self/prefill-data` | Get item registration prefill data | https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-registration-prefill-data | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots` | Get item's timeslots information | https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-s-timeslots-information | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation` | Add legitimation | https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document` | Add legitimation document | https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation-document | | Ticket purchase & registration | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document/:document` | Remove legitimation document | https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/remove-legitimation-document | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:id/buyer` | Set buyer | https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-buyer | | Ticket purchase & registration | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/billing` | Set billing | https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-billing | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` | Get recommendations | https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/get-recommendations | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` | Apply recommendations | https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/apply-recommendations | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/carts?event={{EVENT}}` | Get carts | https://developers.aditus.com/docs/ticket-purchase-registration/user/carts/get-carts | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/orders?event={{EVENT}}` | Get orders | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-orders | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId` | Get order details | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-order-details | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations tracking | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations tracking click | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking-click | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/cart` | Get cart from order | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-cart-from-order | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/confirmation/resend` | Resend confirmation email | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-confirmation-email | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/registration-reminder/resend` | Resend registration reminder email | https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-registration-reminder-email | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/profile` | Get profile | https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/profile` | Update profile | https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/update-profile | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/profile/picture` | Get profile picture | https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile-picture | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/profile/picture` | Set profile picture | https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/set-profile-picture | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/legitimations` | Get legitimations | https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimations | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/user/:user/legitimations/:legitimation` | Get legitimation | https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimation | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/communication-groups/:communicationgroup` | Unsubscribe from mailing | https://developers.aditus.com/docs/ticket-purchase-registration/user/unsubscribe-from-mailing | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:userId/terms-of-service` | Update Terms of Service Status | https://developers.aditus.com/docs/ticket-purchase-registration/user/update-terms-of-service-status | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/user/:user/mailing-preferences` | Update mailing preferences | https://developers.aditus.com/docs/ticket-purchase-registration/user/update-mailing-preferences | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/localization?context=event:{{EVENT}}&includeNestedScopes=True&includeUpcoming=True&scope=ShopClient/Page/Home/Events` | Get resource | https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-resource | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/localization/languages` | Get languages | https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-languages | | Ticket purchase & registration | GET | `` | Get content | https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-content | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/social/cards` | Create social card | https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/create-social-card | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/social/cards/:id` | Get social card | https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event` | Get social card by user and event | https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-and-event | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event/article/:articleId` | Get social card by user, event and article | https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-event-and-article | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/social/event` | Create event | https://developers.aditus.com/docs/ticket-purchase-registration/social/create-event | | Ticket purchase & registration | POST | `{{API_BASE_URL}}/shop/v1/social/shares` | Share on social networks | https://developers.aditus.com/docs/ticket-purchase-registration/social/share-on-social-networks | | Ticket purchase & registration | GET | `{{API_BASE_URL}}/systems/swagger/shop` | Get swagger document | https://developers.aditus.com/docs/ticket-purchase-registration/get-swagger-document | | Byndr | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections` | Connect by quicode | https://developers.aditus.com/docs/byndr/connections/connect-by-quicode | | Byndr | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/preview-profile` | Preview profile by quicode | https://developers.aditus.com/docs/byndr/connections/preview-profile-by-quicode | | Byndr | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections?includeMeta=true&sort_by=status desc` | Get connections | https://developers.aditus.com/docs/byndr/connections/get-connections | | Byndr | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserd/connections/quota/:event` | Get daily quota | https://developers.aditus.com/docs/byndr/connections/get-daily-quota | | Byndr | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId?event={{EVENT_STUDYDAYS}}` | Get connection | https://developers.aditus.com/docs/byndr/connections/get-connection | | Byndr | DELETE | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid` | delete connection | https://developers.aditus.com/docs/byndr/connections/delete-connection | | Byndr | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid/block` | block connection | https://developers.aditus.com/docs/byndr/connections/block-connection | | Byndr | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId/notes/:event` | edit note | https://developers.aditus.com/docs/byndr/connections/edit-note | | Byndr | GET | `{{API_BASE_URL}}/systems/swagger/shop` | Get swagger document | https://developers.aditus.com/docs/byndr/get-swagger-document | | Survey | GET | `{{API_BASE_URL}}/survey/v1/surveys/:survey` | Get survey | https://developers.aditus.com/docs/survey/surveys/get-survey | | Survey | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/validate` | Validate answers | https://developers.aditus.com/docs/survey/surveys/validate-answers | | Survey | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses` | Create response | https://developers.aditus.com/docs/survey/surveys/create-response | | Survey | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response/validate` | Validate response | https://developers.aditus.com/docs/survey/surveys/validate-response | | Survey | GET | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Get response | https://developers.aditus.com/docs/survey/surveys/get-response | | Survey | PUT | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Update response | https://developers.aditus.com/docs/survey/surveys/update-response | | Survey | DELETE | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Delete response | https://developers.aditus.com/docs/survey/surveys/delete-response | | Survey | GET | `{{API_BASE_URL}}/survey/v1/lookups/:lookupListName` | Get lookups by name | https://developers.aditus.com/docs/survey/lookups/get-lookups-by-name | | Survey | GET | `{{API_BASE_URL}}/systems/swagger/survey` | Get swagger document | https://developers.aditus.com/docs/survey/get-swagger-document | | Assets | GET | `{{API_BASE_URL}}/assets/v1/themes/:name?context=event:{{EVENT}}&subContext=articleGroup:{{ARTICLEGROUP}}` | Get theme | https://developers.aditus.com/docs/assets/themes/get-theme | | Assets | GET | `{{API_BASE_URL}}/assets/v1/images/:imageKey?context=orderItem:{{ORDER_ITEM}}&useFallback=True&language={{LANGUAGE}}` | Get image | https://developers.aditus.com/docs/assets/images/get-image | | Assets | GET | `{{API_BASE_URL}}/assets/v1/images/:name/:resourceContext/:resourceSetName/:resourceName?context=article:{{ITEM_ID}}&language={{LANGUAGE}}&foregroundColor={{EXAMPLE_COLOR}}` | Get icon from icon set | https://developers.aditus.com/docs/assets/images/get-icon-from-icon-set | | Assets | GET | `{{API_BASE_URL}}/assets/v1/receipts/:identifier?s=LtDxHzfZZHsAg` | Get receipt | https://developers.aditus.com/docs/assets/receipts/get-receipt | | Assets | GET | `{{API_BASE_URL}}/assets/v1/tickets/:identifier/:format?s=hVA9UEQ7D4s7YA` | Get ticket | https://developers.aditus.com/docs/assets/tickets/get-ticket | | Assets | GET | `{{API_BASE_URL}}/assets/v1/assets/:key?context=orderItem:{{ORDER_ITEM}}` | Get asset | https://developers.aditus.com/docs/assets/assets/get-asset | | Assets | GET | `{{API_BASE_URL}}/systems/swagger/assets` | Get swagger document | https://developers.aditus.com/docs/assets/get-swagger-document | | Exhibitors | POST | `{{API_BASE_URL}}/tasks/exhibitors/import` | Import Exhibitors by Excel | https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-excel | | Exhibitors | POST | `{{API_BASE_URL}}/tasks/exhibitors/import` | Import Exhibitors by JSON | https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-json | | Exhibitors | GET | `{{API_BASE_URL}}/tasks/exhibitors/import/{id}` | Get Import Task Status | https://developers.aditus.com/docs/exhibitors/import/get-import-task-status | | Exhibitors | GET | `{{API_BASE_URL}}/tasks/exhibitors/import/{id}/result` | Get Import Task Result | https://developers.aditus.com/docs/exhibitors/import/get-import-task-result | | Attendees | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?eMail=a.ditus@aditus.de` | Use Case – By Email | https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-email | | Attendees | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?saleId=6054807e-d505-f111-93e3-00155d960409` | Use Case – By Sale | https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-sale | | Attendees | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?ticketCode=0333602070000017` | Use Case – By Ticket Code | https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-ticket-code | | Attendees | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` | Use Case – Delta Sync | https://developers.aditus.com/docs/attendees/use-case-examples/use-case-delta-sync | | Attendees | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` | Attendees – Base GET - all parameters | https://developers.aditus.com/docs/attendees/attendees-base-get-all-parameters | | Business Intelligence | POST | `{{IDENTITY_SERVER_BASE_URL}}/connect/token` | Get access token | https://developers.aditus.com/docs/business-intelligence/authentication/get-access-token | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest` | Get tickets | https://developers.aditus.com/docs/business-intelligence/datasets/get-tickets | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/TicketUsages?$select=TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance` | Get ticket usages | https://developers.aditus.com/docs/business-intelligence/datasets/get-ticket-usages | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/StatisticGroups` | Get statistic groups | https://developers.aditus.com/docs/business-intelligence/datasets/get-statistic-groups | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/Surveys?$select=SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId` | Get surveys | https://developers.aditus.com/docs/business-intelligence/datasets/get-surveys | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/health` | Get health | https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-health | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1` | Get service document | https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-service-document | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/$metadata` | Get metadata document | https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-metadata-document | | Business Intelligence | GET | `{{API_BASE_URL}}/ticketinghub/swagger/v1/swagger.json` | Get swagger document | https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-swagger-document | --- product: ADITUS API module: Guidelines direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/guidelines.md humanDocumentation: https://developers.aditus.com/docs/guidelines endpoints: 0 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Guidelines This is the machine-readable Markdown version of the **Guidelines** module of the ADITUS API reference (inbound (your systems call ADITUS), guide / event reference). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Contents - Guidelines — https://developers.aditus.com/docs/guidelines - General — https://developers.aditus.com/docs/guidelines/general - HTTP verbs — https://developers.aditus.com/docs/guidelines/http-verbs - Status Codes — https://developers.aditus.com/docs/guidelines/status-codes - Result codes and messages — https://developers.aditus.com/docs/guidelines/result-codes-and-messages - Authentication and Authorization — https://developers.aditus.com/docs/guidelines/authentication-and-authorization ## General Human documentation: https://developers.aditus.com/docs/guidelines/general ### Request structure All URIs and their underlying operations are resource based. The structure of the URIs is as follows: product/version/area/sub-area(s)/resource For example: - product: shop - version: v1 - area: discovery - sub-area: events - resource: ED24 _➔_ /shop/v1/discovery/events/ED24 ### Response structure 1. All responses contain at least the `data` node. 2. All answers that modify the cart (_add_ or _remove_ an **item** or **voucher**) always contain the current cart in the `data/cart` attribute in addition to the respective information about the modification. Details can be found in the Scheme of the respective operation. 3. If a request produced an **error**, the response will contain an `error` node instead of the `data` node. This error node contains a single error object, which may contain further details. This follows a standardized structure derived from the `Result` base class and contains the following information: - Code - Name - Category - Message - LogId - Severity - Details ### Identifier 1. All identifiers are represented as GUID 2. An event can also always be represented by using the slug (in addition to the GUID). This means that whenever the resource `eventIdentifier` is used, both usages lead to the same response: 1. GET `/shop/v1/discovery/events/ED24` 2. GET `/shop/v1/discovery/events/f2e25737-4990-ee11-93cf-00155d960409` 3. An user can always be represented by the id or the email address. That means that whenever the resource `userIdentifier` is used, both usages lead to the same response: 1. GET `/shop/v1/user/m.muster@email.com/profile` 2. GET `/shop/v1/user/f2e25737-4990-ee11-93cf-00155d960409/profile` ### Localization In order for textual resources within the response to be output in the user's language, the language must be transmitted as ISO-2 language code in the `Accept-Language` header. ## HTTP verbs Human documentation: https://developers.aditus.com/docs/guidelines/http-verbs ### GET `GET` will read data. Data can be a list or single object of a resource. - GET causes a 404 if the resource or endpoint could not be found - GET causes a 200 if the resource or collection of objects has been found and are returned ### POST `POST` will insert new data. It is possible to insert single objects or lists of objects. - POST causes a 201 if the entity or collection of entities have been created successfully ### PUT `PUT` will update data. This can be a resource or a list of resources. Important: The entire resource or list of resources is always updated. If the resource to be updated does not exist, it will be created. - PUT causes a 201 if the entity or collection of entities have been created successfully - PUT causes a 200 if the entity or collection of entities have been updated successfully ### PATCH `PATCH` should be used to update single properties of an entity. - PATCH causes a 200 if the entity has been updated successfully ### DELETE `DELETE` is used to delete entities. - DELETE causes a 200 if the resource or entity has been deleted successfully ## Status Codes Human documentation: https://developers.aditus.com/docs/guidelines/status-codes Http codes can be separated in 4 simple groups: - codes for successful calls, - calls redirected to new or moved URI, - client and - server side errors. ### Success codes 200: OK Default success code - Provides the requested resources (if any were requested) 201: CREATED Default success code for creation - resource has been created successfully ### Redirection codes 301: MOVED PERMANENTLY This and all future requests will be redirected to the new destination 304: NOT MODIFIED The resource has not been modified. ### Client side errors 400: BAD REQUEST Default Error Code - Used if an object has invalid parameters 401: UNAUTHORIZED Current consumer is not authorized to access requested resource 404: NOT FOUND Resource / Method / Route not found ### Server side errors 500: INTERNAL SERVER ERROR Default Error Code - Used if an exception occurs ## Result codes and messages Human documentation: https://developers.aditus.com/docs/guidelines/result-codes-and-messages _Error codes are reserved up to_ _**10.000**____, ensuring a dedicated range and reserving space for future codes. The range starting at_ _**10,001**_ _is reserved for_ _**TERP v5**____._ Validation and error messages, often called **results**, serve as the bridge between users and the intricate processes taking place behind the scenes. They are the means through which users receive feedback about the success, failure, or other outcome of their actions, offering a crucial layer of transparency and guidance. In this exploration, we delve into the significance of validation and error messages, examining the essential elements that contribute to user-centric interactions and the seamless integration of processes. ### Global messages Global messages are usually returned if incorrect or unknown identifiers are passed to the API. If one of these results is returned, no further actions can be performed. The severity of these messages can be classified as high. | **Code** | **Category** | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 1001 | General | CartLookup | low | | | 1002 | EventNotFound | low | Create | | | 1003 | UserLookup | low | SetUser | | | 1004 | OrderDetailLookup | low | GetOrderDetailHandler | | | 1005 | CartLockStatus

Cart cannot be locked because it already is. | low | CartStore | | | 1006 | CartUpdateStatus

Cart cannot be updated. | high | CartStore | | | 1007 | CartLockability

Cart cannot be locked, but it needs to be to be processed. | high | CartStore | | | 1008 | CartUnlockability | high | CartStore | | | 1009 | CartUserAssignmentStatus | high | PersonRegistrationService | | | 1010 | RequestStatus | low | | | | 1011 | CharsetFilter | low | | | | 1013 | CartCreationStatus | low | | | | 1014 | TosApprovalStatus | low | | | | 1015 | MailingPreferenceCategoryMandatory | low | | | ### Validation messages The validation of a cart can be called up at any time and contains various codes in response that reflect the status of the cart to be checked. These results are informative messages. However, before a checkout is carried out, the validation result may no longer provide any results. Validation is carried out automatically before a checkout. The severity of these messages can be classified as low. | **Code** | **Category** | **Name** | **Severity** | **Auto Resolve** | **Internal Usage** | | --- | --- | --- | --- | --- | --- | | 2001 | General | ArticleValidation | low | not implemented | Validate | | 2002 | CartStatus | low | not implemented | Validate | | | 2003 | CartItemPresence | low | not implemented | Validate | | | 2004 | UserAssignmentStatus | low | not implemented | Validate | | | 2005 | PriceValidation | low | not implemented | Validate | | | 2006 | RegistrationActiveStatus | low | not implemented | Validate | | | 2007 | SaleActiveStatus | low | not implemented | Validate | | | 2008 | VatValidation | low | not implemented | Validate | | | 2009 | RegistrationReminderEligibility | low | not implemented | ResendRegistrationReminderEmailHandler | | | 2010 | RegistrationReminderOrder | low | not implemented | ResendRegistrationReminderEmailHandler | | | 2011 | RegistrationReminderStatus | low | not implemented | ResendRegistrationReminderEmailHandler | | | 2012 | RegistrationReminderOwnership | low | not implemented | ResendRegistrationReminderEmailHandler | | | 2013 | ValidatorStatus | low | not implemented | ValidateCartHandler | | | 2015 | CartAmountStatus | low | not implemented | Validate | | | 2016 | CartLegitimationStatus | low | not implemented | Validate | | | 2017 | CartPaymentStatus

The payment for the cart is not allowed to be changed. | low | not implemented | Validate | | | 2019 | ItemArticleGroupContingentAssignment | low | available | Validate | | | 2020 | ItemTimeslotBookingStatus | low | not implemented | Validate | | | 2021 | ItemTimeslotBookingLimit | low | not implemented | Validate | | | 2022 | ItemBookedTimeslotAvailability | low | not implemented | Validate | | | 2023 | RegistrationReminderPayment | low | not implemented | ResendRegistrationReminderEmailHandler | | | 2024 | ItemTicketAttributeContingentStatus | low | not implemented | Validate | | | 2101 | Buyer | BillingValidation | low | not implemented | Validate | | 2102 | BuyerValidation | low | not implemented | Validate | | | 2103 | BuyerPresence | low | not implemented | Validate | | | 2201 | Registration | ArticlePromotionTimespan | low | not implemented | Validate | | 2203 | SurveyItemSelfRegistration | low | not implemented | Validate | | | 2204 | ItemRegistrationTypeStatus | low | not implemented | ValidateCartItemRegistrationHandler | | | 2205 | ItemRegistrationRequirement | low | not implemented | ValidateCartItemRegistrationHandler | | | 2206 | ItemReservationStatus | low | not implemented | Validate | | | 2207 | RegistrationForItemStatus | low | not implemented | ValidateCartItemRegistrationHandler | | | 2208 | RegistrationResponseValidation | low | not implemented | ValidateCartItemRegistrationHandler | | | 2209 | RegistrationTypeLookup | low | not implemented | ValidateCartItemRegistrationHandler | | | 2210 | PrefilledRegistrationAnswersStatus | low | not implemented | ValidateCartItemRegistrationHandler | | | 2211 | SurveyAnswersConsistency | low | not implemented | Validate | | | 2212 | TicketOwnerPersonMatch | low | not implemented | TicketOwnerUniquenessValidator | | | 2213 | TicketOwnerUsageStatus | low | not implemented | TicketOwnerUniquenessValidator | | | 2301 | Payment | PaymentAmountValidation | low | not implemented | Validate | | 2302 | PaymentExpirationStatus | low | not implemented | Validate | | | 2303 | PaymentAssignmentStatus | low | not implemented | Validate | | | 2401 | Limit | AttendeeTicketLimitStatus | low | not implemented | Validate | | 2402 | ArticleLimitStatus | low | not implemented | Validate | | | 2403 | ArticleAssortmentLimitStatus | low | not implemented | Validate | | | 2404 | ArticleGroupLimitStatus | low | not implemented | Validate | | | 2405 | AttendeeTicketDaysLimit | LOW | not implemented | Validate | | | 2406 | CartItemTicketDaysLimit | LoW | not implemented | ValidateCartItemRegistrationHandler | | | 2407 | AttendeePermanentTicketStatus | LoW | not implemented | Validate | | | 2408 | CartItemPermanentTicketStatus | LoW | not implemented | ValidateCartItemRegistrationHandler | | | 2409 | CartItemTicketLimitStatus | LoW | not implemented | ValidateCartItemRegistrationHandler | | | 2501 | Legitimation | LegitimationCountryEligibility | low | not implemented | Validate | | 2502 | LegitimationProofsStatus | low | not implemented | Validate | | | 2503 | LegitimationUploadFormat | low | not implemented | Validate | | | _26xx_ | Survey | _Placeholder for survery validation results_ | low | not implemented | | ### Cart messages The cart area concerns all actions that modify or change a cart. These results prevent the corresponding cart from being changed. Depending on the result, previous actions on the cart may be necessary. The severity of these messages can be classified as medium. | **Code** | **Category** | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 3001 | General | ArticleOrderStatus

The information for processing the ticket order is missing. This includes the information regarding the ordering process like shipping information. | low | AddItem | | 3002 | ArticleTicketAvailability | low | AddItem | | | 3003 | ArticleLookup | low | AddItem | | | 3004 | ArticleEventAssignment | low | AddItem | | | 3005 | ArticleForCartValidation | low | AddItem | | | 3006 | ArticleQuantityValidation | low | AddItem | | | 3007 | SurveyReference | low | UpdateItemRegistration | | | 3008 | ItemLookup | low | UpdateItemRegistration | | | 3009 | RegistrationTypeAvailability | low | UpdateItemRegistration | | | 3010 | RegistrationConfigurationLookup

The registration configuration contains the information whether the **ticket registration** is required and/or possible as well as the ticket registration type. | low | PersonRegistrationService | | | 3011 | RegistrationInformationLookup

The ticket registration is required but the item is missing the survey information. | low | PersonRegistrationService | | | 3012 | RegistrationSurveyLookup | low | PersonRegistrationService | | | 3013 | RegistrationSurveyBind | low | PersonRegistrationService | | | 3014 | ArticleReservation | low | AddItem | | | 3015 | CartAssortmentStatus | low | ExclusiveAssortmentGuard | | | 3016 | RecommendationItems | low | ApplyRecommendations | | | 3101 | Limit | ArticleLimit | low | AddCoupon,AddItem | | 3102 | ArticleLimitPerAttendee | low | AddCoupon,AddItem | | | 3103 | ArticleAssortmentLimit | low | AddItem | | | 3104 | ArticleGroupLimit | low | AddItem | | | 3105 | ArticleVoucherLimit | low | AddCoupon | | | 3106 | ArticleGroupContingent | low | AddItem | | | 3107 | ArticleMinimumLimit | low | AddItem | | | 3108 | CartVoucherLimit | low | AddCoupon | | | 3201 | Voucher | TicketCodeRegistrationStatus | low | RegistrationResult | | 3202 | AlreadyReservedTicketCode | low | RegistrationResult | | | 3203 | EmptyTicketPool | low | RegistrationResult | | | 3204 | InvalidRegistrationData | low | RegistrationResult | | | 3205 | LockedTicketCode

The voucher code has been blocked. | low | RegistrationResult | | | 3206 | TicketAlreadyInCart | low | RegistrationResult | | | 3207 | TicketCanceled | low | RegistrationResult | | | 3208 | TicketCodeForAnotherFairevent | low | RegistrationResult | | | 3209 | TicketCodeUsedUp | low | RegistrationResult | | | 3210 | TicketOwnerLacksValidLegitimation | low | RegistrationResult | | | 3211 | UnkownTicketCode | low | RegistrationResult | | | 3212 | VoucherOwnership | low | AddCoupon | | | 3213 | WrongReservationGUID | low | RegistrationResult | | | 3301 | PromotionCode | _Group for Promotion Codes responses. Will be added later_ | low | | | 3401 | Legitimation | LegitimationProofTypeStatus | low | AddLegitimationHandler | | 3501 | Registration | RegistrationValidation | LOW | UpdateItemRegistrationHandler | | 3601 | Timeslots | TimeslotsBookingDayRequest | LOW | SetCartItemTimeslotsHandler

ShopTimeslotService | | 3602 | TimeslotsBookingItemAvailability | LOW | | | | 3603 | TimeslotsBookingDayExistence | LOW | | | | 3604 | TimeslotsBookingTimeRangeExistence | LOW | | | | 3605 | TimeslotsBookingTimeRangeRequirement | LOW | | | | 3606 | TimeslotsBookingDayRequirement | LOW | | | | 3607 | TimeslotsBookingDaysRequested | LOW | | | | 3608 | TimeslotsBookingDaysLimit | LOW | | | | 3609 | TimeslotsBookingDayAvailability | LOW | | | | 3610 | TimeslotsBookingTimeRangeAvailability | LOW | | | | 3611 | TimeslotsBookingUniqueDayAndTimeResult | LOW | | | ### Payment messages The payment area concerns all actions that link a payment provider to a cart. These are not yet problems or errors during the execution of a payment. These results prevent the assignment of payment providers. In the case of a sales transaction, it is not possible to continue with a checkout. If a payment provider cannot be accepted and a checkout is carried out, this is prevented by the validation. The severity of these messages can be classified as medium. | **Code** | **Category** | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 4001 | General | ExpressCartData | medium | InitializeExpressPayment | | 4002 | CartPaymentAssignmentStatusResult | medium | RemovePaymentProvider | | | 4003 | PaymentInitialization | medium | InitializeExpressPayment | | | 4006 | | PaymentStatus | medium | SetPaymentProvider | | 4007 | | PaymentProviderLookup | medium | SetPaymentProvider | ### Checkout messages The results from the checkout area are exclusively errors that can occur during the completion of a sale or registration. If one of these results occurs, the checkout cannot be continued. Depending on the result, this can lead to a support case. The severity of these messages can be classified as high. | **Code** | | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 5001 | General | CheckoutSaleAssignment | high | Checkout | | 5003 | CheckoutConfirmationMail | high | Checkout | | | 5004 | CheckoutSaleStatus | high | Checkout | | | 5005 | CheckoutCartSaleStatus | high | Checkout | | | 5006 | CheckoutBuyerDataStore | high | Checkout | | | 5007 | CheckoutSaleActions | high | Checkout | | | 5008 | CheckoutBuyerData | high | Checkout | | | 5009 | CheckoutSaleBinariesAssignment | high | Checkout | | | 5101 | Payment | CheckoutPaymentCapture | high | Checkout | | 5102 | CheckoutPaymentCaptureStatus | high | Checkout | | | 5103 | CheckoutPaymentReservation | high | Checkout | | | 5104 | CheckoutPaymentReservationStatus | high | Checkout | | | 5201 | Registration | CheckoutPromotionCodeRedemption | high | Checkout | | 5202 | CheckoutTicketRegistration | high | Checkout | | | 5203 | CheckoutTicketSaleAttachment | high | Checkout | | | 5204 | CheckoutTicketRegistrationStatus | high | Checkout | | | 5301 | Legitimation | CheckoutLegitimationPersonAssignment | high | CreateLegitimationsFilter | ### Social events messages The social event area concerns all actions, regarding all social interactions with the shop api. | **Code** | | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 6001 | General | SocialEventValidation | low | CreateSocialEvent | | 6002 | SocialEventSaleValidation | low | | | | 6003 | SocialEventPersonValidation | low | | | | 6004 | SocialEventUserValidation | low | | | | 6005 | SocialEventUserProfileValidation | low | | | | 6006 | SocialEventNetworkValidation | low | | | | 6007 | SocialEventContentStatus | low | | | | 6100 | SocialCards | SocialCardConfigurationStatus | MEDIUM | CreateSocialCard | | 6101 | SocialCardApiKeyValidation | High | | | | 6102 | SocialCardUserPersonAssignment | low | | | | 6103 | SocialCardUserProfilePictureStatus | low | | | | 6104 | SocialCardUserEventStatus | low | | | | 6110 | SocialCardLookup | low | GetSocialCard | | | 6200 | Shares | SharingStatus | High | Share | | 6201 | SharingTokenPresence | MEDIUM | | | | 6202 | SharingTokenValidation | MEDIUM | | | ### Byndr messages Byndr related processes and messages. | **Code** | | **Name** | **Severity** | **Internal Usage** | | --- | --- | --- | --- | --- | | 7001 | General | QuicodeValidation | low | | | 7002 | InitiatorUserLookup | low | | | | 7003 | TargetUserLookup | low | | | | 7004 | DailyConnectionStatus | low | | | | 7005 | EventLookup | low | | | | 7006 | InitiatorUserEligibility | low | | | ### Remarks The severity level is also used as the internal debugging levels. ## Authentication and Authorization Human documentation: https://developers.aditus.com/docs/guidelines/authentication-and-authorization All endpoints for this area can only be accessed if the client of the API is authenticated. A client is authenticated via the **ADITUS identity provider (IdP)** with client credential flow (OAuth2.0). The client submits a token to the API via the “Authentication” header. The Prefix “Bearer“ must be used for the token value. This token is checked by the IdP via the introspection endpoint and the check result is evaluated by the API. The prerequisite for successful authentication via the IdP is that the scope `Shop` is present in the clients token. ### Claims #### DistributionChainType Name: **client_DistributionChainType** Values: - Internet - OnSiteSale The distribution channel (internet/online or on-site) can be configured using the client's respective claim. However, it is possible for individual clients to take other distribution channels into account by specifying this via the authentication token in the form of the claim “**client_DistributionChainType**”. By default, only items from the “Internet” channel are used for the shop API. ### Authentication Authentication could be done by one of two techniques (Basic / OAuth) to access control to a resource. If a request has no "Authorization: \[...\]" Header set, the request will end in a response of 401: Unauthorized. By sending the Header "Authorization: Basic \[...\]" or "Authorization: Bearer \[...\]" the request will be validated with database users credentials. ### Basic Basic Authentication is the simplest technique for enforcing access control to ADITUS api endpoints. By sending the "`Authorization: Basic base64encoded(key:secret)`" HTTP Header you request access to the resource. General structure of the Header looks like the following: `Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3N3b3Jk` The value followed by "Basic " must be encoded in base64. This encoded string is a formatted string containing your key and your secret separated by a single colon (:). - key:secret The key and secret can be obtained in WebTERP. You can find a "ADITUS Basic Auth" with key an secret within your profile section "API Logins". ### OAuth / OpenID Connect Authentication can also be done by using handshake techniques. The most used and recommended technique named "OAuth" can also be used for ADITUS api endpoints. By sending the "`Authorization: Bearer token`" HTTP Header you request access to the resource. `Authorization: Bearer atrfdzdHVzZXI6dGVzdHBhc3N3b3Jk` To obtain an OAUTH-Token you have to use our OAuth-API-Endpoint. ### Authorization Authorization will currently be done by restrictions on entities. If you are able to change entities in the Frontends, you will also be able to change these entities by calling the API endpoints. --- product: ADITUS API module: Just Entrance direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/just-entrance.md humanDocumentation: https://developers.aditus.com/docs/just-entrance endpoints: 2 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Just Entrance This is the machine-readable Markdown version of the **Just Entrance** module of the ADITUS API reference (inbound (your systems call ADITUS), 2 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | POST | `{{API_BASE_URL}}/terp/v1/import/ticketowners` | Import of ticketowner | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/tasks/tickets/import` | Import external codes | HTTP Basic | ## Contents - Just Entrance — https://developers.aditus.com/docs/just-entrance - Scaning on the go — https://developers.aditus.com/docs/just-entrance/scaning-on-the-go - Import of ticket data — https://developers.aditus.com/docs/just-entrance/import-of-ticket-data - Usage of ADITUS QUICODE — https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-aditus-quicode - POST Import of ticketowner — https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-aditus-quicode/import-of-ticketowner - Usage of external codes — https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-external-codes - POST Import external codes — https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-external-codes/import-external-codes ## Overview ADITUS hardware can be used with external registration vendors. There are different ways to realise the requirements to connect external systems for a smooth visitor experience onsite while ensuring an efficient data flow. ### Purpose The ADITUS API facilitates integration between ADITUS hardware and external systems, enabling third-party registration vendors to manage visitor registration, access control, and data synchronization effectively. Whether you're working with ticketing systems, attendee management platforms, or custom registration solutions, this API provides the tools necessary to bridge the gap between your system and ADITUS technology. ### Key Features and Benefits 1. **Seamless Visitor Experience** The API enables real-time data exchange, ensuring that visitor data flows smoothly across systems without manual intervention. From check-in to access control, the integration ensures a hassle-free onsite experience. 2. **Flexibility in Integration** The API supports various approaches to meet diverse integration requirements. Whether you prefer direct API calls, data synchronization via webhooks, or bulk data transfers, the ADITUS API provides the necessary flexibility to tailor the integration to your specific needs. 3. **Efficient Data Management** The system is designed to maintain data consistency and accuracy, reducing the risk of discrepancies and manual errors. This efficiency contributes to faster operations and improved reliability. 4. **Enhanced Security** ADITUS adheres to industry best practices for secure data exchange. The API includes robust authentication and encryption mechanisms to protect sensitive visitor information during transmission. ### Integration Scenarios The ADITUS API supports various integration scenarios to accommodate the requirements of different external systems. Examples include: - **Real-Time Registration Sync**: External vendors can push visitor registration data to ADITUS hardware instantly for immediate access onsite. - **Access Control Integration**: Synchronize access permissions from your system with ADITUS hardware to manage visitor entry seamlessly. - **Batch Data Import/Export**: For events with pre-registration, the API allows bulk data upload to streamline check-in processes. ### Onboarding and Support To get started with the integration, this documentation will guide you through: - Understanding the API endpoints, methods, and expected payloads. - Setting up authentication and testing the integration. - Best practices to optimize performance and reliability. Our dedicated support team is available to assist you at every stage of your integration journey, ensuring you achieve a successful and efficient setup. ## Scaning on the go Human documentation: https://developers.aditus.com/docs/just-entrance/scaning-on-the-go The setup consists of 2 separate systems which do not exchange any data. ### User Flow User registers on the external registration page and receives a confirmation and a QR code. Then the user comes onsite and scans this QR code from the external registration system at the ADITUS entrance terminal. By scanning the QR code, the ADITUS system creates a record, saves the QR code, counts an entry and gives a GO to the user. ### Technical perspective The ADITUS system can recognise a predefined syntax of the QR code. By setting up a specific regex per category the scanned QR code will be assigned to the belonging category, a record is being created and shown in the reporting. If the same QR code is scanned again, it will be recognised and counted. ## Import of ticket data Human documentation: https://developers.aditus.com/docs/just-entrance/import-of-ticket-data The setup consists of 2 separate systems which exchange ticket data automatically. This approach is divided into two scenarios: 1. The barcode is generated in the ADITUS system, only the owner data is transmitted. This scenario is called as ADITUS QUICODE. 2. The barcode comes from the external registration system and is transmitted together with the owner data. ### Usage of ADITUS QUICODE Human documentation: https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-aditus-quicode The user registers on the external registration page and receives a confirmation email without a QR code. Once their data has been imported into ADITUS, they will receive a confirmation email containing a QR code. When they arrive on site, the user scans this QR code at the ADITUS entrance terminal. The ADITUS system recognises the barcode by scanning it, counts an entry and gives the user access. The ADITUS system can recognise its own barcodes even when the entrance terminal is offline. #### POST Import of ticketowner - Endpoint: `POST {{API_BASE_URL}}/terp/v1/import/ticketowners` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-aditus-quicode/import-of-ticketowner ##### Import Ticket Owners This endpoint allows you to import ticket owner information into the system. ##### Request Body - `faireventId` (integer or string) Here you can use one of the following properties of the fair event: \- internal Id: 42 or "42" \- unique id: "C8847785-CF69-EE11-93CF-00155D960409" \- slug: "hmmcc23" \- year and faireventnumber: "2023-6189" (format: YYYY-nnn) - `faireventExternalId` (string) - The external id 1 or 2 or 3 of the fairevent. You can also use the fairevent external id. For this you must set faireventId to null - `articleId` (integer or string) Here you can use one of the following properties of the article: \- internal Id: 186 or "186" \- unique id: "37A8A129-D669-EE11-93CF-00155D960409" - `articleNumber` (string) - The article number of the article You can also use the article number. For this you must set articleId to null - `articleExternalId` (string) - The external id 1 or 2 or 3 of the article. You can also use the article external id. For this you must set articleId and article number to null - `importTicketLinksOrQuicodes` _(number)_ – controls whether ticket links and/or Quicodes should be created/linked during import. - 0 = Show none (Default) - 1 = Only show TicketLinks - 2 = Only show Quicodes - 3 = Show both - sendComfirmationMail (boolean) - Controls whether a confirmation mail is sent to the ticket owner or not. Default: true - `TicketOwners` (array) - An array of ticket owner data including their personal information, contacts, and addresses. Each `TicketOwners` object contains the following properties: - `OwnershipExternalId` (string) (optional) - External Id that identifies the ticket assignment to the owner. This allows to update registration data afterwards but does not allow to assign the respective ticket to another owner. - `ExternalId` (string) - The external ID of the ticket owner. - `FirstName` (string) - The first name of the ticket owner. - `LastName` (string) - The last name of the ticket owner. - `GenderCode` (string) - The gender code of the ticket owner. - `SalutationLookup` (string) - The salutation of the ticket owner. - `NationalityLookup` (string) - The nationality of the ticket owner. - `JobTitle` (string) - The job title of the ticket owner. - `DataObjectType` (string) - The data object type. - `Company` (string) - The company of the ticket owner. - `Info` (array) - Additional information about the ticket owner. - `Key` (string) - The key of the information. - `Value` (string) - The value of the information. - `EMail` (string) - The email of the ticket owner. - `Phone` (string) - The phone number of the ticket owner. - `Contacts` (array) - An array of contacts for the ticket owner. - `ExternalId` (string) - The external ID of the contact. - `Value` (string) - The contact value. - `ContactNameLookup` (string) - The contact name lookup. - `ContactTypeLookup` (string) - The contact type lookup. - `IsMainContact` (boolean) - Indicates if it is the main contact. - `Info` (array) - Additional information about the contact. - `Addresses` (array) - An array of addresses for the ticket owner. - `ExternalId` (string) - The external ID of the address. - `Street` (string) - The street of the address. - `StreetNumber` (string) - The street number of the address. - `Line1` (string) - The address line 1. - `Line2` (string) - The address line 2. - `Line3` (string) - The address line 3. - `City` (string) - The city of the address. - `StateOrProvince` (string) - The state or province of the address. - `County` (string) - The county of the address. - `CountryLookup` (string) - The country lookup of the address. - `PostalCode` (string) - The postal code of the address. - `PostOfficeBox` (string) - The post office box of the address. - `AddressTypeLookup` (string) - The address type lookup. - `IsMainAddress` (boolean) - Indicates if it is the main address. - `Info` (array) - Additional information about the address. ##### Response - The response of this request is a JSON schema. Here is the schema for the response: ``` json { "type": "object", "properties": { "data": { "type": "object", "properties": { "success": { "type": "boolean" }, "importedCount": { "type": "integer" }, "errorCount": { "type": "integer" }, "failedData": { "type": "array", "items": { "type": "object", "properties": { "ticketOwnerExternalId": { "type": "string" }, "message": { "type": "string" } } } }, "importedTicketOwners": { "type": "array", "items": { "type": "object", "properties": { "ticket": { "type": "object", "properties": { "ticketNumber": { "type": "string" }, "ticketBarcode": { "type": "string" }, "regcode": { "type": "string" }, "ticketId": { "type": "string" }, "pdfTicketLink": { "type": "string" }, "mTicketLink": { "type": "string" }, "appleWalletTicketLink": { "type": "string" }, "googleWalletTicketLink": { "type": "string" }, "pdfQuicode": { "type": "string" }, "mTicketQuicode": { "type": "string" }, "walletQuicode": { "type": "string" } } }, "ticketOwner": { "type": "object", "properties": { "externalID": { "type": "string" }, "firstName": { "type": "string" }, "lastName": { "type": "string" }, "internalId": { "type": "integer" }, "uniqueId": { "type": "string" } } } } } } } } } } ``` ##### Request body example ```json { // Possible inputs "faireventId" //--------------------------------- // - internal Id: 42 or "42" // - unique id: "C8847785-CF69-EE11-93CF-00155D960409" // - slug: "hmmcc23" // - year and faireventnumber: "2023-6189" (format: YYYY-nnn) //--------------------------------- "faireventId": "2023-6189", "faireventExternalId": "UE4711", // Possible inputs "articleId" //------------------------------- // - internal Id: 186 or "186" // - unique id: "37A8A129-D669-EE11-93CF-00155D960409" //------------------------------- "articleId": "37A8A129-D669-EE11-93CF-00155D960409", "articleNumber": "123", "articleExternalId": "UE4711", "importTicketLinksOrQuicodes": 3, "sendComfirmationMail": true, "TicketOwners": [ { "OwnershipExternalId":"ID_OF_TICKET_ASSIGNMENT", "ExternalId": "YOUR_HOLDER_ID_PEROSN_A", "FirstName": "John", "LastName": "Doe", "GenderCode": "1", "SalutationLookup": "Mr", "NationalityLookup": "DE", "JobTitle": "Jack of all trades", "DataObjectType": "TERP.TicketOwners", "Company": "ADITUS GmbH", "Info": [ { "Key": "Info5", "Value": "ValueY" } ], "EMail": "john.doe@Testmail.de", "Phone": "+49 1111 111 11 1", "Contacts": [ { "ExternalId": "YOUR_CONTACT_ID_PERSON_A", "Value": "jo.doe@ditus.de", "ContactNameLookup": "eMailAlternative", "ContactTypeLookup": "EMail", "IsMainContact": true, "Info": [] } ], "Addresses": [ { "ExternalId": "YOUR_ADDRESS_ID_PERSON_A", "Street": "Mainstreet", "StreetNumber": "1", "Line1": "Line number 1", "Line2": "Line number 2", "Line3": "Line number 3", "City": "Berlin", "StateOrProvince": "Berlin", "County": "Berlin", "CountryLookup": "DE", "PostalCode": "12345", "PostOfficeBox": "PO 123XY", "AddressTypeLookup": "Privatadresse", "IsMainAddress": true, "Info": [] } ] }, { "ExternalId": "YOUR_HOLDER_ID_PEROSN_B", "FirstName": "Jack", "LastName": "Doe", "GenderCode": "1", "SalutationLookup": "Mr", "NationalityLookup": "DE", "JobTitle": "Jack of all trades", "DataObjectType": "TERP.TicketOwners", "Company": "ADITUS GmbH", "Info": [ { "Key": "Info5", "Value": "ValueY" } ], "EMail": "jack.doe@Testmail.de", "Phone": "+49 1111 111 11 1", "Contacts": [ { "ExternalId": "YOUR_CONTACT_ID_PERSON_B", "Value": "ja.doe@aditus.de", "ContactNameLookup": "eMailAlternative", "ContactTypeLookup": "EMail", "IsMainContact": true, "Info": [] } ], "Addresses": [ { "ExternalId": "YOUR_ADDRESS_ID_PERSON_B", "Street": "Mainstreet", "StreetNumber": "1", "Line1": "Line number 1", "Line2": "Line number 2", "Line3": "Line number 3", "City": "Berlin", "StateOrProvince": "Berlin", "County": "Berlin", "CountryLookup": "DE", "PostalCode": "12345", "PostOfficeBox": "PO 123XY", "AddressTypeLookup": "Privatadresse", "IsMainAddress": true, "Info": [] } ] }, { "ExternalId": "YOUR_HOLDER_ID_PEROSN_FAILED", "FirstName": "Jack", "LastName": "Doe", "GenderCode": "1", "SalutationLookup": "Mr", "NationalityLookup": "DE", "JobTitle": "Jack of all trades", "DataObjectType": "TERP.TicketOwners", "Company": "ADITUS GmbH", "Info": [ { "Key": "Info5", "Value": "ValueY" } ], "EMail": "jack.doeTestmail.de", "Phone": "+49 1111 111 11 1", "Contacts": [ { "ExternalId": "YOUR_CONTACT_ID_PERSON_FAILED", "Value": "jo.doe@aditus.de", "ContactNameLookup": "eMailAlternative", "ContactTypeLookup": "EMail", "IsMainContact": true, "Info": [] } ], "Addresses": [ { "ExternalId": "YOUR_ADDRESS_ID_PERSON_FAILED", "Street": "Mainstreet", "StreetNumber": "1", "Line1": "Line number 1", "Line2": "Line number 2", "Line3": "Line number 3", "City": "Berlin", "StateOrProvince": "Berlin", "County": "Berlin", "CountryLookup": "DE", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ##### Response example: (200 OK) ```json { "data": { "success": false, "importedCount": 2, "errorCount": 1, "failedData": [ { "ticketOwnerExternalId": "YOUR_HOLDER_ID_PEROSN_FAILED", "message": "import data with 'ExternalId' 'YOUR_HOLDER_ID_PEROSN_FAILED' failed. value 'jack.doeTestmail.de' of 'CRM.Persons_EMail' is invalid. error 'ValueNotValid'" } ], "importedTicketOwners": [ { "ticket": { "ticketNumber": "6189312330002301", "ticketBarcode": "6189312330002301", "regcode": "AU8C7TKAHQSBAC", "ticketId": "9a30ebaf-fa0d-f011-93dd-00155d96040a", "pdfTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9a30ebaf-fa0d-f011-93dd-00155d96040a/Pdf?s=EJZiZFgYLO9Bmg/", "mTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9a30ebaf-fa0d-f011-93dd-00155d96040a/Html?s=EJZiZFgYLO9Bmg/", "appleWalletTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9a30ebaf-fa0d-f011-93dd-00155d96040a/Pkpass?s=EJZiZFgYLO9Bmg/", "googleWalletTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9a30ebaf-fa0d-f011-93dd-00155d96040a/GoogleWallet?s=EJZiZFgYLO9Bmg/", "pdfQuicode": "HTTP://QUICO.DE/AU8C7TKAHQSBACDAB/V/F1WSNAAN87UM9FAQYFF4QYFWFTVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0", "mTicketQuicode": "HTTP://QUICO.DE/AU8C7TKAHQSBACGJB/V/F1WSNAAN87UM9FAQYFF4QYFWFTVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0", "walletQuicode": "HTTP://QUICO.DE/AU8C7TKAHQSBACGAB/V/F1WSNAAN87UM9FAQYFF4QYFWFTVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0" }, "ticketOwner": { "externalID": "YOUR_HOLDER_ID_PEROSN_A", "firstName": "John", "lastName": "Doe", "internalId": 117722, "uniqueId": "bd1e1a96-87fd-ef11-93dd-00155d96040a" } }, { "ticket": { "ticketNumber": "6189312310002314", "ticketBarcode": "6189312310002314", "regcode": "AWUPDARDVF9V6X", "ticketId": "9b30ebaf-fa0d-f011-93dd-00155d96040a", "pdfTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9b30ebaf-fa0d-f011-93dd-00155d96040a/Pdf?s=aMoUTvIEbzSg8g/", "mTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9b30ebaf-fa0d-f011-93dd-00155d96040a/Html?s=aMoUTvIEbzSg8g/", "appleWalletTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9b30ebaf-fa0d-f011-93dd-00155d96040a/Pkpass?s=aMoUTvIEbzSg8g/", "googleWalletTicketLink": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/9b30ebaf-fa0d-f011-93dd-00155d96040a/GoogleWallet?s=aMoUTvIEbzSg8g/", "pdfQuicode": "HTTP://QUICO.DE/AWUPDARDVF9V6XDAB/V/F1WSNAAN87UM9GM1VADS17CASEVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0", "mTicketQuicode": "HTTP://QUICO.DE/AWUPDARDVF9V6XGJB/V/F1WSNAAN87UM9GM1VADS17CASEVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0", "walletQuicode": "HTTP://QUICO.DE/AWUPDARDVF9V6XGAB/V/F1WSNAAN87UM9GM1VADS17CASEVD9S5Q3PWPY6ME7SBS46ZSM4NWCDTGU8M7HPB9DJKQG3EBG48KV/C/%7C%20%E2%88%80%7C/T/ADITUS-DEV-0" }, "ticketOwner": { "externalID": "YOUR_HOLDER_ID_PEROSN_B", "firstName": "Jack", "lastName": "Doe", "internalId": 117723, "uniqueId": "c11e1a96-87fd-ef11-93dd-00155d96040a" } } ] } } ``` ### Usage of external codes Human documentation: https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-external-codes User registers on the external registration page and receives a confirmation and an external QR code. Then the user comes onsite and scans this QR code from the external registration system at the ADITUS entrance terminal. By scanning the QR code, the ADITUS system recognises the record, saves the QR code, counts an entry and gives a GO to the user. #### POST Import external codes - Endpoint: `POST {{API_BASE_URL}}/tasks/tickets/import` - Authentication: HTTP Basic - Human documentation: https://developers.aditus.com/docs/just-entrance/import-of-ticket-data/usage-of-external-codes/import-external-codes ##### Import Tickets for a Task The API endpoint `POST {{API_BASE_URL}}/tasks/tickets/import` is used to import tickets for a specific event. The request should include the faireventId, articleId, and an array of Tickets, where each ticket contains information about the person associated with the ticket. ##### Auth and Role - **Auth** OAuth 2.0 (inherit from collection) - **Required role** - BASEROLE - ApiTicketImport ##### Headers - **Content-Type:** application/json - **Accept**: \*/\* ##### Request Body The request body must be in JSON format and contains the following parameter: - `faireventId`: Here you can use one of the following properties of the fair event: - internal Id: 42 or "42" - unique id: "C8847785-CF69-EE11-93CF-00155D960409" - slug: "hmmcc23" - year and faireventnumber: "2023-6189" (format: YYYY-nnn) - `fairevenExternalId` - The external id 1 or 2 or 3 of the fairevent. You can also use the fairevent external id. For this you must set faireventId to null - `articleId` (optional): Here you can use one of the following properties of the article: - internal Id: 186 or "186" - unique id: "37A8A129-D669-EE11-93CF-00155D960409" - `articleNumber` (optional) You can also use the article number. For this you must set articleId to null - `articleExternalId` (optional) The external id 1 or 2 or 3 of the article. You can also use the article external id. For this you must set articleId and article number to null - `Tickets` (required array): An array containing ticket objects, each with information about the ticket and the associated person. ##### Ticket Object - `Ticket` (object): Information about the ticket. - `Barcode` (optional): The barcode associated with the ticket. - `ExternalId` (optional): The external ID of the ticket. - `Blocked` (required): A boolean indicating whether the ticket is blocked. - `Person` (object): Information about the person associated with the ticket. - `ExternalId` (optional): The external ID of the person. - `FirstName` (optional): The first name of the person. - `LastName` (optional): The last name of the person. - `GenderCode` (optional): The gender code of the person. - `SalutationLookup` (optional): The salutation of the person. - `NationalityLookup` (optional): The nationality of the person. - `JobTitle` (optional): The job title of the person. - `DataObjectType` (optional): The data object type of the person. - `Company` (optional): The company associated with the person. - `Info` (array): Additional information about the person. - `Key` (string): The key of the information. - `Value` (optional): The value of the information. - `EMail` (required): The email address of the person. - `Phone` (required): The phone number of the person. - `Contacts` (array): An array of contact information for the person. - `ExternalId` (optional): The external ID of the contact. - `ExternalId2` (optional): Another external ID of the contact. - `ExternalId3` (optional): Yet another external ID of the contact. - `Value` (optional): The value of the contact. - `ContactNameLookup` (optional): The name associated with the contact. - `ContactTypeLookup` (optional): The type of the contact. - `IsMainContact` (optional): Indicates if the contact is the main contact. - `Info` (array): Additional information about the contact. - `Addresses` (array): An array of addresses for the person. - `ExternalId` (optional): The external ID of the address. - `ExternalId2` (optional): Another external ID of the address. - `ExternalId3` (optional): Yet another external ID of the address. - `Street` (optional): The street of the address. - `Street2` (optional): Another street information of the address. - `Street3` (optional): Yet another street information of the address. - `StreetNumber` (optional): The street number of the address. - `Line1` (optional): Line 1 of the address. - `Line2` (optional): Line 2 of the address. - `Line3` (optional): Line 3 of the address. - `City` (optional): The city of the address. - `StateOrProvince` (optional): The state or province of the address. - `County` (optional): The county of the address. - `CountryLookup` (optional): The country of the address. - `PostalCode` (optional): The postal code of the address. - `PostOfficeBox` (optional): The post office box of the address. - `AddressTypeLookup` (optional): The type of the address. - `IsMainAddress` (optional): Indicates if the address is the main address. - `Info` (array): Additional information about the address. ##### Response The response structure will provide feedback on the success or failure of the import operation. While the exact response structure is not detailed here, users can expect a confirmation of the import status, along with any relevant messages or error details if applicable. **201 CREATED** - Default success code for creation - resource has been created successfully. - The location header points to the URL of the created task (**api/tasks/tickets/import/{id}**). - Alternatively, you can read `result.import.id` from the response body to build the status URL. **400 BAD REQUEST** Default Error Code - Used if an object has invalid parameters, for more information about this read "[Errors](https://aditus.atlassian.net/wiki/spaces/API/pages/1139540828/Errors)". **500 INTERNAL SERVER ERROR** Default Error Code - Used if an exception occurs ##### Next Steps 1\. Poll **GET "**/tasks/tickets/import/{id}" until status is "Completed" 2\. Retrieve result with **GET** "/tasks/tickets/import/{id}/result" ##### Usage - To use this endpoint effectively, ensure that the `faireventId` or the `fairevenExternalId` is correctly populated with the relevant event data. This will ensure that the import operation targets the correct exhibitors associated with the specified fair event. - Use "EnableDetailedResult=true" to get extended logs in the result. ##### Response Structure If the process is successful, the server returns a **201 Created** status with details of the imported task. ``` json { "_links": { "self": { "href": "/tickets/import" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 14961, "createdOn": "2025-09-18T10:31:12.4752569", "executionFrom": "2025-09-18T10:31:12.4752569", "lastActionOn": "2025-09-18T10:31:12.7208533", "id": "742", "status": 253, "targetResourceId": 1, "finishedOn": "2025-09-18T10:31:12.7208533", "startedOn": null, "taskId": 12550 } } } ``` **Keywords**: ticket import, json import, data array, start task, create import ##### Request body example ```json { // Possible inputs "faireventId" //--------------------------------- // - internal Id: 42 or "42" // - unique id: "C8847785-CF69-EE11-93CF-00155D960409" // - slug: "hmmc23" // - year and faireventnumber: "2023-6189" (format: YYYY-nnn) //--------------------------------- "faireventId": "42", "faireventExternalId": "TH7734", // Possible inputs "articleId" //------------------------------- // - internal Id: 186 or "186" // - unique id: "37A8A129-D669-EE11-93CF-00155D960409" //------------------------------- "articleId": "186", "articleNumber": "123", "articleExternalId": "TZ4711", "Tickets": [ { "Ticket": { "Barcode": "YOUR_ENTRANCE_CODE", "ExternalId": "YOUR_ENTRANCE_ID", "Blocked": false }, "Person": { "ExternalId": "YOUR_HOLDER_ID", "FirstName": "John", "LastName": "Doe", "GenderCode": "Male", // male "SalutationLookup": "Mr", "NationalityLookup": "DE", "JobTitle": "Jack of all trades", "DataObjectType": "CRM.Persons", "Company": "ADITUS GmbH", "Info": [ { "Key": "InfoX", "Value": "ValueY" } ], "EMail": "test@postman.com", "Phone": "+49 1111 111 11 1", "Contacts": [ { "Value": "j.doe@ditus.de", "ContactNameLookup": "EMail", "ContactTypeLookup": "EMail", "IsMainContact": true, "Info": [] } ], "Addresses": [ { "Street": "Mainstreet", "StreetNumber": "1", "Line1": "Line number 1", "Line2": "Line number 2", "Line3": "Line number 3", "City": "Berlin", "StateOrProvince": "Berlin", "County": "Berlin", "CountryLookup": "DE", "PostalCode": "12345", "PostOfficeBox": "PO 123XY", "AddressTypeLookup": "CRM.Adresses", "IsMainAddress": true, "Info": [] } ] } } ] } ``` ##### Response example: (201 Created) ```json { "_links": { "self": { "href": "/tickets/import" }, "curies": { "name": "adi", "href": "http://localhost:8000/ADITUS-DEV-0_F4_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 14263, "createdOn": "2026-05-07T10:40:35.8722895", "executionFrom": "2026-05-07T10:40:35.8652785", "lastActionOn": "2026-05-07T10:40:35.9813759", "id": "508", "status": 128, "targetResourceId": 42, "finishedOn": null, "startedOn": null, "taskId": 51191 } } } ``` --- product: ADITUS API module: Ticket purchase & registration direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/ticket-purchase-registration.md humanDocumentation: https://developers.aditus.com/docs/ticket-purchase-registration endpoints: 77 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Ticket purchase & registration This is the machine-readable Markdown version of the **Ticket purchase & registration** module of the ADITUS API reference (inbound (your systems call ADITUS), 77 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | GET | `{{API_BASE_URL}}/shop/v1/discovery/configuration` | Get configuration | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/payment-providers` | Get payment providers | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events?$expand=all` | Get events | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event?$expand=all` | Get event | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/communication-groups/:group` | Get communication group | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/legitimation-categories` | Get legitimation categories | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/payment-providers` | Get payment providers by event | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments` | Get assortments by event | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortment` | Get assortment details by event | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortmentID/articles` | Get assortment articles | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/lookups/:name` | Get lookups by name | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service` | Get Terms of Service without User | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service/users/:userId` | Get Terms of Service with User | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart` | Create cart | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart?$expand=All` | Get cart | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/theme` | Get cart theme | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` | Get payment provider by cart | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments` | Get assortments by cart | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment` | Get assortment details by cart | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment/articles` | Get assortment articles by cart | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/items` | Add item | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item` | Remove item | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/remove` | Remove items | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/properties` | Modify properties | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:id/culture` | Set culture | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/user` | Set user | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` | Set payment provider | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/shop/v1/cart/{{CART_ID}}/payment-providers` | Delete payment provider | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/payment-provider/express-checkout?$expand=` | Initialize Express Checkout | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/validate` | Validate cart | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/validate/:validator` | Validate cart with validator | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/checkout` | Checkout cart | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/clear` | Clear cart | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart` | Delete cart | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cartId/terms-of-service` | Update Terms of Service Status | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cartId/coupons/:coupon?$expand=` | Remove coupon | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` | Check and redeem coupon | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` | Get coupon information | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration?$expand=` | Update item's registration | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots?$expand=AssociatedPersonOnItems&$expand=AvailableTimeslotsOnItems` | Update item's timeslots | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration/self/prefill-data` | Get item registration prefill data | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots` | Get item's timeslots information | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation` | Add legitimation | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document` | Add legitimation document | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document/:document` | Remove legitimation document | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:id/buyer` | Set buyer | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/shop/v1/cart/:cart/billing` | Set billing | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` | Get recommendations | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` | Apply recommendations | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/carts?event={{EVENT}}` | Get carts | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/orders?event={{EVENT}}` | Get orders | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId` | Get order details | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations tracking | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` | Get exhibitor recommendations tracking click | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/cart` | Get cart from order | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/confirmation/resend` | Resend confirmation email | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/orders/:order/registration-reminder/resend` | Resend registration reminder email | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/profile` | Get profile | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/profile` | Update profile | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/profile/picture` | Get profile picture | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/profile/picture` | Set profile picture | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/legitimations` | Get legitimations | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/user/:user/legitimations/:legitimation` | Get legitimation | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/communication-groups/:communicationgroup` | Unsubscribe from mailing | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:userId/terms-of-service` | Update Terms of Service Status | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/user/:user/mailing-preferences` | Update mailing preferences | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/localization?context=event:{{EVENT}}&includeNestedScopes=True&includeUpcoming=True&scope=ShopClient/Page/Home/Events` | Get resource | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/localization/languages` | Get languages | OAuth 2.0 bearer token (client credentials) | | GET | `` | Get content | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/social/cards` | Create social card | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/social/cards/:id` | Get social card | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event` | Get social card by user and event | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event/article/:articleId` | Get social card by user, event and article | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/social/event` | Create event | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/shop/v1/social/shares` | Share on social networks | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/systems/swagger/shop` | Get swagger document | OAuth 2.0 bearer token (client credentials) | ## Contents - Ticket purchase & registration — https://developers.aditus.com/docs/ticket-purchase-registration - Discovery — https://developers.aditus.com/docs/ticket-purchase-registration/discovery - GET Get configuration — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-configuration - GET Get payment providers — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers - GET Get events — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-events - GET Get event — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-event - GET Get communication group — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-communication-group - GET Get legitimation categories — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-legitimation-categories - GET Get payment providers by event — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers-by-event - GET Get assortments by event — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortments-by-event - GET Get assortment details by event — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-details-by-event - GET Get assortment articles — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-articles - GET Get lookups by name — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-lookups-by-name - GET Get Terms of Service without User — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-without-user - GET Get Terms of Service with User — https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-with-user - Cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart - Basic cart processes — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes - POST Create cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/create-cart - GET Get cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart - GET Get cart theme — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart-theme - GET Get payment provider by cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-payment-provider-by-cart - GET Get assortments by cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortments-by-cart - GET Get assortment details by cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-details-by-cart - GET Get assortment articles by cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-articles-by-cart - POST Add item — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/add-item - DELETE Remove item — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-item - POST Remove items — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-items - POST Modify properties — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/modify-properties - PUT Set culture — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-culture - PUT Set user — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-user - PUT Set payment provider — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-payment-provider - DELETE Delete payment provider — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-payment-provider - POST Initialize Express Checkout — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/initialize-express-checkout - POST Validate cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart - POST Validate cart with validator — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart-with-validator - POST Checkout cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/checkout-cart - POST Clear cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/clear-cart - DELETE Delete cart — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-cart - POST Update Terms of Service Status — https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/update-terms-of-service-status - Coupons — https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons - DELETE Remove coupon — https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/remove-coupon - POST Check and redeem coupon — https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/check-and-redeem-coupon - GET Get coupon information — https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/get-coupon-information - Registration — https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration - PUT Update item's registration — https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-registration - PUT Update item's timeslots — https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-timeslots - GET Get item registration prefill data — https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-registration-prefill-data - GET Get item's timeslots information — https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-s-timeslots-information - Legitimation — https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation - POST Add legitimation — https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation - POST Add legitimation document — https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation-document - DELETE Remove legitimation document — https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/remove-legitimation-document - Billing — https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing - PUT Set buyer — https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-buyer - PUT Set billing — https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-billing - Recommendations — https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations - GET Get recommendations — https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/get-recommendations - POST Apply recommendations — https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/apply-recommendations - User — https://developers.aditus.com/docs/ticket-purchase-registration/user - Carts — https://developers.aditus.com/docs/ticket-purchase-registration/user/carts - GET Get carts — https://developers.aditus.com/docs/ticket-purchase-registration/user/carts/get-carts - Orders — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders - GET Get orders — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-orders - GET Get order details — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-order-details - GET Get exhibitor recommendations — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations - GET Get exhibitor recommendations tracking — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking - GET Get exhibitor recommendations tracking click — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking-click - GET Get cart from order — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-cart-from-order - POST Resend confirmation email — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-confirmation-email - POST Resend registration reminder email — https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-registration-reminder-email - Profile — https://developers.aditus.com/docs/ticket-purchase-registration/user/profile - GET Get profile — https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile - POST Update profile — https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/update-profile - GET Get profile picture — https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile-picture - POST Set profile picture — https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/set-profile-picture - Legitimations — https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations - GET Get legitimations — https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimations - GET Get legitimation — https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimation - POST Unsubscribe from mailing — https://developers.aditus.com/docs/ticket-purchase-registration/user/unsubscribe-from-mailing - POST Update Terms of Service Status — https://developers.aditus.com/docs/ticket-purchase-registration/user/update-terms-of-service-status - POST Update mailing preferences — https://developers.aditus.com/docs/ticket-purchase-registration/user/update-mailing-preferences - Localization — https://developers.aditus.com/docs/ticket-purchase-registration/localization - GET Get resource — https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-resource - GET Get languages — https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-languages - GET Get content — https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-content - Social — https://developers.aditus.com/docs/ticket-purchase-registration/social - Cards — https://developers.aditus.com/docs/ticket-purchase-registration/social/cards - POST Create social card — https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/create-social-card - GET Get social card — https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card - GET Get social card by user and event — https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-and-event - GET Get social card by user, event and article — https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-event-and-article - POST Create event — https://developers.aditus.com/docs/ticket-purchase-registration/social/create-event - POST Share on social networks — https://developers.aditus.com/docs/ticket-purchase-registration/social/share-on-social-networks - GET Get swagger document — https://developers.aditus.com/docs/ticket-purchase-registration/get-swagger-document ## Overview The Shop API deals with requests concerning shop processes. This includes finding shop resources, the user and managing the cart and buying process. ### Discovery Uses to discover the system configuration, upcoming events, available assortments, sellable articles incl. prices, payment provider and their payment methods and more. ### Cart The Cart section is responsible for managing the shopping cart functionality. The API is designed to streamline the process of integrating the shopping cart functionality into your application. It provides a straightforward way to retrieve and manipulate cart data, making it easy to build features like adding items to the cart, updating quantities, or removing items. ### User Behind the user section are the operations that are based on a specific user. ### Localization The Localization section of the API allows you to easily manage the localization settings for your application. Localization is the process of adapting your application to different languages, regions, and cultures, making it accessible to a global audience. This includes reading language preferences, date and time formats, currency formats, and other regional settings. By leveraging the Localization API, you can enhance the accessibility and usability of your application, allowing users from different parts of the world to interact with your product effectively. ### Social The Social section allows to create social cards to share on social media. ### Terms of Service The Terms of Service endpoints provide information about the configured Terms of Service including the approval status of the user, and allow to update that status. ## Discovery Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery Uses to discover the system configuration, upcoming events, available assortments, sellable articles incl. prices, payment provider and their payment methods and much more. Typical and supported use cases are: - Get all possible payment providers - Get the main configuration data - Get all the upcoming events - Get the event data by given identifier - Get all possible payment providers for given event - Get the assortments of an event by given event identifier - Get the assortment details of an event and assortment by given event identifier - Find all articles in an assortment - Get a lookup list including lookup data - Get data changes in a specified time - Get the legitimation categories If a cart exists, using the cart endpoints for **payment providers** and **assortments** is preferred, as they are more specific. For example, payment providers can differ depending on the selected articles. ### GET Get configuration - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/configuration` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-configuration This endpoint retrieves a list of discovery events. #### Request No request body parameters are required for this request. #### Response The `data` array contains objects with details about the discovery events, including the event ID, name, year, number, slug, description, date and time span, icon details, logo details, sorting order, registration availability, sales availability, public registration details, assortments, and currency. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": { "mandator": "ADITUS-DEV-0", "lookups": { "salutations": "P_ANREDEN", "countries": "P_LAENDER_ADITUS", "title": "P_TITEL", "cookieConsent": "SHOP_COOKIE_CONSENT" }, "tracking": { "scriptHead": "\r\n", "scriptBody": " " }, "useTotpForNewUsers": false, "useWebsiteMetricTracking": true, "frameAncestors": "https://jsfiddle.net https://fiddle.jshell.net https://www.w3schools.com https://codepen.io https://seleniumbase.io/ https://dev.aditus.de", "externalLoginProviders": [ { "type": "facebook", "clientId": "", "clientSecret": "", "authority": "" }, { "type": "google", "clientId": "", "clientSecret": "", "authority": "https://accounts.google.com" }, { "type": "linkedin", "clientId": "", "clientSecret": "", "authority": "https://www.linkedin.com/oauth" }, { "type": "apple", "clientId": "", "clientSecret": "", "authority": "https://appleid.apple.com" } ], "charsetInputFilter": [ { "name": "Arabic", "regexRule": "[\\u0600-\\u06ff\\u0750-\\u077f\\ufb50-\\ufbc1\\ufbd3-\\ufd3f\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufe70-\\ufefc\\uFDF0-\\uFDFD]" } ], "socialFollows": [ { "name": "LinkedIn", "color": "#4875B4", "type": "LinkedIn", "url": "https://de.linkedin.com/company/aditusgmbh" }, { "name": "Facebook", "color": "#3b5998", "type": "Facebook", "url": "https://www.facebook.com/aditusgmbh/" }, { "name": "X", "color": "#000000", "type": "Twitter", "url": "https://x.com/DEV-0" }, { "name": "Xing", "color": "#026466", "type": "Xing", "url": "https://www.xing.com/pages/aditusgmbh" }, { "name": "TikTok", "color": "#fe2c55", "type": "TikTok", "url": "https://www.tiktok.com/@aditusgmbh" }, { "name": "Instagram", "color": "#555", "type": "Instagram", "url": "https://instagram.com/aditusgmbh" } ] } } ``` ### GET Get payment providers - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/payment-providers` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers This endpoint allows you to retrieve a list of payment providers available for discovery. #### Request This request does not require a request body. #### Response Body The response will contain an array of payment providers, each with the following details: - `id` (string): The unique identifier for the payment provider. - `name` (string): The name of the payment provider. - `description` (string): A brief description of the payment provider, if available. - `paymentMethods` (array): An array of payment methods offered by the provider, with each method containing a `methodType`. - `configuration` (object): Details about the configuration of the payment provider, including `saferpayFieldsUrl`, `saferpayFieldsLibrary`, and `saferpayFieldsAccessToken`. - `sort` (integer): The sorting order of the payment provider. - `isDefault` (boolean): Indicates if the payment provider is the default option. - `isExpressCheckoutSupported` (boolean): Indicates if the payment provider supports express checkout. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": [ { "id": "210f6011-343d-ee11-93cf-00155d960409", "name": "Credit card", "description": null, "paymentMethods": [ { "methodType": "Mastercard" }, { "methodType": "Visa" }, { "methodType": "Amex" } ], "configuration": { "saferpayFieldsUrl": "https://test.saferpay.com/Fields/404227", "saferpayFieldsLibrary": "https://test.saferpay.com/Fields/lib/1/saferpay-fields.js", "saferpayFieldsAccessToken": "«redacted»" }, "sort": 0, "isDefault": true, "isExpressCheckoutSupported": false }, { "id": "948ade45-b0c5-ee11-93d3-00155d96040a", "name": "Sofort", "description": null, "paymentMethods": [ { "methodType": "Sofort" } ], "configuration": { "payPalUseLightbox": "True", "payPalClientId": "«redacted»" }, "sort": 5, "isDefault": false, "isExpressCheckoutSupported": true }, { "id": "fba84973-b0c5-ee11-93d3-00155d96040a", "name": "PayPal", "description": null, "paymentMethods": [ { "methodType": "PayPal" } ], "configuration": { "payPalUseLightbox": "True", "payPalClientId": "«redacted»" }, "sort": 15, "isDefault": false, "isExpressCheckoutSupported": true }, { "id": "6045539b-2ecb-ee11-93d3-00155d96040a", "name": "iDEAL", "description": null, "paymentMethods": [ { "methodType": "Ideal" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "dcd0d596-33cb-ee11-93d3-00155d96040a", "name": "Wallet", "description": null, "paymentMethods": [ { "methodType": "ApplePay" }, { "methodType": "GooglePay" } ], "configuration": {}, "sort": 40, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "838fc7d2-a0cc-ee11-93d3-00155d96040a", "name": "Giropay", "description": null, "paymentMethods": [ { "methodType": "Giropay" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "279e1fec-a0cc-ee11-93d3-00155d96040a", "name": "EPS", "description": null, "paymentMethods": [ { "methodType": "Eps" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "d3d3bc1e-a1cc-ee11-93d3-00155d96040a", "name": "UnionPay", "description": null, "paymentMethods": [ { "methodType": "UnionPay" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "b7ccdb37-a1cc-ee11-93d3-00155d96040a", "name": "TWINT", "description": null, "paymentMethods": [ { "methodType": "Twint" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "ecd4184c-a1cc-ee11-93d3-00155d96040a", "name": "Postfinance", "description": null, "paymentMethods": [ { "methodType": "Postfinance" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "ee897ed8-1d27-ef11-93d7-00155d96040a", "name": "NGenius", "description": null, "paymentMethods": [ { "methodType": "Visa" }, { "methodType": "Mastercard" } ], "configuration": { "outletReference": "4b105a76-8b2b-41b9-b0e0-a8decf3c5d18", "useSandbox": "True", "paymentMethods": "VISA, MASTERCARD", "walletMethods": "" }, "sort": 100, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "a7fed2b9-fe3c-ef11-93d8-00155d96040a", "name": "NGenius Wallet", "description": null, "paymentMethods": [ { "methodType": "ApplePay" }, { "methodType": "GooglePay" } ], "configuration": { "outletReference": "4b105a76-8b2b-41b9-b0e0-a8decf3c5d18", "useSandbox": "True", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get events - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events?$expand=all` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-events This endpoint retrieves a list of discovery events. #### Request No request body is required for this request. #### Response - `data` (array) - An array containing objects with details about the discovery events. - `id` (string) - The ID of the event. - `name` (string) - The name of the event. - `year` (string) - The year of the event. - `number` (string) - The event number. - `slug` (string) - The slug of the event. - `description` (string) - The description of the event, if available. - `dateTimeSpan` (object) - An object containing the start and end date and time of the event. - `start` (string) - The start date and time of the event. - `end` (string) - The end date and time of the event. - `icon` (object) - An object containing details about the event icon. - `key` (string) - The key of the icon. - `uri` (string) - The URI of the icon. - `type` (string) - The type of the icon. - `background` (string) - The background of the icon. - `logo` (object) - An object containing details about the event logo. - `key` (string) - The key of the logo. - `uri` (string) - The URI of the logo. - `type` (string) - The type of the logo. - `background` (string) - The background of the logo. - `sort` (number) - The sorting order of the event. - `isRegistrationAvailable` (boolean) - Indicates if registration is available for the event. - `isSalesAvailable` (boolean) - Indicates if sales are available for the event. - `publicRegistration` (object) - An object containing details about public registration. - `isAvailable` (boolean) - Indicates if public registration is available. - `assortments` (array) - An array of assortments available for the event. - `id` (string) - The ID of the assortment. - `name` (string) - The name of the assortment, if available. - `description` (string) - The description of the assortment, if available. - `sort` (number) - The sorting order of the assortment. - `isDefault` (boolean) - Indicates if the assortment is the default. - `configuration` (object) - An object containing configuration details of the assortment. - `maxNumberOfTicketsPerSale` (number) - The maximum number of tickets per sale for the assortment. - `currency` (string) - The currency used for the event. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | all | | #### Response example: (200 OK) ```json { "data": [ { "id": "10b992c5-53e9-ef11-93da-00155d96040a", "name": "Galaxio Messe", "year": "2050", "number": "6666", "slug": "GalaxioExpo2050", "description": null, "dateTimeSpan": { "start": "3175-01-01T04:20:00+01:00", "end": "3175-12-31T04:20:00+01:00" }, "icon": { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:10b992c5-53e9-ef11-93da-00155d96040a&language=de&v=589b103200fd40ed4097d8bea770c8ec217f85f5ad68c683d030aa874d4aafff", "type": "Icon", "background": "Light" }, "logo": { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:10b992c5-53e9-ef11-93da-00155d96040a&language=de&v=589b103200fd40ed4097d8bea770c8ec217f85f5ad68c683d030aa874d4aafff", "type": "Icon", "background": "Light" }, "sort": 0, "isRegistrationAvailable": true, "isSalesAvailable": true, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "currency": "EUR" }, { "id": "749277fb-51f4-ef11-93dc-00155d96040a", "name": "AS-8172", "year": "2028", "number": "172", "slug": "AS-81722028", "description": null, "dateTimeSpan": { "start": "2028-01-01T00:00:00+01:00", "end": "2028-01-31T23:59:00+01:00" }, "icon": null, "logo": null, "sort": 1, "isRegistrationAvailable": false, "isSalesAvailable": false, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [], "currency": "EUR" }, { "id": "ebb7d460-828f-ef11-93d8-00155d96040a", "name": "Middle East Security Days", "year": "2027", "number": "9998", "slug": "MiddleEastSecurityDays2027", "description": null, "dateTimeSpan": { "start": "2027-12-27T00:00:00+01:00", "end": "2027-12-30T23:59:00+01:00" }, "icon": null, "logo": null, "sort": 2, "isRegistrationAvailable": false, "isSalesAvailable": false, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [], "currency": "AED" }, { "id": "accdbcc1-51f4-ef11-93dc-00155d96040a", "name": "AS-8172", "year": "2027", "number": "172", "slug": "AS-81722027", "description": null, "dateTimeSpan": { "start": "2027-01-01T00:00:00+01:00", "end": "2027-01-31T23:59:00+01:00" }, "icon": null, "logo": null, "sort": 3, "isRegistrationAvailable": false, "isSalesAvailable": false, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [], "currency": "EUR" }, { "id": "712d188d-caf9-ef11-93dd-00155d96040a", "name": "Murica Con", "year": "2026", "number": "1776", "slug": "MuricaCon2026", "description": null, "dateTimeSpan": { "start": "2026-07-05T00:00:00+02:00", "end": "2026-07-05T23:59:00+02:00" }, "icon": { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:712d188d-caf9-ef11-93dd-00155d96040a&language=de&v=1626fce90c46917f9560dd10ae4cb11b6f3fa8c1c7ced005a30719be0f1d9c21", "type": "Icon", "background": "Light" }, "logo": null, "sort": 4, "isRegistrationAvailable": true, "isSalesAvailable": true, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "currency": "USD" }, { "id": "32995bb8-270d-ef11-93d7-00155d96040a", "name": "MAS SRE Moments", "year": "2026", "number": "29", "slug": "MASSREMoments2026", "description": null, "dateTimeSpan": { "start": "2026-05-11T00:00:00+02:00", "end": "2026-05-11T23:59:00+02:00" }, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: (200 OK) ```json { "data": [ { "id": "10b992c5-53e9-ef11-93da-00155d96040a", "name": "Galaxio Messe", "year": "2050", "number": "6666", "slug": "GalaxioExpo2050", "description": null, "dateTimeSpan": { "start": "3750-01-01T04:20:00+01:00", "end": "3750-12-31T04:20:00+01:00" }, "icon": { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:10b992c5-53e9-ef11-93da-00155d96040a&language=de&v=589b103200fd40ed4097d8bea770c8ec217f85f5ad68c683d030aa874d4aafff", "type": "Icon", "background": "Light" }, "logo": { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:10b992c5-53e9-ef11-93da-00155d96040a&language=de&v=589b103200fd40ed4097d8bea770c8ec217f85f5ad68c683d030aa874d4aafff", "type": "Icon", "background": "Light" }, "sort": 0, "isRegistrationAvailable": true, "isSalesAvailable": true, "publicRegistration": { "isAvailable": false, "assortments": [] }, "assortments": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "showInShop": false, "linkText": null, "shortName": null, "shortDescription": null, "iconSmall": null, "iconBig": null, "configuration": { "maxNumberOfTicketsPerSale": null } }, { "id": "3156022f-c6b0-f011-93e1-00155d96040a", "name": "Galaktische Diplomaten", "description": "Für alle Repräsentanten aller interstellar anerkannten Zivilisationen von Typ 1.5 oder höher!", "sort": 0, "isDefault": false, "showInShop": true, "linkText": null, "shortName": null, "shortDescription": "Sie sind Journalist oder Blogger? Hier können Sie sich akkreditieren.", "iconSmall": null, "iconBig": null, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "configuration": { "availableLanguages": [ { "name": "English", "code": "en", "sort": 0 }, { "name": "Deutsch", "code": "de", "sort": 0 } ], "location": { "name": null, "description": null, "plusCode": null, "geoCoordinates": "50.854944887784924, 7.119726048019161", "country": "DE" }, "metaTags": { "description": null }, "showInOverview": true, "showSummaryBeforeCheckout": true, "redirectAfterRegistration": false, "showCookieConsent": false, "tracking": { "scriptHead": "\r\n", "scriptBody": " " }, "useTotpForNewUsers": false, "showAttendeeBadgePreview": true, "maxNumberOfTicketsPerSale": 500, "maxNumberOf1NVoucherPerSale": 10, "isInvitationEmailAddressChangePossible": true, "isLandingPageActive": false, "linkedInEvent": { "apiKey": "«redacted»", "eventId": "6899745345744818177", "groupId": "12718898", "isActive": true, "networkId": "517af685-6317-ef11-93d7-00155d96040a" }, "socialSharing": { "isActive": true, "title": "Galaxio Messe 2050", "text": "Ich habe mir gerade ein Ticket für die Galaxio Messe gesichert. Seid ihr auch dabei?", "image": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/SocialSharingImage?context=event:10b992c5-53e9-ef11-93da-00155d96040a&language=de&v=7dbbad48424afc39eae8b331bfba578feaa2af3413e0717983216f5e913d3008", "hasSocialCardsEnabled": true, "hasCardGenerationEnabled": true, "hasAutoPostEnabled": true, "socialNetworks": [ ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get event - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event?$expand=all` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-event Overview - Purpose: Retrieve event details for a given event slug or ID in the Shop API discovery endpoint. - Method and URL: GET {{API_BASE_URL}}/shop/v1/discovery/events/:event?$expand=all Path variables - :event (string) — Event identifier or slug. Example variable: {{EVENT}} Query parameters - $expand (optional) — Controls entity expansion. Known value: all Headers - Accept-Language (optional) — Language code for localized fields. Known values: {{LANGUAGE}}, en Successful response (200) - The response body contains a top-level object: data (object) - The data object includes fields such as: - id (GUID), name (string), year (string), number (string), slug (string), description (string|null) - dateTimeSpan (object with start and end ISO 8601 strings) - icon (object) and logo (object) with keys like key, uri, type, background - sort (number), isRegistrationAvailable (boolean), isSalesAvailable (boolean) - publicRegistration (object) including isAvailable (boolean) and assortments (array of objects with id, name, description, registrationCodes) - assortments (array) with entries having id, name, description, sort, isDefault, showInShop, configuration (e.g., maxNumberOfTicketsPerSale) - configuration (object) including: availableLanguages (array of { name, code, sort }), location, metaTags, showInOverview, showSummaryBeforeCheckout, redirectAfterRegistration, showCookieConsent, tracking, useTotpForNewUsers, showAttendeeBadgePreview, maxNumberOfTicketsPerSale, maxNumberOf1NVoucherPerSale, isInvitationEmailAddressChangePossible, isLandingPageActive, linkedInEvent, socialSharing (with socialNetworks), socialCardArticleGroupConfigurations, googleRecaptcha, persistableQueryParams, externalLoginProviders, showLoadingPageOnCheckout, googlePlaces, isNotVerifiedUserAllowed, socialFollows, revolugo, isLandingPagePlusActive, tosConfiguration, isAbandonedCartReminderActive, isAddressFormCompanyRequired, exhibitorRecommendation, redirectAfterCompletion, areVisitorConnectionsEnabled - currency (string), showClosingMessage (boolean) Notes - The endpoint returns comprehensive configuration and metadata for the event including localization, social integrations, login providers, and UI behavior. - If you only need a subset of fields, consider omitting $expand or using a narrower value (if supported). #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | all | | #### Response example: (200 OK) ```json { "data": { "id": "05147d78-28c7-ee11-93d3-00155d96040a", "name": "Studi Days v5", "year": "2024", "number": "2024", "slug": "studidaysv5", "description": null, "dateTimeSpan": { "start": "2024-01-01T00:00:00+01:00", "end": "2025-12-31T11:00:00+01:00" }, "icon": { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:05147d78-28c7-ee11-93d3-00155d96040a&language=en&v=a327ab899678fb04b840185d7c40063102bcb4a517d30ce60e901278658d1d8f", "type": "Icon", "background": "Light" }, "logo": { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:05147d78-28c7-ee11-93d3-00155d96040a&language=en&v=a327ab899678fb04b840185d7c40063102bcb4a517d30ce60e901278658d1d8f", "type": "Icon", "background": "Light" }, "sort": 0, "isRegistrationAvailable": true, "isSalesAvailable": true, "publicRegistration": { "isAvailable": true, "assortments": [ { "id": "41f9f8f3-3c83-f011-93e1-00155d96040a", "name": "AS-8806", "description": "Hier klicken um AS-8806 zu registrieren", "registrationCodes": [ "Rb9vn4toy72ae3" ] } ] }, "assortments": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "showInShop": false, "linkText": null, "shortName": null, "shortDescription": null, "iconSmall": null, "iconBig": null, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "configuration": { "availableLanguages": [ { "name": "Deutsch", "code": "de", "sort": 0 }, { "name": "English", "code": "en", "sort": 0 }, { "name": "dansk", "code": "da", "sort": 0 } ], "location": { "name": null, "description": null, "plusCode": null, "geoCoordinates": null, "country": "DE" }, "metaTags": { "description": null }, "showInOverview": true, "showSummaryBeforeCheckout": true, "redirectAfterRegistration": true, "showCookieConsent": true, "tracking": { "scriptHead": "\r\n", "scriptBody": " " }, "useTotpForNewUsers": false, "showAttendeeBadgePreview": true, "maxNumberOfTicketsPerSale": 50, "maxNumberOf1NVoucherPerSale": 3, "isInvitationEmailAddressChangePossible": true, "isLandingPageActive": true, "linkedInEvent": { "isActive": false, "networkId": "517af685-6317-ef11-93d7-00155d96040a" }, "socialSharing": { "isActive": true, "title": "Studi Days v5 2024", "text": "I just got myself a ticket for Studi Days v5. Who is with me?", "image": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/SocialSharingImage?context=event:05147d78-28c7-ee11-93d3-00155d96040a&language=en&v=ae669380a92bfad320179c0981177e9a0d3389b6730a5234989b96279f1fbd81", "hasSocialCardsEnabled": true, "hasCardGenerationEnabled": true, "hasAutoPostEnabled": false, "socialNetworks": [ { "id": "517af685-6317-ef11-93d7-00155d96040a", "name": "LinkedIn", "isActive": true, "color": "#4875B4", "type": "LinkedIn", "sharingUrl": "https://www.linkedin.com/shareArticle?mini=true&url={0}", "supportsNativeSharing": true }, { "id": "527af685-6317-ef11-93d7-00155d96040a", "name": "Facebook", "isActive": true, "color": "#3b5998", "type": "Facebook", "sharingUrl": "http://www.facebook.com/sharer.php?u={0}", "supportsNativeSharing": false }, { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get communication group - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/communication-groups/:group` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-communication-group This endpoint retrieves the details of a specific communication group. #### Request This request does not require a request body. #### Response The response returns a JSON object with the following information: - `uniqueID` (string) - `name` (string) - `description` (string) #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": { "uniqueId": "76ae9705-bdff-475d-88e4-de7fadc0e357", "name": "Informations", "description": "Additional information to help you make the most of your event visit can be found here. This includes important details on how to get there, parking options, accessibility, and on-site dining options, as well as key tips on the best times for registration and entry and emergency procedures. We also provide information about additional services such as luggage storage, information desks, and special event areas. In addition, you will receive up-to-date news and announcements related to the event, including any changes to the schedule, special guests, or exclusive program highlights." } } ``` ### GET Get legitimation categories - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event/legitimation-categories` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-legitimation-categories This endpoint retrieves the legitimation categories for a specific event. #### Request No request body is required for this endpoint. #### Response The response for this request is a JSON object which contains objects with `id`, `name`, `description`, `availableProofTypes`, and `proofUploadLimit` fields. The `availableProofTypes` array contains objects with `id`, `name`, `description`, `isRequired`, and `availableDocumentTypes` fields. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": [ { "id": "0474c5c5-6b17-f011-93dd-00155d96040a", "name": "High Security", "description": "High security check if several levels of approval", "availableProofTypes": [ { "id": "0574c5c5-6b17-f011-93dd-00155d96040a", "name": "Text", "description": "Text", "isRequired": false, "availableDocumentTypes": [ "Text" ] } ], "proofUploadLimit": 2 }, { "id": "c9ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "Pupil / college student", "description": "", "availableProofTypes": [ { "id": "47982a35-195a-ef11-93d8-00155d96040a", "name": "Studentenausweis", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "5c6e237d-5ddd-ef11-93da-00155d96040a", "name": "Dritternachweis (nochmal geändert)", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "44160b00-92dd-ef11-93da-00155d96040a", "name": "Ganz frischer Nachweis", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] } ], "proofUploadLimit": 3 }, { "id": "b2ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "Trade visitor", "description": "Legitimation of a Trade visitor", "availableProofTypes": [ { "id": "7f2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Personal trade visitor eligibility", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7b2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Business registration", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "802e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Student ID", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7d2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Legitimation", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "792e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Employment contract", "description": "", "isRequired": false, "availableDocumentTypes": [ "File" ] }, { "id": "7e2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Employee eligibility", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7a2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Salary statement", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7c2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Commercial register", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] } ], "proofUploadLimit": 3 }, { "id": "6db20988-6bfd-ee11-93d5-00155d96040a", "name": "Severely disabled", "description": "", "availableProofTypes": [ { "id": "e7490895-6bfd-ee11-93d5-00155d96040a", "name": "Disability card", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get payment providers by event - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event/payment-providers` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-payment-providers-by-event This endpoint retrieves the available payment providers for a specific event. #### Request This request does not require a request body. #### Response - `data` (array, required): An array of payment provider objects. - `id` (string, required): The ID of the payment provider. - `name` (string, required): The name of the payment provider. - `description` (string, optional): The description of the payment provider. - `paymentMethods` (array, required): An array of payment method objects. - `methodType` (string, required): The type of payment method. - `configuration` (object, required): The configuration details for the payment provider. - `saferpayFieldsUrl` (string, required): The URL for saferpay fields. - `saferpayFieldsLibrary` (string, required): The library for saferpay fields. - `saferpayFieldsAccessToken` (string, required): The access token for saferpay fields. - `sort` (integer, required): The sorting order of the payment provider. - `isDefault` (boolean, required): Indicates if the payment provider is the default option. - `isExpressCheckoutSupported` (boolean, required): Indicates if express checkout is supported. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": [ { "id": "210f6011-343d-ee11-93cf-00155d960409", "name": "Credit card", "description": null, "paymentMethods": [ { "methodType": "Mastercard" }, { "methodType": "Visa" }, { "methodType": "Amex" } ], "configuration": { "saferpayFieldsUrl": "https://test.saferpay.com/Fields/404227", "saferpayFieldsLibrary": "https://test.saferpay.com/Fields/lib/1/saferpay-fields.js", "saferpayFieldsAccessToken": "" }, "sort": 0, "isDefault": true, "isExpressCheckoutSupported": false }, { "id": "948ade45-b0c5-ee11-93d3-00155d96040a", "name": "Sofort", "description": null, "paymentMethods": [ { "methodType": "Sofort" } ], "configuration": { "payPalUseLightbox": "True", "payPalClientId": "" }, "sort": 5, "isDefault": false, "isExpressCheckoutSupported": true }, { "id": "fba84973-b0c5-ee11-93d3-00155d96040a", "name": "PayPal", "description": null, "paymentMethods": [ { "methodType": "PayPal" } ], "configuration": { "payPalUseLightbox": "True", "payPalClientId": "" }, "sort": 15, "isDefault": false, "isExpressCheckoutSupported": true }, { "id": "6045539b-2ecb-ee11-93d3-00155d96040a", "name": "iDEAL", "description": null, "paymentMethods": [ { "methodType": "Ideal" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "dcd0d596-33cb-ee11-93d3-00155d96040a", "name": "Wallet", "description": null, "paymentMethods": [ { "methodType": "ApplePay" }, { "methodType": "GooglePay" } ], "configuration": {}, "sort": 40, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "838fc7d2-a0cc-ee11-93d3-00155d96040a", "name": "Giropay", "description": null, "paymentMethods": [ { "methodType": "Giropay" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "279e1fec-a0cc-ee11-93d3-00155d96040a", "name": "EPS", "description": null, "paymentMethods": [ { "methodType": "Eps" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "d3d3bc1e-a1cc-ee11-93d3-00155d96040a", "name": "UnionPay", "description": null, "paymentMethods": [ { "methodType": "UnionPay" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "b7ccdb37-a1cc-ee11-93d3-00155d96040a", "name": "TWINT", "description": null, "paymentMethods": [ { "methodType": "Twint" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "ecd4184c-a1cc-ee11-93d3-00155d96040a", "name": "Postfinance", "description": null, "paymentMethods": [ { "methodType": "Postfinance" } ], "configuration": {}, "sort": 30, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "ee897ed8-1d27-ef11-93d7-00155d96040a", "name": "NGenius", "description": null, "paymentMethods": [ { "methodType": "Visa" }, { "methodType": "Mastercard" } ], "configuration": { "outletReference": "4b105a76-8b2b-41b9-b0e0-a8decf3c5d18", "useSandbox": "True", "paymentMethods": "VISA, MASTERCARD", "walletMethods": "" }, "sort": 100, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "a7fed2b9-fe3c-ef11-93d8-00155d96040a", "name": "NGenius Wallet", "description": null, "paymentMethods": [ { "methodType": "ApplePay" }, { "methodType": "GooglePay" } ], "configuration": { "outletReference": "4b105a76-8b2b-41b9-b0e0-a8decf3c5d18", "useSandbox": "True", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get assortments by event - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortments-by-event This endpoint retrieves the assortments for a specific event. #### Request - `event` (string, required): The ID of the event for which assortments are being retrieved. #### Response The response will contain an array of assortments, where each assortment object includes the following properties: - `id` (string): The ID of the assortment. - `name` (string): The name of the assortment. - `description` (string): The description of the assortment. - `sort` (integer): The sorting order of the assortment. - `isDefault` (boolean): Indicates if the assortment is the default one. - `configuration` (object): An object containing configuration details for the assortment, such as `maxNumberOfTicketsPerSale`. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, { "id": "4b12f502-42fa-ed11-93c6-00155d960409", "name": "Press accreditation", "description": "", "sort": 0, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": 5 } } ] } ``` ### GET Get assortment details by event - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortment` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-details-by-event This endpoint retrieves the assortment details for a specific event in the shop discovery. #### Request - `event` (path parameter): The ID of the event for which the assortment details are to be retrieved. - `assortment` (path parameter): The ID of the assortment for which details are to be retrieved. #### Response - `articleGroups`: - `id` (string) - `name` (string) - `description` (string) - `sort` (integer) - `isExpanded` (boolean) - `configuration`: - `maxNumberOfTicketsPerSale` (integer) - `id` (string) - `name` (string) - `description` (string) - `sort` (integer) - `isDefault` (boolean) - `configuration` #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": { "articleGroups": [ { "id": "e1ebd4a4-4463-ee11-93cf-00155d960409", "name": "Parking tickets", "description": "Book a maximum of 2 parking tickets.", "sort": 10, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": 2 } }, { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Trade fair tickets", "description": "Access to the trade fair only", "sort": 0, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, { "id": "94f829fd-c983-ee11-b2f8-00155d960308", "name": "Congress tickets", "description": "Congress tickets including trade fair access", "sort": 1, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": 1 } }, { "id": "234b024d-3ceb-ee11-93d5-00155d96040a", "name": "Specials", "description": "In order to buy a ticket, you need to prove that you are a VIP.", "sort": 3, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": false, "configuration": null } } ``` ### GET Get assortment articles - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:event/assortments/:assortmentID/articles` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-assortment-articles This endpoint is used to retrieve the articles associated with a specific event. #### Request This request does not contain a request body. #### Response The response will contain an array of articles with their associated details such as prices, article group, ID, name, description, image, legitimacy requirements, type, ticket validity, article number, category, amount, configuration, and timeslots. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": [ { "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Trade fair tickets", "description": "Access to the trade fair only", "sort": 0, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Dayticket", "internalName": "Day Pass", "description": "The day ticket entitles you to a single visit to the Experience Days on any event day.", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "amount": { "remaining": 18610 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": true, "soldOutText": "Sold out", "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [ { "id": "b61799fa-39a7-ef11-93d8-00155d96040a", "date": "2024-12-21", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "b71799fa-39a7-ef11-93d8-00155d96040a", "start": "10:30", "end": "12:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "a54cde34-f5bd-ef11-93d9-00155d96040a", "start": "12:00", "end": "13:30", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "b321f259-f5bd-ef11-93d9-00155d96040a", "date": "2024-12-22", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "45cde1df-17be-ef11-93d9-00155d96040a", "date": "2024-12-25", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "67ef2303-21be-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "8752a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-01", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "9352a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-02", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "c64340f4-96d2-ef11-93d9-00155d96040a", "date": "2025-12-24", "isAvailableForBooking": true, "isBookingLimited": true, "remainingAmount": 684, "isExpired": false, "isSoldOut": false, "timeRanges": [ { "id": "150b242b-97d2-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get lookups by name - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/lookups/:name` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-lookups-by-name This endpoint makes an HTTP GET request to retrieve the lookups for a specific lookup list. The request should include the lookup list name in the URL. #### Request This request does not require a request body. #### Response - `id` (integer) - `language` (string) - `lookups:` - `key` (string) - `value` (string) - `isFreeText` (boolean) - `lookups` (array) #### Response example: (200 OK) ```json { "data": { "id": 1, "language": "de", "lookups": [ { "key": "Divers", "value": "Divers", "isFreeText": false, "lookups": [] }, { "key": "Frau", "value": "Frau", "value3": "2", "isFreeText": false, "lookups": [] }, { "key": "Herr", "value": "Herr", "value3": "1", "isFreeText": false, "lookups": [] }, { "key": "Sir_good", "value": "Sir", "isFreeText": false, "lookups": [] } ] } } ``` ### GET Get Terms of Service without User - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-without-user #### Endpoint Description This endpoint retrieves the terms of service associated with a specific event identified by `eventIdentifier`. It is designed to provide users with the necessary legal information regarding their participation in the event. #### Request - **Method**: GET - **URL**: `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service` #### Path Parameters - `eventIdentifier` (string): A unique identifier for the event whose terms of service are being requested. #### Response Upon a successful request, the API will return a response with a status code of 200 and a content type of `application/vnd.aditus.v1+json`. The structure of the response is as follows: ```json { "data": { "userId": null, "eventId": "", "items": [ { "uniqueId": "", "displayOrder": 0, "version": "", "content": "", "consentPolicy": "", "isApproved": true } ] } } ``` #### Response Fields - `data`: An object containing the details of the terms of service. - `userId`: (null) The ID of the user requesting the terms, if applicable. - `eventId`: (string) The ID of the event for which the terms are being retrieved. - `items`: (array) A list of terms of service items. - `uniqueId`: (string) A unique identifier for the terms item. - `displayOrder`: (integer) The order in which the terms should be displayed. - `version`: (string) The version of the terms of service. - `content`: (string) The actual content of the terms of service. - `consentPolicy`: (string) The policy regarding user consent. - `isApproved`: (boolean) Indicates whether the terms have been approved. #### Summary This endpoint is crucial for ensuring that users have access to the legal terms governing their participation in events, thereby promoting transparency and compliance with legal standards. #### Response example: (200 OK) ```json { "data": { "userId": null, "eventId": "GalaxioExpo2050", "items": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Ich akzeptiere die Allgemeinen Geschäftsbedingungen", "consentPolicy": "Mandatory", "isApproved": false, "countries": null }, { "uniqueId": "e23642f3-adf3-45e9-9528-d26fe35de4f4", "displayOrder": 10, "version": "1.0", "content": "Ich habe den großartigen Galaxio Trailer gesehen.", "consentPolicy": "Optional", "isApproved": false, "countries": [ "AF", "EG", "AX", "AL", "DZ", "VI", "BH", "BD", "BE", "BF", "CL", "CN", "DE", "FK", "GP", "GU", "IT", "JP", "XK", "HR" ] }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Ausführliche Informationen darüber, wie Ihre persönlichen Daten verwendet werden, finden Sie in unserem Datenschutzhinweis", "consentPolicy": "None", "isApproved": false, "countries": null } ] } } ``` ### GET Get Terms of Service with User - Endpoint: `GET {{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service/users/:userId` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/discovery/get-terms-of-service-with-user #### Endpoint Description This endpoint retrieves the terms of service for a specific event associated with a user. It allows clients to access the relevant consent policies and approval status for the user in relation to the event identified by `eventIdentifier`. #### Request **Method:** GET **URL:** `{{API_BASE_URL}}/shop/v1/discovery/events/:eventIdentifier/terms-of-service/users/:userId` #### URL Parameters - `eventIdentifier` (string): The unique identifier for the event whose terms of service are being requested. - `userId` (string): The unique identifier for the user whose terms of service are being retrieved. #### Response **Status Code:** 200 **Content-Type:** application/vnd.aditus.v1+json #### Response Body Structure The response body contains the following structure: ```json { "data": { "userId": "string", "eventId": "string", "items": [ { "uniqueId": "string", "displayOrder": "integer", "version": "string", "content": "string", "consentPolicy": "string", "isApproved": "boolean" } ] } } ``` #### Response Fields - `data`: An object containing the details of the terms of service. - `userId`: The unique identifier for the user. - `eventId`: The unique identifier for the event. - `items`: An array of terms of service items. - `uniqueId`: A unique identifier for the terms of service item. - `displayOrder`: The order in which the item should be displayed. - `version`: The version of the terms of service. - `content`: The actual content of the terms of service. - `consentPolicy`: The policy related to user consent. - `isApproved`: A boolean indicating whether the terms have been approved by the user. This endpoint is essential for ensuring that users are aware of and have consented to the terms associated with specific events they are participating in. #### Response example: (200 OK) ```json { "data": { "userId": "00000000-0000-0000-0000-000000000000", "eventId": "ed24", "items": [ { "uniqueId": "55d12ee4-67e8-4bf9-8da9-a459b064d0fd", "displayOrder": 1, "version": "TEST V0", "content": "TEST Nutzungsbedingungen", "consentPolicy": "Optional", "isApproved": false } ] } } ``` ## Cart Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart The Cart section is responsible for managing the shopping cart functionality. The API is designed to streamline the process of integrating the shopping cart functionality into your application. It provides a straightforward way to retrieve and manipulate cart data, making it easy to build features like adding items to the cart, updating quantities, or removing items. Whether you are a developer looking to integrate the shopping cart functionality into your application or a non-technical role seeking an understanding of how the cart works, the Cart API section provides clear documentation and straightforward functionality to make your integration process seamless. If a response includes a cart, the according request can be modified by an _expand_ parameter. The _expand_ parameter specifies which additional information should be included in the cart. Available _expand parameters:_ - All below - AssociatedPersonOnItems - AvailableTimeslotsOnItems - Actions - Problems ### Basic cart processes Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes These endpoints are used to complete a basic shop process. This includes the creation of a cart, dealing with items of specific assortments and the payment. #### POST Create cart - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/create-cart This creates a card for the user in the context of an event. ##### Request - `event` (string): The event of the cart. - `user` (string): The user ID associated with the cart. - `isGuestUser` (boolean): Indicates whether the user is a guest user. ##### Response Upon a successful request, the response will include the cart details: - `id` (string): The cart ID. - `expiryTime` (string): The expiry time of the cart. - `user` (object): Details of the user associated with the cart. - `event` (object): Details of the event added to the cart. - `promotionCodes` (array): List of promotion codes applied. - `items` (array): List of items in the cart. - `totals` (array): Details of the cart totals. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if the payment details are immutable. - `isLegitimationImmutable` (boolean): Indicates if the legitimation details are immutable. - `isRegistrationImmutable` (boolean): Indicates if the registration details are immutable. - `isAmountImmutable` (boolean): Indicates if the amount is immutable. - `isRegistrationOnly` (boolean): Indicates if registration is the only requirement. - `isRegistrationRequired` (boolean): Indicates if registration is required. - `isLegitimationRequired` (boolean): Indicates if legitimation is required. - `isPaymentRequired` (boolean): Indicates if payment is required. - `buyerPerson` (object): Details of the buyer. - `status` (string): The status of the cart. - `culture` (string): The culture associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "event": "{{EVENT}}", "user": "{{USER_ID}}", "isGuestUser": false } ``` ##### Response example: (200 OK) ```json { "data": { "id": "b27ca4f8-7d0e-49b6-b17d-7a54fbf79837", "expiryTime": "2025-04-30T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "email": null, "firstName": null, "lastName": null, "company": null, "salutation": null, "vatId": null, "address": null, "isPrefilled": false, "surveyId": "eyJVc2VDYXNlTmFtZSI6IlNob3AuTWlzc2luZ0J1eWVyIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOltdfQ==", "isValid": false }, "status": "Active", "culture": "de" } } ``` #### GET Get cart - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart?$expand=All` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart This endpoint retrieves the details of a specific cart, including associated person information and buyer/billing person details. ##### Request - `id` (string, required): The unique identifier of the cart. - `$expand` (string, optional): Use to expand the associated person on items and buyer/billing person details. ##### Response The response will include the following fields: - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. - `event` (object): Details of the event associated with the cart, including ID, name, year, number, and slug. - `promotionCodes` (array): An array of promotion codes associated with the cart. - `items` (array): An array of items in the cart. - `totals` (array): An array of total amounts, including original and calculated prices, taxes, tax rates, and currency. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if the payment for the cart is immutable. - `isLegitimationImmutable` (boolean): Indicates if the legitimation for the cart is immutable. - `isRegistrationImmutable` (boolean): Indicates if the registration for the cart is immutable. - `isAmountImmutable` (boolean): Indicates if the amount for the cart is immutable. - `isRegistrationOnly` (boolean): Indicates if the cart is for registration only. - `isRegistrationRequired` (boolean): Indicates if registration is required for the cart. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired` (boolean): Indicates if payment is required for the cart. - `buyerPerson` (object): Details of the buyer person, including email, first name, last name, company, salutation, VAT ID, address, prefill status, survey ID, and validity status. - `status` (string): The status of the cart. - `culture` (string): The culture associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Response example: (200 OK) ```json { "data": { "id": "cdc17dc6-9d38-4137-be64-6245c290b0af", "expiryTime": "3750-12-31T04:20:00+01:00", "user": { "id": "c2890dcc-da72-4815-b93c-8766c924d615", "isVerified": true, "eMail": "d.example2+202@aditus.de" }, "event": { "id": "10b992c5-53e9-ef11-93da-00155d96040a", "name": "Galaxio Messe", "year": "2050", "number": "6666", "slug": "GalaxioExpo2050" }, "promotionCodes": [], "items": [ { "id": "006508c3-0000-0000-0000-000000000000", "article": { "id": "fa94184d-55e9-ef11-93da-00155d96040a", "name": "Sternenreisender-Pass 🌟🛸", "internalName": "Starfarer Pass 🌟🛸", "description": "Begib dich auf eine Reise durch die Sterne! Dieser Pass gewährt dir 1-tägigen Zugang zur ultimativen intergalaktischen Messe.", "sort": 0, "prices": [ { "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR", "strikethroughPrice": 0, "promotionReason": null, "promotionDescription": null }, "originalPrice": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR", "strikethroughPrice": 0, "promotionReason": null, "promotionDescription": null } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:fa94184d-55e9-ef11-93da-00155d96040a&language=de&foregroundColor=%23C000C0", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "420", "category": null, "legitimationCategory": null, "configuration": { "remainingAmountDisplayMode": "None", "remainingAmountPerTimeslotDisplayMode": "None", "remainingAmountThresholdPercent": 0, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 500, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "articleGroup": { "id": "ec2a3c84-7d05-f011-93dd-00155d96040a", "name": "Standard Eintrittstickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR", "strikethroughPrice": 0, "promotionReason": null, "promotionDescription": null }, "registration": { "data": { "type": "thirdPerson", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Rala" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Cartman" }, { "isReadOnly": false, "bindingMember": "EMail", "value": "d.example2+2029857856982@aditus.de" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" } ], "hasInformation": true }, "isValid": true, "problems": [], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlNlbGYiLCJUZXJtaW5hbFNldElkIjpudWxsLCJGYWlyZXZlbnRJZCI6MTM3LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOlsyNzAwXX0=", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### GET Get cart theme - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/theme` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-cart-theme This endpoint retrieves the theme for a specific cart. ##### Request No request body is needed for this request. ##### Response The response contains the theme context for the specific cart. - `context`(string): The event identifier ##### Response example: (200 OK) ```json { "data": { "context": "event:f2e25737-4990-ee11-93cf-00155d960409" } } ``` #### GET Get payment provider by cart - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-payment-provider-by-cart This endpoint retrieves the available payment providers for the specified cart. ##### Request - `cartId`: The ID of the cart ##### Response The response will be a JSON object with the following properties: - `payment_providers`: An array of objects representing the available payment providers for the specified cart. Each object includes the following properties: - `id`: The unique identifier for the payment provider. - `name`: The name of the payment provider. - `type`: The type of the payment provider. ##### Response example: (200 OK) ```json { "data": [ { "id": "210f6011-343d-ee11-93cf-00155d960409", "name": "Kreditkarte", "description": null, "paymentMethods": [ { "methodType": "Mastercard" }, { "methodType": "Visa" }, { "methodType": "Amex" } ], "configuration": { "saferpayFieldsUrl": "https://test.saferpay.com/Fields/404227", "saferpayFieldsLibrary": "https://test.saferpay.com/Fields/lib/1/saferpay-fields.js", "saferpayFieldsAccessToken": "«redacted»" }, "sort": 0, "isDefault": true, "isExpressCheckoutSupported": false }, { "id": "1e6ba835-2877-ef11-93d8-00155d96040a", "name": "Stripe", "description": null, "paymentMethods": [ { "methodType": "Visa" }, { "methodType": "Mastercard" }, { "methodType": "Diners" }, { "methodType": "Amex" } ], "configuration": { "useSandbox": "True" }, "sort": 0, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "85c8bab4-bdd1-ef11-93d9-00155d96040a", "name": "Rechnung\r\n", "description": null, "paymentMethods": [ { "methodType": "Invoice" } ], "configuration": {}, "sort": 0, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "defc6088-8dd2-ef11-93d9-00155d96040a", "name": "Vorauszahlung\r\n", "description": null, "paymentMethods": [ { "methodType": "Prepayment" } ], "configuration": {}, "sort": 0, "isDefault": false, "isExpressCheckoutSupported": false }, { "id": "ffe35c40-9bf9-ef11-93dd-00155d96040a", "name": "DWTC-Paymentgateway", "description": null, "paymentMethods": [ { "methodType": "Visa" }, { "methodType": "Mastercard" }, { "methodType": "Amex" } ], "configuration": { "useSandbox": "True" }, "sort": 0, "isDefault": false, "isExpressCheckoutSupported": false } ] } ``` #### GET Get assortments by cart - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/assortments` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortments-by-cart This endpoint retrieves the assortments associated with the specified cart. ##### Request No request body is required for this endpoint. - `cart` (path parameter) - The unique identifier of the cart. ##### Response Upon a successful execution, the API returns a JSON object with a status code of 200 and the following structure: - `id`(string) - `name` (string) - `description` (string) - `sort` (integer) - `isDefault` (boolean) - `configuration`: - `maxNumberOfTicketsPerSale` (integer) ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": [ { "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, { "id": "4b12f502-42fa-ed11-93c6-00155d960409", "name": "Press accreditation", "description": "", "sort": 0, "isDefault": true, "configuration": { "maxNumberOfTicketsPerSale": 5 } } ] } ``` #### GET Get assortment details by cart - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-details-by-cart This endpoint retrieves the assortments for a specific cart identified by the cart ID and zhe assortment ID. ##### Request Body This request does not require a request body. ##### Response Body The response contains an array of "articleGroups" with their respective details such as ID, name, description, sort order, and configuration. The assortment itself will have an ID, name, description, sort order, and configuration details, including whether it is the default assortment. - `articleGroups`: - `id` (string) - `name` (string) - `sort`(integer) - `isExpanded` (boolean) - `configuration`: - `maxNumberOfTicketsPerSale` (integer) ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "articleGroups": [ { "id": "e1ebd4a4-4463-ee11-93cf-00155d960409", "name": "Parking tickets", "description": "Book a maximum of 2 parking tickets.", "sort": 10, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": 2 } }, { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Trade fair tickets", "description": "Access to the trade fair only", "sort": 0, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, { "id": "94f829fd-c983-ee11-b2f8-00155d960308", "name": "Congress tickets", "description": "Congress tickets including trade fair access", "sort": 1, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": 1 } }, { "id": "234b024d-3ceb-ee11-93d5-00155d96040a", "name": "Specials", "description": "In order to buy a ticket, you need to prove that you are a VIP.", "sort": 3, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } } ], "id": "00000000-0000-0000-0000-000000000000", "name": null, "description": null, "sort": -2147483648, "isDefault": false, "configuration": null } } ``` #### GET Get assortment articles by cart - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/assortments/:assortment/articles` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/get-assortment-articles-by-cart ##### Retrieve Assortments in Cart This endpoint retrieves the list of articles in the cart with the specified id. ##### Request This request does not need a request body. ##### Response The response will contain an array of article data, including the following properties: - `prices` - `articleGroup` - `id` - `name` - `internalName` - `description` - `image` - `sort` - `isLegitimationRequired` - `legitimationCategory` - `type` - `ticketValidity` - `articleNumber` - `category` - `amount` - `configuration` - `timeslots` ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": [ { "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Trade fair tickets", "description": "Access to the trade fair only", "sort": 0, "isExpanded": true, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Dayticket", "internalName": "Day Pass", "description": "The day ticket entitles you to a single visit to the Experience Days on any event day.", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "amount": { "remaining": 18610 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": true, "soldOutText": "Sold out", "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [ { "id": "b61799fa-39a7-ef11-93d8-00155d96040a", "date": "2024-12-21", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "b71799fa-39a7-ef11-93d8-00155d96040a", "start": "10:30", "end": "12:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "a54cde34-f5bd-ef11-93d9-00155d96040a", "start": "12:00", "end": "13:30", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "b321f259-f5bd-ef11-93d9-00155d96040a", "date": "2024-12-22", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "45cde1df-17be-ef11-93d9-00155d96040a", "date": "2024-12-25", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "67ef2303-21be-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "8752a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-01", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "9352a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-02", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "c64340f4-96d2-ef11-93d9-00155d96040a", "date": "2025-12-24", "isAvailableForBooking": true, "isBookingLimited": true, "remainingAmount": 684, "isExpired": false, "isSoldOut": false, "timeRanges": [ { "id": "150b242b-97d2-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Add item - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/items` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/add-item This endpoint allows you to add an item to the specified cart. ##### Request - `cartId`(string): The ID of the cart. ##### Request Body - `article` (string): The ID of the article to be added to the cart. - `quantity` (number): The quantity of the article to be added to the cart. ##### Response The response includes the updated details of the cart after adding the item. - `data` (object): The object containing the details of the item added to the cart. - `itemAdded` (object): Details of the item added to the cart. - `cartId` (string): The ID of the cart. - `article` (object): Details of the article added to the cart. - `prices` (array): Array of prices for the article. - `articleGroup` (object): Details of the article group. - `id` (string): The ID of the article. - `name` (string): The name of the article. - `internalName` (string): The internal name of the article. - `description` (string): The description of the article. - `image` (object): Details of the article image. - `sort` (number): The sorting order of the article. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the article. - `timeslots` (array): Array of timeslots for the article. - `items` (array): Array of items in the cart. - `reservation` (object): Details of the reservation. - `item` (object): Details of the item. - `problems` (array): Array of problems encountered. - `cart` (object): Details of the cart. - `id` (string): The ID of the cart. - `expiryTime` (string): The expiry time of the cart. - `user` (object): Details of the user. - `event` (object): Details of the event. - `promotionCodes` (array): Array of promotion codes for the cart. - `items` (array): Array of items in the cart. - `totals` (array): Array of totals for the cart. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if payment is immutable for the cart. - `isLegitimationImmutable` (boolean): Indicates if legitimation is immutable for the cart. - `isRegistrationImmutable` (boolean): Indicates if registration is immutable for the cart. - `isAmountImmutable` (boolean): Indicates if the amount is immutable for the cart. - `isRegistrationOnly` (boolean): Indicates if registration is the only requirement for the cart. - `isRegistrationRequired` (boolean): Indicates if registration is required for the cart. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired` (boolean): Indicates if payment is required for the cart. - `buyerPerson` (object): Details of the buyer. - `status` (string): The status of the cart. - `culture` (string): The culture of the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "article": "{{ARTICLE_ID}}", "quantity": 1 } ``` ##### Response example: (200 OK) ```json { "data": { "itemAdded": { "cartId": "b27ca4f8-7d0e-49b6-b17d-7a54fbf79837", "article": { "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "description": null, "sort": 0, "isExpanded": false, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "amount": { "remaining": 18610 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": true, "soldOutText": "Nicht mehr verfügbar!", "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [ { "id": "b61799fa-39a7-ef11-93d8-00155d96040a", "date": "2024-12-21", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "b71799fa-39a7-ef11-93d8-00155d96040a", "start": "10:30", "end": "12:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "a54cde34-f5bd-ef11-93d9-00155d96040a", "start": "12:00", "end": "13:30", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "b321f259-f5bd-ef11-93d9-00155d96040a", "date": "2024-12-22", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "45cde1df-17be-ef11-93d9-00155d96040a", "date": "2024-12-25", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "67ef2303-21be-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "8752a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-01", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "9352a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-02", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### DELETE Remove item - Endpoint: `DELETE {{API_BASE_URL}}/shop/v1/cart/:cart/items/:item` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-item This endpoint is used to remove a specific item from the user's cart. ##### Request No request body is required for this endpoint. ##### Response - `itemRemoved`: Indicates whether the item removal was successful and provides details about the removed article. - `successful`: Boolean value indicating the success of the removal. - `article`: Details of the removed article including prices, group, name, description, image, etc. - `cart`: Details of the user's cart including ID, expiry time, user information, event details, items in the cart, totals, and buyer person details. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Response example: (200 OK) ```json { "data": { "itemRemoved": { "successful": true, "article": { "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "description": null, "sort": 0, "isExpanded": false, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "amount": { "remaining": 18609 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": true, "soldOutText": "Nicht mehr verfügbar!", "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [ { "id": "b61799fa-39a7-ef11-93d8-00155d96040a", "date": "2024-12-21", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "b71799fa-39a7-ef11-93d8-00155d96040a", "start": "10:30", "end": "12:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "a54cde34-f5bd-ef11-93d9-00155d96040a", "start": "12:00", "end": "13:30", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "b321f259-f5bd-ef11-93d9-00155d96040a", "date": "2024-12-22", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "45cde1df-17be-ef11-93d9-00155d96040a", "date": "2024-12-25", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "67ef2303-21be-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "8752a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-01", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "9352a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-02", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Remove items - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/items/remove` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/remove-items This endpoint is used to remove specified items from the cart. ##### Request Body - `itemIds` (array of strings, required): An array of item IDs to be removed from the cart. ##### Response The response contains the updated cart data after removing the specified items. - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. In addition, the response includes the `itemsRemoved` field, which provides information about the items that were successfully removed, including their IDs and whether the removal was successful. The `cart` field includes detailed information about the updated cart, including user details, event information, items in the cart, totals, and various flags indicating the immutability and requirements of the cart. ##### Request body example ```json { "itemIds": [ "{{LAST_RESERVATION_ID}}" ] } ``` ##### Response example: (200 OK) ```json { "data": { "itemsRemoved": { "items": [ { "itemId": "0736920e-4b90-ee11-93cf-00155d960409", "successful": false, "article": null } ] }, "cart": { "id": "b27ca4f8-7d0e-49b6-b17d-7a54fbf79837", "expiryTime": "2025-04-30T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee4-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": null, "isValid": false, "problems": [ { "code": 2205, "name": "ItemRequiresRegistrationResult", "category": "Registration", "message": "The item requires a registration but no registration information was provided", "details": { "affectedItem": "002dbee4-0000-0000-0000-000000000000" } } ], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlNlbGYiLCJUZXJtaW5hbFNldElkIjpudWxsLCJGYWlyZXZlbnRJZCI6NTYsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6WzI1NF19", "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlRoaXJkUGVyc29uQnlIaW1zZWxmIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOlsyNTRdfQ==", "hasToBeCompletedByTicketOwnerHimself": true } } }, "legitimation": { "isRequired": false, "isIncomplete": false ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Modify properties - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/properties` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/modify-properties This endpoint is used to modify the properties of a specific cart. ##### Request The request payload should be sent in the raw format and should include the properties to be modified in the cart. ##### Response The response for this request is a JSON object with the following fields: - `data` (object): The main data object containing the modified properties and cart details. - `propertiesModified` (object): Object containing information about the modified properties. - `isSuccessful` (boolean): Indicates if the modification was successful. - `cartId` (string): The ID of the cart. - `properties` (object): Object containing the modified properties. - `key` (string): The modified property value. - `cart` (object): Details of the cart. - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "properties": { "key": "value" } } ``` ##### Response example: (200 OK) ```json { "data": { "propertiesModified": { "isSuccessful": true, "cartId": "b27ca4f8-7d0e-49b6-b17d-7a54fbf79837", "properties": { "key": "value" } }, "cart": { "id": "b27ca4f8-7d0e-49b6-b17d-7a54fbf79837", "expiryTime": "2025-04-30T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee4-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": null, "isValid": false, "problems": [ { "code": 2205, "name": "ItemRequiresRegistrationResult", "category": "Registration", "message": "The item requires a registration but no registration information was provided", "details": { "affectedItem": "002dbee4-0000-0000-0000-000000000000" } } ], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlNlbGYiLCJUZXJtaW5hbFNldElkIjpudWxsLCJGYWlyZXZlbnRJZCI6NTYsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6WzI1NF19", "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlRoaXJkUGVyc29uQnlIaW1zZWxmIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOlsyNTRdfQ==", "hasToBeCompletedByTicketOwnerHimself": true } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### PUT Set culture - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:id/culture` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-culture The request updates the culture of a specific cart. The request body should include the new culture value. ##### Request - `id` (string): The ID of the cart to be updated. ##### Response The response contains the following fields: - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "culture": "de" } ``` ##### Response example: (200 OK) ```json { "data": { "cart": { "id": "8149fe2a-3d48-4f26-adaf-a4722cc73228", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002fed8a-0000-0000-0000-000000000000", "article": { "id": "2a283eeb-88b3-ee11-93d1-00155d96040a", "name": "e-Gutschein", "internalName": "e-Gutschein", "description": null, "sort": 0, "prices": [ { "price": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:2a283eeb-88b3-ee11-93d1-00155d96040a&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "005", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "10457333-bc74-ef11-93d8-00155d96040a", "name": "Gutscheintickets", "sort": -1, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": "gopro", "price": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "registration": { "data": null, "isValid": false, "problems": [ { "code": 2205, "name": "ItemRequiresRegistrationResult", "category": "Registration", "message": "The item requires a registration but no registration information was provided", "details": { "affectedItem": "002fed8a-0000-0000-0000-000000000000" } } ], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlNlbGYiLCJUZXJtaW5hbFNldElkIjpudWxsLCJGYWlyZXZlbnRJZCI6NTYsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6WzEyOThdfQ==", "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": true, "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlRoaXJkUGVyc29uQnlIaW1zZWxmIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOlsxMjk4XX0=", "hasToBeCompletedByTicketOwnerHimself": true } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { "isEnabled": false, "isValid": true, "bookings": [] } } ], "totals": [ { "original": null, "price": 0, "grossPrice": 0, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### PUT Set user - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:cart/user` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-user An HTTP PUT request is made to update the user associated with a specific cart. The user can be set using the identifier retrieved from the ADITUS Identity Provider or using the email address. ##### Request ##### Request Body - `user`: (string): The ID or email address of the user - `isVerified` (boolean): Should be set to true if the user verified his identity using a Identity Provider. ##### Response - `userSetted` (object) - `successful` (boolean) - `cartId` (string) - `userId` (string) - `Cart` (object): - `id` (string) - `expiryTime` (string) - `user` (object) - `id` (string) - `isVerified` (boolean) - `eMail` (string) - `event` (object) - `id` (string) - `name` (string) - `year` (string) - `number` (string) - `slug` (string) - `promotionCodes` (array) - `items` (array) - `totals` (array) - `original` (object) - `price` (number) - `grossPrice` (number) - `tax` (number) - `taxRate` (number) - `currency` (string) - `price` (number) - `grossPrice` (number) - `tax` (number) - `taxRate` (number) - `currency` (string) - `isImmutable` (boolean) - `isPaymentImmutable` (boolean) - `isLegitimationImmutable` (boolean) - `isRegistrationImmutable` (boolean) - `isAmountImmutable` (boolean) - `isRegistrationOnly` (boolean) - `isRegistrationRequired` (boolean) - `isLegitimationRequired` (boolean) - `isPaymentRequired` (boolean) - `buyerPerson` (object) - `email` (string) - `firstName` (string) - `lastName` (string) - `company` (string) - `salutation` (string) - `vatId` (string) - `address` (object) - `street` (string) - `houseNumber` (string) - `postalCode` (string) - `city` (string) - `county` (string) - `country` (string) - `isPrefilled` (boolean) - `surveyId` (string) - `isValid` (boolean) - `status` (string) - `culture` (string) ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "user": "{{USER_ID}}", "isVerified": true } ``` ##### Response example: (200 OK) ```json { "data": { "userSetted": { "successful": true, "cartId": "746c7d26-25d2-4de9-a04e-4e5832f59c2d", "userId": "6fb0849c-1b89-ee11-93cf-00155d960409" }, "cart": { "id": "746c7d26-25d2-4de9-a04e-4e5832f59c2d", "expiryTime": "2025-12-31T18:00:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "a.example1@aditus.de" }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "email": "a.example1@aditus.de", "firstName": "Irmgard", "lastName": "Bauer", "company": "Irmgardfirma", "salutation": "Frau", "vatId": null, "address": { "street": "Irmgardstraße 1", "houseNumber": "1", "postalCode": "44212", "city": "Riyadh", "county": null, "country": "SA" }, "isPrefilled": true, "surveyId": "eyJVc2VDYXNlTmFtZSI6IlNob3AuTWlzc2luZ0J1eWVyIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOltdfQ==", "isValid": true }, "status": "Active", "culture": "de" } } } ``` #### PUT Set payment provider - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:cart/payment-providers` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/set-payment-provider The request updates the payment providers for a specific cart. ##### Request - `paymentProviderId` (string): The ID of the payment provider. - `successUrl` (string): The URL to redirect to upon successful payment. - `cancelUrl` (string): The URL to redirect to if the payment is canceled. - `errorUrl` (string): The URL to redirect to in case of an error. - `token` (string): A token for the payment. ##### Response The response includes the following fields: - `id` (`string`): The ID of the cart. - `expiryTime` (`string`): The expiry time of the cart. - `user` (`object`): Details of the user associated with the cart, including: - `id` (`string`): The ID of the user. - `isVerified` (`boolean`): The verification status of the user. - `eMail` (`string`): The email of the user. The response also includes other details related to the cart, such as event information, items in the cart, totals, payment provider details, buyer's information, and culture. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "paymentProviderId": "{{PAYMENT_PROVIDER_ID}}", "successUrl": "https://www.your-shop-client.com", "cancelUrl": "https://www.cancel.com", "errorUrl": "https://www.error.com", "token": "" } ``` ##### Response example: (200 OK) ```json { "data": { "paymentProviderSet": { "cartId": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3", "paymentProviderId": "00000000-0000-0000-0000-000000000000", "redirectRequired": true, "paymentProviderRedirectUrl": "https://webfilesdev.blob.core.windows.net/comps/CMI/hosted.html?source=ADITUS_01-2024-1411793_DWTC&reference=ac877ed4-40b3-47bd-a77f-a19dfe0b4dec&rand=944485", "expiresAt": "2025-04-25T14:16:33.9634022+00:00" }, "cart": { "id": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee1-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### DELETE Delete payment provider - Endpoint: `DELETE {{API_BASE_URL}}/shop/v1/cart/{{CART_ID}}/payment-providers` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-payment-provider This endpoint sends a request to remove payment providers from a specific cart. ##### Request The request body is not required for this request. ##### Response The response will include the following fields: - `data` (object): Contains the response data. - `paymentProviderRemoved` (object): Indicates whether the payment provider removal was successful and the cart ID. - `successful` (boolean): Specifies if the removal was successful. - `cartId` (string): The ID of the cart. - `cart` (object): Details of the cart. - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart. - `id` (string): The ID of the user. - `isVerified` (boolean): Indicates the verification status of the user. - `eMail` (string): The email of the user. The response may include additional fields such as event details, promotion codes, items in the cart, totals, buyer and billing person details, status, and culture. ##### Response example: (200 OK) ```json { "data": { "paymentProviderRemoved": { "successful": false, "cartId": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3" }, "cart": { "id": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee1-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "12345" }, { "isReadOnly": false, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Initialize Express Checkout - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/payment-provider/express-checkout?$expand=` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/initialize-express-checkout This endpoint is used to initiate an express checkout process for the specified cart. ##### Request No specific request parameters are required for this endpoint. ##### Response - `expressCheckoutInitialized` (object): - `sucessfull` (boolean) - `cartId` (string) - `cart` (object): The cart information ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | | | ##### Response example: (200 OK) ```json { "data": { "expressCheckoutInitialized": { "successful": true, "cartId": "0eee615c-0cb4-4404-9fb8-82bb81e379cc" }, "cart": { "id": "0eee615c-0cb4-4404-9fb8-82bb81e379cc", "expiryTime": "2025-11-15T17:15:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "example-mail@aditus.de" }, "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "number": "1596", "slug": "dvo25" }, "promotionCodes": [], "items": [ { "id": "0033cd71-0000-0000-0000-000000000000", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Tagesticket", "internalName": "Tagesticket", "description": null, "sort": 0, "prices": [ { "price": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=de&foregroundColor=%2301918F", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": null, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "articleGroup": null }, "promotionCodes": [], "voucherCode": null, "price": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "12345" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].StreetNumber", "value": "5" }, { "isReadOnly": false, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Validate cart - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/validate` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart This endpoint allows you to validate the items in the specified cart. ##### Request No request body is required. ##### Response The response will contain the following fields: - `isCheckoutPossible` (boolean): Indicates if the checkout is possible for the cart. - `isCartReloadRequired` (boolean): Indicates if the cart needs to be reloaded. - `problems` (array): An array of objects containing details about any problems encountered. - `code` (integer): The code associated with the problem. - `name` (string): The name of the problem. - `category` (string): The category of the problem. - `message` (string): A message describing the problem. - `details` (object): Additional details about the problem. - `resolvedProblems` (array): An array of objects representing the resolved problems. ##### Response example: (200 OK) ```json { "data": { "isCheckoutPossible": false, "isCartReloadRequired": false, "problems": [ { "code": 2103, "name": "BuyerMissing", "category": "Buyer", "message": "Cart does not contain required buyer information", "details": {} }, { "code": 2102, "name": "BuyerInvalid", "category": "Buyer", "message": "Buyer information are not valid (see details)", "details": { "errors": [ "The Email field is required." ] } }, { "code": 2208, "name": "RegistrationResponseValidationFailed", "category": "Registration", "message": "The given response for the registration of the item is not valid", "details": { "affectedItem": "002dbee1-0000-0000-0000-000000000000", "survey": "eyJVc2VDYXNlTmFtZSI6IlNob3AuUmVnaXN0cmF0aW9uLlNlbGYiLCJUZXJtaW5hbFNldElkIjpudWxsLCJGYWlyZXZlbnRJZCI6NTYsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6WzI1NF19", "errors": [ "The question 'Mobil-Nr.' must be answered!", "The question 'Firmenbranche' must be answered!", "The question 'Berufsbezeichnung' must be answered!", "The question 'Verantwortungsbereich' must be answered!" ] } }, { "code": 2303, "name": "PaymentNotSet", "category": "Payment", "message": "Payment is necessary but is not initialized", "details": {} }, { "code": 2020, "name": "ItemNotEnoughTimeslotsBooked", "category": "General", "message": "Item has booked less timeslots than required!", "details": { "affectedItem": "002dbee1-0000-0000-0000-000000000000" } } ], "resolvedProblems": [] } } ``` #### POST Validate cart with validator - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/validate/:validator` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/validate-cart-with-validator This endpoint allows you to validate a specific cart to check if checkout is possible and if cart reload is required. ##### Request No request body is required for this endpoint. ##### Response - `isCheckoutPossible` (boolean): Indicates if checkout is possible for the cart. - `isCartReloadRequired` (boolean): Indicates if cart reload is required. - `problems` (array): List of problems with the cart, if any. - `resolvedProblems` (array): List of problems that have been resolved, if any. ##### Response example: (200 OK) ```json { "data": { "isCheckoutPossible": true, "isCartReloadRequired": false, "problems": [], "resolvedProblems": [] } } ``` #### POST Checkout cart - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/checkout` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/checkout-cart This HTTP POST request is used to initiate the checkout process for a specific cart ##### Request This request does not require a request body.. ##### Response - `cartCheckedout` (object): Contains information about the checkout status, including the success status, message, order ID, and cart ID. - `cart` (object): Contains details of the cart, including: - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. - `event` (object): Details of the event associated with the cart, including ID, name, year, number, and slug. - `promotionCodes` (array): Array of promotion codes associated with the cart. - `items` (array): Array of items in the cart, including details such as ID, article, promotion codes, voucher code, price, registration, legitimation, timeslots, and totals. - `totals` (array): Array of total prices and currency information. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if the payment for the cart is immutable. - `isLegitimationImmutable` (boolean): Indicates if the legitimation for the cart is immutable. - `isRegistrationImmutable` (boolean): Indicates if the registration for the cart is immutable. - `isAmountImmutable` (boolean): Indicates if the amount for the cart is immutable. - `isRegistrationOnly` (boolean): Indicates if the cart is for registration only. - `isRegistrationRequired` (boolean): Indicates if registration is required for the cart. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired` (boolean): Indicates if payment is required for the cart. - `paymentProvider` (object): Details of the payment provider, including expiration time, redirect URL, transaction token, express checkout initialization status, ID, name, payment methods, configuration, and default status. - `buyerPerson` (object): Details of the buyer, including email, first name, last name, company, salutation, VAT ID, address, prefill status, and survey ID. - `order` (object): Details of the order, including ID, order date, and number. - `status` (string): The status of the cart. - `culture` (string): The culture associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Response example: (200 OK) ```json { "data": { "cartCheckedout": { "success": true, "message": "Checkout processed successfully", "orderId": "fbe19036-2f3a-f011-93e1-00155d96040a", "cartId": "5e369155-8ebf-4f9b-9931-aa952ad982c1" }, "cart": { "id": "5e369155-8ebf-4f9b-9931-aa952ad982c1", "expiryTime": "2025-11-15T17:15:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "a.example1@aditus.de" }, "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "number": "1596", "slug": "dvo25" }, "promotionCodes": [], "items": [ { "id": "0033cd72-0000-0000-0000-000000000000", "orderId": "fbe19036-2f3a-f011-93e1-00155d96040a", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Tagesticket", "internalName": "Tagesticket", "description": null, "sort": 0, "prices": [ { "price": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=de&foregroundColor=%2301918F", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": null, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "articleGroup": null }, "promotionCodes": [], "voucherCode": null, "price": { "price": 27.73, "grossPrice": 33, "tax": 5.27, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "12345" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].StreetNumber", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Clear cart - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/clear` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/clear-cart This endpoint is used to clear the items from a specific cart. ##### Request This request does not require a request body. ##### Response The response will include the following fields: - `cartCleared` (object): - `successfull`(boolean) - `cart` (object): - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. - `event` (object): Details of the event associated with the cart, including ID, name, year, number, and slug. - `promotionCodes` (array): An array of promotion codes associated with the cart. - `items` (array): An array of items in the cart. - `totals` (array): An array of total prices and taxes for the cart. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if the payment for the cart is immutable. - `isLegitimationImmutable` (boolean): Indicates if the legitimation for the cart is immutable. - `isRegistrationImmutable` (boolean): Indicates if the registration for the cart is immutable. - `isAmountImmutable` (boolean): Indicates if the amount for the cart is immutable. - `isRegistrationOnly` (boolean): Indicates if the cart is for registration only. - `isRegistrationRequired` (boolean): Indicates if registration is required for the cart. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired` (boolean): Indicates if payment is required for the cart. - `buyerPerson` (object): Details of the buyer associated with the cart, including email, first name, last name, company, salutation, VAT ID, address, prefill status, survey ID, and validity status. - `status` (string): The status of the cart. - `culture` (string): The culture associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Response example: (200 OK) ```json { "data": { "cartCleared": { "successful": true }, "cart": { "id": "5e369155-8ebf-4f9b-9931-aa952ad982c1", "expiryTime": "2025-11-15T17:15:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "example-mail@aditus.de@aditus.de" }, "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "number": "1596", "slug": "dvo25" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "email": "a.example1@aditus.de", "firstName": "Martina", "lastName": "Musterfrau", "company": "ADITUS GMBH", "salutation": "Frau", "vatId": null, "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "12345", "city": "Hannover", "county": "Niedersachsen", "country": "DE" }, "isPrefilled": true, "surveyId": "eyJVc2VDYXNlTmFtZSI6IlNob3AuTWlzc2luZ0J1eWVyIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjczLCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOltdfQ==", "isValid": true }, "status": "Active", "culture": "de" } } } ``` #### DELETE Delete cart - Endpoint: `DELETE {{API_BASE_URL}}/shop/v1/cart/:cart` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/delete-cart This endpoint is used to delete a specific cart. ##### Request - `cart` (string): The ID of the cart to be deleted. ##### Response Upon a successful deletion, the response will have a status code of 200. ##### Response example: (200 OK) _Empty body._ #### POST Update Terms of Service Status - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cartId/terms-of-service` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/basic-cart-processes/update-terms-of-service-status ##### Update Cart Terms of Service This endpoint allows you to update the approval status of items in a specific cart in the system. It is used to ensure compliance with the terms of service associated with the cart. ##### Request - **Method**: POST - **URL**: `{{API_BASE_URL}}/shop/v1/cart/:cartId/terms-of-service` ##### Request Body The request body must be in JSON format and should contain the following parameters: - **Items** (Array of Objects): A list of items to be updated. - **UniqueId** (String): The unique identifier of the terms of service item that you want to update. - **IsApproved** (Boolean): A flag indicating whether the item is approved or not. **Example Request Body**: ``` json { "Items": [ { "UniqueId": "55d12ee4-67e8-4bf9-8da9-a459b0...", "IsApproved": true } ] } ``` ##### Response Upon a successful request, the API will return a response with the following structure: - **Status**: 200 OK - **Content-Type**: application/vnd.aditus.v1+json - **Response Body**: - **data** (Object): Contains the result of the update operation. - **cartId** (String): The ID of the cart that was updated. - **isSuccess** (Boolean): Indicates whether the update operation was successful. **Example Response**: ``` json { "data": { "cartId": "", "isSuccess": true } } ``` ##### Notes - Ensure that the `cartId` in the URL is replaced with the actual cart's ID whose terms of service you wish to update. - The response will confirm whether the operation was successful or not, allowing you to handle subsequent logic accordingly. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "Items": [ { "UniqueId": "55d12ee4-67e8-4bf9-8da9-a459b064d0fd", "IsApproved": true } ] } ``` ##### Response example: (200 OK) ```json { "data": { "userId": "6fb0849c-1b89-ee11-93cf-00155d960409", "isSuccess": true } } ``` ##### Response example: (200 OK) ```json { "data": { "cartId": "50eb4b2c-3ad6-4df1-b162-d725b550a5b5", "isSuccess": true } } ``` ### Coupons Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons The _Coupons_ endpoints are used for **vouchers** and **promotion codes**. #### Promotion Codes A promotion code grants a discount on a sales item. A promotion code can be redeemed for a discount on exactly one item. It is also possible to use promotion codes to activate items for purchase in the visitor portal that are not visible without entering the promotion code. #### Vouchers Vouchers can grant free articles. They are treated as coupons that reduce the price of an article to zero. #### DELETE Remove coupon - Endpoint: `DELETE {{API_BASE_URL}}/shop/v1/cart/:cartId/coupons/:coupon?$expand=` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/remove-coupon This endpoint is used to remove a specific coupon from the cart. ##### Request This request does not have a request body. ##### Response Upon successful deletion, the response will include the updated cart details. - `couponRemoved` (object): Indicates whether the coupon removal was successful. - `successful` (boolean): Specifies if the coupon removal was successful. - `cartId` (string): The ID of the cart from which the coupon was removed. - `code` (string): The code of the removed coupon. - `cart` (object): Provides the updated cart information. - `id`(string): The ID of the cart. - expiryTime (string): The expiration time of the cart. - `user`(object): Details of the user associated with the cart, including ID, verification status, and email. - `event`(object): Details of the event associated with the cart. - `promotionCodes`(array): List of promotion codes associated with the cart. - `items`(array): List of items in the cart. - `totals`(array): List of total amounts including price, gross price, tax, tax rate, and currency. - `isImmutable`(boolean): Indicates if the cart is immutable. - `isPaymentImmutable`(boolean): Indicates if the payment for the cart is immutable. - `isLegitimationImmutable`(boolean): Indicates if the legitimation for the cart is immutable. - `isRegistrationImmutable`(boolean): Indicates if the registration for the cart is immutable. - `isAmountImmutable`(boolean): Indicates if the amount for the cart is immutable. - `isRegistrationOnly`(boolean): Indicates if the registration is the only requirement for the cart. - `isRegistrationRequired`(boolean): Indicates if registration is required for the cart. - `isLegitimationRequired`(boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired`(boolean): Indicates if payment is required for the cart. - `buyerPerson`(object): Details of the buyer associated with the cart. - `status`(string): The status of the cart. - `culture`(string): The culture associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | | | ##### Response example: (200 OK) ```json { "data": { "couponRemoved": { "successful": true, "cartId": "2d3d25df-6644-46fc-bf28-2a74f672e2a4", "code": "gopro" }, "cart": { "id": "2d3d25df-6644-46fc-bf28-2a74f672e2a4", "expiryTime": "2025-12-30T18:00:00+01:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "email": null, "firstName": null, "lastName": null, "company": null, "salutation": null, "vatId": null, "address": null, "isPrefilled": false, "surveyId": "eyJVc2VDYXNlTmFtZSI6IlNob3AuTWlzc2luZ0J1eWVyIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOltdfQ==", "isValid": false }, "status": "Active", "culture": "en" } } } ``` #### POST Check and redeem coupon - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/check-and-redeem-coupon This endpoint is used to add a coupon to the specified cart. ##### Request - `couponCode` (text, required): The code of the coupon to be added to the cart. ##### Response - `couponReserved` (object): - `cartId` (string): The cart ID - `code` - `registrationResult` - `affectedAssortments` (array): - `codeType` (string) - `reservation` (object) - `article` (object) - `apearance` (object) - `organization` (object) - `cart` (object): The full cart object ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Response example: (200 OK) ```json { "data": { "couponReserved": { "cartId": "8149fe2a-3d48-4f26-adaf-a4722cc73228", "code": null, "registrationResult": { "message": "OK", "code": "OK" }, "affectedAssortments": [], "codeType": "Voucher", "reservation": { "id": "002fed8a-0000-0000-0000-000000000000", "validUntil": "2025-04-24T16:47:40.7125375+02:00" }, "article": { "prices": null, "articleGroup": { "id": "10457333-bc74-ef11-93d8-00155d96040a", "name": "Gutscheintickets", "description": null, "sort": -1, "isExpanded": false, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "2a283eeb-88b3-ee11-93d1-00155d96040a", "name": "e-voucher", "internalName": "e-Gutschein", "description": null, "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:2a283eeb-88b3-ee11-93d1-00155d96040a&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "005", "category": "VISITOR", "amount": { "remaining": 100 }, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "timeslots": [] }, "appearance": { "id": "a7c0a981-8312-ef11-93d7-00155d96040a", "number": "M0003892", "isIntern": false, "welcomeText": "Visit us in Hall 6 at Stand G22", "hasWelcomeBanner": true }, "organization": { "id": "d96fbfb4-ca06-ef11-93d7-00155d96040a", "name": "GoPro" } }, "cart": { "id": "8149fe2a-3d48-4f26-adaf-a4722cc73228", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002fed8a-0000-0000-0000-000000000000", "article": { "id": "2a283eeb-88b3-ee11-93d1-00155d96040a", "name": "e-voucher", "internalName": "e-Gutschein", "description": null, "sort": 0, "prices": [ { "price": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:2a283eeb-88b3-ee11-93d1-00155d96040a&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "005", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "10457333-bc74-ef11-93d8-00155d96040a", "name": "Gutscheintickets", "sort": -1, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### GET Get coupon information - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/coupons/:coupon` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/coupons/get-coupon-information This endpoint retrieves information about a specific coupon in the shopping cart. ##### Request - `cart`: The identifier of the shopping cart (path parameter) - `coupon`: The identifier of the coupon (path parameter) ##### Response - `data` (object): The container for coupon information. - `article` (object): Details about the article. - `prices` (null): The prices of the article. - `articleGroup` (object): Information about the article group. - `id` (string): The ID of the article group. - `name` (string): The name of the article group. - `description` (null): The description of the article group. - `sort` (number): The sorting order of the article group. - `isExpanded` (boolean): Indicates if the article group is expanded. - `configuration` (object): Configuration details of the article group. - `maxNumberOfTicketsPerSale` (null): The maximum number of tickets per sale for the article group. - `id` (string): The ID of the article. - `name` (string): The name of the article. - `internalName` (string): The internal name of the article. - `description` (null): The description of the article. - `image` (object): Details about the article's image. - `key` (string): The key of the image. - `uri` (string): The URI of the image. - `type` (string): The type of the image. - `sort` (number): The sorting order of the article. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the article. - `legitimationCategory` (null): The legitimation category of the article. - `type` (string): The type of the article. - `ticketValidity` (string): The validity of the ticket. - `articleNumber` (string): The article number. - `category` (string): The category of the article. - `amount` (object): Details about the amount. - `remaining` (number): The remaining amount. - `configuration` (object): Configuration details of the article. - `showRemainingAmount` (boolean): Indicates if the remaining amount is shown. - `showRemainingAmountPerTimeslot` (boolean): Indicates if the remaining amount per timeslot is shown. - `showIfSoldOut` (boolean): Indicates if sold out information is shown. - `soldOutText` (null): The text displayed when sold out. - `maxLengthOfDescription` (number): The maximum length of the description. - `maxNumberOfTicketsPerSale` (number): The maximum number of tickets per sale. - `minNumberOfTicketsPerSale` (null): The minimum number of tickets per sale. - `isInvitationEmailAddressChangePossible` (boolean): Indicates if invitation email address change is possible. - `timeslots` (array): The timeslots of the article. - `appearance` (object): Details about the appearance. - `id` (string): The ID of the appearance. - `number` (string): The number of the appearance. - `isIntern` (boolean): Indicates if the appearance is internal. - `welcomeText` (string): The welcome text. - `hasWelcomeBanner` (boolean): Indicates if a welcome banner is present. - `organization` (object): Details about the organization. - `id` (string): The ID of the organization. - `name` (string): The name of the organization. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "article": { "prices": null, "articleGroup": { "id": "10457333-bc74-ef11-93d8-00155d96040a", "name": "Gutscheintickets", "description": null, "sort": -1, "isExpanded": false, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "2a283eeb-88b3-ee11-93d1-00155d96040a", "name": "e-voucher", "internalName": "e-Gutschein", "description": null, "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:2a283eeb-88b3-ee11-93d1-00155d96040a&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "005", "category": "VISITOR", "amount": { "remaining": 100 }, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "timeslots": [] }, "appearance": { "id": "a7c0a981-8312-ef11-93d7-00155d96040a", "number": "M0003892", "isIntern": false, "welcomeText": "Visit us in Hall 6 at Stand G22", "hasWelcomeBanner": true }, "organization": { "id": "d96fbfb4-ca06-ef11-93d7-00155d96040a", "name": "GoPro" } } } ``` ### Registration Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration The _Registration_ endpoints are used to register items and to select timeslots if it is required. It is still possible to to change the registration data and the timeslots after the order is completed. This is done via _Get cart from order_. Afterwards, the cart goes through the checkout again. #### PUT Update item's registration - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration?$expand=` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-registration This endpoint is used to update the registration of an item in the cart. ##### Request - `cart`: The cart ID - `item`: The item ID ##### Request body - `type` - `answers`: - `binding member` - `value` ##### Response - `data` (object): Contains the updated registration information and the cart details. - `registrationUpdated` (object): Contains the updated registration details. - `cartId` (string): The ID of the cart. - `id` (string): The ID of the registration. - `registration` (object): Contains the updated registration information. - `type` (string): The type of registration. - `referencedSurveyResponse` (null): The referenced survey response. - `answers` (array): List of answers for the registration. - `isReadOnly` (boolean): Indicates if the answer is read-only. - `bindingMember` (string): The binding member for the answer. - `value` (string): The value of the answer. - `hasInformation` (boolean): Indicates if the registration has information. - `cart` (object): Contains the details of the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | | | ##### Request body example ```json { "type": "self", "answers": [ { "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "12345" }, { "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" }, { "bindingMember": "[CRM.PartyAddresses].StreetNumber", "value": "5" }, { "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" } ] } ``` ##### Response example: (200 OK) ```json { "data": { "registrationUpdated": { "cartId": "8149fe2a-3d48-4f26-adaf-a4722cc73228", "id": "002dbee2-0000-0000-0000-000000000000", "registration": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "12345" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].StreetNumber", "value": "5" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" } ], "hasInformation": true } }, "cart": { "id": "8149fe2a-3d48-4f26-adaf-a4722cc73228", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee2-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### PUT Update item's timeslots - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots?$expand=AssociatedPersonOnItems&$expand=AvailableTimeslotsOnItems` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/update-item-s-timeslots This endpoint is used to update the timeslots for a specific item in the user's shopping cart. ##### Request - `bookings` (array of objects) - An array containing the booking details for the item. - `day` (string) - The unique identifier for the day of the booking. - `timeRange` (string) - The unique identifier for the time range of the booking. ##### Response The response returns a JSON object with the following fields: - `timeslotsBooked` (object) - Object containing the booked timeslots information. - `bookings` (array of objects) - Array of booked timeslots. - `id` (string) - The unique identifier for the booking. - `date` (string) - The date of the booking. - `printText` (string) - The text to be printed for the booking. - `timeRange` (object) - Object containing the time range information. - `id` (string) - The unique identifier for the time range. - `start` (string) - The start time of the time range. - `end` (string) - The end time of the time range. - `cart` (object) - Object containing the updated cart information. - Various cart details including ID, expiry time, user information, event details, promotion codes, items, totals, buyer person details, and status. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | AssociatedPersonOnItems | | | $expand | AvailableTimeslotsOnItems | | ##### Request body example ```json { "bookings":[ { "day": "c64340f4-96d2-ef11-93d9-00155d96040a", "timeRange": "150b242b-97d2-ef11-93d9-00155d96040a" } ] } ``` ##### Response example: (200 OK) ```json { "data": { "timeslotsBooked": { "bookings": [ { "id": "c64340f4-96d2-ef11-93d9-00155d96040a", "date": "2025-12-24", "printText": "Mi., 24.12.2025 08:00-18:00", "timeRange": { "id": "150b242b-97d2-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00" } } ] }, "cart": { "id": "7b84f81c-a6bd-43e9-a687-44ba94520db9", "expiryTime": "2025-12-31T18:00:00+01:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbf03-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### GET Get item registration prefill data - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/registration/self/prefill-data` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-registration-prefill-data The endpoint retrieves pre-filled registration data for a specific item in the cart. ##### Request This request does not have a request body. ##### Response The `data` object contains: - `registrationType` (string): The type of registration being pre-filled. - `answers` (array): An array of pre-filled answers for the registration, each containing: - `isReadOnly` (boolean): Indicates if the answer is read-only. - `bindingMember` (string): The binding member for the answer. - `value` (string): The pre-filled value for the answer. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "registrationType": "self", "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Herr" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Max" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Mustermann" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GmbH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Straße der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].StreetNumber", "value": "5" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "30539" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].County", "value": "Niedersachsen" } ] } } ``` #### GET Get item's timeslots information - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/items/:item/timeslots` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/registration/get-item-s-timeslots-information This endpoint retrieves the available timeslots for a specific item in the cart. ##### Request No request body is required for this endpoint. ##### Response The response includes the following fields: - `isEnabled` (boolean): Indicates whether the timeslots are enabled. - `isValid` (boolean): Indicates the validity of the timeslots. - `minimumNumberOfBookings` (number): The minimum number of bookings allowed. - `maximumNumberOfBookings` (number): The maximum number of bookings allowed. - `bookings` (array): Contains any existing bookings for the item. Each booking object within the array includes the following fields: - `id` (string): The ID of the booking. - `date` (string): The date of the booking. - `isAvailableForBooking` (boolean): Indicates whether the timeslot is available for booking. - `isBookingLimited` (boolean): Indicates if the booking is limited. - `isExpired` (boolean): Indicates if the booking is expired. - `isSoldOut` (boolean): Indicates if the booking is sold out. - `timeRanges` (array): Contains the time ranges available for booking. Each time range object within the array includes the following fields: - `id` (string): The ID of the time range. - `start` (string): The start time of the time range. - `end` (string): The end time of the time range. - `isAvailableForBooking` (boolean): Indicates whether the time range is available for booking. - `isBookingLimited` (boolean): Indicates if the time range booking is limited. - `isExpired` (boolean): Indicates if the time range booking is expired. - `isSoldOut` (boolean): Indicates if the time range booking is sold out. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "isEnabled": true, "isValid": false, "minimumNumberOfBookings": 1, "maximumNumberOfBookings": 1, "bookings": [], "days": [ { "id": "b61799fa-39a7-ef11-93d8-00155d96040a", "date": "2024-12-21", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "b71799fa-39a7-ef11-93d8-00155d96040a", "start": "10:30", "end": "12:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "a54cde34-f5bd-ef11-93d9-00155d96040a", "start": "12:00", "end": "13:30", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "b321f259-f5bd-ef11-93d9-00155d96040a", "date": "2024-12-22", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "45cde1df-17be-ef11-93d9-00155d96040a", "date": "2024-12-25", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false, "timeRanges": [ { "id": "67ef2303-21be-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false } ] }, { "id": "8752a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-01", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "9352a2c6-71e8-ef11-93da-00155d96040a", "date": "2025-03-02", "isAvailableForBooking": false, "isBookingLimited": false, "isExpired": true, "isSoldOut": false }, { "id": "c64340f4-96d2-ef11-93d9-00155d96040a", "date": "2025-12-24", "isAvailableForBooking": true, "isBookingLimited": true, "remainingAmount": 672, "isExpired": false, "isSoldOut": false, "timeRanges": [ { "id": "150b242b-97d2-ef11-93d9-00155d96040a", "start": "08:00", "end": "18:00", "isAvailableForBooking": true, "isBookingLimited": true, "remainingAmount": 672, "isExpired": false, "isSoldOut": false } ] } ] } } ``` ### Legitimation Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation #### The legitimation process: - Create cart - Add article requiring legitimation - Set registration and/or buyer data - Set legitimation data - Checkout Now the legitimation has to be granted. This is done in the Terp V5. After that, the customer can proceed as follows: - Payment if necessary - Checkout #### POST Add legitimation - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation This endpoint is used to submit legitimation proofs for a specific cart and legitimation. ##### Request - `proofs` (array of objects) - `typeId` (string): The ID of the proof type - `documentType` (string): Type of the document, e.g., passport, driver's license - `value` (string): Value of the document, e.g., document number, ID ##### Response Upon successful submission, the response will contain the following data: - `legitimationAdded` (object) - `successful` (boolean): Indicates if the legitimation proof submission was successful - `cartId` (string): The ID of the cart - `legitimationIdentifier` (object) - `legitimationCategoryId` (string): The ID of the legitimation category - `identifier` (string): Identifier of the legitimation - `type` (string): Type of the legitimation - `cart` (object): detailed information about the cart, including user details, event details, items in the cart, buyer information, legitimation details, and more. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "proofs": [ { "typeId": "{{PROOF_TYPE_ID}}", "documentType" : "Text", "value": "Text" } ] } ``` ##### Response example: (200 OK) ```json { "data": { "legitimationAdded": { "successful": true, "cartId": "0215c083-6e11-479e-a107-46da38760796", "legitimationIdentifier": { "legitimationCategoryId": "b2ee75eb-f1e1-ee11-93d5-00155d96040a", "identifier": "a.example1@aditus.de", "type": "Email" } }, "cart": { "id": "0215c083-6e11-479e-a107-46da38760796", "expiryTime": "2025-08-31T23:59:00+02:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "a.example1@aditus.de" }, "event": { "id": "f32adbb6-3c9c-ef11-93d8-00155d96040a", "name": "Futurama", "year": "2025", "number": "0815", "slug": "fr25" }, "promotionCodes": [], "items": [ { "id": "004930c8-0000-0000-0000-000000000000", "article": { "id": "12b5a1e1-9304-f011-93dd-00155d96040a", "name": "Futurama Legitimationsticket", "internalName": "Futurama Legitimationsticket", "description": null, "sort": 0, "prices": [ { "price": { "price": 12.61, "grossPrice": 15, "tax": 2.39, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 12.61, "grossPrice": 15, "tax": 2.39, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.ExhibitorTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/ExhibitorTicket?context=article:12b5a1e1-9304-f011-93dd-00155d96040a&language=de&foregroundColor=%23C32826", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "820", "category": null, "legitimationCategory": { "id": "b2ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "Fachbesucher", "description": "Legitimation von Fachbesuchern", "availableProofTypes": [ { "id": "7f2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Persönliche Fachbesucherlegitimation", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7b2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Gewerbeanmeldung", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "802e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Studentenausweis/Immatrikulation", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "7d2e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Legitimation", "description": "", "isRequired": false, "availableDocumentTypes": [ "Url", "File", "Text" ] }, { "id": "792e14d5-d5fb-ee11-93d5-00155d96040a", "name": "Arbeitsvertrag", "description": "Beschreibung Arbeitsvertrag", "isRequired": false, "availableDocumentTypes": [ "File" ] }, { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Add legitimation document - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/add-legitimation-document ##### Request Body The request should be sent as a form-data with the following parameter: - `file` (file): The document file to be added. ##### Response Upon successful addition of the document to the cart legitimation, the response will include the following details: - `cartId` (string): The ID of the cart. - `documentId` (string): The ID of the added document. - `legitimationId` (string): The ID of the legitimation. ##### Response example: (200 OK) ```json { "data": { "cartId": "0215c083-6e11-479e-a107-46da38760796", "documentId": "LegitimationProof:41dd6de1-9c48-4517-8079-812a786eab9d", "legitimationId": "eyJMZWdpdGltYXRpb25DYXRlZ29yeUlkIjoiYjJlZTc1ZWItZjFlMS1lZTExLTkzZDUtMDAxNTVkOTYwNDBhIiwiSWRlbnRpZmllciI6ImEuZ3JldmVAYWRpdHVzLmRlIiwiVHlwZSI6MX0=" } } ``` #### DELETE Remove legitimation document - Endpoint: `DELETE {{API_BASE_URL}}/shop/v1/cart/:cart/legitimation/:legitimation/document/:document` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/legitimation/remove-legitimation-document This endpoint is used to delete a specific document related to a legitimation in a user's shopping cart. ##### Request This request does not require a request body. ##### Response The response does not include a body. ##### Response example: (200 OK) _Empty body._ ### Billing Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing The **buyer** data does not have to be set, if the customer already registered the tickets for themselves. The **billing** data only has to be set if it differs from the buyer data. #### PUT Set buyer - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:id/buyer` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-buyer This endpoint is used to update the buyer information for a specific cart. ##### Request - `cart` (path): The ID of the cart to be updated. ##### Request Body - `firstName`: (text) The first name of the buyer. - `lastName`: (text) The last name of the buyer. - `company`: (text) The company name of the buyer. - `salutation`: (text) The salutation of the buyer. - `vatId`: The VAT ID of the buyer. - `address`: The address object containing the street, house number, postal code, city, county, and country of the buyer. ##### Response - `buyerSet`: The buyer set object with successful status and buyer person details. - `successful`: A boolean indicating the success status of the buyer set. - `cartId`: The ID of the cart. - `buyerPerson`: The buyer person object with salutation, first name, last name, email, company, address, VAT ID, isPrefilled, survey ID, and validity status. - `cart`: The cart object containing details about the cart, user, event, promotion codes, items, totals, immutability status, buyer person, status, and culture. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "salutation": "Mr.", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus-demo.de", "company": "ADITUS GmbH", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "Germany" } } ``` ##### Response example: (200 OK) ```json { "data": { "buyerSet": { "successful": true, "cartId": "7b84f81c-a6bd-43e9-a687-44ba94520db9", "buyerPerson": { "salutation": "Mr.", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus-demo.de", "company": "ADITUS GmbH", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "Germany" }, "vatId": null } }, "cart": { "id": "7b84f81c-a6bd-43e9-a687-44ba94520db9", "expiryTime": "2025-12-31T18:00:00+01:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "email": null, "firstName": "Max", "lastName": "Mustermann", "company": "ADITUS GmbH", "salutation": "Mr.", "vatId": null, "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "Germany" }, "isPrefilled": false, "surveyId": "eyJVc2VDYXNlTmFtZSI6IlNob3AuTWlzc2luZ0J1eWVyIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjU2LCJSb2xlSWQiOm51bGwsIkFydGljbGVJZHMiOltdfQ==", "isValid": false }, "status": "Active", "culture": "de" } } } ``` #### PUT Set billing - Endpoint: `PUT {{API_BASE_URL}}/shop/v1/cart/:cart/billing` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/billing/set-billing This endpoint is used to update the billing information for a specific cart. ##### Request - `cart` (path): The ID of the cart to be updated. ##### Request Body - `salutation` (string): The salutation of the customer. - `firstName` (string): The first name of the customer. - `lastName` (string): The last name of the customer. - `email` (string): The email address of the customer. - `company` (string): The company name of the customer. - `address` (object): The address details of the customer. - `street` (string): The street name in the address. - `houseNumber` (string): The house number in the address. - `postalCode` (string): The postal code in the address. - `city` (string): The city in the address. - `county` (string): The county in the address. - `country` (string): The country in the address. ##### Response - `userID` (string): The ID of the user associated with the cart. - `verificationStatus` (string): The verification status of the user associated with the cart. - `email` (string): The email address of the user associated with the cart. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "salutation": "Mr.", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus-demo.de", "company": "ADITUS GmbH", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "Germany" } } ``` ##### Response example: (200 OK) ```json { "data": { "billingSet": { "successful": true, "cartId": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3", "billingPerson": { "salutation": "Mr.", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus-demo.de", "company": "ADITUS GmbH", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "Germany" }, "vatId": null } }, "cart": { "id": "64ed9b39-6455-4df4-885a-1e7d6f4cadb3", "expiryTime": "2025-04-29T18:00:00+02:00", "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbee1-0000-0000-0000-000000000000", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Day Pass", "internalName": "Day Pass", "description": "Das Tagesticket berechtigt Sie zum einmaligen Besuch der Experience Days an einem beliebigen Veranstaltungstag.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=de&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Messetickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Musterfrau" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Martina" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GMBH" }, { "isReadOnly": false, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### Recommendations Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations _Recommendations are available from Release Version 118 onwards._ These endpoints allow to offer additional articles in a ticket shop through cross-selling and up-selling. These offers are suggested to the user when purchasing a ticket. The suggestions can include various items such as additional tickets or services that increase or complement the value of the original purchase. Up-selling: When a user selects a ticket, more expensive or enhanced ticket options (e.g., "Go Green Day Ticket XL") can be offered as an up-sell. Cross-selling: Users are offered related products that they can purchase additionally (e.g., parking tickets that can be booked together with a ticket). #### GET Get recommendations - Endpoint: `GET {{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/get-recommendations This endpoint retrieves recommendations for up-selling and cross-selling items related to the specified cart. ##### Request Thes endpoint does not require ar request body. ##### Response - `data` (object): The main data container for the recommendations. - `upSellings` (array): An array of recommended products for up-selling. - `article` (object): Details of the recommended product. - `prices` (array): An array of prices for the product. - `recommendationImageUri` (string): The URI for the recommendation image. - `id` (string): The ID of the recommended product. - `name` (string): The name of the recommended product. - `description` (string): The description of the recommended product. - `image` (object): Details of the product image. - `sort` (integer): The sorting order of the product. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the product. - `type` (string): The type of the product. - `ticketValidity` (string): The validity of the ticket for the product. - `articleNumber` (string): The article number of the product. - `amount` (object): Details of the product amount. - `configuration` (object): Configuration details for the product. - `timeslots` (array): An array of timeslots for the product. - `crossSellings` (array): An array of recommended products for cross-selling. - `article` (object): Details of the recommended product (similar structure as in `upSellings`). - `description` (string): The description of the recommendations. ##### Response example: (200 OK) ```json { "data": { "upSellings": [ { "article": { "prices": [ { "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" } } ], "recommendationImageUri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/ARTICLE_RECOMMENDATION_IMAGE?context=article:fa94184d-55e9-ef11-93da-00155d96040a&language=de&v=742020a5a86a79ee1bd089b224c94ee70f75331e6cef36b006ae6ec1be47879a", "id": "fa94184d-55e9-ef11-93da-00155d96040a", "name": "Sternenreisender-Pass 🌟🛸", "internalName": "Starfarer Pass 🌟🛸", "description": "Begib dich auf eine Reise durch die Sterne! Dieser Pass gewährt dir 1-tägigen Zugang zur ultimativen intergalaktischen Messe.", "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:fa94184d-55e9-ef11-93da-00155d96040a&language=de&foregroundColor=%23C000C0", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "420", "category": null, "amount": { "remaining": 6947 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": true, "showIfSoldOut": true, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": null, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [] }, "items": [ "0043a550-0000-0000-0000-000000000000" ], "recommendations": [ { "weight": 2, "article": { "prices": [ { "price": { "price": 5.8, "grossPrice": 6.9, "tax": 1.1, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 5.8, "grossPrice": 6.9, "tax": 1.1, "taxRate": 19, "currency": "EUR" } } ], "recommendationImageUri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/ARTICLE_RECOMMENDATION_IMAGE?context=article:11a2c2fd-6005-f011-93dd-00155d96040a&language=de&v=bd8ecdf0e28a7560589b740885cab2be5d42413d6808a321974a6fa452f6a352", "id": "11a2c2fd-6005-f011-93dd-00155d96040a", "name": "Nebel-Entdecker 🌌🔭", "internalName": "Nebula Explorer 🌌🔭", "description": "Zwei Tage kosmische Erkundung erwarten dich! Entdecke neue Welten, Technologien und Zivilisationen.", "image": { "key": "Default.TwoDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/TwoDayTicket?context=article:11a2c2fd-6005-f011-93dd-00155d96040a&language=de&foregroundColor=%23C000C0", "type": "Icon" }, "sort": 1, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "MultipleDays", "articleNumber": "667", "category": null, "amount": { "remaining": 2493 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": true, "showIfSoldOut": true, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": null, "minNumberOfTicketsPerSale": null, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Apply recommendations - Endpoint: `POST {{API_BASE_URL}}/shop/v1/cart/:cart/recommendations` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/cart/recommendations/apply-recommendations This endpoint is used to add recommendations to a specific cart. ##### Request ##### Request body - `upsellings`: An array of objects containing the article and items for upselling. - `article`: The unique identifier for the upselling article. - `items`: An array of item identifiers for upselling. - `crossSellings`: An array of objects containing the article and items for cross-selling. - `article`: The unique identifier for the cross-selling article. - `items`: An array of item identifiers for cross-selling. ##### Response The response body will include the following fields: - `recommendationsApplied` (object): Details of the recommendations applied to the cart, including added articles, removed items, and problems. - `cart` (object): Details of the cart, including ID, expiry time, user, event, promotion codes, items, totals, and buyer person. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $expand | All | | ##### Request body example ```json { "upsellings": [ { "article": "fa94184d-55e9-ef11-93da-00155d96040a", // articleId "items": [ // item ids "0043a550-0000-0000-0000-000000000000" ] }, { "article": "11a2c2fd-6005-f011-93dd-00155d96040a", // articleId "items": [] } ], "crossSellings": [ // article ids of items to add { "article": "fa94184d-55e9-ef11-93da-00155d96040a", // articleId "items": [ // // item ids "0043a550-0000-0000-0000-000000000000" ] }, { "article": "11a2c2fd-6005-f011-93dd-00155d96040a", // articleId "items": [] } ] } ``` ##### Response example: (200 OK) ```json { "data": { "recommendationsApplied": { "cartId": "1cfc5b4f-6576-44f8-9595-705922c88c25", "addedArticles": [ { "reservation": { "id": "0043a552-0000-0000-0000-000000000000", "validUntil": "2025-06-02T13:55:16.1646415+02:00" }, "item": { "id": "0043a552-0000-0000-0000-000000000000" } }, { "reservation": { "id": "0043a553-0000-0000-0000-000000000000", "validUntil": "2025-06-02T13:55:16.3214544+02:00" }, "item": { "id": "0043a553-0000-0000-0000-000000000000" } } ], "removedItems": [ { "itemId": "0043a550-0000-0000-0000-000000000000", "successful": true, "article": { "prices": [ { "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "ec2a3c84-7d05-f011-93dd-00155d96040a", "name": "Standard Eintrittstickets", "description": null, "sort": 0, "isExpanded": false, "configuration": { "maxNumberOfTicketsPerSale": null } }, "id": "fa94184d-55e9-ef11-93da-00155d96040a", "name": "Sternenreisender-Pass 🌟🛸", "internalName": "Starfarer Pass 🌟🛸", "description": "Begib dich auf eine Reise durch die Sterne! Dieser Pass gewährt dir 1-tägigen Zugang zur ultimativen intergalaktischen Messe.", "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:fa94184d-55e9-ef11-93da-00155d96040a&language=de&foregroundColor=%23C000C0", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "legitimationCategory": null, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "420", "category": null, "amount": { "remaining": 6947 }, "configuration": { "showRemainingAmount": true, "showRemainingAmountPerTimeslot": true, "showIfSoldOut": true, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": null, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": true }, "timeslots": [] } } ], "problems": [] }, "cart": { "id": "1cfc5b4f-6576-44f8-9595-705922c88c25", "expiryTime": "3175-12-31T04:20:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "a.example1@aditus.de" }, "event": { "id": "10b992c5-53e9-ef11-93da-00155d96040a", "name": "Galaxio Messe", "year": "2050", "number": "6666", "slug": "GalaxioExpo2050" }, "promotionCodes": [], "items": [ { "id": "0043a552-0000-0000-0000-000000000000", "article": { "id": "fa94184d-55e9-ef11-93da-00155d96040a", "name": "Sternenreisender-Pass 🌟🛸", "internalName": "Starfarer Pass 🌟🛸", "description": "Begib dich auf eine Reise durch die Sterne! Dieser Pass gewährt dir 1-tägigen Zugang zur ultimativen intergalaktischen Messe.", "sort": 0, "prices": [ { "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 3.53, "grossPrice": 4.2, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ## User Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user Behind the user section are the operations that are based on a specific user. Typical and supported use cases are: - Get the user profile - Update existing profile - Get the user profile picture - Update the user profile picture - Get all carts by the given user - Get all orders by the given user - Get the details for a given order - Resend the confirmation email for a given order ### Carts Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/carts #### GET Get carts - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/carts?event={{EVENT}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/carts/get-carts This API endpoint retrieves the carts associated with a specific user, optionally filtered by a provided event. ##### Request - `user` (path parameter): The user for whom the carts are being retrieved. - `event` (optional): The specific event for which the carts are being retrieved. ##### Response The response will include an array of carts. - `carts` (array): - `id`: The unique identifier for the cart. - `status`: The current status of the cart. - `event`: An object containing details of the associated event, including its ID, name, year, number, and slug. - `user`: An object containing details of the user associated with the cart, including the user's ID, verification status, and email. - `order`: Details of the order associated with the cart, if any. - `createdAt`: The timestamp indicating when the cart was created. - `updatedAt`: The timestamp indicating when the cart was last updated. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | event | {{EVENT}} | The event slug | ##### Response example: (200 OK) ```json { "data": { "carts": [ { "id": "0e8e2d0f-d373-4dee-ad40-185870fc5dd2", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2025-05-05T11:39:04.6990516+02:00", "updatedAt": "2025-05-05T14:40:46.121984+02:00" }, { "id": "4a077e39-82f5-49ee-819f-1d25130c0750", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2025-03-20T08:44:46.5629602+01:00", "updatedAt": "2025-03-20T08:44:46.5629602+01:00" }, { "id": "e22ab31a-173c-4af9-aab4-212b96dcfe4b", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2024-01-02T15:57:23.8087661+01:00", "updatedAt": "2024-01-02T15:57:23.8087661+01:00" }, { "id": "2d3d25df-6644-46fc-bf28-2a74f672e2a4", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2025-05-08T10:59:59.6673956+02:00", "updatedAt": "2025-05-08T11:00:30.8438225+02:00" }, { "id": "c03d22e2-679d-4e50-b5bd-31d511bc6046", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2024-08-21T10:25:46.9254038+02:00", "updatedAt": "2024-08-21T10:25:46.9254038+02:00" }, { "id": "6607c9f8-ca58-42b3-9b65-443a0a87f758", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2025-04-28T13:36:59.6038004+02:00", "updatedAt": "2025-04-28T13:36:59.6038004+02:00" }, { "id": "d0e0259f-ed49-48c6-8df8-4f11f31b6167", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2025-05-05T15:27:49.0628812+02:00", "updatedAt": "2025-05-05T15:28:29.2811277+02:00" }, { "id": "974634fa-ab14-4f60-ac8e-5d3d8c801a79", "status": "Abandoned", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "user": { "id": "00000000-0000-0000-0000-000000000000", "isVerified": true, "eMail": null }, "order": null, "createdAt": "2024-08-21T12:02:37.0363446+02:00", "updatedAt": "2024-08-28T09:54:36.9910597+02:00" }, { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### Orders Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders #### GET Get orders - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/orders?event={{EVENT}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-orders This endpoint allows you to retrieve orders for a specific user based on the provided event. ##### Request - `user` (path): The user for whom the orders are to be retrieved. - `event` (query): The event based on which the orders are filtered. ##### Response The response will contain an array of order objects, each including the following details: - `id` (string): The unique identifier of the order. - `number` (string): The order number. - `orderedAt` (string): The date and time when the order was placed. - `orderedBy` (object): Details of the user who placed the order, including salutation, first name, last name, email, company, VAT ID, and address. - `isThirdPartyPurchase` (boolean): Indicates if the purchase was made by a third party. - `price` (object): The pricing details including gross price, net price, tax, and currency. - `status` (string): The status of the order. - `event` (object): Details of the event associated with the order, including id, name, year, icon, logo, isActive, slug, and dateTimeSpan. - `shipping` (object): Details of the shipping including shipped to, shipped at, and type. - `payment` (object): Details of the payment including provider name, status, and settled at. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | event | {{EVENT}} | The event slug | ##### Response example: (200 OK) ```json { "data": [ { "id": "65421ae7-2c3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512481", "orderedAt": "2025-05-26T14:28:25.637", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Pending", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": { "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:62a6ca62-05e6-ee11-93d5-00155d96040a&language=de&v=3e4bef49e5c48c01a8e63eeeb09be951302a963cfbe3c9c7e1ff9b167fb134a6", "type": "Icon", "background": "Light" }, "logo": { "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:62a6ca62-05e6-ee11-93d5-00155d96040a&language=de&v=3e4bef49e5c48c01a8e63eeeb09be951302a963cfbe3c9c7e1ff9b167fb134a6", "type": "Logo", "background": "Light" }, "isActive": true, "slug": "dvo25", "dateTimeSpan": { "start": "2025-11-10T09:15:00+01:00", "end": "2025-11-15T17:15:00+01:00" } }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:28:25.6353751", "type": "Email" }, "payment": { "providerName": "PayPal", "status": "Reserved", "settledAt": "2025-05-26T14:29:03.2216148+02:00" } }, { "id": "fbe19036-2f3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512482", "orderedAt": "2025-05-26T14:44:53.91", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Completed", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": { "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:62a6ca62-05e6-ee11-93d5-00155d96040a&language=de&v=3e4bef49e5c48c01a8e63eeeb09be951302a963cfbe3c9c7e1ff9b167fb134a6", "type": "Icon", "background": "Light" }, "logo": { "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:62a6ca62-05e6-ee11-93d5-00155d96040a&language=de&v=3e4bef49e5c48c01a8e63eeeb09be951302a963cfbe3c9c7e1ff9b167fb134a6", "type": "Logo", "background": "Light" }, "isActive": true, "slug": "dvo25", "dateTimeSpan": { "start": "2025-11-10T09:15:00+01:00", "end": "2025-11-15T17:15:00+01:00" } }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:44:53.9099038", "type": "Email" }, "payment": { "providerName": "Invoice", "status": "Reserved", "settledAt": "2025-05-26T14:47:58.3103561+02:00" } } ] } ``` #### GET Get order details - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-order-details This endpoint retrieves the details of a specific order associated with a user. ##### Request - `userId` (path) : The unique identifier of the user. - `orderId` (path) : The identifier of the order. ##### Response - `items` (array) : The list of items included in the order - `receipts` (array) : The receipts of the order - `legitimations`(array) : The legitimations of the order - `payment` (object): information concerning the payment - `isRegistrationOnly` (boolean) - `canChangeRegistrationData` (boolean) - `isVerifiedOrder` (boolean) - `id` (string) : The unique identifier of the order. - `number` (string) - `orderedAt` (string) : The date and time of the order - `orderedBy`(object) : Details of the user associated with the order, including userId, verificationStatus, and email - `isThirdPartyPurchase` (boolean) - `price` (object) - `status` (string) - `event` (object) - `shipping` (object) ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "items": [ { "id": "0033cd72-0000-0000-0000-000000000000", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Dayticket\r\n", "internalName": "Tagesticket", "description": null, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "sort": 0, "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=en&foregroundColor=%2301918F", "type": "Icon" } }, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "promotionCodes": [], "links": [ { "mediaType": "PrintAtHomeTicket", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGRm/" }, { "mediaType": "WalletTicket", "linkType": "Passbook", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGtwYXNz/" }, { "mediaType": "WalletTicket", "linkType": "GoogleWallet", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9Z29vZ2xld2FsbGV0/" } ], "owner": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df" }, "status": "Registered", "timeslots": [], "ticket": { "barcode": "1596595170008769", "type": "VisitorTicket" } } ], "receipts": [ { "type": "Bill", "number": "1596-2025-1596507581", "createdAt": "2025-05-26T14:47:59.7293336+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/Receipts/11280?S=r3ayZPAuDi4nQ" } ], "legitimations": [], "payment": { "providerName": "Invoice", "status": "Reserved", "settledAt": "2025-05-26T14:47:58.3103561+02:00" }, "isRegistrationOnly": true, "canChangeRegistrationData": true, "isVerifiedOrder": true, "id": "fbe19036-2f3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512482", "orderedAt": "2025-05-26T14:44:53.91", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Completed", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": null, "logo": null, "isActive": false, "slug": "dvo25", "dateTimeSpan": null }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:44:53.9099038", "type": "Email" } } } ``` #### GET Get exhibitor recommendations - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations This endpoint retrieves exhibitor recommendations for a specific order associated with a user. It allows you to get tailored suggestions based on the order details. ##### Request - `userId` (path) : The unique identifier of the user whose order recommendations are being requested. - `orderId` (path) : The identifier of the order for which recommendations are sought. - `amount` (query) : The number of recommendations to return (e.g., `amount=3`). If the amount is not provided, the default value 10 will be used. ##### Response The response will contain a JSON object structured as follows: - `data` (object) : Contains the recommendations data. - `recommendations` (array) : A list of recommended exhibitors, where each recommendation includes: - `id` (string) : The unique identifier of the recommendation. - `title` (string) : The title of the recommendation. - `description` (string) : A brief description of the recommendation. - `link` (string) : A URL link to more information about the recommendation. - `logoLink` (string) : A URL link to the logo associated with the recommendation. - `badges` (array) : A list of badges associated with the recommendation, where each badge includes: - `color` (string|null) : The color of the badge. - `id` (string) : The unique identifier of the badge. - `text` (string) : The text displayed on the badge. - `categories` (array) : A list of categories associated with the recommendation, where each category includes: - `id` (string) : The unique identifier of the category. - `text` (string) : The text description of the category. ##### Additional Notes - Ensure that the `userId` and `orderId` are valid to receive accurate recommendations. - The `amount` parameter can be adjusted to control the number of recommendations returned. If the amount is not provided, the default value 10 will be used. ##### Request - `userId` (path) : The unique identifier of the user whose order is being queried. - `orderId` (path) : The identifier of the specific order for which recommendations are requested. - `amount` (query) : The number of exhibitor recommendations to retrieve (default is 10). ##### Response - `data` (object): Contains the recommendations data. - `recommendations` (array): A list of recommended exhibitors based on the order. - `id` (string): The unique identifier of the recommendation. - `title` (string): The title of the recommended exhibitor. - `description` (string): A brief description of the recommended exhibitor. - `link` (string): A URL link to the recommended exhibitor's page. - `logoLink` (string): A URL link to the logo of the recommended exhibitor. - `badges` (array): A list of badges associated with the recommendation. - `color` (string|null): The color of the badge. - `id` (string): The unique identifier of the badge. - `text` (string): The text displayed on the badge. - `categories` (array): A list of categories associated with the recommendation. - `id` (string): The unique identifier of the category. - `text` (string): The name of the category. **Note:** The response structure may vary, and additional fields may be included based on the specific recommendations provided. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | amount | 3 | | ##### Response example: (200 OK) ```json { "data": { "items": [ { "id": "0033cd72-0000-0000-0000-000000000000", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Dayticket\r\n", "internalName": "Tagesticket", "description": null, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "sort": 0, "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=en&foregroundColor=%2301918F", "type": "Icon" } }, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "promotionCodes": [], "links": [ { "mediaType": "PrintAtHomeTicket", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGRm/" }, { "mediaType": "WalletTicket", "linkType": "Passbook", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGtwYXNz/" }, { "mediaType": "WalletTicket", "linkType": "GoogleWallet", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9Z29vZ2xld2FsbGV0/" } ], "owner": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df" }, "status": "Registered", "timeslots": [], "ticket": { "barcode": "1596595170008769", "type": "VisitorTicket" } } ], "receipts": [ { "type": "Bill", "number": "1596-2025-1596507581", "createdAt": "2025-05-26T14:47:59.7293336+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/Receipts/11280?S=r3ayZPAuDi4nQ" } ], "legitimations": [], "payment": { "providerName": "Invoice", "status": "Reserved", "settledAt": "2025-05-26T14:47:58.3103561+02:00" }, "isRegistrationOnly": true, "canChangeRegistrationData": true, "isVerifiedOrder": true, "id": "fbe19036-2f3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512482", "orderedAt": "2025-05-26T14:44:53.91", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Completed", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": null, "logo": null, "isActive": false, "slug": "dvo25", "dateTimeSpan": null }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:44:53.9099038", "type": "Email" } } } ``` #### GET Get exhibitor recommendations tracking - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking This endpoint retrieves exhibitor recommendations for a specific order associated with a user. It allows you to get tailored suggestions based on the order details. ##### Request - `userId` (path) : The unique identifier of the user whose order recommendations are being requested. - `orderId` (path) : The identifier of the order for which recommendations are sought. - `amount` (query) : The number of recommendations to return (e.g., `amount=3`). If the amount is not provided, the default value 10 will be used. ##### Response The response will contain a JSON object structured as follows: - `data` (object) : Contains the recommendations data. - `recommendations` (array) : A list of recommended exhibitors, where each recommendation includes: - `id` (string) : The unique identifier of the recommendation. - `title` (string) : The title of the recommendation. - `description` (string) : A brief description of the recommendation. - `link` (string) : A URL link to more information about the recommendation. - `logoLink` (string) : A URL link to the logo associated with the recommendation. - `badges` (array) : A list of badges associated with the recommendation, where each badge includes: - `color` (string|null) : The color of the badge. - `id` (string) : The unique identifier of the badge. - `text` (string) : The text displayed on the badge. - `categories` (array) : A list of categories associated with the recommendation, where each category includes: - `id` (string) : The unique identifier of the category. - `text` (string) : The text description of the category. ##### Additional Notes - Ensure that the `userId` and `orderId` are valid to receive accurate recommendations. - The `amount` parameter can be adjusted to control the number of recommendations returned. If the amount is not provided, the default value 10 will be used. ##### Request - `userId` (path) : The unique identifier of the user whose order is being queried. - `orderId` (path) : The identifier of the specific order for which recommendations are requested. - `amount` (query) : The number of exhibitor recommendations to retrieve (default is 10). ##### Response - `data` (object): Contains the recommendations data. - `recommendations` (array): A list of recommended exhibitors based on the order. - `id` (string): The unique identifier of the recommendation. - `title` (string): The title of the recommended exhibitor. - `description` (string): A brief description of the recommended exhibitor. - `link` (string): A URL link to the recommended exhibitor's page. - `logoLink` (string): A URL link to the logo of the recommended exhibitor. - `badges` (array): A list of badges associated with the recommendation. - `color` (string|null): The color of the badge. - `id` (string): The unique identifier of the badge. - `text` (string): The text displayed on the badge. - `categories` (array): A list of categories associated with the recommendation. - `id` (string): The unique identifier of the category. - `text` (string): The name of the category. **Note:** The response structure may vary, and additional fields may be included based on the specific recommendations provided. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | amount | 3 | | ##### Response example: Get exhibitor recommendations (200 OK) ```json { "data": { "items": [ { "id": "0033cd72-0000-0000-0000-000000000000", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Dayticket\r\n", "internalName": "Tagesticket", "description": null, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "sort": 0, "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=en&foregroundColor=%2301918F", "type": "Icon" } }, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "promotionCodes": [], "links": [ { "mediaType": "PrintAtHomeTicket", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGRm/" }, { "mediaType": "WalletTicket", "linkType": "Passbook", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGtwYXNz/" }, { "mediaType": "WalletTicket", "linkType": "GoogleWallet", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9Z29vZ2xld2FsbGV0/" } ], "owner": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df" }, "status": "Registered", "timeslots": [], "ticket": { "barcode": "1596595170008769", "type": "VisitorTicket" } } ], "receipts": [ { "type": "Bill", "number": "1596-2025-1596507581", "createdAt": "2025-05-26T14:47:59.7293336+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/Receipts/11280?S=r3ayZPAuDi4nQ" } ], "legitimations": [], "payment": { "providerName": "Invoice", "status": "Reserved", "settledAt": "2025-05-26T14:47:58.3103561+02:00" }, "isRegistrationOnly": true, "canChangeRegistrationData": true, "isVerifiedOrder": true, "id": "fbe19036-2f3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512482", "orderedAt": "2025-05-26T14:44:53.91", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Completed", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": null, "logo": null, "isActive": false, "slug": "dvo25", "dateTimeSpan": null }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:44:53.9099038", "type": "Email" } } } ``` #### GET Get exhibitor recommendations tracking click - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:userId/orders/:orderId/exhibitor-recommendations?amount=3` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-exhibitor-recommendations-tracking-click This endpoint retrieves exhibitor recommendations for a specific order associated with a user. It allows you to get tailored suggestions based on the order details. ##### Request - `userId` (path) : The unique identifier of the user whose order recommendations are being requested. - `orderId` (path) : The identifier of the order for which recommendations are sought. - `amount` (query) : The number of recommendations to return (e.g., `amount=3`). If the amount is not provided, the default value 10 will be used. ##### Response The response will contain a JSON object structured as follows: - `data` (object) : Contains the recommendations data. - `recommendations` (array) : A list of recommended exhibitors, where each recommendation includes: - `id` (string) : The unique identifier of the recommendation. - `title` (string) : The title of the recommendation. - `description` (string) : A brief description of the recommendation. - `link` (string) : A URL link to more information about the recommendation. - `logoLink` (string) : A URL link to the logo associated with the recommendation. - `badges` (array) : A list of badges associated with the recommendation, where each badge includes: - `color` (string|null) : The color of the badge. - `id` (string) : The unique identifier of the badge. - `text` (string) : The text displayed on the badge. - `categories` (array) : A list of categories associated with the recommendation, where each category includes: - `id` (string) : The unique identifier of the category. - `text` (string) : The text description of the category. ##### Additional Notes - Ensure that the `userId` and `orderId` are valid to receive accurate recommendations. - The `amount` parameter can be adjusted to control the number of recommendations returned. If the amount is not provided, the default value 10 will be used. ##### Request - `userId` (path) : The unique identifier of the user whose order is being queried. - `orderId` (path) : The identifier of the specific order for which recommendations are requested. - `amount` (query) : The number of exhibitor recommendations to retrieve (default is 10). ##### Response - `data` (object): Contains the recommendations data. - `recommendations` (array): A list of recommended exhibitors based on the order. - `id` (string): The unique identifier of the recommendation. - `title` (string): The title of the recommended exhibitor. - `description` (string): A brief description of the recommended exhibitor. - `link` (string): A URL link to the recommended exhibitor's page. - `logoLink` (string): A URL link to the logo of the recommended exhibitor. - `badges` (array): A list of badges associated with the recommendation. - `color` (string|null): The color of the badge. - `id` (string): The unique identifier of the badge. - `text` (string): The text displayed on the badge. - `categories` (array): A list of categories associated with the recommendation. - `id` (string): The unique identifier of the category. - `text` (string): The name of the category. **Note:** The response structure may vary, and additional fields may be included based on the specific recommendations provided. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | amount | 3 | | ##### Response example: Get exhibitor recommendations (200 OK) ```json { "data": { "items": [ { "id": "0033cd72-0000-0000-0000-000000000000", "article": { "id": "0748be08-06e6-ee11-93d5-00155d96040a", "name": "Dayticket\r\n", "internalName": "Tagesticket", "description": null, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "951", "category": "VISITOR", "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "sort": 0, "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0748be08-06e6-ee11-93d5-00155d96040a&language=en&foregroundColor=%2301918F", "type": "Icon" } }, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "promotionCodes": [], "links": [ { "mediaType": "PrintAtHomeTicket", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGRm/" }, { "mediaType": "WalletTicket", "linkType": "Passbook", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9cGtwYXNz/" }, { "mediaType": "WalletTicket", "linkType": "GoogleWallet", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/P3Q9MTU5NjU5NTE3MDAwODc2OSZzaD0yWTNtM1QmY3Q9Z29vZ2xld2FsbGV0/" } ], "owner": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df" }, "status": "Registered", "timeslots": [], "ticket": { "barcode": "1596595170008769", "type": "VisitorTicket" } } ], "receipts": [ { "type": "Bill", "number": "1596-2025-1596507581", "createdAt": "2025-05-26T14:47:59.7293336+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_TTS/Receipts/11280?S=r3ayZPAuDi4nQ" } ], "legitimations": [], "payment": { "providerName": "Invoice", "status": "Reserved", "settledAt": "2025-05-26T14:47:58.3103561+02:00" }, "isRegistrationOnly": true, "canChangeRegistrationData": true, "isVerifiedOrder": true, "id": "fbe19036-2f3a-f011-93e1-00155d96040a", "number": "1596-2025-1596512482", "orderedAt": "2025-05-26T14:44:53.91", "orderedBy": { "salutation": "Frau", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "company": "ADITUS GMBH", "vatId": "1234567890", "address": { "street": "Irmgardstraße", "houseNumber": "1", "postalCode": "44212", "city": "Bauerndorf", "county": null, "country": "DE" } }, "isThirdPartyPurchase": false, "price": { "grossPrice": 33, "netPrice": 27.73, "tax": 5.27, "currency": "EUR" }, "status": "Completed", "event": { "id": "62a6ca62-05e6-ee11-93d5-00155d96040a", "name": "DVO Con", "year": "2025", "icon": null, "logo": null, "isActive": false, "slug": "dvo25", "dateTimeSpan": null }, "shipping": { "shippedTo": "wretziluwetdhfh@gfds.df", "shippedAt": "2025-05-26T14:44:53.9099038", "type": "Email" } } } ``` #### GET Get cart from order - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/orders/:order/cart` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/get-cart-from-order This endpoint does notrequire a request body. ##### Request No specific request parameters are mentioned. ##### Response - `id` (string): The ID of the cart. - `expiryTime` (string): The expiration time of the cart. - `user` (object): Details of the user associated with the cart, including ID, verification status, and email. - `event` (object): Details of the event associated with the cart, including ID, name, year, number, and slug. - `promotionCodes` (array): An array of promotion codes associated with the cart. - `items` (array): An array of items in the cart, each containing details such as ID, order ID, article details, promotion codes, voucher code, price, registration data, legitimation details, timeslots, etc. - `totals` (array): An array containing the original and actual total prices of the cart. - `isImmutable` (boolean): Indicates if the cart is immutable. - `isPaymentImmutable` (boolean): Indicates if the payment for the cart is immutable. - `isLegitimationImmutable` (boolean): Indicates if the legitimation for the cart is immutable. - `isRegistrationImmutable` (boolean): Indicates if the registration for the cart is immutable. - `isAmountImmutable` (boolean): Indicates if the amount for the cart is immutable. - `isRegistrationOnly` (boolean): Indicates if the cart allows only registration without payment. - `isRegistrationRequired` (boolean): Indicates if registration is required for the cart. - `isLegitimationRequired` (boolean): Indicates if legitimation is required for the cart. - `isPaymentRequired` (boolean): Indicates if payment is required for the cart. - `paymentProvider` (object): Details of the payment provider associated with the cart, including expiration, redirect URL, transaction token, payment methods, configuration, etc. - `buyerPerson` (object): Details of the buyer associated with the cart, including email, first name, last name, company, salutation, VAT ID, address, survey ID, and validity status. - `order` (object): Details of the order associated with the cart, including ID, order date, and order number. - `status` (string): The status of the cart. - `culture` (string): The culture associated with the cart. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) ```json { "data": { "id": "cbf99521-445d-45d7-84b6-98ac2bab7876", "expiryTime": "2025-12-31T18:00:00+01:00", "user": { "id": "6fb0849c-1b89-ee11-93cf-00155d960409", "isVerified": true, "eMail": "a.example1@aditus.de" }, "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "number": "01", "slug": "ed24" }, "promotionCodes": [], "items": [ { "id": "002dbf8a-0000-0000-0000-000000000000", "orderId": "29a7098c-bb3f-f011-93e1-00155d96040a", "article": { "id": "0736920e-4b90-ee11-93cf-00155d960409", "name": "Dayticket", "internalName": "Day Pass", "description": "The day ticket entitles you to a single visit to the Experience Days on any event day.", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:0736920e-4b90-ee11-93cf-00155d960409&language=en&foregroundColor=%2300A4CC", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "01", "category": "VISITOR", "legitimationCategory": null, "configuration": { "showRemainingAmount": false, "showRemainingAmountPerTimeslot": false, "showIfSoldOut": false, "soldOutText": null, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 3, "minNumberOfTicketsPerSale": null, "isInvitationEmailAddressChangePossible": false }, "articleGroup": { "id": "42d6086d-c583-ee11-b2f8-00155d960308", "name": "Trade fair tickets", "sort": 0, "configuration": { "maxNumberOfTicketsPerSale": null, "isExclusiveAssortment": false } } }, "promotionCodes": [], "voucherCode": null, "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "thirdPerson", "referencedSurveyResponse": null, "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Divers" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Sabine" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Lawine" }, { "isReadOnly": false, "bindingMember": "EMail", "value": "a.example1+1@aditus.de" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" } ], "hasInformation": true }, "isValid": true, "problems": [], "isRequired": false, "isPossible": false, "types": { "self": { "isPossible": false, "survey": null, "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": false, "survey": null, "hasToBeCompletedByTicketOwnerHimself": true } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### POST Resend confirmation email - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/orders/:order/confirmation/resend` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-confirmation-email This endpoint is used to resend the confirmation for a specific order to a user. ##### Request - `user` (URL parameter): The ID of the user for whom the order confirmation is to be resent. - `order` (URL parameter): The ID of the order for which the confirmation is to be resent. ##### Response The response does not include a response body. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | ##### Response example: (200 OK) _Empty body._ #### POST Resend registration reminder email - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/orders/:order/registration-reminder/resend` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/orders/resend-registration-reminder-email This endpoint is used to resend registration reminders for a specific order belonging to a user. ##### Request - `id` (string): The ID of the item to resend the registration reminder for. ##### Response The response does not include a body. ##### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | DE | | ##### Request body example ```json { "id": "{{ITEM_ID}}" } ``` ##### Response example: (200 OK) _Empty body._ ### Profile Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/profile #### GET Get profile - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/profile` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile This endpoint retrieves the profile information of a specific user. ##### Request - `user` (path) - The unique identifier of the user. ##### Response - `userId` (string) - The unique identifier of the user. - `profile` (object) - The profile information of the user, which includes the following fields: - `id` (string) - The identifier of the profile. - `salutation` (string) - The salutation of the user. - `firstName` (string) - The first name of the user. - `lastName` (string) - The last name of the user. - `email` (string) - The email address of the user. - `company` (string) - The company of the user. - `title` (string) - The title of the user. - `website` (string) - The website of the user. - `phone` (string) - The phone number of the user. - `mobile` (string) - The mobile number of the user. - `fax` (string) - The fax number of the user. - `vatId` (string) - The VAT ID of the user. - `address` (object) - The address information of the user, including: - `street` (string) - The street of the address. - `houseNumber` (string) - The house number of the address. - `postalCode` (string) - The postal code of the address. - `city` (string) - The city of the address. - `county` (string) - The county of the address. - `country` (string) - The country of the address. - `notificationPreferences` (object) - The notification preferences of the user, including: - `email` (boolean) - Indicates if email notification is enabled. - `phone` (boolean) - Indicates if phone notification is enabled. - `postMail` (boolean) - Indicates if postal mail notification is enabled. ##### Response example: (200 OK) ```json { "data": { "userId": "00000000-0000-0000-0000-000000000000", "profile": { "id": "00000000-0000-0000-0000-000000000001", "salutation": "Frau", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus.de", "company": "Musterfirma", "title": null, "website": null, "phone": null, "mobile": "+358-18 1234567", "fax": null, "vatId": "0010", "address": { "street": "Examplestreet 1", "houseNumber": "1", "postalCode": "44212", "city": "Riyadh", "county": null, "country": "SA" }, "notificationPreferences": { "email": false, "phone": false, "postMail": false } } } } ``` #### POST Update profile - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/profile` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/update-profile This endpoint allows the user to update their profile information. ##### Request - `user`(string): The user ID ##### Request Body - `salutation` (string): The salutation of the user. - `firstName` (string): The first name of the user. - `lastName` (string): The last name of the user. - `email` (string): The email address of the user. - `company` (string): The company name of the user. - `website` (string): The website URL of the user's company. - `phone` (string): The phone number of the user. - `mobile` (string): The mobile number of the user. - `fax` (string): The fax number of the user. - `vatId` (string): The VAT identification number of the user. - `address` (object): An object containing the address details of the user. - `street` (string): The street name of the user's address. - `houseNumber` (string): The house number of the user's address. - `postalCode` (string): The postal code of the user's address. - `city` (string): The city of the user's address. - `county` (string): The county of the user's address. - `country` (string): The country of the user's address. - `notificationPreferences` (object): An object containing the notification preferences of the user. - `email` (boolean): Indicates if email notifications are enabled (true/false). - `phone` (boolean): Indicates if phone notifications are enabled (true/false). - `postMail` (boolean): Indicates if postal mail notifications are enabled (true/false). ##### Response - `data` (object): An object containing the response data. - `userId` (string): The user ID. - `profile` (object): An object containing the user's profile information. - `id` (string): The profile ID. - `salutation` (string): The salutation of the user. - `firstName` (string): The first name of the user. - `lastName` (string): The last name of the user. - `email` (string): The email address of the user. - `company` (string): The company name of the user. - `title` (null): The title of the user. - `website` (string): The website URL of the user's company. - `phone` (string): The phone number of the user. - `mobile` (string): The mobile number of the user. - `fax` (string): The fax number of the user. - `vatId` (string): The VAT identification number of the user. - `address` (object): An object containing the address details of the user. - `street` (string): The street name of the user's address. - `houseNumber` (string): The house number of the user's address. - `postalCode` (string): The postal code of the user's address. - `city` (string): The city of the user's address. - `county` (string): The county of the user's address. - `country` (string): The country of the user's address. - `notificationPreferences` (object): An object containing the notification preferences of the user. - `email` (boolean): Indicates if email notifications are enabled (true/false). - `phone` (boolean): Indicates if phone notifications are enabled (true/false). - `postMail` (boolean): Indicates if postal mail notifications are enabled (true/false) ##### Request body example ```json { "salutation": "Herr", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus.de", "company": "ADITUS GmbH", "website": "aditus.de", "phone": "1234567890", "mobile": "1234567890", "fax": "1234567890", "vatId": "1234567890", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "DE" }, "notificationPreferences": { "email": true, "phone": false, "postMail": false } } ``` ##### Response example: (200 OK) ```json { "data": { "userId": "00000000-0000-0000-0000-000000000000", "profile": { "id": "00000000-0000-0000-0000-000000000001", "salutation": "Herr", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus.de", "company": "ADITUS GmbH", "title": null, "website": "aditus.de", "phone": "1234567890", "mobile": "1234567890", "fax": "1234567890", "vatId": "1234567890", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "DE" }, "notificationPreferences": { "email": true, "phone": false, "postMail": false } } } } ``` #### GET Get profile picture - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/profile/picture` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/get-profile-picture This endpoint retrieves the profile picture of a specific user. ##### Request - `user` (string): The user ID ##### Response _(It is not possible to save media type responses as examples in this documentation.)_ #### POST Set profile picture - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/profile/picture` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/profile/set-profile-picture This endpoint allows the user to update their profile picture. ##### Request - `user` (string): The user ID ##### Request Body - `file` (file): The image file to be uploaded. ##### Response The response does not include a body. ##### Response example: (200 OK) _Empty body._ ### Legitimations Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations #### GET Get legitimations - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/legitimations` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimations This endpoint retrieves the legitimations associated with a specific user's account. ##### Request - `user` (path parameter) - The user ID for which the legitimations are being retrieved. ##### Response - `data` (array): An array containing the legitimations associated with the user. - `id`: The ID of the legitimations. - `number`: The number associated with the legitimations. - `category` (object): The category details of the legitimations. - `id`: The ID of the category. - `name`: The name of the category. - `requiredVerifications`: The number of required verifications for the category. - `proofs` (array): An array containing proofs related to the legitimations. - `id`: The ID of the proof. - `type` (object): The type details of the proof. - `id`: The ID of the type. - `name`: The name of the type. - `documentType`: The type of document. - `value`: The value of the proof. - `status`: The status of the proof. - `status`: The status of the legitimations. - `person` (object): Details of the person associated with the legitimations. - `id`: The ID of the person. - `firstName`: The first name of the person. - `lastName`: The last name of the person. - `email`: The email of the person. - `spokenLanguage`: The spoken language of the person. - `createdOn`: The date and time when the legitimations were created. - `event` (object): Details of the event associated with the legitimations. - `id`: The ID of the event. - `name`: The name of the event. - `year`: The year of the event. - `icon` (object): Details of the icon associated with the event. - `key`: The key of the icon. - `uri`: The URI of the icon. - `type`: The type of the icon. - `background`: The background of the icon. - `logo` (object): Details of the logo associated with the event. - `key`: The key of the logo. - `uri`: The URI of the logo. - `type`: The type of the logo. - `background`: The background of the logo. - `isActive`: Indicates if the event is active. - `slug`: The slug of the event. - `dateTimeSpan` (object): Details of the date and time span of the event. - `start`: The start date and time of the event. - `end`: The end date and time of the event. The response may also include an empty array if no legitimations are found for the specified user. ##### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | event | {{EVENT}} | The event slug (optional) | ##### Response example: (200 OK) ```json { "data": [ { "id": "f5d66bd7-9a3e-ef11-93d8-00155d96040a", "number": "L00000458", "category": { "id": "c1ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "VIP", "requiredVerifications": 2 }, "proofs": [ { "id": "45e05f48-fb44-ef11-93d8-00155d96040a", "type": { "id": "b5ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "Impressum" }, "documentType": "Url", "value": "LegitimationProof:d58c8afb-09f0-4ddb-a82e-4606fb212e41", "status": "Accepted" } ], "status": "Accepted", "person": { "id": "7cc7c25e-ef89-ee11-93cf-00155d960409", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "spokenLanguage": "" }, "createdOn": "2024-07-10T11:00:25.0308479", "event": { "id": "f2e25737-4990-ee11-93cf-00155d960409", "name": "Erlebnistage", "year": "2024", "icon": { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=de&v=c59fdd0f40d98e8e328527cbf5155782fa94af2667ea68a037731fbfbd58a7ad", "type": "Icon", "background": "Light" }, "logo": { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=de&v=09f9c3b392f48d10a14cf99420169c897599a88c4d4f2b0b37eb93e83c750a63", "type": "Icon", "background": "Light" }, "isActive": false, "slug": "ed24", "dateTimeSpan": { "start": "2025-05-21T08:00:00+02:00", "end": "2025-12-31T18:00:00+01:00" } } } ] } ``` #### GET Get legitimation - Endpoint: `GET {{API_BASE_URL}}/shop/v1/user/:user/legitimations/:legitimation` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/legitimations/get-legitimation This API endpoint retrieves the legitimation details for a specific user. ##### Request - `user` (string): The user ID - `legitimation` (string): The legitimation ID ##### Response - `id` (string): The ID of the legitimation. - `number` (string): The legitimation number. - `category` (object): Details of the legitimation category including ID, name, and required verifications. - `id` (string): The ID of the category. - `name` (string): The name of the category. - `requiredVerifications` (number): The number of required verifications for the category. - `proofs` (array): An array of proof objects. - `id` (string): The ID of the proof. - `type` (object): Details of the proof type including ID and name. - `id` (string): The ID of the type. - `name` (string): The name of the type. - `documentType` (string): The type of document. - `value` (string): The value of the proof. - `status` (string): The status of the proof. - `metadata` (object, optional): Additional metadata for the proof including MIME type and file name. - `mimeType` (string): The MIME type of the file. - `fileName` (string): The name of the file. - `status` (string): The status of the legitimation. - `person` (object): Details of the person associated with the legitimation. - `id` (string): The ID of the person. - `firstName` (string): The first name of the person. - `lastName` (string): The last name of the person. - `email` (string): The email of the person. - `spokenLanguage` (string): The spoken language of the person. - `createdOn` (string): The date and time when the legitimation was created. - `event` (object, optional): Details of the event associated with the legitimation. ##### Response example: (200 OK) ```json { "data": { "id": "f5d66bd7-9a3e-ef11-93d8-00155d96040a", "number": "L00000458", "category": { "id": "c1ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "VIP", "requiredVerifications": 2 }, "proofs": [ { "id": "45e05f48-fb44-ef11-93d8-00155d96040a", "type": { "id": "b5ee75eb-f1e1-ee11-93d5-00155d96040a", "name": "Impressum" }, "documentType": "Url", "value": "LegitimationProof:d58c8afb-09f0-4ddb-a82e-4606fb212e41", "status": "Accepted" } ], "status": "Accepted", "person": { "id": "7cc7c25e-ef89-ee11-93cf-00155d960409", "firstName": "Martina", "lastName": "Musterfrau", "email": "wretziluwetdhfh@gfds.df", "spokenLanguage": "" }, "createdOn": "2024-07-10T11:00:24.9215044", "event": null } } ``` ### POST Unsubscribe from mailing - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/communication-groups/:communicationgroup` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/unsubscribe-from-mailing This endpoint is used to unsubscribe a user from mailing. #### Request - `user` (string): The user ID - `communicationgroup` (string): The ID of the communication group, in this case e-mail #### Response The response does not include a response body. #### Response example: (200 OK) _Empty body._ ### POST Update Terms of Service Status - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:userId/terms-of-service` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/update-terms-of-service-status #### Update User Status This endpoint allows you to update the approval status of a user in the system. It is used to ensure compliance with terms of service. #### Request - **Method**: POST - **URL**: `{{API_BASE_URL}}/shop/v1/user/:userId/terms-of-service` #### Request Body The request body must be in JSON format and should contain the following parameters: - **Items** (Array of Objects): A list of items to be updated. - **UniqueId** (String): The unique identifier of the terms of service item that you want to update. - **IsApproved** (Boolean): A flag indicating whether the item is approved or not. **Example Request Body**: ``` json { "Items": [ { "UniqueId": "55d12ee4-67e8-4bf9-8da9-a459b0...", "IsApproved": true } ] } ``` #### Response Upon a successful request, the API will return a response with the following structure: - **Status**: 200 OK - **Content-Type**: application/vnd.aditus.v1+json - **Response Body**: - **data** (Object): Contains the result of the update operation. - **userId** (String): The ID of the user whose status was updated. - **isSuccess** (Boolean): Indicates whether the update operation was successful. **Example Response**: ``` json { "data": { "userId": "", "isSuccess": true } } ``` #### Notes - Ensure that the `userId` in the URL is replaced with the actual user's ID whose status you wish to update. - The response will confirm whether the operation was successful or not, allowing you to handle subsequent logic accordingly. #### Request body example ```json { "Items": [ { "UniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "IsApproved": true } ] } ``` #### Response example: (200 OK) ```json { "data": { "userId": "6fb0849c-1b89-ee11-93cf-00155d960409", "isSuccess": true } } ``` ### POST Update mailing preferences - Endpoint: `POST {{API_BASE_URL}}/shop/v1/user/:user/mailing-preferences` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/user/update-mailing-preferences This endpoint allows the user to update their profile information. #### Request - `user`(string): The user ID #### Request Body - `salutation` (string): The salutation of the user. - `firstName` (string): The first name of the user. - `lastName` (string): The last name of the user. - `email` (string): The email address of the user. - `company` (string): The company name of the user. - `website` (string): The website URL of the user's company. - `phone` (string): The phone number of the user. - `mobile` (string): The mobile number of the user. - `fax` (string): The fax number of the user. - `vatId` (string): The VAT identification number of the user. - `address` (object): An object containing the address details of the user. - `street` (string): The street name of the user's address. - `houseNumber` (string): The house number of the user's address. - `postalCode` (string): The postal code of the user's address. - `city` (string): The city of the user's address. - `county` (string): The county of the user's address. - `country` (string): The country of the user's address. - `notificationPreferences` (object): An object containing the notification preferences of the user. - `email` (boolean): Indicates if email notifications are enabled (true/false). - `phone` (boolean): Indicates if phone notifications are enabled (true/false). - `postMail` (boolean): Indicates if postal mail notifications are enabled (true/false). #### Response - `data` (object): An object containing the response data. - `userId` (string): The user ID. - `profile` (object): An object containing the user's profile information. - `id` (string): The profile ID. - `salutation` (string): The salutation of the user. - `firstName` (string): The first name of the user. - `lastName` (string): The last name of the user. - `email` (string): The email address of the user. - `company` (string): The company name of the user. - `title` (null): The title of the user. - `website` (string): The website URL of the user's company. - `phone` (string): The phone number of the user. - `mobile` (string): The mobile number of the user. - `fax` (string): The fax number of the user. - `vatId` (string): The VAT identification number of the user. - `address` (object): An object containing the address details of the user. - `street` (string): The street name of the user's address. - `houseNumber` (string): The house number of the user's address. - `postalCode` (string): The postal code of the user's address. - `city` (string): The city of the user's address. - `county` (string): The county of the user's address. - `country` (string): The country of the user's address. - `notificationPreferences` (object): An object containing the notification preferences of the user. - `email` (boolean): Indicates if email notifications are enabled (true/false). - `phone` (boolean): Indicates if phone notifications are enabled (true/false). - `postMail` (boolean): Indicates if postal mail notifications are enabled (true/false) #### Request body example ```json {"page":"Profile","preferences":[{"type":"SystemMail","isSubscribed":true},{"type":"InfoMail","isSubscribed":true},{"type":"MarketingMail","isSubscribed":false}]} ``` #### Response example: Update profile (200 OK) ```json { "data": { "userId": "00000000-0000-0000-0000-000000000000", "profile": { "id": "00000000-0000-0000-0000-000000000001", "salutation": "Herr", "firstName": "Max", "lastName": "Mustermann", "email": "m.mustermann@aditus.de", "company": "ADITUS GmbH", "title": null, "website": "aditus.de", "phone": "1234567890", "mobile": "1234567890", "fax": "1234567890", "vatId": "1234567890", "address": { "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "county": "Niedersachsen", "country": "DE" }, "notificationPreferences": { "email": true, "phone": false, "postMail": false } } } } ``` ## Localization Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/localization The Localization section of the API allows you to easily manage the localization settings for your application. Localization is the process of adapting your application to different languages, regions, and cultures, making it accessible to a global audience. This includes reading language preferences, date and time formats, currency formats, and other regional settings. By leveraging the Localization API, you can enhance the accessibility and usability of your application, allowing users from different parts of the world to interact with your product effectively. In general: Every request should be made with the desired user language by sending the language via the `Accept-Language` attribute of the request header. Typical and supported use cases are: - Get resource data like texts - Get supported system languages ### GET Get resource - Endpoint: `GET {{API_BASE_URL}}/shop/v1/localization?context=event:{{EVENT}}&includeNestedScopes=True&includeUpcoming=True&scope=ShopClient/Page/Home/Events` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-resource This endpoint allows you to retrieve localization data based on the provided scope, key, and context. #### Request - `scope` (string, required): The scope for the localization data. - `key` (string, required): The key for the localization data. - `context` (string, required): The context for the localization data #### Response The response for this request is a JSON schema that represents the structure of the localization data. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | | If-Modified-Since | Fri, 28 Nov 2025 16:51:44 GMT | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | context | event:{{EVENT}} | | | includeNestedScopes | True | | | includeUpcoming | True | | | scope | ShopClient/Page/Home/Events | | | key | LinkToShop | | #### Response example: (200 OK) ```json { "data": [ { "id": 6891, "value": "All", "key": "All", "scope": "Global" } ] } ``` ### GET Get languages - Endpoint: `GET {{API_BASE_URL}}/shop/v1/localization/languages` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-languages This endpoint retrieves the list of supported languages for localization. #### **Request** This request does not require a request body. #### **Response** The response contains an object with the system language and an array of supported languages, each with a name, code, and sort order. #### Response example: (200 OK) ```json { "data": { "systemLanguage": { "name": "Deutsch", "code": "de" }, "languages": [ { "name": "Deutsch", "code": "de", "sort": 0 }, { "name": "English", "code": "en", "sort": 0 } ] } } ``` ### GET Get content - Endpoint: `GET ` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/localization/get-content ## Social Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social The Social section allows to create social cards to share on social media. ### Cards Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/cards Social cards can be shared to show your participation in an upcoming event. #### POST Create social card - Endpoint: `POST {{API_BASE_URL}}/shop/v1/social/cards` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/create-social-card ##### Request body example ```json { "event": "{{EVENT}}", "user": "{{USER_ID}}" } ``` #### GET Get social card - Endpoint: `GET {{API_BASE_URL}}/shop/v1/social/cards/:id` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card This endpoint makes an HTTP GET request to retrieve a social card by its unique identifier. ##### Request - `id` (path) : The unique identifier of the social card. ##### Response Upon a successful request, the response will contain the social card in the form of a image or gif. #### GET Get social card by user and event - Endpoint: `GET {{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-and-event This endpoint retrieves social cards for a specific user and event. ##### Request - **Method**: GET - **Endpoint**: `{{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event` - **Path Parameters**: - `user`: The unique identifier for the user whose social cards are being retrieved. - `event`: The unique identifier for the event associated with the social cards. This endpoint does not require a request body. ##### Response - **Status Code**: 200 - **Content-Type**: image/jpeg - **Response**: The response returns an image representing the social card for the specified user and event. **Notes**: - The response is an image and cannot be saved as an example in the documentation. #### GET Get social card by user, event and article - Endpoint: `GET {{API_BASE_URL}}/shop/v1/social/cards/user/:user/event/:event/article/:articleId` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/cards/get-social-card-by-user-event-and-article This endpoint retrieves social cards for a specific user and event and article, if that article is a member of a social card configuration article group. ##### Request This endpoint does not require a request body. The request URL includes the following parameters: - `user`: The unique identifier for the user whose social cards are being retrieved. - `event`: The unique identifier for the event associated with the social cards. - `articleId`: The unique identifier for the article related to the social cards. ##### Response The response returns an image in JPEG format with a status code of 200. **Note:** It is not possible to save media type responses as examples in this documentation. ### POST Create event - Endpoint: `POST {{API_BASE_URL}}/shop/v1/social/event` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/create-event This endpoint allows the client to create a social event related to a shop. #### Request #### Request Body - `type` (string): Specifies the type of social event, e.g., "AccountCreated". - `eventId` (string): Unique identifier for the event. #### Response - `id` (string): The ID of the social event. #### Request body example ```json { "type": "AccountCreated", "eventId": "{{EVENT_ID}}" } ``` #### Response example: (200 OK) ```json { "data": { "id": "73da63bb-baea-4407-b9e7-4162cf9cfb86" } } ``` ### POST Share on social networks - Endpoint: `POST {{API_BASE_URL}}/shop/v1/social/shares` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/social/share-on-social-networks This endpoint allows the user to create social shares for a specific event. #### Request - `title` (string): The title of the social share. - `text` (string): The text content of the social share. - `image` (string): The image URL for the social share. - `socialNetworks` (array of strings): The social networks where the share will be posted. - `context` (object): Additional context for the social share, including user, event, cart details and source - The `source` can be used for additional statistics, which page or function the share originates from, e.g. `Autopost` is used to identify autoposted shares - `socialCard` (object): Additional information for the social share card. #### Response - `createdShares` (array of objects): An array of created social shares. - `id` (string): The ID of the created share. - `socialNetwork` (string): The social network where the share was posted. - `externalId` (string): The external ID of the share. - `externalUrl` (string): The external URL of the share. - `problems` (array): An array of any problems encountered during the share creation process. #### Request headers | Header | Example value | Description | | --- | --- | --- | | X-LinkedIn-Token | x | | #### Request body example ```json { "title": "Test", "text": "Ich habe mir gerade ein Ticket für die Networking Vision gesichert. Seid ihr auch dabei?\n\nhttps://dev.aditus.de/ADITUS-DEV-0_vNextShop/NetworkingVision2024?sc=32f3ecae-ccd4-ef11-93d9-00155d96040a", "image": "", "socialNetworks": ["linkedin"], "context": { "user": "socialmedia@aditus.de", "event": "{{EVENT}}", "cart": {{CART_ID}}, "socialCard": {{SOCIAL_CARD}}, "previousSocialEvent": null, "source": "Confirmation" } } ``` #### Response example: (200 OK) ```json { "data": { "createdShares": [ { "id": "d80efc22-1558-4146-9e7d-625a137056ef", "socialNetwork": "LinkedIn", "externalId": "urn:li:share:7335315205997932545", "externalUrl": "https://www.linkedin.com/feed/update/urn:li:share:7335315205997932545" } ], "problems": [] } } ``` ## GET Get swagger document - Endpoint: `GET {{API_BASE_URL}}/systems/swagger/shop` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/ticket-purchase-registration/get-swagger-document This endpoint makes a request to retrieve the Swagger documentation for the shop system. ### Request This request does not require a request body. ### Response The response for this request is a JSON schema that includes the Swagger documentation for the shop system. The schema will provide detailed information about the endpoints, request parameters, response formats, and any additional information related to the shop system. ### Response example: (200 OK) ```json { "x-generator": "NSwag v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))", "openapi": "3.0.0", "info": { "title": "ADITUS API", "version": "1.0.0" }, "servers": [ { "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/" } ], "paths": { "/shop/v1/social/event": { "post": { "tags": [ "Social" ], "operationId": "Social_CreateSocialEvent", "requestBody": { "x-name": "request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSocialEventRequestDto" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfCreateSocialEventResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/shares": { "post": { "tags": [ "Social" ], "operationId": "Social_Share", "requestBody": { "x-name": "payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShareRequestDto" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfShareResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/cards": { "post": { "tags": [ "Social" ], "operationId": "Social_CreateSocialCard", "requestBody": { "x-name": "request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSocialCardRequest" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfCreateSocialCardResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/cards/{id}": { "get": { "tags": [ "Social" ], "operationId": "Social_GetSocialCardByIdGET", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "guid" }, "x-position": 1 } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "string", "format": "byte" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] }, "head": { "tags": [ "Social" ], "operationId": "Social_GetSocialCardByIdHEAD", "parameters": [ { "name": "id", "in": "path", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ --- product: ADITUS API module: Byndr direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/byndr.md humanDocumentation: https://developers.aditus.com/docs/byndr endpoints: 9 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Byndr This is the machine-readable Markdown version of the **Byndr** module of the ADITUS API reference (inbound (your systems call ADITUS), 9 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections` | Connect by quicode | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/preview-profile` | Preview profile by quicode | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections?includeMeta=true&sort_by=status desc` | Get connections | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserd/connections/quota/:event` | Get daily quota | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId?event={{EVENT_STUDYDAYS}}` | Get connection | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid` | delete connection | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid/block` | block connection | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId/notes/:event` | edit note | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/systems/swagger/shop` | Get swagger document | OAuth 2.0 bearer token (client credentials) | ## Contents - Byndr — https://developers.aditus.com/docs/byndr - Connections — https://developers.aditus.com/docs/byndr/connections - POST Connect by quicode — https://developers.aditus.com/docs/byndr/connections/connect-by-quicode - POST Preview profile by quicode — https://developers.aditus.com/docs/byndr/connections/preview-profile-by-quicode - GET Get connections — https://developers.aditus.com/docs/byndr/connections/get-connections - GET Get daily quota — https://developers.aditus.com/docs/byndr/connections/get-daily-quota - GET Get connection — https://developers.aditus.com/docs/byndr/connections/get-connection - DELETE delete connection — https://developers.aditus.com/docs/byndr/connections/delete-connection - POST block connection — https://developers.aditus.com/docs/byndr/connections/block-connection - POST edit note — https://developers.aditus.com/docs/byndr/connections/edit-note - GET Get swagger document — https://developers.aditus.com/docs/byndr/get-swagger-document ## Overview **Byndr** is a product API designed to enable seamless, secure connections between event attendees through badge (QR code) scans. It facilitates the creation of **unidirectional, reciprocal relationships** that are reusable across multiple events, allowing for rich interaction tracking and contact personalization. Byndr enables you to: - Build **live contact networks** at events. - Track **interactions over time** and across different events. - Attach **personalized notes and contextual metadata** to individual encounters. ### **Core Concepts** A **Connection** represents a **persistent, unidirectional link** from one attendee (party) to another. Each real-world relationship is stored as two reciprocal entries—one per user—allowing each party to manage their own view (e.g., approve, delete, block). Connections are **status-based** (`Pending`, `Active`, `Blocked`, or `Deleted`) and **not tied to any specific event**. Although connections themselves are event-agnostic, each initial badge scan between two parties creates an **Encounter** associated with the relevant event. This encounter serves as an event-specific record of the interaction. For every such encounter, the system generates accompanying **Metadata** that enriches the interaction context. This metadata may include: - **Notes** left by the initiator - **Scan-specific details** (Each actual scan attempt) Together, encounters and their metadata provide a historical, event-specific layer atop the persistent structure of user connections. ### Naming Conventions The Byndr API uses consistent naming conventions to clearly indicate the direction of connections and interactions between users: - **`initiator`** — Refers to the user who **initiates** the request or action (e.g., sending a connection request or requesting the connection information). This user is the source of the action. - **`target`** — Refers to the user who is the **recipient** or subject of the action (e.g., the one being connected to, or blocked or who's profile data is requested). These prefixes are used throughout the API to make user relationships and actions explicit and easy to follow. ## Connections Human documentation: https://developers.aditus.com/docs/byndr/connections The **Connections** area of the Byndr product API manages relationships between event attendees. When one attendee scans another's badge, a **reciprocal connection** is created between both parties. These connections are persistent, status-driven, and allow each party to independently manage their view of the relationship.EndFragment **Connection States**: - **Pending**: A connection is proposed but awaits approval. (Currently not in use) - **Active**: Both parties have accepted the connection. - **Blocked**: One party has explicitly blocked the other. - **Deleted**: Soft-deleted connection; can be re-established. **Typical Flow**: 1. Attendee scans another badge via QR code. 2. The system authenticates the user and processes the scan. 3. A **reciprocal connection** is created (e.g. Active ↔ Pending). 4. An **Encounter** and optional **Metadata** are recorded. 5. Users can later approve, block, or delete the connection. ### Connection Perspective All connections and their associated statuses are interpreted **from the perspective of the initiator user**. This means that: - The connection status (e.g. _connected_, _pending_, _blocked_) always reflects **how the initiator** views the relationship with the target user. - Actions such as creating, deleting, blocking, or retrieving connections are performed and evaluated **as if seen from the initiator’s side**. This ensures consistency when querying or manipulating connections via the API. ### POST Connect by quicode - Endpoint: `POST {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/connect-by-quicode #### Add Connection This endpoint allows to create a new connection between the initiator and target users, or reconnect the respective users if a connection has been made in the past. #### Request - **Method**: POST - **URL**: `{{API_BASE_URL}}/byndr/v1/users/{{INITIATOR_USER_ID}}/connections` - **Request Body**: The request must include a JSON object with the following parameter: - **quicode** (string): A unique code retrieved by scanning an attandee's badge (QR Code). #### Example Request Body ``` json { "quicode": "AS6JJP8H71K8NP" // or "http://quico.de/AS6JJP8H71K8NP" } ``` #### Response Upon a successful request, the API will return a JSON object containing the following fields: - **data** (object): An object containing the details of the connection. - **status** (string): The status of the connection. - **initiatorUserId** (string): The ID of the user initiating the connection. - **targetUserId** (string): The ID of the user being connected to. - **eventId** (string): An identifier for the event the scanned badge relates to. - **dailyQuota** (object): The daily quota response (see Get Daily Quota endpoint for more details) #### Example Response ``` json { "data": { "status": "", "initiatorUserId": "", "targetUserId": "", "eventId": "" } } ``` #### Notes - Ensure that the `quicode` provided is valid to successfully create a connection. - A new connection can only happen if the daily limit is not reached. For more details see the `get daily quota` documentation #### Request body example ```json { "quicode": "AS6JJP8H71K8NP" } ``` #### Response example: (200 OK) ```json { "data": { "status": "Active", "initiatorUserId": "4c41019d-b02c-4caf-90fc-915cabc3c627", "targetUserId": "e50e1491-4865-4ace-bd9f-22502f152148", "eventId": "studidaysv5", "dailyQuota": { "made": 0, "limit": 50, "left": 50 } } } ``` ### POST Preview profile by quicode - Endpoint: `POST {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/preview-profile` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/preview-profile-by-quicode #### Preview User Profile Connection This endpoint allows you to preview a user's profile connection based on the unique identifier `quicode`. It is particularly useful for retrieving information about a target user's profile before establishing a connection. #### Request - **Method:** POST - **Endpoint:** `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/preview-profile` #### Request Body The request body must be in JSON format and include the following parameter: - **quicode** (string): A unique code representing the target user whose profile is to be previewed. (e.g. a tickets badge QR code) **Example Request Body:** ``` json { "quicode": "AS6JJP8H71K8NP" } ``` #### Response Upon a successful request, the response will return a status code of `200` and will include the following structure in JSON format: - **data**: An object containing: - **initiatorUserId** (string): The ID of the user initiating the request. - **targetUserProfile**: An object containing the target user's profile details: - **id** (string): The unique identifier of the target user. - **salutation** (string): The salutation of the target user. - **firstName** (string): The first name of the target user. - **lastName** (string): The last name of the target user. - **email** (string): The email address of the target user. - **company** (string): The company name of the target user. - **title** (string): The job title of the target user. - **website** (string, nullable): The website of the target user. - **phone** (string, nullable): The phone number of the target user. - **mobile** (string, nullable): The mobile number of the target user. - **fax** (string, nullable): The fax number of the target user. - **vatId** (string, nullable): The VAT ID of the target user. - **address**: An object containing the address details: - **street** (string): The street name. - **houseNumber** (string): The house number. - **postalCode** (string): The postal code. - **city** (string): The city name. - **county** (string): The county name. - **country** (string): The country name. - **notificationPreferences**: An object indicating the user's preferences for notifications: - **email** (boolean): Whether the user prefers to receive notifications via email. - **phone** (boolean): Whether the user prefers to receive notifications via phone. - **postMail** (boolean): Whether the user prefers to receive notifications via post mail. - **event**: An object containing event details related to the user: - **id** (string): The unique identifier of the event. - **name** (string): The name of the event. - **year** (string): The year of the event. - **number** (string): The event number. - **slug** (string): The URL slug for the event. - **description** (string, nullable): A description of the event. **Example Response:** ``` json { "data": { "initiatorUserId": "4c41019d-b02c-4caf-90fc-915cabc3c627", "targetUserProfile": { "id": "34b80661-494b-f011-93e1-00155d96040a", "salutation": "Herr", "firstName": "Professor", "lastName": "Patrick Star", "email": "d.example2+505@aditus.de", "company": "Viacom International Inc.", "title": "Dr.", "website": null, "phone": null, "mobile": null, "fax": null, "vatId": null, "address": { "street": "Conch Street", "houseNumber": "120", "postalCode": "69420", "city": "Bikini Bottom", "county": "003", "country": "DE" }, "notificationPreferences": { "email": false, "phone": false, "postMail": false } }, "event": { "id": "05147d78-28c7-ee11-93d3-00155d96040a", "name": "Studi Days v5", "year": "2024", "number": "2024", "slug": "studidaysv5", "description": null } } } ``` #### Notes - Ensure that the `quicode` provided is valid to receive the corresponding user profile information. - The response will contain null values for any fields that are not applicable or not provided by the target user. #### Request body example ```json { "quicode": "AS6JJP8H71K8NP" } ``` #### Response example: (200 OK) ```json { "data": { "initiatorUserId": "4c41019d-b02c-4caf-90fc-915cabc3c627", "targetUserProfile": { "id": "34b80661-494b-f011-93e1-00155d96040a", "salutation": "Herr", "firstName": "Professor", "lastName": "Patrick Star", "email": "d.example2+505@aditus.de", "company": "Viacom International Inc.", "title": "Dr.", "website": null, "phone": null, "mobile": null, "fax": null, "vatId": null, "address": { "street": "Conch Street", "houseNumber": "120", "postalCode": "69420", "city": "Bikini Bottom", "county": "003", "country": "DE" }, "notificationPreferences": { "email": false, "phone": false, "postMail": false } }, "event": { "id": "05147d78-28c7-ee11-93d3-00155d96040a", "name": "Studi Days v5", "year": "2024", "number": "2024", "slug": "studidaysv5", "description": null } } } ``` ### GET Get connections - Endpoint: `GET {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections?includeMeta=true&sort_by=status desc` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/get-connections #### Get connections This endpoint retrieves a filtered list of all outbound connections initiated by a specified user. It provides metadata about the connected users and the status of each connection. - **Purpose**: To display all individuals a user has connected with, along with relevant metadata, connection statuses and basic user information. #### Input Parameters - **Path Parameters**: - `initiatorUserId`: The unique identifier of the user initiating the request. - **Query Parameters**: - `includeMeta`: A boolean flag to include metadata in the response (set to `true`). - `sort_by`: Specifies the sorting order of the results; in this case, it sorts by `status` in descending order. #### Response Structure The response is a JSON object that contains the following structure: - **data**: - **_meta**: Contains metadata about the response. - **selection**: - **columns**: An array of column objects detailing the properties of the data. - **filters**: An array of filter objects that provide options for filtering the results. - **items**: An array of connection objects, each containing: - `initiatorEmail`: Email of the user who initiated the connection. - `initiatorUniqueId`: Unique identifier for the initiator. - `initiatorFirstName`: First name of the initiator. - `initiatorLastName`: Last name of the initiator. - `status`: Current status of the connection. - `encounter`: Details of the encounter. - `targetEmail`: Email of the connected user. - `targetUniqueId`: Unique identifier for the connected user. - `targetFirstName`: First name of the connected user. - `targetLastName`: Last name of the connected user. - `targetCompany`: Company associated with the connected user. - `fairevents_faireventNumber`: Event number related to the connection. - `fairevents_name`: Name of the event. - `fairevents_year`: Year of the event. - `fairevents_Id`: Identifier for the event. - **pagination**: Contains pagination details. - `page`: Current page number. - `size`: Number of items per page. - `total`: Total number of items available. - `pages`: Total number of pages. This endpoint adheres to our standards for **selections**. #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | excludeData | true | | | includeMeta | true | | | sort_by | status desc | | | size | 50 | | | page | 2 | | | context | event:C4DDB393-4D00-EE11-93C6-00155D960409 | | | filter_by | Status in ('Blocked') | | | format | json | | #### Response example: (200 OK) ```json { "data": { "_meta": { "selection": { "columns": [ { "property": "fairevents_faireventNumber", "name": "FaireventNumber", "displayName": "Veranstaltungsnummer", "sort": 1, "propertyType": "string" }, { "property": "fairevents_name", "name": "Name", "displayName": "Veranstaltungsname", "sort": 2, "propertyType": "string" }, { "property": "fairevents_year", "name": "Year", "displayName": "Jahr", "sort": 3, "propertyType": "string" }, { "property": "initiatorEmail", "name": "InitiatorEmail", "displayName": "Initiator E-Mail", "sort": 4, "propertyType": "string" }, { "property": "initiatorUniqueId", "name": "InitiatorUniqueId", "displayName": "Initiator UID", "sort": 5, "propertyType": "string" }, { "property": "initiatorFirstName", "name": "InitiatorFirstName", "displayName": "Initiator Vorname", "sort": 6, "propertyType": "string" }, { "property": "initiatorLastName", "name": "InitiatorLastName", "displayName": "Initiator Nachname", "sort": 7, "propertyType": "string" }, { "property": "status", "name": "Status", "displayName": "Status", "sort": 8, "propertyType": "enum" }, { "property": "encounter", "name": "Encounter", "displayName": "Begegnung", "sort": 9, "propertyType": "date" }, { "property": "targetEmail", "name": "TargetEmail", "displayName": "Ziel E-Mail", "sort": 10, "propertyType": "string" }, { "property": "targetUniqueId", "name": "TargetUniqueId", "displayName": "Ziel UID", "sort": 11, "propertyType": "string" }, { "property": "targetFirstName", "name": "TargetFirstName", "displayName": "Ziel Vorname", "sort": 12, "propertyType": "string" }, { "property": "targetLastName", "name": "TargetLastName", "displayName": "Ziel Nachname", "sort": 13, "propertyType": "string" }, { "property": "targetCompany", "name": "TargetCompany", "displayName": "Ziel Unternehmen", "sort": 14, "propertyType": "string" } ], "filters": [ { "property": "initiatorFirstName", "propertyType": "string", "displayName": "Initiator Vorname", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "initiatorEmail", "propertyType": "string", "displayName": "Initiator E-Mail", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "initiatorLastName", "propertyType": "string", "displayName": "Initiator Nachname", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "status", "propertyType": "enum", "displayName": "Status", "availableOperators": [ "eq" ], "currentOperator": "eq", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: Get blocked connections (200 OK) ```json { "data": { "_meta": { "selection": { "columns": [ { "property": "fairevents_faireventNumber", "name": "FaireventNumber", "displayName": "Veranstaltungsnummer", "sort": 1, "propertyType": "string" }, { "property": "fairevents_name", "name": "Name", "displayName": "Veranstaltungsname", "sort": 2, "propertyType": "string" }, { "property": "fairevents_year", "name": "Year", "displayName": "Jahr", "sort": 3, "propertyType": "string" }, { "property": "initiatorEmail", "name": "InitiatorEmail", "displayName": "Initiator E-Mail", "sort": 4, "propertyType": "string" }, { "property": "initiatorUniqueId", "name": "InitiatorUniqueId", "displayName": "Initiator UID", "sort": 5, "propertyType": "string" }, { "property": "initiatorFirstName", "name": "InitiatorFirstName", "displayName": "Initiator Vorname", "sort": 6, "propertyType": "string" }, { "property": "initiatorLastName", "name": "InitiatorLastName", "displayName": "Initiator Nachname", "sort": 7, "propertyType": "string" }, { "property": "status", "name": "Status", "displayName": "Status", "sort": 8, "propertyType": "enum" }, { "property": "encounter", "name": "Encounter", "displayName": "Begegnung", "sort": 9, "propertyType": "date" }, { "property": "targetEmail", "name": "TargetEmail", "displayName": "Ziel E-Mail", "sort": 10, "propertyType": "string" }, { "property": "targetUniqueId", "name": "TargetUniqueId", "displayName": "Ziel UID", "sort": 11, "propertyType": "string" }, { "property": "targetFirstName", "name": "TargetFirstName", "displayName": "Ziel Vorname", "sort": 12, "propertyType": "string" }, { "property": "targetLastName", "name": "TargetLastName", "displayName": "Ziel Nachname", "sort": 13, "propertyType": "string" }, { "property": "targetCompany", "name": "TargetCompany", "displayName": "Ziel Unternehmen", "sort": 14, "propertyType": "string" } ], "filters": [ { "property": "initiatorFirstName", "propertyType": "string", "displayName": "Initiator Vorname", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "initiatorEmail", "propertyType": "string", "displayName": "Initiator E-Mail", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "initiatorLastName", "propertyType": "string", "displayName": "Initiator Nachname", "availableOperators": [ "like" ], "currentOperator": "like", "values": [], "isMandatory": false, "isMultiSelect": false }, { "property": "status", "propertyType": "enum", "displayName": "Status", "availableOperators": [ "eq" ], "currentOperator": "eq", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Get daily quota - Endpoint: `GET {{API_BASE_URL}}/byndr/v1/users/:initiatorUserd/connections/quota/:event` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/get-daily-quota #### Get daily quota This endpoint retrieves the daily connection quota for a specific user. It provides information about the number of connections made by the user on the current day, as well as the limit on the number of connections that can be made in a day. #### Request - **Method**: GET - **URL**: `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/quota/:event` #### Path Parameters - `INITIATOR_USER_ID` (string): The unique identifier of the user for whom the daily connection statistics are being requested. - `EVENT` (string): A parameter representing the event for which the quota is being requested. #### Response The response is a JSON object containing the following structure: - **data** (object): An object that holds the connection statistics. - **initiatorUserId** (string): The ID of the user for whom the statistics are reported. - **made** (integer): The number of connections made by the user. - **limit** (integer): The maximum number of connections that the user is allowed to make (Negative amounts represent no limit) - **left** (integer): The number of connections remaining for the user. (Negative amounts represent no limit) #### Example Response ``` json { "data": { "initiatorUserId": "", "made": 0, "limit": 0, "left": 0 } } ``` This endpoint is useful for monitoring user engagement and ensuring that users adhere to connection limits. #### Response example: get daily quota (200 OK) ```json { "data": { "initiatorUserId": "4c41019d-b02c-4caf-90fc-915cabc3c627", "made": 1, "limit": 50, "left": 49 } } ``` ### GET Get connection - Endpoint: `GET {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId?event={{EVENT_STUDYDAYS}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/get-connection #### Get connection This API endpoint retrieves detailed connection data and the target user profile, identified by their respective user IDs. **URL**: `{{API_BASE_URL}}/byndr/v1/users/{{INITIATOR_USER_ID}}/connections/{{TARGET_USER_ID}}?event={{EVENT_STUDYDAYS}}` #### Request Parameters - `initiatorUserId` (Path Parameter): The user ID of the initiator of the connection. - `targetUserId` (Path Parameter): The user ID of the target user whose connection details are being fetched. - `event` (Query Parameter): The specific event for which the connection details are being requested. In this case, it is set to `studidaysv5`. #### Response The response will include the following data structure: - **data**: An object containing: - **initiatorUserId**: The ID of the user who initiated the connection. - **profile**: An object with the target user's profile information, including: - **id**: The user's unique identifier. - **salutation**: The user's salutation. - **firstName**: The user's first name. - **lastName**: The user's last name. - **email**: The user's email address. - **company**: The user's company name. - **title**: The user's job title. - **website**: The user's website (if available). - **phone**: The user's phone number (if available). - **mobile**: The user's mobile number (if available). - **fax**: The user's fax number (if available). - **vatId**: The user's VAT ID (if available). - **address**: An object containing the user's address details: - **street**: The street name. - **houseNumber**: The house number. - **postalCode**: The postal code. - **city**: The city. - **county**: The county. - **country**: The country. - **notificationPreferences**: An object indicating the user's preferences for notifications via email, phone, and post mail. - **encounters**: An array of objects representing encounters related to the connection, each containing: - **eventIdentifier**: An identifier for the event (if applicable). - **timeStamp**: The timestamp of the encounter. - **note**: Any notes associated with the encounter (if applicable). - **status**: The current status of the connection. #### Relevant Notes - Ensure that the user IDs provided in the request are valid and correspond to existing users in the system. - The response may contain null values for fields that are not applicable or not available for the target user. #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | event | {{EVENT_STUDYDAYS}} | | #### Response example: (200 OK) ```json { "data": { "initiatorUserId": "4c41019d-b02c-4caf-90fc-915cabc3c627", "profile": { "id": "34b80661-494b-f011-93e1-00155d96040a", "salutation": "Herr", "firstName": "Professor", "lastName": "Patrick Star", "email": "d.example2+505@aditus.de", "company": "Viacom International Inc.", "title": "Dr.", "website": null, "phone": null, "mobile": null, "fax": null, "vatId": null, "address": { "street": "Conch Street", "houseNumber": "120", "postalCode": "69420", "city": "Bikini Bottom", "county": "003", "country": "DE" }, "notificationPreferences": { "email": false, "phone": false, "postMail": false } }, "encounters": [ { "eventIdentifier": "studidaysv5", "timeStamp": "2025-06-17T14:49:08.948224", "note": "BEST DOCTOR IN ALL OCEANS!!" } ], "status": "Active" } } ``` ### DELETE delete connection - Endpoint: `DELETE {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/delete-connection #### DELETE Connection This endpoint is used to delete a connection between two users in the system. The request targets a specific connection identified by the `initiatorUserId` and `targetUserId`. #### Request Format - **Method**: DELETE - **URL**: `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid` #### Request Body This DELETE request does not require a request body. #### Response Format Upon successful deletion of the connection, the server will return a response indicating the success of the operation. The response typically includes a status code and a message confirming the deletion. #### Expected Response Codes - **204 No Content**: Indicates that the connection was successfully deleted. - **404 Not Found**: Indicates that the specified connection does not exist. Ensure that the user IDs provided in the URL are valid to avoid errors during the request. #### Notes - This API call changes the status on the initiator's connection side. #### Response example: (200 OK) _Empty body._ ### POST block connection - Endpoint: `POST {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserid/block` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/block-connection #### Block User Connection This endpoint allows a user to block another user. The request must specify both the initiator's user ID and the target user's ID. #### Request Parameters - `initiatorUserId` (path parameter): The unique identifier of the user initiating the block action. - `targetUserId` (path parameter): The unique identifier of the user to be blocked. #### Request Body The request body does not require any parameters. #### Expected Response Upon successful execution, the API will return a response indicating the status of the block action. The response will typically include: - A confirmation message indicating that the user has been successfully blocked. - A status code reflecting the outcome of the request (e.g., `200 OK` for success). #### Notes - Ensure that the user IDs provided are valid and exist in the system. - This action cannot be undone through this endpoint; unblocking will require a separate API call. - This API call changes the status on the initiator's connection side. #### Response example: (200 OK) _Empty body._ ### POST edit note - Endpoint: `POST {{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId/notes/:event` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/connections/edit-note #### Add Note to User Connection This endpoint allows you to add a note to a specific connection between two users identified by their user IDs and related to a specific event encounter. The note can contain any relevant information or comments that you wish to associate with the connection. #### Request - **Method:** POST - **URL:** `{{API_BASE_URL}}/byndr/v1/users/:initiatorUserId/connections/:targetUserId/notes/:event` #### Path Parameters - `initiatorUserId` (string): The ID of the user initiating the request. - `targetUserId` (string): The ID of the user to whom the initiator is connected to. - `event` (string): The event type associated with the note. #### Request Body The request body must be in JSON format and should include the following key: - `Note` (string): A textual note that you want to associate with the connection. For example, you might include comments or observations relevant to the connection. Example Request Body: ``` json { "Note": "BEST DOCTOR IN ALL OCEANS!!" } ``` #### Response - **Status Code:** 200 OK - **Content-Type:** text/xml - **Body:** The response body may not contain any additional data, but a successful status indicates that the note was added successfully. #### Request body example ```json { "Note": "BEST DOCTOR IN ALL OCEANS!!" } ``` #### Response example: (200 OK) _Empty body._ ## GET Get swagger document - Endpoint: `GET {{API_BASE_URL}}/systems/swagger/shop` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/byndr/get-swagger-document This endpoint makes a request to retrieve the Swagger documentation for the shop system. ### Request This request does not require a request body. ### Response The response for this request is a JSON schema that includes the Swagger documentation for the shop system. The schema will provide detailed information about the endpoints, request parameters, response formats, and any additional information related to the shop system. ### Response example: (200 OK) ```json { "x-generator": "NSwag v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))", "openapi": "3.0.0", "info": { "title": "ADITUS API", "version": "1.0.0" }, "servers": [ { "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/" } ], "paths": { "/shop/v1/social/event": { "post": { "tags": [ "Social" ], "operationId": "Social_CreateSocialEvent", "requestBody": { "x-name": "request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSocialEventRequestDto" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfCreateSocialEventResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/shares": { "post": { "tags": [ "Social" ], "operationId": "Social_Share", "requestBody": { "x-name": "payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShareRequestDto" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfShareResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/cards": { "post": { "tags": [ "Social" ], "operationId": "Social_CreateSocialCard", "requestBody": { "x-name": "request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSocialCardRequest" } } }, "required": true, "x-position": 1 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfCreateSocialCardResponse" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] } }, "/shop/v1/social/cards/{id}": { "get": { "tags": [ "Social" ], "operationId": "Social_GetSocialCardByIdGET", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "guid" }, "x-position": 1 } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "string", "format": "byte" } } } } }, "security": [ { "ApiAuthorizationSchemaDefinitionAttribute": [ "Shop" ] } ] }, "head": { "tags": [ "Social" ], "operationId": "Social_GetSocialCardByIdHEAD", "parameters": [ { "name": "id", "in": "path", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ --- product: ADITUS API module: Survey direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/survey.md humanDocumentation: https://developers.aditus.com/docs/survey endpoints: 9 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Survey This is the machine-readable Markdown version of the **Survey** module of the ADITUS API reference (inbound (your systems call ADITUS), 9 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | GET | `{{API_BASE_URL}}/survey/v1/surveys/:survey` | Get survey | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/validate` | Validate answers | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses` | Create response | OAuth 2.0 bearer token (client credentials) | | POST | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response/validate` | Validate response | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Get response | OAuth 2.0 bearer token (client credentials) | | PUT | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Update response | OAuth 2.0 bearer token (client credentials) | | DELETE | `{{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` | Delete response | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/survey/v1/lookups/:lookupListName` | Get lookups by name | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/systems/swagger/survey` | Get swagger document | OAuth 2.0 bearer token (client credentials) | ## Contents - Survey — https://developers.aditus.com/docs/survey - Surveys — https://developers.aditus.com/docs/survey/surveys - GET Get survey — https://developers.aditus.com/docs/survey/surveys/get-survey - POST Validate answers — https://developers.aditus.com/docs/survey/surveys/validate-answers - POST Create response — https://developers.aditus.com/docs/survey/surveys/create-response - POST Validate response — https://developers.aditus.com/docs/survey/surveys/validate-response - GET Get response — https://developers.aditus.com/docs/survey/surveys/get-response - PUT Update response — https://developers.aditus.com/docs/survey/surveys/update-response - DELETE Delete response — https://developers.aditus.com/docs/survey/surveys/delete-response - Lookups — https://developers.aditus.com/docs/survey/lookups - GET Get lookups by name — https://developers.aditus.com/docs/survey/lookups/get-lookups-by-name - GET Get swagger document — https://developers.aditus.com/docs/survey/get-swagger-document ## Overview A survey is an instrument for systematic data collection. It consists of a series of questions designed to collect specific information from visitors. Main topics are: - Dynamic form: A survey can be considered a dynamic form because it offers the ability to query varying data. The structure of the form can change depending on the user's answers, making it flexible and customizable. - Questionnaire: The Questionnaire is a collection of questions designed to collect specific information. These questions can be open or closed and have different formats such as multiple choice, open answer, rating scales, etc. - UseCase and Dimensions: Surveys can be created for different use cases, depending on the specific goals of data collection. The dimensions refer to the different aspects or topics covered by the questionnaire. For example, different dimensions of a survey could be customer satisfaction, product preferences, demographic information, etc. Surveys are used in various areas, from market research to customer satisfaction analyzes to scientific studies. They are an effective means of collecting quantitative and qualitative data from a sample of the target audience. The surveys are accessed via the **Survey**\-API: - survey/v1/surveys - survey/v1/lookups ## Surveys Human documentation: https://developers.aditus.com/docs/survey/surveys ### GET Get survey - Endpoint: `GET {{API_BASE_URL}}/survey/v1/surveys/:survey` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/get-survey This endpoint retrieves details of a specific survey identified by its ID. #### Request - `survey` (string): The survey ID #### Response - `id` (string): The ID of the survey. - `name` (string): The name of the survey. - `pages` (array): An array of pages within the survey, each containing: - `id` (string): The ID of the page. - `name` (string): The name of the page. - `sort` (integer): The sorting order of the page. - `lists` (array): An array of lists within the page, each containing: - `id` (string): The ID of the list. - `name` (string): The name of the list. - `description` (string): The description of the list. - `title` (string): The title of the list. - `sort` (integer): The sorting order of the list. - `questions` (array): An array of questions within the list, each containing: - `id` (string): The ID of the question. - `type` (string): The type of the question. - `name` (string): The name of the question. - `label` (string): The label of the question. - `isRequired` (boolean): Indicates if the question is required. - `isReadOnly` (boolean): Indicates if the question is read-only. - `defaultAnswer` (string): The default answer for the question. - `attributes` (array): An array of attributes for the question. - `condition` (object): The condition for the question. - `validators` (array): An array of validators for the question. - `modifiers` (array): An array of modifiers for the question. - `sort` (integer): The sorting order of the question. - `useLookupData` (boolean): Indicates if the question uses lookup data. - `lookupDataName` (string): The name of the lookup data used by the question. - `lookupDataUrl` (string): The URL for the lookup data used by the question. - `styles` (array): An array of styles for the question. - `bindingMember` (string): The binding member for the question. - `styles` (array) #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Response example: (200 OK) ```json { "data": { "id": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "name": "Default-WebShopBuyerData", "pages": [ { "id": "3c352b32-3209-4a1c-8b9b-4bbdf9f5eb09", "name": "DefaultPage", "sort": 1, "lists": [ { "id": "c6595d8a-3a6d-4389-8262-85f463c9ef16", "name": "DefaultList", "description": null, "title": "Personal Data", "sort": 1, "questions": [ { "id": "a02379d0-9d48-48d4-a4a6-056b4beaff09", "type": "LookupDropDown", "name": "SalutationLookup", "label": "Form of address", "informationText": null, "isRequired": false, "isReadOnly": false, "defaultAnswer": null, "attributes": [], "condition": null, "validators": [], "modifiers": [], "sort": 0, "useLookupData": true, "lookupDataName": "P_ANREDEN", "lookupDataUrl": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/survey/v1/lookups/P_ANREDEN", "styles": [], "bindingMember": "SalutationLookup" }, { "id": "bfb9b86b-77fc-492c-9138-246863a4ea61", "type": "TextBox", "name": "FirstName", "label": "First name", "informationText": null, "isRequired": true, "isReadOnly": false, "defaultAnswer": null, "attributes": [], "condition": null, "validators": [], "modifiers": [], "sort": 1, "useLookupData": false, "styles": [], "bindingMember": "FirstName" }, { "id": "a0cf741e-ae2b-4150-8a58-865864530b7d", "type": "TextBox", "name": "LastName", "label": "Last name", "informationText": null, "isRequired": true, "isReadOnly": false, "defaultAnswer": null, "attributes": [], "condition": null, "validators": [], "modifiers": [], "sort": 2, "useLookupData": false, "styles": [], "bindingMember": "LastName" } ], "styles": [] } ] } ] } } ``` ### POST Validate answers - Endpoint: `POST {{API_BASE_URL}}/survey/v1/surveys/:survey/validate` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/validate-answers This endpoint is used to validate the survey answers submitted by the user. #### Request #### Request Body - `answers` (array): An array of objects containing the bindingMember and value for each answer submitted. #### Response - `data` (object): An object containing the surveyId, surveyAnswers, success, and errors. - `surveyId` (string): The ID of the survey. - `surveyAnswers` (array): An array of objects containing the bindingMember and value for each survey answer. - `success` (boolean): Indicates the success status of the validation. - `errors` (array): An array of objects containing details about any validation errors. - `question` (string): The question for which the error occurred. - `value` (string): The value that caused the error. - `errorMessage` (string): The error message describing the validation issue. - `validator` (string): The validator that identified the error. #### Request body example ```json { "answers": [ { "bindingMember": "[CRM.Persons].Salutation", "value": "Test" }, { "bindingMember": "[CRM.Persons].FirstName", "value": "Test" }, { "bindingMember": "[CRM.Persons].LastName", "value": "Test" } ] } ``` #### Response example: (200 OK) ```json { "data": { "surveyId": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "surveyAnswers": [ { "bindingMember": "[CRM.Persons].Salutation", "value": "Test" }, { "bindingMember": "[CRM.Persons].FirstName", "value": "Test" }, { "bindingMember": "[CRM.Persons].LastName", "value": "Test" } ], "success": false, "errors": [ { "question": "bfb9b86b-77fc-492c-9138-246863a4ea61", "value": null, "errorMessage": "The question 'Vorname' must be answered!", "validator": "QuestionRequiredValidator" }, { "question": "a0cf741e-ae2b-4150-8a58-865864530b7d", "value": null, "errorMessage": "The question 'Nachname' must be answered!", "validator": "QuestionRequiredValidator" } ] } } ``` ### POST Create response - Endpoint: `POST {{API_BASE_URL}}/survey/v1/surveys/:survey/responses` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/create-response This endpoint is used to submit responses to a specific survey. #### Request #### Request Body - `answers` (array of objects) - An array containing the responses to the survey questions. - `question` (string) - The ID of the question being answered. - `value` (string) - The response to the question. #### Response - `data` (object) - The response data container. - `id` (string) - The ID of the response. - `surveyId` (string) - The ID of the survey the response belongs to. - `answers` (array of objects) - An array containing the submitted answers. - `question` (string) - The ID of the question. - `value` (string) - The response value. - `isFile` (boolean) - Indicates if the response is a file. - `bindingMember` (string) - The binding member of the response. - `invalidAnswers` (array) - An array containing any invalid answers #### Request body example ```json { "answers": [ { "question": "a02379d0-9d48-48d4-a4a6-056b4beaff09", "value": "Herr" }, { "question": "bfb9b86b-77fc-492c-9138-246863a4ea61", "value": "Max" }, { "question": "a0cf741e-ae2b-4150-8a58-865864530b7d", "value": "Mustermann" } ] } ``` #### Response example: (200 OK) ```json { "data": { "id": "9c51daf8-413a-f011-93e1-00155d96040a", "surveyId": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "answers": [ { "question": "a02379d0-9d48-48d4-a4a6-056b4beaff09", "value": "Herr", "isFile": false, "bindingMember": "SalutationLookup" }, { "question": "bfb9b86b-77fc-492c-9138-246863a4ea61", "value": "Max", "isFile": false, "bindingMember": "FirstName" }, { "question": "a0cf741e-ae2b-4150-8a58-865864530b7d", "value": "Mustermann", "isFile": false, "bindingMember": "LastName" } ], "invalidAnswers": [] } } ``` ### POST Validate response - Endpoint: `POST {{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response/validate` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/validate-response This endpoint is used to validate a survey response. #### Request - `surveyId`: The ID of the survey. - `responseId`: The ID of the response. #### Response - `surveyId`: The ID of the survey. - `responseId`: The ID of the response. - `success`: Indicates if the validation was successful. - `errors`: An array of any validation errors encountered during the process. #### Response example: (200 OK) ```json { "data": { "surveyId": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "responseId": "9c51daf8-413a-f011-93e1-00155d96040a", "success": true, "errors": [] } } ``` ### GET Get response - Endpoint: `GET {{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/get-response #### Response example: (200 OK) ```json { "data": { "id": "9c51daf8-413a-f011-93e1-00155d96040a", "surveyId": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "answers": [ { "question": "a02379d0-9d48-48d4-a4a6-056b4beaff09", "value": "Herr", "isFile": false, "bindingMember": "SalutationLookup" }, { "question": "bfb9b86b-77fc-492c-9138-246863a4ea61", "value": "Max", "isFile": false, "bindingMember": "FirstName" }, { "question": "a0cf741e-ae2b-4150-8a58-865864530b7d", "value": "Mustermann", "isFile": false, "bindingMember": "LastName" } ] } } ``` ### PUT Update response - Endpoint: `PUT {{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/update-response This endpoint is used to update a survey response. #### Request #### Request Body - `answers` (array): An array of objects containing the response to each question in the survey. Each object includes: - `question` (string): The unique identifier of the question. - `value` (string): The response value to the question. #### Response - `data` (object): The main data object containing the updated survey response details. - `id` (string): The ID of the updated survey response. - `surveyId` (string): The ID of the survey associated with the response. - `answers` (array): An array of updated answers for the survey questions. - `invalidAnswers` (array): An array of any invalid answers submitted in the response #### Request body example ```json { "answers": [ { "question": "37daf7d5-ce25-4618-86f3-524c1af80c0d", "value": "Test" } ] } ``` #### Response example: (200 OK) ```json { "data": { "id": "9c51daf8-413a-f011-93e1-00155d96040a", "surveyId": "eyJVc2VDYXNlTmFtZSI6IldlYlNob3AuQnV5ZXJEYXRhIiwiVGVybWluYWxTZXRJZCI6bnVsbCwiRmFpcmV2ZW50SWQiOjEsIlJvbGVJZCI6bnVsbCwiQXJ0aWNsZUlkcyI6bnVsbH0=", "answers": [], "invalidAnswers": [] } } ``` ### DELETE Delete response - Endpoint: `DELETE {{API_BASE_URL}}/survey/v1/surveys/:survey/responses/:response` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/surveys/delete-response This endpoint is used to delete a specific response for a survey. #### Request - `survey`(string): The survey ID - `response` (string): The response ID #### Response - `success` (boolean): Indicates whether the deletion was successful. #### Response example: (200 OK) ```json { "data": { "success": true } } ``` ## Lookups Human documentation: https://developers.aditus.com/docs/survey/lookups ### GET Get lookups by name - Endpoint: `GET {{API_BASE_URL}}/survey/v1/lookups/:lookupListName` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/lookups/get-lookups-by-name This endpoint retrieves the lookup list data for a specific lookup list name. #### Request - `lookupListName` (string): The name of the lookup list #### Response - `data` (object): The main data container. - `id` (number): The ID of the lookup list. - `language` (string): The language of the lookup list. - `lookups` (array): An array of lookup items. - `key` (string): The key of the lookup item. - `value` (string): The value of the lookup item. - `isFreeText` (boolean): Indicates if the lookup item allows free text input. - `lookups` (array): Nested lookup items, if available. #### Response example: Get countries lookup (200 OK) ```json { "data": { "id": 3, "language": "de", "lookups": [ { "key": "AF", "value": "Afghanistan", "value2": "AFG", "value3": "+93", "value4": "401", "value5": "افغانستان", "isFreeText": false, "lookups": [] }, { "key": "EG", "value": "Ägypten", "value2": "EGY", "value3": "+20", "value4": "201", "isFreeText": false, "lookups": [] }, { "key": "AX", "value": "Åland", "value2": "ALA", "value3": "+358-18", "value4": "111", "isFreeText": false, "lookups": [] }, { "key": "AL", "value": "Albanien", "value2": "ALB", "value3": "+355", "value4": "111", "value5": "Shqipëri", "isFreeText": false, "lookups": [] }, { "key": "DZ", "value": "Algerien", "value2": "DZA", "value3": "+213", "value4": "201", "value5": "الجزائر", "isFreeText": false, "lookups": [] }, { "key": "VI", "value": "Amerikanische Jungferninseln", "value2": "VIR", "value3": "+1-340", "value4": "302", "isFreeText": false, "lookups": [] }, { "key": "AS", "value": "Amerikanisch-Samoa", "value2": "ASM", "value3": "+1-684", "value4": "501", "isFreeText": false, "lookups": [] }, { "key": "AD", "value": "Andorra", "value2": "AND", "value3": "+376", "value4": "111", "value5": "Andorra", "isFreeText": false, "lookups": [] }, { "key": "AO", "value": "Angola", "value2": "AGO", "value3": "+244", "value4": "201", "value5": "Angola", "isFreeText": false, "lookups": [] }, { "key": "AI", "value": "Anguilla", "value2": "AIA", "value3": "+1-264", "value4": "302", "isFreeText": false, "lookups": [] }, { "key": "AQ", "value": "Antarktis", "value2": "ATA", "value3": "+672", "value4": "501", "isFreeText": false, "lookups": [] }, { "key": "AG", "value": "Antigua und Barbuda", "value2": "ATG", "value3": "+1-268", "value4": "302", "value5": "Antigua and Barbuda", "isFreeText": false, "lookups": [] }, { "key": "GQ", "value": "Äquatorialguinea", "value2": "GNQ", "value3": "+240", "value4": "201", "isFreeText": false, "lookups": [] }, { "key": "AR", "value": "Argentinien", "value2": "ARG", "value3": "+54", "value4": "302", "value5": "Argentina", "isFreeText": false, "lookups": [] }, { "key": "AM", "value": "Armenien", "value2": "ARM", "value3": "+374", "value4": "401", "value5": "Հայաստան", "isFreeText": false, "lookups": [] }, { "key": "AW", "value": "Aruba", "value2": "ABW", "value3": "+297", "value4": "302", "isFreeText": false, "lookups": [] }, { "key": "AZ", "value": "Aserbaidschan", "value2": "AZE", "value3": "+994", "value4": "401", "value5": "Azerbaijan", "isFreeText": false, "lookups": [] }, { "key": "ET", "value": "Äthiopien", "value2": "ETH", "value3": "+251", "value4": "201", "isFreeText": false, "lookups": [] }, { "key": "AU", "value": "Australien", "value2": "AUS", "value3": "+61", "value4": "501", "value5": "Australia", "isFreeText": false, "lookups": [] }, { "key": "BS", "value": "Bahamas", "value2": "BHS", "value3": "+1-242", "value4": "302", "value5": "The Bahamas", "isFreeText": false, "lookups": [] }, { "key": "BH", "value": "Bahrain", "value2": "BHR", "value3": "+973", "value4": "401", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: Get salutations lookup (200 OK) ```json { "data": { "id": 1, "language": "de", "lookups": [ { "key": "Divers", "value": "Divers", "isFreeText": false, "lookups": [] }, { "key": "Frau", "value": "Frau", "value3": "2", "isFreeText": false, "lookups": [] }, { "key": "Herr", "value": "Herr", "value3": "1", "isFreeText": false, "lookups": [] }, { "key": "Sir_good", "value": "Sir", "isFreeText": false, "lookups": [] } ] } } ``` #### Response example: Get languages lookup (200 OK) ```json { "data": { "id": 6, "language": "de", "lookups": [ { "key": "AR", "value": "Arabisch", "value2": "ARA", "isFreeText": false, "lookups": [] }, { "key": "zh", "value": "Chinesisch", "isFreeText": false, "lookups": [] }, { "key": "DA", "value": "Dänisch", "value2": "DK", "value3": "6", "isFreeText": false, "lookups": [] }, { "key": "DE", "value": "Deutsch", "value2": "DEU", "value3": "1", "isFreeText": false, "lookups": [] }, { "key": "EN", "value": "Englisch", "value2": "ENG", "value3": "4", "isFreeText": false, "lookups": [] }, { "key": "FR", "value": "Französisch", "value2": "FRA", "value3": "2", "isFreeText": false, "lookups": [] }, { "key": "IT", "value": "Italienisch", "value2": "ITA", "value3": "3", "isFreeText": false, "lookups": [] }, { "key": "PL", "value": "Polnisch", "value2": "pol", "isFreeText": false, "lookups": [] }, { "key": "RU", "value": "Russisch", "isFreeText": false, "lookups": [] }, { "key": "ES", "value": "Spanisch", "value2": "SPA", "value3": "5", "isFreeText": false, "lookups": [] } ] } } ``` #### Response example: Get Saudia Arabian cities lookup (200 OK) ```json { "data": { "id": 2245, "language": "de", "lookups": [ { "key": "Riyadh", "value": "Riad", "isFreeText": false, "lookups": [] }, { "key": "Abha", "value": "Abha", "isFreeText": false, "lookups": [] }, { "key": "Afif", "value": "Afif", "isFreeText": false, "lookups": [] }, { "key": "Al Baha", "value": "Al-Baha", "isFreeText": false, "lookups": [] }, { "key": "Al Khafji", "value": "Al-Chafdschi", "isFreeText": false, "lookups": [] }, { "key": "Al Kharj", "value": "Al-Chardsch", "isFreeText": false, "lookups": [] }, { "key": "Khobar", "value": "Al-Chubar", "isFreeText": false, "lookups": [] }, { "key": "Al Jubail", "value": "Al-Dschubail", "isFreeText": false, "lookups": [] }, { "key": "Al Ghat", "value": "Al-Ghat", "isFreeText": false, "lookups": [] }, { "key": "Al Hofuf", "value": "Al-Hufuf", "isFreeText": false, "lookups": [] }, { "key": "Al Qassim", "value": "Al-Kassim", "isFreeText": false, "lookups": [] }, { "key": "Al Muzahimiyah", "value": "Al-Musahimija", "isFreeText": false, "lookups": [] }, { "key": "Al Ula", "value": "Al-Ula", "isFreeText": false, "lookups": [] }, { "key": "Al Wajh", "value": "Al-Wadschh", "isFreeText": false, "lookups": [] }, { "key": "Al Zulfi", "value": "Al-Zulfi", "isFreeText": false, "lookups": [] }, { "key": "Arar", "value": "Arar", "isFreeText": false, "lookups": [] }, { "key": "Bisha", "value": "Bisha", "isFreeText": false, "lookups": [] }, { "key": "Buraydah", "value": "Buraida", "isFreeText": false, "lookups": [] }, { "key": "Khamis Mushait", "value": "Chamis Muschait", "isFreeText": false, "lookups": [] }, { "key": "Dammam", "value": "Dammam", "isFreeText": false, "lookups": [] }, { "key": "Dhahran", "value": "Dhahran", "isFreeText": false, "lookups": [] }, { "key": "Diriyah", "value": "Diriyya", "isFreeText": false, "lookups": [] }, { "key": "Jeddah", "value": "Dschidda", "isFreeText": false, "lookups": [] }, { "key": "Jizan", "value": "Dschizan", "isFreeText": false, "lookups": [] }, { "key": "Durma", "value": "Durma", "isFreeText": false, "lookups": [] }, { "key": "Hail", "value": "Hail", "isFreeText": false, "lookups": [] }, { "key": "Hawtat Bani Tamim", "value": "Hautat Bani Tamim", "isFreeText": false, "lookups": [] }, { "key": "Medina", "value": "Medina", "isFreeText": false, "lookups": [] }, { "key": "Mecca", "value": "Mekka", "isFreeText": false, "lookups": [] }, { "key": "Najran", "value": "Nadschran", "isFreeText": false, "lookups": [] }, { "key": "Rabigh", "value": "Rabigh", "isFreeText": false, "lookups": [] }, { "key": "Ras Tanura", "value": "Ras Tanura", "isFreeText": false, "lookups": [] }, { "key": "Rimah", "value": "Rimah", "isFreeText": false, "lookups": [] }, { "key": "Sakaka", "value": "Sakaka", "isFreeText": false, "lookups": [] }, { "key": "Shaqra", "value": "Schaqra", "isFreeText": false, "lookups": [] }, { "key": "Tabuk", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ## GET Get swagger document - Endpoint: `GET {{API_BASE_URL}}/systems/swagger/survey` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/survey/get-swagger-document This endpoint makes a request to retrieve the Swagger documentation for the survey API. ### Request This request does not require a request body. ### Response The response for this request is a JSON schema that includes the Swagger documentation for the survey API. The schema will provide detailed information about the endpoints, request parameters, response formats, and any additional information related to the surveys. ### Response example: Get Swagger document (200 OK) ```json { "x-generator": "NSwag v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))", "openapi": "3.0.0", "info": { "title": "ADITUS API", "version": "1.0.0" }, "servers": [ { "url": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/" } ], "paths": { "/survey/v1/lookups/{name}": { "get": { "tags": [ "Lookups" ], "operationId": "Lookups_GetLookupsByName", "parameters": [ { "name": "name", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfGetLookupsResponse" } } } } } } }, "/survey/v1/surveys/{surveyId}": { "get": { "tags": [ "Surveys" ], "operationId": "Surveys_GetSurveyById", "parameters": [ { "name": "surveyId", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfSurvey" } } } } } } }, "/survey/v1/surveys/{surveyId}/validate": { "post": { "tags": [ "Surveys" ], "operationId": "Surveys_ValidateAnswers", "parameters": [ { "name": "surveyId", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 } ], "requestBody": { "x-name": "payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidateSurveyAnswersRequestPayload" } } }, "required": true, "x-position": 2 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfValidateSurveyAnswersResponse" } } } } } } }, "/survey/v1/surveys/{surveyId}/responses": { "post": { "tags": [ "Surveys" ], "operationId": "Surveys_CreateResponse", "parameters": [ { "name": "surveyId", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 } ], "requestBody": { "x-name": "body", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetSurveyResponseAnswersRequest" } } }, "required": true, "x-position": 2 }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SimpleApiResponseOfCreateSurveyResponseResponse" } } } } } } }, "/survey/v1/surveys/{surveyId}/responses/{responseId}": { "put": { "tags": [ "Surveys" ], "operationId": "Surveys_UpdateResponsePUT", "parameters": [ { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ --- product: ADITUS API module: Assets direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/assets.md humanDocumentation: https://developers.aditus.com/docs/assets endpoints: 7 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Assets This is the machine-readable Markdown version of the **Assets** module of the ADITUS API reference (inbound (your systems call ADITUS), 7 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | GET | `{{API_BASE_URL}}/assets/v1/themes/:name?context=event:{{EVENT}}&subContext=articleGroup:{{ARTICLEGROUP}}` | Get theme | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/assets/v1/images/:imageKey?context=orderItem:{{ORDER_ITEM}}&useFallback=True&language={{LANGUAGE}}` | Get image | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/assets/v1/images/:name/:resourceContext/:resourceSetName/:resourceName?context=article:{{ITEM_ID}}&language={{LANGUAGE}}&foregroundColor={{EXAMPLE_COLOR}}` | Get icon from icon set | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/assets/v1/receipts/:identifier?s=LtDxHzfZZHsAg` | Get receipt | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/assets/v1/tickets/:identifier/:format?s=hVA9UEQ7D4s7YA` | Get ticket | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/assets/v1/assets/:key?context=orderItem:{{ORDER_ITEM}}` | Get asset | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/systems/swagger/assets` | Get swagger document | OAuth 2.0 bearer token (client credentials) | ## Contents - Assets — https://developers.aditus.com/docs/assets - Themes — https://developers.aditus.com/docs/assets/themes - GET Get theme — https://developers.aditus.com/docs/assets/themes/get-theme - Images — https://developers.aditus.com/docs/assets/images - GET Get image — https://developers.aditus.com/docs/assets/images/get-image - GET Get icon from icon set — https://developers.aditus.com/docs/assets/images/get-icon-from-icon-set - Receipts — https://developers.aditus.com/docs/assets/receipts - GET Get receipt — https://developers.aditus.com/docs/assets/receipts/get-receipt - Tickets — https://developers.aditus.com/docs/assets/tickets - GET Get ticket — https://developers.aditus.com/docs/assets/tickets/get-ticket - Assets — https://developers.aditus.com/docs/assets/assets - GET Get asset — https://developers.aditus.com/docs/assets/assets/get-asset - GET Get swagger document — https://developers.aditus.com/docs/assets/get-swagger-document ## Overview **Please prefer using this API section over the deprecated theme API.** The Assets API serves static content for our products, such as images, tickets and receipts, as well as theming information. Generally there are two kinds of assets: public and protected. Protected assets include ticket and receipts while others are public. In addition to the identifier, protected assets require a security hash in form of a query parameter to be accessible. The security hash is already contained in links to assets provided by other parts of the API. ### Contexts Most assets are identified via their type. This is, however, not a unique identifier, as these assets can exist in different contexts. For example the shop banner (THEME_SHOP_BANNER_LARGE), can be defined on different levels, such as mandator, event or article group and is then displayed on the according pages. Contexts can specify on which level the asset shall be retrieved. This is done in the format `type:identifier`. Available contexts are listed below, though not every context is available on every endpoint. | **Context** | **Type** | **Available identifiers** | | --- | --- | --- | | Mandator | _none - implicit_ | | | Fairevent | event | URL alias/slug, UUID | | Fairbrand | fairbrand | Fairbrand number | | Fairevent appearance | appearance | Fairevent appearance number, UUID | | Exhibitor | exhibitor | UUID | | Article | article | UUID | | Article Group | articleGroup | UUID | | Order Position | orderItem | Order position number, UUID | ## Themes Human documentation: https://developers.aditus.com/docs/assets/themes The theme section provides theme information, such as colors, custom styles and links to the theme images. Currently this is available for Shop v5 and TERP v5. ### GET Get theme - Endpoint: `GET {{API_BASE_URL}}/assets/v1/themes/:name?context=event:{{EVENT}}&subContext=articleGroup:{{ARTICLEGROUP}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/themes/get-theme This endpoint retrieves the theme for a shop based on the provided context. #### Request `context` (string, required) The context can be an event, an appearance, an exhibitor or an order item. `subContext` (string, optional) The sub context can be an article group. #### Response The API returns a JSON object with the following properties: - `id` (string): The ID of the theme. - `name` (string): The name of the theme. - `product` (string): The product associated with the theme. - `context` (object): The context details including type and ID. - `type` (string): The type of the context. - `id` (string): The ID of the context. - `subContext` (object): The sub context details including type and ID. - `type` (string): The type of the context. - `id` (string): The ID of the context. - `styles` (array): An array of style objects. - `key` (string): The key of the style. - `value` (string): The value of the style. - `type` (string): The type of the style. - `images` (array): An array of image objects. - `key` (string): The key of the image. - `uri` (string): The URI of the image. - `type` (string): The type of the image. - `size` (string): The size of the image. - `customCss` (string): The custom CSS associated with the theme. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept-Language | {{LANGUAGE}} | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | context | event:{{EVENT}} | Schema: "{type}:{id}" | | subContext | articleGroup:{{ARTICLEGROUP}} | Schema: "{type}:{id}" | #### Response example: Get event theme (200 OK) ```json { "data": { "id": "3e6c6263-f529-4ae4-be7d-ce2980bc2553", "name": "Shop", "product": "Shop", "context": { "type": "event", "id": "f2e25737-4990-ee11-93cf-00155d960409" }, "styles": [ { "key": "THEME_SHOP_COLOR_PRIMARY", "value": "#00A4CC", "type": "ColorPrimary" }, { "key": "THEME_SHOP_COLOR_SECONDARY", "value": "#000000", "type": "ColorSecondary" }, { "key": "THEME_SHOP_USE_STICKY_HEADER", "value": "True", "type": "UseStickyHeader" }, { "key": "THEME_SHOP_SHOW_BRAND_TEXT", "value": "False", "type": "ShowEventBrandText" }, { "key": "THEME_SHOP_ARTICLE_ICON_SET", "value": "Default", "type": "ArticleIconSet" }, { "key": "THEME_SHOP_CHECKOUT_PANEL_POSITION", "value": "Right", "type": "CheckoutPanelPosition" }, { "key": "THEME_SHOP_TOGGLE_ONLY_ONE_ARTICLE_GROUP", "value": "False", "type": "ToggleOnlyOneArticleGroup" }, { "key": "THEME_SHOP_NUMBER_OF_MAIN_NAVIGATION_LINKS", "value": "4", "type": "NumberOfMainNavigationLinks" } ], "images": [ { "key": "THEME_SHOP_BANNER_SMALL", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_SMALL?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=3f4af255d5b88fc1a52e8abedda94ee53c9ca06ba5e4b77cfb0758f5b4483959", "type": "Banner", "size": "Small" }, { "key": "THEME_SHOP_BANNER_LARGE", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_LARGE?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=b523e7464539afd4442882a09eac4ff9a0a5ad177a28b929c923e8f965dff093", "type": "Banner", "size": "Large" }, { "key": "THEME_SHOP_LOGO_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_DARK_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Logo", "background": "Dark" }, { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=09f9c3b392f48d10a14cf99420169c897599a88c4d4f2b0b37eb93e83c750a63", "type": "Logo", "background": "Light" }, { "key": "THEME_SHOP_ICON_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_DARK_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Icon", "background": "Dark" }, { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=event:f2e25737-4990-ee11-93cf-00155d960409&language=en&v=c59fdd0f40d98e8e328527cbf5155782fa94af2667ea68a037731fbfbd58a7ad", "type": "Icon", "background": "Light" } ], "customCss": "" } } ``` #### Response example: Get appearance theme (200 OK) ```json { "data": { "id": "3e6c6263-f529-4ae4-be7d-ce2980bc2553", "name": "Shop", "product": "Shop", "context": { "type": "appearance", "id": "a7c0a981-8312-ef11-93d7-00155d96040a" }, "styles": [ { "key": "THEME_SHOP_COLOR_PRIMARY", "value": "#00A4CC", "type": "ColorPrimary" }, { "key": "THEME_SHOP_COLOR_SECONDARY", "value": "#000000", "type": "ColorSecondary" }, { "key": "THEME_SHOP_USE_STICKY_HEADER", "value": "True", "type": "UseStickyHeader" }, { "key": "THEME_SHOP_SHOW_BRAND_TEXT", "value": "False", "type": "ShowEventBrandText" }, { "key": "THEME_SHOP_ARTICLE_ICON_SET", "value": "Default", "type": "ArticleIconSet" }, { "key": "THEME_SHOP_CHECKOUT_PANEL_POSITION", "value": "Right", "type": "CheckoutPanelPosition" }, { "key": "THEME_SHOP_TOGGLE_ONLY_ONE_ARTICLE_GROUP", "value": "False", "type": "ToggleOnlyOneArticleGroup" }, { "key": "THEME_SHOP_NUMBER_OF_MAIN_NAVIGATION_LINKS", "value": "4", "type": "NumberOfMainNavigationLinks" } ], "images": [ { "key": "THEME_SHOP_BANNER_SMALL", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_SMALL?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=3f4af255d5b88fc1a52e8abedda94ee53c9ca06ba5e4b77cfb0758f5b4483959", "type": "Banner", "size": "Small" }, { "key": "THEME_SHOP_BANNER_LARGE", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_LARGE?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=b523e7464539afd4442882a09eac4ff9a0a5ad177a28b929c923e8f965dff093", "type": "Banner", "size": "Large" }, { "key": "THEME_SHOP_LOGO_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_DARK_BG?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Logo", "background": "Dark" }, { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=09f9c3b392f48d10a14cf99420169c897599a88c4d4f2b0b37eb93e83c750a63", "type": "Logo", "background": "Light" }, { "key": "THEME_SHOP_ICON_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_DARK_BG?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Icon", "background": "Dark" }, { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=c59fdd0f40d98e8e328527cbf5155782fa94af2667ea68a037731fbfbd58a7ad", "type": "Icon", "background": "Light" }, { "key": "Backgroundpic-dynamic", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=253272efc7e67716f46c46ce0dce076a45e54ef10411fe7a2cfa953ad37873a4", "type": "Background", "background": "Light", "size": "Large" }, { "key": "Backgroundpic-dynamic-medium", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic-medium?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=e9a33b1ca52e42a3fa5847d85a1260095f13dd80c53876eb0f847dc0c733c60e", "type": "Background", "background": "Light", "size": "Medium" }, { "key": "Backgroundpic-dynamic-small", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic-small?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=55ffd21d01eb6f6924797e1c673813c5c67ee393d8c469cafdd75c9a2f6802d7", "type": "Background", "background": "Light", "size": "Small" }, { "key": "ThemeKeyVisual2", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/ThemeKeyVisual2?context=appearance:a7c0a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=667c8bbefdd59ecfb44b3685ee8c0d63e2651d2d36d6b39220f80687d52c92a3", "type": "BannerSecondary", "background": "Light", "size": "Large" } ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: Get exhibitor theme (200 OK) ```json { "data": { "id": "3e6c6263-f529-4ae4-be7d-ce2980bc2553", "name": "Shop", "product": "Shop", "context": { "type": "exhibitor", "id": "d96fbfb4-ca06-ef11-93d7-00155d96040a" }, "styles": [ { "key": "THEME_SHOP_COLOR_PRIMARY", "value": "#0078D7", "type": "ColorPrimary" }, { "key": "THEME_SHOP_COLOR_SECONDARY", "value": "#000000", "type": "ColorSecondary" }, { "key": "THEME_SHOP_USE_STICKY_HEADER", "value": "True", "type": "UseStickyHeader" }, { "key": "THEME_SHOP_SHOW_BRAND_TEXT", "value": "False", "type": "ShowEventBrandText" }, { "key": "THEME_SHOP_ARTICLE_ICON_SET", "value": "Default", "type": "ArticleIconSet" }, { "key": "THEME_SHOP_CHECKOUT_PANEL_POSITION", "value": "Right", "type": "CheckoutPanelPosition" }, { "key": "THEME_SHOP_TOGGLE_ONLY_ONE_ARTICLE_GROUP", "value": "False", "type": "ToggleOnlyOneArticleGroup" }, { "key": "THEME_SHOP_NUMBER_OF_MAIN_NAVIGATION_LINKS", "value": "2", "type": "NumberOfMainNavigationLinks" } ], "images": [ { "key": "THEME_SHOP_BANNER_SMALL", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_SMALL?context=exhibitor:d96fbfb4-ca06-ef11-93d7-00155d96040a&language=en&useFallback=True&v=32b38ee6074c83a95f121481e04b3304d8ffd83161102e4d458e8a7177adc71c", "type": "Banner", "size": "Small" }, { "key": "THEME_SHOP_BANNER_LARGE", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_LARGE?context=exhibitor:d96fbfb4-ca06-ef11-93d7-00155d96040a&language=en&useFallback=True&v=693765f35cb88c3807e3454dc58c384d2222a9f695924c3d983cfb13f016ce31", "type": "Banner", "size": "Large" }, { "key": "THEME_SHOP_LOGO_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_DARK_BG?context=exhibitor:d96fbfb4-ca06-ef11-93d7-00155d96040a&language=en&useFallback=True&v=cf95f7d54aa7fa21fc69e2fc033a8ddfe68accab68937251bfa57caa62787c16", "type": "Logo", "background": "Dark" }, { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=exhibitor:d96fbfb4-ca06-ef11-93d7-00155d96040a&language=en&useFallback=True&v=656163ce9ef972ec50908346af0748bb94102b6ca92a2178256ae45b3ca09e65", "type": "Logo", "background": "Light" }, { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=exhibitor:d96fbfb4-ca06-ef11-93d7-00155d96040a&language=en&useFallback=True&v=cbd3a5a83aa0e01d9dc5e3818f41d4c3fc1bddb604e5aa6635ec901f1d4a9a3e", "type": "Icon", "background": "Light" } ], "customCss": "" } } ``` #### Response example: Get order item theme (200 OK) ```json { "data": { "id": "3e6c6263-f529-4ae4-be7d-ce2980bc2553", "name": "Shop", "product": "Shop", "context": { "type": "orderItem", "id": "88d2a981-8312-ef11-93d7-00155d96040a" }, "styles": [ { "key": "THEME_SHOP_COLOR_PRIMARY", "value": "#00A4CC", "type": "ColorPrimary" }, { "key": "THEME_SHOP_COLOR_SECONDARY", "value": "#000000", "type": "ColorSecondary" }, { "key": "THEME_SHOP_USE_STICKY_HEADER", "value": "True", "type": "UseStickyHeader" }, { "key": "THEME_SHOP_SHOW_BRAND_TEXT", "value": "False", "type": "ShowEventBrandText" }, { "key": "THEME_SHOP_ARTICLE_ICON_SET", "value": "Default", "type": "ArticleIconSet" }, { "key": "THEME_SHOP_CHECKOUT_PANEL_POSITION", "value": "Right", "type": "CheckoutPanelPosition" }, { "key": "THEME_SHOP_TOGGLE_ONLY_ONE_ARTICLE_GROUP", "value": "False", "type": "ToggleOnlyOneArticleGroup" }, { "key": "THEME_SHOP_NUMBER_OF_MAIN_NAVIGATION_LINKS", "value": "4", "type": "NumberOfMainNavigationLinks" } ], "images": [ { "key": "THEME_SHOP_BANNER_SMALL", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_SMALL?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=3f4af255d5b88fc1a52e8abedda94ee53c9ca06ba5e4b77cfb0758f5b4483959", "type": "Banner", "size": "Small" }, { "key": "THEME_SHOP_BANNER_LARGE", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_BANNER_LARGE?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=b523e7464539afd4442882a09eac4ff9a0a5ad177a28b929c923e8f965dff093", "type": "Banner", "size": "Large" }, { "key": "THEME_SHOP_LOGO_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_DARK_BG?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Logo", "background": "Dark" }, { "key": "THEME_SHOP_LOGO_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_LOGO_LIGHT_BG?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=09f9c3b392f48d10a14cf99420169c897599a88c4d4f2b0b37eb93e83c750a63", "type": "Logo", "background": "Light" }, { "key": "THEME_SHOP_ICON_DARK_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_DARK_BG?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=907ef5911533dc6c17711e5c946aaf4c49b3479c9db1ad7d5199738a3aee76fa", "type": "Icon", "background": "Dark" }, { "key": "THEME_SHOP_ICON_LIGHT_BG", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/THEME_SHOP_ICON_LIGHT_BG?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=c59fdd0f40d98e8e328527cbf5155782fa94af2667ea68a037731fbfbd58a7ad", "type": "Icon", "background": "Light" }, { "key": "Backgroundpic-dynamic", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=253272efc7e67716f46c46ce0dce076a45e54ef10411fe7a2cfa953ad37873a4", "type": "Background", "background": "Light", "size": "Large" }, { "key": "Backgroundpic-dynamic-medium", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic-medium?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=e9a33b1ca52e42a3fa5847d85a1260095f13dd80c53876eb0f847dc0c733c60e", "type": "Background", "background": "Light", "size": "Medium" }, { "key": "Backgroundpic-dynamic-small", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/Backgroundpic-dynamic-small?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=55ffd21d01eb6f6924797e1c673813c5c67ee393d8c469cafdd75c9a2f6802d7", "type": "Background", "background": "Light", "size": "Small" }, { "key": "ThemeKeyVisual2", "uri": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/theme/v1/Images/ThemeKeyVisual2?context=orderItem:88d2a981-8312-ef11-93d7-00155d96040a&language=en&useFallback=True&v=667c8bbefdd59ecfb44b3685ee8c0d63e2651d2d36d6b39220f80687d52c92a3", "type": "BannerSecondary", "background": "Light", "size": "Large" } ], ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ## Images Human documentation: https://developers.aditus.com/docs/assets/images ### GET Get image - Endpoint: `GET {{API_BASE_URL}}/assets/v1/images/:imageKey?context=orderItem:{{ORDER_ITEM}}&useFallback=True&language={{LANGUAGE}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/images/get-image #### Request This endpoint makes an HTTP GET request to retrieve a dynamic background picture for a specific context, with the option to use a fallback image and specify the language. The context can be an appearance, an exhibitor or a order item. #### Response - `type` (object): The type - `properties`: The properties of the image - `imageURL`: The image URL - `type` (string): The type of the image URL - `dimensions`: The with and height of the image - `type` (object) - `properties`: - `width`: - `type` (integer) - `height`: - `type` (integer) - `metadata`: The metadata of the image - `type` (object) - `additional properties` (boolean) The response will include the details of the image, such as the image URL, dimensions, and any additional metadata. _(It is not possible to save media type responses as examples in this documentation.)_ #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | context | orderItem:{{ORDER_ITEM}} | Schema: "{type}:{id}" | | useFallback | True | | | language | {{LANGUAGE}} | | ### GET Get icon from icon set - Endpoint: `GET {{API_BASE_URL}}/assets/v1/images/:name/:resourceContext/:resourceSetName/:resourceName?context=article:{{ITEM_ID}}&language={{LANGUAGE}}&foregroundColor={{EXAMPLE_COLOR}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/images/get-icon-from-icon-set This endpoint retrieves a theme image based on the provided parameters. #### Request - `name`: Represents the name of the image. - `resourceContext`: Specifies the resource context. - `resourceSetName`: Indicates the resource set name. - `resourceName`: Specifies the resource name. - `context`: Represents the item ID. - `language`: Specifies the language for the image. - `foregroundColor`: Specifies the foreground color for the image. #### Response The response includes the requested icon. _(It is not possible to save media type responses as examples in this documentation.)_ #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | context | article:{{ITEM_ID}} | | | language | {{LANGUAGE}} | | | foregroundColor | {{EXAMPLE_COLOR}} | | ## Receipts Human documentation: https://developers.aditus.com/docs/assets/receipts ### GET Get receipt - Endpoint: `GET {{API_BASE_URL}}/assets/v1/receipts/:identifier?s=LtDxHzfZZHsAg` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/receipts/get-receipt #### Request This endpoint makes an HTTP GET request to retrieve a receipt with the given receipt identifier. The required security hash has to be specified. - `receipt` (string, required): identifier for the receipt: UUID - `s` (string, required): security hash for the receipt #### Response The response will be the receipt as a PDF file. #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | s | LtDxHzfZZHsAg | Security hash to verify the user is allowed to download the receipt | #### Response example: Get receipt by id (0) _Empty body._ #### Response example: Get receipt by number (0) _Empty body._ ## Tickets Human documentation: https://developers.aditus.com/docs/assets/tickets ### GET Get ticket - Endpoint: `GET {{API_BASE_URL}}/assets/v1/tickets/:identifier/:format?s=hVA9UEQ7D4s7YA` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/tickets/get-ticket #### Request This endpoint makes an HTTP GET request to retrieve a ticket with the given identifier and format. The required security hash has to be specified. Available formats are: `pdf`,`png`,`pkpass`,`googlewallet` Do note though that not all formats might be retrievable depending on the event configuration to which the ticket belongs. Parameters - `identifier`(string, required): identifier for the ticket: UUID, ticket number or Regcode - `format`(string, required): format to retrieve the ticket in, see above for available formats. - `s` (string, required): security hash for the receipt - `layout`(string, optional): Layout to create the ticket with. Only available for format `pdf` and `png.` #### Response The response will be the ticket as a file in the according format. Will be displayed inline, when the format allows it. #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | s | hVA9UEQ7D4s7YA | Security hash to verify the user is allowed to access the ticket | | layout | mTicket | Optional: specify the layout to create the ticket with | #### Response example: Get PDF ticket (0) _Empty body._ #### Response example: Get apple wallet ticket (0) _Empty body._ #### Response example: Get google wallet ticket (0) _Empty body._ #### Response example: Get ticket by id (0) _Empty body._ #### Response example: Get ticket by ticket number (0) _Empty body._ #### Response example: Get ticket by barcode (0) _Empty body._ ## Assets Human documentation: https://developers.aditus.com/docs/assets/assets This API section can serve assets uploaded in TERP under the _Documents_ tab. For these to be retrievable via the endpoints, these must be explicitly set as public after uploading them. It's important to note that these are retrieved via their **type** and not **name/designation** or **file name**. Currently the following contexts are supported: `Mandator`, `Fairbrand`, `Fairevent`, `Fairevent Appearance`, `Article`. ### GET Get asset - Endpoint: `GET {{API_BASE_URL}}/assets/v1/assets/:key?context=orderItem:{{ORDER_ITEM}}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/assets/get-asset #### Request This endpoint makes an HTTP GET request to retrieve an asset with the given key and in the specified context. Parameters - `key`(string, required): identifier for the asset: **Name of the asset / document** - `context`(string, required): context to retrieve the asset in, see above for available contexts. #### Response The response will be the asset as a file. Will be displayed inline, when the file format allows it. #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | context | orderItem:{{ORDER_ITEM}} | Schema: "{type}:{id}" | ## GET Get swagger document - Endpoint: `GET {{API_BASE_URL}}/systems/swagger/assets` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/assets/get-swagger-document This endpoint makes an HTTP GET request to retrieve the Swagger documentation for the survey system. ### Request This request does not require a request body. ### Response The response will contain the Swagger documentation for the survey system, including information about the available endpoints, request parameters, response formats, and any additional details related to the survey system. ### Response example: (200 OK) ```json { "x-generator": "NSwag v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))", "openapi": "3.0.0", "info": { "title": "ADITUS API", "version": "1.0.0" }, "servers": [ { "url": "https://experiencedays.aditus.org/ADITUS-DEV-0_API/api/" } ], "paths": { "/v1/images/{imageKey}": { "get": { "tags": [ "Images" ], "operationId": "Images_GetImageGET", "parameters": [ { "name": "imageKey", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 }, { "name": "context", "in": "query", "schema": { "type": "string", "format": "type:identifier", "nullable": true }, "x-position": 2 }, { "name": "subContext", "in": "query", "schema": { "type": "string", "format": "type:identifier", "nullable": true }, "x-position": 3 }, { "name": "useFallback", "in": "query", "schema": { "type": "boolean", "default": true }, "x-position": 4 }, { "name": "v", "in": "query", "description": "Image version hash", "schema": { "type": "string", "nullable": true }, "x-position": 5 } ], "responses": { "200": { "description": "", "content": { "application/octet-stream": { "schema": { "type": "string", "format": "binary" } } } } } }, "head": { "tags": [ "Images" ], "operationId": "Images_GetImageHEAD", "parameters": [ { "name": "imageKey", "in": "path", "required": true, "schema": { "type": "string", "nullable": true }, "x-position": 1 }, { "name": "context", "in": "query", "schema": { "type": "string", "format": "type:identifier", "nullable": true }, "x-position": 2 }, { "name": "subContext", "in": "query", "schema": { "type": "string", "format": "type:identifier", "nullable": true }, "x-position": 3 }, { "name": "useFallback", "in": "query", "schema": { "type": "boolean", "default": true }, "x-position": 4 }, { "name": "v", "in": "query", "description": "Image version hash", "schema": { "type": "string", "nullable": true }, "x-position": 5 } ], "responses": { "200": { "description": "", "content": { "application/octet-stream": { "schema": { "type": "string", "format": "binary" } } } } } } }, "/v1/images/{resourceScope}/{resourceContext}/{resourceSetName}/{resourceName}": { "get": { "tags": [ "Images" ], "operationId": "Images_GetImageGET2", "parameters": [ { "name": "resourceScope", "in": "path", "required": true, "schema": { "$ref": "#/components/schemas/ResourceScopeType" }, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ --- product: ADITUS API module: Webhooks direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/webhooks.md humanDocumentation: https://developers.aditus.com/docs/webhooks endpoints: 0 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Webhooks This is the machine-readable Markdown version of the **Webhooks** module of the ADITUS API reference (inbound (your systems call ADITUS), guide / event reference). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Contents - Webhooks — https://developers.aditus.com/docs/webhooks - Ticket purchase and registration — https://developers.aditus.com/docs/webhooks/ticket-purchase-and-registration - Ticket entry and validation — https://developers.aditus.com/docs/webhooks/ticket-entry-and-validation - Changes in Sales Process — https://developers.aditus.com/docs/webhooks/changes-in-sales-process ## Overview 🚀 Connect your ticket shop with your favorite apps! Imagine your ticket shop could communicate with your CRM, accounting tools, or newsletter systems in real time — no more manual data exports required. By connecting additional systems and services, the ADITUS Ticket Shop can be tailored even more precisely and powerfully to meet your specific needs. We focus on a range of standard use cases and integrations to enable fast and efficient implementations. For our customers, what truly matters is smooth execution and tangible results. ### What are webhooks? A webhook acts like a digital notification service. It is an excellent way to receive real-time updates about specific event-related transactions. Webhooks instantly notify connected systems when important actions occur — for example, when a registration is completed or when a visitor checks in at an event. ### Why use webhooks? This real-time data flow enables immediate follow-up actions and highly personalized interactions with participants. By combining webhook events with your existing marketing infrastructure, you can: - Trigger automated campaigns - Update customer profiles instantly - Launch personalized engagement journeys at the perfect moment Webhooks empower organizations to respond immediately to visitor behavior and seamlessly integrate event data into their existing systems. The result is timely, relevant, and data-driven interactions throughout the entire event lifecycle. The ticket shop is built around a process-driven architecture: individual actions within the purchase or registration journey (use cases) modify the shopping cart (“cart”). These changes can be understood as events — and this is exactly where webhooks can be triggered. In principle, webhooks can be provided for all key cart-related use cases within the shop. As soon as one of these events occurs, an HTTP POST request containing a JSON payload is sent to the configured webhook URL. ### Creating Webhooks To set up a webhook, login to WebTERP and go to _Start->Interfaces->Webhooks_. From there, click _Webhooks_, then _Add webhook_. Alternatively, you can create and manage a webhook through the Webhooks API. Check the API documentation for detailed information. Webhooks require a few configuration options before you can make use of them: ### Payload URL The payload URL is the URL of the server that will receive the webhook POST requests. ### Content Type Webhooks can be delivered using different content types: - The `application/json` content type will deliver the JSON payload directly as the body of the `POST` request. - The `application/x-www-form-urlencoded` content type will send the JSON payload as a form parameter called `payload`. ### Secret Setting a webhook secret allows you to ensure that `POST` requests sent to the payload URL are from ADITUS. When you set a secret, you'll receive the `X-ADITUS-Signature` header in the webhook `POST` request. ### Active By default, webhook deliveries are "Active." You can choose to disable the delivery of webhook payloads by deselecting "Active." ### Events Choose which events will send payloads for this webhook. Only subscribing to the specific events you plan on handling limits the number of HTTP requests to your server. You can change the list of subscribed events anytime. See "Webhook event payloads" for the list of available webhook events and their payloads. #### Wildcard Event To configure a webhook for all events, use the wildcard (\*) character to specify the webhook events. When you add the wildcard event, we'll replace any existing events you have configured with the wildcard event and send you payloads for all supported events. You'll also automatically get any new events we might add in the future. ### Testing Webhooks You can monitor your webhook deliveries in ADITUS WebTERP, including the HTTP Request and payload as well as the response. ### Recent deliveries Every webhook has its own "Recent Deliveries" section, which lists all occurred events and whether a delivery was successful or failed. You can also identify when each delivery was attempted. ### Webhook payloads Webhook payloads are sent as `HTTP Post` to the Webhook URL. ### User-Agent The `User-Agent` for the requests will have the prefix `ADITUS-Webhook`. (For future use we may choose to add a suffix.) ### Delivery HTTP Headers HTTP POST payloads that are delivered to your webhook's configured URL endpoint will contain several special headers: | **Header** | **Description** | | --- | --- | | `X-ADITUS-Event` | The name of the event that triggered the webhook. | | `X-ADITUS-Delivery` | A GUID to identify the delivery. It will be reused for subsequent redeliveries and retries of the same event. | | `X-ADITUS-Signature` | This header is sent if the webhook is configured with a secret. This is the HMAC hex digest of the payload JSON, and is generated using the SHA-256 hash function and the secret as the HMAC key. | ### Webhook payload object common properties The common properties describes the standardized fields that are included in every webhook payload, regardless of the specific event. | **Key** | **Type** | **Description** | | --- | --- | --- | | `event` | `string` | The name of the event that triggered the webhook. | | `event_id` | `string`(UUID) | The unique event id for this delivery. It will be reused for subsequent redeliveries and retries of the same event. | | `event_time` | `datetime` | Timestamp when the event originally occurred. | | `api_url` | `string` (URL) | The API URL of the entity that triggered the event. This is optional and may not be present for every event payload. | | `endpoint_url` | `string` (URL) | The Webhook URL that this event was delivered to. | | `data` | `object` | Contains the business payload of the webhook | ### Verifying the payload If a `secret` is configured for a webhook, then each payload comes with a signed HMAC signature so that you can verify the origin of the webhook request. The secret is used as a key to sign the payload data with an HMAC key. The HMAC key is your security token, the HMAC digest is SHA-256, and the data is the raw payload JSON that is sent. The key is sent Base64 encoded via the `X-ADITUS-Signature` HTTP header. ### Example Payload for cart.checkout This example represents a maximum cart payload and therefore includes all fields that may occur in principle. Depending on the event type, article configuration, payment provider, registration flow, or legitimation setup, additional fields may appear or some fields may be omitted. The event-specific details are documented in the respective webhook descriptions. This webhook event is triggered when a shopping cart has been **successfully completed (checkout)** and an **order has been created**.The event contains comprehensive information about the shopping cart, the order, the buyer, the articles (e.g. tickets), registration data, and payment processing. Further details about this webhook can be found in the **“Ticket purchase and registration”** section. **Headers:** - **X-webhook-secret:** whk_XY000yyXXsxxxYYYxYYYYxxxXX0zzXxX - **X-ADITUS-Event:** cart.checkout - **X-ADITUS-Delivery:** 8y64d70d-x103-4185-1111-000x0103y0x0 - **User-Agent:** ADITUS-Webhook - **Host:** integration.aditus.de - **Content-Type:** application/json; charset=utf-8 - **Content-Length:** 2067 ``` json { "event": "cart.checkedout", "event_id": "8f7a6a2b-099a-4e42-b3e6-e2c6e17b4100", "event_time": "2026-05-04T10:09:57.5122953+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/shop/v1/cart/11d0b893-17a6-48a1-bc80-dd1f7a31f880", "endpoint_url": "https://aditus-integration.example.com/api/webhook/receive/aditus_dev_aditus", "data": { "cartCheckedout": { "orderId": "b59ebc98-9047-f111-93e7-00155d96040a", "cartId": "11d0b893-17a6-48a1-bc80-dd1f7a31f880" }, "cart": { "id": "11d0b893-17a6-48a1-bc80-dd1f7a31f880", "expiryTime": "2030-10-31T00:00:00+01:00", "user": { "id": "091c6fb9-11e0-ed11-93c4-00155db54d03", "isVerified": true, "eMail": "john@aditus.de", "externalId1": "121323123", "externalId2": "", "externalId3": "" }, "event": { "id": "0585e1b8-24b3-f011-93e3-00155d960409", "name": "Experience Days", "year": "2026", "number": "6565", "slug": "ExperienceDays2026", "externalId1": "51abc555-fe13-4eef-8328-feed99390ac6", "externalId2": "", "externalId3": "" }, "promotionCodes": [], "items": [ { "id": "00671313-0000-0000-0000-000000000000", "orderId": "b59ebc98-9047-f111-93e7-00155d96040a", "article": { "id": "a9460868-caeb-f011-93e3-00155d960409", "name": "DayTicket", "internalName": "DayTicket", "sort": 0, "prices": [ { "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:a9460868-caeb-f011-93e3-00155d960409&language=de&foregroundColor=#0000C0", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "110", "configuration": { "remainingAmountDisplayMode": "None", "remainingAmountPerTimeslotDisplayMode": "None", "remainingAmountThresholdPercent": 0, "showIfSoldOut": false, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 42, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "articleGroup": { "id": "44e73971-a115-ee11-93c8-00155d96040a", "name": "Tickets", "sort": 0, "configuration": { "isExclusiveAssortment": false } }, "externalId1": "82051273-0262-4149-82ec-74b75745b289", "externalId2": "", "externalId3": "" }, "promotionCodes": [], "price": { "price": 3.53, "grossPrice": 4.2, "tax": 0.67, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "self", "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Herr" }, { "isReadOnly": true, "bindingMember": "[CRM.Persons].FirstName", "value": "John" }, { "isReadOnly": true, "bindingMember": "[CRM.Persons].LastName", "value": "Snow" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].Info1", "value": "ADITUS GmbH" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].Street", "value": "Strasse der Nationen" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].StreetNumber", "value": "5" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].PostalCode", "value": "30539" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].City", "value": "Hannover" } ], "hasInformation": true }, "isValid": true, "problems": [], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": { "useCaseName": "Shop.Registration.Self", "faireventId": 194, "articleIds": [ 2958 ] }, "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": false, "hasToBeCompletedByTicketOwnerHimself": false } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { "isEnabled": false, "isValid": true, "bookings": [] } }, { "id": "00654e1e-0000-0000-0000-000000000000", "orderId": "b59ebc98-9047-f111-93e7-00155d96040a", "article": { "id": "b1664449-f0be-f011-93e3-00155d960409", "name": "Season ticket", "internalName": "Season ticket", "description": "This ticket grants daily admission to the trade show.", "sort": 0, "prices": [ { "price": { "price": 13.11, "grossPrice": 15.6, "tax": 2.49, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 13.11, "grossPrice": 15.6, "tax": 2.49, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:b1664449-f0be-f011-93e3-00155d960409&language=de&foregroundColor=#0000C0", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "MultipleDays", "articleNumber": "111", "configuration": { "remainingAmountDisplayMode": "None", "remainingAmountPerTimeslotDisplayMode": "None", "remainingAmountThresholdPercent": 0, "showIfSoldOut": false, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 42, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "articleGroup": { "id": "44e73971-a115-ee11-93c8-00155d96040a", "name": "Tickets", "sort": 0, "configuration": { "isExclusiveAssortment": false } }, "externalId1": "658ea375-bccb-48f3-b6e8-df0ae94f91f0", "externalId2": "", "externalId3": "" }, "promotionCodes": [], "price": { "price": 13.11, "grossPrice": 15.6, "tax": 2.49, "taxRate": 19, "currency": "EUR" }, "registration": { "data": { "type": "thirdPerson", "answers": [ { "isReadOnly": false, "bindingMember": "[CRM.Persons].FirstName", "value": "Johnny" }, { "isReadOnly": false, "bindingMember": "[CRM.Persons].LastName", "value": "Summer" }, { "isReadOnly": false, "bindingMember": "EMail", "value": "summer@aditus.de" }, { "isReadOnly": false, "bindingMember": "[CRM.PartyAddresses].CountryLookup", "value": "DE" } ], "hasInformation": true }, "isValid": true, "problems": [], "isRequired": false, "isPossible": false, "types": { "self": { "isPossible": false, "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": false, "hasToBeCompletedByTicketOwnerHimself": true } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { "isEnabled": true, "isValid": true, "minimumNumberOfBookings": 0, "maximumNumberOfBookings": 0, "bookings": [] } } ], "totals": [ { "original": { "price": 16.64, "grossPrice": 19.8, "tax": 3.16, "taxRate": 19, "currency": "EUR" }, "price": 16.64, "grossPrice": 19.8, "tax": 3.16, "taxRate": 19, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": true, "isLegitimationImmutable": true, "isRegistrationImmutable": false, "isAmountImmutable": true, "isPendingPayment": false, "isRegistrationOnly": false, "isRegistrationRequired": true, "isLegitimationRequired": false, "isPaymentRequired": true, "paymentProvider": { "expiresAt": "2026-05-04T11:09:32.091+02:00", "redirectUrl": "https://test.saferpay.com/vt2/Api/SharedThreeDS/404227/17808840/37624zz3zcf0xnujc0k6vhl77", "redirectRequired": true, "transactionToken": "«redacted»", "isExpressCheckoutInitialized": false, "id": "210f6011-343d-ee11-93cf-00155d960409", "name": "Kreditkarte", "paymentMethods": [ { "methodType": "Mastercard" }, { "methodType": "Visa" }, { "methodType": "Amex" } ], "configuration": { "saferpayFieldsUrl": "https://test.saferpay.com/Fields/404227", "saferpayFieldsLibrary": "https://test.saferpay.com/Fields/lib/1/saferpay-fields.js", "saferpayFieldsAccessToken": "«redacted»" }, "sort": 0, "isDefault": true, "isExpressCheckoutSupported": false }, "buyerPerson": { "email": "john@aditus.de", "firstName": "John", "lastName": "Snow", "company": "ADITUS GmbH", "nationality": "DE", "salutation": "Herr", "vatId": "0014", "address": { "street": "Strasse der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover", "country": "DE" }, "isPrefilled": true, "surveyId": { "useCaseName": "Shop.MissingBuyer", "faireventId": 194, "articleIds": [] }, "isValid": true }, "order": { "id": "b59ebc98-9047-f111-93e7-00155d96040a", "orderDate": "2026-05-04T10:09:48.7419754", "number": "6565-2026-6565622626" }, "status": "Completed", "culture": "de", "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Ich akzeptiere die Allgemeinen Geschäftsbedingungen", "consentPolicy": "Mandatory", "isApproved": true, "countries": [], "reconfirmationRequired": false }, { "uniqueId": "8abe7819-320c-444d-82df-9efc73e7594d", "displayOrder": 50, "version": "1.0", "content": "
\r\n Diese Umgebung ist ausschließlich für Dev-0-Tests bestimmt. \r\n Die Nutzung auf lokalen oder produktiven Systemen ist strengstens untersagt. \r\n Frontier Labs haftet nicht für fehlerhafte Builds, Datenverlust oder versehentliche Risse im Raum-Zeit-Kontinuum.\r\n
", "consentPolicy": "Mandatory", "isApproved": true, "countries": [], "reconfirmationRequired": true }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Ausführliche Informationen darüber, wie Ihre persönlichen Daten verwendet werden, finden Sie in unserem Datenschutzhinweis", "consentPolicy": "None", "isApproved": false, "countries": [], "reconfirmationRequired": false } ] } } } ``` ### **Fields in detail:** The following tables describe the fields of the `cart.checkedout` webhook payload in detail. The example values are taken from a sample payload and are intended to illustrate the structure and meaning of the individual fields. Depending on the concrete checkout scenario, some fields may be optional or only present in specific contexts. ### cartCheckeout | Field | Type | Description | Example | | --- | --- | --- | --- | | orderId | String (UUID) | ID of the order created during checkout | b59ebc98-9047-f111-93e7-00155d96040a | | cartId | String (UUID) | ID of the checked-out cart | 11d0b893-17a6-48a1-bc80-dd1f7a31f880 | ### cart – General cart information | Field | Type | Description | **Example** | | --- | --- | --- | --- | | id | String (UUID) | Cart ID | 11d0b893-17a6-48a1-bc80-dd1f7a31f880 | | expiryTime | Date/Time | Cart expiration timestamp | 2030-10-31T00:00:00+01:00 | | user | Object | Details of the user associated with the cart. | see details below in **user description** | | event | Object | Details of the event added to the cart | see details below in **event description** | | promotionCodes | Array | List of applied promotion/discount codes (empty at creation) | \[\] | | items | Array | List of cart items/positions (empty at creation) | see details below in **items** | | totals | Array | Aggregated cart total values | see details below in **totals** | | isImmutable | Boolean | Indicates if the cart can still be modified | false | | isPaymentImmutable | Boolean | Indicates if the payment details can still be changed | true | | isLegitimationImmutable | Boolean | Indicates whether legitimation data can still be changed | true | | isRegistrationImmutable | Boolean | Indicates whether registration data can still be changed | false | | isAmountImmutable | Boolean | Indicates whether the quantity/amount can still be changed | true | | isPendingPayment | Boolean | Indicates whether the payment is still pending | false | | isRegistrationOnly | Boolean | Indicates if registration is the only requirement | false | | isRegistrationRequired | Boolean | Indicates whether registration is required | true | | isLegitimationRequired | Boolean | Indicates whether legitimation is required | false | | isPaymentRequired | Boolean | Indicates whether payment is required | true | | paymentProvider | Object | Details of the selected payment provider | see details below in paymentProvider | | buyerPerson | Object | Buyer information associated with the order | see details below in buyerPerson | | order | Object | Details of the created order | see details below in order | | status | String | Current cart/order status | Completed | | culture | String | Language/culture context of the cart | de | | termsOfService | Array | List of terms, policies, and consent entries shown during checkout | see details below in termsOfService | ### user | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String (UUID) | Internal user ID | 091c6fb9-11e0-ed11-93c4-00155db54d03 | | isVerified | Boolean | Indicates whether the user account is verified | true | | eMail | String | Email address of the user | [john@aditus.de](https://mailto:john@aditus.de) | | externalId1..3 | String | Optional external identifier 1..3 | 121323123 | ### event - Trade Show | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String (UUID) | Event ID | f2e25737-4990-ee11-93cf-00155d960409 | | name | String | Event name | Experience Days | | year | String | Event year | 2026 | | number | String | Internal event number | 01 | | slug | String | URL key of the event | ed24 | | externalId1..3 | String | Optional external identifier 1..3 | SAP event ID | ### items (Cart items) Each item represents a purchased product (e.g., a ticket). | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String | Unique cart item ID | 00671313-0000-0000-0000-000000000000 | | orderId | String (UUID) | ID of the related order | b59ebc98-9047-f111-93e7-00155d96040a | | article | Object | Details of the article/ticket | see details below in **article** | | promotionCodes | Array | Promotion codes applied to the cart item | \[\] | | price | Object | Final price details of the cart item | see details below in **item price** | | registration | Object | Registration details for the ticket holder | see details below in **registration** | | legitimation | Object | Legitimation state of the item | see details below in **legitimation** | | timeslots | Object | Timeslot selection details for the item | see details below in **timeslots** | ### article (items\[\]) | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String (UUID) | Article ID | a9460868-caeb-f011-93e3-00155d960409 | | name | String | Display name of the article | DayTicket | | internalName | String | Internal article name | DayTicket | | description | String | Description text of the article (if available) | This ticket grants daily admission to the trade show. | | sort | Integer | Sort order of the article | 0 | | prices | Array | List of available article prices | see details below in **article prices** | | image | Object | Image information of the article | see details below in **article image** | | type | String | Technical article type | VisitorTicket | | ticketValidity | String | Validity type of the ticket | None | | articleNumber | String | Internal or business article number | 110 | | configuration | Object | Article configuration settings | see details below in **article configuration** | | articleGroup | Object | Group information of the article | see details below in **articleGroup** | | externalId1..3 | String | Optional external article identifier 1..3 | 82051273-0262-4149-82ec-74b75745b289 | ### article prices | Field | Type | Description | Example | | --- | --- | --- | --- | | price | Object | Actual calculated price | see details below | | originalPrice | Object | Original price before discounts/adjustments | see details below | ### article prices.price / article prices.originalPrice | Field | Type | Description | Example | | --- | --- | --- | --- | | price | Number | Net price | 3.53 | | grossPrice | Number | Gross price including taxes | 4.2 | | tax | Number | Tax amount | 0.67 | | taxRate | Number | Tax rate in percent | 19 | | currency | String | Currency code | EUR | ### article image | Field | Type | Description | Example | | --- | --- | --- | --- | | key | String | Technical image key | Default.OneDayTicket | | uri | String (URL) | Image URL | [https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket](https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket)?... | | type | String | Image type | Icon | ### article configuration | Field | Type | Description | Example | | --- | --- | --- | --- | | remainingAmountDisplayMode | String | Defines how remaining quantities are displayed | None | | remainingAmountPerTimeslotDisplayMode | String | Defines how remaining quantities per timeslot are displayed | None | | remainingAmountThresholdPercent | Number | Threshold percentage for remaining quantities | 0 | | showIfSoldOut | Boolean | Indicates whether the article is shown even if sold out | false | | maxLengthOfDescription | Integer | Maximum description length | 250 | | maxNumberOfTicketsPerSale | Integer | Maximum number of tickets per sale | 42 | | isInvitationEmailAddressChangePossible | Boolean | Indicates whether changing the invitation email is allowed | true | | showBadgePreview | Boolean | Indicates whether a badge preview is shown | true | ### articleGroup | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String (UUID) | Article group ID | 44e73971-a115-ee11-93c8-00155d96040a | | name | String | Name of the article group | Tickets | | sort | Integer | Sort order of the article group | 0 | | configuration | Object | Article group configuration | see details below | ### articleGroup.configuration | Field | Type | Description | Example | | --- | --- | --- | --- | | isExclusiveAssortment | Boolean | Indicates whether the assortment is exclusive | false | ### item price | Field | Type | Description | Example | | --- | --- | --- | --- | | price | Number | Net item price | 3.53 | | grossPrice | Number | Gross item price including taxes | 4.2 | | tax | Number | Tax amount | 0.67 | | taxRate | Number | Tax rate in percent | 19 | | currency | String | Currency code | EUR | ### registration | Field | Type | Description | Example | | --- | --- | --- | --- | | data | Object | Registration data entered for the item | see details below in **registration.data** | | isValid | Boolean | Indicates whether the registration is valid | true | | problems | Array | List of validation problems | \[\] | | isRequired | Boolean | Indicates whether registration is mandatory | true | | isPossible | Boolean | Indicates whether registration is possible | true | | types | Object | Available registration modes | see details below in **registration.types** | ### registration.data | Field | Type | Description | Example | | --- | --- | --- | --- | | type | String | Registration type used for the item | self | | answers | Array | List of submitted registration answers | see details below in **registration answers** | | hasInformation | Boolean | Indicates whether registration information is present | true | ### registration answers | Field | Type | Description | Example | | --- | --- | --- | --- | | isReadOnly | Boolean | Indicates whether the answer field is read-only | false | | bindingMember | String | Technical binding name of the answer field | \[CRM.Persons\].SalutationLookup | | value | String | Submitted value of the answer field | Herr | ### registration.types.self | Field | Type | Description | Example | | --- | --- | --- | --- | | isPossible | Boolean | Indicates whether self-registration is possible | true | | survey | Object | Survey configuration for self-registration | see details below | | hasToBeCompletedByTicketOwnerHimself | Boolean | Indicates whether the ticket owner must complete the registration personally | true | ### registration.types.self.survey | Field | Type | Description | Example | | --- | --- | --- | --- | | useCaseName | String | Technical survey use case name | Shop.Registration.Self | | faireventId | Integer | Internal fair/event ID used for the survey | 194 | | articleIds | Array | List of relevant article IDs | \[2958\] | ### registration.types.thirdPerson | Field | Type | Description | Example | | --- | --- | --- | --- | | isPossible | Boolean | Indicates whether third-person registration is possible | false | | hasToBeCompletedByTicketOwnerHimself | Boolean | Indicates whether the ticket owner must complete the registration personally | false | ### legitimation | Field | Type | Description | Example | | --- | --- | --- | --- | | isRequired | Boolean | Indicates whether legitimation is required | false | | isIncomplete | Boolean | Indicates whether legitimation is incomplete | false | ### timeslots | Field | Type | Description | Example | | --- | --- | --- | --- | | isEnabled | Boolean | Indicates whether timeslots are enabled for the item | true | | isValid | Boolean | Indicates whether the selected timeslot configuration is valid | true | | minimumNumberOfBookings | Integer | Minimum number of required bookings | 0 | | maximumNumberOfBookings | Integer | Maximum number of allowed bookings | 0 | | bookings | Array | List of booked timeslots | \[\] | **Note:** minimumNumberOfBookings and maximumNumberOfBookings are not present for every item, but they are part of the overall sample structure. ### totals\[\] - Cart Totals Each entry in the totals array contains the original and current pricing information. **original - Original Price** | Field | Type | Description | Example | | --- | --- | --- | --- | | original | Object | Original aggregated totals | see details below | | price | Number | Total net amount | 16.64 | | grossPrice | Number | Total gross amount | 19.8 | | tax | Number | Total tax | 3.16 | | taxRate | Number | Tax rate | 19 | | currency | String | Currency | EUR | ### totals.original | Field | Type | Description | Example | | --- | --- | --- | --- | | price | Number | Original aggregated net price | 16.64 | | grossPrice | Number | Original aggregated gross price | 19.8 | | tax | Number | Original aggregated tax amount | 3.16 | | taxRate | Number | Original tax rate | 19 | | currency | String | Currency code | EUR | ### paymentProvider | Field | Type | Description | Example | | --- | --- | --- | --- | | expiresAt | Date/Time | Timestamp until the payment session is valid | 2026-05-04T11:09:32.091+02:00 | | redirectUrl | String (URL) | Redirect URL for the payment provider | [https://test.saferpay.com/vt2/Api/SharedThreeDS/](https://test.saferpay.com/vt2/Api/SharedThreeDS/) ... | | redirectRequired | Boolean | Indicates whether a redirect is required for payment | true | | transactionToken | String | Technical payment transaction token | «redacted» | | isExpressCheckoutInitialized | Boolean | Indicates whether express checkout has already been initialized | false | | id | String (UUID) | Payment provider ID | 210f6011-343d-ee11-93cf-00155d960409 | | name | String | Name of the selected payment provider | Kreditkarte | | paymentMethods | Array | Supported payment methods | see details below in **paymentMethods** | | configuration | Object | Provider-specific technical configuration | see details below in **paymentProvider.configuration** | | sort | Integer | Sort order of the payment provider | 0 | | isDefault | Boolean | Indicates whether this is the default payment provider | true | | isExpressCheckoutSupported | Boolean | Indicates whether express checkout is supported | false | ### paymentMethods | Field | Type | Description | Example | | --- | --- | --- | --- | | methodType | String | Technical type of the supported payment method | Mastercard | ### paymentProvider.configuration | Field | Type | Description | Example | | --- | --- | --- | --- | | saferpayFieldsUrl | String (URL) | URL of the Saferpay hosted fields endpoint | [https://test.saferpay.com/Fields/404227](https://test.saferpay.com/Fields/404227) | | saferpayFieldsLibrary | String (URL) | URL of the Saferpay JavaScript library | [https://test.saferpay.com/Fields/lib/1/saferpay-fields.js](https://test.saferpay.com/Fields/lib/1/saferpay-fields.js) | | saferpayFieldsAccessToken | String | Access token for Saferpay fields integration | «redacted» | ### buyerPerson Contains the buyer information placeholder. | Field | Type | Description | Example | | --- | --- | --- | --- | | email | String | Email address of the buyer | `john@aditus.de` | | firstName | String | First name of the buyer | John | | lastName | String | Last name of the buyer | Snow | | company | String | Company name of the buyer | ADITUS GmbH | | nationality | String | Nationality/country code of the buyer | DE | | salutation | String | Salutation of the buyer | Herr | | vatId | String | VAT ID of the buyer | 0014 | | address | Object | Address details of the buyer | see details below in **buyerPerson.address** | | isPrefilled | Boolean | Indicates whether the buyer information was prefilled | true | | surveyId | Object | Survey reference used for missing buyer data | see details below in **buyerPerson.surveyId** | | isValid | Boolean | Indicates whether the buyer information is valid | true | ### buyerPerson.address | Field | Type | Description | Example | | --- | --- | --- | --- | | street | String | Street name | Strasse der Nationen | | houseNumber | String | House number | 5 | | postalCode | String | Postal code | 30539 | | city | String | City | Hannover | | country | String | Country code | DE | ### buyerPerson.surveyId | Field | Type | Description | Example | | --- | --- | --- | --- | | useCaseName | String | Technical survey use case name | Shop.MissingBuyer | | faireventId | Integer | Internal fair/event ID used for the survey | 194 | | articleIds | Array | Related article IDs | \[\] | ### order | Field | Type | Description | Example | | --- | --- | --- | --- | | id | String (UUID) | Order ID | b59ebc98-9047-f111-93e7-00155d96040a | | orderDate | Date/Time | Timestamp when the order was created | 2026-05-04T10:09:48.7419754 | | number | String | Business order number | 6565-2026-6565622626 | ### termsOfService All consent/terms entries displayed during the checkout process. | Field | Type | Description | Example | | --- | --- | --- | --- | | uniqueId | String (UUID) | Unique identifier of the consent entry | 4777d894-1751-44a7-9d96-57a4479e05a0 | | displayOrder | Integer | Display order of the consent entry | 1 | | version | String | Version of the consent/policy | 1.0 | | content | String (HTML/Text) | Content shown to the user during checkout | Ich akzeptiere die Allgemeinen Geschäftsbedingungen | | consentPolicy | String | Policy type of the entry | Mandatory | | isApproved | Boolean | Indicates whether the consent was approved | true | | countries | Array | Country restrictions for the consent entry | \[\] | | reconfirmationRequired | Boolean | Indicates whether reconfirmation is required | false | ## Ticket purchase and registration Human documentation: https://developers.aditus.com/docs/webhooks/ticket-purchase-and-registration The webhooks in the **Ticket Purchase and Registration** area provide all the essential information to represent the complete order and registration process within your own systems. They cover the entire lifecycle of a ticket — from the creation of a cart, through payment processing, to the final registration and any subsequent modifications. Each event is clearly defined and delivered with a structured **payload object**. These payloads contain all relevant details about the state of the cart, the buyer, and the transaction. This allows you to integrate webhook events directly into your workflows without repeatedly polling the API. ### Events The webhooks in this area cover the following categories of events: - **Cart Events**: - `cart.created` – New cart created - `cart.itemsAdded` / `cart.itemsRemoved` – Items added or removed - `cart.deleted` – Cart deleted - `cart.propertiesModified` – Cart properties modified - `cart.checkedout` – Checkout process initiated - `cart.expressCheckoutInitialized` – Express checkout initialized - **Buyer & Payment Events**: - `cart.buyerSet` / `cart.userSet` – Buyer or user details set - `cart.itemRegistrationUpdated` – Registration status of specific items updated - `cart.billingSet` – Billing details provided - `cart.paymentProviderSet` / `cart.paymentProviderRemoved` – Payment provider added or removed - **Coupon & Discount Events**: - `cart.couponAdded` / `cart.couponRemoved` – Coupons applied or removed - **Legitimation & Document Events**: - `cart.legitimationAdded` – Legitimation process added - `cart.legitimationDocumentAdded` / `cart.legitimationDocumentRemoved` – Documents uploaded or removed Here is a flow diagram showing the typical lifecycle of a shopping cart through all webhook events, organized by phase: ### **Cart Events**: ### cart.created – New cart created As soon as a ticket is added to the cart a new cart is created in the shop and the `cart.created` webhook is automatically generated and sent. It provides real-time notification that a new checkout process has started and delivers the initial metadata as well as the complete cart state after creation. The event can be used, among other things, to: - persist session and tracking information related to the cart - assign affiliate / campaign parameters (via downstream Shop API calls) - create early CRM leads before any products or buyer data are available **Use Case: Cart Tracking for Event Registration** - A visitor opens the ticket shop for the event “Experience Days 2026” - The visitor clicks the plus sign (`+`) to add a ticket - The shop creates a new cart - The `cart.created` webhook is triggered and sends the `cartId` as well as the event data (`event.id`, `event.name`) to the target system - The target system stores the `cartId` and links it to the event **Trigger Condition** The `cart.created` event is sent exactly once for each newly created cart. **Webhook payload sample** ``` json { "event": "cart.created", "event_id": "75c3d187-23e6-484e-b1ab-1fcd3e0a6266", "event_time": "2026-05-28T12:39:48.7658492+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/shop/v1/cart/47956bd9-7685-495b-ba7c-9ccc4646f7e7", "endpoint_url": "https://integration.aditus.de/api/webhook/receive/aditus_demo_aditus_ticketshop_insightly", "data": { "cartCreated": { "cartId": "47956bd9-7685-495b-ba7c-9ccc4646f7e7" }, "cart": { "id": "47956bd9-7685-495b-ba7c-9ccc4646f7e7", "expiryTime": "2026-12-31T23:59:00+01:00", "event": { "id": "c583f735-cbc9-ef11-93d9-00155d96040a", "name": "Imagination Expo 2025-2026", "year": "2025", "number": "2906", "slug": "im26", "externalId2": "im26" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isPendingPayment": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "isPrefilled": false, "surveyId": { "useCaseName": "Shop.MissingBuyer", "faireventId": 124, "articleIds": [] }, "isValid": false }, "status": "Active", "culture": "en", "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "I accept the Terms of Use", "consentPolicy": "Mandatory", "isApproved": false, "countries": [], "reconfirmationRequired": false }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "You can find detailed information on how your personal information will be used in our Privacy Policy", "consentPolicy": "None", "isApproved": false, "countries": [], "reconfirmationRequired": false } ] } } } ``` **Fields in detail** | Feld | Typ | Beschreibung | Beispiel | | --- | --- | --- | --- | | cartId | String (UUID) | ID of the newly creates cart | 4c554bc4-1756-43f9-80c8-230fd6613201 | (Since all other fields have already been explained above, they will not be discussed further here; only the fields specifically relevant to the webhook are considered.) ### cart.itemsAdded / cart.itemsRemoved – Items added or removed These webhook events are triggered when items are added to or removed from an existing cart. The payload contains the action data with references to the affected items, as well as the complete updated cart state (`cart`) after the change. The event can be used, among other things, to: - reserve quotas when items are added - trigger cart value-based actions (for example upselling or discount thresholds) - track and analyze item selections **Use Case: Quota Reservation in Event Ticketing** - A visitor selects a DayTicket in the ticket shop for “Experience Days 2026” - The shop adds the ticket to the cart - The `cart.itemsAdded` webhook is triggered and sends the `cartId`, the affected items, as well as the updated cart state to the target system - The target system reserves the quota for the selected item - If the visitor changes their mind and removes the ticket, `cart.itemsRemoved` is triggered and the quota is released again **Trigger Condition** `cart.itemsAdded` is sent when one or more items have been added to the cart `cart.itemsRemoved` is sent when one or more items have been removed from the cart **Webhook payload sample** ``` json { "event": "cart.itemsAdded", "event_id": "8cb6e3d9-83da-4b6d-b00b-03628c19e85a", "event_time": "2026-05-29T03:26:09.027688+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/shop/v1/cart/d2fbe897-f2f6-4811-8822-24286947c08d", "endpoint_url": "https://integration.aditus.de/api/webhook/receive/aditus_demo_aditus_ticketshop_insightly", "data": { "itemsAdded": { "cartId": "d2fbe897-f2f6-4811-8822-24286947c08d", "article": { "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "id": "62473c6b-6a98-f011-93e1-00155d96040a", "name": "Upgrade 2 Regression", "internalName": "Upgrade 2 Regression", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:62473c6b-6a98-f011-93e1-00155d96040a&language=de&foregroundColor=#FF0000", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "622", "amount": { "remaining": 4999, "total": 5000 }, "configuration": { "remainingAmountDisplayMode": "ExactNumbers", "remainingAmountPerTimeslotDisplayMode": "ExactNumbers", "remainingAmountThresholdPercent": 10, "showIfSoldOut": true, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 10, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "timeslots": [] }, "items": [ { "reservation": { "id": "006380c1-0000-0000-0000-000000000000", "validUntil": "2026-05-29T03:26:08.8092056+02:00" }, "item": { "id": "006380c1-0000-0000-0000-000000000000" } } ], "problems": [] }, "cart": { "id": "d2fbe897-f2f6-4811-8822-24286947c08d", "expiryTime": "2026-12-31T00:00:00+01:00", "event": { "id": "e1cf8a37-b197-f011-93e1-00155d96040a", "name": "Regressionstest", "year": "2025", "number": "2025", "slug": "regression", "externalId2": "regression" }, "promotionCodes": [], "items": [ { "id": "006380c1-0000-0000-0000-000000000000", "article": { "id": "62473c6b-6a98-f011-93e1-00155d96040a", "name": "Upgrade 2 Regression", "internalName": "Upgrade 2 Regression", "sort": 0, "prices": [ { "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } } ], "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:62473c6b-6a98-f011-93e1-00155d96040a&language=de&foregroundColor=#FF0000", "type": "Icon" }, "type": "VisitorTicket", "ticketValidity": "None", "articleNumber": "622", "configuration": { "remainingAmountDisplayMode": "None", "remainingAmountPerTimeslotDisplayMode": "None", "remainingAmountThresholdPercent": 0, "showIfSoldOut": false, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 10, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true } }, "promotionCodes": [], "price": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "registration": { "isValid": false, "problems": [ { "code": 2205, "category": "Registration", "message": "The item requires a registration but no registration information was provided", "name": "ItemRegistrationRequirement", "details": { "affectedItem": "006380c1-0000-0000-0000-000000000000" } } ], "isRequired": true, "isPossible": true, "types": { "self": { "isPossible": true, "survey": { "useCaseName": "Shop.Registration.Self", "faireventId": 190, "articleIds": [ 2910 ] }, "hasToBeCompletedByTicketOwnerHimself": true }, "thirdPerson": { "isPossible": true, "survey": { "useCaseName": "Shop.Registration.ThirdPersonByHimself", "faireventId": 190, "articleIds": [ 2910 ] }, "hasToBeCompletedByTicketOwnerHimself": false } } }, "legitimation": { "isRequired": false, "isIncomplete": false }, "timeslots": { "isEnabled": false, "isValid": true, "bookings": [] } } ], "totals": [ { "original": { "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" }, "price": 16.81, "grossPrice": 20, "tax": 3.19, "taxRate": 19, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isPendingPayment": false, "isRegistrationOnly": false, "isRegistrationRequired": true, "isLegitimationRequired": false, "isPaymentRequired": true, "buyerPerson": { "isPrefilled": false, "surveyId": { "useCaseName": "Shop.MissingBuyer", "faireventId": 190, "articleIds": [] }, "isValid": false }, "status": "Active", "culture": "de", "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Ich akzeptiere die Allgemeinen Geschäftsbedingungen", "consentPolicy": "Mandatory", "isApproved": false, "countries": [], "reconfirmationRequired": false }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Ausführliche Informationen darüber, wie Ihre persönlichen Daten verwendet werden, finden Sie in unserem Datenschutzhinweis", "consentPolicy": "None", "isApproved": false, "countries": [], "reconfirmationRequired": false } ] } } } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | `cartId` | String (UUID) | ID of the affected cart | `a1a1a7d2-110f-4691-8739-319578ff8568` | | `article` | Object | Complete article object with prices, groups, and configuration | see below | | `article.prices[]` | Array | List of price objects with current and original price | | | `article.prices[].price` | Object | Current price (price, grossPrice, tax, taxRate, currency) | `{ "price": 16.8, "grossPrice": 19.99, ... }` | | `article.prices[].originalPrice` | Object | Original price (same structure as `price`) | | | `article.articleGroup` | Object | Article group with ID, name, description, and configuration | | | `article.articleGroup.id` | String (UUID) | Article group ID | `58fabcf1-17fe-41e4-aadb-b8a63f98668c` | | `article.articleGroup.name` | String | Article group name | `Example ArticleGroup Name` | | `article.articleGroup.configuration.maxNumberOfTicketsPerSale` | Integer | Max. tickets per purchase (group level) | `1` | | `article.id` | String (UUID) | Article ID | `2a283eeb-88b3-ee11-93d1-00155d96040a` | | `article.name` | String | Display name of the article | `Example Article Name` | | `article.description` | String | Description of the article | `Example Article Description` | | `article.image` | Object | Image information (key, uri, type, background, size) | | | `article.sort` | Integer | Sort order | `0` | | `article.isLegitimationRequired` | Boolean | Whether legitimation/identification is required | `true` | | `article.legitimationCategory` | Object | Legitimation category with available proof types | | | `article.legitimationCategory.id` | String (UUID) | Legitimation category ID | `d96fbfb4-ca06-ef11-93d7-00155d96040a` | | `article.legitimationCategory.availableProofTypes[]` | Array | Available proof types with document types | | | `article.type` | Integer | Article type (numeric) | `256` | | `article.category` | String | Category of the article | `Example Categroy01` | | `article.amount.remaining` | Integer | Remaining quota/stock | `9771` | | `article.configuration` | Object | Article configuration (display, limits, etc.) | | | `items[]` | Array | List of reserved line items | see below | | `items[].reservation.id` | String (UUID) | Reservation ID | `a6c0a981-8312-ef11-93d7-00155d96040a` | | `items[].reservation.validUntil` | Date/Time (ISO 8601) | Reservation validity | `2024-08-15T15:43:28.1621714+02:00` | | `items[].item.id` | String (UUID) | Line item ID | `5b4ffaab-f75b-4627-8d2a-b703ddb84a89` | | `problems[]` | Array | List of problems/errors (empty if none) | `[]` | **Note:** Depending on how an article is configured, the fields contained in the payload may also vary accordingly. This means that some fields are only present in specific scenarios, while other fields may be omitted depending on the article type, registration requirements, legitimation settings, timeslot handling, or pricing logic. The actual structure of a payload therefore always depends on the functional and technical configuration of the respective article. For **itemsRemoved**, the payload contains `cartId` and an `items[]` array. Each item contains `itemId` (String UUID), `successful` (Boolean), and a complete `article` object with the same structure as in `itemsAdded` (prices, articleGroup, image, legitimationCategory, etc.). ``` json { "event": "cart.itemsRemoved", "event_id": "313e0d3b-2fed-4040-a3b5-30013b71eb05", "event_time": "2026-06-09T10:17:24.4108855+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/shop/v1/cart/3e73dff8-e7a9-4521-83e7-d7ec8400ba42", "endpoint_url": "https://integration.aditus.de/api/webhook/receive/aditus_demo_aditus_ticketshop_insightly", "data": { "itemsRemoved": { "cartId": "3e73dff8-e7a9-4521-83e7-d7ec8400ba42", "items": [ { "itemId": "00406eb5-0000-0000-0000-000000000000", "successful": true, "article": { "prices": [ { "price": { "price": 21.01, "grossPrice": 25, "tax": 3.99, "taxRate": 19, "currency": "EUR" }, "originalPrice": { "price": 21.01, "grossPrice": 25, "tax": 3.99, "taxRate": 19, "currency": "EUR" } } ], "articleGroup": { "id": "81da9e9e-bb12-ef11-93d7-00155d96040a", "name": "Visitor Tickets ", "sort": 1, "isExpanded": false, "configuration": {} }, "id": "68666502-8208-ef11-93d7-00155d96040a", "name": "Tagesticket", "internalName": "Tagesticket", "description": "The Day Ticket for the Experience Days gives you flexible access to one event day of your choice. Enjoy an inspiring program featuring engaging keynote sessions, hands-on workshops, and interactive formats focused on current trends, innovations, and best practices. Connect with industry experts and peers, exchange ideas, and expand your network in a dynamic event environment. The Day Ticket is ideal for anyone looking to gain valuable insights and fresh perspectives within a single day.", "image": { "key": "Default.OneDayTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/OneDayTicket?context=article:68666502-8208-ef11-93d7-00155d96040a&language=de&foregroundColor=#00A4CC", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "type": "VisitorTicket", "ticketValidity": "OneDay", "articleNumber": "110", "category": "VISITOR", "amount": { "remaining": 12806, "total": 14988 }, "configuration": { "remainingAmountDisplayMode": "TrafficLight", "remainingAmountPerTimeslotDisplayMode": "TrafficLight", "remainingAmountThresholdPercent": 15, "showIfSoldOut": true, "maxLengthOfDescription": 808464434, "maxNumberOfTicketsPerSale": 20, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "timeslots": [] } } ] }, "cart": { "id": "3e73dff8-e7a9-4521-83e7-d7ec8400ba42", "expiryTime": "2026-12-31T23:59:00+01:00", "event": { "id": "67666502-8208-ef11-93d7-00155d96040a", "name": "Experience Days", "year": "2026", "number": "01", "slug": "ExperienceDays2026" }, "promotionCodes": [], "items": [], "totals": [ { "original": { "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" }, "price": 0, "grossPrice": 0, "tax": 0, "taxRate": 0, "currency": "EUR" } ], "isImmutable": false, "isPaymentImmutable": false, "isLegitimationImmutable": false, "isRegistrationImmutable": false, "isAmountImmutable": false, "isPendingPayment": false, "isRegistrationOnly": false, "isRegistrationRequired": false, "isLegitimationRequired": false, "isPaymentRequired": false, "buyerPerson": { "isPrefilled": false, "surveyId": { "useCaseName": "Shop.MissingBuyer", "faireventId": 82, "articleIds": [] }, "isValid": false }, "status": "Active", "culture": "de", "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Ich akzeptiere die Allgemeinen Geschäftsbedingungen", "consentPolicy": "Mandatory", "isApproved": false, "countries": [], "reconfirmationRequired": false }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Ausführliche Informationen darüber, wie Ihre persönlichen Daten verwendet werden, finden Sie in unserem Datenschutzhinweis", "consentPolicy": "None", "isApproved": false, "countries": [], "reconfirmationRequired": false } ] } } } ``` ### cart.deleted - Cart deleted This webhook event is triggered when a cart is **deleted** by the system and no longer exists as an active cart. Since the cart has already been deleted, the payload does not contain a complete `cart` object — it only includes the `cartId` of the deleted cart. - Release reserved quotas or resources - Clean up internal data records and caches - Notify downstream systems about the deletion Typical use cases: **Use Case: Cleanup of reserved resources after cart deletion** 1. A visitor adds a DayTicket with a timeslot to the cart in the ticket shop for "Experience Days 2026" 2. The target system reserves the corresponding quota via the `cart.itemsAdded` event 3. The visitor does not complete the checkout – after the session timeout, the system automatically deletes the cart 4. The `cart.deleted` webhook is triggered and sends only the `cartId` to the target system 5. The target system matches the `cartId` against cached data from previous events and releases the reserved timeslots/quotas **Trigger Condition** - **cart.deleted** is sent when a cart is permanently deleted – e.g., due to session expiration, manual deletion, or system-side cleanup. **Webhook payload sample** ``` json "data": { "cartDeleted": { "cartId": "c6a42702-51e5-481b-96ac-9a153644b114" }, "cart": null } ``` **Note:** Unlike other cart events (e.g., `cart.itemsAdded`), `cart.deleted` does not contain a complete `cart` object, since the cart has already been deleted at the time of delivery. **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | `cartId` | String (UUID) | ID of the deleted cart | `a1a1a7d2-110f-4691-8739-319578ff8568` | ### cart.propertiesModified This webhook event is triggered when additional properties of a shopping cart have been changed or added (e.g., affiliate IDs or tracking parameters). The event can be used, among other things, to: - Capture marketing attributions (e.g., affiliate tracking) - Assign shopping carts to specific campaigns or partners - Control personalized data flows based on shopping cart metadata **Use Case: Affiliate Attribution via URL Parameters** 1. A visitor arrives at the ticket shop via a partner link. 2. The shop recognizes the parameter and stores it as a property on the shopping cart 3. The webhook `cart.propertiesModified` is triggered and sends the `cartId` along with the updated `properties` to the target system. 4. The target system (e.g., a CRM or commission system) links the shopping cart to the affiliate partner "Super_Affiliate". 5. During a subsequent checkout, the commission can be correctly attributed to the partner. **Trigger Condition** The event `cart.propertiesModified` is triggered when: - The `properties` of an existing shopping cart are updated via the API (e.g., through tracking scripts or manual API calls). Webhook payload sample ``` json "data": { "propertiesModified": { "cartId": "8d0c9108-e5b2-4571-bc4d-b1c5f60cbbdd", "properties": { "utm": "Super_Affiliate" } }, "cart": {... ``` **Fields in detail:** | **Field** | **Type** | **Description** | **Example** | | --- | --- | --- | --- | | `cartId` | String (UUID) | Unique ID of the affected shopping cart | `a1a1a7d2-110f-4691-8739-319578ff8568` | | `properties` | Object | Map of key-value pairs of the modified properties | `{"aid": "Super_Affiliate"}` | | `properties.aid` | String | | Affiliate ID for assigning commissions or campaigns | ### cart.checkedout This webhook event is triggered when a shopping cart has been **successfully completed (checkout)** and an **order has been created**. The event contains comprehensive information about the shopping cart, the order, the buyer, the articles (e.g. tickets), registration data, and payment processing. The event can be used by external systems to, among other things: - Process orders further - Synchronize buyer and attendee data - Trigger follow-up processes in CRM, ERP, badge, or analytics systems As this payload has already been described in greater detail as the reference example in the previous chapter, it will not be discussed further in this section. For additional information, please see: [Webhooks](https://aditus.postman.co/workspace/ADITUS~5acae564-1608-4e3d-ad12-187d430355f6/folder/18764460-2a111f3c-4415-47a4-a9b0-0a1395cfeb01?action=share&source=copy-link&creator=55037788&ctx=documentation) ### cart.expressCheckoutInitialized This webhook event is triggered when an **express checkout process** (e.g., via PayPal Express or Apple Pay) has been successfully initialized for a shopping cart. The event can be used, among other things, to: - Synchronize the cart status in external systems - Generate analytics on initiated express payment processes - Make UX adjustments, as the cart may now be locked for regular modifications **Use Case: Tracking Express Payment Abandonments** 1. A visitor clicks the "PayPal Express" button in the shopping cart. 2. The shop initializes the interface to the payment provider. 3. The webhook `cart.expressCheckoutInitialized` is triggered and sends the `cartId` to the target system. 4. The target system marks the cart as "Payment Initiated". 5. If no `cart.checkedout` event occurs within a defined time window, the system can record the abandonment for statistics. Trigger Condition The event `cart.expressCheckoutInitialized` is triggered when: - A user starts an express checkout process and the technical initialization with the provider was successful. **Webhook payload sample** ``` json "expressCheckoutInitialized": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568" } ``` **Fields in detail:** | **Field** | **Type** | **Description** | **Example** | | --- | --- | --- | --- | | `cartId` | String (UUID) | Unique ID of the affected shopping cart | `a1a1a7d2-110f-4691-8739-319578ff8568` | ### **Buyer & Payment Events**: ### cart.buyerSet / cart.userSet- Buyer or user details set These webhook events are triggered as soon as buyer or user details have been set for an existing cart in the shop. Both events deliver the updated cart state after the change. Typical uses include synchronizing user and buyer information to third-party systems (e.g., CRM/ERP) and completing cart-related metadata along the checkout flow. - `cart.userSet` – User details have been stored on the cart (e.g., linking to an existing user ID, verification status, email). - `cart.buyerSet` – Buyer details (billing/buyer person) have been captured on the cart. **Use Case: Synchronizing Buyer Data** 1. A visitor adds items to the cart in the shop and proceeds to checkout. 2. In the checkout form, the visitor enters their buyer details (name, address, email). 3. The shop saves the details on the cart and triggers the `cart.buyerSet` webhook. 4. The target system (e.g., CRM or ERP) receives the payload with the `buyerPerson` data. 5. The target system creates a new contact or updates the existing record based on the transmitted buyer information. **Use Case: Linking an Existing User Account to the Cart** 1. A visitor adds items to the cart without being logged in. 2. During checkout, the visitor signs in with their existing user account. 3. The shop assigns the user ID to the cart and triggers the `cart.userSet` webhook. 4. The target system receives the `userId` and `cartId` from the payload. 5. The target system links the cart to the customer profile to provide, e.g., personalized offers or order histories. Trigger Conditions - `cart.userSet` is sent when the user for a cart has been set or updated. - `cart.buyerSet` is sent when the buyer information on the cart has been set or updated. **Webhook payload sample** ``` json "data": { "userSet": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "userId": "79ddcfb8-9e50-ef11-93d8-00155d96040a" }, "cart": {... ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | Unique ID of the affected cart | a1a1a7d2-110f-4691-8739-319578ff8568 | | userId | String (UUID) | ID of the user assigned to the cart | 79ddcfb8-9e50-ef11-93d8-00155d96040a | ``` json "buyerSet": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "buyerPerson": { "firstName": "Max", "lastName": "Muster", "company": "Muster GmbH", "address": { "street": "Musterstraße", "houseNumber": "1", "postalCode": "21345", "city": "Musterstadt", "country": "DE" }, "vatId": "EX123456789" } } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | Unique ID of the affected cart | a1a1a7d2-110f-4691-8739-319578ff8568 | | buyerPerson | Object | Buyer/billing data (see 5.4) | – | **Buyer (buyerPerson)** The buyerPerson object is included both in the buyerSet action object and in the cart object, and contains the buyer/billing information: | Field | Type | Description | Example | | --- | --- | --- | --- | | firstName | String | First name | Max | | lastName | String | Last name | Muster | | email | String | Buyer's email address | [Max@Muster.de](https://mailto:Max@Muster.de) | | company | String | Company name (optional) | Muster GmbH | | address | Object | Address object (see below) | – | | vatId | String | VAT ID (optional) | EX123456789 | **address – Address Object** | Field | Type | Description | Example | | --- | --- | --- | --- | | street | String | Street | Musterstraße | | houseNumber | String | House number | 1 | | postalCode | String | Postal code | 21345 | | city | String | City | Musterstadt | | country | String | Country code (ISO 3166-1 alpha-2) | DE | The buyer section is anchored under buyerPerson in the cart. It is updated with cart.buyerSet and is also relevant in the cart.checkedout payload. Depending on the configuration, fields may vary; the section refers to billing/buyer information that is authoritative for third-party systems. ### cart.itemRegistrationUpdated - Registration status of specific items updated This event is triggered when the registration status of individual items in a shopping cart changes. It enables synchronization and monitoring of registration data at the item level. - Notifies about changes to the registration status of individual cart items. - Enables updating of user interfaces or downstream processes. - Typically used to keep registration data up to date. **Typical Use Cases:** 1. A user edits the registration for a ticket or product in the cart. 2. The registration is saved or updated. 3. The system sends the `cart.itemRegistrationUpdated` event to all registered webhook endpoints. 4. Receiving systems can read and further process the new registration data. 5. The user interface or connected systems are updated accordingly. **Trigger Condition** - The `cart.itemRegistrationUpdated` event is triggered when the registration status or registration data of a specific cart item changes (e.g., new entries, modified answers, status change). **Webhook payload sample** ``` json { "cart": {...}, "itemRegistrationUpdated": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "id": "00000000-0000-0000-0000-000000000000", "registration": { "type": 0, "answers": [ { "isReadOnly": false "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Frau" } ], "hasInformation": true } } ``` The payload contains the affected registration data for the respective cart item. **Fields in detail:** | Field | Type | Description | Example Value | | --- | --- | --- | --- | | cartId | string (UUID) | ID of the affected cart | `a1a1a7d2-110f-4691-8739-319578ff8568` | | id | string (UUID) | ID of the registration/item | `00000000-0000-0000-0000-000000000000` | | registration.type | integer | Registration type (e.g., 0 = Standard) | `0` | | registration.answers | Array | List of answers provided for the registration | `[ { "bindingMember": "[CRM.Persons].SalutationLookup", "value": "Mrs" } ]` | | registration.hasInformation | boolean | Indicates whether registration information is available | `true` | ### cart.billingSet This webhook event is triggered when **billing details** have been successfully captured or set for a shopping cart. This can occur through the user during checkout, via a customer account pre-fill, or through a system integration. - Synchronization of billing address and company data in ERP/CRM - Validation of VAT IDs and trigger for tax logic - Enrichment of B2B reporting (e.g., company name, country, state/county) - Progress tracking in the checkout funnel (step "Billing" completed) **Typical Use Cases: Capture and process billing data** A customer goes through the checkout of an ADITUS web shop and enters their personal data and billing address in the "Billing details" step. After the data is successfully saved, the `cart.billingSet` event is triggered. **Trigger Condition** The `cart.billingSet` event is triggered when: - The billing details for an existing shopping cart have been successfully saved. **Webhook payload sample** ``` json "billingSet": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "billingPerson": { "salutation": "Mr.", "firstName": "Max", "lastName": "Muster", "email": "Max@Muster.de", "company": "Muster GmbH", "nationality": "DE", "address": { "street": "Musterstraße", "houseNumber": "1", "postalCode": "21345", "city": "Musterstadt", "county": "NI", "country": "DE" }, "vatId": "EX123456789" } ``` **Fields in detail:** | Feld | Typ | Beschreibung | Beispiel | | --- | --- | --- | --- | | `cartId` | String (UUID) | Eindeutige ID des betroffenen Warenkorbs | `a1a1a7d2-110f-4691-8739-319578ff8568` | | `billingPerson.salutation` | String | Anrede, frei oder normiert (z. B. „Mr."/„Ms."/„Mx."). | `Mr.` | | `billingPerson.firstName` | String | Vorname der rechnungsführenden Person. | `Max` | | `billingPerson.lastName` | String | Nachname der rechnungsführenden Person. | `Muster` | | `billingPerson.email` | String (E-Mail) | Kontakt-E-Mail für Rechnungsversand und Kommunikation. | `Max@Muster.de` | | `billingPerson.company` | String | Firmenbezeichnung; bei B2C häufig leer. | `Muster GmbH` | | `billingPerson.nationality` | String (ISO-3166-1 alpha-2) | Nationalität/Staatsangehörigkeit der rechnungsführenden Person. | `DE` | | `billingPerson.address.street` | String | Straßenname. | `Musterstraße` | | `billingPerson.address.houseNumber` | String | Hausnummer inkl. Zusätze. | `1` | | `billingPerson.address.postalCode` | String | Postleitzahl (nicht immer numerisch in allen Ländern). | `21345` | | `billingPerson.address.city` | String | Ort/Stadt. | `Musterstadt` | | `billingPerson.address.county` | String | Bundesland/County/Region nach Shopsystem-Definition. | `NI` | | `billingPerson.address.country` | String (ISO-3166-1 alpha-2) | Ländercode des Rechnungsadress-Landes. | `DE` | | `billingPerson.vatId` | String | Umsatzsteuer-ID (VAT). Für B2B/innergemeinschaftliche Lieferungen relevant. | `EX123456789` | ### cart.paymentProviderSet / cart.paymentProviderRemoved - Payment provider added or removed on Cart The events signal changes to the payment context of an existing shopping cart in the shop: **Use Case: Redirect-Based Payment Flow** A customer selects a payment provider during checkout (e.g., credit card). The shop sets the provider and sends **cart.paymentProviderSet** including `paymentProviderRedirectUrl`. The frontend redirects accordingly. After completion/cancellation, the provider may be removed → **cart.paymentProviderRemoved**. Integrations can track state changes this way. - **Set:** Provider selected → Start redirect as long as `redirectRequired` = true and before `expiresAt`. - **Removed:** Provider removed → Update UI, offer alternative payment method. - **Analytics:** Evaluate events for funnel analysis (selection, redirect, cancellation). - **cart.paymentProviderSet**: A payment provider has been successfully configured on the shopping cart. Optionally, a redirect to the payment provider may be required. - **cart.paymentProviderRemoved**: The configured payment provider has been removed; the shopping cart no longer has an active payment provider. **Trigger Conditions** - **cart.paymentProviderSet** is triggered when a payment provider is set or re-set for a shopping cart. - **cart.paymentProviderRemoved** is triggered when the currently configured payment provider is removed from the shopping cart. - Each set/remove action triggers one event. Multiple events are possible if the payment provider is changed multiple times. **Webhook payload sample** ``` json "paymentProviderSet": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "paymentProviderId": "6b38d727-3dae-ee11-93d1-00155d96040a", "redirectRequired": true, "paymentProviderRedirectUrl": "https://example.com", "expiresAt": "2024-08-15T15:39:17.4196788+02:00" } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | Unique shopping cart ID | `a1a1a7d2-110f-4691-8739-319578ff8568` | | paymentProviderId | String (UUID) | ID of the configured payment provider | `6b38d727-3dae-ee11-93d1-00155d96040a` | | redirectRequired | Boolean | Indicates whether a redirect to the payment provider is required | `true` | | paymentProviderRedirectUrl | URL | Target URL for the redirect | [https://example.com/](https://example.com/) | | expiresAt | Date/Time (ISO 8601) | Expiration time of the redirect session or authorization | `2024-08-15T15:39:17.4196788+02:00` | ``` json "paymentProviderRemoved": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568" } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | Unique shopping cart ID | `a1a1a7d2-110f-4691-8739-319578ff8568` | ### **Coupon & Discount Events**: ### cart.couponAdded / cart.couponRemoved - Coupons applied or removed These webhook events are triggered when a coupon/voucher code is registered or removed from the shopping cart in the shop. Both events deliver the action data (including the code and, if applicable, affected assortments/articles) as well as – in accordance with the webhooks concept – the updated cart state in the response of the underlying API operation. - **cart.couponAdded** – A coupon was successfully registered on the cart (including result, reservation, and optionally article/assortment-related effects). - **cart.couponRemoved** – A previously applied coupon was removed. **Trigger Condition** - `cart.couponAdded` is sent when a valid voucher/promotion code has been registered on the cart. - `cart.couponRemoved` is sent when an existing voucher code has been removed from the cart. **Webhook payload sample** ``` json "data": { "couponAdded": { "cartId": "d83b2260-fe4a-4940-88a4-31f8653d915d", "code": "Rchx4682a6t638", "registrationResult": { "message": "OK", "code": "OK" }, "affectedAssortments": [ { "id": "5c279a0e-5c98-f011-93e1-00155d96040a", "name": "Registrierung", "description": "Wird für den REGRESSIONSTEST verwendet!\r\n\r\nHier kommen Sie zur freien Registrierung.\r\n", "sort": 0, "isDefault": false, "showInShop": false } ], "codeType": "Voucher", "reservation": { "id": "0062f922-0000-0000-0000-000000000000", "validUntil": "2026-06-09T14:47:58.2730833+02:00" }, "article": { "id": "862e0cc5-5b98-f011-93e1-00155d96040a", "name": "Freie Registrierung Regression", "internalName": "Freie Registrierung Regression", "image": { "key": "Default.PermanentTicket", "uri": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/Images/Shop/ArticleImage/Default/PermanentTicket?context=article:862e0cc5-5b98-f011-93e1-00155d96040a&language=de&foregroundColor=#FF0000", "type": "Icon" }, "sort": 0, "isLegitimationRequired": false, "type": "VisitorTicket", "ticketValidity": "AllDays", "articleNumber": "210", "amount": { "remaining": 0, "total": 0 }, "configuration": { "remainingAmountDisplayMode": "ExactNumbers", "remainingAmountPerTimeslotDisplayMode": "ExactNumbers", "remainingAmountThresholdPercent": 10, "showIfSoldOut": true, "maxLengthOfDescription": 250, "maxNumberOfTicketsPerSale": 10, "isInvitationEmailAddressChangePossible": true, "showBadgePreview": true }, "timeslots": [] }, "appearance": { "id": "65d536d7-b397-f011-93e1-00155d96040a", "number": "M0005302", "isIntern": true, "hasWelcomeBanner": false }, "organization": { "id": "eba17e4a-7fd8-ed11-93c2-00155db54d02", "name": "ADITUS GmbH", "hasWelcomeBanner": false } } ``` **Fields in detail:** | Field | Type | Description | Example/Source | | --- | --- | --- | --- | | cartId | String (UUID) | Cart ID | d83b2260-fe4a-4940-88a4-31f8653d915d | | code | String | Entered/registered code | Rchx4682a6t638 | | registrationResult.message | String | Registration result (text) | OK | | registrationResult.code | String | Number | Registration result (code) | | affectedAssortments\[\] | Array | Assortments affected by the code | id, name, description, sort, isDefault, showInShop | | codeType | String | Type of code/voucher | Voucher | | reservation.id | String (UUID) | Reservation ID of the coupon | 0062f922-0000-0000-0000-000000000000 | | reservation.validUntil | Date/Time (ISO 8601) | Expiration time of the reservation | 2026-06-09T14:47:58.2730833+02:00 | | article | Object | Article/service reference of the coupon incl. configuration | see example payload | | article.id | String (UUID) | Article ID | 862e0cc5-5b98-f011-93e1-00155d96040a | | article.name | String | Article name | Freie Registrierung Regression | | article.internalName | String | Internal article name | Freie Registrierung Regression | | article.image | Object | Article image | key, uri, type | | article.sort | Number | Sort order | 0 | | article.isLegitimationRequired | Boolean | Is legitimation required? | false | | article.type | String | Article type | VisitorTicket | | article.ticketValidity | String | Ticket validity period | AllDays | | article.articleNumber | String | Article number | 210 | | article.amount.remaining | Number | Remaining amount | 0 | | article.amount.total | Number | Total amount | 0 | | article.configuration.remainingAmountDisplayMode | String | Display mode for remaining amount | ExactNumbers | | article.configuration.remainingAmountPerTimeslotDisplayMode | String | Display mode for remaining amount per timeslot | ExactNumbers | | article.configuration.remainingAmountThresholdPercent | Number | Threshold percentage for remaining amount display | 10 | | article.configuration.showIfSoldOut | Boolean | Show if sold out? | true | | article.configuration.maxLengthOfDescription | Number | Max length of description | 250 | | article.configuration.maxNumberOfTicketsPerSale | Number | Max tickets per purchase | 10 | | article.configuration.isInvitationEmailAddressChangePossible | Boolean | Can invitation email address be changed? | true | | article.configuration.showBadgePreview | Boolean | Show badge preview? | true | | article.timeslots | Array | Timeslots | \[\] | | appearance.id | String (UUID) | Appearance ID | 65d536d7-b397-f011-93e1-00155d96040a | | appearance.number | String | Appearance number | M0005302 | | appearance.isIntern | Boolean | Internal appearance? | true | | appearance.hasWelcomeBanner | Boolean | Has welcome banner? | false | | organization.id | String (UUID) | Organization ID | eba17e4a-7fd8-ed11-93c2-00155db54d02 | | organization.name | String | Organization name | ADITUS GmbH | | organization.hasWelcomeBanner | Boolean | Has welcome banner? | false | ``` json "couponRemoved": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "code": "Example Code01" } ``` **Fields in detail:** | Field | Type | Description | Example/Source | | --- | --- | --- | --- | | cartId | String (UUID) | Cart ID | a1a1a7d2-110f-4691-8739-319578ff8568 | | code | String | Removed voucher code | Example Code01 | ### **Legitimation & Document Events**: ### cart.legitimationAdded - Legitimation process added The webhook `cart.legitimationAdded` is triggered as soon as a legitimation or identification process has been added to a cart. It serves to inform connected systems in real time that a legitimation is required or has been initiated for a specific cart. - Start or monitoring of a KYC/identification process - Synchronization of the legitimation status with external systems - Trigger for manual or automatic verification processes - Documentation and audit trails for compliance purposes **Trigger Condition** The webhook is triggered **as soon as a legitimation process is added to an existing cart**. Webhook payload sample ``` json "data": { "legitimationAdded": { "cartId": "1ec224d4-42d5-46ae-bb72-90a1aaa71bc5", "legitimationIdentifier": "eyJMZWdpdGltYXRpb25DYXRlZ29yeUlkIjoiYjJlZTc1ZWItZjFlMS1lZTExLTkzZDUtMDAxNTVkOTYwNDBhIiwiSWRlbnRpZmllciI6ImEueWVzYWZhdVx1MDAyQjI2MDYwODVAYWRpdHVzLmRlIiwiVHlwZSI6MX0=" }, "cart": { ... } ``` **Fields in detail:** | **Field** | **Type** | **Description** | **Example** | | --- | --- | --- | --- | | cartId | String (UUID) | Cart ID | `1ec224d4-42d5-46ae-bb72-90a1aaa71bc5` | | legitimationIdentifier | String (Base64) | Base64-encoded identifier containing legitimation category, identifier, and type | `eyJMZWdpdGltYXRpb25DYXRlZ29yeUlkIjoiYjJlZTc1ZWItZjFlMS1lZTExLTkzZDUtMDAxNTVkOTYwNDBhIiwiSWRlbnRpZmllciI6ImEueWVzYWZhdVx1MDAyQjI2MDYwODVAYWRpdHVzLmRlIiwiVHlwZSI6MX0=` | ### cart.legitimationDocumentAdded / cart.legitimationDocumentRemoved - Documents uploaded or removed These webhook events are triggered when a **legitimation document is added** to or **removed** from a cart. The events contain reference information about the affected cart, the document, and the associated legitimation. Typical integration scenarios: - Synchronize legitimation documents in a DMS/ECM system - Trigger KYC or compliance checks - Write audit logs for regulatory requirements - Perform privacy-compliant cleanup when a document is removed **Trigger Condition** - **cart.legitimationDocumentAdded**: Sent after a successful document upload – the legitimation document has been successfully uploaded and assigned to the cart. - **cart.legitimationDocumentRemoved**: Sent after a document is removed – a previously uploaded legitimation document has been removed from the cart. **Webhook payload sample** ``` json "legitimationDocumentAdded": { "cartId": "a1a1a7d2-110f-4691-8739-319578ff8568", "documentId": "LegitimationProof:bb539802-d777-4a98-924c-16e61d36bb0f", "legitimationId": "eyJMZWdpdGltYXRpb25DYXRlZ29yeUlkIjoiZDk2ZmJmYjQtY2EwNi1lZjExLTkzZDctMDAxNTVkOTYwNDBhIiwiSWRlbnRpZmllciI6ImNhcnQubGVnaXRpbWF0aW9uRG9jdW1lbnRBZGRlZCIsIlR5cGUiOjF9" } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | ID of the cart to which the document was assigned | `a1a1a7d2-110f-4691-8739-319578ff8568` | | documentId | String | System-wide document identifier including namespace prefix (`LegitimationProof`) and unique document UUID | `LegitimationProof:bb539802-d777-4a98-924c-16e61d36bb0f` | | legitimationId | String (Base64) | Base64-encoded legitimation identifier containing the category ID, event identifier, and legitimation type | `eyJMZWdpdGltYXRpb25D...` | ``` json "data": { "legitimationDocumentRemoved": { "cartId": "1ec224d4-42d5-46ae-bb72-90a1aaa71bc5", "documentId": { "documentType": "LegitimationProof", "identifier": "d0fc7a76-3bc5-444c-823d-796ca604c568" }, "legitimationIdentifier": "eyJMZWdpdGltYXRpb25DYXRlZ29yeUlkIjoiYjJlZTc1ZWItZjFlMS1lZTExLTkzZDUtMDAxNTVkOTYwNDBhIiwiSWRlbnRpZmllciI6ImEueWVzYWZhdVx1MDAyQjI2MDYwODVAYWRpdHVzLmRlIiwiVHlwZSI6MX0=" } ``` **Fields in detail:** | Field | Type | Description | Example | | --- | --- | --- | --- | | cartId | String (UUID) | ID of the cart | `1ec224d4-42d5-46ae-bb72-90a1aaa71bc5` | | documentId.documentType | String | Document type classification | `LegitimationProof` | | documentId.identifier | String (UUID) | Unique document ID | `d0fc7a76-3bc5-444c-823d-796ca604c568` | | legitimationIdentifier | String (Base64) | Base64-encoded legitimation identifier containing the category ID, identifier, and type | `eyJMZWdpdGltYXRpb25D...` | ## Ticket entry and validation Human documentation: https://developers.aditus.com/docs/webhooks/ticket-entry-and-validation In the **Ticket Entry and Validation** area, webhooks are used to notify external systems in real time about all relevant events related to ticket validation and access control. This enables connected applications to immediately react—for example, to trigger logging, perform security checks, or start follow-up processes. A central example is the **aserv.\[\*\]granted** `event, which is triggered once an entry action has been successfully validated and granted. Similarly,` **aserv.\[\*\]denied** events are triggered when an action is rejected. This ensures that third-party applications are always kept up to date without requiring polling or manual queries. Ticket validation is the core process of the entry flow. Once a ticket has been checked, the system triggers the appropriate event: - **granted events** → when an action is successful - **denied events** → when an action is rejected --- ### Granted Events When a process completes successfully, the corresponding **`granted`** **event** is triggered. This allows external systems to ensure that all downstream processes (e.g., visitor tracking, CRM updates, or security logs) are executed consistently and in real time. ### Supported Granted Events - **`aserv.entryGranted`** – Entry granted - **`aserv.exitGranted`** – Exit granted - **`aserv.blockGranted`** – Block successfully applied - **`aserv.unblockGranted`** – Block successfully removed - **`aserv.badgePrintGranted`** – Badge print granted - **`aserv.badgeReprintGranted`** – Badge reprint granted - **`aserv.customAction1Granted`** – Custom action 1 granted - **`aserv.customAction2Granted`** – Custom action 2 granted - **`aserv.customAction3Granted`** – Custom action 3 granted - **`aserv.customAction4Granted`** – Custom action 4 granted - **`aserv.customAction5Granted`** – Custom action 5 granted - **`aserv.getHistory`** – Retrieve event history **Typical Use Cases:** 1. A visitor scans their ticket (barcode/QR code) at an entry terminal. 2. The system validates the ticket (authorization, validity period, blocks). 3. Entry is granted (`code: 0`, `message: "OK"`). 4. The system triggers the `aserv.entryGranted` event and sends the webhook to all registered endpoints. 5. Receiving systems can process the entry data — e.g., update visitor counts, create CRM entries, or write security logs. **Trigger Condition** - The `aserv.entryGranted` event is triggered when a ticket is scanned at an access control point and the entry validation is **successful** (Entry Granted). **Webhook payload sample for a granted entry** ``` json { "event": "aserv.entryGranted", "event_id": "3d19df0c-4d4e-446d-9a53-49edf3ab6ca1", "event_time": "2026-06-02T14:14:24.6951064+02:00", "endpoint_url": "https://aditus-integration.example.com/api/webhook/receive/aditus_dev_aditus_aserv_cvent_2", "data": { "response": { "code": 0, "message": "OK.", "executePrint": true, "timestamp": "2026-06-02T14:14:24.183978+02:00" }, "request": { "timestamp": "2026-06-02T14:14:24.154+02:00", "barcode": "6864686510000178", "messageId": 385992265, "messageGuid": "8540754c-f01f-43f9-9f7d-c9c5ba0db6ba", "barcodeType": "Unknown", "isOnline": true, "command": "entry", "isTest": false, "user": "admin.example7@aditus.de", "faireventId": "203", "terminalId": "6960" }, "fairevent": { "id": 203, "uniqueId": "7caf52f9-87ef-f011-93e3-00155d960409", "name": "Rdr baut nur ...", "year": "2026", "externalId1": "test-id-1", "externalId2": "Rdr26", "externalId3": "test-id-3" }, "terminal": { "id": 112, "number": "6960", "description": "POS-0112 @ Salzburg — standby", "device": { "id": 133, "number": "50", "dataObjectType": "Framework.Speedys", "identifier": "C4:C6:E6:98:57:78" } }, "article": { "id": 2989, "uniqueId": "e0538711-89ef-f011-93e3-00155d960409", "name": "Rdr baut nur Mist", "type": "Ticket", "number": "865", "ticketType": "VisitorTicket", "badgeCategory": "VISITOR", "externalId1": "test-id-1", "externalId2": "test-id-2", "externalId3": "test-id-3" }, "ticket": { "id": 6767905, "uniqueId": "0b5a81fe-89ef-f011-93e3-00155d960409", "ticketNumberFull": "6864686510000178", "owner": { "id": 287, "uniqueId": "189a84a8-7bf4-ed11-93c6-00155d960409", "firstName": "Maxime", "lastName": "Musterlicher", "nationalityLookup": "DE", "spokenLanguage": "de", "company": "Muster GmbH", "jobTitle": "Schuldner", "salutationLookup": "Frau", "partyNo": "OB0000204" }, "user": { "id": 146, "uniqueId": "132d086b-c7e8-ed11-93c4-00155db54d03", "name": "l.example6@aditus.de", "email": "l.example6@aditus.de", "lastName": "Musterlicher", "firstName": "Maxime", "externalId3": "132d086b-c7e8-ed11-93c4-00155db54d03" } }, "user": { "id": 8842, "uniqueId": "08f984a1-808c-ef11-93d8-00155d96040a", "name": "admin.example7@aditus.de", "email": "admin.example7@aditus.de" } } } ``` --- **Fields in Detail** **response – Result of the Entry Validation** Contains the system's decision regarding the entry request. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `code` | integer | Return code of the entry validation. `0` means "successful". Other values indicate errors or rejections. | `0` | | `message` | string | Human-readable status message describing the result of the validation. | `OK.` | | `executePrint` | boolean | Indicates whether a print action (e.g., badge printing) should be triggered as part of this entry event. `true` = print should be executed. | `true` | | `timestamp` | string (ISO‑8601) | Timestamp at which the system made the entry decision. | `2026-06-02T14:14:24.183978+02:00` | **request – Entry Request (Scan)** Details of the actual scan operation at the terminal. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `timestamp` | string (ISO‑8601) | Timestamp at which the barcode was scanned at the terminal. | `2026-06-02T14:14:24.154+02:00` | | `barcode` | string | Full content of the scanned barcode/QR code. May contain encrypted ticket data or a plain ticket number. | `6864686510000178` | | `messageId` | integer | Internal, sequential message ID for associating the request within the system. | `385992265` | | `messageGuid` | string (UUID) | Unique GUID of the scan request. Used for deduplication and traceability. | `8540754c-f01f-43f9-9f7d-c9c5ba0db6ba` | | `barcodeType` | string | Detected type of the barcode (e.g., `aztec`, `qrcode`, `Unknown`). `Unknown` means the type could not be automatically determined. | `Unknown` | | `isOnline` | boolean | Indicates whether the scan was performed in online mode (`true`) or offline mode (`false`). In offline mode, validation is performed locally. | `true` | | `command` | string | The executed command. Possible values: `entry`, `exit`, `block`, `unblock`, `badgePrint`, `badgeReprint`, `customAction1`–`customAction5`. | `entry` | | `isTest` | boolean | Indicates whether this is a test scan (`true`) or a production scan (`false`). | `false` | | `user` | string | Email address of the user who initiated the scan at the terminal. | `admin.example7@aditus.de` | | `faireventId` | string | Internal ID of the event to which the scan belongs. | `203` | | `terminalId` | string | ID of the terminal at which the scan was performed. | `6960` | **fairevent – Event Information** Information about the fair/event in whose context the entry takes place. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal numeric ID of the event. | `203` | | `uniqueId` | string (UUID) | Global, unique UUID of the event. Used for cross-system referencing. | `7caf52f9-87ef-f011-93e3-00155d960409` | | `name` | string | Name of the event. | `Rdr baut nur ...` | | `year` | string | Year of the event. | `2026` | | `externalId1` | string | First external reference ID (e.g., SAP or Salesforce ID). Enables mapping to third-party systems. | `test-id-1` | | `externalId2` | string | Second external reference ID. May be empty. | `Rdr26` | | `externalId3` | string | Third external reference ID. May be empty. | `test-id-3` | **terminal – Access Terminal** Information about the terminal at which the scan was performed. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal ID of the terminal. | `112` | | `number` | string | Terminal number for identification in on-site operations. | `6960` | | `description` | string | Human-readable description of the terminal, typically including location and status information. | `POS-0112 @ Salzburg — standby` | **device – Device** (within `terminal`) Details about the physical device deployed at the terminal. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal device ID. | `133` | | `number` | string | Device number. | `50` | | `dataObjectType` | string | Type of the device in the system. Possible values: `Framework.MobileScanners`, `Framework.Speedys`, etc. | `Framework.Speedys` | | `identifier` | string | Unique hardware identifier of the device (e.g., MAC address, serial number, or Android ID). | `C4:C6:E6:98:57:78` | **article – Ticket Article** Information about the article (ticket type) underlying the scanned ticket. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal article ID. | `2989` | | `uniqueId` | string (UUID) | Global UUID of the article. | `e0538711-89ef-f011-93e3-00155d960409` | | `name` | string | Short name of the article. | `Rdr baut nur Mist` | | `type` | string | Article type. Typical values: `Ticket`, `Badge`, `Product`. | `Ticket` | | `number` | string | Article number. | `865` | | `ticketType` | string | Specific ticket type. Possible values: `VisitorTicket`, `ExhibitorTicket`, `PressTicket`, etc. | `VisitorTicket` | | `badgeCategory` | string | Badge category assigned to this article. Used for visual differentiation and access control rules. Typical values: `VISITOR`, `EXHIBITOR`, `PRESS`, `VIP`. | `VISITOR` | | `externalId1` | string | First external article reference (e.g., product ID in an ERP system). | `test-id-1` | | `externalId2` | string | Second external reference. May be empty. | `test-id-2` | | `externalId3` | string | Third external reference. May be empty. | `test-id-3` | **ticket – Ticket Information** Information about the specific ticket that was scanned. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal ticket ID. | `6767905` | | `uniqueId` | string (UUID) | Global UUID of the ticket. Used for cross-system referencing. | `0b5a81fe-89ef-f011-93e3-00155d960409` | | `ticketNumberFull` | string | Full ticket number (e.g., as printed on the ticket or encoded in the barcode). | `6864686510000178` | **owner – Ticket Owner** (within `ticket`) The person to whom the ticket belongs (registration data). | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal ID of the ticket owner. | `287` | | `uniqueId` | string (UUID) | Global UUID of the ticket owner. | `189a84a8-7bf4-ed11-93c6-00155d960409` | | `firstName` | string | First name of the ticket owner. | `Maxime` | | `lastName` | string | Last name of the ticket owner. | `Musterlicher` | | `nationalityLookup` | string | Nationality as ISO country code (e.g., `DE`, `US`, `FR`). | `DE` | | `spokenLanguage` | string | Preferred language as ISO language code (e.g., `de`, `en`). | `de` | | `company` | string | Company/organization of the ticket owner. | `Muster GmbH` | | `jobTitle` | string | Job title/position of the ticket owner. | `Schuldner` | | `salutationLookup` | string | Salutation (e.g., `Herr`, `Frau`, `Divers`). | `Frau` | | `partyNo` | string | Unique participant number of the ticket owner in the CRM system. | `OB0000204` | **user – Ticket User** (within `ticket`) The user who uses the ticket (may differ from the owner, e.g., for transferred tickets). | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal user ID. | `146` | | `uniqueId` | string (UUID) | Global UUID of the user. | `132d086b-c7e8-ed11-93c4-00155db54d03` | | `name` | string | Username (typically the email address). | `l.example6@aditus.de` | | `email` | string | Email address of the user. | `l.example6@aditus.de` | | `lastName` | string | Last name of the user. | `Musterlicher` | | `firstName` | string | First name of the user. | `Maxime` | | `externalId3` | string | Third external user reference. May be empty. | `132d086b-c7e8-ed11-93c4-00155db54d03` | **user – System User (Top-Level)** The user who physically performed the scan at the terminal (e.g., security personnel or an automated device account). | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | integer | Internal user ID of the scan operator. | `8842` | | `uniqueId` | string (UUID) | Global UUID of the scan operator. | `08f984a1-808c-ef11-93d8-00155d96040a` | | `name` | string | Username of the scan operator. | `admin.example7@aditus.de` | | `email` | string | Email address of the scan operator. | `admin.example7@aditus.de` | **Note on Additional Events** The same payload structure applies analogously to all other **Granted** events in the Ticket Entry and Validation area. Only the value of the `event` field and the `command` value in `request` change: | Event | `command` Value | Description | | --- | --- | --- | | `aserv.entryGranted` | `entry` | Entry successfully granted | | `aserv.exitGranted` | `exit` | Exit successfully granted | | `aserv.blockGranted` | `block` | Block successfully applied | | `aserv.unblockGranted` | `unblock` | Block successfully removed | | `aserv.badgePrintGranted` | `badgePrint` | Badge print successfully granted | | `aserv.badgeReprintGranted` | `badgeReprint` | Badge reprint successfully granted | | `aserv.customAction1Granted` – `customAction5Granted` | `customAction1`–`customAction5` | Custom action 1–5 successfully executed | ### Denied Events When an action is rejected, the system triggers the corresponding **`denied`** **event**. This allows security mechanisms, monitoring systems, or user feedback processes to be executed immediately and reliably. For **Denied** events (e.g., `aserv.entryDenied`), the `response` object contains a `code ≠ 0` and a corresponding error message in the `message` field. ### Supported Denied Events - **`aserv.entryDenied`** – Entry denied - **`aserv.exitDenied`** – Exit denied - **`aserv.blockDenied`** – Block operation failed - **`aserv.unblockDenied`** – Unblock operation failed - **`aserv.badgePrintDenied`** – Badge print denied - **`aserv.badgeReprintDenied`** – Badge reprint denied - **`aserv.customAction1Denied`** – Custom action 1 denied - **`aserv.customAction2Denied`** – Custom action 2 denied - **`aserv.customAction3Denied`** – Custom action 3 denied - **`aserv.customAction4Denied`** – Custom action 4 denied - **`aserv.customAction5Denied`** – Custom action 5 denied **Webhook payload sample for a denied entry** Depending on the reason for the denial, not all data is available in the response. ``` json { "event": "aserv.exitDenied", "event_id": "c8ad1bab-5970-4127-a751-f8a7269c6fc0", "event_time": "2026-04-24T09:52:51.8349371+02:00", "endpoint_url": "https://webhook.site/7d30a00f-b27b-4e22-96bd-a56201f80bcb", "data": { "response": { "code": 20003, "message": "User not available.", "timestamp": "2026-04-24T09:52:51.1914722+02:00" }, "request": { "timestamp": "2026-04-24T09:52:51.116+02:00", "barcode": "HTTP://QUICO.DE/RRWBWZP97MQCTMDTB/C/| ∀|/T/ADITUS-DEV-0", "messageId": 703472083, "messageGuid": "e6ff71f7-444c-4a41-b2de-f9b8eb1ba5cf", "barcodeType": "Unknown", "isOnline": true, "command": "exit", "isTest": false, "user": "565", "locationId": "6", "faireventId": "203", "terminalId": "35081" }, "fairevent": { "id": 203, "uniqueId": "7caf52f9-87ef-f011-93e3-00155d960409", "name": "Rdr baut nur ...", "year": "2026", "externalId2": "Rdr26" }, "location": { "id": 6, "name": "Ausgang Ost", "number": "LCEN0003", "uniqueId": "6af5cdc0-4a0f-ee11-93c7-00155d96040a" }, "terminal": { "id": 750, "number": "35081", "device": { "id": 1808, "number": "1230", "dataObjectType": "Framework.MobileScanners", "identifier": "b882b166f1ae4d61" } } } } ``` **Note on Additional Denied Events** The same payload structure applies analogously to all other **Denied** events. Only the value of the `event` field and the `command` value in `request` change: | Event | `command` Value | Description | | --- | --- | --- | | `aserv.entryDenied` | `entry` | Entry denied | | `aserv.exitDenied` | `exit` | Exit denied | | `aserv.blockDenied` | `block` | Block operation failed | | `aserv.unblockDenied` | `unblock` | Unblock operation failed | | `aserv.badgePrintDenied` | `badgePrint` | Badge print denied | | `aserv.badgeReprintDenied` | `badgeReprint` | Badge reprint denied | | `aserv.customAction1Denied` – `customAction5Denied` | `customAction1`–`customAction5` | Custom action 1–5 denied | **Key Differences from Granted Events** | Aspect | Granted Events | Denied Events | | --- | --- | --- | | `response.code` | Always `0` | Always `≠ 0` (specific denial reason) | | `response.message` | `OK.` | Describes the denial reason (e.g., `Ticket already used.`) | | `response.executePrint` | May be `true` or `false` | Typically absent (no print on denial) | | Data completeness | All objects are always present | Some objects may be absent depending on the denial reason | | Typical consumers | Visitor tracking, CRM, logging | Security alerts, monitoring, fraud detection, audit logs | ## Changes in Sales Process Human documentation: https://developers.aditus.com/docs/webhooks/changes-in-sales-process The webhooks in the _Changes in the Sales Process_ area inform external systems about all relevant events that occur **after a sale has been completed**. They cover the entire lifecycle of a sale – including cancellations, invoice changes, payment confirmations, and changes to the legitimation status. These events enable connected applications to react in real time to changes in the sales process – for example to: - Synchronize **accounting and ERP systems** (e.g., for invoice changes or incoming payments) - Trigger **cancellation processes** in downstream systems (e.g., refunds, ticket invalidation) - Provide CRM systems with updated buyer and billing information - Monitor and log compliance and legitimation checks - Separate test and production data (e.g., via the test flag) - Keep monitoring dashboards and reporting systems up to date In contrast to the webhooks in the _Ticket Entry and Validation_ area, which focus on physical access, the events in this area relate exclusively to the **commercial process** – i.e., the sale itself, its payment, cancellation, and the associated administrative processes. #### Supported Events The following webhook events are available in this area: - `sale.canceled` - Sale canceled - `sale.testFlagUpdated` - Marked as test flag on sale updated - `sale.invoiceUpdated` - Invoice or buyer details updated - `sale.markAsPaid` - Sale marked as paid - `sale.legitimationStatusChanged` - Legitimation status of sale changed #### Flow (typical) #### General Notes - **Payload structure:** All events in this group follow a uniform base structure with the top-level fields `event`, `event_id`, `event_time`, `endpoint_url`, and `data`. The contents of the `data` object vary depending on the event. - **Data dependency:** Depending on the event and context, individual objects in the payload may be missing or contain additional fields. - **Idempotency:** Receiving systems should use the `event_id` for deduplication to ensure that an event is not processed twice. ### sale.canceled – Sale canceled The webhook event `sale.canceled` is triggered when a previously completed sale is **canceled**. It informs connected systems about the cancellation so they can, for example, initiate refunds, invalidate tickets, or reverse bookings in the ERP system. **Trigger:** The sale transitions to the status `Canceled` – either by the buyer, a back-office user, or an external system. **Webhook payload sample** ``` json { "event": "sale.canceled", "event_id": "e3facb49-67f1-421a-aca0-7435cdd11174", "event_time": "2026-05-29T15:39:10.4396003+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/terp/v1/clearing/sales/1d2ab198-635b-f111-93e7-00155d96040a", "endpoint_url": "https://webhook.site/9657addd-cab4-43a9-b2c4-383597d029c0", "data": { "saleCanceled": { "saleIdentifier": "1d2ab198-635b-f111-93e7-00155d96040a", "success": true, "canceledOn": "2026-05-29T15:39:08.7710564", "canceledReason": "" }, "sale": { "id": "1d2ab198-635b-f111-93e7-00155d96040a", "number": "0815-2025-815523860", "saleTimestamp": "2026-05-29T15:38:05.5904799+02:00", "event": { "id": "f32adbb6-3c9c-ef11-93d8-00155d96040a", "name": "Futurama", "year": "2025", "number": "0815", "slug": "fr25", "dateTimeSpan": { "start": "2025-04-01T08:00:00+02:00", "end": "2026-12-31T09:00:00+01:00" }, "externalId1": "test-id-1", "externalId2": "fr25", "externalId3": "test-id-3" }, "status": { "rawValue": "Canceled", "tags": [ "PaymentNotPaid", "ReceiptNotCreated" ], "isBillingAddressChangeEnabled": false }, "billing": { "id": "de15a99e-635b-f111-93e7-00155d96040a", "firstName": "Theo", "lastName": "Tester", "email": "u.example4+2605291533@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "German", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": { "key": "003", "value": "Lower Saxony (Niedersachsen)" }, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "buyer": { "id": "de15a99e-635b-f111-93e7-00155d96040a", "firstName": "Theo", "lastName": "Tester", "email": "u.example4+2605291533@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "German", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": { "key": "003", "value": "Lower Saxony (Niedersachsen)" }, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "invoice": { "number": "", "grossPrice": 35, "grossPriceFormatted": "€35.00", "currency": "EUR", "status": "NotCreated" }, "payment": { "providerName": "WERO", "status": "NotPaid" }, "receipts": [], "hasTransactions": true, "hasArticles": true, "hasConfirmedReservationTransaction": false, "hasCarts": true } } } ``` **Fields in detail** `saleCanceled` – Cancellation Details This object **only** exists in the `sale.canceled` event and contains the details of the cancellation. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `saleIdentifier` | string (UUID) | UUID of the canceled sale. | `1d2ab198-635b-f111-93e7-00155d96040a` | | `success` | boolean | Indicates whether the cancellation was successful. | `true` | | `canceledOn` | string (ISO‑8601) | Timestamp of the cancellation. | `2026-05-29T15:39:08.7710564` | | `canceledReason` | string | Reason for the cancellation. May be empty if no reason was provided. | `""` | #### `sale` – Sale Data Core information about the canceled sale. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | string (UUID) | UUID of the sale. | `1d2ab198-635b-f111-93e7-00155d96040a` | | `number` | string | Human-readable sale number. | `0815-2025-815523860` | | `saleTimestamp` | string (ISO‑8601) | Timestamp when the sale was originally completed. | `2026-05-29T15:38:05.5904799+02:00` | #### `event` – Event Information (within `sale`) Information about the event (fair/exhibition) in which the sale took place. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | string (UUID) | UUID of the event. | `f32adbb6-3c9c-ef11-93d8-00155d96040a` | | `name` | string | Event name. | `Futurama` | | `year` | string | Event year. | `2025` | | `number` | string | Event number. | `0815` | | `slug` | string | URL-friendly short identifier for the event. | `fr25` | | `dateTimeSpan.start` | string (ISO‑8601) | Event start date/time. | `2025-04-01T08:00:00+02:00` | | `dateTimeSpan.end` | string (ISO‑8601) | Event end date/time. | `2026-12-31T09:00:00+01:00` | | `externalId1` | string | External reference ID 1 (tenant-specific, optional). | `test-id-1` | | `externalId2` | string | External reference ID 2 (tenant-specific, optional). | `fr25` | | `externalId3` | string | External reference ID 3 (tenant-specific, optional). | `test-id-3` | #### `status` – Sale Status | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `rawValue` | string | Status value. Possible values: `Completed`, `Canceled`, `Pending`. | `Canceled` | | `tags` | array of strings | Status tags providing additional context. Possible values: `PaymentPaid`, `PaymentNotPaid`, `ReceiptCreated`, `ReceiptNotCreated`, `LegitimationNew`, `LegitimationAccepted`, `LegitimationRejected`. | `["PaymentNotPaid", "ReceiptNotCreated"]` | | `isBillingAddressChangeEnabled` | boolean | Indicates whether the buyer can still change the billing address. Typically `false` for canceled sales. | `false` | #### `billing` – Billing Contact Billing recipient data for the sale. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `id` | string (UUID) | UUID of the billing contact. | `de15a99e-635b-f111-93e7-00155d96040a` | | `firstName` | string | First name. | `Theo` | | `lastName` | string | Last name. | `Tester` | | `email` | string | Email address. | `u.example4+2605291533@aditus.de` | | `company` | string | Company name. | `ADITUS GmbH` | | `spokenLanguage` | string | Preferred language. | `German` | #### `billing.address` – Billing Address | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `state` | object | State/region. May be empty (`{}`). | `{}` | | `country.key` | string | ISO country code. | `DE` | | `country.value` | string | Country name. | `Germany` | | `county.key` | string | County/region code. | `003` | | `county.value` | string | County/region name. | `Lower Saxony (Niedersachsen)` | | `street` | string | Street name. | `Straße der Nationen` | | `houseNumber` | string | House number. | `5` | | `postalCode` | string | Postal code. | `30539` | | `city` | string | City. | `Hannover` | #### `buyer` – Buyer Contact Same structure as `billing`. Contains the buyer's contact details (may be identical to the billing contact). #### `invoice` – Invoice Data | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `number` | string | Invoice number. May be empty if no invoice was created before the cancellation. | `""` | | `grossPrice` | number | Gross price (incl. VAT). | `35` | | `grossPriceFormatted` | string | Formatted gross price with currency symbol. | `€35.00` | | `currency` | string | ISO currency code. | `EUR` | | `status` | string | Invoice status. Possible values: `Created`, `NotCreated`. | `NotCreated` | #### `payment` – Payment Data | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `providerName` | string | Name of the payment provider. | `WERO` | | `status` | string | Payment status. Possible values: `Paid`, `NotPaid`, `Refunded`. | `NotPaid` | #### `receipts[]` – Receipts Array containing the receipts for the sale. For canceled sales, this array may be **empty** if no invoice was created before the cancellation. | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `number` | string | Receipt number. | `0815-2025-815513750` | | `type` | string | Receipt type. Possible values: `Bill`, `Cancellation`, `BillCorrection`, `PaymentConfirmation`. | `Bill` | | `createdAt` | string (ISO‑8601) | Timestamp when the receipt was created. | `2026-05-29T15:39:08+02:00` | | `url` | string (URL) | URL to download the receipt PDF. | `https://dev.aditus.de/.../receipts/{id}` | #### Boolean Flags (within `sale`) | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `hasTransactions` | boolean | Indicates whether the sale has associated payment transactions. | `true` | | `hasArticles` | boolean | Indicates whether the sale contains articles. | `true` | | `hasConfirmedReservationTransaction` | boolean | Indicates whether a confirmed reservation exists. | `false` | | `hasCarts` | boolean | Indicates whether the sale has associated carts. | `true` | #### Notes on Other Events in This Group | Event | Description | Payload Specifics | | --- | --- | --- | | `sale.canceled` | Sale canceled | Full payload with all objects (as documented above) | | `sale.testFlagUpdated` | Test flag updated | `sale.isTestSale` contains the new value (`true`/`false`) | | `sale.invoiceUpdated` | Invoice/buyer data updated | Updated data in `buyer_address` and/or `billing_address` | | `sale.markAsPaid` | Marked as paid | `sale.salePaymentStatus` = `Paid` | | `sale.legitimationStatusChanged` | Legitimation status changed | Contains the new legitimation status | #### **sale.testFlagUpdated -** Test Flag Updated The webhook event `sale.testFlagUpdated` is triggered when the **test flag** of a sale is changed – i.e., when a sale is marked as a test sale. This allows connected systems to cleanly separate test and production data, for example by excluding test sales from revenue reports, accounting exports, or CRM synchronization. **Trigger:** A back-office user or an external system changes the test flag of an existing sale (from production to test). **Webhook payload sample** ``` json { "event": "sale.testFlagUpdated", "event_id": "3de31295-c9c2-4aa7-88ed-ed2e684374c3", "event_time": "2026-02-16T16:36:45.9123409+01:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/terp/v1/clearing/sales/1287f990-4b0b-f111-93e3-00155d960409", "endpoint_url": "https://webhook.site/9657addd-cab4-43a9-b2c4-383597d029c0", "data": { "saleTestFlagUpdated": { "saleIdentifier": "1287f990-4b0b-f111-93e3-00155d960409", "success": true, "isTest": true }, "sale": { "id": "1287f990-4b0b-f111-93e3-00155d960409", "number": "0815-2025-815518487", "saleTimestamp": "2026-02-16T16:24:27.5569675+01:00", "event": { "id": "f32adbb6-3c9c-ef11-93d8-00155d96040a", "name": "Futurama", "year": "2025", "number": "0815", "slug": "fr25", "dateTimeSpan": { "start": "2025-04-01T08:00:00+02:00", "end": "2026-12-31T23:59:00+01:00" } }, "status": { "rawValue": "Canceled", "tags": [ "PaymentRefunded", "ReceiptCreated", "TestSale" ], "isBillingAddressChangeEnabled": true }, "billing": { "id": "51963397-4b0b-f111-93e3-00155d960409", "firstName": "A", "lastName": "B", "email": "a.example3+260213@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "Deutsch", "address": { "state": {}, "country": { "key": "DE", "value": "Deutschland" }, "county": { "key": "003", "value": "Niedersachsen" }, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "buyer": { "id": "51963397-4b0b-f111-93e3-00155d960409", "firstName": "A", "lastName": "B", "email": "a.example3+260213@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "Deutsch", "address": { "state": {}, "country": { "key": "DE", "value": "Deutschland" }, "county": { "key": "003", "value": "Niedersachsen" }, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "invoice": { "number": "0815-2025-815501039", "grossPrice": 32, "grossPriceFormatted": "32,00 €", "currency": "EUR", "status": "Created" }, "payment": { "providerName": "MasterCard", "status": "Refunded" }, "receipts": [ { "number": "0815-2025-815511669", "type": "Bill", "createdAt": "2026-02-16T16:25:29.584296+01:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/c9abcbb4-fb17-41b2-be7f-a1762c5a3024?s=qnKJLKeDxG9fg" }, { "number": "0815-2025-815501039", "type": "Cancellation", "createdAt": "2026-02-16T16:36:05.4582456+01:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/0d551e1c-a063-4d50-aa2d-8071e483ce33?s=Ty7xWoNkubNysw" } ], "hasTransactions": true, "hasArticles": true, "hasConfirmedReservationTransaction": false, "hasCarts": true } } } ``` **Differences from** `sale.canceled` | Aspect | Difference | | --- | --- | | `data.saleTestFlagUpdated` | **New object** – contains the updated test flag status (see below). Only exists for this event. | | `data.sale.status.tags` | May contain the tag `TestSale` when the sale is marked as a test. | | No `saleCanceled` object | The `saleCanceled` object from `sale.canceled` is not present. | **New Object:** `saleTestFlagUpdated` | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `saleIdentifier` | string (UUID) | UUID of the affected sale. | `1287f990-4b0b-f111-93e3-00155d960409` | | `success` | boolean | Whether the test flag update was successful. | `true` | | `isTest` | boolean | The new value of the test flag. `true` = test sale, `false` = production sale. | `true` | All other fields (`sale`, `buyer`, `billing`, `invoice`, `payment`, `receipts`) follow the same structure as `sale.canceled`. ### **sale.invoiceUpdated** – Invoice or Buyer Data Updated The webhook event `sale.invoiceUpdated` is triggered when **invoice information or buyer data** of an existing sale is subsequently changed – for example, when the VAT ID is added, the billing address is corrected, or the salutation is updated. Connected systems can use this event to keep their invoice records, accounting exports, and CRM entries in sync. **Trigger:** A buyer, back-office user, or external system modifies billing-relevant data of an already completed sale. The system automatically generates a corrected invoice (receipt type `BillCorrection`) and a new invoice reflecting the updated data. **Webhook payload sample** ``` json { "event": "sale.invoiceUpdated", "event_id": "fa01500c-bbc4-4ed4-a1f7-bb794ce633f2", "event_time": "2026-06-03T13:30:29.620173+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/terp/v1/clearing/sales/197bda3f-5cae-f011-93e1-00155d96040a", "endpoint_url": "https://webhook.site/9657addd-cab4-43a9-b2c4-383597d029c0", "data": { "saleInvoiceUpdated": { "saleIdentifier": "197bda3f-5cae-f011-93e1-00155d96040a", "success": true, "changedFields": [ { "fieldName": "SalutationLookup", "oldValue": "", "newValue": "" }, { "fieldName": "VatID", "oldValue": "", "newValue": "1234" } ] }, "sale": { "id": "197bda3f-5cae-f011-93e1-00155d96040a", "number": "6666-2050-6666016123", "saleTimestamp": "2025-10-21T10:59:31.0128298+02:00", "event": { "id": "10b992c5-53e9-ef11-93da-00155d96040a", "name": "Galaxio Expo", "year": "2050", "number": "6666", "slug": "GalaxioExpo2050", "dateTimeSpan": { "start": "3750-01-01T04:20:00+01:00", "end": "3750-12-31T04:20:00+01:00" }, "externalId1": "test-id-1", "externalId2": "GalaxioExpo2050", "externalId3": "test-id-3" }, "status": { "rawValue": "Completed", "tags": [ "PaymentNotPaid", "ReceiptCreated" ], "isBillingAddressChangeEnabled": true }, "billing": { "id": "267bda3f-5cae-f011-93e1-00155d96040a", "salutationLookup": "", "salutation": "", "titleLookup": "Admiral", "title": "Admiral", "firstName": "Seren", "lastName": "Taval", "email": "d.example2+125@aditus.de", "company": "Lyrian Stellar Navy", "spokenLanguage": "German", "vatId": "1234", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": {}, "street": "Deck 3, Admiral’s Wing, Star Dreadnought *Eclipse Crown*", "houseNumber": "3", "postalCode": "55698", "city": "High Orbit Command, Lyra Prime" } }, "buyer": { "id": "267bda3f-5cae-f011-93e1-00155d96040a", "salutationLookup": "", "salutation": "", "titleLookup": "Admiral", "title": "Admiral", "firstName": "Seren", "lastName": "Taval", "email": "d.example2+125@aditus.de", "company": "Lyrian Stellar Navy", "spokenLanguage": "German", "vatId": "1234", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": {}, "street": "Deck 3, Admiral’s Wing, Star Dreadnought *Eclipse Crown*", "houseNumber": "3", "postalCode": "55698", "city": "High Orbit Command, Lyra Prime" } }, "invoice": { "number": "6666-2050-6666013726", "grossPrice": 4.2, "grossPriceFormatted": "€4.20", "currency": "EUR", "status": "Created" }, "payment": { "providerName": "Invoice", "status": "NotPaid" }, "receipts": [ { "number": "6666-2050-6666013726", "type": "Bill", "createdAt": "2026-06-03T13:30:29.0183074+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/450f9c55-2bcf-48ea-958d-6c049d1c7298?s=iVi0zGRlzJ8J2Q" }, { "number": "6666-2050-6666001152", "type": "BillCorrection", "createdAt": "2026-06-03T13:30:28.0108038+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/4f3e612b-eae6-48ea-bbc5-6e3af42d3577?s=UHptPqLuRhl0Q" }, { "number": "6666-2050-6666010105", "type": "Bill", "createdAt": "2025-10-21T10:59:38.9847994+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/367cf02b-1200-406a-853e-f4d9dca8ec52?s=YmepJfT8goIKmg" } ], "hasTransactions": true, "hasArticles": true, "hasConfirmedReservationTransaction": true, "hasCarts": true } } } ``` **Differences from** `sale.canceled` | Aspect | Difference | | --- | --- | | `data.saleInvoiceUpdated` | **New object** – contains details about the update, including a list of changed fields (see below). Only exists for this event. | | `data.sale.billing` / `data.sale.buyer` | May contain additional fields such as `salutationLookup`, `salutation`, `titleLookup`, `title`, and `vatId`. | | `data.sale.receipts` | Typically contains multiple receipts, including the original `Bill`, a `BillCorrection` (canceling the old invoice), and a new `Bill` with the corrected data. | **New Object:** `saleInvoiceUpdated` | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `saleIdentifier` | string (UUID) | UUID of the affected sale. | `197bda3f-5cae-f011-93e1-00155d96040a` | | `success` | boolean | Whether the invoice update was successful. | `true` | | `changedFields` | array | List of fields that were changed (see below). | _(see below)_ | `changedFields[]` **– Changed Fields** | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `fieldName` | string | Name of the changed field. | `VatID` | | `oldValue` | string | Previous value of the field. May be empty. | `""` | | `newValue` | string | New value of the field. | `1234` | **Additional Fields in** **`billing`** **/** **`buyer`** | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `salutationLookup` | string | Salutation key. May be empty. | `""` | | `salutation` | string | Salutation display value. May be empty. | `""` | | `titleLookup` | string | Title key (e.g., `Admiral`, `Dr`, `Prof`). | `Admiral` | | `title` | string | Title display value. | `Admiral` | | `vatId` | string | VAT identification number. | `1234` | All other fields (`sale`, `buyer`, `billing`, `invoice`, `payment`, `receipts`) follow the same structure as `sale.canceled`. ### **sale.markedAsPaid -** Sale Marked as Paid The webhook event `sale.markedAsPaid` is triggered when a sale is **marked as paid** – e.g. manually by a back-office user. Connected systems can use this event to update payment statuses in ERP or accounting systems or trigger fulfillment workflows. **Trigger:** The payment status of an existing sale changes to `Paid`. This typically occurs when an invoice-based payment is received and a manual payment confirmation is entered in the back office. **Webhook payload sample** ``` json { "event": "sale.markedAsPaid", "event_id": "74adee3f-5945-4dc0-baec-52c07e9b8c49", "event_time": "2026-06-10T10:30:16.2283687+02:00", "api_url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/terp/v1/clearing/sales/b71fa607-a664-f111-93e7-00155d96040a", "endpoint_url": "https://webhook.site/92dbc43b-6a18-47a3-b38e-b9c9f96389f1", "data": { "saleMarkedAsPaid": { "saleIdentifier": "b71fa607-a664-f111-93e7-00155d96040a", "success": true }, "sale": { "id": "b71fa607-a664-f111-93e7-00155d96040a", "number": "2906-2025-2906524311", "saleTimestamp": "2026-06-10T10:26:10.2358149+02:00", "event": { "id": "c583f735-cbc9-ef11-93d9-00155d96040a", "name": "Imagination Expo 2025-2026", "year": "2025", "number": "2906", "slug": "im26", "dateTimeSpan": { "start": "2025-01-03T12:00:00+01:00", "end": "2026-12-31T23:59:00+01:00" }, "externalId2": "im26" }, "status": { "rawValue": "Completed", "tags": [ "PaymentPaid", "ReceiptCreated" ], "isBillingAddressChangeEnabled": true }, "billing": { "id": "cb1fa607-a664-f111-93e7-00155d96040a", "salutationLookup": "Herr", "salutation": "Mr.", "firstName": "Max", "lastName": "Muster", "email": "v.example5+test_cancel_purchase_invoice_paid@aditus.de", "company": "Muster GmbH", "spokenLanguage": "English", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": { "key": "012", "value": "Brandenburg" }, "street": "Rheinstraße", "houseNumber": "8", "postalCode": "14513", "city": "Teltow" } }, "buyer": { "id": "cb1fa607-a664-f111-93e7-00155d96040a", "salutationLookup": "Herr", "salutation": "Mr.", "firstName": "Max", "lastName": "Muster", "email": "v.example5+test_cancel_purchase_invoice_paid@aditus.de", "company": "Muster GmbH", "spokenLanguage": "English", "address": { "state": {}, "country": { "key": "DE", "value": "Germany" }, "county": { "key": "012", "value": "Brandenburg" }, "street": "Rheinstraße", "houseNumber": "8", "postalCode": "14513", "city": "Teltow" } }, "invoice": { "number": "2906-2025-2906513863", "grossPrice": 29.75, "grossPriceFormatted": "€29.75", "currency": "EUR", "status": "Created" }, "payment": { "providerName": "Invoice", "status": "Paid" }, "receipts": [ { "number": "2906-2025-2906513863", "type": "Bill", "createdAt": "2026-06-10T10:26:30.7991338+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/9a8e7c7c-4e29-464c-95fd-8e8ea176e13f?s=ybd7sDIGzdZYwQ" }, { "number": "2906-2025-2906513863", "type": "PaymentConfirmation", "createdAt": "2026-06-10T10:30:15.5650549+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/1e2e0420-d9c7-4ccd-8620-4af96969c6dc?s=ybd7sDIGzdZYwQ" } ], "hasTransactions": true, "hasArticles": true, "hasConfirmedReservationTransaction": false, "hasCarts": true } } } ``` **Differences from** `sale.canceled` | Aspect | Difference | | --- | --- | | `data.saleMarkedAsPaid` | **New object** – confirms the successful payment marking (see below). Only exists for this event. | | `data.sale.payment.status` | Value is `Paid`. | | `data.sale.status.tags` | Contains the tag `PaymentPaid`. | | `data.sale.receipts` | May contain a receipt of type `PaymentConfirmation` in addition to the original `Bill`. | **New Object:** `saleMarkedAsPaid` | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `saleIdentifier` | string (UUID) | UUID of the affected sale. | `b71fa607-a664-f111-93e7-00155d96040a` | | `success` | boolean | Whether the payment marking was successful. | `true` | ### sale.legitimationStatusChanged– Legitimation Status Changed The webhook event `sale.legitimationStatusChanged` is triggered when the **legitimation status** of a sale changes – for example, when a buyer's identity verification transitions from `New` to `Accepted` or `Rejected`. Connected systems can use this event to gate ticket fulfillment until legitimation is confirmed, update compliance records, or trigger manual review workflows. **Trigger:** The legitimation status of an existing sale changes (e.g., from `New` to `Accepted`, `Rejected`, or another status). This typically occurs when an automated or manual identity verification process completes. **Webhook payload sample** ``` json { "event": "sale.legitimationStatusChanged", "event_id": "86c1cdd5-1dab-467d-86a0-bb00bec08b6e", "event_time": "2026-06-04T13:42:48.7247624+02:00", "endpoint_url": "https://webhook.site/92dbc43b-6a18-47a3-b38e-b9c9f96389f1", "data": { "saleLegitimationStatusChanged": { "saleIdentifier": "a7e1d74e-0a60-f111-93e7-00155d96040a", "newStatus": "Accepted", "oldStatus": "New", "vettingLevel": 1 }, "sale": { "id": "a7e1d74e-0a60-f111-93e7-00155d96040a", "number": "0815-2025-815524067", "saleTimestamp": "2026-06-04T13:41:27.300632+02:00", "event": { "id": "f32adbb6-3c9c-ef11-93d8-00155d96040a", "name": "Futurama", "year": "2025", "number": "0815", "slug": "fr25", "dateTimeSpan": { "start": "2025-04-01T08:00:00+02:00", "end": "2026-12-31T09:00:00+01:00" }, "externalId1": "test-id-1", "externalId2": "fr25", "externalId3": "test-id-3" }, "status": { "rawValue": "Pending", "tags": [ "PaymentPaid", "ReceiptCreated", "LegitimationNew" ], "isBillingAddressChangeEnabled": true }, "billing": { "id": "b1e1d74e-0a60-f111-93e7-00155d96040a", "firstName": "Thea", "lastName": "Testerin", "email": "u.example4+2606041340@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "Deutsch", "address": { "state": {}, "country": { "key": "AF", "value": "Afghanistan" }, "county": {}, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "buyer": { "id": "b1e1d74e-0a60-f111-93e7-00155d96040a", "firstName": "Thea", "lastName": "Testerin", "email": "u.example4+2606041340@aditus.de", "company": "ADITUS GmbH", "spokenLanguage": "Deutsch", "address": { "state": {}, "country": { "key": "AF", "value": "Afghanistan" }, "county": {}, "street": "Straße der Nationen", "houseNumber": "5", "postalCode": "30539", "city": "Hannover" } }, "invoice": { "number": "0815-2025-815513750", "grossPrice": 15, "grossPriceFormatted": "15,00 €", "currency": "EUR", "status": "Created" }, "payment": { "providerName": "MasterCard", "status": "Paid" }, "legitimation": { "uniqueId": "b7e1d74e-0a60-f111-93e7-00155d96040a", "status": "New" }, "receipts": [ { "number": "0815-2025-815513750", "type": "Bill", "createdAt": "2026-06-04T13:41:31.6002585+02:00", "url": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/receipts/0fd3d819-db3f-4d88-b271-6bebd9db85ab?s=5WLvbY5azK8HKA" } ], "hasTransactions": true, "hasArticles": true, "hasConfirmedReservationTransaction": false, "hasCarts": true } } } ``` **Differences from** `sale.canceled` | Aspect | Difference | | --- | --- | | `data.saleLegitimationStatusChanged` | **New object** – contains the old and new legitimation status as well as the vetting level (see below). Only exists for this event. | | `data.sale.legitimation` | **New object** – contains the legitimation record linked to the sale (see below). Not present in `sale.completed`. | | `data.sale.status.rawValue` | May be `Pending` while legitimation is in progress. | | `data.sale.status.tags` | Contains legitimation-specific tags such as `LegitimationNew`, `LegitimationAccepted`, or `LegitimationRejected`. | | No `api_url` field | The top-level `api_url` field may be absent for this event. | **New Object:** `saleLegitimationStatusChanged` | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `saleIdentifier` | string (UUID) | UUID of the affected sale. | `a7e1d74e-0a60-f111-93e7-00155d96040a` | | `newStatus` | string | The new legitimation status. Possible values: `New`, `Accepted`, `Rejected`, `InReview`. | `Accepted` | | `oldStatus` | string | The previous legitimation status. | `New` | | `vettingLevel` | integer | The vetting level that was evaluated. Higher levels indicate stricter verification. | `1` | **New Object:** **`legitimation`** (within `sale)` | Field | Type | Description | Example Value | | --- | --- | --- | --- | | `uniqueId` | string (UUID) | UUID of the legitimation record. | `b7e1d74e-0a60-f111-93e7-00155d96040a` | | `status` | string | Current legitimation status at the time of the event. | `New` | All other fields (`sale`, `buyer`, `billing`, `invoice`, `payment`, `receipts`) follow the same structure as `sale.canceled`. --- product: ADITUS API module: Exhibitors direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/exhibitors.md humanDocumentation: https://developers.aditus.com/docs/exhibitors endpoints: 4 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Exhibitors This is the machine-readable Markdown version of the **Exhibitors** module of the ADITUS API reference (inbound (your systems call ADITUS), 4 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | POST | `{{API_BASE_URL}}/tasks/exhibitors/import` | Import Exhibitors by Excel | HTTP Basic | | POST | `{{API_BASE_URL}}/tasks/exhibitors/import` | Import Exhibitors by JSON | HTTP Basic | | GET | `{{API_BASE_URL}}/tasks/exhibitors/import/{id}` | Get Import Task Status | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/tasks/exhibitors/import/{id}/result` | Get Import Task Result | OAuth 2.0 bearer token (client credentials) | ## Contents - Exhibitors — https://developers.aditus.com/docs/exhibitors - Import — https://developers.aditus.com/docs/exhibitors/import - POST Import Exhibitors by Excel — https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-excel - POST Import Exhibitors by JSON — https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-json - GET Get Import Task Status — https://developers.aditus.com/docs/exhibitors/import/get-import-task-status - GET Get Import Task Result — https://developers.aditus.com/docs/exhibitors/import/get-import-task-result ## Import Human documentation: https://developers.aditus.com/docs/exhibitors/import ### Exhibitor import Use these endpoints to import exhibitors for a specific event via an Excel file or JSON data. The import process is asynchronous. 1. Start an import task. Use 'POST Import Exhibitors by Excel' or 'POST Import Exhibitors by JSON'. 2. Poll the task status until it is complete. Use 'GET Import Task Status'. 3. Retrieve the final result with detailed success/error information. Use 'GET Import Task Result'. ### Data Structure Definition This API describes the data objects used for importing exhibitor-related information into the system. All objects defined here can be used for both **file-based imports** (e.g., CSV or XLSX) and **payload-based imports** (JSON). StartFragment ### **Exhibitor Object** Describes an exhibitor to be imported. ### Fields | Field | Type | Required | Description | | --- | --- | --- | --- | | `Exhibitor_ExternalId` | string | ✅ | Unique identifier of the exhibitor in the source system | | `Exhibitor_Name1` | string | ✅ | Name of the exhibitor | | `Exhibitor_Name2`, `Exhibitor_Name3`, `Exhibitor_Name4` | string | | Extended name information | | `Exhibitor_LineOfBusiness` | string | | Industry or line of business | | `Exhibitor_CountryLookup` | string | | Two-letter ISO country code | | `Exhibitor_SpokenLanguage` | string | | Two-letter ISO language code | | `Exhibitor_Info1` … `Exhibitor_Info32` | string | | Custom text fields for exhibitor-specific information | | `Exhibitor_ExternalId2`, `Exhibitor_ExternalId3` | integer | | Custom external numeric identifiers | --- ### **Fairevent Appearance Object** Describes a specific trade fair appearance of an exhibitor. Each appearance is linked to the **event** context of the import and requires a valid `Exhibitor_ExternalId`. ### Fields | Field | Type | Required | Description | | --- | --- | --- | --- | | `FaireventAppearance_ExternalId` | string | ✅ | Unique identifier of the appearance in the source system | | `FaireventAppearance_Hall` | string | | Hall of the event | | `FaireventAppearance_Floor` | string | | Floor of the event | | `FaireventAppearance_Booth` | string | | Booth number | | `FaireventAppearance_Area` | number | | Booth size in m² | | `FaireventAppearance_CancelledOn` | string | | Cancellation date (format: `"dd.MM.yyyy HH:mm:ss"` or `"dd.MM.yyyy"`) | | `FaireventAppearance_CancelledReason` | string | | Cancellation reason | | `FaireventAppearance_Info1` … `FaireventAppearance_Info30` | string | | Custom text fields | | `FaireventAppearance_ExternalId2`, `FaireventAppearance_ExternalId3` | integer | | Custom numeric identifiers | | `FaireventAppearance_EntryStatus` | string or integer | | Controls ticket access rights:
• `AllOperationsAllowed` / `0` – Both exhibitor and visitor passes allowed
• `ExhibitorTicketsBlocked` / `1` – Exhibitor passes blocked
• `VisitorTicketsBlocked` / `2` – Visitor passes blocked
• `ExhibitorVisitorTicketsBlocked` / `3` – Both blocked
• _Empty_ – No validation performed | --- ### **Contact Data** All contact imports require the field `Exhibitor_ExternalId` to assign contacts to the correct exhibitor. ### a) Email Contacts Describes a business email address of the exhibitor. | Field | Type | Required | Description | | --- | --- | --- | --- | | `EMail` | string | ✅ | Email address in one of the following formats:
`mail@aditus.de`
`mail@aditus.de (Display)`
`'Display'`
`'Display'mail@aditus.de`
`'Display' mail@aditus.de` | `{email}` represents a valid email address. `{display}` may include letters, digits, and spaces. --- ### b) Phone Contacts Describes a business phone number. | Field | Type | Required | Description | | --- | --- | --- | --- | | `Phone` | string | | Business phone number | --- ### c) Generic Contact Data Describes any contact data type (e.g., fax, secondary email, etc.). | Field | Type | Required | Description | | --- | --- | --- | --- | | `Contact_ExternalId` | string | ✅ | Unique contact identifier in the source system | | `Contact_Value` | string | ✅ | Contact value (e.g., email or phone) | | `Contact_ContactNameLookup` | string | | Contact name (default: `"eMailBusiness"`) | | `Contact_ContactTypeLookup` | string | | Contact type (default: `"EMail"`) | | `Contact_Info1` … `Contact_Info10` | string | | Custom text fields | | `Contact_IsMainContact` | boolean | | Indicates if the contact is the main contact | | `Contact_ExternalId2`, `Contact_ExternalId3` | integer | | Custom numeric identifiers | --- ### **Address Data** Describes address data associated with the exhibitor. To import multiple addresses, the exhibitor entry must be repeated with distinct address data. | Field | Type | Required | Description | | --- | --- | --- | --- | | `Address_ExternalId` | string | ✅ | Unique identifier of the address in the source system | | `Address_Street`, `Address_Street2`, `Address_Street3` | string | | Street and additional lines | | `Address_StreetNumber` | string | | Street number | | `Address_Line1` … `Address_Line3` | string | | Address lines | | `Address_City` | string | | City | | `Address_StateOrProvince` | string | | State or province | | `Address_County` | string | | County or region | | `Address_CountryLookup` | string | | Two-letter ISO country code | | `Address_PostalCode` | string | | Postal code | | `Address_PostOfficeBox` | string | | PO Box | | `Address_AddressTypeLookup` | string | | Address type (default: `"Business Address"`) | | `Address_IsMainAddress` | boolean | | Marks the main address | | `Address_Info1` … `Address_Info10` | string | | Custom text fields | | `Address_ExternalId2`, `Address_ExternalId3` | integer | | Custom numeric identifiers | --- ### **Ticket Quotas** Optional ticket quotas may be defined using the format: ``` TicketQuota{XXX} TicketQuota{XXX}ShortCode ``` Where `{XXX}` is a sequential integer (1 ≤ {XXX} ≤ n). Short codes apply to 1:n ticket models and are mandatory if such an article is referenced. If quotas for a given appearance already exist, they will be **updated or extended** — reductions are **not** performed. `FaireventAppearance_ExternalId` is mandatory to assign ticket quotas. --- ### **User Accounts** If configured, user accounts can be automatically created for imported exhibitors. A valid email address (`EMail`) is mandatory. If `FaireventAppearance_ExternalId` is provided, the user receives access to that event appearance. Imported users automatically receive the roles `"BaseRole"` and `"Exhibitor"`. | Field | Type | Required | Description | | --- | --- | --- | --- | | `User_FirstName` | string | | First name | | `User_LastName` | string | | Last name | | `User_DeeplinkToken` | string | | External identifier for ESC DeepLink (unique per user) | | `User_Info1` … `User_Info10` | string | | Custom text fields | If configured, activation emails will be sent after import for all newly created accounts. ### POST Import Exhibitors by Excel - Endpoint: `POST {{API_BASE_URL}}/tasks/exhibitors/import` - Authentication: HTTP Basic - Human documentation: https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-excel #### Import Exhibitors Task This endpoint is used to initiate the "import process for exhibitors" associated with a specific event by uploading an Excel file. By sending a POST request to this endpoint, the backend system creates an ExhibitorImportTask and starts processing the import of exhibitor data asynchronously. #### Auth and Role - **Auth** OAuth 2.0 (inherit from collection) - **Required role** BASEROLE APITASKS #### Request The request object [StartExhibitorImportRequest](https://aditus.atlassian.net/wiki/spaces/API/pages/1671922460/StartExhibitorImportRequest) will be delivered in JSON format. In this variant, you must provide the **File** object containing Excel content. Exactly one of **Data** or **File** must be present — if **Data** is used, see the **JSON** request. - **Method**: POST - **URL**: {{API_BASE_URL}}/tasks/exhibitors/import #### Headers - **Content-Type:** application/json - **Accept**: \*/\* #### Request Body The request body must be in JSON format and contains FaireventId: - **FaireventId**: represents the ID of the fair event for which the exhibitors are being imported. This parameter is essential for identifying the specific event. - **UserImportDate (DateTime?, optional)** – when to send activation mail (if UserImportMode uses ActivationMail). Default is **null** which results in an immediate sending of the e-mail. - **UserImportMode** (enum, optional) – how users are imported. Possible values are: - 0 = NoImport -> **default** -> No users should be imported. - 1 = ActivationMail -> Users should be imported. Activation of accounts will be processed via activation mails. - 2 = DeepLinkImport -> Users should be imported. They should gain access to the system by deep link token read from the import file. - 3 = DeepLinkCreation -> Users should be imported. They should gain access to the system by deep link token read created during import. - 4 = ActiveUser -> The user's account will be immediatly activated - **InformUsers**: If "true" and if ImportMode is "ActiveUser" then the new user gets an e-mail about the details of his account. Default: **false** - **TicketQuotas** Listing of ticket quota column / article mappings. - **ExhibitorAppearanceChangeMode** allows assigning an already imported fairevent appearance to another exhibitor. Possible values are: - NoImport -> An already imported exhibitor appearance remains unaffected. - AssignAnotherExhibitor -> An already imported exhibitor appearance can be assigned to another exhibitor. - **EnableDetailedResult (bool)** include info messages in result. Default: **false** - **CheckSkip (bool)** Enable the check to determine if the file is identical to the previously executed import of the same event. If true, the processing is terminated early and the import execution is skipped. The defalt value: **true**. - **InformExistingExhibitors (bool)** inform existing exhibitor about new appearance. Default: **false** - **File** Exhibitor import Excel file information. #### File object fields ``` json "FileType": "xlsx", "Encoding": "UTF-8", "IsArchive": false, "Data" : (string): Excel content ``` #### Response The response structure will provide feedback on the success or failure of the import operation. While the exact response structure is not detailed here, users can expect a confirmation of the import status, along with any relevant messages or error details if applicable. **201 CREATED** - Default success code for creation - resource has been created successfully. - The location header points to the URL of the created task (**api/tasks/exhibitors/import/{id}**). - Alternatively, you can read `result.import.id` from the response body to build the status URL. **400 BAD REQUEST** Default Error Code - Used if an object has invalid parameters, for more information about this read "Errors". **500 INTERNAL SERVER ERROR** Default Error Code - Used if an exception occurs  #### Next Steps 1\. Poll **GET "**/tasks/exhibitors/import/{id}" until status is "Completed" 2\. Retrieve result with **GET** "/tasks/exhibitors/import/{id}/result" #### Usage - To use this endpoint effectively, ensure that the `FaireventId` is correctly populated with the relevant event data. This will ensure that the import operation targets the correct exhibitors associated with the specified fair event. - Use "EnableDetailedResult=true" to get extended logs in the result. #### Response Structure If the process is successful, the server returns a **201 Created** status with details of the imported task. ``` json { "_links": { "self": { "href": "/exhibitors/import" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 14961, "createdOn": "2025-09-18T10:31:12.4752569", "executionFrom": "2025-09-18T10:31:12.4752569", "lastActionOn": "2025-09-18T10:31:12.7208533", "id": "742", "status": 253, "targetResourceId": 1, "finishedOn": "2025-09-18T10:31:12.7208533", "startedOn": null, "taskId": 12550 } } } ``` **Keywords**: exhibitor import, excel import, xlsx, file upload, start task, create import #### Request body example ```json { "FaireventId": {{currentFaireventId}}, "UserImportDate": null, "UserImportMode": "ActivationMail", "InformUsers": true, "ExhibitorAppearanceChangeMode": "NoImport", "enableDetailedResult": true, "informExistingExhibitors": true, "File": { "FileType": "xlsx", "Encoding": "UTF-8", "IsArchive": false, "Data": "UEsDBBQABgAIAAAAIQCOMArTjAEAABcGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsVMluwjAQvVfqP0S+VsTQQ1VVBA5dji0S9ANMPCQWie16Bgp/30lYVQERIpds9rxlMn794aosoiUENM4mohd3RQQ2ddrYLBHfk4/Os4iQlNWqcBYSsQYUw8H9XX+y9oARV1tMRE7kX6TENIdSYew8WF6ZuVAq4teQSa/SucpAPna7TzJ1lsBShyoMMei/wUwtCoreV/x5o2RqrIheN/sqqkQo7wuTKmKhcmn1P5KOm81MCtqli5KhY/QBlMYcgMoi9sEwYxgDERtDIU9yBijwOtKtq5gra2GYG48PbP0MQ7Vy3tW27ot/RzAaopEK9KlK9i5Xhfx1YT51bh5fBrm2NXWL4lIZu9N9gb/ejLK+9VoWUvmrgRt0EM8YyPp6u4QapoGQp9VCWs0dtmz5CLlBA9K6gLbpN6BNzLkKoMfEJyhrXcAxdoOOnwWE9URNuQ3y8Nz2EB6QL8nhlBkF55GDLMD1M7FLjaq64xkIAhnY58ap87dn5BS8eQihilkN+gS3rGN98AcAAP//AwBQSwMEFAAGAAgAAAAhALVVMCP0AAAATAIAAAsACAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACskk1PwzAMhu9I/IfI99XdkBBCS3dBSLshVH6ASdwPtY2jJBvdvyccEFQagwNHf71+/Mrb3TyN6sgh9uI0rIsSFDsjtnethpf6cXUHKiZylkZxrOHEEXbV9dX2mUdKeSh2vY8qq7iooUvJ3yNG0/FEsRDPLlcaCROlHIYWPZmBWsZNWd5i+K4B1UJT7a2GsLc3oOqTz5t/15am6Q0/iDlM7NKZFchzYmfZrnzIbCH1+RpVU2g5abBinnI6InlfZGzA80SbvxP9fC1OnMhSIjQS+DLPR8cloPV/WrQ08cudecQ3CcOryPDJgosfqN4BAAD//wMAUEsDBBQABgAIAAAAIQDI0luILwMAAEMHAAAPAAAAeGwvd29ya2Jvb2sueG1srFVNb9s4EL0vsP9BS+SqSJRl2RYiF47lYA10F0GbppcABi2NIyIUqSWp2EHR/75DycpHfcm2a9ikyDEf38y8GV18ONTCewRtuJIZoech8UAWquTyPiNfbq78KfGMZbJkQknIyBMY8mH++28Xe6Uftko9eAggTUYqa5s0CExRQc3MuWpAomWndM0sLvV9YBoNrDQVgK1FEIVhEtSMS9IjpPo9GGq34wXkqmhrkLYH0SCYRfqm4o0Z0OriPXA10w9t4xeqbhBiywW3Tx0o8eoiXd9LpdlWoNsHOvYOGr8J/miIQzTchKaTq2peaGXUzp4jdNCTPvGfhgGlb0JwOI3B+5DiQMMjdzl8ZqWTn2SVPGMlL2A0/GU0itLqtJJi8H4SbfzMLSLzix0XcNtL12NN8zerXaYE8QQzdlVyC2VGJrhUe3jZQK9021y2XKA1mk6jCQnmz3K+1rjA3C+EBS2ZhaWSFqV2pP6rsuqwl5VCEXuf4J+Wa8DaQQmhOziyImVbc81s5bVaZGSZ3n0x6OFdew4VCCgqCfouV3spFJbS3SsNslPB/wcVssIFIUDHe3L9849BQI46HZR2bbWHz+v8I0b7M3vE2GOGy2NprjG4dLSRhU7p5lu8iGbJjI79yzgJ/Xg2pf40nuX+cjlaLCeTOL8a5d/RGZ2khWKtrY5pddAZiTGHJ6a/2GGw0DBteflC41t4/Phu/mEYbN+dw66B3XLYmxcBuKV3+MplqfYZ8aPpLEK3noaNyZh4+874lZe2QgXNwhj/0O/9Cfy+QsZ0PHGnUOiOWUbeMMp7Rlf48d3whlHwilLXKpFaN3uyk/cN24IQgN2n23Vhxmedulv0uqRdGoeDJey4hNIVBsK8Wh3BFlgjrdmsDhX2Pqv0Zl03StvNDdQN9lRwpVMw8dm1bHdTSObD/X+cLc5oera4PaMXwStkFM7bW/F8ca09N3WaSKIZHTmWcLAfje1mFDvHINE4XEzCWeyHq9HYjzHyqJJR5C/jPFqNJ6t8dTl2KnEvnPT/aLtdzaXDm8yxrJi2N5oVD/j++wS7S2ZQ1n1QkS86N7AOhlPzfwEAAP//AwBQSwMEFAAGAAgAAAAhAEYVvicCAQAAQwMAABoACAF4bC9fcmVscy93b3JrYm9vay54bWwucmVscyCiBAEooAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKySzWrDMBCE74W+g9h7LTv9oYTIuZRCrm36AEJeWya2ZLTbH799haBxDMG9+CKYXTTzscxu/9N34gsDtd4pKLIcBDrjq9Y1Cj6Or3fPIIi1q3TnHSoYkWBf3t7s3rDTHD+RbQcS0cWRAss8bKUkY7HXlPkBXdzUPvSaowyNHLQ56QblJs+fZLj0gHLmKQ6VgnCo7kEcxyEm/+/t67o1+OLNZ4+Or0RI451Dk7CjrQ4NsoKLYRZpQV4H2awJwvFAOCEkKdNbLDEUazJ8+3Aii8gTx3lEMm0WYR7XhCGrA1bvHGLxaAKajZcu87AqDI9d7Pm5IZT0X7ycVb/8BQAA//8DAFBLAwQUAAYACAAAACEACtTlOJAGAAD/GgAAGAAAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbKSXW2/bNhTH3wf0Owh6jySSonxBnGJtka1vw9qtz7JMx0Qk0RXpXDDsu+9Q0hEJuFCpLEisE9n8n9uPR/Tt+5emjp5Ep6VqdzFJsjgSbaUOsn3YxX99vb9Zx5E2ZXsoa9WKXfwqdPz+7t0vt8+qe9QnIUwECq3exSdjzts01dVJNKVO1Fm08M5RdU1p4N/uIdXnTpSHflFTpzTLirQpZRsPCtsuREMdj7ISn1R1aURrBpFO1KWB+PVJnjWqNVWIXFN2j5fzTaWaM0jsZS3Nay8aR021/fzQqq7c15D3C8nLKnrp4JfCH0M3/f0rT42sOqXV0SSgnA4xX6e/STdpWU1K1/kHyZA87cSTtA10UvRtIRE+aVEnxt4oVkxitlzd9iIPu/ifbPy5gSuxL5l7wff+je9uDxI6bLOKOnHcxb+S7YffWJze3fYA/S3Fs/bsyJT7L6IWlRHghMSR5XOv1KP94Ge4lYGk7j9gJcvKyCfxUdQ1KH+A8PT3wQvY4CKdfPg2+rvvmf6ji/alFh9V/U0ezAmcwt45iGN5qc2f6vl3IR9OBu5yyN3Csz28fhK6AmohmIRy66dSNYjCa9RIu/2AuvJlCH/UXCcrkm3YClT2Qpt7aSXjqLpooxp0PEoNItC4XgSuz4MI5Qldc8ILcDq3EsrQr4RPjSsJT9ac58V6gf9iVIEr+mdJTvlqTaz/wCxWowpcnYrLIlAFhlefEVxRBcyZ4m3GBXDFBVlC8uxnpbO9H1oHhls59W7GJZm6bqkdOsZAJTBFgv22BnrOvYaH6mD3CRgOnMWNIzlWAgzUKaYahkYDpAz1dDBaerR5tdMYKhUqhDgSxyOjHo+jIiQdqohoEscmK95QcISTODqX9B1RJY5VRsI2OkVarYFbfeNt9bEoQFTo0EGIqYOYFNdlBsW50TXNLscyjCC37V1ccypIMnUkQyy4i8M0kGLqKCbkhxWaiwQptuhindnifBBh6oCzTQ9LBCmj3gwsFieCsFFvMPoqM0WwTPdb2RoOtrAnEmLFHFZ0tXSYMMTKGtNICmabIU/Mm0XQk7mcsWXMTR2yWv4sZThrrIG1yxfnjwwwj4H8mgFAfS4nZCD3tvgbnuw5dsMamBNdmlOOTbHG/zhn5LjRrYHRhB9Tctzh1sAw/MdL4PzMERhrYBjr6xYtiAzRyb0jFEn4KmNLzmE5smMNTBAUQ/NCaLjXJlg+wxnHjnBvaFJ3DB7HHtQpMAaOtbWG ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: (201 Created) ```json { "_links": { "self": { "href": "/exhibitors/import" }, "curies": { "name": "adi", "href": "http://localhost:8000/ADITUS-DEV-0_F4_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 9, "createdOn": "2026-03-27T08:31:38.5696219", "executionFrom": "2026-03-27T08:31:38.5696219", "lastActionOn": "2026-03-27T08:31:38.8671242", "id": "934", "status": 253, "targetResourceId": 42, "finishedOn": "2026-03-27T08:31:38.8671242", "startedOn": null, "taskId": 50375 } } } ``` ### POST Import Exhibitors by JSON - Endpoint: `POST {{API_BASE_URL}}/tasks/exhibitors/import` - Authentication: HTTP Basic - Human documentation: https://developers.aditus.com/docs/exhibitors/import/import-exhibitors-by-json #### Import Exhibitors for a Task This endpoint is used to initiate the "import process for exhibitors" associated with a specific event by providing exhibitor data as JSON. By sending a POST request to this endpoint, the backend system creates an ExhibitorImportTask and starts processing the import of exhibitor data asynchronously. #### Auth and Role - **Auth** OAuth 2.0 (inherit from collection) - **Required role** - BASEROLE - ApiExhibitorImport #### Request The request object [StartExhibitorImportRequest](https://aditus.atlassian.net/wiki/spaces/API/pages/1671922460/StartExhibitorImportRequest) will be delivered in JSON format. In this variant, you must provide the **Data** array. Exactly one of **Data** or **File** must be present — if **File** is used, see the **EXCEL** request. - **Method**: POST - **URL**: [https://dev.aditus.de/ADITUS-DEV-0_API/api/tasks/exhibitors/import](https://dev.aditus.de/ADITUS-DEV-0_API/api/tasks/exhibitors/import) #### Headers - **Content-Type:** application/json - **Accept**: \*/\* #### Request Body The request body must be in JSON format and contains the following parameter: - **FaireventId**: represents the ID of the fair event for which the exhibitors are being imported. This parameter is essential for identifying the specific event. Here you can use one of the following properties of the fair event: - internal Id: 42 or "42" - unique id: "C8847785-CF69-EE11-93CF-00155D960409" - slug: "hmmcc23" - year and faireventnumber: "2023-6189" (format: YYYY-nnn) - **FaireventExternalId** - The external id 1 or 2 or 3 of the fairevent. You can also use the fairevent external id. For this you must set faireventId to null - **UserImportDate (DateTime?, optional)** – when to send activation mail (if UserImportMode uses ActivationMail). Default is **null** which results in an immediate sending of the e-mail. - **UserImportMode** (enum, optional) – how users are imported. The default value: **0** (**NoImport**). - 0 = NoImport - 1 = ActivationMail (the user gets an activation mail for his account) - 2 = DeepLinkImport (the deep link for the account will be imported with the import data) - 3 = DeepLinkCreation (the deep link for the account will be created during the import) - 4 = ActiveUser (the user's account will be immediatly activated) - **InformUsers**: If "true" and if ImportMode is "ActiveUser" then the new user gets an e-mail about the details of his account. Default: **false** - **TicketQuotas** Listing of ticket quota column / article mappings. - **ArticleId** Here you can use one of the following properties of the article: internal Id: 186 or "186" unique id: "37A8A129-D669-EE11-93CF-00155D960409" - **ArticleNumber** You can also use the article number. For this you must set ArticleId to null - **ArticleExternalId** The external id 1 or 2 or 3 of the article. You can also use the article external id. For this you must set articleId and article number to null - **QuotaColumn** Assignment to configured Column in "Data", for example: TicketQuota1 - **ExhibitorAppearanceChangeMode** (enum) allows assigning an already imported fairevent appearance to another exhibitor. Possible values are: - NoImport -> An already imported exhibitor appearance remains unaffected. - AssignAnotherExhibitor -> An already imported exhibitor appearance can be assigned to another exhibitor. - **EnableDetailedResult (bool)** include info messages in result. Default: **false** - **CheckSkip (bool)** Enable the check to determine if the file is identical to the previously executed import of the same event. If true, the processing is terminated early and the import execution is skipped. The defalt value: **true**. - **InformExistingExhibitors (bool)** inform existing exhibitor about new appearance. Default: **false** - **Data** Exhibitor import data in JSON format. #### Response The response structure will provide feedback on the success or failure of the import operation. While the exact response structure is not detailed here, users can expect a confirmation of the import status, along with any relevant messages or error details if applicable. **201 CREATED** - Default success code for creation - resource has been created successfully. - The location header points to the URL of the created task (**api/tasks/exhibitors/import/{id}**). - Alternatively, you can read `result.import.id` from the response body to build the status URL. **400 BAD REQUEST** Default Error Code - Used if an object has invalid parameters, for more information about this read "[Errors](https://aditus.atlassian.net/wiki/spaces/API/pages/1139540828/Errors)". **500 INTERNAL SERVER ERROR** Default Error Code - Used if an exception occurs #### Next Steps 1\. Poll **GET "**/tasks/exhibitors/import/{id}" until status is "Completed" 2\. Retrieve result with **GET** "/tasks/exhibitors/import/{id}/result" #### Usage - To use this endpoint effectively, ensure that the `FaireventId` is correctly populated with the relevant event data. This will ensure that the import operation targets the correct exhibitors associated with the specified fair event. - Use "EnableDetailedResult=true" to get extended logs in the result. #### Response Structure If the process is successful, the server returns a **201 Created** status with details of the imported task. ``` json { "_links": { "self": { "href": "/exhibitors/import" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 14961, "createdOn": "2025-09-18T10:31:12.4752569", "executionFrom": "2025-09-18T10:31:12.4752569", "lastActionOn": "2025-09-18T10:31:12.7208533", "id": "742", "status": 253, "targetResourceId": 1, "finishedOn": "2025-09-18T10:31:12.7208533", "startedOn": null, "taskId": 12550 } } } ``` **Keywords**: exhibitor import, json import, data array, start task, create import #### Request body example ```json { // Possible inputs "FaireventId" //--------------------------------- // - internal Id: 42 or "42" // - unique id: "C8847785-CF69-EE11-93CF-00155D960409" // - slug: "hmmc23" // - year and faireventnumber: "2023-6189" (format: YYYY-nnn) //--------------------------------- "FaireventId": "2023-6189", "FaireventExternalId": "HF4992", "UserImportDate": null, "UserImportMode": 4, "InformUsers": true, "ExhibitorAppearanceChangeMode": 0, "EnableDetailedResult": true, "InformExistingExhibitors": false, "TicketQuotas": [ { // Possible inputs "ArticleId" //------------------------------- // - internal Id: 186 or "186" // - unique id: "37A8A129-D669-EE11-93CF-00155D960409" //------------------------------- "ArticleId": "37A8A129-D669-EE11-93CF-00155D960409", "ArticleNumber": "123", "ArticleExternalId": "TZ5523", "QuotaColumn": "TicketQuota1" } ], "Data": [ { "Exhibitor_ExternalId": "LAXX_GG964", "Exhibitor_Name1": "LAXX KG 3", "FaireventAppearance_ExternalId": "LAXX_GG964", "FaireventAppearance_EntryStatus": 3, "User_FirstName": "Bea", "User_LastName": "Laxx", "User_Gender": 2, // or "Female" "EMail": "bea.laxx@gffgjsfs.zzz", "TicketQuota1": 6 }, { "Exhibitor_ExternalId": "SAXX_GG964", "Exhibitor_Name1": "SAXX AG 3", "FaireventAppearance_ExternalId": "SAXX_GG964", "User_FirstName": "Georg", "User_LastName": "Saxx", "EMail": "georg.saxx@gffgjsfs.zzz", "TicketQuota1": 7 } ] } ``` #### Response example: (201 Created) ```json { "_links": { "self": { "href": "/exhibitors/import" }, "curies": { "name": "adi", "href": "http://localhost:8000/ADITUS-DEV-0_F4_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 14263, "createdOn": "2026-05-07T10:54:20.4033457", "executionFrom": "2026-05-07T10:54:20.3990717", "lastActionOn": "2026-05-07T10:54:20.4033457", "id": "1003", "status": 64, "targetResourceId": 42, "finishedOn": null, "startedOn": null, "taskId": 51192 } } } ``` ### GET Get Import Task Status - Endpoint: `GET {{API_BASE_URL}}/tasks/exhibitors/import/{id}` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/exhibitors/import/get-import-task-status #### **Get Exhibitor Import Task (Status)** Retrieves the **current status** of an exhibitor import task (`ExhibitorImportTask`). Use this endpoint to **poll** the task until it finishes. When the task is completed, follow the `Location` header to fetch the final result. #### Auth and Role - **Auth** OAuth 2.0 (inherit from collection) - **Required role** BASEROLE APITASKS #### Request - **Method**: GET - **URL:** {{API_BASE_URL}}/tasks/exhibitors/import/{id} #### Headers - **Accept**: \*/\* #### Request Body - None required #### Response **200 OK** - Returns **`ExhibitorImportTask (status)`** - Location header behavior - If the task is **not completed**, `Location` points back to `/tasks/exhibitors/import/{id}` (poll again). - If the task is **completed**, `Location` points to `/tasks/exhibitors/import/{id}/result`. **404 Not Found** – Returned if: - The specified `{id}` does not exist #### Usage - Call this endpoint repeatedly until the task is finished (e.g. when finishedOn is not null or when Location points to …/{id}/result). - Once the task is complete, follow the Location link to GET /tasks/exhibitors/import/{id}/result to view the detailed outcome. #### Response Structure If the process is successful, the server returns a **200 OK** status with details of the imported task. ``` json { "_links": { "self": { "href": "/exhibitors/import/177" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 9, "createdOn": "2024-05-28T15:57:50.2277608", "executionFrom": "2024-05-28T15:57:50.2277608", "lastActionOn": "2024-05-28T15:57:55.7655799", "id": "177", "status": 254, "targetResourceId": 1, "finishedOn": "2024-05-28T15:57:55.7655799", "startedOn": "2024-05-28T15:57:55.5316019", "taskId": 3404 } } } ``` **Keywords**: exhibitor import, poll status, task status, finishedOn, location header #### Response example: tasks/exhibitors/import/{id} (200 OK) ```json { "_links": { "self": { "href": "/exhibitors/import/177" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "import": { "createdBy": 9, "createdOn": "2024-05-28T15:57:50.2277608", "executionFrom": "2024-05-28T15:57:50.2277608", "lastActionOn": "2024-05-28T15:57:55.7655799", "id": "177", "status": 254, "targetResourceId": 1, "finishedOn": "2024-05-28T15:57:55.7655799", "startedOn": "2024-05-28T15:57:55.5316019", "taskId": 3404 } } } ``` ### GET Get Import Task Result - Endpoint: `GET {{API_BASE_URL}}/tasks/exhibitors/import/{id}/result` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/exhibitors/import/get-import-task-result #### **Get Exhibitor Import Task Result** Retrieves the **detailed result** of a previously started exhibitor import task. Call this endpoint once the task status indicates completion (via the GET /tasks/exhibitors/import/{id} request). #### Auth and Role - **Auth** OAuth 2.0 (inherit from collection) - **Required role** BASEROLE APITASKS #### Request - **Method**: GET - **URL:** {{API_BASE_URL}}/tasks/exhibitors/import/{id}/result #### Headers - **Accept**: \*/\* #### Request Body - None required #### Response **200 OK** - Returns an `ExhibitorImportTaskResult` object in JSON format **404 Not Found** – Returned if: - The specified `{id}` does not exist **or** - The task has not yet completed — poll status endpoint until `finishedOn` is not `null` #### Usage - Only call this endpoint after the task status (via GET /tasks/exhibitors/import/{id}) has been completed. - Use the returned resultItems to check which entities were imported successfully, which were skipped and which caused errors.EndFragment #### Response Structure If the process is successful, the server returns a **200 OK** status with details of the imported task. ``` json { "_links": { "self": { "href": "/exhibitors/import/177/result" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "content": { "overallResultState": 0, "resultItems": [ { "state": 0, "header": "Fairevents", "description": "'1' has already been processed." }, { "state": 0, "header": "Exhibitors", "description": "" }, { "state": 0, "header": "Fairevent appearances", "description": "Data set '002-0000-00000-000_1120' is contained in database." }, { "state": 0, "header": "User accounts", "description": "Data set 'm.example9@aditus.de' is contained in database." }, { "state": 0, "header": "User data", "description": "" }, { "state": 0, "header": "Accounts of fairevent appearance", "description": "Data set 'm.example9@aditus.de / 002-0000-00000-000_1120 / 002-0000-00000-000' is contained in database." } ] } } } ``` **Keywords**: exhibitor import, final result, result items, overallResultState, errors, warnings #### Response example: tasks/exhibitors/import/{id}/result (200 OK) ```json { "_links": { "self": { "href": "/exhibitors/import/177/result" }, "curies": { "name": "adi", "href": "http://dev.aditus.de:8000/ADITUS-DEV-0_API/api/tasks/{rel}", "templated": true } }, "result": { "content": { "overallResultState": 0, "resultItems": [ { "state": 0, "header": "Fairevents", "description": "'1' has already been processed." }, { "state": 0, "header": "Exhibitors", "description": "" }, { "state": 0, "header": "Contacts", "description": "" }, { "state": 0, "header": "Fairevent appearances", "description": "Data set '002-0000-00000-000_1120' is contained in database." }, { "state": 0, "header": "Roles", "description": "Data set 'Aussteller' is contained in database." }, { "state": 0, "header": "Roles", "description": "Data set 'BaseRole' is contained in database." }, { "state": 0, "header": "User accounts", "description": "Data set 'm.example9@aditus.de' is contained in database." }, { "state": 0, "header": "User data", "description": "" }, { "state": 0, "header": "User roles", "description": "Data set 'm.example9@aditus.de / Aussteller' is contained in database." }, { "state": 0, "header": "User roles", "description": "Data set 'm.example9@aditus.de / BaseRole' is contained in database." }, { "state": 0, "header": "Accounts of fairevent appearance", "description": "Data set 'm.example9@aditus.de / 002-0000-00000-000_1120 / 002-0000-00000-000' is contained in database." } ] } } } ``` --- product: ADITUS API module: Attendees direction: inbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/attendees.md humanDocumentation: https://developers.aditus.com/docs/attendees endpoints: 5 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Attendees This is the machine-readable Markdown version of the **Attendees** module of the ADITUS API reference (inbound (your systems call ADITUS), 5 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?eMail=a.ditus@aditus.de` | Use Case – By Email | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?saleId=6054807e-d505-f111-93e3-00155d960409` | Use Case – By Sale | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?ticketCode=0333602070000017` | Use Case – By Ticket Code | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` | Use Case – Delta Sync | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` | Attendees – Base GET - all parameters | OAuth 2.0 bearer token (client credentials) | ## Contents - Attendees — https://developers.aditus.com/docs/attendees - Use Case Examples — https://developers.aditus.com/docs/attendees/use-case-examples - GET Use Case – By Email — https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-email - GET Use Case – By Sale — https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-sale - GET Use Case – By Ticket Code — https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-ticket-code - GET Use Case – Delta Sync — https://developers.aditus.com/docs/attendees/use-case-examples/use-case-delta-sync - Typs — https://developers.aditus.com/docs/attendees/typs - Breaking Changes — https://developers.aditus.com/docs/attendees/breaking-changes - Extensions — https://developers.aditus.com/docs/attendees/extensions - From version 4.135 onwards — https://developers.aditus.com/docs/attendees/extensions/from-version-4-135-onwards - From version 4.139 onwards — https://developers.aditus.com/docs/attendees/extensions/from-version-4-139-onwards - GET Attendees – Base GET - all parameters — https://developers.aditus.com/docs/attendees/attendees-base-get-all-parameters ## Overview ##### **Important:** This documentation applies exclusively to the latest version of the Attendee API, which represents the current ADITUS standard. If the API endpoint URL you received from your Customer Success Manager does **not** end with `/terp/v1/events/[EVENT_ID]/attendees`, your system does **not** provide the latest Attendee API. The information below only applies to the new version. ### Introduction Across many projects, there has been a consistent need for a consolidated interface to access attendee data. Previously, diverse, customer‑specific integrations with varying data formats limited reusability and increased maintenance effort. **The Attendee endpoint** provides a general interface that enables standardized and secure retrieval of attendee data from ADITUS events and is intended to gradually replace existing bespoke solutions. ### Authentication The ADITUS Attendee end point use basic authentication (key/secret). ### **Fair event** The attendee data can only be requested via the context of the fair event for example: - by **internal identifier** (event-**id**) : - /api/terp/v1/events/{{eventId}}/attendees ### Query-Parameters All query parameters within the Attendee API are case-insensitive. (TicketCode = ticketCode = ticketcode) ### Definition of canceled or blocked tickets - A canceled ticket means that the associated sales transaction has been canceled. - There can be various reasons why a ticket has been blocked. In most cases, the corresponding trade fair appearance has been canceled or the ticket order has been revoked, which means that tickets are no longer valid for entrance. - A canceled ticket is also a blocked ticket. A blocked ticket does not necessarily have to be canceled. ### Timestamps and time zone All timestamps are presented in German local time (CET/CEST). Daylight‑saving changes are applied automatically. The timestamps themselves do not contain explicit time zone information and always show only the locally valid German time. ### Hints **The ADITUS Attendee end point are only intended solely for server-to-server communication. They must not be used in any client application where third parties could potentially access the data.** ## Use Case Examples Human documentation: https://developers.aditus.com/docs/attendees/use-case-examples The following examples illustrate common ways to work with the Attendee API. Although the API exposes a **single, versioned endpoint**, flexible **query parameters** allow you to tailor responses to diverse use cases. This approach provides consistency while supporting varied needs like targeted filtering, incremental retrieval, and optimized payloads. ### GET Use Case – By Email - Endpoint: `GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?eMail=a.ditus@aditus.de` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-email This endpoint is used to retrieve specific personal data for an attendee of a fair event who is identified by their e-mail address. This data contains details about the event and the ticket that was purchased. #### User-Rools To use this use case, the user must have the following role assigned. - **Required role** - ApiAttendeeGetByEmail - **Optional role** - ApiAttendeeWithAdditionalSalesInformation #### Role- and Article-Based Data Access - **Fine-grained access control:** Third parties can only access attendee registrations for the specific badge categories (articles) and user roles that have been explicitly granted to them. For example, a matchmaking provider may only receive data for VIP and EXHIBITOR categories. - **Standardised roles:** The API supports a standard set of badge category roles, such as Visitor, Exhibitor, Press, Services, and more. If there are additional badge categories in the system used, corresponding roles must also be created in the system. Please note the naming convention for roles! Example roles include: - ApiAttendeeBadgeCategoryCONTRACTOR - ApiAttendeeBadgeCategoryCREW - ApiAttendeeBadgeCategoryDELEGATE - ApiAttendeeBadgeCategoryEXHIBITOR - ApiAttendeeBadgeCategoryMEDIA - ApiAttendeeBadgeCategoryORGANIZER - ApiAttendeeBadgeCategoryPRESS - ApiAttendeeBadgeCategorySPEAKER - ApiAttendeeBadgeCategorySPONSOR - ApiAttendeeBadgeCategorySTAFF - ApiAttendeeBadgeCategorySTUDENT - ApiAttendeeBadgeCategoryVIP - ApiAttendeeBadgeCategoryVISITOR - ApiAttendeeBadgeCategoryNONE - for all articles that do not have a BadgeCategory **If one of these new roles is configured, all other articles will be filtered out. BadgeCategory roles can be combined.** #### Block-Scoped Payloads - **Modular response structure:** The API response is organised into logical blocks (such as attendee, address, customFields, termsOfService, ticket, article, booth, exhibitor, additionalSalesInformation). Each block can be enabled or disabled based on the assigned user role. - **Default behaviour:** If no specific role configuration is set, a baseline set of blocks is returned (e.g., attendee, address, customFields, ticket, article, booth, exhibitor) - the same as before version 4.135 - **Full access roles:** Special roles are available to grant full access to all attendee or ticket blocks: - ApiAttendeeWithAttendeeFullAccess (includes all attendee-related blocks) - ApiAttendeeWithAttendeeInformation - ApiAttendeeWithAddressInformation - ApiAttendeeWithCustomFieldsInformation - ApiAttendeeWithTermsOfServicesInformation - ApiAttendeeWithUserInformation - ApiAttendeeWithTicketFullAccess (includes all ticket-related blocks) - ApiAttendeeWithTicketsInformation - ApiAttendeeWithArtcleInformation - ApiAttendeeWithBoothInformation - ApiAttendeeWithExhibitorInformation - ApiAttendeeWithBarcodeInformation - ApiAttendeeWithTicketLinksInformation - ApiAttendeeWithTicketPromotionCodesInformation (available from version 139 or later) - ApiAttendeeWithTicketSalePropertiesInformation (available from version 139 or later) **If one of these new roles is configured, all other areas that are not configured will be deactivated. Roles can be combined.** #### With externalId There can be many attendee data records for the same person for one e-mail (duplicates), this can have different reasons depending on the process. When selecting the best possible attendee data record, the Attende API behaves as follows: 1. all attendees with the email as a contact are determined 2. it is checked whether a user account has also been assigned to a data record 3. the attendee data records are sorted in descending order of recency The attendee API selects the corresponding attendee data records in this order. An attendee data record with a user account is always preferred! This behaviour can ensure that the attendee data record is not returned as expected, for example after a previous import. In addition to the e-mail, up to 3 external-IDs can be specified. With this information, exactly the attendee data record that was requested can be transmitted. This means that only the tickets where the attendee data record is also the owner are given out. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept | application/json | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | eMail | a.ditus@aditus.de | | | externalId1 | {{externalId1}} | (Optional) See [With externalId](#with-externalId) | | externalId2 | {{externalId2}} | (Optional) See [With externalId](#with-externalId) | | externalId3 | {{externalId3}} | (Optional) See [With externalId](#with-externalId) | | includingCancellations | false | (Optional) When set to true, the response includes cancelled tickets in addition to non-cancelled tickets. When false (or omitted), cancelled tickets are excluded from the result set. | | includingBlockedTickets | false | (Optional) When set to true, the response includes blocked tickets in addition to non-blocked tickets. When false (or omitted), blocked tickets are excluded from the result set. | #### Response example: (200 OK) ```json { "_meta": { "count": 2 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:00", "end": "2026-03-27T00:00:00", "externalId1": "eventExternalId1", "externalId2": "eventExternalId2", "externalId3": "eventExternalId3" }, "attendee": { "eMail": "a.ditus@aditus.de", "firstName": "A", "lastName": "DITUS", "company": "ADITUS GmbH TEST", "salutationLookup": "Herr", "titleLookup": "Dr.", "nationalityLookup": "DE", "language": "DE", "phone": "0500631234561", "mobile": "0500631234562", "fax": "0500631234563", "address": { "street": "Straße der Nationen", "streetNumber": "5", "postalCode": "30539", "city": "Hannover", "countryLookup": "DE", "county": "012", "stateOrProvince": "Dubai" }, "hasUser": true, "jobTitle": "SW", "lastActionOn": "2026-02-09T17:39:00.8427132", "user": { "uniqueId": "77789b28-5fee-ed11-93c4-00155db54d03", "number": "U000161", "lastActionOn": "2026-01-12T18:23:25.7012542", "externalId1": "userExternalId1", "externalId2": "userExternalId2", "externalId3": "userExternalId3" }, "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Default Terms of Service", "consentPolicy": 1, "isApproved": true, "lastActionOn": "2026-02-09T17:39:01.0816086" }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Default Privacy Policy", "consentPolicy": 0, "isApproved": false, "lastActionOn": "2026-02-09T17:39:01.1085804" } ], "customField1": "ADITUS GmbH TEST", "customField2": "Info2", "customField3": "Info3", "customField4": "Info4", "customField5": "Info5", "customField6": "Info6", "customField7": "Info7", "customField8": "Info8", "customField9": "Info9", "customField10": "Info10", "customField11": "Info11", "customField12": "Info12", "customField13": "Info13", "customField14": "Info14", "customField15": "Info15", "customField16": "Info16", "customField17": "Info17", "customField18": "Info18", "customField19": "Info19", "customField20": "Info20", "customField21": "Info21", "customField22": "Info22", "customField23": "Info23", "customField24": "Info24", "customField25": "Info25", "customField26": "Info26", "customField27": "Info27", "customField28": "Info28", "customField29": "Info29", "customField30": "Info30", "customField31": "Info31", "customField32": "Info32", "customField33": "Info33", "customField34": "Info34", "customField35": "Info35", "customField36": "Info36", "customField37": "Info37", "customField38": "Info38", "customField39": "Info39", "customField40": "Info40", "customField41": "Info41", "customField42": "Info42", "customField43": "Info43", "customField44": "Info44", "customField45": "Info45", "customField46": "Info46", "customField47": "Info47", "customField48": "Info48", "customField49": "Info49", "customField50": "Info50", "customField51": "Info51", "customField52": "Info52", "customField53": "Info53", "customField54": "Info54", "customField55": "Info55", "customField56": "Info56", "customField57": "Info57", "customField58": "Info58", "customField59": "Info59", "customField60": "Info60", "customField61": "Info61", "customField62": "Info62", "customField63": "Info63", "customField64": "Info64", "customField65": "Info65", "customField66": "Info66", "customField67": "Info67", "customField68": "Info68", "customField69": "Info69", "customField70": "Info70", "customField71": "Info71", "customField72": "Info72", "customField73": "Info73", "customField74": "Info74", "customField75": "Info75", "customField76": "Info76", "customField77": "Info77", "customField78": "Info78", "customField79": "Info79", "customField80": "Info80", "customField81": "Info81", "customField82": "Info82", "customField83": "Info83", "customField84": "Info84", "customField85": "Info85", "customField86": "Info86", "customField87": "Info87", "customField88": "Info88", "customField89": "Info89", "customField90": "Info90", "customField91": "Info91", "customField92": "Info92", "customField93": "Info93", "customField94": "Info94", "customField95": "Info95", "customField96": "Info96", "customField97": "Info97", "customField98": "Info98", "customField99": "Info99", "customField100": "Info100", "externalId1": "10001", "externalId2": "10002", "externalId3": "10003" }, "tickets": [ { "id": 6825259, "uniqueId": "2987b3d1-cf05-f111-93e3-00155d960409", "barcode": "0333602070000017", "regcode": "AQ9FR49QGYEX64", "registeredOn": "2026-02-09T17:39:00.6677443", "registrationId": 1284743, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Pdf?s=UHBBgcqTTPFCLA", "linkWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Pkpass?s=45dwvYp1iMKZOg", "linkMobile": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Png?s=45dwvYp1iMKZOg", "linkGoogleWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/GoogleWallet?s=45dwvYp1iMKZOg", "salePaymentStatus": 0, "isTestSale": 0, "shortCode": "9Ck8I", "article": { "id": 3017, "uniqueId": "6644764c-ce05-f111-93e3-00155d960409", "number": "20", "ticketType": 1, "name": "Attendee API - TagesTicket - VIP", "badgeCategory": "VIP", "externalId1": "articleExternalId1", "externalId2": "articleExternalId2", "externalId3": "articleExternalId3" }, "booth": { "id": 8353, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Use Case – By Sale - Endpoint: `GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?saleId=6054807e-d505-f111-93e3-00155d960409` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-sale > Available from version 139 or later. The new use case `By Sale` has been introduced, allowing consumers to retrieve all attendees associated with a specific sale transaction – for example, by using the `orderId` received via webhook (cart.checkedout). This endpoint is used to retrieve specific personal data for all visitors to a sale, identified by a sale ID. This data includes details of the event and the ticket purchased. #### User-Rools To use this use case, the user must have the following role assigned. - **Required role** - ApiAttendeeGetBySaleId - **Optional role** - ApiAttendeeWithAdditionalSalesInformation #### Role- and Article-Based Data Access - **Fine-grained access control:** Third parties can only access attendee registrations for the specific badge categories (articles) and user roles that have been explicitly granted to them. For example, a matchmaking provider may only receive data for VIP and EXHIBITOR categories. - **Standardised roles:** The API supports a standard set of badge category roles, such as Visitor, Exhibitor, Press, Services, and more. If there are additional badge categories in the system used, corresponding roles must also be created in the system. Please note the naming convention for roles! Example roles include: - ApiAttendeeBadgeCategoryCONTRACTOR - ApiAttendeeBadgeCategoryCREW - ApiAttendeeBadgeCategoryDELEGATE - ApiAttendeeBadgeCategoryEXHIBITOR - ApiAttendeeBadgeCategoryMEDIA - ApiAttendeeBadgeCategoryORGANIZER - ApiAttendeeBadgeCategoryPRESS - ApiAttendeeBadgeCategorySPEAKER - ApiAttendeeBadgeCategorySPONSOR - ApiAttendeeBadgeCategorySTAFF - ApiAttendeeBadgeCategorySTUDENT - ApiAttendeeBadgeCategoryVIP - ApiAttendeeBadgeCategoryVISITOR - ApiAttendeeBadgeCategoryNONE - for all articles that do not have a BadgeCategory **If one of these new roles is configured, all other articles will be filtered out. BadgeCategory roles can be combined.** #### Block-Scoped Payloads - **Modular response structure:** The API response is organised into logical blocks (such as attendee, address, customFields, termsOfService, ticket, article, booth, exhibitor, additionalSalesInformation). Each block can be enabled or disabled based on the assigned user role. - **Default behaviour:** If no specific role configuration is set, a baseline set of blocks is returned (e.g., attendee, address, customFields, ticket, article, booth, exhibitor) - the same as before version 4.135 - **Full access roles:** Special roles are available to grant full access to all attendee or ticket blocks: - ApiAttendeeWithAttendeeFullAccess (includes all attendee-related blocks) - ApiAttendeeWithAttendeeInformation - ApiAttendeeWithAddressInformation - ApiAttendeeWithCustomFieldsInformation - ApiAttendeeWithTermsOfServicesInformation - ApiAttendeeWithUserInformation - ApiAttendeeWithTicketFullAccess (includes all ticket-related blocks) - ApiAttendeeWithTicketsInformation - ApiAttendeeWithArtcleInformation - ApiAttendeeWithBoothInformation - ApiAttendeeWithExhibitorInformation - ApiAttendeeWithBarcodeInformation - ApiAttendeeWithTicketLinksInformation - ApiAttendeeWithTicketPromotionCodesInformation (available from version 139 or later) - ApiAttendeeWithTicketSalePropertiesInformation (available from version 139 or later) **If one of these new roles is configured, all other areas that are not configured will be deactivated. Roles can be combined.** #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept | application/json | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | saleId | 6054807e-d505-f111-93e3-00155d960409 | Querying all attendees belonging to a specific sale transaction using the saleId. (orderId received via webhook (cart.checkedout)) | #### Response example: (0) ```json { "_meta": { "count": 2 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:01", "end": "2026-03-27T00:00:01" }, "registrations": [ { "id": 1303775, "attendee": { "eMail": "a.@aditus.de", "firstName": "A", "lastName": "DITUS", "company": "ADITUS GmbH", "salutationLookup": "Herr", "nationalityLookup": "DE", "language": "DE", "address": { "street": "Straße der Nationen", "streetNumber": "5", "postalCode": "30539", "city": "Hannover", "countryLookup": "DE", "county": "003" }, "hasUser": true, "lastActionOn": "2026-02-19T12:09:51.5020335", "customField1": "ADITUS GmbH", "customField11": "false", "customField12": "---", "customField67": "---" }, "ticket": { "id": 6826398, "uniqueId": "73350e73-7c0d-f111-93e3-00155d960409", "barcode": "0333603080000059", "regcode": "AMUGKHHFQ727RE", "registeredOn": "2026-02-19T12:09:51.0626143", "registrationId": 1303775, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/73350E73-7C0D-F111-93E3-00155D960409/Pdf?s=QT0qaHmFb3jlA", "salePaymentStatus": 0, "isTestSale": 0, "article": { "id": 3024, "uniqueId": "f59e5e1e-710d-f111-93e3-00155d960409", "number": "30", "ticketType": 2, "name": "Attendee API - Artikel3", "nameLong": "Attendee API - Artikel3 - NameLang", "badgeCategory": "EXHIBITOR" }, "booth": { "id": 8353, "uniqueId": "b50f0f5e-cf05-f111-93e3-00155d960409", "number": "M0008354" }, "exhibitor": { "id": 3, "uniqueId": "eba17e4a-7fd8-ed11-93c2-00155db54d02", "number": "D0000001", "name1": "ADITUS GmbH", "name2": "Aditus", "name3": "Name 3" }, "additionalSalesInformation": { "uniqueId": "ce20d781-830d-f111-93e3-00155d960409", "caseNumber": "333-2026-333618617", "positionGrossPrice": 0, "positionNetPrice": 0, "buyer": { "uniqueId": "d320d781-830d-f111-93e3-00155d960409", "eMail": "a@aditus.de", "firstName": "A", "lastName": "ADITUS", "company": "ADITUS GmbH", "salutationLookup": "Herr", "nationalityLookup": "DE", "language": "DE", "address": { "street": "Straße der Nationen", "streetNumber": "5", "postalCode": "30539", "city": "Hannover", "countryLookup": "DE", "county": "003" } } } } }, { "id": 1303777, "attendee": { "eMail": "a_2@aditus.de", "firstName": "A_2", "lastName": "ADITUS_2", "language": "DE", "hasUser": false, "lastActionOn": "2026-02-19T12:09:51.2192945" }, "ticket": { "id": 6826399, "uniqueId": "74350e73-7c0d-f111-93e3-00155d960409", "barcode": "0333603040000068", "regcode": "AFXX9FF5UB74RT", "registeredOn": "2026-02-19T12:09:51.2505659", "registrationId": 1303777, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/74350E73-7C0D-F111-93E3-00155D960409/Pdf?s=QPeMUefbZ9twQ", "salePaymentStatus": 0, "isTestSale": 0, "article": { "id": 3024, "uniqueId": "f59e5e1e-710d-f111-93e3-00155d960409", "number": "30", "ticketType": 2, "name": "Attendee API - Artikel3", "nameLong": "Attendee API - Artikel3 - NameLang", "badgeCategory": "EXHIBITOR" }, "booth": { "id": 8353, "uniqueId": "b50f0f5e-cf05-f111-93e3-00155d960409", "number": "M0008354" }, "exhibitor": { "id": 3, "uniqueId": "eba17e4a-7fd8-ed11-93c2-00155db54d02", "number": "D0000001", "name1": "ADITUS GmbH", "name2": "Aditus", "name3": "Name 3" }, "additionalSalesInformation": { "uniqueId": "ce20d781-830d-f111-93e3-00155d960409", "caseNumber": "333-2026-333618617", "positionGrossPrice": 0, "positionNetPrice": 0, "buyer": { "uniqueId": "d320d781-830d-f111-93e3-00155d960409", ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Use Case – By Ticket Code - Endpoint: `GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?ticketCode=0333602070000017` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/attendees/use-case-examples/use-case-by-ticket-code This endpoint is used to retrieve specific personal data for an attendee of a fair event who is identified by the barcode of their ticket. This data contains details about the event and the ticket that was purchased. #### User-Rools To use this use case, the user must have the following role assigned. - **Required role** - ApiAttendeeGetByTicketcode - **Optional role** - ApiAttendeeWithAdditionalSalesInformation #### Role- and Article-Based Data Access - **Fine-grained access control:** Third parties can only access attendee registrations for the specific badge categories (articles) and user roles that have been explicitly granted to them. For example, a matchmaking provider may only receive data for VIP and EXHIBITOR categories. - **Standardised roles:** The API supports a standard set of badge category roles, such as Visitor, Exhibitor, Press, Services, and more. If there are additional badge categories in the system used, corresponding roles must also be created in the system. Please note the naming convention for roles! Example roles include: - ApiAttendeeBadgeCategoryCONTRACTOR - ApiAttendeeBadgeCategoryCREW - ApiAttendeeBadgeCategoryDELEGATE - ApiAttendeeBadgeCategoryEXHIBITOR - ApiAttendeeBadgeCategoryMEDIA - ApiAttendeeBadgeCategoryORGANIZER - ApiAttendeeBadgeCategoryPRESS - ApiAttendeeBadgeCategorySPEAKER - ApiAttendeeBadgeCategorySPONSOR - ApiAttendeeBadgeCategorySTAFF - ApiAttendeeBadgeCategorySTUDENT - ApiAttendeeBadgeCategoryVIP - ApiAttendeeBadgeCategoryVISITOR - ApiAttendeeBadgeCategoryNONE - for all articles that do not have a BadgeCategory **If one of these new roles is configured, all other articles will be filtered out. BadgeCategory roles can be combined.** #### Block-Scoped Payloads - **Modular response structure:** The API response is organised into logical blocks (such as attendee, address, customFields, termsOfService, ticket, article, booth, exhibitor, additionalSalesInformation). Each block can be enabled or disabled based on the assigned user role. - **Default behaviour:** If no specific role configuration is set, a baseline set of blocks is returned (e.g., attendee, address, customFields, ticket, article, booth, exhibitor) - the same as before version 4.135 - **Full access roles:** Special roles are available to grant full access to all attendee or ticket blocks: - ApiAttendeeWithAttendeeFullAccess (includes all attendee-related blocks) - ApiAttendeeWithAttendeeInformation - ApiAttendeeWithAddressInformation - ApiAttendeeWithCustomFieldsInformation - ApiAttendeeWithTermsOfServicesInformation - ApiAttendeeWithUserInformation - ApiAttendeeWithTicketFullAccess (includes all ticket-related blocks) - ApiAttendeeWithTicketsInformation - ApiAttendeeWithArtcleInformation - ApiAttendeeWithBoothInformation - ApiAttendeeWithExhibitorInformation - ApiAttendeeWithBarcodeInformation - ApiAttendeeWithTicketLinksInformation - ApiAttendeeWithTicketPromotionCodesInformation (available from version 139 or later) - ApiAttendeeWithTicketSalePropertiesInformation (available from version 139 or later) **If one of these new roles is configured, all other areas that are not configured will be deactivated. Roles can be combined.** #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept | application/json | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | ticketCode | 0333602070000017 | use for barcode, quicode, registration code or ticketUniqueId | | useOwnerEMail | false | (Optional) If this parameter is set to true, the result will also contain all other registrations we have for the barcode holder's email | | includingCancellations | false | (Optional) When set to true, the response includes cancelled tickets in addition to non-cancelled tickets. When false (or omitted), cancelled tickets are excluded from the result set. | | includingBlockedTickets | false | (Optional) When set to true, the response includes blocked tickets in addition to non-blocked tickets. When false (or omitted), blocked tickets are excluded from the result set. | | ticketBarcodeIsUniqueId | false | (Optional) Indicates whether the provided ticket code should be interpreted as a ticket barcode. Set this parameter to true (the default is false) when searching for non-ADITUS tickets whose barcode value is a GUID. Otherwise, every GUID is interpreted as an ADITUS ticket unique ID. (only from version 4.135 or higher) | #### Response example: (200 OK) ```json { "_meta": { "count": 1 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:00", "end": "2026-03-27T00:00:00", "externalId1": "eventExternalId1", "externalId2": "eventExternalId2", "externalId3": "eventExternalId3" }, "attendee": { "eMail": "a.ditus@aditus.de", "firstName": "A", "lastName": "DITUS", "company": "ADITUS GmbH TEST", "salutationLookup": "Herr", "titleLookup": "Dr.", "nationalityLookup": "DE", "language": "DE", "phone": "0500631234561", "mobile": "0500631234562", "fax": "0500631234563", "address": { "street": "Straße der Nationen", "streetNumber": "5", "postalCode": "30539", "city": "Hannover", "countryLookup": "DE", "county": "012", "stateOrProvince": "Dubai" }, "hasUser": true, "jobTitle": "SW", "lastActionOn": "2026-02-09T17:39:00.8427132", "user": { "uniqueId": "77789b28-5fee-ed11-93c4-00155db54d03", "number": "U000161", "lastActionOn": "2026-01-12T18:23:25.7012542", "externalId1": "userExternalId1", "externalId2": "userExternalId2", "externalId3": "userExternalId3" }, "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Default Terms of Service", "consentPolicy": 1, "isApproved": true, "lastActionOn": "2026-02-09T17:39:01.0816086" }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Default Privacy Policy", "consentPolicy": 0, "isApproved": false, "lastActionOn": "2026-02-09T17:39:01.1085804" } ], "customField1": "ADITUS GmbH TEST", "customField2": "Info2", "customField3": "Info3", "customField4": "Info4", "customField5": "Info5", "customField6": "Info6", "customField7": "Info7", "customField8": "Info8", "customField9": "Info9", "customField10": "Info10", "customField11": "Info11", "customField12": "Info12", "customField13": "Info13", "customField14": "Info14", "customField15": "Info15", "customField16": "Info16", "customField17": "Info17", "customField18": "Info18", "customField19": "Info19", "customField20": "Info20", "customField21": "Info21", "customField22": "Info22", "customField23": "Info23", "customField24": "Info24", "customField25": "Info25", "customField26": "Info26", "customField27": "Info27", "customField28": "Info28", "customField29": "Info29", "customField30": "Info30", "customField31": "Info31", "customField32": "Info32", "customField33": "Info33", "customField34": "Info34", "customField35": "Info35", "customField36": "Info36", "customField37": "Info37", "customField38": "Info38", "customField39": "Info39", "customField40": "Info40", "customField41": "Info41", "customField42": "Info42", "customField43": "Info43", "customField44": "Info44", "customField45": "Info45", "customField46": "Info46", "customField47": "Info47", "customField48": "Info48", "customField49": "Info49", "customField50": "Info50", "customField51": "Info51", "customField52": "Info52", "customField53": "Info53", "customField54": "Info54", "customField55": "Info55", "customField56": "Info56", "customField57": "Info57", "customField58": "Info58", "customField59": "Info59", "customField60": "Info60", "customField61": "Info61", "customField62": "Info62", "customField63": "Info63", "customField64": "Info64", "customField65": "Info65", "customField66": "Info66", "customField67": "Info67", "customField68": "Info68", "customField69": "Info69", "customField70": "Info70", "customField71": "Info71", "customField72": "Info72", "customField73": "Info73", "customField74": "Info74", "customField75": "Info75", "customField76": "Info76", "customField77": "Info77", "customField78": "Info78", "customField79": "Info79", "customField80": "Info80", "customField81": "Info81", "customField82": "Info82", "customField83": "Info83", "customField84": "Info84", "customField85": "Info85", "customField86": "Info86", "customField87": "Info87", "customField88": "Info88", "customField89": "Info89", "customField90": "Info90", "customField91": "Info91", "customField92": "Info92", "customField93": "Info93", "customField94": "Info94", "customField95": "Info95", "customField96": "Info96", "customField97": "Info97", "customField98": "Info98", "customField99": "Info99", "customField100": "Info100", "externalId1": "10001", "externalId2": "10002", "externalId3": "10003" }, "tickets": [ { "id": 6825259, "uniqueId": "2987b3d1-cf05-f111-93e3-00155d960409", "barcode": "0333602070000017", "regcode": "AQ9FR49QGYEX64", "registeredOn": "2026-02-09T17:39:00.6677443", "registrationId": 1284743, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Pdf?s=UHBBgcqTTPFCLA", "linkWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Pkpass?s=45dwvYp1iMKZOg", "linkMobile": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/Png?s=45dwvYp1iMKZOg", "linkGoogleWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/2987B3D1-CF05-F111-93E3-00155D960409/GoogleWallet?s=45dwvYp1iMKZOg", "salePaymentStatus": 0, "isTestSale": 0, "shortCode": "9Ck8I", "promotionCodes": [ "Attendee-API-Smoke-Tests-01" ], "saleProperties": { "utm_source": "media-partner", "utm_medium": "intergame", "utm_campaign": "enquire-to-visit", "utm_content": "2026-edition", "aid": "TEST1" }, "article": { ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ ### GET Use Case – Delta Sync - Endpoint: `GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/attendees/use-case-examples/use-case-delta-sync **Note:** If the `includingTicketOwnerUpdates` parameter is set to `true`, all update actions for the ticket owner are included. Use this option only for delta loads. Do not set it for initial, full loads, as this increases execution time and the chance of potential time-out errors during execution. Once all data has been loaded initially, the parameter can be used for subsequent delta loads. This minimises the chance of potential time-outs. This endpoint enables high-throughput bulk retrieval of **personal data** for trade-fair events, including both **event-specific** and **ticket-specific** attributes. The endpoint supports **delta queries** based on **registration events**, ensuring that only records **created or updated since the last retrieval** are returned. The endpoint is **optimised for incremental data pulls** and also supports an **initial full load** of all data. The initial full load **must not be executed more than three times per calendar day per event**. Data selection is driven by **registration-related events** (such as create or update), which serve as the reference for delta determination. The scenario (initial load or delta) is controlled via the `sinceRegistrationId` query parameter. #### User-Rools To use this use case, the user must have the following role assigned. - **Required role** - ApiAttendeeBatch - **Optional role** - ApiAttendeeWithAdditionalSalesInformation #### Role- and Article-Based Data Access - **Fine-grained access control:** Third parties can only access attendee registrations for the specific badge categories (articles) and user roles that have been explicitly granted to them. For example, a matchmaking provider may only receive data for VIP and EXHIBITOR categories. - **Standardised roles:** The API supports a standard set of badge category roles, such as Visitor, Exhibitor, Press, Services, and more. If there are additional badge categories in the system used, corresponding roles must also be created in the system. Please note the naming convention for roles! Example roles include: - ApiAttendeeBadgeCategoryCONTRACTOR - ApiAttendeeBadgeCategoryCREW - ApiAttendeeBadgeCategoryDELEGATE - ApiAttendeeBadgeCategoryEXHIBITOR - ApiAttendeeBadgeCategoryMEDIA - ApiAttendeeBadgeCategoryORGANIZER - ApiAttendeeBadgeCategoryPRESS - ApiAttendeeBadgeCategorySPEAKER - ApiAttendeeBadgeCategorySPONSOR - ApiAttendeeBadgeCategorySTAFF - ApiAttendeeBadgeCategorySTUDENT - ApiAttendeeBadgeCategoryVIP - ApiAttendeeBadgeCategoryVISITOR - ApiAttendeeBadgeCategoryNONE - for all articles that do not have a BadgeCategory **If one of these new roles is configured, all other articles will be filtered out. BadgeCategory roles can be combined.** #### Block-Scoped Payloads - **Modular response structure:** The API response is organised into logical blocks (such as attendee, address, customFields, termsOfService, ticket, article, booth, exhibitor, additionalSalesInformation). Each block can be enabled or disabled based on the assigned user role. - **Default behaviour:** If no specific role configuration is set, a baseline set of blocks is returned (e.g., attendee, address, customFields, ticket, article, booth, exhibitor) - the same as before version 4.135 - **Full access roles:** Special roles are available to grant full access to all attendee or ticket blocks: - ApiAttendeeWithAttendeeFullAccess (includes all attendee-related blocks) - ApiAttendeeWithAttendeeInformation - ApiAttendeeWithAddressInformation - ApiAttendeeWithCustomFieldsInformation - ApiAttendeeWithTermsOfServicesInformation - ApiAttendeeWithUserInformation - ApiAttendeeWithTicketFullAccess (includes all ticket-related blocks) - ApiAttendeeWithTicketsInformation - ApiAttendeeWithArtcleInformation - ApiAttendeeWithBoothInformation - ApiAttendeeWithExhibitorInformation - ApiAttendeeWithBarcodeInformation - ApiAttendeeWithTicketLinksInformation - ApiAttendeeWithTicketPromotionCodesInformation (available from version 139 or later) - ApiAttendeeWithTicketSalePropertiesInformation (available from version 139 or later) **If one of these new roles is configured, all other areas that are not configured will be deactivated. Roles can be combined.** #### Response The response is delivered in JSON format and contains information about the event, personal data of the ticket holder, and information about the tickets. If the number of registrations exceeds the limit, use the _maxRegistrationId_ from the response payload in the optional query parameter _sinceRegistrationId_ to retrieve the next set of registrations. For a delta query, also use the _sinceRegistrationId_ query parameter to retrieve only those attendees registered after the specified registration event. #### Performance Note The delta or batch query returns up to **2,500 records per request** by default (`limit`, default: 2500). For most customers and events, this value is optimal. In rare cases (such as high system or database load, an unfavourable SQL Server execution plan, or very large data volumes), the request may time out. **Recommendation:** Reduce the `limit` manually and use smaller pages until the query reliably returns results without timing out. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Accept | application/json | | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | sinceRegistrationId | {{lastMaxRegistrationId}} | Represents an offset for registrations that have already been transmitted. A full-load (sinceRegistrationId = 0) should only be carried out once a day, not more than 3 times a day. | | limit | {{limit}} | (Optional) Number of items per response. Default value : 2500 A high limit can cause the request to time out if it takes longer than 30 seconds. Please choose the limit accordingly. | | includingTicketOwnerUpdates | false | If set to true, all update actions for the ticket owner will also be included. Only for delta loads. Do not set it for initial, full loads. | | includingCancellations | false | If true, all cancellation ticket events are also returned. This can lead to duplication of individual registrations. | | includingBlockedTickets | false | If true, all blocked ticket events are also returned. This can lead to duplication of individual registrations. | #### Response example: Use Case – Delta Sync (initial full load) (200 OK) ```json { "_meta": { "limit": 5, "count": 5, "maxRegistrationId": 50268 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:00", "end": "2026-03-27T00:00:00", "externalId1": "eventExternalId1", "externalId2": "eventExternalId2", "externalId3": "eventExternalId3" }, "registrations": [ { "id": 49907, "attendee": { "eMail": "a.ditus@aditus.de", "firstName": "Max", "lastName": "Mustermann", "company": "ADITUS", "salutationLookup": "Herr", "titleLookup": "Dr.", "nationalityLookup": "DE", "language": "DE", "phone": "0500631234561", "mobile": "0500631234562", "fax": "0500631234563", "address": { "street": "Straße der Nationen", "streetNumber": "5", "postalCode": "30539", "city": "Hannover", "countryLookup": "DE", "county": "003", "stateOrProvince": "Dubai" }, "hasUser": false, "jobTitle": "SW", "lastActionOn": "2025-11-14T12:26:39.4833333", "user": { "uniqueId": "77789b28-6fee-ed11-93c4-00166db54d03", "number": "U000169", "lastActionOn": "2026-01-12T18:23:25.7012542", "externalId1": "userExternalId1", "externalId2": "userExternalId2", "externalId3": "userExternalId3" }, "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Default Terms of Service", "consentPolicy": 1, "isApproved": true, "lastActionOn": "2026-02-09T17:39:01.0816086" }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Default Privacy Policy", "consentPolicy": 0, "isApproved": false, "lastActionOn": "2026-02-09T17:39:01.1085804" } ], "customField1": "ADITUS", "customField2": "Info2", "customField3": "Info3", "customField4": "Info4", "customField5": "Info5", "customField6": "Info6", "customField7": "Info7", "customField8": "Info8", "customField9": "Info9", "customField10": "Info10", "customField11": "Info11", "customField12": "Info12", "customField13": "Info13", "customField14": "Info14", "customField15": "Info15", "customField16": "Info16", "customField17": "Info17", "customField18": "Info18", "customField19": "Info19", "customField20": "Info20", "customField21": "Info21", "customField22": "Info22", "customField23": "Info23", "customField24": "Info24", "customField25": "Info25", "customField26": "Info26", "customField27": "Info27", "customField28": "Info28", "customField29": "Info29", "customField30": "Info30", "customField31": "Info31", "customField32": "Info32", "customField33": "Info33", "customField34": "Info34", "customField35": "Info35", "customField36": "Info36", "customField37": "Info37", "customField38": "Info38", "customField39": "Info39", "customField40": "Info40", "customField41": "Info41", "customField42": "Info42", "customField43": "Info43", "customField44": "Info44", "customField45": "Info45", "customField46": "Info46", "customField47": "Info47", "customField48": "Info48", "customField49": "Info49", "customField50": "Info50", "customField51": "Info51", "customField52": "Info52", "customField53": "Info53", "customField54": "Info54", "customField55": "Info55", "customField56": "Info56", "customField57": "Info57", "customField58": "Info58", "customField59": "Info59", "customField60": "Info60", "customField61": "Info61", "customField62": "Info62", "customField63": "Info63", "customField64": "Info64", "customField65": "Info65", "customField66": "Info66", "customField67": "Info67", "customField68": "Info68", "customField69": "Info69", "customField70": "Info70", "customField71": "Info71", "customField72": "Info72", "customField73": "Info73", "customField74": "Info74", "customField75": "Info75", "customField76": "Info76", "customField77": "Info77", "customField78": "Info78", "customField79": "Info79", "customField80": "Info80", "customField81": "Info81", "customField82": "Info82", "customField83": "Info83", "customField84": "Info84", "customField85": "Info85", "customField86": "Info86", "customField87": "Info87", "customField88": "Info88", "customField89": "Info89", "customField90": "Info90", "customField91": "Info91", "customField92": "Info92", "customField93": "Info93", "customField94": "Info94", "customField95": "Info95", "customField96": "Info96", "customField97": "Info97", "customField98": "Info98", "customField99": "Info99", "customField100": "Info100", "externalId1": "10001", "externalId2": "10002", "externalId3": "10003" }, "ticket": { "id": 3394059, "uniqueId": "c42a67b0-a9ea-ef11-93db-00155d960409", "barcode": "0333602070000017", "regcode": "DVQNS8DTUZ4VQG", "registeredOn": "2024-04-08T12:57:36.8516906", "registrationId": 49907, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/c42a67b0-a9ea-ef11-93db-00155d960409/Pdf?s=UHBBgcqTTPFCLA", "linkWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/c42a67b0-a9ea-ef11-93db-00155d960409/Pkpass?s=45dwvYp1iMKZOg", "linkMobile": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/c42a67b0-a9ea-ef11-93db-00155d960409/Png?s=45dwvYp1iMKZOg", "linkGoogleWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/c42a67b0-a9ea-ef11-93db-00155d960409/GoogleWallet?s=45dwvYp1iMKZOg", "saleLegitimationStatus": 1, "salePaymentStatus": 2, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: Use Case – Delta Sync (paging) (200 OK) ```json { "_meta": { "limit": 5, "count": 5, "maxRegistrationId": 50793 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:00", "end": "2026-03-27T00:00:00", "externalId1": "eventExternalId1", "externalId2": "eventExternalId2", "externalId3": "eventExternalId3" }, "registrations": [ { "id": 50302, "attendee": { "eMail": "a.ditus@aditus.de", "firstName": "Max", "lastName": "Mustermann", "company": "ADITUS", "salutationLookup": "Herr", "titleLookup": "Dr.", "nationalityLookup": "DE", "language": "DE", "phone": "0500631234561", "mobile": "0500631234562", "fax": "0500631234563", "address": { "street": "Anonymized", "streetNumber": "5", "postalCode": "38110", "city": "Braunschweig", "countryLookup": "DE", "county": "003", "stateOrProvince": "Dubai" }, "hasUser": false, "jobTitle": "SW", "lastActionOn": "2025-11-14T12:26:39.4833333", "user": { "uniqueId": "88889b28-6fee-ed11-93c4-00166db54d03", "number": "U000269", "lastActionOn": "2026-01-12T18:23:25.7012542", "externalId1": "userExternalId1", "externalId2": "userExternalId2", "externalId3": "userExternalId3" }, "termsOfService": [ { "uniqueId": "4777d894-1751-44a7-9d96-57a4479e05a0", "displayOrder": 1, "version": "1.0", "content": "Default Terms of Service", "consentPolicy": 1, "isApproved": true, "lastActionOn": "2026-02-09T17:39:01.0816086" }, { "uniqueId": "a25c56b6-6ce6-4be8-ab46-a25d707ff7ba", "displayOrder": 99, "version": "1.0", "content": "Default Privacy Policy", "consentPolicy": 0, "isApproved": false, "lastActionOn": "2026-02-09T17:39:01.1085804" } ], "customField1": "ADITUS", "customField6": "0130", "customField7": "0174", "customField10": "TC_1002_10_2024_03_10", "customField99": "700" }, "ticket": { "id": 3394074, "uniqueId": "d32a67b0-a9ea-ef11-93db-00155d960409", "barcode": "0298602070000017", "regcode": "DE4YU14FU1N1FP", "registeredOn": "2024-04-12T08:29:03.0581738", "registrationId": 50302, "linkPDF": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/d32a67b0-a9ea-ef11-93db-00155d960409/Pdf?s=UHBBgcqTTPFCLA", "linkWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/d32a67b0-a9ea-ef11-93db-00155d960409/Pkpass?s=45dwvYp1iMKZOg", "linkMobile": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/d32a67b0-a9ea-ef11-93db-00155d960409/Png?s=45dwvYp1iMKZOg", "linkGoogleWallet": "https://dev.aditus.de/ADITUS-DEV-0_API/api/assets/v1/tickets/d32a67b0-a9ea-ef11-93db-00155d960409/GoogleWallet?s=45dwvYp1iMKZOg", "saleLegitimationStatus": 1, "salePaymentStatus": 2, "isTestSale": 0, "shortCode": "9Ck8I", "article": { "id": 1356, "uniqueId": "0748be08-06e6-ee11-93d5-00155d96040a", "number": "951", "ticketType": 1, "name": "Tagesticket", "badgeCategory": "VISITOR", "externalId1": "articleExternalId1", "externalId2": "articleExternalId2", "externalId3": "articleExternalId3" }, "booth": { "id": 3872, "number": "M0003873", "externalId1": "2323", "externalId2": "136", "externalId3": "boothExternalId3" }, "exhibitor": { "id": 8366, "name1": "DVO GmbH", "name2": "name2", "name3": "name3", "externalId1": "exhibitorExternalId1", "externalId2": "exhibitorExternalId2", "externalId3": "exhibitorExternalId3" }, "additionalSalesInformation": { "uniqueId": "ec68c8f3-95f8-ee11-93d5-00155d96040a", "caseNumber": "1596-2025-1596504282", "positionGrossPrice": 33, "positionNetPrice": 27.73, "transactionCurrencyShort": "EUR", "transactionNumber": "xtMzlGA8hQ1CSA91E4t7A221MjWb_c", "transactionProviderName": "American Express", "transactionCreatedOn": "2024-04-12T08:29:05.3878465", "buyer": { "eMail": "a.ditus@aditus.de", "firstName": "Max", "lastName": "Mustermann", "company": "ADITUS", "nationalityLookup": "DE", "language": "DE", "mobile": "Anonymized", "address": { "street": "Anonymized", "postalCode": "38110", "city": "Braunschweig", "countryLookup": "DE", "county": "003" } } } } }, { "id": 50631, "attendee": { "eMail": "a.ditus@aditus.de", "firstName": "Max", "lastName": "Mustermann", "company": "ADITUS", "nationalityLookup": "DE", "language": "DE", "mobile": "Anonymized", "address": { "street": "Anonymized", "postalCode": "38110", "city": "Braunschweig", "countryLookup": "DE", "county": "003" }, "hasUser": false, "jobTitle": "Desastermaster", "lastActionOn": "2025-11-14T12:26:39.4833333", "customField1": "ADITUS", "customField6": "0130", "customField7": "0174", "customField10": "TC_1002_10_2024_03_10", "customField99": "700" }, "ticket": { "id": 3394079, "uniqueId": "d82a67b0-a9ea-ef11-93db-00155d960409", "regcode": "DQNK1ZC2BTXX5E", "registeredOn": "2024-04-15T17:36:50.0211348", "registrationId": 50631, "saleLegitimationStatus": 0, "salePaymentStatus": 2, "isTestSale": 0, "promotionCodes": [ "Attendee-API-Smoke-Tests-01" ], "saleProperties": { "utm_source": "media-partner", "utm_medium": "intergame", "utm_campaign": "enquire-to-visit", "utm_content": "2026-edition", "aid": "TEST1" }, "article": { "id": 1356, ``` _Example truncated after 6000 characters. The complete example is on the human documentation page above._ #### Response example: Use Case – Delta Sync (live - no further data) (200 OK) ```json { "_meta": { "limit": 5, "count": 0, "maxRegistrationId": 1091785 }, "event": { "id": 212, "uniqueId": "d76dbbba-cc05-f111-93e3-00155d960409", "name": "Attendee-API", "number": "333", "year": "2026", "start": "2026-02-09T16:33:00", "end": "2026-03-27T00:00:00", "externalId1": "eventExternalId1", "externalId2": "eventExternalId2", "externalId3": "eventExternalId3" }, "registrations": [] } ``` ## Typs Human documentation: https://developers.aditus.com/docs/attendees/typs ### TicketType > Values are powers of two (bit flags), so multiple types can be combined. | Value | Name | Description | | --- | --- | --- | | 1 | `VisitorTicket` | Visitor ticket | | 2 | `ExhibitorTicket` | Exhibitor ticket | | 4 | `ServiceTicket` | Service ticket | | 8 | `OnsiteTicket` | On‑site / cash‑desk ticket | | 16 | `PressTicket` | Press ticket | | 32 | `ParkingTicket` | Parking ticket | | 64 | `SpecialParkingTicket` | Special parking ticket | **Exampel (**bit combinations**):** - Visitor **+** Press ⇒ `1 | 16 = 17` - Exhibitor **+** Parking ⇒ `2 | 32 = 34` ### SaleLegitimationStatus (States for the sale‑related legitimation process) | Value | Name | Meaning | | --- | --- | --- | | 0 | `New` | New | | 1 | `Accepted` | Accepted | | 2 | `Denied` | Denied | | 3 | `InProgress` | In progress | | 4 | `Shelved` | Shelved | | 5 | `Questionable` | Questionable | | 6 | `Incomplete` | Incomplete | --- ### SalePaymentStatus (Payment state of the sale/transaction) | Value | Name | Meaning | | --- | --- | --- | | 0 | `NotRequired` | No payment required | | 1 | `NotPaid` | Not paid / payment outstanding | | 2 | `Paid` | Paid | | 3 | `NotRefunded` | Not refunded after cancellation | | 4 | `Refunded` | Refunded | | 5 | `RefundPending` | Refund is being processed by the payment provider (callback expected) | | 6 | `PaymentProcessing` | Payment is being processed by the payment provider (callback expected) | ## Breaking Changes Human documentation: https://developers.aditus.com/docs/attendees/breaking-changes ##### **Important:** This documentation applies exclusively to the latest version of the Attendee API, which represents the current ADITUS standard. If the API endpoint URL you received from your Customer Success Manager does **not** end with `/terp/v1/events/:event/attendees`, your system does **not** provide the latest Attendee API. The information below only applies to the new version. If you are upgrading from an older version to this new API, please review the following breaking changes: --- ### Breaking Changes Overview #### 1\. API Endpoint - The URL for the Attendee API has changed. - There is now a **single endpoint** for all use cases: `GET {{API_BASE_URL}}/terp/v1/events/[EVENT_ID]/attendees` #### 2\. JSON Result Structure - **attendee** - `PersonContactPhoneNumber` → **permanently removed**. Use `phone` instead. - `PersonContactMobileNumber` → **permanently removed**. Use `mobile` instead. - **booth** - `BoothNumber` → **permanently removed**. Use `number` instead. - `BoothHall` → **permanently removed**. Use `hall` instead. - `BoothStand` → **permanently removed**. Use `stand` instead. - `BoothExternalId1` → **permanently removed**. Use `externalId1` instead. - `BoothExternalId2` → **permanently removed**. Use `externalId2` instead. - `BoothExternalId3` → **permanently removed**. Use `externalId3` instead. - **Batch Query** - The structure has changed: - Previously, `booth` and `exhibitor` were also present in the `registration` object. - Now, this information is consistently found in the `ticket` object, as in other endpoints. - Example: - Old: `registrations[].booth` - New: `registrations[].ticket.booth` #### 3\. Event Identification - Requests can now **only** be made using the **unique ID** (GUID) of the event. - The use of the internal event ID is no longer supported. - You must always provide a valid event GUID for attendee queries. #### 4\. Ticket Links - **GoogleWallet** - Now only available if the GoogleWalletFeature is enabled **and** the medium itself is active. - **Wallet** - Now only available if the medium is active. - **mTicket** - Now only available if the medium is active. #### 5\. Query Parameters - `CustomFieldsLookupLanguageId` has been renamed to `CustomFieldsLookupLanguage` and now expects an **ISO2Code**. ## Extensions Human documentation: https://developers.aditus.com/docs/attendees/extensions ### From version 4.135 onwards Human documentation: https://developers.aditus.com/docs/attendees/extensions/from-version-4-135-onwards #### New Features and Enhancements from Version 4.135 Starting with version 4.135, the Attendee API introduces several important enhancements to improve data protection, transparency, and operational flexibility for partners and integrations. These changes ensure that data access is more granular, event-specific, and compliant with current business and privacy requirements. --- #### Key Enhancements #### 1\. Role- and Article-Based Data Access - **Fine-grained access control:** Third parties can only access attendee registrations for the specific badge categories (articles) and user roles that have been explicitly granted to them. For example, a matchmaking provider may only receive data for VIP and Exhibitor categories. - **Standardised roles:** The API supports a standard set of badge category roles, such as Visitor, Exhibitor, Press, Services, and more. If there are additional badge categories in the system used, corresponding roles must also be created in the system. Please note the naming convention for roles! Example roles include: - ApiAttendeeBadgeCategoryCONTRACTOR - ApiAttendeeBadgeCategoryCREW - ApiAttendeeBadgeCategoryDELEGATE - ApiAttendeeBadgeCategoryEXHIBITOR - ApiAttendeeBadgeCategoryMEDIA - ApiAttendeeBadgeCategoryORGANIZER - ApiAttendeeBadgeCategoryPRESS - ApiAttendeeBadgeCategorySPEAKER - ApiAttendeeBadgeCategorySPONSOR - ApiAttendeeBadgeCategorySTAFF - ApiAttendeeBadgeCategorySTUDENT - ApiAttendeeBadgeCategoryVIP - ApiAttendeeBadgeCategoryVISITOR - ApiAttendeeBadgeCategoryNONE - for all articles that do not have a BadgeCategory **If one of these new roles is configured, all other articles will be filtered out. BadgeCategory roles can be combined.** #### 2\. Block-Scoped Payloads - **Modular response structure:** The API response is organised into logical blocks (such as attendee, address, customFields, termsOfService, ticket, article, booth, exhibitor, additionalSalesInformation). Each block can be enabled or disabled based on the assigned user role. - **Default behaviour:** If no specific role configuration is set, a baseline set of blocks is returned (e.g., attendee, address, customFields, ticket, article, booth, exhibitor) - the same as before version 4.135 - **Full access roles:** Special roles are available to grant full access to all attendee or ticket blocks: - ApiAttendeeWithAttendeeFullAccess (includes all attendee-related blocks) - ApiAttendeeWithAttendeeInformation - ApiAttendeeWithAddressInformation - ApiAttendeeWithCustomFieldsInformation - ApiAttendeeWithTermsOfServicesInformation - ApiAttendeeWithUserInformation - ApiAttendeeWithTicketFullAccess (includes all ticket-related blocks) - ApiAttendeeWithTicketsInformation - ApiAttendeeWithArtcleInformation - ApiAttendeeWithBoothInformation - ApiAttendeeWithExhibitorInformation - ApiAttendeeWithBarcodeInformation - ApiAttendeeWithTicketLinksInformation **If one of these new roles is configured, all other areas that are not configured will be deactivated. Roles can be combined.** #### 4\. Consent and Terms Metadata - **Transparency and compliance:** The API now includes metadata about the version of the Terms of Service and Privacy Policy that each user has accepted, including the identifier and timestamp. #### 5\. Additional Address Attribute - **Expanded address information:** The payload now includes the `stateOrProvince` attribute for attendee addresses. #### 6\. 1:N Short Code - **Short code support:** The API now includes 1:N short codes in the attendee payload. #### 7\. Request by Ticket Unique ID - **Flexible querying:** Attendee data can now also be requested using the unique ticket ID. - **New optional query parameter** - Indicates whether the provided ticket code should be interpreted as a ticket barcode. Set this parameter to true (the default is false) when searching for non-ADITUS tickets whose barcode value is a GUID. Otherwise, every GUID is interpreted as an ADITUS ticket unique ID. #### 8\. Additional User Attributes - **Extended user information:** The attendee payload now includes a new user object with the following attributes: - uniqueId - number - externalId1 - externalId2 - externalId3 - lastActionOn #### 9\. Unique IDs for All Entities - **Consistent identification:** Unique IDs are now available for all relevant entities, including: - FaireventAppearances (UniqueId and Number) - Exhibitor (UniqueId and Number) - Buyer (UniqueId) --- #### Summary of Improvements - **Privacy by design:** Only authorised partners see the data relevant to their assigned roles and articles. - **Event-specific data:** Terms of Service and Privacy Policy answers are strictly scoped to the relevant event. - **Operational clarity:** Structured payloads and additional attributes improve integration and monitoring. - **Future-ready:** The new structure supports further enhancements and performance improvements. ### From version 4.139 onwards Human documentation: https://developers.aditus.com/docs/attendees/extensions/from-version-4-139-onwards #### New Features and Enhancements from Version 4.139 With version 1.139, the Attendee API has been extended with several smaller enhancements to the response payload as well as a new use case. The payload now includes additional fields for identifying test transactions, capturing dynamic sale properties (UTMs / Affiliate links) from the purchase URL, and returning redeemed promotion codes. Furthermore, a new use case `By Sale` has been introduced, allowing consumers to retrieve all attendees associated with a specific sale transaction – for example, by using the `orderId` received via webhook (cart.checkedout). The following sections describe each change in detail. --- #### Key Enhancements #### 1\. New Payload Field: `isTestSale` A new integer field `isTestSale` has been added to the payload across **all use cases**. It indicates whether the transaction is a test sale. ``` json { "isTestSale": 1 } ``` | Field | Type | Values | Description | | --- | --- | --- | --- | | `isTestSale` | `integer` | `0` = real sale, `1` = test sale | Indicates whether the sale is a test transaction. If the field is **not present** in the payload, the sale is a real transaction (equivalent to `0`). | --- #### 2\. New Payload Object: `saleProperties` UTM tracking parameters are now included in the Attendee API payload, enabling marketing attribution analysis directly from attendee data. This is not limited to UTM parameters – any query parameter present in the URL at time of sale will be captured and returned as a key-value pair. A new dynamic dictionary `saleProperties` has been added to the payload. It contains **all query parameters** that were passed in the URL during the purchase process. ``` json { "saleProperties": { "utm_source": "newsletter", "utm_medium": "email", "utm_campaign": "spring_2026", "ref": "partner-portal", "custom_tracking": "abc123" } } ``` | Field | Type | Description | | --- | --- | --- | | `saleProperties` | `object` (Dictionary ) | A dynamic key-value dictionary containing all query parameters captured from the sale URL. Both keys and values are completely dynamic and depend on the parameters present in the URL at time of purchase. If no query parameters were present, this field may be absent from the payload. | **Note:** The keys are not restricted to standard UTM parameters (`utm_source`, `utm_medium`, etc.). Any arbitrary query parameter from the sale URL will be included, making this a fully flexible tracking mechanism. --- #### 3\. New Payload Field: `promotionCodes` Promotion codes redeemed during purchase are now returned as part of the attendee payload, on the ticket level. ``` json { "promotionCodes": [ "EARLYBIRD2026", "VIP-DISCOUNT" ] } ``` | Field | Type | Description | | --- | --- | --- | | `promotionCodes` | `string[]` | Array of promotion codes applied to this ticket. If **no promotion code** was redeemed, this field will **not be present** in the payload at all (rather than returning an empty array). | **Note:** The absence of the `promotionCodes` field indicates that no promotion code was used for this transaction. An empty array `[]` will not be returned. --- #### 4\. New Use Case: Query by Sale A new use case has been added that allows querying all attendees belonging to a specific sale transaction using the `saleId`. This is particularly useful when processing webhook events that provide an Order ID / `saleId`. | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `saleId` | `GUID` | Yes | The unique identifier of the sale (e.g., received via webhook). | ## GET Attendees – Base GET - all parameters - Endpoint: `GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/attendees/attendees-base-get-all-parameters ### Get Event Attendees ### Overview Retrieves a list of attendees/registrations for a specific event. This endpoint provides comprehensive attendee data including ticket information, custom fields, and registration details. It supports various filtering and pagination options to efficiently retrieve attendee records. ### Authentication This endpoint requires API authentication using: - **KEY**: API key for authentication (stored in `{{KEY}}` variable) - **SECRET**: API secret for authentication (stored in `{{SECRET}}` variable) These credentials should be configured in your environment or collection variables. ### Path Parameters | Parameter | Type | Required | Description | | --- | --- | --- | --- | | `eventId` | string | Yes | The unique identifier of the event for which to retrieve attendees. Use `{{eventId}}` variable. | ### Query Parameters ### Pagination & Filtering | Parameter | Type | Default | Description | | --- | --- | --- | --- | | `sinceRegistrationId` | integer | 0 | Retrieve attendees with registration IDs greater than this value. Useful for incremental syncing. Examples: `0`, `869300`, or use `{{lastMaxRegistrationId}}` | | `limit` | integer | 2500 | Maximum number of attendees to return in a single request. Examples: `1`, `5`, `30`, `2500` | | `ticketCode` | string | \- | Filter attendees by a specific ticket code. Example: `AW4F9QKM7T3XQ4` or use `{{ticketCode}}` | | `EMail` / `email` / `eMail` | string | \- | Filter attendees by email address. Note: Multiple parameter name variations exist for compatibility. | | `externalId1` | string | \- | Filter by first external identifier | | `externalId2` | string | \- | Filter by second external identifier | | `externalId3` | string | \- | Filter by third external identifier | | `saleId` | GUID | \- | The unique identifier of the sale (e.g., received via webhook). | ### Inclusion Options #### Ticket Owner Update Inclusion Options The API provides flexible options for including updates to ticket owner information in the result set. These options allow you to control both the completeness and the structure of the returned data, depending on your requirements for data accuracy and performance. #### `includingTicketOwnerUpdates` - **Type:** boolean - **Default:** `false` - **Description:** When set to `true`, the API includes updates to ticket owner information in the results. This means that any changes to the ticket owner (for example, when the country was changed) are reflected in the data returned by the API. - If `includingTicketOwnerUpdates` is `false`, ticket owner changes are not included in the result set. #### `IncludingTicketOwnerUpdatesWithoutDuplication` - **Type:** boolean - **Default:** `true` - **Description:** This parameter controls whether multiple updates to the same ticket owner are consolidated in the result set or returned as separate entries. - `true` (default): The API ensures that each registration appears only once in the result set, even if there have been multiple internal updates to the ticket owner. This is achieved by using an internal mechanism that groups together rapid, repeated updates, so only the latest state is returned. This approach prevents duplicate attendee records and provides a clean, deduplicated result set. - `false`: All internal ticket owner updates are returned as individual records, even if they are identical. This can result in the same attendee appearing multiple times in the result set (for example, three, four, or more times), depending on how many updates occurred. This mode may offer faster response times in certain scenarios, but requires the client to handle potential duplicates. **Note:** - The default and recommended setting is `IncludingTicketOwnerUpdatesWithoutDuplication = true`, which ensures a clean result set without duplicates. - Setting this parameter to `false` may be useful if you require the fastest possible response and can handle duplicate records in your application logic. | Parameter | Type | Default | Description | | --- | --- | --- | --- | | `includingTicketOwnerUpdates` | boolean | false | Include updates to ticket owner information in the results | | `IncludingTicketOwnerUpdatesWithoutDuplication` | boolean | true | Include ticket owner updates without duplicating records | | `includingCancellations / includingCancelations` | boolean | false | Meaning depends on use case, see use case for details. | | `includingBlockedTickets` | boolean | false | Meaning depends on use case, see use case for details. | | `includingBlockedLegitimations` | boolean | true | Include blocked legitimations. Example: `true` | | `includingCustomFieldsValue` | boolean | false | Include custom field values in the attendee data | ### Custom Fields Configuration | Parameter | Type | Default | Description | | --- | --- | --- | --- | | `customFieldsLookupListName` | string | \- | Name of the custom fields lookup list to use. Examples: `[MANDATOR]_PROFILDATEN_GESAMT`, `Profile_BASIS` | | `customFieldsLookupLanguage` | string | \- | Language for custom field lookups. Examples: `DefaultSystemLanguage`, `de` | | `customFieldValuesSeparator` | string | `,` | Character used to separate multiple custom field values. Default: comma (`,`) | | `customFieldsFiltering` | boolean | false | Enable filtering based on custom fields.
QPA\[EVENT-YEAR\]-\[EVENT-NR.\]_\* | | `customFieldsFilteringsSimpleFaireventList` | string | | Enable filtering based on custom fields. Example: `1003,1004,1005`
QPA_ | | `customFieldsFilteringIgnore` | string | PersonInfo1 | Ignore filtering on custom fields. | ### Data Processing Options | Parameter | Type | Default | Description | | --- | --- | --- | --- | | `useOwnerEMail` | boolean | false | _Only for use case by ticket code_
If this parameter is set to true, the result will also contain all other registrations we have for the barcode holder's email | ### Headers | Header | Value | Description | | --- | --- | --- | | `Accept` | `application/json` | Specifies the expected response format (JSON) | ### Example Use Cases ### 1\. Basic Attendee Retrieval Retrieve all attendees for an event: ``` GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees ``` ### 2\. Incremental Sync with Pagination Retrieve new registrations since the last sync: ``` GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?sinceRegistrationId={{lastMaxRegistrationId}}&limit=2500 ``` ### 3\. Find Attendee by Ticket Code Look up a specific attendee using their ticket code: ``` GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?ticketCode=AW4F9QKM7T3XQ4 ``` ### 4\. Find Attendee by Email Search for an attendee by email address: ``` GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?email=example@domain.com ``` ### 5\. Comprehensive Data with Custom Fields Retrieve attendees with all available data including custom fields and cancellations: ``` GET {{API_BASE_URL}}/terp/v1/events/{{EVENT_ID}}/attendees?includingCustomFieldsValue=true&customFieldsLookupListName=Profile_BASIS&customFieldsLookupLanguage=de&includingCancelations=true&includingTicketOwnerUpdates=true ``` ### Response The endpoint returns a JSON array of attendee objects containing registration details, ticket information, and optionally custom field data based on the query parameters provided. ### Notes - Use pagination (`limit` and `sinceRegistrationId`) for large events to avoid timeouts - Boolean parameters accept `true` or `false` values - The API_BASE_URL variable should point to your ADITUS API environment ### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | eMail | | Filters by attendee email address (case‑insensitive exact match; one value only, encode). | | externalId1 | | (Optional) See [With externalId](#with-externalId) | | externalId2 | | (Optional) See [With externalId](#with-externalId) | | externalId3 | | (Optional) See [With externalId](#with-externalId) | | ticketCode | | The barcode, quicode, registration code or ticketUniqueId | | useOwnerEMail | false | (Optional) If this parameter is set to true, the result will also contain all other registrations we have for the barcode holder's email | | saleId | 6054807e-d505-f111-93e3-00155d960409 | Querying all attendees belonging to a specific sale transaction using the saleId. | | sinceRegistrationId | 0 | Represents an offset for registrations that have already been transmitted. A full-load (sinceRegistrationId = 0) should only be carried out once a day, not more than 3 times a day. | | limit | 5 | (Optional) Number of items per response. Default value : 2500 A high limit can cause the request to time out if it takes longer than 30 seconds. Please choose the limit accordingly. | | includingTicketOwnerUpdates | false | If set to true, all update actions for the ticket owner will also be included. Only for delta loads. Do not set it for initial, full loads. | | IncludingTicketOwnerUpdatesWithoutDuplication | true | If set to false, his may result in duplicate results but the result ist faster. | | includingCancellations | false | Meaning depends on use case, see use case for details. | | includingBlockedTickets | false | Meaning depends on use case, see use case for details. | | includingBlockedLegitimations | true | If uncompleted legitimisations are not to be output, the parameter must be explicitly set to false. If the behaviour is changed, this can have an impact on paging. Currently, completed legitimations cannot be transmitted after completion. If this information is required, a full-load is currently recommended. (sinceRegistrationId = 0) | | includingCustomFieldsValue | false | If this parameter is set to true, a value list resolving is performed. The JSON changes, resolved values are contained in customField*Value. | | customFieldsLookupListName | PROFILDATEN_GESAMT | To change the value list for resolving value list keys | | customFieldsLookupLanguage | DefaultSystemLanguage | To change the language for resolving value list keys | | customFieldValuesSeparator | , | To change the separator between values | | customFieldsFiltering | false | Enable filtering based on custom fields. QPA[EVENT-YEAR]-[EVENT-NR.]_* | | customFieldsFilteringsSimpleFaireventList | | Enable filtering based on custom fields. Example: 1003,1004,1005 QPA_* | | customFieldsFilteringIgnore | PersonInfo1 | Ignore filtering on custom fields. | --- product: ADITUS API module: Business Intelligence direction: outbound document: API reference (machine-readable Markdown) canonical: https://developers.aditus.com/ai/docs/business-intelligence.md humanDocumentation: https://developers.aditus.com/docs/business-intelligence productPage: https://developers.aditus.com/business-intelligence endpoints: 9 index: https://developers.aditus.com/ai/docs.md collectionRefreshedAt: 2026-09-08T10:28:22.937Z --- # ADITUS API — Business Intelligence This is the machine-readable Markdown version of the **Business Intelligence** module of the ADITUS API reference (outbound (ADITUS data into your systems), 9 endpoints). It is generated from the same documentation source as the human pages; every section links to its human page. All ADITUS API modules are listed in https://developers.aditus.com/ai/docs.md. Product overview for humans: https://developers.aditus.com/business-intelligence ## Placeholders used in this document - `{{API_BASE_URL}}`, `{{IDENTITY_SERVER_BASE_URL}}` and similar `{{...}}` values are per-customer configuration. ADITUS provides the concrete hostnames together with your API credentials. There is no universal public hostname; never guess one. - `{{LANGUAGE}}` is an `Accept-Language` value such as `de-DE` or `en-GB`. - Request and response bodies are examples from the ADITUS Postman collection, not exhaustive schemas. ## Endpoints at a glance | Method | URL | Name | Auth | | --- | --- | --- | --- | | POST | `{{IDENTITY_SERVER_BASE_URL}}/connect/token` | Get access token | none | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest` | Get tickets | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/TicketUsages?$select=TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance` | Get ticket usages | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/StatisticGroups` | Get statistic groups | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/Surveys?$select=SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId` | Get surveys | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/health` | Get health | none | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1` | Get service document | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/odata/v1/$metadata` | Get metadata document | OAuth 2.0 bearer token (client credentials) | | GET | `{{API_BASE_URL}}/ticketinghub/swagger/v1/swagger.json` | Get swagger document | none | ## Contents - Business Intelligence — https://developers.aditus.com/docs/business-intelligence - Getting started — https://developers.aditus.com/docs/business-intelligence/getting-started - How ticketing data works — https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works - The chain: from fair to scan — https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/the-chain-from-fair-to-scan - People: buyer, holder, exhibitor — https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/people-buyer-holder-exhibitor - Counting visitors — https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/counting-visitors - Glossary — https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/glossary - Authentication — https://developers.aditus.com/docs/business-intelligence/authentication - POST Get access token — https://developers.aditus.com/docs/business-intelligence/authentication/get-access-token - Querying — https://developers.aditus.com/docs/business-intelligence/querying - Query options — https://developers.aditus.com/docs/business-intelligence/querying/query-options - Paging — https://developers.aditus.com/docs/business-intelligence/querying/paging - Performance and limits — https://developers.aditus.com/docs/business-intelligence/querying/performance-and-limits - Building the extract — https://developers.aditus.com/docs/business-intelligence/building-the-extract - Connecting your BI tool — https://developers.aditus.com/docs/business-intelligence/connecting-your-bi-tool - Datasets — https://developers.aditus.com/docs/business-intelligence/datasets - Reading the columns — https://developers.aditus.com/docs/business-intelligence/datasets/reading-the-columns - Column values — https://developers.aditus.com/docs/business-intelligence/datasets/column-values - GET Get tickets — https://developers.aditus.com/docs/business-intelligence/datasets/get-tickets - GET Get ticket usages — https://developers.aditus.com/docs/business-intelligence/datasets/get-ticket-usages - GET Get statistic groups — https://developers.aditus.com/docs/business-intelligence/datasets/get-statistic-groups - GET Get surveys — https://developers.aditus.com/docs/business-intelligence/datasets/get-surveys - Recipes — https://developers.aditus.com/docs/business-intelligence/recipes - Getting the numbers right — https://developers.aditus.com/docs/business-intelligence/getting-the-numbers-right - Field reference — https://developers.aditus.com/docs/business-intelligence/field-reference - Errors — https://developers.aditus.com/docs/business-intelligence/errors - FAQ and support — https://developers.aditus.com/docs/business-intelligence/faq-and-support - Service endpoints — https://developers.aditus.com/docs/business-intelligence/service-endpoints - GET Get health — https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-health - GET Get service document — https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-service-document - GET Get metadata document — https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-metadata-document - GET Get swagger document — https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-swagger-document ## Overview A read-only OData v4 feed that hands you your complete ticketing history as four analysis-ready datasets, built to bulk-load into your own data warehouse. Standard OData v4 over HTTPS, which means Power BI, Tableau, Azure Data Factory and Fivetran connect to it natively — no custom client, no SDK. Four datasets, `$select` and `$filter` for shaping, keyset paging for the walk, OAuth 2.0 client credentials for access. Read-only throughout. If that paragraph already told you what you needed, go straight to **Getting started**. ### What you can finally answer None of these are reports we render for you. You get the underlying rows and answer them in your own tools, at whatever depth your business needs. - **How many people actually came?** Tickets sold and people admitted are different numbers, and the gap is often the most interesting figure of the event. - **Which campaign actually sold?** Every sale carries its UTM parameters, so attribution stops being guesswork. - **What did each exhibitor do with their quota?** How many invitations they handed out, how many were redeemed, and by whom. - **Which visitor segments grew or shrank year over year?** Article, statistics group and legitimation, across editions. - **When is each entrance busy?** Every scan is timestamped and carries its entrance and terminal, so queueing and staffing become measurable. - **What did your visitors tell you, and who were they?** Survey answers join back to the ticket, so answers can be segmented by anything the ticket knows. - **What is a visitor worth?** Gross and net revenue per ticket, per article, per channel, per event. **Recipes** turns each of these into a concrete query. ### How it works: extract, then analyse This is an **extraction endpoint, not a query engine**. The intended pattern is ELT: pull the four datasets on a schedule, land them in your warehouse or lakehouse, and do the modelling, joining and aggregating there — with your own definitions, your own history, and joined to whatever else your business already knows about these people. That is a deliberate division of labour. We know the ticketing domain; you know what your business wants to measure. Handing you flat, complete, documented rows lets you answer questions we never anticipated, without waiting for us to build a report. A full extract of a mid-sized event tenant — around 196,000 tickets — takes **about 47 seconds**. Nightly loads are comfortable; hourly ones are fine too. ### What it is not - **Not a reporting API.** No aggregates, no `$apply`, no server-side grouping. Sums and counts happen in your warehouse. - **Not a lookup API.** No endpoint returns one ticket by id, on purpose. Live single-record access during a transaction is what the operational APIs are for. - **Not real-time.** The datasets track the operational system closely, but this is a batch surface. See **FAQ and support** for what freshness to expect. - **Not browser-callable.** Machine-to-machine only, no CORS. Your credentials stay server-side. ### Where this fits among the other modules Every other module on this portal is part of selling and admitting: discovery, cart, checkout, registration, badge, scan. They write the story. This one is the way back out. It hands you everything those modules produced, in a shape built for analysis rather than for transactions. Different audience, too — this is for your data and BI team, not for the developers integrating a checkout. ### Service root It lives on **the same base URL as your other ADITUS APIs**, under its own product prefix: ``` https:///api/ticketinghub/odata/v1 ``` In the requests below that is `{{API_BASE_URL}}/ticketinghub` — the same variable every other module on this portal uses, and it already carries the `/api` segment. Nothing separate to whitelist, no second host, no second certificate. Most BI and ETL tools consume the feed without custom code — see **Connecting your BI tool**. | Dataset | One row is | Columns | |---|---|---| | `Tickets` | one owned ticket, everything about it flattened on | 342 | | `TicketUsages` | one scan at an entrance | 119 | | `StatisticGroups` | one article-to-statistics-group assignment | 7 | | `Surveys` | one selected option of one survey answer | 32 | Alongside them: `/odata/v1/$metadata`, `/swagger` and `/health`, all under the same prefix. ### Where to start | If you are | Start at | |---|---| | New to our domain | **How ticketing data works** | | Building the loader | **Getting started**, then **Building the extract** | | Connecting Power BI, Tableau, ADF or Fivetran | **Connecting your BI tool** | | Wondering what a status column can contain | **Datasets → Column values** | | Looking for a specific number | **Recipes** | | About to publish a figure | **Getting the numbers right** | ### Assistant access (MCP) The same service also answers questions directly over MCP, using the same credentials and the same data scoping — useful for ad-hoc questions where you want the answer rather than the dataset. Talk to us if you would like access. ### Hints ##### **Important:** Read **Getting the numbers right** before you publish a figure to anyone. It is short, and it lists the things about this data that produce plausible-looking wrong numbers — several currencies in one column, test sales sitting in production data, and joins that multiply rows without telling you. ## Getting started Human documentation: https://developers.aditus.com/docs/business-intelligence/getting-started From nothing to a loaded dataset. Four steps, roughly twenty minutes. ### 1. Get a token Ask the customer system's IdentityServer for a token using the `client_credentials` grant and the scope `ticketinghub-api`. No user, no browser, no redirect — this is a server-to-server credential, valid for one hour. Detail, including the one requirement that catches people out, is in **Authentication**. ### 2. Pull a dataset, naming your columns ``` GET https:///api/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,TicketGrossPrice,CurrencyShort Authorization: Bearer ``` Name the columns you actually load. A full ticket row carries 342 columns and weighs about 10 KB; most warehouses want a fraction of that. Projecting is also the single biggest lever on speed. ### 3. Follow the next link until it stops Each response carries a page of rows and an `@odata.nextLink`. Request that link, repeat, and when a response comes back without one you have the complete dataset. Paging is keyset-based, so the last page costs what the first one did, and rows written while you read cannot be skipped or duplicated. Do not build your own paging with `$skip`. ### 4. Do the same for the other three, then model in your warehouse `Tickets` is the wide, denormalised centre. `TicketUsages` adds the scans, `Surveys` the survey answers, and `StatisticGroups` the article-to-group relation that the ticket rows cannot express on their own. **Building the extract** turns these four steps into a production-ready loader, with retry, incremental loading and scheduling. ### The reading order that saves time | Read | When | |---|---| | **How ticketing data works** | before you model anything, if our domain is new to you | | **Authentication** | first call, always | | **Querying** | before your first full extract | | **Datasets → Reading the columns** | before you decide which columns to load | | **Datasets → Column values** | when you filter or group on a status column | | **Getting the numbers right** | before you publish any figure | | **Recipes** | when you have a specific question to answer | | **Errors** | when something answers 4xx | ## How ticketing data works Human documentation: https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works Our domain, explained from the ground up. If you have not worked with trade-fair or event ticketing data before, this chapter is the difference between a model that works and one that quietly counts the wrong things. Read the three pages in order, then keep the **Glossary** open while you build. The short version: a **fair event** sells **articles**; a purchase is a **sale**; each sale produces **tickets**; each ticket belongs to a **ticket owner** who may not be the **buyer**; and each time someone walks through a door, the ticket produces a **usage**. ### The chain: from fair to scan Human documentation: https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/the-chain-from-fair-to-scan Five concepts, in the order they happen. Almost every column in the data hangs off one of them. #### Fair event A **fair event** (`Fairevent*`) is one edition of an event: a name and a year, with a start and end date. "Trade Fair 2026" and "Trade Fair 2027" are two fair events, not one. Several editions over the years are grouped by a **fair brand** (`FairBrand*`) — that is the thing whose growth you compare year over year. > Filter events by name **and** year separately. Never fold the year into the name, and never match names with `contains` — similarly named events are common and will silently merge. #### Article An **article** (`Article*`) is what is actually sold or issued: a day ticket, a multi-day pass, an exhibitor badge, a press pass, a parking ticket. It carries the price, the validity and the rules. `ArticleType` distinguishes what kind of thing it is — a ticket, a voucher, a service fee and so on. See **Datasets → Column values** for the full list. Articles are the natural grain for "what sells", and they are what links a ticket to its **statistics groups** — which is how attendance reporting is structured. See **Counting visitors**. #### Sale A **sale** (`Sale*`) is one purchase transaction: who bought, when, through which channel, paid or unpaid, test or real, and with which campaign parameters (`SaleUtm*`). A sale carries four separate status columns — overall status, payment, registration and receipt — because those four things genuinely progress independently. Their value sets are in **Column values**. One sale can produce many tickets — somebody buying five badges for their team is one sale, five tickets. > Sales carry a `SaleIsTest` flag, and test sales genuinely exist in production data. Excluding them is not optional. #### Ticket A **ticket** (`Ticket*`) is one admission entitlement, belonging to one person. It is the centre of this data model, and the `Tickets` dataset flattens everything above onto each ticket row: its event, its article, its sale, its buyer and its holder. A ticket has a status, may be cancelled, may be free, and may be a day ticket or a permanent one. It also carries links to its digital forms — PDF, mobile ticket, Apple and Google Wallet. #### Usage A **usage** (the `TicketUsages` dataset) is a scan: someone presented a ticket at an entrance and a turnstile or handheld device read it. Each usage records when, at which **entrance**, on which **terminal**, whether it was an entry or an exit, and whether it was the first scan of that day or of the whole event. A ticket can have **zero** usages — sold but never used, a normal and important case — or many, because visitors come back on several days and leave and re-enter. > This is where the sold-versus-attended gap lives, and it is why `TicketUsages` is a separate dataset rather than a column on the ticket. #### Two more things attached to tickets **Legitimation** (`Legitimation*`) is the proof someone showed to qualify for a restricted article — a press card, a student ID, a trade-visitor credential. Where an article is restricted, the legitimation says on what grounds it was granted, from when to when it is valid, and how far its verification got (`LegitimationStatus`). **Survey answers** (the `Surveys` dataset) are what the visitor told you during registration or afterwards. They join back to the ticket, so any answer can be segmented by anything the ticket knows. ### People: buyer, holder, exhibitor Human documentation: https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/people-buyer-holder-exhibitor Who is who. Getting this wrong is the most common cause of numbers that are subtly and confidently incorrect. #### The buyer is not the ticket holder Every ticket carries two sets of person fields, and they are frequently different people: | Fields | Who it is | Count | |---|---|---| | `Buyer*` | the person who **paid** | 33 columns | | `TicketOwner*` | the person who **attends** | 40 columns, plus 107 custom fields | An assistant buying ten badges for a delegation is one buyer and ten ticket owners. A marketing manager buying a ticket for a colleague is a buyer who never attends. > "How many customers do we have" is a buyer question. "How many visitors came" is a ticket-owner question. If a stakeholder's question is ambiguous, answer both — the two numbers are genuinely different and the difference is usually interesting. The ticket owner fields also carry the demographic and contact attributes a visitor supplied during registration, which is what makes segmentation possible. See **Datasets → Reading the columns** for the custom-field block. #### Organiser tickets and exhibitor tickets Tickets reach visitors along two entirely different routes, and mixing them produces nonsense: | Flag | Meaning | |---|---| | `TicketIsIssuedByOrganizer` | the organiser sold or allocated it — public sales, direct invitations, internal allocations | | `TicketIsIssuedByExhibitor` | an exhibitor handed it out from their own quota, typically as a free invitation to their customers | Exhibitor invitations are usually free, come in bulk, and are redeemed at a far lower rate than purchased tickets. Averaging them together with paid sales drags down every conversion figure you compute and tells you nothing true about either group. > Any question about exhibitor performance — "what did exhibitor X hand out", quota usage, invitation redemption — needs `TicketIsIssuedByExhibitor eq true`. Organiser sales analysis needs the other flag. Report them separately unless you have a reason not to. The `Exhibitor*` columns identify which exhibitor issued the ticket. `SaleDistributionChainType` tells you which channel the sale came through. #### The mandator `MandatorInternalId` is the tenant discriminator — the organisation whose data this is. Your feed is scoped to your own mandator on the server, before any query runs, so this column is constant for you. You never need to filter on it, and you cannot widen it. It appears in the data because it is part of every key. ### Counting visitors Human documentation: https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/counting-visitors How attendance is counted, and where the numbers actually come from. Trade-fair attendance figures are **audited**. German organisers commonly report them under the FKM scheme — the voluntary audit of trade-fair and exhibition statistics — and audited figures follow rules that do not match naive row counts. In this data those rules live on the **statistics groups**, which is why `StatisticGroups` is a dataset of its own. #### Statistics groups are where reporting structure lives A **statistics group** is a reporting bucket that articles belong to. The catch: an article is regularly a member of **several** groups at once, which a single column on the ticket row cannot express. Attendance reporting therefore goes through the article, and from there through its groups. Join it on `MandatorInternalId` and `ArticleInternalId`. Each group row carries two flags: | Field | Means | |---|---| | `IsFkmTotal` | the group counts towards the audited total | | `IsFkmVisitor` | the group counts as visitors | **These are independent flags, not a partition.** A group can carry both, one, or neither: - A visitor badge group is normally in **both**. - A group that was present but does not count as attendees may be in the **total** only. - A plain business category — exhibitor, press, other, test — is a row with **both false**, and that is entirely normal. > **Never compute "non-visitors" as total minus visitor.** That subtraction has no meaning here, and it produces a number that looks entirely plausible and is wrong. Group by the two flags together and report the combinations. #### Two traps when you join **The join multiplies rows.** An article in three groups produces three rows per ticket, so a naive `COUNT(*)` after joining overcounts badly. **Count distinct `TicketInternalId`**, and aggregate to the grain you want before or during the join. **An article that belongs to no group has no row at all** in `StatisticGroups`, so an inner join silently drops those tickets. Use a left join and decide deliberately what the unassigned bucket means in your report — often it belongs in an "other" category rather than being dropped. #### Sold, admitted, and present Four different questions, four different answers, none of which need a statistics group at all: | Question | How | |---|---| | How many were **sold or issued**? | count rows in `Tickets` | | How many people **came**? | count distinct `TicketInternalId` in `TicketUsages` | | How many **visits** were there? | count rows in `TicketUsages` (a visitor returning on three days is three) | | How many were present **on a given day**? | count distinct tickets with `IsFirstOfDay eq true` in that day | The gap between the first and the second is your no-show rate, and it is usually one of the most valuable figures in the whole dataset. **Recipes** shows the query. #### Segmenting attendance When you need attendance broken down, the dimensions that hold up are: | Dimension | Where | |---|---| | Article | `ArticleName`, or `ArticleType` for the coarse kind | | Statistics group | `Name` on `StatisticGroups`, joined via `ArticleInternalId` | | Legitimation | `Legitimation*` on `Tickets` | | Issue route | `TicketIsIssuedByOrganizer` / `TicketIsIssuedByExhibitor` | | Sales channel | `SaleDistributionChainType` | | Event edition | `FaireventName` + `FaireventYear`, or `FairBrandName` across years | ### Glossary Human documentation: https://developers.aditus.com/docs/business-intelligence/how-ticketing-data-works/glossary Terms you will meet in the data and in this documentation, in plain language. | Term | What it means | |---|---| | **Article** | What is sold or issued: a day ticket, a pass, an exhibitor badge, a parking ticket. Carries price, validity and rules. Prefix `Article*`. | | **Assortment** | A grouping of articles offered together in a shop context. | | **Buyer** | The person or account that paid for a sale. Not necessarily the person who attends. Prefix `Buyer*`. | | **Cross-selling** | An additional article sold alongside the main one. The data records both the source article and the uplift. Prefix `CrossSelling*`. | | **Distribution chain** | The channel a sale came through — internet, on site, exhibitor service centre, internal. Column `SaleDistributionChainType`. | | **Entrance** | The physical door or gate where a ticket was scanned. | | **Fair brand** | The recurring event series that individual editions belong to. What you compare year over year. Prefix `FairBrand*`. | | **Fair event** *(Fairevent)* | One edition of an event — a name plus a year, with dates. Prefix `Fairevent*`. | | **FKM** | The voluntary audit scheme for trade-fair and exhibition statistics used by German organisers. The `IsFkm*` flags on statistics groups mark what feeds those audited figures. | | **Legitimation** | The proof someone presented to qualify for a restricted article — press card, student ID, trade-visitor credential. Prefix `Legitimation*`. | | **Mandator** | The tenant — the organisation whose data this is. Constant for your feed; you cannot query outside it. | | **mTicket** | The mobile ticket form, as opposed to a printed or wallet ticket. | | **Promotion code** | A discount or access code applied to a sale. Prefix `PromotionCode*`. | | **Quicode** | An ADITUS barcode format used on tickets and badges. | | **Regcode** | A one-to-one registration code, used to redeem an invitation into a personalised ticket. | | **Sale** | One purchase transaction. Can produce many tickets. Prefix `Sale*`. | | **Statistics group** | A reporting bucket that articles belong to, carrying the FKM flags. An article can be in several at once, which is why they live in their own dataset. | | **Ticket** | One admission entitlement belonging to one person. The centre of the data model. Prefix `Ticket*`. | | **Ticket owner** | The person who attends and whose name is on the badge. Prefix `TicketOwner*`. | | **Terminal** | The device that performed a scan — a turnstile, a handheld reader, a gate. | | **Token** | The UPPER_SNAKE_CASE values the status columns carry, for example `PAID` or `ASSIGNED`. See **Datasets → Column values**. | | **Upselling** | An upgrade from one article to a higher-value one. The data records the source article and the uplift. Prefix `Upselling*`. | | **Usage** | One scan of a ticket at an entrance. Entry or exit. Zero to many per ticket. | | **UTM parameters** | Campaign tracking parameters carried on a sale (`SaleUtmSource`, `SaleUtmMedium`, `SaleUtmCampaign`, `SaleUtmTerm`, `SaleUtmContent`). What makes marketing attribution possible. | #### Naming conventions in the data Once you see the pattern, most of the 342 ticket columns explain themselves: | Suffix | Means | |---|---| | `*InternalId` | the numeric primary key of that thing in the operational system. Stable, use it for joins. | | `*UniqueId` | a GUID. Stable across systems, use it when you need a globally unique reference. | | `*Name` | the human-readable label. What belongs on a chart axis. | | `*No` / `*Number` | a business number, such as a ticket number or an event number. | | `Is*` | a boolean flag. | | `*At` / `*On` / `*Timestamp` | a point in time. | | `*Status` / `*Type` / `*State` | a token column — see **Column values**. | So `FaireventInternalId`, `FaireventUniqueId` and `FaireventName` are the same event seen three ways: join on the first, reference with the second, display the third. ## Authentication Human documentation: https://developers.aditus.com/docs/business-intelligence/authentication Machine-to-machine only, using OAuth 2.0 `client_credentials` against the customer system's IdentityServer. There is no interactive login path — this is a credential for your ETL job, not for a person. ### Requesting a token ### Token request ``` http POST https:///connect/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id=--ticketinghub-client &client_secret= &scope=ticketinghub-api ``` The token endpoint is IdentityServer's own host, not the API base URL — the data feed is proxied, the token flow is not. Your client id follows the pattern `--ticketinghub-client`. The secret is provisioned to you — access is gated by that secret, not by the client merely existing. ### Token response ``` json { "access_token": "eyJhbGciOi...", "expires_in": 3600, "token_type": "Bearer", "scope": "ticketinghub-api" } ``` Send it on every request as `Authorization: Bearer` . The gateway forwards it unchanged; the API behind it does the validating. ### Three requirements, and the one that catches people - **The scope must be** **`ticketinghub-api`****.** A token issued for another ADITUS API will not open this one. - **The token must have no subject.** ← This is the one. A _user_ token is rejected with `403` even when it carries the correct scope. This surface answers to services, not to people acting through them. Using the `client_credentials` grant gives you a subject-less token by definition, so following the flow above is enough. - **The lifetime is 3600 seconds.** Cache the token and reuse it across your whole extract; do not request one per page. Both reference tokens and self-contained `at+jwt` tokens are accepted. ### What is not supported - No interactive login, no authorization-code flow, no refresh tokens. When the token expires, request a new one the same way. - No CORS. This API cannot be called from browser-side code, deliberately — your secret has no business being in a browser. ##### **Important:** Your feed is scoped server-side to your own mandator. The constraint is applied before any query reaches the database, so you always see your own data and only your own data. There is no parameter that can widen it. ### When it fails | Status | Meaning | | --- | --- | | `401` | No token, an expired token, or a token this service cannot validate | | `403` | A valid token that lacks the `ticketinghub-api` scope, or one that carries a subject | See **Errors** for the full picture. ### POST Get access token - Endpoint: `POST {{IDENTITY_SERVER_BASE_URL}}/connect/token` - Authentication: none - Human documentation: https://developers.aditus.com/docs/business-intelligence/authentication/get-access-token Exchanges your client credentials for an access token. First call in any integration, and the one your scheduled job repeats every hour. #### Request Form-encoded body, four fields: - `grant_type`(string): always `client_credentials`. - `client_id`(string): your client, in the form `--ticketinghub-client`. - `client_secret`(string): the secret provisioned to you. - `scope`(string): always `ticketinghub-api`. #### Response - `access_token` (string): send this as `Authorization: Bearer ` on every subsequent request. - `expires_in` (integer): lifetime in seconds. Currently 3600. - `token_type` (string): `Bearer`. - `scope` (string): the granted scope, `ticketinghub-api`. #### Notes Cache the token for its lifetime. An hour is longer than most extracts take, so one token usually covers a whole load; requesting a fresh one per page is needless load on the identity server and slows the extract down. The token must carry **no subject**. A user token is rejected by the data API with `403` even when the scope is correct. The `client_credentials` grant produces a subject-less token by definition, so following this flow is all it takes. The token endpoint is IdentityServer's own host, not the API base URL — the data feed is published through the gateway, the token flow is not. If a long extract outlives its token, treat a single `401` as the signal to fetch a new one and retry the same page — see **Building the extract**. #### Response example: (200 OK) ```json { "access_token": "", "expires_in": 3600, "token_type": "Bearer", "scope": "ticketinghub-api" } ``` #### Response example: Get access token (401 – invalid client) (401 Unauthorized) ```json { "error": "invalid_client" } ``` ## Querying Human documentation: https://developers.aditus.com/docs/business-intelligence/querying What you can ask for, how to page through it, and what a full extract costs. Read **Query options** and **Paging** before your first load, and **Performance and limits** before your first *full* load. ### Query options Human documentation: https://developers.aditus.com/docs/business-intelligence/querying/query-options A deliberately small slice of OData v4, supported identically on all four datasets. | Option | Supported | Notes | |---|---|---| | `$select` | yes | Name the columns you load. The most important option here. | | `$filter` | yes | Standard OData predicates. | | `$orderby` | yes | Note that it changes the paging order, see **Paging**. | | `$count` | yes | `$count=true` scans the whole dataset. | | `$top` / `$skip` | yes | `$top` is capped at 1000. Prefer next links over `$skip`. | | `$skiptoken` | yes | Server-generated. Follow it, do not construct it. | | `$expand` | **no** | The datasets are flat and have no navigation properties. Join in your warehouse instead. | | `$apply` | **no** | No server-side aggregation. Aggregate in your warehouse. | | `$search` | **no** | Use `$filter` with `contains()`. | #### `$select` ``` ?$select=TicketInternalId,FaireventName,TicketGrossPrice,CurrencyShort ``` Projecting is not only about response size. The underlying datasets are assembled from several sources, and asking for fewer columns lets the database skip work it would otherwise do. It shortens every page you fetch. #### `$filter` Standard OData v4 syntax. The operators you will use: | Operator | Example | |---|---| | `eq`, `ne` | `SaleIsTest eq false` | | `gt`, `ge`, `lt`, `le` | `TicketGrossPrice gt 0` | | `and`, `or`, `not` | `FaireventYear eq 2026 and SaleIsTest eq false` | | `contains()`, `startswith()`, `endswith()` | `contains(ArticleName,'Day')` | | `null` comparison | `TicketCancelledOn eq null` | Literal syntax that trips people up: | Type | How to write it | |---|---| | String | single quotes: `'Trade Fair'`; escape an inner quote by doubling it: `'O''Brien'` | | Boolean | `true` / `false`, unquoted | | Number | unquoted: `42`, `25.00` | | Date and time | ISO 8601, unquoted: `2026-01-01T00:00:00Z` | | Guid | unquoted: `4f1e...` | #### Filtering a status column Status-like columns — `TicketStatusType`, `SaleStatus`, `ArticleType` and the rest — are **plain strings holding UPPER_SNAKE_CASE tokens**, not OData enum types. Filter them with an ordinary quoted string: ``` ?$filter=SalePaymentStatus eq 'PAID' ?$filter=ArticleType eq 'TICKET' and TicketStatusType ne 'BLOCKED' ``` Most of these columns have a **closed, documented value set** — **Datasets → Column values** lists every one. Do not guess a token; a misspelt one is not an error, it simply matches nothing. Three filters worth knowing before you write any others: ``` ?$filter=SaleIsTest eq false ?$filter=FaireventName eq 'Trade Fair' and FaireventYear eq 2026 ?$filter=FaireventInternalId eq 42 ``` - `SaleIsTest eq false` excludes test sales. Apply it unless you specifically want them. - Match event names with `eq`, never `contains`, and filter the year separately. - Filtering by event is the effective way to split a very large extract into chunks that parallelise. Property names are matched case-insensitively; **token values are not** — they are uppercase. #### Why there is no by-key endpoint `Tickets(MandatorInternalId=1,TicketInternalId=2)` answers `404`, deliberately. This surface exists for bulk extraction, and single-record lookup during a transaction is what the operational APIs are for. The keys are declared in the model because they are what turns paging into a cheap keyset walk. ### Paging Human documentation: https://developers.aditus.com/docs/business-intelligence/querying/paging Server-driven and keyset-based. Your job is to follow a link until it stops appearing. #### The walk Request a dataset. The response carries a page of rows and, if more remain, an `@odata.nextLink`: ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#Tickets(TicketInternalId,FaireventName,TicketGrossPrice,CurrencyShort)", "value": [ { "TicketInternalId": 100241, "FaireventName": "Trade Fair", "TicketGrossPrice": 25.00, "CurrencyShort": "EUR" }, { "TicketInternalId": 100242, "FaireventName": "Trade Fair", "TicketGrossPrice": 0.00, "CurrencyShort": "EUR" } ], "@odata.nextLink": "https://example.aditus.de/api/ticketinghub/odata/v1/Tickets?$select=...&$skiptoken=MandatorInternalId-1,TicketInternalId-100242" } ``` Request that link verbatim. When a response arrives without `@odata.nextLink`, you have the complete dataset. #### Why not `$skip` `$skip` is offset paging: the deeper you go, the more rows the database walks past, so page 300 costs far more than page 1. Worse, tickets are being sold into the same dataset while you read it, and an offset walk can skip or repeat rows when data shifts underneath it. The `$skiptoken` in the next link holds the last key values instead, so each page is a range seek on a narrow index. Cost stays flat across the walk, and the walk stays consistent even while the operational system is busy. #### Page sizes | Dataset | Rows per page | |---|---| | `Tickets` | 500 | | `TicketUsages` | 1000 | | `StatisticGroups` | 1000 | | `Surveys` | 500 | A smaller `$top` lowers the page size; it cannot raise it above these values, and `$top` above 1000 is rejected. #### One caveat on key order For the two datasets with three-part keys — `StatisticGroups` and `Surveys` — the model sorts key properties by name, so the walk runs alphabetically rather than in declared order. The walk is still stable and complete, because the key is unique. ##### **Important:** Treat `$skiptoken` as opaque. It is server-generated, its shape is not part of the contract, and hand-crafting one is unsupported. Next links are stable, so you can safely retry or resume from the last one you followed. ### Performance and limits Human documentation: https://developers.aditus.com/docs/business-intelligence/querying/performance-and-limits Read this before your first full extract. It is the difference between a load measured in minutes and one measured in hours. #### What a real extract costs Measured against a tenant holding roughly 196,000 tickets: | | | |---|---| | Pages walked | 392 | | Wall-clock for the full walk | about 47 seconds | | Transferred without `$select` | about 1.8 GB | | Cost per page | flat across the walk | A full ticket row is roughly 10 KB, so a 500-row page is about 5 MB, and a complete unprojected tenant load runs into gigabytes. With a sensible projection it is a fraction of that. At 47 seconds, nightly loads are comfortable and hourly ones are entirely feasible. #### What actually helps **Use `$select`.** This matters more than everything else on this page combined. Beyond the saving in bytes, projecting down to the columns you need lets the database eliminate work, which measurably shortens every page. **Ask for `$count` once, not per page.** It scans the whole dataset each time. **Split very large loads by event.** `$filter=FaireventInternalId eq ` cuts total work further and parallelises naturally — one worker per event. **Reuse the token.** It is valid for an hour, longer than most extracts take. #### Hard limits | Limit | Value | |---|---| | `$top` maximum | 1000 (above this the request is rejected with 400) | | Page size | per dataset, see **Paging** | | Query timeout | 300 seconds | | Rate limit | none today | There being no rate limit is not an invitation to run twenty parallel extracts — you are reading a live production system that is also selling tickets. Two to four parallel workers, split by event, is a reasonable ceiling. #### Incremental loads There is no delta mode yet, and the four datasets differ in what they offer: | Dataset | Watermark column | |---|---| | `TicketUsages` | `LastRefreshedAt` | | `Surveys` | `LastRefreshedAt` | | `Tickets` | none | | `StatisticGroups` | none | Where a watermark exists you can filter on it and fetch only what changed, which is worth doing for `TicketUsages` — it is the dataset that grows fastest during an event. > **The limitation that applies to any watermark approach:** a hard-deleted row leaves nothing behind to filter on, so it will not appear as a change. Periodic full reloads remain the only way to catch deletions. Given the 47-second figure above, a nightly full reload of `Tickets` is usually the simpler and safer design. **Building the extract** shows both patterns. ## Building the extract Human documentation: https://developers.aditus.com/docs/business-intelligence/building-the-extract Turning the four steps of **Getting started** into a loader you can schedule and trust. ### The loop The entire protocol is: get a token, request the first page, follow `@odata.nextLink` until it is gone. In Python: ```python import requests # Your ADITUS API base URL plus the product prefix. BASE_URL = "https:///api/ticketinghub" IDENTITY = "https://" def get_token(client_id, client_secret): r = requests.post( f"{IDENTITY}/connect/token", data={ "grant_type": "client_credentials", "client_id": client_id, "client_secret": client_secret, "scope": "ticketinghub-api", }, timeout=30, ) r.raise_for_status() return r.json()["access_token"] def extract(token, dataset, select=None, filter=None): """Yields every row of a dataset, one page at a time.""" params = {} if select: params["$select"] = ",".join(select) if filter: params["$filter"] = filter url = f"{BASE_URL}/odata/v1/{dataset}" headers = {"Authorization": f"Bearer {token}"} while url: r = requests.get(url, params=params, headers=headers, timeout=300) r.raise_for_status() body = r.json() yield from body["value"] # The next link is absolute and already carries every query option. url = body.get("@odata.nextLink") params = None ``` The important detail is in the last three lines: **the next link already contains your `$select` and `$filter`**, so pass `params` only on the first request. Re-appending them to the next link is the single most common bug when people write this loop. ### Retry and resume Next links are stable, so a failed page can simply be retried — you never have to restart the walk. ```python import time def get_with_retry(url, headers, params=None, attempts=5): for attempt in range(attempts): try: r = requests.get(url, params=params, headers=headers, timeout=300) if r.status_code in (500, 502, 503, 504): raise requests.HTTPError(f"server error {r.status_code}") r.raise_for_status() return r except (requests.HTTPError, requests.ConnectionError, requests.Timeout): if attempt == attempts - 1: raise time.sleep(2 ** attempt) # 1, 2, 4, 8 seconds ``` What to retry and what not to: | Status | Retry? | |---|---| | `500`, `502`, `503`, `504` | Yes, with backoff. A `500` is often a query that hit the 300-second timeout — narrowing `$select` usually fixes it permanently. A `502` or `504` can also be the gateway not reaching the API. | | `401` | Once, after fetching a fresh token. Then fail. | | `400`, `403`, `404` | Never. These are your bug, not a transient fault. | **Token expiry mid-walk.** A long extract can outlive its hour. Either refresh proactively when the token is close to expiring, or treat a single `401` as the signal to fetch a new token and retry the same page. ### Full reload versus incremental **Full reload** — the default, and usually the right answer: ```python rows = list(extract(token, "Tickets", select=[ "TicketInternalId", "FaireventName", "ArticleName", "ArticleType", "TicketGrossPrice", "CurrencyShort", "SalePaymentStatus", "SaleIsTest", ])) ``` Load into a staging table, then swap it in atomically. At ~47 seconds for 196,000 tickets, a nightly full reload is simpler than any incremental scheme and immune to the deletion problem below. **Incremental**, available for `TicketUsages` and `Surveys`, which both carry `LastRefreshedAt`: ```python watermark = read_watermark_from_your_warehouse() # e.g. "2026-09-01T00:00:00Z" rows = extract(token, "TicketUsages", filter=f"LastRefreshedAt gt {watermark}") ``` > **Read this before relying on a watermark.** A hard-deleted row leaves nothing behind to filter on, so deletions never appear as changes. Any watermark-only pipeline drifts away from the source over time. Pair it with a periodic full reload — weekly is usually enough — or accept the drift knowingly. `Tickets` and `StatisticGroups` have no watermark at all, so they are full-reload only. ### Scheduling | Cadence | Fits | |---|---| | Nightly full reload | Almost everyone. Simple, complete, catches deletions. | | Hourly during an event | Live dashboards. Full-reload `Tickets`, incremental `TicketUsages`. | | Weekly | Reference data — `StatisticGroups` changes rarely. | Call `GET {BASE_URL}/health` first. It fails fast and clearly, instead of your job discovering the problem halfway through a 400-page walk. ### A checklist before you call it done - [ ] `$select` names only the columns you load - [ ] `SaleIsTest eq false` applied in the extract, not left to each report - [ ] Next link followed without re-appending query options - [ ] Retry with backoff on 5xx; no retry on 4xx - [ ] Token refreshed on `401`, not per page - [ ] `CurrencyShort` loaded alongside every monetary column - [ ] Status tokens checked against **Column values**, not guessed - [ ] Health checked before the run - [ ] Row count compared against `$count=true` after the run ## Connecting your BI tool Human documentation: https://developers.aditus.com/docs/business-intelligence/connecting-your-bi-tool The feed is standard **OData v4**, so most BI and ETL tools consume it without any custom code. Point the connector at the service root, give it a bearer token, and let it read `$metadata` to map the schema. ### What every tool needs | Setting | Value | |---|---| | Service root / URL | `https:///api/ticketinghub/odata/v1` | | Auth | `Authorization: Bearer ` header | | Token endpoint | `https:///connect/token` | | Grant | `client_credentials`, scope `ticketinghub-api` | | OData version | v4 | The service root sits on the same host as your other ADITUS APIs, so whatever network path, proxy exception or firewall rule already lets your tooling reach those covers this too. > **The catch with every tool below:** the token is valid for one hour, and none of these connectors know how to run a `client_credentials` flow on their own. Whatever tool you use, something has to fetch the token before the refresh runs — a pipeline step, a small script, or a secret your orchestrator rotates. ### Power BI Use **Get Data → OData feed**, then supply the token as a header in the advanced editor: ``` let Token = "...", // fetched by your refresh pipeline, not hard-coded Source = OData.Feed( "https:///api/ticketinghub/odata/v1", null, [ Headers = [ Authorization = "Bearer " & Token ], Implementation = "2.0" ] ) in Source ``` Power Query folds `$select` and `$filter` into the request, so removing columns and filtering rows in the query editor genuinely reduces what is transferred. Do both before loading — this is where the 10 KB-per-row figure bites. > Because the status columns are plain strings rather than OData enum types, they arrive as ordinary text and every connector handles them without special configuration. Model them as dimension columns and use **Column values** to build the lookup tables. > Power BI's scheduled refresh cannot itself perform the token flow. Most teams land the data in a warehouse with a pipeline and point Power BI at that instead, which also gives them history. ### Tableau Tableau's OData connector expects a URL it can call directly. In practice the same token problem applies, so the common patterns are: - Extract to a warehouse or file with a pipeline, then connect Tableau to that. Recommended. - Use Tableau's Web Data Connector with a small script that fetches the token. ### Azure Data Factory / Synapse ADF has a first-class **OData linked service**. The usual shape: 1. A **Web activity** calls the token endpoint with the four form fields. 2. A **Copy activity** with an OData source uses `@activity('GetToken').output.access_token` in an `Authorization` header. 3. Set the sink to Parquet or your warehouse table. ADF follows `@odata.nextLink` automatically, so paging needs no configuration. ### Fivetran, Airbyte and similar Use the generic **OData** or **HTTP/REST** source. Configure: - Base URL: `https:///api/ticketinghub/odata/v1` - Auth: bearer token, refreshed by the connector's OAuth2 client-credentials support if it has one - Streams: `Tickets`, `TicketUsages`, `StatisticGroups`, `Surveys` - Pagination: follow `@odata.nextLink` - Incremental cursor: `LastRefreshedAt` for `TicketUsages` and `Surveys` only ### dbt and modelling Once the four datasets are landed, the modelling is straightforward — and the traps are documented rather than discovered: - Stage each dataset one-to-one, applying `SaleIsTest eq false` at extract or stage. - Build a ticket fact from `Tickets`, keeping `CurrencyShort` next to every measure. - Build a usage fact from `TicketUsages`; remember it is scans, not people. - Treat `StatisticGroups` as a bridge table, not a dimension — the many-to-many is the whole point. - Treat `Surveys` at selection grain, aggregating to answer or submission grain in a model above it. - Seed the token sets from **Column values** as small lookup tables, so a status you have never seen before shows up as an unmatched key rather than disappearing. **Getting the numbers right** lists every rule these models need to encode. ## Datasets Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets What each of the four datasets contains, what exactly one row means, and how they join together. Start with **Reading the columns** if you are deciding what to load; it maps the ticket columns into families and explains the types. **Column values** lists what the status columns can contain. ### The shape of the model `Tickets` is the wide, denormalised centre: it carries the event, article, sale, buyer and holder context flattened onto every row. The other three are narrow and deliberately carry none of that context — join them back to `Tickets` when you need it. | From | To | Join on | Grain effect | |---|---|---|---| | `TicketUsages` | `Tickets` | `MandatorInternalId`, `TicketInternalId` | many to one | | `Surveys` | `Tickets` | `MandatorInternalId`, `TicketInternalId` | many to one | | `StatisticGroups` | `Tickets` | `MandatorInternalId`, `ArticleInternalId` | many to one | That denormalisation is intentional. It means most questions can be answered from `Tickets` alone, without a join, and the join keys you do need are few and obvious. > Note the grain change on the joins: a ticket has many usages, and an article has many statistics groups. Both multiply rows, so aggregate deliberately rather than counting after joining. ### Reading the columns Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/reading-the-columns How to navigate 342 columns without reading 342 rows of documentation. #### Column families Every column belongs to a family identified by its prefix. Here is the whole ticket row, by family: | Family | Columns | What it describes | |---|---|---| | `TicketOwnerInfo*` | 107 | **Your own custom registration fields** — see below | | `Ticket*` | 41 | The ticket itself: number, status, validity, prices, wallet links | | `TicketOwner*` | 40 | The person who attends: name, address, contact, company, function | | `Buyer*` | 33 | The person who paid | | `Sale*` | 16 | The purchase transaction, including `SaleUtm*` campaign parameters | | `Fairevent*` | 16 | The event edition: name, year, dates, numbers | | `Legitimation*` | 12 | Proof presented for a restricted article, and its validity window | | `UpsellingSource*` / `Upselling*` | 10 | Upgrade origin and value uplift | | `CrossSellingSource*` / `CrossSelling*` | 10 | Cross-sell origin and value uplift | | `PromotionCode*` | 8 | Discount or access code applied | | `Article*` | 8 | What was sold, including the badge category | | `Exhibitor*` | 6 | Which exhibitor issued the ticket, where applicable | | `FairBrand*` | 4 | The event series the edition belongs to | | `Currency*` | 4 | Currency of the monetary columns | | `Payment*` | 4 | How it was paid | | `Mandator*`, `Cart*`, `Third*` | 3 | Tenant, cart reference, third-party registration state | `TicketUsages` follows the same convention with a `Usage`-flavoured core (`Timestamp`, `Entrance*`, `Location*`, `IsEntry`, `IsExit`, `IsFirstOf*`) plus a repeated slice of ticket, article and event columns so common questions need no join. #### The custom registration fields Almost a third of the ticket row — `TicketOwnerInfo2` … `TicketOwnerInfo100` and `TicketOwnerInfoLookup1` … `TicketOwnerInfoLookup8` — is **not a fixed schema**. These are the free-form fields your own registration forms write into. | | | |---|---| | What they are | Slots filled by your registration configuration | | Labels in `$metadata` | Generic: "Ticket owner: Info 47" | | Meaning | Defined by **your** setup, not by us | | Numbering | Starts at `TicketOwnerInfo2`; there is no `TicketOwnerInfo1` | > **You have to supply the mapping.** We cannot label these for you, because what `TicketOwnerInfo47` holds depends on how your registration form was configured. Ask whoever configured it for the field mapping, record it in your warehouse as a lookup, and rename the columns as you stage them. A staging model that renames `TicketOwnerInfo47` to `visitor_job_role` is the difference between a usable warehouse and an unusable one. > > Most extracts load only the handful of these that their forms actually use. Loading all 107 is rarely useful. #### Types and how they behave | Type in `$metadata` | Notes | |---|---| | `Edm.Int32` / `Edm.Int64` | Ids and counts. | | `Edm.String` | Text — including the status columns, see below. | | `Edm.Boolean` | Flags. Some are nullable, so treat `null` as its own case. | | `Edm.Decimal` | Money, with precision 14 and scale 6. Load as decimal, never float. | | `Edm.Guid` | The `*UniqueId` columns. | | `Edm.DateTimeOffset` | Points in time, with an offset. | | `Edm.Date` / no-offset date-times | Calendar dates and internal timestamps — see the warning below. | #### Status columns are strings holding tokens `TicketStatusType`, `SaleStatus`, `ArticleType` and their relatives are `Edm.String` carrying **UPPER_SNAKE_CASE tokens** such as `ASSIGNED`, `PAID` or `SERVICE_FEE`. They were numeric enums once; the hub converted them to text deliberately, so that consumers see a readable label instead of an integer whose meaning lives in someone else's source code. Most of them have a **closed, documented value set** — **Column values** lists every one, and marks the handful that are pass-through columns whose values come from the source system rather than from a fixed list. Filter them as ordinary strings: `?$filter=SaleStatus eq 'COMPLETED'`. #### Time zones — the one that silently corrupts reports Two different kinds of temporal column exist, and they must be handled differently: | Kind | Columns | Handle by | |---|---|---| | **Offset-aware instants** | `TicketSoldAt`, `TicketUsedAt`, `TicketRegisteredAt`, `TicketAssignedAt`, `SaleTimestamp`, `PaymentTimestamp`, `TicketCancelledOn`, `TicketShippedOn`, `FaireventStartDate`, `FaireventEndDate`, `LegitimationValidFrom`/`ValidTo`, `PromotionCode*` timestamps, and `Timestamp` on usages | Converting to whatever zone you report in. These carry an offset and are unambiguous. | | **Plain dates and internal timestamps** | `TicketOwnerBirthDate`, `TicketOwnerLastActionOn`, `LastRefreshedAt` | **Do not time-zone convert these.** | > **`TicketOwnerBirthDate` is a calendar date, not an instant.** Converting it across zones shifts birthdays by a day and quietly corrupts every age bracket you compute. Load it as a date type, not a timestamp. > > `LastRefreshedAt` and `TicketOwnerLastActionOn` carry no offset either. Use `LastRefreshedAt` only as an opaque watermark for incremental loading — compare it against the last value you saw, and do not present it to users as a local time. **There is no fair-local time column.** The event's own time zone is not exposed, so scans are not re-projected into local event time for you. If your report needs "9am on the second day of the fair", apply the event's zone yourself — you know which city it was in. #### Nulls Nullability is stated per column in `$metadata`, and null is common and meaningful: - Person and address fields are null where the visitor did not supply them. - `CurrencyShort` can be null on rows with no monetary value. - Legitimation, promotion-code, upselling and cross-selling families are null on tickets they do not apply to. - Several status columns are nullable, and null means "not applicable here" rather than a state. - A null boolean is neither true nor false — `$filter=SomeFlag eq false` will **not** match it. Filter `eq null` explicitly when you mean it. #### Getting the full list `GET /odata/v1/$metadata` returns every column with its type, nullability, key membership and business label. See **Field reference**. ### Column values Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/column-values What the status columns can actually contain. These columns are `Edm.String` holding **UPPER_SNAKE_CASE tokens**. They were numeric enums in the operational system; the hub converts them to text on write, so you get `PAID` rather than `2`. Two consequences worth knowing before you build a dimension table: - **The sets below are closed.** Anything the hub cannot map falls into `UNKNOWN`, so a value outside these lists should not appear. If one does, tell us — it means a mapping is missing. - **Tokens are uppercase and exact.** `$filter` matches property *names* case-insensitively but not values: `eq 'paid'` matches nothing. #### Ticket #### `TicketStatusType` | Token | Means | |---|---| | `NONE` | No status set. | | `FREE` | Not yet assigned to a person — available. | | `ASSIGNED` | Assigned to a ticket owner. | | `BLOCKED` | Blocked from use. | | `UNKNOWN` | The source held a value the hub could not map. | #### `TicketValidity` | Token | Means | |---|---| | `NONE` | No validity window defined. | | `ONE_DAY` | Valid on a single day. | | `MULTIPLE_DAYS` | Valid on several specific days. | | `ALL_DAYS` | Valid for the whole event run. | #### `ThirdPartyRegistrationState` Nullable. Registration handled by an external vendor. | Token | Means | |---|---| | `PENDING` | Submitted, not yet decided. | | `COMPLETED` | Accepted. | | `DENIED` | Rejected. | | `UNKNOWN` | Unmappable source value. | | *null* | No third-party registration involved. | #### Article #### `ArticleType` | Token | Means | |---|---| | `TICKET` | An admission ticket. | | `CATALOG` | A catalogue. | | `CD` | A data medium. | | `VOUCHER` | A voucher. | | `SERVICE` | A service. | | `SERVICE_FEE` | A fee added to a sale. | | `FUNCTIONAL_FEATURE` | A functional add-on rather than a product. | | `REGISTRATION_FORM` | A registration form article. | | `OTHER` | Anything else classified explicitly. | | `UNKNOWN` | Unmappable source value, including "none". | > If you are counting *tickets sold*, filter `ArticleType eq 'TICKET'` — otherwise service fees and vouchers land in the same count. #### Sale Four status columns that progress independently. All four are nullable, and all four use `UNKNOWN` for unmappable values. #### `SaleStatus` | Token | Means | |---|---| | `PENDING` | Started, not completed. | | `COMPLETED` | Concluded successfully. | | `REVOKED` | Withdrawn. | | `ERROR` | Failed. | | `CANCELED` | Cancelled. | | `PROCESSING` | In progress. | #### `SalePaymentStatus` | Token | Means | |---|---| | `NOT_REQUIRED` | Nothing to pay — a free ticket, for instance. | | `NOT_PAID` | Payment outstanding. | | `PAID` | Paid in full. | | `PAYMENT_PROCESSING` | Payment under way. | | `NOT_REFUNDED` | Refund considered and not made. | | `REFUNDED` | Fully refunded. | | `PARTIALLY_REFUNDED` | Partly refunded. | | `REFUND_PENDING` | Refund initiated. | | `PARTIAL_REFUND_PENDING` | Partial refund initiated. | | `PARTIAL_REFUND_MANUAL_PENDING` | Partial refund awaiting manual handling. | > For paid revenue, `SalePaymentStatus eq 'PAID'` is the honest filter. `NOT_REQUIRED` marks genuinely free tickets, which belong in attendance figures but not in revenue. #### `SaleRegistrationStatus` | Token | Means | |---|---| | `NOT_REQUIRED` | No registration needed. | | `PENDING` | Registration outstanding. | | `REGISTERED` | Registration complete. | #### `SaleReceiptStatus` | Token | Means | |---|---| | `NOT_REQUIRED` | No receipt needed. | | `NOT_CREATED` | Receipt due, not yet created. | | `IN_PROCESS` | Being created. | | `CREATED` | Receipt issued. | #### `SaleDistributionChainType` | Token | Means | |---|---| | `NONE` | No channel recorded. | | `INTERNET` | Online shop. | | `ON_SITE` | Sold at the venue. | | `ESC` | Exhibitor Service Center. | | `INTERN` | Internal allocation. | | `UNKNOWN` | Unmappable source value. | > Several distinct source channels collapse into `NONE`, so treat it as "not attributable" rather than as a channel. #### Legitimation #### `LegitimationStatus` | Token | Means | |---|---| | `NEW` | Submitted, untouched. | | `IN_PROGRESS` | Being reviewed. | | `WAIT_FOR_VERIFICATION` | Awaiting external verification. | | `ON_HOLD` | Paused. | | `INCOMPLETE` | Missing information. | | `FOLLOW_UP` | Needs a follow-up action. | | `ACCEPTED` | Approved by a reviewer. | | `AUTO_APPROVED` | Approved automatically. | | `DENIED` | Rejected. | | `UNKNOWN` | Unmappable source value. | > `ACCEPTED` and `AUTO_APPROVED` are both approvals. Any "how many were approved" figure needs both. #### Person #### `TicketOwnerGenderCode`, `BuyerGenderCode` | Token | Means | |---|---| | `UNKNOWN` | Not stated or not mappable. | | `MALE` | | | `FEMALE` | | | `DIVERS` | | `BuyerGenderCode` is additionally nullable, where no buyer person exists. #### Pass-through columns — no fixed list These also look like status columns, but the hub passes them through from the source system rather than mapping them to a fixed set. Their values depend on your own configuration, so read the distinct values from your own extract and treat that as your dimension: | Column | Dataset | Comes from | |---|---|---| | `TicketRegistrationChannel` | `Tickets` | The channel the registration came through. | | `UsedTicketMedium` | `TicketUsages` | How the ticket was presented at the door — print, mobile, wallet. | | `Type` | `TicketUsages` | The kind of ticket action recorded. | | `QuestionType` | `Surveys` | The question's form type. | | `AnswerSource` | `Surveys` | Where the answer came from. | | `Characteristic` | `Surveys` | The target field the question writes into. | ##### **Important:** Seed the closed sets above as lookup tables in your warehouse and join against them. A token that fails to match then surfaces as an unmatched key — which is what you want when we add one — instead of silently vanishing from a report. ### GET Get tickets - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/get-tickets One row per owned ticket. The wide, denormalised centre of the model — event, article, sale, buyer and holder all flattened onto each row. If you load only one dataset, load this one. Most business questions are answerable from it without any join. #### Grain and key | | | |---|---| | Grain | one row per ticket | | Natural key | `MandatorInternalId`, `TicketInternalId` | | Page size | 500 | | Columns | 342 | | Watermark | none — full reload only | #### The columns most extracts start with A workable first projection. The families are mapped in **Reading the columns**, the token sets in **Column values**. **Identity** | Column | Type | Notes | |---|---|---| | `TicketInternalId` | int | Key. Join target for usages and surveys. | | `TicketUniqueId` | Guid | Stable global reference. | | `TicketNumber` | string | The number printed on the ticket. | **Status and lifecycle** | Column | Type | Notes | |---|---|---| | `TicketIsCancelled` | bool | Use this for cancellations, not the status column. | | `TicketStatusType` | token | `NONE`, `FREE`, `ASSIGNED`, `BLOCKED`, `UNKNOWN`. | | `TicketValidity` | token | `NONE`, `ONE_DAY`, `MULTIPLE_DAYS`, `ALL_DAYS`. | | `TicketIsDayTicket` / `TicketIsPermanentTicket` | bool | Validity shape as flags. | | `TicketSoldAt` / `TicketUsedAt` | datetimeoffset | Offset-aware; safe to convert. | **Money** | Column | Type | Notes | |---|---|---| | `TicketGrossPrice` | decimal | The default for revenue questions. | | `TicketNetPrice` | decimal | Only when net was explicitly asked for. | | `CurrencyShort` | string | **Always carry this alongside any amount.** | | `SalePaymentStatus` | token | `PAID` is the honest filter for paid revenue. | **Event and article** | Column | Type | Notes | |---|---|---| | `FaireventInternalId` | int | Best key for splitting large extracts. | | `FaireventName` / `FaireventYear` | string / int | Filter these two separately. | | `FairBrandName` | string | For year-over-year comparison. | | `ArticleInternalId` / `ArticleName` | int / string | Join key to `StatisticGroups`; main segmentation dimension. | | `ArticleType` | token | Filter `eq 'TICKET'` when counting tickets sold. | **Who and how it was issued** | Column | Type | Notes | |---|---|---| | `TicketOwner*` | various | The person who attends. | | `Buyer*` | various | The person who paid. | | `TicketIsIssuedByOrganizer` | bool | Organiser route. | | `TicketIsIssuedByExhibitor` | bool | Exhibitor quota route. | | `SaleDistributionChainType` | token | Sales channel. | | `Exhibitor*` | various | Which exhibitor issued it. | **Marketing** | Column | Type | Notes | |---|---|---| | `SaleIsTest` | bool | Filter `eq false` unless you want test sales. | | `SaleUtm*` | string | Campaign attribution, five columns. | | `PromotionCode*` | string | Discount or access code applied. | #### Traps specific to this dataset - **Several currencies live in one column.** EUR, USD, CHF, QAR and null all occur. Never add amounts across them; group by `CurrencyShort`. - **Not every row is a ticket.** `ArticleType` also covers vouchers, service fees and functional features. Filter it when you mean tickets. - **Buyer is not owner.** See **People: buyer, holder, exhibitor**. - **Organiser and exhibitor tickets are different populations.** Averaging them together distorts every conversion figure. - **107 of the columns are your own custom fields** with generic labels. See **Reading the columns**. - **No per-ticket attendance flag.** Attendance reporting goes through `StatisticGroups` — see **Counting visitors**. - **No watermark.** Incremental loading is not possible; a nightly full reload is the practical answer. #### Joining | To | On | Grain effect | |---|---|---| | `TicketUsages` | `MandatorInternalId`, `TicketInternalId` | one to many | | `Surveys` | `MandatorInternalId`, `TicketInternalId` | one to many | | `StatisticGroups` | `MandatorInternalId`, `ArticleInternalId` | one to many | #### Full column catalogue `GET /odata/v1/$metadata` — every column with its type, nullability and business label. --- #### Request No request body. All shaping is done with the query options below. - `$select`(string): the columns to load. A full row is 342 columns and ~10 KB — name what you need. - `$filter`(string): an OData predicate. Start with `SaleIsTest eq false`. - `$orderby`(string): sort order. - `$top`(integer): maximum rows, capped at 1000. - `$count`(boolean): include the total count. Scans the whole dataset. - `$skiptoken`(string): server-generated paging token. Follow the next link rather than setting this. #### Response - `@odata.context` (string): the metadata URL describing the shape of this payload. - `value` (array): the page of ticket rows. Which columns appear depends on `$select`. - `@odata.nextLink` (string, optional): the next page. Absent on the last page — that is your signal to stop. - `@odata.count` (integer, optional): present only when `$count=true`. #### Before you aggregate what comes back Three things will otherwise give you wrong numbers, all covered in **Getting the numbers right**: several currencies live in `CurrencyShort`, test sales are present in production data, and **not every row is a ticket** — `ArticleType` also covers vouchers, catalogues and service fees. #### Notes Page size is 500. There is no by-key form of this endpoint — `Tickets(...)` answers `404` by design. Status columns such as `ArticleType` and `SalePaymentStatus` carry UPPER_SNAKE_CASE tokens from a closed set — **Datasets → Column values** lists every one. 107 of the 342 columns are your own custom registration fields with generic labels; see **Reading the columns**. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. See Authentication. | | Accept | application/json | Optional. JSON is returned by default. | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $select | TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest | Comma-separated list of columns to load. The single biggest lever on extract time: a full row is 342 columns and roughly 10 KB, and projecting down also lets the database skip work. Carry `CurrencyShort` whenever you carry an amount. | | $filter | SaleIsTest eq false and ArticleType eq 'TICKET' | OData predicate. Token values are uppercase and case-sensitive — `eq 'TICKET'` works, `eq 'ticket'` matches nothing. Worth knowing: `SaleIsTest eq false` excludes test sales, `ArticleType eq 'TICKET'` keeps vouchers and service fees out of a ticket count, and `FaireventInternalId eq ` splits a very large extract into chunks that parallelise. | | $orderby | TicketInternalId | Sort order. Note that it also changes the order the keyset walk runs in. | | $top | 1000 | Maximum number of rows. Capped at 1000; a higher value is rejected with 400. A smaller value lowers the page size but cannot raise it above 500. | | $count | true | Include the total row count in `@odata.count`. Useful once per load to size the job; it scans the whole dataset, so do not ask for it on every page. | | $skiptoken | | Server-generated keyset paging token, carried in `@odata.nextLink`. Treat it as opaque and follow the link; hand-crafting one is unsupported. | | $skip | | Offset paging. Supported but discouraged: cost grows with depth, and rows written while you read can be skipped or repeated. Use `@odata.nextLink` instead. | #### Response example: (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#Tickets(TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest)", "value": [ { "TicketInternalId": 100241, "FaireventName": "Demo Trade Fair", "ArticleName": "Day ticket", "ArticleType": "TICKET", "TicketGrossPrice": 25.00, "CurrencyShort": "EUR", "SalePaymentStatus": "PAID", "SaleIsTest": false }, { "TicketInternalId": 100242, "FaireventName": "Demo Trade Fair", "ArticleName": "Exhibitor invitation", "ArticleType": "TICKET", "TicketGrossPrice": 0.00, "CurrencyShort": "EUR", "SalePaymentStatus": "NOT_REQUIRED", "SaleIsTest": false }, { "TicketInternalId": 100243, "FaireventName": "Demo Trade Fair", "ArticleName": "Permanent pass", "ArticleType": "TICKET", "TicketGrossPrice": 89.00, "CurrencyShort": "CHF", "SalePaymentStatus": "PAID", "SaleIsTest": false }, { "TicketInternalId": 100244, "FaireventName": "Demo Trade Fair", "ArticleName": "Booking fee", "ArticleType": "SERVICE_FEE", "TicketGrossPrice": 2.50, "CurrencyShort": "EUR", "SalePaymentStatus": "PAID", "SaleIsTest": false }, { "TicketInternalId": 100245, "FaireventName": "Demo Trade Fair", "ArticleName": "Day ticket", "ArticleType": "TICKET", "TicketGrossPrice": 25.00, "CurrencyShort": "EUR", "SalePaymentStatus": "NOT_PAID", "SaleIsTest": true } ], "@odata.nextLink": "https://example.aditus.de/api/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest&$skiptoken=MandatorInternalId-1,TicketInternalId-100245" } ``` #### Response example: Get tickets (last page, no next link) (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#Tickets(TicketInternalId,FaireventName,ArticleName,ArticleType,TicketGrossPrice,CurrencyShort,SalePaymentStatus,SaleIsTest)", "value": [ { "TicketInternalId": 196412, "FaireventName": "Demo Trade Fair", "ArticleName": "Press pass", "ArticleType": "TICKET", "TicketGrossPrice": 0.00, "CurrencyShort": null, "SalePaymentStatus": "NOT_REQUIRED", "SaleIsTest": false } ] } ``` #### Response example: Get tickets (400 – unknown column) (400 Bad Request) ```json { "error": { "code": "", "message": "Could not find a property named 'TicketPrice' on type 'ADITUS.TicketingHub.Common.Data.Entities.Ticket'." } } ``` #### Response example: Get tickets (403 – user token) (403 Forbidden) _Empty body._ ### GET Get ticket usages - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1/TicketUsages?$select=TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/get-ticket-usages One row per scan. This is where the gap between *sold* and *attended* becomes measurable, and it is the dataset that makes entrance and staffing analysis possible. #### Grain and key | | | |---|---| | Grain | one row per scan event | | Natural key | `MandatorInternalId`, `TicketActionInternalId` | | Page size | 1000 | | Columns | 119 | | Watermark | `LastRefreshedAt` — incremental loading possible | #### The columns most extracts start with | Column | Type | Notes | |---|---|---| | `TicketActionInternalId` | int | Key. | | `TicketInternalId` | int | Join key back to `Tickets`. | | `Timestamp` | datetimeoffset | When the scan happened. Offset-aware. | | `Type` | string | The kind of action. Pass-through — read the distinct values from your data. | | `IsEntry` / `IsExit` | bool | Direction through the door. | | `IsFirstOfDay` | bool | First scan that day — the basis for daily unique attendance. | | `IsFirstOfFairevent` | bool | First scan of the whole event — first-time arrival. | | `Entrance` | string | Which door. | | `EntranceTerminalName` | string | Which device. | | `LocationName` | string | Which location. | | `UsedTicketMedium` | string | Print, mobile, wallet. Pass-through. | | `IsOffline` | bool | Captured offline and synced later. | | `LastRefreshedAt` | datetime | Watermark. No offset — do not convert. | A slice of ticket, article and event columns is repeated here, so common questions can be answered without joining back. Those repeated status columns carry the same tokens as on `Tickets` — see **Column values**. #### Traps specific to this dataset - **Rows are scans, not people.** A visitor attending three days produces at least three rows. Count distinct `TicketInternalId` when you mean people, and use `IsFirstOfDay` for daily unique attendance. - **Zero usages is normal and meaningful.** A sold ticket that was never used has no row here at all. An inner join to `Tickets` silently drops exactly the population you need for no-show analysis — use a left join. - **Exits count too.** If you want arrivals, filter `IsEntry eq true`; otherwise a visitor who left and returned inflates your figure. - **Offline scans arrive late.** `IsOffline` rows are captured on the device and synced afterwards, so a very recent incremental load can miss them. They arrive with a later `LastRefreshedAt`, so a watermark load does pick them up eventually. #### What this dataset makes possible - **No-show rate** — tickets with no usage, over tickets sold. - **Daily attendance** — distinct tickets with `IsFirstOfDay eq true`, per day. - **Entrance load over time** — count by `Entrance` and hour, which is where queueing and staffing decisions come from. - **Repeat visit behaviour** — usages per ticket across the event days. - **Medium adoption** — how many actually used the mobile ticket you built. **Recipes** shows the queries. #### Joining Join to `Tickets` on `MandatorInternalId`, `TicketInternalId`. One ticket, many usages. --- #### Request No request body. - `$select`(string): the columns to load. - `$filter`(string): an OData predicate. This dataset carries `LastRefreshedAt`, so it can be loaded incrementally. - `$orderby`(string): sort order. - `$top`(integer): maximum rows, capped at 1000. - `$count`(boolean): include the total count. - `$skiptoken`(string): server-generated paging token. #### Response - `@odata.context` (string): the metadata URL describing this payload. - `value` (array): the page of usage rows. - `@odata.nextLink` (string, optional): the next page; absent on the last one. - `@odata.count` (integer, optional): present only when `$count=true`. #### Counting correctly Rows are scans, not people. A visitor attending three days and stepping out for lunch produces many rows, and a ticket that was never used has no row here at all. Count distinct `TicketInternalId` for people, use `IsFirstOfDay` for daily unique attendance, and left-join from `Tickets` when you are measuring no-shows. See **Recipes** for the worked queries. #### Notes Page size is 1000. This is the fastest-growing dataset during an event, which makes it the best candidate for watermark-based incremental loading. `Type` and `UsedTicketMedium` are pass-through columns — their value sets come from the source system rather than from a fixed list, so read the distinct values from your own extract. See **Datasets → Column values**. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. See Authentication. | | Accept | application/json | Optional. JSON is returned by default. | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $select | TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance | Comma-separated list of columns to load. `Timestamp`, `Entrance` and `EntranceTerminalName` are what entrance-load analysis needs; `IsFirstOfDay` is the basis for daily unique attendance. | | $filter | LastRefreshedAt gt 2026-01-01T00:00:00Z | OData predicate. This dataset exposes `LastRefreshedAt`, so a watermark filter gives you an incremental load. Filter `IsEntry eq true` when you want arrivals rather than every movement through a door. | | $orderby | Timestamp | Sort order. Note that it also changes the order the keyset walk runs in. | | $top | 1000 | Maximum number of rows. Capped at 1000; a higher value is rejected with 400. | | $count | true | Include the total row count in `@odata.count`. Note this counts scans, not visitors. Scans the whole dataset; ask once per load. | | $skiptoken | | Server-generated keyset paging token, carried in `@odata.nextLink`. Treat it as opaque. | | $skip | | Offset paging. Supported but discouraged — use `@odata.nextLink` instead. | #### Response example: (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#TicketUsages(TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance)", "value": [ { "TicketActionInternalId": 5510231, "TicketInternalId": 100241, "Timestamp": "2026-03-04T09:12:44+01:00", "IsEntry": true, "IsFirstOfDay": true, "Entrance": "North entrance" }, { "TicketActionInternalId": 5510298, "TicketInternalId": 100241, "Timestamp": "2026-03-04T13:41:02+01:00", "IsEntry": false, "IsFirstOfDay": false, "Entrance": "North entrance" }, { "TicketActionInternalId": 5510344, "TicketInternalId": 100241, "Timestamp": "2026-03-04T14:15:37+01:00", "IsEntry": true, "IsFirstOfDay": false, "Entrance": "North entrance" }, { "TicketActionInternalId": 5512907, "TicketInternalId": 100241, "Timestamp": "2026-03-05T08:58:10+01:00", "IsEntry": true, "IsFirstOfDay": true, "Entrance": "East entrance" }, { "TicketActionInternalId": 5510402, "TicketInternalId": 100243, "Timestamp": "2026-03-04T10:03:19+01:00", "IsEntry": true, "IsFirstOfDay": true, "Entrance": "VIP entrance" } ], "@odata.nextLink": "https://example.aditus.de/api/ticketinghub/odata/v1/TicketUsages?$select=TicketActionInternalId,TicketInternalId,Timestamp,IsEntry,IsFirstOfDay,Entrance&$skiptoken=MandatorInternalId-1,TicketActionInternalId-5510402" } ``` #### Response example: Get ticket usages (401 – expired token) (401 Unauthorized) _Empty body._ ### GET Get statistic groups - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1/StatisticGroups` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/get-statistic-groups One row per article-to-statistics-group assignment. A small reference dataset that carries the many-to-many relation the ticket rows cannot express — and the place where audited attendance reporting is structured. Load it whole — it is seven columns and typically a few hundred rows. #### Grain and key | | | |---|---| | Grain | one row per article-to-group assignment | | Natural key | `MandatorInternalId`, `ArticleInternalId`, `StatisticGroupInternalId` | | Page size | 1000 | | Columns | 7 | | Watermark | none | #### The complete dataset All seven columns: | Column | Type | Notes | |---|---|---| | `MandatorInternalId` | int | Key. Constant for your feed. | | `ArticleInternalId` | int | Key. Join to `Tickets`. | | `StatisticGroupInternalId` | int | Key. | | `Name` | string? | The group name — your chart dimension. | | `Description` | string? | Longer description of the group. | | `IsFkmTotal` | bool | The group counts towards the audited total. | | `IsFkmVisitor` | bool | The group counts as visitors. | #### Why this is a separate dataset An article is regularly a member of **several** statistics groups at once — a single column on the ticket row cannot represent that. Splitting it out is the only correct way to model it. In warehouse terms this is a **bridge table**, not a dimension. #### Traps specific to this dataset - **The join multiplies rows.** An article in three groups produces three rows per ticket. A `COUNT(*)` after joining counts assignments, not tickets — count distinct `TicketInternalId`. - **An article with no group has no row here.** An inner join silently drops those tickets. Use a left join and decide explicitly what the unassigned bucket means — often it belongs in an "other" category rather than being dropped. - **`IsFkmTotal` and `IsFkmVisitor` are independent, not a partition.** A visitor badge group is normally in both; a plain business category is a row with both false. Never derive one from the other, and never compute non-visitors as total minus visitor. - **No event context.** Group membership is a property of the article, not of an event. The event comes from the ticket. #### Joining Join to `Tickets` on `MandatorInternalId`, `ArticleInternalId`. See **How ticketing data works → Counting visitors** for how to use the result correctly. --- #### Request No request body. - `$select`(string): rarely needed here — there are only seven columns. - `$filter`(string): an OData predicate. - `$orderby`(string): sort order. - `$top`(integer): maximum rows, capped at 1000. - `$count`(boolean): include the total count. - `$skiptoken`(string): server-generated paging token. #### Response - `@odata.context` (string): the metadata URL describing this payload. - `value` (array): the page of assignment rows. - `@odata.nextLink` (string, optional): the next page; absent on the last one. - `@odata.count` (integer, optional): present only when `$count=true`. #### Three things to get right when you join Join on `MandatorInternalId` and `ArticleInternalId`. Then: **The join multiplies rows.** An article in three groups produces three rows per ticket. Count distinct `TicketInternalId`, never rows, or you will triple your attendance figure. **An article with no group has no row here.** An inner join silently drops those tickets. Use a left join and decide deliberately what the unassigned bucket means in your report. **`IsFkmTotal` and `IsFkmVisitor` are independent flags, not a partition.** Report them separately; never subtract one from the other. See **How ticketing data works → Counting visitors** and the *Audited attendance by statistics group* entry in **Recipes**. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. See Authentication. | | Accept | application/json | Optional. JSON is returned by default. | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $select | ArticleInternalId,StatisticGroupInternalId,Name,IsFkmTotal,IsFkmVisitor | Comma-separated list of columns to load. With only seven columns, loading the whole row is usually the right call. | | $filter | IsFkmVisitor eq true | OData predicate. Remember the two FKM flags are independent, so filtering on one tells you nothing about the other. | | $orderby | ArticleInternalId | Sort order. Note that it also changes the order the keyset walk runs in. | | $top | 1000 | Maximum number of rows. Capped at 1000; a higher value is rejected with 400. | | $count | true | Include the total row count in `@odata.count`. Note this counts assignments, not articles. Scans the whole dataset; ask once per load. | | $skiptoken | | Server-generated keyset paging token. Note that this dataset has a three-part key, so the walk runs in alphabetical key order. | | $skip | | Offset paging. Supported but discouraged — use `@odata.nextLink` instead. | #### Response example: (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#StatisticGroups", "value": [ { "MandatorInternalId": 1, "ArticleInternalId": 4711, "StatisticGroupInternalId": 12, "Name": "Trade visitors", "Description": "Counts towards the audited total and as a visitor.", "IsFkmTotal": true, "IsFkmVisitor": true }, { "MandatorInternalId": 1, "ArticleInternalId": 4711, "StatisticGroupInternalId": 21, "Name": "Preregistered online", "Description": "Marketing segment. Carries neither audit flag.", "IsFkmTotal": false, "IsFkmVisitor": false }, { "MandatorInternalId": 1, "ArticleInternalId": 4712, "StatisticGroupInternalId": 12, "Name": "Trade visitors", "Description": "Counts towards the audited total and as a visitor.", "IsFkmTotal": true, "IsFkmVisitor": true }, { "MandatorInternalId": 1, "ArticleInternalId": 4801, "StatisticGroupInternalId": 33, "Name": "Exhibitor staff", "Description": "On site, but not part of the audited figures.", "IsFkmTotal": false, "IsFkmVisitor": false }, { "MandatorInternalId": 1, "ArticleInternalId": 4900, "StatisticGroupInternalId": 34, "Name": "Press", "Description": "Counts towards the total, but not as a visitor.", "IsFkmTotal": true, "IsFkmVisitor": false } ] } ``` ### GET Get surveys - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1/Surveys?$select=SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/datasets/get-surveys What visitors told you, joined back to who they are. One row per **selected option** — read the grain note before you count anything. Because survey answers join to the ticket, any answer can be segmented by anything the ticket knows: article, event, statistics group, country, or how the ticket was issued. #### Grain and key | | | |---|---| | Grain | one row per selected option (selection grain) | | Natural key | `MandatorInternalId`, `AnswerInternalId`, `SelectionOrdinal` | | Page size | 500 | | Columns | 32 | | Watermark | `LastRefreshedAt` — incremental loading possible | #### The columns most extracts start with | Column | Type | Notes | |---|---|---| | `SubmissionInternalId` | int | One completed survey. Count distinct for responses. | | `AnswerInternalId` | int | One answer to one question. Count distinct for answers. | | `SelectionOrdinal` | short | Which selected option this row represents. | | `QuestionText` | string? | The question as the visitor saw it. | | `QuestionType` | string? | The question's form type. Pass-through — no fixed list. | | `IsMultiSelect` | bool | Whether several options were possible. | | `IsRequired` | bool | Whether the question was mandatory. | | `Answer` | string? | The raw lookup key. | | `AnswerDisplayValue` | string? | The label the visitor saw. **Report on this one.** | | `IsCustomAnswer` | bool | A free-text answer rather than a chosen option. | | `AnswerSource` | string? | Where the answer came from. Pass-through. | | `SubmittedAt` | datetimeoffset | When it was answered. | | `Language` | string? | Which language they answered in. | | `TicketInternalId` | int | Join key back to `Tickets`. | | `LastRefreshedAt` | datetime | Watermark. No offset — do not convert. | #### Traps specific to this dataset - **Selection grain is the trap.** A multi-select answer is not one row with a comma-separated list; it is one row **per selected option**. Someone ticking four boxes produces four rows. Counting rows overcounts, sometimes by a lot. | You want | Count | |---|---| | Responses (completed surveys) | distinct `SubmissionInternalId` | | Answers (question-level) | distinct `AnswerInternalId` | | Selections (option-level) | rows | - **Group on `AnswerDisplayValue`, not `Answer`.** `Answer` holds the raw lookup key, which is stable but meaningless on a chart. `AnswerDisplayValue` is the label the visitor actually read. - **Free-text answers need separate handling.** `IsCustomAnswer` rows contain whatever the visitor typed — do not group on them as if they were a controlled vocabulary. - **No visitor context here.** Name, contact data and article are deliberately not in this dataset — join `Tickets`. #### Joining Join to `Tickets` on `MandatorInternalId`, `TicketInternalId`. --- #### Request No request body. - `$select`(string): the columns to load. - `$filter`(string): an OData predicate. This dataset carries `LastRefreshedAt`, so it can be loaded incrementally. - `$orderby`(string): sort order. - `$top`(integer): maximum rows, capped at 1000. - `$count`(boolean): include the total count. - `$skiptoken`(string): server-generated paging token. #### Response - `@odata.context` (string): the metadata URL describing this payload. - `value` (array): the page of selection rows. - `@odata.nextLink` (string, optional): the next page; absent on the last one. - `@odata.count` (integer, optional): present only when `$count=true`. #### The grain will catch you out One row is one **selected option**, not one answer. Somebody ticking four boxes on a multi-select question produces four rows. | You want | Count | |---|---| | Responses (completed surveys) | distinct `SubmissionInternalId` | | Answers (question level) | distinct `AnswerInternalId` | | Selections (option level) | rows | Group and report on `AnswerDisplayValue`, the label the visitor actually read — `Answer` holds the raw lookup key, which is stable but meaningless on a chart. #### Notes Page size is 500. `@odata.count` counts selections, so it is not your response count. `QuestionType`, `AnswerSource` and `Characteristic` are pass-through columns — their value sets come from your own survey configuration rather than from a fixed list. See **Datasets → Column values**. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. See Authentication. | | Accept | application/json | Optional. JSON is returned by default. | #### Query parameters | Parameter | Example value | Description | | --- | --- | --- | | $select | SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId | Comma-separated list of columns to load. Carry `TicketInternalId` so the answers can be joined back and segmented; report on `AnswerDisplayValue` rather than the raw `Answer` key. | | $filter | LastRefreshedAt gt 2026-01-01T00:00:00Z | OData predicate. This dataset exposes `LastRefreshedAt`, so a watermark filter gives you an incremental load. | | $orderby | SubmittedAt | Sort order. Note that it also changes the order the keyset walk runs in. | | $top | 1000 | Maximum number of rows. Capped at 1000; a higher value is rejected with 400. A smaller value lowers the page size but cannot raise it above 500. | | $count | true | Include the total row count in `@odata.count`. Because of the selection grain this counts ticked options, not responses — count distinct `SubmissionInternalId` for that. | | $skiptoken | | Server-generated keyset paging token. Note that this dataset has a three-part key, so the walk runs in alphabetical key order. | | $skip | | Offset paging. Supported but discouraged — use `@odata.nextLink` instead. | #### Response example: (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata#Surveys(SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId)", "value": [ { "SubmissionInternalId": 88120, "AnswerInternalId": 341002, "SelectionOrdinal": 0, "QuestionText": "Which topics bring you to the fair?", "AnswerDisplayValue": "Automation", "TicketInternalId": 100241 }, { "SubmissionInternalId": 88120, "AnswerInternalId": 341002, "SelectionOrdinal": 1, "QuestionText": "Which topics bring you to the fair?", "AnswerDisplayValue": "Robotics", "TicketInternalId": 100241 }, { "SubmissionInternalId": 88120, "AnswerInternalId": 341002, "SelectionOrdinal": 2, "QuestionText": "Which topics bring you to the fair?", "AnswerDisplayValue": "Sensor technology", "TicketInternalId": 100241 }, { "SubmissionInternalId": 88120, "AnswerInternalId": 341003, "SelectionOrdinal": 0, "QuestionText": "How did you hear about us?", "AnswerDisplayValue": "Trade press", "TicketInternalId": 100241 }, { "SubmissionInternalId": 88121, "AnswerInternalId": 341044, "SelectionOrdinal": 0, "QuestionText": "Which topics bring you to the fair?", "AnswerDisplayValue": "Automation", "TicketInternalId": 100243 } ], "@odata.nextLink": "https://example.aditus.de/api/ticketinghub/odata/v1/Surveys?$select=SubmissionInternalId,AnswerInternalId,SelectionOrdinal,QuestionText,AnswerDisplayValue,TicketInternalId&$skiptoken=AnswerInternalId-341044,MandatorInternalId-1,SelectionOrdinal-0" } ``` ## Recipes Human documentation: https://developers.aditus.com/docs/business-intelligence/recipes Concrete answers to the questions on the module's front page. Each one names the datasets, the filters and the aggregation — including the part that is easy to get wrong. All of them assume `SaleIsTest eq false` is already applied. ### No-show rate *How many people bought a ticket and never came?* | | | |---|---| | Datasets | `Tickets` **left join** `TicketUsages` | | Extract | `Tickets`: `TicketInternalId, FaireventInternalId, TicketIsCancelled, ArticleType`
`TicketUsages`: `TicketInternalId` | | Filter | `TicketIsCancelled eq false and ArticleType eq 'TICKET'` | | Compute | tickets with **no** matching usage ÷ all tickets | > The left join is the whole recipe. An inner join drops exactly the tickets you are trying to count. Exclude cancelled tickets, or you will count refunds as no-shows, and restrict to `ArticleType eq 'TICKET'` so vouchers and service fees stay out of the denominator. ### Daily attendance *How many distinct people were on site each day?* | | | |---|---| | Dataset | `TicketUsages` | | Extract | `TicketInternalId, Timestamp, IsFirstOfDay, IsEntry` | | Filter | `IsFirstOfDay eq true and IsEntry eq true` | | Compute | count distinct `TicketInternalId`, grouped by the date part of `Timestamp` | > `IsFirstOfDay` is what stops a visitor who stepped out for lunch counting twice. Convert `Timestamp` to the event's local zone before taking the date, or your day boundaries will be wrong. ### Entrance load by hour *Where and when do queues form?* | | | |---|---| | Dataset | `TicketUsages` | | Extract | `Timestamp, Entrance, EntranceTerminalName, IsEntry` | | Filter | `IsEntry eq true` | | Compute | count rows, grouped by `Entrance` and hour | > Here you *want* raw scans, not distinct people — a returning visitor is genuine load on the door. ### Campaign attribution *Which campaign sold the tickets?* | | | |---|---| | Dataset | `Tickets` | | Extract | `SaleUtmSource, SaleUtmMedium, SaleUtmCampaign, TicketGrossPrice, CurrencyShort, SalePaymentStatus` | | Filter | `TicketIsIssuedByOrganizer eq true` | | Compute | count tickets and sum `TicketGrossPrice`, grouped by the UTM columns **and `CurrencyShort`** | > Restrict to organiser-issued tickets: exhibitor invitations carry no campaign and would dilute every rate. Null UTM values are direct or offline sales — report them as their own bucket rather than dropping them. For revenue rather than volume, add `SalePaymentStatus eq 'PAID'`. ### Exhibitor quota usage *What did each exhibitor hand out, and how much was redeemed?* | | | |---|---| | Datasets | `Tickets` **left join** `TicketUsages` | | Extract | `Tickets`: `TicketInternalId, ExhibitorInternalId, ExhibitorName, TicketIsIssuedByExhibitor` | | Filter | `TicketIsIssuedByExhibitor eq true` | | Compute | per exhibitor: tickets issued, tickets with at least one usage, ratio | > Never benchmark this ratio against organiser sales — free invitations redeem far lower, and comparing them makes both numbers meaningless. ### Revenue by article *What actually sells?* | | | |---|---| | Dataset | `Tickets` | | Extract | `ArticleInternalId, ArticleName, ArticleType, TicketGrossPrice, TicketNetPrice, CurrencyShort, SalePaymentStatus` | | Filter | `TicketIsCancelled eq false` | | Compute | count and sum `TicketGrossPrice`, grouped by article **and `CurrencyShort`** | > Free tickets have a gross price of zero and carry `SalePaymentStatus eq 'NOT_REQUIRED'` — they are not errors. If you want paid revenue only, filter `SalePaymentStatus eq 'PAID'` and say so in the report title. Group by `ArticleType` to keep service fees separable from tickets. ### Refund exposure *How much has been refunded, and how much is in flight?* | | | |---|---| | Dataset | `Tickets` | | Extract | `TicketGrossPrice, CurrencyShort, SalePaymentStatus, SaleStatus` | | Compute | sum `TicketGrossPrice` grouped by `SalePaymentStatus` **and `CurrencyShort`** | > Five of the payment tokens are refund states — `REFUNDED`, `PARTIALLY_REFUNDED`, `REFUND_PENDING`, `PARTIAL_REFUND_PENDING`, `PARTIAL_REFUND_MANUAL_PENDING`. Settled and pending are different money; report them separately rather than lumping them into "refunded". **Column values** has the full list. ### Audited attendance by statistics group *The numbers that feed the FKM report.* | | | |---|---| | Datasets | `Tickets` **left join** `StatisticGroups` on `ArticleInternalId` | | Extract | `Tickets`: `TicketInternalId, ArticleInternalId, TicketIsCancelled`
`StatisticGroups`: all seven columns | | Filter | `TicketIsCancelled eq false` | | Compute | count **distinct** `TicketInternalId` where `IsFkmTotal eq true`, and separately where `IsFkmVisitor eq true` | > Two things carry this recipe. **Count distinct tickets, not rows** — an article in three groups produces three rows and would triple your attendance figure. And **report the two flags independently**; never subtract one from the other, because they are not a partition. Articles with no group at all need a deliberate decision: give them their own bucket rather than letting the left join hide them. ### Year-over-year segment growth *Which visitor segments grew?* | | | |---|---| | Datasets | `Tickets`, optionally **left join** `StatisticGroups` | | Extract | `FairBrandName, FaireventYear, ArticleName, ArticleInternalId, TicketInternalId` | | Filter | `TicketIsCancelled eq false` | | Compute | count tickets grouped by `FairBrandName`, `FaireventYear` and `ArticleName` — or by statistics group `Name` for a coarser view | > Compare within a `FairBrandName`, never across brands. If an event moved dates between editions, compare full editions rather than calendar periods. When you group by statistics group, count distinct tickets for the reason above. ### Survey results by segment *What did your visitors tell you, and who were they?* | | | |---|---| | Datasets | `Surveys` **join** `Tickets` | | Extract | `Surveys`: `SubmissionInternalId, AnswerInternalId, QuestionText, AnswerDisplayValue, TicketInternalId`
`Tickets`: `TicketInternalId, ArticleName, TicketIsIssuedByExhibitor` | | Compute | count distinct `AnswerInternalId`, grouped by `QuestionText`, `AnswerDisplayValue` and your segment | > Distinct `AnswerInternalId`, never rows — a multi-select answer is several rows. Percentages should divide by distinct `SubmissionInternalId`, not by rows. ## Getting the numbers right Human documentation: https://developers.aditus.com/docs/business-intelligence/getting-the-numbers-right The short list of things about this data that produce plausible-looking wrong numbers. Everything here has been the cause of a real reporting error. If you read one page before publishing a figure, read this one. ### 1. Never sum across currencies The data holds several currencies in one column — EUR, USD, CHF, QAR, and null. A `SUM(TicketGrossPrice)` without grouping by `CurrencyShort` produces a number with no meaning whatsoever, and nothing in the output will tell you it is wrong. > Include `CurrencyShort` in the grouping of **every** monetary question, and label each figure with its currency. Default to `TicketGrossPrice`; use `TicketNetPrice` only when net was explicitly asked for. ### 2. Exclude test sales Test sales exist in production data. They are created during configuration and rehearsal, and they look exactly like real ones except for a flag. > Filter `SaleIsTest eq false` unless the question is specifically about test data. Do this in the extract, not in each report, so nobody downstream can forget it. ### 3. Not every row in `Tickets` is a ticket `ArticleType` also covers vouchers, catalogues, service fees and functional features. A count of rows is a count of *sold items*, not of admissions. > Filter `ArticleType eq 'TICKET'` whenever you mean tickets. See **Datasets → Column values**. ### 4. The FKM flags are independent, not a partition `IsFkmTotal` and `IsFkmVisitor` on `StatisticGroups` are **independent**. A group can carry both, one, or neither, and a group with both false is a perfectly normal business category. > **Never compute "non-visitors" as total minus visitor.** The subtraction is meaningless and the result looks entirely credible. Report the two figures separately. ### 5. Joins that multiply `Tickets` → `TicketUsages` and `Tickets` → `StatisticGroups` are both one-to-many. A count taken after joining counts the wrong thing. > This bites hardest on attendance by statistics group: an article in three groups produces three rows per ticket. **Count distinct `TicketInternalId`**, not rows. And an article with no statistics group has no row at all, so an inner join silently drops those tickets. Left join, and give the unassigned bucket a deliberate meaning. ### 6. Match events exactly, and filter the year separately ``` ?$filter=FaireventName eq 'Trade Fair' and FaireventYear eq 2026 ``` `contains` silently merges similarly named events. Folding the year into the name silently misses editions. ### 7. Do not mix organiser and exhibitor tickets Exhibitor invitations are typically free, issued in bulk, and redeemed at a much lower rate. Averaged together with organiser sales they drag down every conversion figure and describe neither group. ### 8. Buyer and holder are different people "Bought" is a `Buyer*` question. "Attended" is a `TicketOwner*` question. When a stakeholder's question is ambiguous, answer both. ### 9. Scans are not visitors | You want | Count | |---|---| | Visits | rows in `TicketUsages` | | People who came | distinct `TicketInternalId` | | Daily unique attendance | distinct tickets with `IsFirstOfDay eq true` | | Arrivals only | filter `IsEntry eq true` | And a ticket never scanned has no row there at all — use a left join from `Tickets` when measuring no-shows. ### 10. Survey rows are selections, not responses One multi-select answer produces one row per ticked box. Count distinct `SubmissionInternalId` for responses and distinct `AnswerInternalId` for answers. ### 11. Free is not unpaid `SalePaymentStatus eq 'NOT_REQUIRED'` means the ticket was free by design. `NOT_PAID` means money is outstanding. Treating them alike either invents debt or hides it. ### 12. Two tokens mean approved `LegitimationStatus` has both `ACCEPTED` and `AUTO_APPROVED`. Any approval rate that counts only one of them is wrong. ### 13. Nulls are not false A nullable boolean can be null, and `eq false` does not match it. Where a flag is nullable, decide explicitly what null means in your report. ### 14. Do not time-zone convert dates `TicketOwnerBirthDate` is a calendar date. Converting it shifts birthdays and corrupts age brackets. See **Datasets → Reading the columns**. ### When you publish State the filters you applied, including the defaults — the test-sale exclusion in particular. A figure whose filters are undisclosed cannot be checked, and audited attendance figures need to be checkable. ## Field reference Human documentation: https://developers.aditus.com/docs/business-intelligence/field-reference How to get the complete, authoritative column list for each dataset. The **Datasets** pages document the columns an extract actually uses, plus the traps. **Reading the columns** maps them into families; **Column values** lists what the status columns can contain. They are deliberately curated: `Tickets` alone has 342 columns, and a 342-row table is not documentation anybody reads. For the complete catalogue, ask the service — it is generated from the running build and can never be out of date. ### `$metadata` — the authoritative source ``` GET https:///api/ticketinghub/odata/v1/$metadata ``` Returns the CSDL document describing all four datasets: every column with its type and nullability, the key columns, and an `Org.OData.Core.V1.Description` annotation per column holding its business label. This is what most BI and ETL tools read to map the schema for you, and what you should point a code generator at. > `$metadata` describes types, not value sets. A status column appears there as `Edm.String`; what it can actually contain is in **Column values**. ### OpenAPI ``` GET https:///api/ticketinghub/swagger/v1/swagger.json ``` Carries the same labels as OpenAPI property descriptions, alongside the four routes and their query options. Convenient if your tooling speaks OpenAPI; `$metadata` is the richer of the two, because it also states keys and nullability. ### Which to use when | You want | Use | |---|---| | A BI or ETL tool to map the schema | `$metadata` | | Keys, nullability, exact types | `$metadata` | | An OpenAPI document for code generation | `swagger.json` | | To find a column among 342 | **Reading the columns** | | To know what a status column can contain | **Column values** | | To know what a column means in practice | the **Datasets** pages | | To know what a term means | **Glossary** | | To know what will silently give a wrong number | **Getting the numbers right** | ##### **Important:** Column sets evolve as the underlying datasets do. Read the catalogue from the instance rather than hard-coding a column list, and your loader keeps working across releases. See **FAQ and support** for how changes are handled. ## Errors Human documentation: https://developers.aditus.com/docs/business-intelligence/errors What can come back, and what it usually means. ### Status codes | Status | Cause | What to do | |---|---|---| | `400` | A malformed query option — an unknown column in `$select`/`$filter`/`$orderby`, a syntax error, or `$top` above 1000 | Read the message; it names the offending part. Never retry unchanged. | | `401` | Missing, expired or unvalidatable token | Request a new token, retry once | | `403` | Valid token without the `ticketinghub-api` scope, or a user token (one carrying a subject) | See **Authentication**. Not retryable. | | `404` | A dataset that does not exist, or a by-key lookup | By-key is not supported; see **Query options** | | `500` | Unhandled server error, including a query that exceeded the 300 second timeout | Retry with backoff; if it persists, narrow with `$select` and `$filter` | | `502`, `503`, `504` | The instance is restarting, or the gateway cannot reach it | Retry with backoff | ### Error shape Errors come back in the standard OData envelope: ```json { "error": { "code": "", "message": "Could not find a property named 'TicketPrice' on type 'ADITUS.TicketingHub.Common.Data.Entities.Ticket'." } } ``` The `message` is the useful part and generally names the exact column or token that failed. ### The three you will actually hit **A misspelled column in `$select` or `$filter`.** By far the most common. Column names are validated strictly, though case-insensitively, and anything unresolved is a `400`. Check the name against `$metadata`. **A user token.** A `403` on a request whose token demonstrably carries the right scope almost always means the token has a subject — it was issued for a person rather than for a service. See **Authentication**. **A timeout on an unprojected query.** A `500` on a wide dataset usually means the query passed 300 seconds. Add `$select`, and split by event if it is still slow. ### The one that is not an error A `$filter` on a status column that returns **zero rows** is usually a misspelt token, not an empty dataset. Token values are case-sensitive and uppercase: `eq 'paid'` matches nothing, `eq 'PAID'` works. Check **Datasets → Column values**. ### Retrying Next links are stable, so retry the failed page rather than restarting the walk. **Building the extract** has a worked retry implementation with the right backoff and the right list of what not to retry. There is no rate limit today, so there is no `429` to handle — but do not read that as an invitation to run many parallel extracts against a live production system. ## FAQ and support Human documentation: https://developers.aditus.com/docs/business-intelligence/faq-and-support The questions that come up after the first integration. ### Freshness **How current is the data?** The datasets track the operational system closely, but this is a batch analytics surface rather than a live transactional one. Treat it as current to within minutes, not seconds, and do not build anything that needs to-the-second accuracy on it. **What does `LastRefreshedAt` mean?** It is the marker used to detect changed rows for incremental loading, on the two datasets that carry it. Use it as an opaque watermark — compare it against the last value you saw. It carries no time-zone offset, so do not present it to users as a local time. **Will a row I already loaded change later?** Yes. Tickets get cancelled, personalised, upgraded and rescanned. That is why full reloads matter, and why a watermark-only pipeline drifts. ### Values and types **Why are the status columns strings rather than enums?** Because the hub stores them as text on purpose. They were numeric enums in the operational system, and were converted to UPPER_SNAKE_CASE tokens so that consumers see a readable label instead of an integer whose meaning lives in someone else's source code. Keeping them as `Edm.String` also means a token we add later flows through your pipeline as data rather than breaking your reads. **Can a new token appear?** Yes, if the business gains a new state. That is why **Column values** tells you to seed the sets as lookup tables and join against them — an unmatched key is visible; a silently dropped row is not. **I see `UNKNOWN` in a status column. What does it mean?** The source held a value the hub could not map. It is rare, and it is worth telling us about — it usually means a mapping needs extending. ### Changes to the data **Can columns be added or removed?** Yes. The datasets evolve with the product; columns are added, occasionally a type is corrected, and occasionally one is withdrawn. `$metadata` always describes the instance you are querying, which is why a loader that reads it keeps working and one with a hard-coded column list does not. **How will I hear about a change?** Through the usual release channels. If a change would break a documented behaviour rather than just add to it, we tell you before it ships. **Is the API versioned?** The path carries `/v1`, and responses carry an `api-supported-versions` header. A breaking change would arrive as a new version rather than by altering v1 underneath you. **I need something that is not in the documentation. What now?** Ask us rather than guessing from a column name. If it is not documented, either it means something other than its name suggests or we have not yet written it up — and both are worth a short conversation before you build a report on it. ### Access and scope **Why does the path contain `api/ticketinghub`?** Because the feed is published through the same API gateway as your other ADITUS APIs, under its own product prefix. It means one base URL, one certificate and one firewall rule for everything you integrate with us. **Can I read another mandator's data?** No. Scoping is applied server-side before any query runs, and there is no parameter that widens it. **Can I get data for several customer systems from one endpoint?** No — one instance serves one customer system. If you operate several, you extract from each and union them in your warehouse. **Can I call this from a browser?** No. There is no CORS policy, and a `client_credentials` secret does not belong in browser code. **Does this contain personal data?** Yes — ticket holders and buyers are identifiable people, and the custom registration fields can hold anything your forms collect. Treat the extract as personal data end to end: restrict warehouse access, apply your retention policy, and involve whoever owns data protection in your organisation before the first load. ### Limits **Is there a rate limit?** Not today. Keep parallelism modest anyway — you are reading a live production system. **Why is `$top` capped at 1000?** Because page size is what keeps the keyset walk cheap. Use the next links; a larger page would not make a full extract faster. **Why can I not aggregate server-side?** By design. Aggregation belongs where your business definitions live, which is your warehouse. If you want ad-hoc answers rather than data, ask about the MCP surface. ### Getting help When something is wrong, the fastest route to an answer includes: - the **exact request URL**, with query options, minus your token - the **status code** and the `error.message` from the response body - the **timestamp** and roughly how many pages in you were - the output of `GET /health` at the time Contact us through your usual ADITUS support channel. ## Service endpoints Human documentation: https://developers.aditus.com/docs/business-intelligence/service-endpoints The non-data endpoints: the service document, the metadata document, and the health check. All three sit under the same `api/ticketinghub` prefix as the datasets. Use `Get health` as a liveness probe before starting a long extract, and `Get metadata document` to let your BI or ETL tool map the schema. ### GET Get health - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/health` - Authentication: none - Human documentation: https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-health Reports whether this instance is up and able to serve data. Anonymous — no token required. Worth calling as a liveness probe at the start of a scheduled extract: it fails fast and clearly, instead of your job discovering the problem halfway through a 400-page walk. #### Request No parameters, no body, no authentication. #### Response - `status` (string): `Healthy`, `Degraded` or `Unhealthy`. - `totalDuration` (string): how long the checks took. - `entries` (object): one entry per check. - `product` (object): name and version of the running build. - `TicketingHub Database Connection` (object): whether the data store is reachable. - `TicketingHub Views` (object): whether all four datasets are readable. #### What the states mean | Status | Meaning | What your job should do | |---|---|---| | `Healthy` | All checks passed | Proceed | | `Degraded` | Reachable, but serving only part of the data | Proceed with caution, and alert — a load now may be incomplete | | `Unhealthy` | The data store is unreachable or the datasets cannot be read | Do not start; retry later | This reports the API's own health. A `502` or `504` on any request means the gateway could not reach it at all — see **Errors**. Include this response when you report a problem to support. #### Response example: (200 OK) ```json { "status": "Healthy", "totalDuration": "00:00:00.0412996", "entries": { "product": { "status": "Healthy", "duration": "00:00:00.0001120", "data": { "name": "ADITUS.TicketingHub", "version": "1.4.0" } }, "TicketingHub Database Connection": { "status": "Healthy", "duration": "00:00:00.0198431", "data": {} }, "TicketingHub Views": { "status": "Healthy", "duration": "00:00:00.0208764", "data": { "TicketingHub.Tickets": "readable", "TicketingHub.TicketUsages": "readable", "TicketingHub.StatisticGroups": "readable", "TicketingHub.Surveys": "readable" } } } } ``` ### GET Get service document - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-service-document Lists the datasets this service exposes. The standard OData entry point — useful for discovery, and as the quickest way to confirm your token and base URL are both right. #### Request No parameters and no body. #### Response - `@odata.context` (string): the metadata URL. - `value` (array): one entry per dataset. - `name` (string): the dataset name, for example `Tickets`. - `kind` (string): always `EntitySet` here. - `url` (string): the path to append to the service root. Four entries are returned: `Tickets`, `TicketUsages`, `StatisticGroups` and `Surveys`. #### Notes A `200` here with four entries means your base URL, token, scope and network path are all correct — a useful first call when setting up a new environment. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. | #### Response example: (200 OK) ```json { "@odata.context": "https://example.aditus.de/api/ticketinghub/odata/v1/$metadata", "value": [ { "name": "Tickets", "kind": "EntitySet", "url": "Tickets" }, { "name": "TicketUsages", "kind": "EntitySet", "url": "TicketUsages" }, { "name": "StatisticGroups", "kind": "EntitySet", "url": "StatisticGroups" }, { "name": "Surveys", "kind": "EntitySet", "url": "Surveys" } ] } ``` ### GET Get metadata document - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/odata/v1/$metadata` - Authentication: OAuth 2.0 bearer token (client credentials) - Human documentation: https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-metadata-document The authoritative column catalogue for all four datasets. This is what a BI or ETL tool reads to map the schema, and what you should point a code generator at. #### Request No parameters and no body. #### Response An XML CSDL document. For every dataset it states: - every column, with its type - whether each column is nullable - which columns form the key - an `Org.OData.Core.V1.Description` annotation per column, holding its business label #### Notes Generated from the running build, so it can never drift from the instance you are querying. Column sets do evolve as the underlying datasets do, which is exactly why reading the catalogue beats maintaining your own copy of it — a loader driven by `$metadata` keeps working across releases. Most OData connectors — Power BI, Tableau, Azure Data Factory, Fivetran — read this automatically when you point them at the service root. See **Connecting your BI tool**. Two caveats on what you will find here. It describes **types, not value sets**: a status column appears as `Edm.String`, and what it can actually contain is in **Datasets → Column values**. And the labels for the custom registration fields (`TicketOwnerInfo*`) are generic, because only your own registration configuration knows what those hold. #### Request headers | Header | Example value | Description | | --- | --- | --- | | Authorization | Bearer {{ACCESS_TOKEN}} | Required. A client-credentials token carrying the scope `ticketinghub-api` and no subject. | #### Response example: Get metadata document (abridged) (200 OK) ```xml ``` ### GET Get swagger document - Endpoint: `GET {{API_BASE_URL}}/ticketinghub/swagger/v1/swagger.json` - Authentication: none - Human documentation: https://developers.aditus.com/docs/business-intelligence/service-endpoints/get-swagger-document The OpenAPI document for this instance: the four dataset routes, their query options, and the full column schema of every dataset with business labels. #### Request No parameters and no body. #### Response A standard OpenAPI 3 document. Every column carries its business label as an OpenAPI description. #### Notes Generated from the running build, so it always matches the instance you are talking to. For schema work prefer `GET /odata/v1/$metadata`: the CSDL document is the richer of the two, because it also states the key columns and the nullability of every field, and it is what BI and ETL tools read. Use this document when your tooling speaks OpenAPI and nothing else. Like `$metadata`, this describes types rather than value sets — a status column appears as a string. What it can contain is in **Datasets → Column values**. #### Response example: Get swagger document (abridged) (200 OK) ```json { "openapi": "3.0.4", "info": { "title": "ADITUS.TicketingHub.API | v1", "version": "1.0" }, "paths": { "/odata/v1/Tickets": { "get": { "tags": [ "Tickets" ], "parameters": [ { "name": "$select", "in": "query", "schema": { "type": "string" } }, { "name": "$filter", "in": "query", "schema": { "type": "string" } }, { "name": "$orderby", "in": "query", "schema": { "type": "string" } }, { "name": "$top", "in": "query", "schema": { "type": "integer", "format": "int32" } }, { "name": "$count", "in": "query", "schema": { "type": "boolean" } } ], "responses": { "200": { "description": "OK" } } } } }, "components": { "schemas": { "Ticket": { "type": "object", "properties": { "MandatorInternalId": { "type": "integer", "format": "int32", "description": "Mandator: Internal ID" }, "TicketInternalId": { "type": "integer", "format": "int32", "description": "Ticket: Internal ID" }, "TicketGrossPrice": { "type": "number", "format": "double", "nullable": true, "description": "Ticket: Gross price" }, "CurrencyShort": { "type": "string", "nullable": true, "description": "Currency: Short name" } } } } } } ```