Skip to content

API-referanse

Dette er den komplette API-referansen for Billettsalg-backend. Alle endepunkter betjenes av Azure Functions under /api-prefikset, og autentisering skjer via JWT bearer-tokener med mindre annet er angitt.

API-konvensjoner

Disse konvensjonene gjelder på tvers av alle endepunkter. De gjør det enklere å integrere mot API-et.

Responskonvolutt

Alle endepunkter returnerer en konsekvent JSON-konvolutt — sjekk success først, og les deretter data eller error:

json
{ "success": true, "data": T }
{ "success": false, "error": "string", "message": "string" }

Organisasjonsavgrensing

De fleste autentiserte endepunkter krever en ?organizationId={organizationId}-queryparameter. Middleware bruker denne til å slå opp innringerens medlemskap og rolle i den aktuelle organisasjonen. Manglende parameter er en vanlig årsak til 400-feil.

Paginering

Listeendepunkter som kan returnere store datamengder støtter queryparameteren limit og returnerer en continuationToken for markørbasert paginering. Send tokenet som ?continuationToken={value} for å hente neste side.

Ratebegrensning

Autentiseringsendepunktene magic-link og verify håndhever ratebegrensning per IP for å hindre misbruk. Ratebegrensning er aktivert i alle miljøer og kan ikke omgås av sikkerhetshensyn.

Myk sletting

Arrangementer, registreringer og brukere støtter myk sletting via et deletedAt-tidsstempel. Mykt slettede poster utelates fra vanlige spørringer, men kan gjenopprettes av en admin.

Autentisering

MetodeEndepunktBeskrivelseAutent.
POST/api/auth/magic-linkBe om innloggings-e-postOffentlig
POST/api/auth/verifyVerifiser magic link-tokenOffentlig
POST/api/auth/verify-codeVerifiser 6-sifret kode fra e-postOffentlig
GET/api/auth/meHent gjeldende brukerPåkrevd

Arrangementer

MetodeEndepunktBeskrivelseAutent.
GET/api/eventsList alle arrangementerPåkrevd
GET/api/events-activeHent aktivt arrangementPåkrevd
GET/api/events-overviewHent arrangementer med statistikkPåkrevd
GET/api/events/{id}Hent arrangementsdetaljerPåkrevd
POST/api/management/eventsOpprett arrangementAdmin
PUT/api/management/events/{id}Oppdater arrangementAdmin
DELETE/api/management/events/{id}Mykt slett arrangementAdmin
PATCH/api/management/events/{id}/restoreGjenopprett mykt slettet arrangementAdmin
PUT/api/management/events/{id}/lockSlå av eller på salgslåsAdmin

enableQuotas-felt

Forespørselskroppen for oppretting og oppdatering av arrangement aksepterer et valgfritt enableQuotas-felt (boolean). Når feltet er true, håndheves tildelingsgrenser når bestillinger opprettes for arrangementet. Standard er false.

Delte arrangementer

Endepunktene for delte arrangementer bruker samme JWT- og ?organizationId={organizationId}-konvensjoner som resten av API-et. Azure Functions-utløseren er konfigurert som anonym, men hver handler utfører autentisering og autorisasjon i applikasjonen. Oppretting og endringer krever også SHARED_EVENTS_ENABLED=true. En konfigurert organisasjonstillatelsesliste kan begrense hvem som kan gjøre endringer.

Rollebetegnelsene nedenfor oppsummerer de effektive tilgangskontrollene. Navngitte rettighetstildelinger kan delegere bestemte oppgaver uten å gi en bredere organisasjonsrolle.

Grunnleggende endepunkter og invitasjoner

MetodeEndepunktBeskrivelseAutent.
GET/api/shared-event-capabilities/createSjekk om gjeldende organisasjon kan opprette delte arrangementerOrganisasjonsadmin
POST/api/shared-eventsOpprett et delt arrangement som utkastOrganisasjonsadmin eller superadmin
GET/api/shared-eventsList delte arrangementer for gjeldende organisasjon. scope=all er bare for superadminDeltakermedlem eller superadmin
GET/api/shared-events/{sharedEventId}Hent visningen innringeren har tilgang tilDeltakermedlem, invitert leser eller superadmin
GET/api/shared-events/{sharedEventId}/capacityLes autoritativ kapasitet for delt arrangementDeltakermedlem eller superadmin
GET/api/shared-event-invitations/pendingList invitasjoner for organisasjoner innringeren administrererAutentisert organisasjonsadmin
POST/api/shared-event-invitations/pending/acceptGodta en invitasjon i appenAdmin i mottakende organisasjon
GET/api/shared-event-invitations/previewForhåndsvis en lenkeinvitasjon uten å røpe detaljer om ugyldige tokenerAutentisert
POST/api/shared-event-invitations/acceptGodta en lenkeinvitasjonAdmin i mottakende organisasjon
POST/api/shared-events/{sharedEventId}/invitation-linksOpprett en invitasjonslenke og forsøk eventuelt e-postleveringmanageParticipants og organisasjonsadmin
GET/api/shared-events/{sharedEventId}/invitation-linksList invitasjonsmetadata. Tokenhash returneres aldrimanageParticipants
DELETE/api/shared-events/{sharedEventId}/invitation-links/{linkId}Tilbakekall en invitasjonslenkemanageParticipants og organisasjonsadmin
POST/api/shared-events/{sharedEventId}/participants/{orgId}/acceptGodta en deltakerinvitasjonAdmin i målorganisasjonen
POST/api/shared-events/{sharedEventId}/participants/{orgId}/declineAvslå en deltakerinvitasjonAdmin i målorganisasjonen
POST/api/shared-events/{sharedEventId}/participants/{orgId}/leaveForlat et delt arrangementAdmin i målorganisasjonen

Ugyldige, utløpte, brukte, tilbakekalte eller utilgjengelige invitasjoner returnerer generiske ikke-funnet-svar slik at innringere ikke kan undersøke invitasjonsstatus.

Administrasjon for arrangør og deltakere

MetodeEndepunktBeskrivelseAutent.
PATCH/api/shared-events/{sharedEventId}Rediger felles detaljer eller priserOrganisasjonsadmin med manageSharedDetails eller managePricing
PATCH/api/shared-events/{sharedEventId}/capacityRediger felleskapasitetSuperadmin
DELETE/api/shared-events/{sharedEventId}Avslutt et utkast på en sikker måteSuperadmin
POST/api/shared-events/{sharedEventId}/participantsLegg en organisasjon direkte til deltakerlistenSuperadmin
DELETE/api/shared-events/{sharedEventId}/participants/{orgId}Fjern en deltakerOrganisasjonsadmin med manageParticipants
PATCH/api/shared-events/{sharedEventId}/lifecycleFlytt arrangementet mellom tillatte livssyklusstatuserOrganisasjonsadmin med manageSharedDetails
PATCH/api/shared-events/{sharedEventId}/participants/{orgId}/quotaOppdater kvoten for én deltakermanageCapacity
PATCH/api/shared-events/{sharedEventId}/quotasOppdater deltakerkvoter samletmanageCapacity
POST/api/shared-events/{sharedEventId}/capacity-policyEndre kapasitetsmodell gjennom den beskyttede overgangsprosessenmanageCapacity
GET/api/shared-events/{sharedEventId}/participants/{orgId}/usersList aktuelle brukere for eier- eller rettighetsadministrasjonOrganisasjonsadmin med manageOwners, eller superadmin
PUT/api/shared-events/{sharedEventId}/grants/{granteeUserId}Opprett eller oppdater en navngitt rettighetstildelingOrganisasjonsadmin med manageOwners
DELETE/api/shared-events/{sharedEventId}/grants/{granteeUserId}Tilbakekall en navngitt rettighetstildelingOrganisasjonsadmin med manageOwners
GET/api/shared-events/{sharedEventId}/auditLes den paginerte revisjonsloggenAutorisert deltaker eller superadmin

Rapportering, salgskanaler og driftsendepunkter

MetodeEndepunktBeskrivelseAutent.
GET/api/shared-events/{sharedEventId}/reports/combinedHent samlet arrangementsrapportEier, viewCombinedReports eller superadmin
GET/api/shared-events/{sharedEventId}/reports/participantHent deltakerrapport. Standard er innringerens organisasjonDeltaker for egen organisasjon. Eier eller superadmin for tillatt mål
GET/api/shared-events/{sharedEventId}/external-sales-channelsList eksterne salgskanaler med beskyttede referanser skjultDeltakermedlem, medlem i invitert organisasjon eller superadmin
GET/api/shared-events/{sharedEventId}/external-sales-channels/{source}Hent én ekstern salgskanal med beskyttede referanser skjultDeltakermedlem, medlem i invitert organisasjon eller superadmin
PUT/api/shared-events/{sharedEventId}/external-sales-channels/{source}Tildel eller oppdater ansvarlig deltakerorganisasjonmanageExternalSales og organisasjonsadmin
DELETE/api/shared-events/{sharedEventId}/external-sales-channels/{source}Deaktiver en kanal uten å slette historisk tilordningmanageExternalSales og organisasjonsadmin
GET/api/shared-event-organizations/searchSøk etter aktive organisasjoner for direkte deltakeradministrasjonSuperadmin
POST/api/shared-events/{sharedEventId}/operation-statusOppdater gjenopprettingsstatus og utfør projeksjonsarbeid i køAutorisert deltaker eller superadmin
POST/api/shared-events/{sharedEventId}/sync-projectionsBe om reparasjon eller synkronisering av organisasjonsprojeksjonerOrganisasjonsadmin med manageSharedDetails

Organisasjonssøk, rettighetstildeling, operasjonsstatus og projeksjonssynkronisering er administrative eller driftsrettede endepunkter for administrasjonsgrensesnittet. De er ikke offentlige søke-API-er og erstatter ikke arbeidsflytene for arrangører og deltakere.

Kanalendepunktene gir også autentiserte medlemmer i en invitert organisasjon en begrenset lesetilgang før invitasjonen er godtatt. De mottar bare kanaloppsettet. Beskyttede connectionRef-verdier fjernes. Aktive deltakere får samme skjerming med mindre kanalen er tildelt deres egen organisasjon. Eiere og superadministratorer kan motta de beskyttede referansene. Innringere utenfor deltakerorganisasjonene og inviterte organisasjoner avvises.

Delegert salg (salgspartnere)

Delegert salg lar en arrangementseier gi en annen organisasjon en avgrenset, selvbetjent mulighet til å selge billetter på sine vegne for et vanlig (ikke delt) arrangement, uten rett til å kansellere en godkjent eller levert bestilling, refundere, overføre, avstemme, fakturere, arkivere eller konfigurere arrangementet. Dette er ikke det samme som medeierskap i et delt arrangement. Se Datamodell → Delegert salg for det fullstendige feltnivå-skjemaet.

Fra og med v1.2.0 er hovedflyten for kjøperen selvbetjening: et godkjent medlem av partnerorganisasjonen bestiller det delegerte arrangementet gjennom den vanlige bestillingsflyten for medlemmer, bestillingen opprettes som pending, og partnerorganisasjonens egen billettansvarlig+ godkjenner og leverer den gjennom en godkjenningskø. Katalogsynlighet og bestillingsoppretting styres hver for seg av sin egen utrullingsbryter — se Miljøvariabler → Konfigurasjon for delegert medlemsbestilling. Et ansatt-opprettet (på vegne av) bestillingsendepunkt beholdes som en sekundær, kompatibel løsning for tilfeller selvbetjening ikke dekker.

Endepunkter for eiersiden

MetodeEndepunktBeskrivelseAutent.
POST/api/organizations/{organizationId}/events/{eventId}/sales-delegationsInviter en partnerorganisasjon til å selge billetter for arrangementetEierorganisasjonens admin+
GET/api/organizations/{organizationId}/events/{eventId}/sales-delegationsList delegeringer for arrangementetEierorganisasjonens admin+
POST/api/organizations/{organizationId}/events/{eventId}/sales-delegations/{delegationId}/revokeTilbakekall en invitert eller aktiv delegeringEierorganisasjonens admin+

POST .../sales-delegationsinndata for å finne partneren er rollestyrt og gjensidig utelukkende. Forespørselskroppen aksepterer nøyaktig ett av to felt; målorganisasjonen løses alltid opp på serversiden til slutt, aldri som fritekst fra klienten:

FeltTypeHvem kan sende detBeskrivelse
partnerAdminEmailstring (e-post)Alle innringereE-postadressen til en administrator i målorganisasjonen. Serveren løser den opp til nøyaktig én kvalifisert organisasjon via resolvePartnerOrganizationByAdminEmail (api/src/shared/delegation-partner-resolution.ts), som gjenbruker samme omvendte oppslag som invitasjoner til delte arrangementer.
partnerOrganizationIdstringKun superadminEn rå organisasjons-ID, kun beregnet på den superadmin-only organisasjonssøkeflyten (GET /shared-event-organizations/search) — aldri en verdi en vanlig admin-klient skal konstruere eller sende.
json
{ "partnerAdminEmail": "admin@partner-choir.example" }
json
{ "partnerOrganizationId": "org-id-fra-sokeresultat" }

Å sende begge feltene, eller ingen av dem, feiler skjemavalidering og returnerer HTTP 400 (Provide exactly one of partnerOrganizationId or partnerAdminEmail) — det finnes ingen prioriteringsregel mellom de to.

En vellykket invitasjon (uansett vei) returnerer HTTP 201 med et objekt som inneholder delegation, en invitationLink (engangslenke — bare hashen av tokenet lagres, så lenken kan ikke hentes ut igjen etter dette svaret) og reverseIndexSync-status.

  • Å invitere en partnerorganisasjon som allerede har en invited- eller active-delegering for arrangementet, er idempotent: den eksisterende delegeringen (og lenken, hvis fortsatt tilgjengelig) returneres i stedet for å opprette en duplikat.
  • Kvalifisering for begge veier: den oppløste målorganisasjonen må være aktiv (ikke slettet) og kan ikke være innringerens egen organisasjon. Det finnes ingen egen partnerskaps-godkjenningsprosess utover dette.

Feilkoder spesifikke for oppslag av partner:

  • 400 — Både partnerAdminEmail og partnerOrganizationId er til stede, eller ingen av dem er det (skjemavalideringsfeil).
  • 400partnerOrganizationId løses opp til innringerens egen organisasjon (Cannot delegate sales to your own organization), eller til en projeksjon av et delt arrangement.
  • 403partnerOrganizationId sendt av en innringer som ikke er superadmin. Dette er en hard rollesperre, uavhengig av om ID-en ellers ville vært gyldig — en vanlig eieradmin kan aldri bruke dette feltet til å utforske organisasjons-ID-er.
  • 404partnerAdminEmail kunne ikke løses opp til nøyaktig én kvalifisert partnerorganisasjon. Dette ene generiske utfallet (samme melding som «No partner organization could be invited with that email address», med ekstra tidsvariasjon i responsen) returneres identisk enten adressen er ukjent, tilhører en som ikke er admin, bare tilhører en ikke-kvalifisert/slettet organisasjon, bare tilhører innringerens egen organisasjon, eller er administrator for mer enn én kvalifisert organisasjon (tvetydig mål) — anti-enumereringskontrakten gjør disse bevisst umulige å skille fra hverandre for innringeren. Frontend utdyper eller tolker aldri denne meldingen videre.

POST .../sales-delegations/{delegationId}/revoke aksepterer { "revokedReason": "..." }revokedReason er påkrevd og kan ikke være tom. Å tilbakekalle en allerede tilbakekalt delegering er idempotent. Tilbakekalling trer i kraft umiddelbart mot eierens autoritative Event.salesDelegations[], uavhengig av hvor raskt partnerens egen omvendte indeks henger med — partneren mister umiddelbart retten til å opprette bestillinger, godkjenne/levere og rapportere, selv før egen liste eller katalogprojeksjon er oppdatert.

Endepunkter for aksept på partnersiden

MetodeEndepunktBeskrivelseAutent.
POST/api/sales-delegations/acceptGodta en invitasjon med tokenet fra engangsinvitasjonslenkenPartnerorganisasjonens admin+
POST/api/organizations/{partnerOrganizationId}/sales-delegations/{delegationId}/declineAvslå en ventende invitasjonPartnerorganisasjonens admin+

POST .../decline krever ikke noe token — det er en handling i appen, gyldig bare fra status invited, og er idempotent hvis delegeringen allerede er avslått.

Endepunkter for medlemmenes selvbetjening og partnerens rapportering

MetodeEndepunktBeskrivelseAutent.
GET/api/organizations/{partnerOrganizationId}/delegated-eventsList arrangementer som for øyeblikket er delegert til denne organisasjonenEthvert godkjent medlem av partnerorganisasjonen
GET/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/sales-contextHent forestillinger, billetttyper og en kapasitetsindikasjon for salgBillettansvarlig+
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/selfSelvbetjening: oppretter en pending-bestilling for den autentiserte innringerenEthvert godkjent medlem av partnerorganisasjonen
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/cancelKanseller en pending-bestilling — av kjøperen selv, eller av partnerens egen billettansvarlig+ på kjøperens vegneKjøper, eller billettansvarlig+
GET/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/queuePartnerens godkjenningskø for egne medlemmers selvbetjente bestillinger, filtrerbar på status pending eller approvedBillettansvarlig+
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/approveGodkjenn en ventende selvbetjent bestillingBillettansvarlig+
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/deliverMerk en godkjent bestilling som levertBillettansvarlig+
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/approve-and-deliverGodkjenn og lever en ventende bestilling i ett stegBillettansvarlig+
GET/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/ordersList denne partnerorganisasjonens egne bestillinger for arrangementetBillettansvarlig+
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/report-soldRapporter solgt antall på en delegert bestillingBillettansvarlig+, eller kjøperen for egen bestilling
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/orders/{orderId}/report-returnedRapporter returnert antall på en delegert bestillingBillettansvarlig+, eller kjøperen for egen bestilling
POST/api/organizations/{partnerOrganizationId}/delegated-events/{eventId}/ordersUtfaset, beholdt som sekundær løsning. Ansatt-opprettet (på vegne av) bestilling for et godkjent medlem av partnerens egen organisasjon, opprettet allerede delivered uten godkjenningsstegBillettansvarlig+
  • GET .../delegated-events returnerer bare referanser med denormalisert status "active" — inviterte, avslåtte og tilbakekalte delegeringer vises aldri i denne listen.
  • GET .../sales-context returnerer kapasitetstall per forestilling. Dette er kun en indikasjon, ikke en reservasjon — endelig kapasitet håndheves atomisk ved bestillingsopprettelse/rapportering, ikke her.
  • POST .../orders/self krever en active-delegering og de samme levende sjekkene som enhver annen delegert skriveoperasjon. Den vanlige POST /api/orders-ruten er ubetinget stengt for et arrangement med en delegert projeksjon — den avvises der med en feilmelding om feil endepunkt, uavhengig av rolle eller projeksjonstilstand, slik at en delegert bestilling aldri kan bygges mot feil organisasjons kapasitetsregnskap. Når DELEGATED_MEMBER_ORDERING_ENABLED er av, returnerer dette endepunktet HTTP 503 med feilkoden DELEGATED_MEMBER_ORDERING_UNAVAILABLE og oppretter ingenting.
  • POST .../orders/{orderId}/cancel kan bare flytte en pending-bestilling til kansellert — samme regel som for en vanlig medlemsbestilling. En partner-billettansvarlig+ får ikke eieradministratorens mulighet til å kansellere en bestilling som allerede er godkjent eller levert.
  • GET .../orders/queue og handlingene approve / deliver / approve-and-deliver er avgrenset til bestillinger opprettet under partnerens egen, for øyeblikket aktive delegering for dette arrangementet; de returnerer eller handler aldri på eierens egne bestillinger eller en annen partners bestillinger. Alle tre verifiserer delegeringen på nytt ved hvert kall, slik at en delegering som tilbakekalles midt i en økt, umiddelbart blokkerer videre handling, selv på bestillinger som allerede ligger i køen.
  • Det ansatt-opprettede endepunktet POST .../orders krever at kjøperen er et godkjent medlem av partnerens egen organisasjon (aldri eierens medlemmer eller en annen partners medlemmer), og oppretter bestillingen allerede med status delivered, soldQuantity: 0 og returnedQuantity: 0. En kapasitetskonflikt ved innsending avvises med HTTP 409 CAPACITY_EXCEEDED.
  • GET .../orders er avgrenset server-side til soldByOrganizationId === partnerOrganizationId; den returnerer aldri eierens egne bestillinger eller en annen partners bestillinger, og utelater denne partnerens bestillinger som siden er overført bort fra den.
  • POST .../report-sold og POST .../report-returned verifiserer på nytt, ved hvert kall, at innringerens organisasjon fortsatt har en aktiv delegering for arrangementet og fortsatt har salgsmyndighet over den spesifikke bestillingen — en delegering som tilbakekalles midt i en økt, blokkerer umiddelbart videre rapportering, selv på bestillinger som allerede er opprettet. Rapporter-solgt håndhever samme atomiske kapasitetssperre som eiersidens rapportering. Rapporter-returnert speiler eiersidens returregel nøyaktig: kravet om at arrangementet/forestillingen må være avsluttet, gjelder alltid for et medlem som returnerer sin egen delegerte bestilling, akkurat som ved en vanlig egen-organisasjons-retur. Dette kravet fravikes bare for partnerens egen billettansvarlig+ som registrerer en retur på et medlems vegne.

Hva delegert salg aldri eksponerer

Ingen delegert-salg-endepunkt støtter refusjon, overføring, avstemming, oppgjør, fakturering eller arkivering av en bestilling, endring av arrangements-, pris-, billettype- eller kapasitetskonfigurasjon, eller kansellering av en bestilling som allerede er godkjent eller levert. Dette forblir utelukkende hos eiersidens endepunkter, avgrenset til eierorganisasjonens egne roller. Den delegerte projeksjonen som gjør en konsert synlig i partnerens egen katalog, er kun en visningsindeks — den brukes aldri i en autorisasjonsvurdering; hver skriveoperasjon utleder autoritet på nytt fra eierens levende Event.salesDelegations[].

Bestillinger

MetodeEndepunktBeskrivelseAutent.
GET/api/ordersList bestillinger (med filtre)Billettansvarlig+
POST/api/ordersOpprett bestillingMedlem+
GET/api/orders/{id}Hent bestillingsdetaljerBillettansvarlig+
POST/api/orders/{id}/approveGodkjenn bestillingBillettansvarlig+
POST/api/orders/{id}/deliverMarker bestilling som levertBillettansvarlig+
POST/api/orders/{id}/cancelKanseller bestillingBillettansvarlig+
DELETE/api/orders/{id}Slett bestillingBillettansvarlig+
PATCH/api/orders/{id}/archiveArkiver eller gjenopprett bestillingBillettansvarlig+
POST/api/orders/archive/previewForhåndsvis kvalifiserte fullførte bestillinger for ett arrangementBillettansvarlig+
POST/api/orders/archiveArkiver én gruppe kvalifiserte fullførte bestillinger for ett arrangementBillettansvarlig+
PATCH/api/orders/{id}/admin-noteOppdater adminnotat på bestillingBillettansvarlig+
POST/api/orders/{id}/transferOverfør bestilling til et annet medlemBillettansvarlig+
GET/api/me/ordersHent gjeldende brukers bestillingerMedlem+

Begge de arrangementsspesifikke arkivendepunktene aksepterer { "eventId": "..." }. En kansellert bestilling er kvalifisert. En oppgjort bestilling er bare kvalifisert når den har et gyldig, låst invoiceBasis og invoicedAt. Slettede og allerede arkiverte bestillinger utelates. Forhåndsvisningen returnerer eligibleCount, statusBreakdown, blockedSettledUninvoiced og blockedInvalidInvoiceBasis. Arkivendepunktet bruker samme kandidatregel, overstyrer aldri blokkeringer, behandler maksimalt 100 bestillinger per kall og returnerer de to blokkeringstallene sammen med processed, conflicts, skipped, remaining, hasMore og completed.

Hvis en uventet feil oppstår etter at minst én bestilling er varig arkivert, returnerer endepunktet HTTP 207 med success: true og completed: false i data i stedet for å forkaste fremdriften. Resultatet inneholder de varige tellerne samt avgrensede verdier for failureCode og failureReason. remaining er numerisk når den etterfølgende opptellingen lykkes, eller null når antallet ikke kan fastslås; hasMore forblir true når antallet er ukjent. Klienter må ikke prøve denne mutasjonen automatisk på nytt, fordi hvert vellykkede kall endrer kandidatene for neste kall.

Arkivering beholder livssyklus, salg, returer, avstemming, fakturastatus og økonomiske opplysninger. Det individuelle PATCH-endepunktet aksepterer { "archived": true | false }. Organisasjonsadministratorer kan uttrykkelig overstyre en blokkert oppgjort bestilling med { "archived": true, "override": { "confirmed": true } }. Billettansvarlige og kasserere får 403 ARCHIVE_OVERRIDE_FORBIDDEN; vanlige blokkerte forespørsler får 409 INVOICE_REQUIRED eller INVALID_INVOICE_BASIS. Overstyringsbeviset lagrer aktør, visningsnavn, tidspunkt, arkiveringstidspunkt og nøyaktige blokkeringer. Beviset beholdes etter gjenoppretting. Eldre arkiverte bestillinger forblir arkivert, men de nye kravene gjelder etter gjenoppretting.

Livssyklus for trykte billetter

MetodeEndepunktBeskrivelseAutent.
POST/api/orders/{id}/report-soldRegistrer det nye, samlede antallet solgt fra en levert bestillingBestillingseier eller admin
POST/api/orders/{id}/returnRegistrer en trinnvis retur av usolgte trykte billetterBestillingseier eller billettansvarlig+
POST/api/orders/{id}/approve-reconciliationGodkjenn en fullstendig avstemt bestilling og lås fakturagrunnlagetBillettansvarlig+

POST /api/orders/{id}/report-sold aksepterer:

json
{
  "soldQuantity": 4,
  "soldTypeQuantities": [
    { "ticketTypeId": "adult", "soldQuantity": 2 }
  ]
}

soldQuantity er det nye, absolutte totalantallet solgt for bestillingen. Hvert valgfritt antall per billettype er antallet som ble solgt i denne forespørselen, og summen per type må være lik økningen fra forrige total. Bestillingen må være levert, innringeren må eie den eller være admin, og det nye totalantallet kan ikke overstige bestilt antall minus returer. Den lokale kontrollen av salskapasitet returnerer HTTP 409 med errorCode: "CAPACITY_EXCEEDED", data.availableCapacity og data.requestedDelta. Konflikter fordi et delt arrangement er utsolgt eller kapasiteten er fryst, kan returnere samme HTTP-status og feilkode uten kapasitetsfeltene. Et vellykket svar returnerer den oppdaterte bestillingen i data.

POST /api/orders/{id}/return aksepterer:

json
{
  "returnQuantity": 2,
  "returnTypeQuantities": [
    { "ticketTypeId": "adult", "returnQuantity": 2 }
  ]
}

Returantallet og valgfrie verdier per billettype er trinnvise. De kan ikke overstige utestående antall. Medlemmer kan bare returnere egne billetter og først etter at den aktuelle forestillingen eller arrangementet er avsluttet. Billettansvarlige, kasserere, administratorer og superadministratorer kan registrere en retur på vegne av et medlem uten datobegrensningen. Bestillingen forblir delivered mens billetter er utestående og går til awaitingReconciliation når solgt pluss returnert er lik bestilt antall.

POST /api/orders/{id}/approve-reconciliation krever ingen forespørselskropp. Endepunktet godtar bare en bestilling med status awaitingReconciliation der solgt pluss returnert er lik utlevert antall. Godkjenning endrer status til settled, registrerer godkjenneren og lagrer et uforanderlig fakturagrunnlag.

Grunnlaget inneholder bare solgt antall multiplisert med enhetsprisene som ble lagret med bestillingen. Hvis alle billetter ble solgt, kan eldre bestillinger utlede antall per type fra de bestilte antallene. Hvis ingen billetter ble solgt, blir grunnlaget tomt med verdi null. Et delvis salg krever fullstendige og konsistente soldTypeQuantities, samt konsistente returdetaljer per type når de finnes. Ufullstendig eller selvmotsigende delhistorikk returnerer 400 og blokkerer oppgjør. totalAmount brukes aldri som reserve for fakturagrunnlaget.

Godkjenningen setter ikke invoicedAt og oppretter eller sender ikke en faktura. Et vellykket svar returnerer den oppgjorte bestillingen i data.

Feil i livssyklusen bruker standard feilkonvolutt. Forvent 400 ved ugyldige antall eller statuser, 403 ved feil eierskap eller rolle, 404 for ukjent bestilling, 409 ved kapasitetskonflikt og 503 når kapasiteten for et delt arrangement er midlertidig utilgjengelig.

Overføring av bestillinger

Overføringsendepunktet lar billettansvarlige flytte billetter mellom medlemmer — enten ved å tildele hele bestillingen på nytt, eller ved å dele den i en kilde- og en mottakerbestilling. En delvis overføring gjennomføres som én atomisk Cosmos-transaksjonsbatch innenfor samme organisasjonspartisjon (erstatt kilde, opprett mottaker), og hver forespørsel er idempotent per klientoppgitt transferRequestId, slik at en gjentatt eller reprodusert forespørsel aldri kan duplisere en overføring eller la den ene siden oppdateres uten den andre.

MetodeEndepunktBeskrivelseAutent.
POST/api/orders/{id}/transferOverfør hele eller deler av en bestilling til et annet medlemBillettansvarlig+

POST /api/orders/{id}/transfer aksepterer:

json
{
  "toUserId": "user-id-of-destination",
  "transferRequestId": "550e8400-e29b-41d4-a716-446655440000",
  "tickets": [
    { "ticketTypeId": "adult", "quantity": 2 },
    { "ticketTypeId": "child", "quantity": 1 }
  ],
  "reason": "Member requested swap"
}

Hva som kan overføres (kun utestående):

En overføring kan bare flytte utestående (ikke rapportert) billettantall — enheter som ennå ikke er solgt eller returnert, er de eneste som er kvalifisert. Solgte og returnerte enheter, og tilhørende bevis per billetttype, flyttes eller endres aldri av dette endepunktet. Utestående beregnes som max(0, totalQuantity - effectiveSoldQuantity - returnedQuantity). Hvis forespurt antall overstiger det som er utestående — samlet eller for en enkelt billetttype — avvises forespørselen med TRANSFER_EXCEEDS_OUTSTANDING; hvis ingenting er utestående i det hele tatt, avvises den med TRANSFER_BLOCKED_NO_OUTSTANDING. Dette betyr at en forespørsel om å overføre hele bestillingen naturlig mislykkes så snart noe rapportering har skjedd (utestående er da mindre enn totalQuantity), mens en delvis overføring av den gjenværende utestående saldoen fortsatt lykkes.

Avstemming ved siste utestående overføring:

Hvis en delvis overføring flytter hele den gjenværende utestående saldoen på en delivered-kildebestilling (altså sourceRemainingQuantity blir 0), går kildebestillingens status fra delivered til awaitingReconciliation som en del av samme atomiske batch — akkurat som om de siste billettene var rapportert solgt eller returnert i stedet for overført. En full overføring utløser aldri dette, siden hele bestillingen tildeles på nytt (det er ingen redusert bestilling igjen å avstemme).

Feilkoder:

  • 400 TRANSFER_EXCEEDS_OUTSTANDING — Forespurt antall overstiger det som er utestående på kildebestillingen.
  • 409 TRANSFER_BLOCKED_NO_OUTSTANDING — Kildebestillingen har null utestående antall igjen — alt er allerede solgt eller returnert.
  • 409 TRANSFER_REQUEST_ID_REUSED — Samme transferRequestId er allerede brukt til en overføring med en annen mottaker, modus eller andre antall.

Tildelinger (salgskvoter)

Tildelingsendepunkter administrerer billettkvoter per medlem. De brukes via arrangementets administrasjonspanel, ikke som en frittstående seksjon. Tildelingsgrenser håndheves kun når enableQuotas er true på det overordnede arrangementet.

MetodeEndepunktBeskrivelseAutent.
GET/api/allocationsList tildelingerBillettansvarlig+
POST/api/allocationsOpprett eller oppdater tildelingBillettansvarlig+
DELETE/api/allocations/{id}Slett tildelingBillettansvarlig+
GET/api/allocations/membersList medlemmer med tildelingsoppsummeringBillettansvarlig+
GET/api/my-allocationsHent medlemmets egne tildelingerMedlem+

Forpliktelser / løfter

MetodeEndepunktBeskrivelseAutent.
GET/api/events/{eventId}/my-pledgeHent medlemmets eget løfte for arrangementMedlem+
POST/api/events/{eventId}/my-pledgeSend inn eller oppdater forpliktelsesløfteMedlem+
GET/api/events/{eventId}/pledge-summaryHent samlet løfteoppsummeringMedlem+
GET/api/management/events/{eventId}/pledgesList alle løfter for arrangementBillettansvarlig+
PUT/api/management/events/{eventId}/commitmentÅpne, lukk eller konverter forpliktelsesrundeAdmin

Eksternt salg

MetodeEndepunktBeskrivelseAutent.
GET/api/management/events/{eventId}/external-salesList eksternt salg for arrangementBillettansvarlig+
GET/api/management/events/{eventId}/showtimes/{showtimeId}/external-salesList eksternt salg per forestillingBillettansvarlig+
POST/api/management/events/{eventId}/showtimes/{showtimeId}/external-salesOpprett ekstern salgsoppføringBillettansvarlig+
PUT/api/management/external-sales/{id}Oppdater eksternt salgBillettansvarlig+
DELETE/api/management/external-sales/{id}Slett eksternt salgBillettansvarlig+

Fribilletter

MetodeEndepunktBeskrivelseAutent.
GET/api/events/{eventId}/free-ticketsList fribilletterBillettansvarlig+
POST/api/events/{eventId}/free-ticketsOpprett fribillettoppføringBillettansvarlig+
PUT/api/events/{eventId}/free-tickets/{id}Oppdater fribillettoppføringBillettansvarlig+
DELETE/api/events/{eventId}/free-tickets/{id}Slett fribillettBillettansvarlig+
GET/api/events/{eventId}/capacity-summaryHent kapasitetsoppsummering for arrangementPåkrevd

Oppdateringsendepunktet krever ?organizationId={organizationId} og et ikke-tomt JSON-objekt med ett eller flere av feltene showtimeId, ticketTypeId, quantity, recipient og reason. Antall må være et positivt heltall. Hvis billettype eller forestilling endres, må den tilhøre arrangementet i URL-en. Svaret returnerer det oppdaterte fribillettobjektet i data.

For delte arrangementer reserverer og bekrefter en antallsøkning bare den ekstra kapasiteten. En reduksjon behandles som en administrativ korrigering og frigir ikke tidligere bekreftet felleskapasitet. Trygge feil omfatter ugyldig input eller utilgjengelig kapasitet, en manglende kobling mellom billett og arrangement, utilgjengelig salg for delt arrangement og midlertidig kapasitetsoppsett eller synkronisering.

Registreringer (direktesalg)

MetodeEndepunktBeskrivelseAutent.
POST/api/registrationsOpprett registrering (1-times frist for redigering)Medlem+
PUT/api/registrations/{id}Oppdater registrering (innen 1 time etter opprettelse)Billettansvarlig+
DELETE/api/registrations/{id}Slett registrering (innen 1 time etter opprettelse)Billettansvarlig+
GET/api/me/historyHent brukerens salgshistorikkMedlem+
GET/api/me/statsHent brukerens statistikkMedlem+

Admin / oversikt

MetodeEndepunktBeskrivelseAutent.
GET/api/management/dashboard/{eventId}Hent oversiktsstatistikkBillettansvarlig+
GET/api/management/dashboard/{eventId}/exportEksporter CSVBillettansvarlig+
GET/api/management/dashboard/{eventId}/export-excelEksporter ExcelBillettansvarlig+
PUT/api/management/members/{userId}/invoice/{eventId}Sett eller fjern fakturastatus for medlem og arrangementBillettansvarlig+
PUT/api/management/registrations/{id}/invoiceMarker én registrering som fakturertBillettansvarlig+

Medlems- og arrangementsendepunktet aksepterer { "invoiced": true } for å registrere at fakturaen er utstedt eller sendt, og { "invoiced": false } for å fjerne denne statusen. Et tomt objekt støttes midlertidig som eldre veksleoppførsel, men førstepartsklienter sender uttrykkelig ønsket status. Den eldre retningen bygger bare på kvalifiserte poster: når alle kvalifiserte poster allerede er fakturert, fjernes statusen selv om uavklarte eller ugyldige trykte bestillinger fortsatt finnes.

Kvalifiserte poster er aktive direkteregistreringer og aktive oppgjorte bestillinger med gyldig, låst fakturagrunnlag. Arkiverte oppgjorte bestillinger kan faktureres, men må gjenopprettes før fakturastatus fjernes. Uavklarte bestillinger og bestillinger med ugyldig grunnlag endres ikke. Fakturabeløpet er summen av registreringenes totalAmount og bestillingenes invoiceBasis.grandTotal; det bruker aldri TicketOrder.totalAmount.

Operasjonen bruker ETag-vilkår for hver post. Resultatet rapporterer samlede og typespesifikke tall for oppdatert, uendret, konflikt, uavklart, ugyldig og mislykket. Markøren completed er bare true når ingen konflikt eller skrivefeil oppstod. En forespørsel med konflikter eller skrivefeil returnerer HTTP 207 med completed: false og beholder vellykkede oppdateringer. Gjentakelse av samme uttrykkelige forespørsel konvergerer uten å veksle poster som allerede har riktig status.

Invitasjoner

MetodeEndepunktBeskrivelseAutent.
POST/api/organizations/{organizationId}/invitationsOpprett invitasjonskodeAdmin
GET/api/organizations/{organizationId}/invitationsList invitasjonerAdmin
DELETE/api/organizations/{organizationId}/invitations/{code}Slett eller tilbakekall invitasjonAdmin
GET/api/join/{code}Valider invitasjonskodeOffentlig
POST/api/join/{code}Godta invitasjon og bli med i organisasjonOffentlig

Superadmin

MetodeEndepunktBeskrivelseAutent.
GET/api/organizationsList alle organisasjonerSuperadmin
POST/api/organizationsOpprett organisasjonSuperadmin
GET/api/organizations/{id}Hent organisasjonsdetaljerSuperadmin
PUT/api/organizations/{id}Oppdater organisasjonSuperadmin
DELETE/api/organizations/{id}Slett organisasjonSuperadmin
POST/api/organizations/{id}/members/importImporter medlemmer via CSVSuperadmin
GET/api/organizations/{id}/membersList organisasjonsmedlemmerSuperadmin
POST/api/organizations/{id}/membersLegg til medlem i organisasjonSuperadmin
PUT/api/organizations/{id}/members/{memberId}Oppdater medlemsrolleSuperadmin
DELETE/api/organizations/{id}/members/{memberId}Fjern medlem fra organisasjonSuperadmin
GET/api/usersList alle brukereSuperadmin
GET/api/users/{id}Hent brukerdetaljerSuperadmin
PUT/api/users/{id}Oppdater brukerSuperadmin
PUT/api/users/{id}/super-adminSlå av eller på superadmin-statusSuperadmin
POST/api/users/importImporter brukere via CSVSuperadmin
DELETE/api/users/bulk-deleteMasseslett brukereSuperadmin
POST/api/users/bulk-assign-organizationMassetildel brukere til organisasjonSuperadmin
POST/api/impersonation/auditLogg representasjonshendelseSuperadmin
GET/api/impersonation/auditHent representasjonsloggerSuperadmin

Varsler

MetodeEndepunktBeskrivelseAutent.
GET/api/notificationsList gjeldende brukers varslerMedlem+
POST/api/notifications/{id}/readMarker ett varsel som lestMedlem+
POST/api/notifications/read-allMarker alle varsler som lestMedlem+
DELETE/api/notifications/{id}Slett et varselMedlem+

Alle varselendepunkter krever ?organizationId={organizationId}. Varsler er avgrenset til innlogget bruker — du kan bare lese og slette dine egne varsler. Endepunktet returnerer de 50 nyeste varslene sortert etter createdAt DESC.

Rapporter

MetodeEndepunktBeskrivelseAutent.
GET/api/management/reportsHent rapportdata (alle faner)Kasserer+
GET/api/management/reports/exportEksporter rapport som CSVKasserer+

Queryparametere for GET /api/management/reports:

ParameterVerdierBeskrivelse
typemembers, choirs, events, types, ticketmaster, allRapportfane som skal lastes
organizationIdorganisasjons-IDPåkrevd
eventIdarrangements-IDValgfritt filter

Finansiell rapportering for trykte bestillinger omfatter bare faktisk salg. Ventende og godkjente bestillinger bidrar med null. Leverte bestillinger og bestillinger som venter på avstemming bruker validerte rapporterte salgslinjer når de finnes; oppgjorte bestillinger bruker det validerte låste fakturagrunnlaget. Returnerte eller utestående billetter bidrar ikke med inntekt eller gebyr, og ugyldige eller ufullstendige detaljer faller aldri tilbake til TicketOrder.totalAmount.

Queryparametere for eksport:

ParameterVerdierBeskrivelse
exportTypetransactions, members, showtimes, ordersHva som skal eksporteres
formatcsvFilformat (bare CSV foreløpig)
organizationIdorganisasjons-IDPåkrevd

CSV-eksportene transactions, members og showtimes bruker de samme solgte antallene, prisene fra bestillingstidspunktet og gebyrantallene som rapportresponsen.

Administrasjon

MetodeEndepunktBeskrivelseAutent.
POST/api/management/cleanupSlett alle data (bare dev/test)Superadmin
GET/api/management/events/{eventId}/external-salesList eksternt salg for arrangementBillettansvarlig+
GET/api/management/events/{eventId}/showtimes/{showtimeId}/external-salesList eksternt salg per forestillingBillettansvarlig+
POST/api/management/events/{eventId}/showtimes/{showtimeId}/external-salesOpprett ekstern salgsoppføringBillettansvarlig+
PUT/api/management/external-sales/{id}Oppdater eksternt salgBillettansvarlig+
DELETE/api/management/external-sales/{id}Slett eksternt salgBillettansvarlig+

Administrasjonsopprydding

Endepunktet POST /api/management/cleanup er bare tilgjengelig når E2E_TEST_MODE=true og krever superadmin-autentisering. Send ?confirm=yes for å faktisk slette alle data. Advarsel: Dette sletter ALLE organisasjoner, arrangementer, registreringer, billetttyper og andre applikasjonsdata. Bruk det bare i utviklings- og testmiljøer.


Neste: Miljøvariabler · Se også: Arkitektur · Datamodell

Built with VitePress