{"components":{"securitySchemes":{"bearerAuth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}},"schemas":{}},"info":{"title":"ProsessPilotene API","description":"Versioned resources for the ProsessPilotene native app and integrations. Protected operations require an Auth0 Bearer access token and authorized record access. Public events, forum and engagement reads do not require a token. Auth bootstrap is restricted to machine clients; Sanity integrations use signed webhooks. Account identifiers are Dataverse GUIDs, distinct from Auth0 organization identifiers.","version":"1.0.0"},"openapi":"3.1.2","paths":{"/trust":{"get":{"description":"Versioned integration inventory in Norwegian and English. Unverified processing locations and contractual details are explicitly labelled. No authentication required.","summary":"Data handling and provider inventory","tags":["Trust"],"operationId":"getTrust"}},"/trust/status":{"get":{"description":"API response availability, application-database connectivity, shared vendor observations, source-attributed explanations and bounded public history. Falls back to the last sanitized snapshot when live collection is unavailable. Observations expire after two minutes. No private backend details are returned.","summary":"Public service observations","tags":["Trust"],"operationId":"getTrustStatus"}},"/trust/status/fallback":{"get":{"description":"Timestamped sanitized public fallback projection. Prefer /trust/status for live reads; this route is for outage rendering without requiring Auth0.","summary":"Public status fallback snapshot","tags":["Trust"],"operationId":"getTrustStatusFallback"}},"/health":{"get":{"description":"Liveness and backend health.","summary":"Health check","tags":["Health"],"operationId":"getHealth"}},"/v1/auth-bootstrap/contact":{"post":{"security":[{"bearerAuth":[]}],"description":"Post-login contactAction: match or create Contact by email (M2M only). Body: bounded JSON or protobuf (`GenericStructPayload`) for Auth0 Actions and other M2M callers.","summary":"Auth bootstrap — contact","tags":["AuthBootstrap"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1Auth-bootstrapContact"}},"/v1/auth-bootstrap/account":{"post":{"security":[{"bearerAuth":[]}],"description":"Post-login accountAction: confirm Contact → Account via parent customer (`_parentcustomerid_value`); returns account metadata for Auth0 Organization sync. Requires M2M `read:account` and `read:contact`. Body is bounded JSON or protobuf.","summary":"Auth bootstrap — account","tags":["AuthBootstrap"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1Auth-bootstrapAccount"}},"/v1/me":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns the signed-in user's own CRM contact. The contact is resolved from the token; no identifier is accepted from the client.","summary":"Get my profile","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1Me"},"patch":{"security":[{"bearerAuth":[]}],"description":"Updates the signed-in user's own contact. Requires the `If-Match` header from a prior GET; a stale value returns 412 rather than overwriting. Only profile patch fields are accepted.","summary":"Update my profile","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1Me"}},"/v1/me/avatar":{"get":{"security":[{"bearerAuth":[]}],"summary":"Get my avatar","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeAvatar"},"put":{"security":[{"bearerAuth":[]}],"description":"Replaces the signed-in user's avatar. JPEG, PNG or WebP, at most 512 KB; the image type is determined from the bytes, not the header.","summary":"Set my avatar","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"default":[1,2,3]}}},"required":true},"operationId":"putV1MeAvatar"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Remove my avatar","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1MeAvatar"}},"/v1/me/newsletter-preferences":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns authoritative Customer Insights newsletter consent for the signed-in user's verified email.","summary":"Get my newsletter preference","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNewsletter-preferences"},"patch":{"security":[{"bearerAuth":[]}],"description":"Directly records opt-in or opt-out in Customer Insights for the signed-in user's verified email. No double opt-in is initiated.","summary":"Update my newsletter preference","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MeNewsletter-preferences"}},"/v1/me/preferences":{"get":{"security":[{"bearerAuth":[]}],"summary":"Get my canonical preferences","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MePreferences"},"patch":{"security":[{"bearerAuth":[]}],"summary":"Update my canonical preferences","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MePreferences"}},"/v1/me/consents":{"patch":{"security":[{"bearerAuth":[]}],"description":"Records the signed-in user's consent choices. Both flags must be sent explicitly; the call fails rather than returning 200 if the Dataverse environment cannot store them.","summary":"Update my consents","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MeConsents"}},"/v1/me/identities":{"get":{"security":[{"bearerAuth":[]}],"summary":"List my linked identities and passkeys","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeIdentities"}},"/v1/me/identities/{provider}/{providerUserId}":{"delete":{"security":[{"bearerAuth":[]}],"summary":"Unlink one of my sign-in methods","tags":["Me"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"}},{"name":"providerUserId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1MeIdentitiesByProviderByProviderUserId"}},"/v1/me/passkeys/{passkeyId}":{"delete":{"security":[{"bearerAuth":[]}],"description":"Deletes one of the caller's passkeys. Enrolment cannot happen here — the app deep-links into hosted login for that.","summary":"Delete one of my passkeys","tags":["Me"],"parameters":[{"name":"passkeyId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1MePasskeysByPasskeyId"}},"/v1/me/export-request":{"post":{"security":[{"bearerAuth":[]}],"description":"Records a GDPR data-portability request for customer service and returns its id and SLA.","summary":"Request an export of my personal data","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeExport-request"}},"/v1/me/deletion-request":{"post":{"security":[{"bearerAuth":[]}],"description":"Records a GDPR Art. 17 erasure request as a Dataverse case and returns its id and SLA. Satisfies App Store Guideline 5.1.1(v); it does not itself erase data.","summary":"Request account deletion","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeDeletion-request"}},"/v1/me/privacy-storage-consent":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns authoritative Customer Insights privacy-storage consent for the signed-in verified email.","summary":"Get my privacy-storage consent","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MePrivacy-storage-consent"},"patch":{"security":[{"bearerAuth":[]}],"description":"Grants the signed-in person's privacy-storage consent in Customer Insights without double opt-in. Withdrawal is handled through the account-deletion request.","summary":"Update my privacy-storage consent","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MePrivacy-storage-consent"}},"/v1/me/sms-consent":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns authoritative Customer Insights SMS consent for the signed-in person's CRM mobile number.","summary":"Get my SMS consent","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeSms-consent"},"patch":{"security":[{"bearerAuth":[]}],"description":"Updates Customer Insights purpose consent for the Text Message channel using the caller's CRM mobile number.","summary":"Update my SMS consent","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MeSms-consent"}},"/v1/me/tracking-identity-grant":{"post":{"security":[{"bearerAuth":[]}],"description":"Issues a short-lived single-use grant for the tracking Worker after deriving the caller's pseudonym from verified Contact linkage. Contact and analytics identifiers are never accepted from the request body.","summary":"Authorize my anonymous tracking identity transition","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeTracking-identity-grant"}},"/v1/me/notifications":{"get":{"security":[{"bearerAuth":[]}],"description":"Thread summaries for the signed-in user's inbox, ordered by last activity desc, cursor-paged. `userKeys` are resolved from the token — contact id and Auth0 subject, never accepted from the client.","summary":"List my notification threads","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNotifications"}},"/v1/me/notifications/unread-count":{"get":{"security":[{"bearerAuth":[]}],"description":"Count of threads with at least one unread entry — the bell badge.","summary":"My unread notification thread count","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNotificationsUnread-count"}},"/v1/me/notifications/sync":{"get":{"security":[{"bearerAuth":[]}],"description":"Delta sync for the native app's local mirror: everything with `sync_seq > since`, in one monotonic total order across threads and entries. `since=0` is the full snapshot, so first-launch and incremental sync share this one endpoint.","summary":"Sync my notifications since a cursor","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNotificationsSync"}},"/v1/me/notifications/web-push-config":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns the public VAPID application-server key for the signed-in browser subscription flow.","summary":"Get browser push configuration","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNotificationsWeb-push-config"}},"/v1/me/notifications/web-push-subscription":{"put":{"security":[{"bearerAuth":[]}],"description":"Registers or refreshes this signed-in user's encrypted browser Push API subscription.","summary":"Register my browser push subscription","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeNotificationsWeb-push-subscription"},"delete":{"security":[{"bearerAuth":[]}],"description":"Removes this signed-in user's browser Push API subscription by endpoint.","summary":"Unregister my browser push subscription","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"deleteV1MeNotificationsWeb-push-subscription"}},"/v1/me/notifications/{threadId}":{"get":{"security":[{"bearerAuth":[]}],"description":"A thread with its entries, chronological. 404 when the thread doesn't exist or isn't owned by the caller — the two are indistinguishable.","summary":"Get one of my notification threads","tags":["Notifications"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeNotificationsByThreadId"}},"/v1/me/notifications/{threadId}/read":{"post":{"security":[{"bearerAuth":[]}],"description":"Marks every entry in the thread read (set-once — already-read entries are untouched). Fired on opening the thread.","summary":"Mark one of my notification threads read","tags":["Notifications"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeNotificationsByThreadIdRead"}},"/v1/me/notifications/read-all":{"post":{"security":[{"bearerAuth":[]}],"description":"The \"mark all as read\" button: marks every entry across all of my threads read (set-once).","summary":"Mark all of my notifications read","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeNotificationsRead-all"}},"/v1/me/notifications/{threadId}/task-status":{"post":{"security":[{"bearerAuth":[]}],"description":"Sets a task thread's status (\"open\" or \"done\"). Last-write-wins at the server — there is no conflicting-writer timestamp to compare against.","summary":"Set the task status of one of my notification threads","tags":["Notifications"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeNotificationsByThreadIdTask-status"}},"/v1/me/onboarding":{"get":{"security":[{"bearerAuth":[]}],"summary":"Resolve my onboarding situation","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeOnboarding"}},"/v1/me/onboarding/profile":{"post":{"security":[{"bearerAuth":[]}],"summary":"Complete my onboarding profile","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingProfile"}},"/v1/me/onboarding/consent":{"post":{"security":[{"bearerAuth":[]}],"summary":"Record required privacy-storage consent and optional newsletter preference","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingConsent"}},"/v1/me/onboarding/organization-selection":{"post":{"security":[{"bearerAuth":[]}],"summary":"Complete my organization onboarding handoff","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingOrganization-selection"}},"/v1/me/onboarding/personal":{"post":{"security":[{"bearerAuth":[]}],"summary":"Choose personal use","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingPersonal"}},"/v1/me/onboarding/company":{"post":{"security":[{"bearerAuth":[]}],"summary":"Register or request access to a company","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingCompany"}},"/v1/me/onboarding/join-requests/{requestId}/retry":{"post":{"security":[{"bearerAuth":[]}],"summary":"Retry my company access request","tags":["Me"],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingJoin-requestsByRequestIdRetry"}},"/v1/me/onboarding/join-requests/{requestId}/decision":{"post":{"security":[{"bearerAuth":[]}],"summary":"Decide a company access request","tags":["Me"],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeOnboardingJoin-requestsByRequestIdDecision"}},"/v1/me/inbox/messages":{"get":{"security":[{"bearerAuth":[]}],"description":"The Dataverse half of the inbox: the signed-in Contact's conversations and their customer-visible messages, read straight from Dataverse. Deliberately separate from `/me/notifications`, which serves the notifications half — nothing is projected between the two stores, so each has its own cursor and its own cache key and the client merges them. Pages on a `modifiedon` high-water mark via `cursor`; `hasMore` says whether another page exists. Returns an empty list rather than an error when the caller has no linked Contact or the deployment has no Dataverse messaging configured.","summary":"List the signed-in contact's Dataverse message threads","tags":["Inbox"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxMessages"},"post":{"security":[{"bearerAuth":[]}],"description":"Starts an outbound conversation as a Dataverse Conversation and a published, customer-visible Dataverse Message. Nothing is written to the notifications store: it holds notifications and tasks, Dataverse holds messages, and neither is projected into the other. The authenticated Contact and the publication fields are selected server-side. `id` is an optional client-generated UUID used to make both Conversation creation and Message publication idempotent, so concurrent retries converge on one thread and one message. Optional `regarding: { kind, id }` anchors the conversation to one of the caller's own records. Activity-enabled records use the Message activity's `regardingobjectid`; Project Operations projects use an internal Conversation marker because that table cannot own activities. The table is resolved server-side from `kind` and the id is re-authorized against the caller's relationships, so a record they cannot reach is refused as 404 whether or not it exists.","summary":"Start an outbound inbox conversation","tags":["Inbox"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeInboxMessages"}},"/v1/me/inbox/action-items":{"get":{"security":[{"bearerAuth":[]}],"description":"The signed-in customer's records that need their own input right now — «Trenger din oppfølging» at the top of the inbox Oppgaver tab: open cases with status reason «På vent kunde», active quotes awaiting acceptance (not expired), and contracts sent for signing but not yet signed. Derived at read time from the same Dataverse records `/v1/cases`, `/v1/quotes` and `/v1/contracts` list, under the same delegated identity and record-level authorization (`scopedCollectionFilter`); nothing is stored and there is nothing to mark done — acting on the record clears the item. `accountId` narrows the authorized union to one company so links resolve inside the active organization; `top` bounds rows per kind (1–50, default 25). `unavailableKinds` names any kind whose read failed, so a client can say so rather than render a confident, wrong empty group. Each item carries the web path of its record (`href`), which the app mirrors.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Narrow to one of the caller's accounts (a Dataverse account GUID).","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Maximum items per kind.","in":"query","name":"top","required":false,"schema":{"maximum":50,"minimum":1,"type":"integer"}}],"summary":"List my inbox action items (records needing my input)","tags":["Inbox"],"operationId":"getV1MeInboxAction-items"}},"/v1/me/inbox/messages/summaries":{"get":{"security":[{"bearerAuth":[]}],"description":"A bounded two-operation inbox overview built by grouping published customer-visible Dataverse Messages per Conversation owned by the signed-in Contact, then reading only each exact latest row with its Contact-scoped receipt. It remains correct when an internal model-driven publisher has not maintained the optional Conversation preview projection. It does not read Message histories, reactions, attachment metadata, or attachment bodies. `unreadCount` is the latest received Message's recipient-specific state (zero or one), not a history count.","summary":"List bounded Dataverse inbox summaries","tags":["Inbox"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxMessagesSummaries"}},"/v1/me/inbox/threads/{threadId}/messages":{"get":{"security":[{"bearerAuth":[]}],"description":"One bounded newest-first Dataverse page from a Conversation owned by the signed-in Contact. Entries are returned in chronological order within the page; the opaque cursor loads the next older page. Receipts, reactions and attachment metadata are restricted to that page, and attachment bodies remain on the explicit download route.","summary":"Read a bounded Dataverse conversation page","tags":["Inbox"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxThreadsByThreadIdMessages"},"post":{"security":[{"bearerAuth":[]}],"description":"Replies within one of my conversations by publishing a customer-visible Dataverse Message against it. `threadId` is the Conversation GUID. Nothing is written to the notifications store. 404 when the Conversation doesn't exist or isn't owned by the caller — the two are deliberately indistinguishable. `id` is an optional client-generated UUID for idempotent replay.","summary":"Reply within one of my inbox conversations","tags":["Inbox"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeInboxThreadsByThreadIdMessages"}},"/v1/me/inbox/discussions":{"get":{"security":[{"bearerAuth":[]}],"description":"The discussions half of the inbox: the trusted-engagement threads the signed-in user takes part in, across both content discussions and forum threads. Read straight from the engagement tables — discussions are never projected into the notification tables, so this has its own cursor and its own cache key and the client merges it with `/me/notifications` and `/me/inbox/messages`. Replying is deliberately **not** here: it goes through the existing `/me/engagement/content/:contentKey/contributions` and `/me/forum/threads/:slug/replies`, so moderation, rate limiting, idempotency and scoring are identical to a reply posted on the page. Pages on a `lastActivityAt` high-water mark via `cursor`. Returns an empty list when the caller has no community actor or the deployment has no engagement store.","summary":"List the signed-in user's discussion threads","tags":["Inbox"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxDiscussions"}},"/v1/me/inbox/discussions/{contentKey}":{"get":{"security":[{"bearerAuth":[]}],"description":"One discussion the signed-in user takes part in, with its visible posts, for the inbox thread view. Posts come through the same read the public page uses, so moderated-away content cannot reappear here. Replying is deliberately not on this route: it goes through `/me/engagement/content/:contentKey/contributions` or `/me/forum/threads/:slug/replies`, which own moderation, rate limiting, idempotency and scoring. A discussion the caller does not take part in is reported as not found.","summary":"Read one of the signed-in user's discussion threads","tags":["Inbox"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxDiscussionsByContentKey"}},"/v1/me/inbox/discussions/{contentKey}/read":{"put":{"security":[{"bearerAuth":[]}],"summary":"Mark one of my discussions as read","tags":["Inbox"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"putV1MeInboxDiscussionsByContentKeyRead"}},"/v1/me/inbox/messages/{messageId}/reaction":{"put":{"security":[{"bearerAuth":[]}],"summary":"Set my reaction to an inbox message","tags":["Inbox"],"parameters":[{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeInboxMessagesByMessageIdReaction"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Remove my reaction from an inbox message","tags":["Inbox"],"parameters":[{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1MeInboxMessagesByMessageIdReaction"}},"/v1/me/inbox/attachments/{attachmentId}":{"get":{"security":[{"bearerAuth":[]}],"summary":"Download an attachment from my inbox","tags":["Inbox"],"parameters":[{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxAttachmentsByAttachmentId"}},"/v1/me/inbox/regarding-targets":{"get":{"security":[{"bearerAuth":[]}],"description":"The business records the signed-in customer may anchor a message to — their own cases, and the projects, companies, work orders and quotes belonging to the accounts they may act for. Runs on `read:profile` narrowed by the relationship, never on the tenant-wide entity scopes a staff surface uses: a customer holding those could enumerate the whole CRM. `q` narrows the result; `unavailableKinds` names any table that could not be read, so a picker can say so rather than render a confident, wrong empty group. Choosing a target here proves nothing — `POST /me/inbox/messages` re-authorizes the id it is given.","summary":"List the records I may anchor a message to","tags":["Inbox"],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeInboxRegarding-targets"}},"/v1/me/engagement/content/{contentKey}":{"get":{"security":[{"bearerAuth":[]}],"summary":"Get my engagement state","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeEngagementContentByContentKey"}},"/v1/me/engagement/content/{contentKey}/useful":{"put":{"security":[{"bearerAuth":[]}],"summary":"Mark content useful","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeEngagementContentByContentKeyUseful"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Remove useful mark","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"deleteV1MeEngagementContentByContentKeyUseful"}},"/v1/me/engagement/content/{contentKey}/contributions":{"post":{"security":[{"bearerAuth":[]}],"summary":"Create a contribution","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeEngagementContentByContentKeyContributions"}},"/v1/me/engagement/contributions/{id}":{"patch":{"security":[{"bearerAuth":[]}],"summary":"Edit my contribution","tags":["Engagement"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1MeEngagementContributionsById"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Delete my contribution","tags":["Engagement"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"deleteV1MeEngagementContributionsById"}},"/v1/me/engagement/content/{contentKey}/follow":{"put":{"security":[{"bearerAuth":[]}],"summary":"Follow engagement content","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeEngagementContentByContentKeyFollow"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Unfollow engagement content","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"deleteV1MeEngagementContentByContentKeyFollow"}},"/v1/me/engagement/contributions/{id}/reports":{"post":{"security":[{"bearerAuth":[]}],"summary":"Report a contribution","tags":["Engagement"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeEngagementContributionsByIdReports"}},"/v1/me/forum/threads":{"post":{"security":[{"bearerAuth":[]}],"summary":"Start a forum thread","tags":["Forum"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumThreads"}},"/v1/me/forum/threads/{slug}/replies":{"post":{"security":[{"bearerAuth":[]}],"summary":"Reply to a forum thread","tags":["Forum"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumThreadsBySlugReplies"}},"/v1/me/forum/contributions/{contributionId}/vote":{"post":{"security":[{"bearerAuth":[]}],"summary":"Vote for a forum contribution","tags":["Forum"],"parameters":[{"name":"contributionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumContributionsByContributionIdVote"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Withdraw a vote for a forum contribution","tags":["Forum"],"parameters":[{"name":"contributionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"deleteV1MeForumContributionsByContributionIdVote"}},"/v1/me/forum/threads/{slug}/accept":{"post":{"security":[{"bearerAuth":[]}],"summary":"Accept a forum answer","tags":["Forum"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumThreadsBySlugAccept"}},"/v1/me/forum/threads/{slug}/pin":{"post":{"security":[{"bearerAuth":[]}],"summary":"Pin or unpin a forum reply","tags":["Forum"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumThreadsBySlugPin"}},"/v1/me/forum/threads/{slug}/state":{"post":{"security":[{"bearerAuth":[]}],"summary":"Close or reopen a forum thread","tags":["Forum"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeForumThreadsBySlugState"}},"/v1/me/event-registrations":{"get":{"security":[{"bearerAuth":[]}],"description":"Contact ownership is derived from trusted identity evidence and enforced in MODEL.","summary":"List my event registrations","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeEvent-registrations"}},"/v1/me/event-registrations/{registrationId}":{"get":{"security":[{"bearerAuth":[]}],"summary":"Get my event registration","tags":["Me"],"parameters":[{"name":"registrationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeEvent-registrationsByRegistrationId"}},"/v1/me/event-registrations/{registrationId}/cancel":{"post":{"security":[{"bearerAuth":[]}],"description":"Cancels only a registration owned by the trusted Contact through the Customer Insights semantic operation.","summary":"Cancel my event registration","tags":["Me"],"parameters":[{"name":"registrationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1MeEvent-registrationsByRegistrationIdCancel"}},"/v1/me/event-session-registrations":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns only session registrations owned by the trusted Dataverse contact.","summary":"List my session registrations","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeEvent-session-registrations"}},"/v1/me/event-session-registrations/{registrationId}":{"get":{"security":[{"bearerAuth":[]}],"summary":"Get my session registration","tags":["Me"],"parameters":[{"name":"registrationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeEvent-session-registrationsByRegistrationId"}},"/v1/cases":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible cases across personal relationships, verified accounts and active shares. Supports bounded search, state, sort and pagination; accountId only narrows the authorized collection.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Search case title and number.","in":"query","name":"q","required":false,"schema":{"maxLength":100,"type":"string"}},{"description":"Filter by case reporter.","in":"query","name":"reporter","required":false,"schema":{"enum":["all","mine"],"type":"string"}},{"description":"Case ordering; newest first by default.","in":"query","name":"sort","required":false,"schema":{"enum":["activity","newest","oldest"],"type":"string"}},{"description":"Filter by case state.","in":"query","name":"state","required":false,"schema":{"enum":["all","active","closed"],"type":"string"}},{"description":"Maximum cases per page.","in":"query","name":"top","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer"}}],"summary":"List accessible cases","tags":["Cases"],"operationId":"getV1Cases"},"post":{"security":[{"bearerAuth":[]}],"description":"Creates a personal case, or an account case when accountId is supplied. MODEL verifies account permissions and derives the reporter from the authenticated caller; unsupported customer identifiers are rejected.","summary":"Create a case","tags":["Cases"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1Cases"}},"/v1/cases/{caseId}/messages":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one owned case with the signed-in Contact's customer-visible active conversations, using one detail request.","parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible case with messages","tags":["Cases","Messages"],"operationId":"getV1CasesByCaseIdMessages"}},"/v1/cases/{caseId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible case using the same MODEL predicate as the collection. Missing and inaccessible records both return 404.","parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible case","tags":["Cases"],"operationId":"getV1CasesByCaseId"}},"/v1/cases/{caseId}/recovery-discard":{"post":{"security":[{"bearerAuth":[]}],"description":"Compensates a partial organization-case creation. Only the original reporter may discard a still-active recent case using its exact creation validator.","summary":"Discard my incomplete organization case","tags":["Cases"],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1CasesByCaseIdRecovery-discard"}},"/v1/cases/{caseId}/closure-request":{"post":{"security":[{"bearerAuth":[]}],"description":"Requests handler-confirmed case closure with an explanation. The case remains open, and the request is sent through the caller's existing customer-message visibility.","summary":"Request closure of one of my cases","tags":["Cases","Messages"],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1CasesByCaseIdClosure-request"}},"/v1/me/learning/courses":{"get":{"security":[{"bearerAuth":[]}],"description":"Public + authenticated + restricted course catalog metadata (no release content) — every visibility tier is discoverable, per the learningCourse schema's own contract; only release detail is gated.","summary":"List the course catalog","tags":["Learning"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningCourses"}},"/v1/me/learning/courses/{slug}":{"get":{"security":[{"bearerAuth":[]}],"description":"Course detail plus its current release outline (modules/lessons/activities with completion policies). Quiz options never carry the answer key (the public dataset never has one). A restricted course's activity content fields carry the real restricted body only when the caller's own resolved organization is entitled to the course (Task #1589); every other caller keeps the empty public projection.","summary":"Get course detail and release outline","tags":["Learning"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningCoursesBySlug"}},"/v1/me/learning/entitlements":{"get":{"security":[{"bearerAuth":[]}],"description":"Which catalog courses (`courseId`/`courseVersionId`/`trainingProgramId`) the caller's own resolved organization is currently entitled to, derived by walking every active `learning_entitlements` grant to the training program(s) it covers (Task #1589). An actor with no resolved organization gets 403 FORBIDDEN, matching self-enrollment's own no-organization case.","summary":"List the caller's organization's course entitlements","tags":["Learning"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningEntitlements"}},"/v1/me/learning/enrollments/{enrollmentId}/practical-submissions":{"get":{"security":[{"bearerAuth":[]}],"summary":"List my practical submissions and feedback","tags":["Learning"],"parameters":[{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningEnrollmentsByEnrollmentIdPractical-submissions"}},"/v1/me/learning/enrollments/{enrollmentId}/activities/{activityId}/practical-submissions":{"post":{"security":[{"bearerAuth":[]}],"summary":"Submit a practical exercise","tags":["Learning"],"parameters":[{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"activityId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeLearningEnrollmentsByEnrollmentIdActivitiesByActivityIdPractical-submissions"}},"/v1/me/learning/practical-submissions/{submissionId}/file":{"get":{"security":[{"bearerAuth":[]}],"summary":"Download a malware-cleared private submission file","tags":["Learning"],"parameters":[{"name":"submissionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningPractical-submissionsBySubmissionIdFile"}},"/v1/me/learning/programs/{trainingProgramId}/review-queue":{"get":{"security":[{"bearerAuth":[]}],"summary":"List my program review queue","tags":["Learning"],"parameters":[{"name":"trainingProgramId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningProgramsByTrainingProgramIdReview-queue"}},"/v1/me/learning/practical-submissions/{submissionId}/review":{"post":{"security":[{"bearerAuth":[]}],"summary":"Review a practical submission","tags":["Learning"],"parameters":[{"name":"submissionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeLearningPractical-submissionsBySubmissionIdReview"}},"/v1/me/learning/enrollments":{"post":{"security":[{"bearerAuth":[]}],"description":"Self-enrolls the caller into a training program the caller's organization is entitled to (`selfEnroll` pins the program's current course version). Accepts either `trainingProgramId` directly, or `courseId` (Task #1589) — resolved server-side to the entitled program that grants that course via `resolveOrganizationCourseEntitlements`; no program grants it is a 404 COURSE_NOT_ENTITLED, fail-closed exactly like the existing no-entitlement 403 for a direct `trainingProgramId`. Idempotent on the learner + course-version natural key — a retry returns the existing enrollment rather than duplicating it.","summary":"Self-enroll into a training program or an entitled course","tags":["Learning"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeLearningEnrollments"}},"/v1/me/learning/dashboard":{"get":{"security":[{"bearerAuth":[]}],"description":"The caller's own learning dashboard: continueLearning (in-progress enrollments), required (requirement === 'required' assignments only, with a computed `overdue` flag), recommendedAssignments (requirement === 'recommended' assignments, never overdue-flagged), programOrProject (program-linked enrollments), selfEnrolled, entitled (catalog courses granted to the caller's organization and not yet enrolled), recommended (public/authenticated catalog courses not yet enrolled), and completed.","summary":"Get my learning dashboard","tags":["Learning"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningDashboard"}},"/v1/me/learning/enrollments/{enrollmentId}":{"get":{"security":[{"bearerAuth":[]}],"description":"One of the caller's own enrollments: its pinned course version, the current completion-record snapshot (if any recalculation has run), the pinned release's own outline (same shape as course detail's `outline` — never the course's current release), the next incomplete activity id/title in outline order, the outline's total activity count, and a per-activity progress-row version map (`activityProgressVersions`) for optimistic-concurrency writes.","summary":"Get enrollment progress / resume state","tags":["Learning"],"parameters":[{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeLearningEnrollmentsByEnrollmentId"}},"/v1/me/learning/enrollments/{enrollmentId}/activities/{activityId}/progress":{"post":{"security":[{"bearerAuth":[]}],"description":"Records progress on one activity of one of the caller's own enrollments, then recalculates course-level completion (returning the refreshed enrollment/completion/achievement alongside the activity progress). `expectedVersion` is required once the activity already has a progress row (optimistic concurrency — a mismatch is a 409). A `completed` status is rejected with 403 COMPLETION_POLICY_VIOLATION for a quiz/instructor-approved activity; those complete only through their own grading/review path.","summary":"Update activity progress","tags":["Learning"],"parameters":[{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"activityId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeLearningEnrollmentsByEnrollmentIdActivitiesByActivityIdProgress"}},"/v1/me/learning/enrollments/{enrollmentId}/activities/{activityId}/quiz-attempts":{"post":{"security":[{"bearerAuth":[]}],"description":"Grades a quiz attempt against the private, Sanity-sourced answer key and records it via the model controller's `recordQuizAttempt`. `answers` maps each question's `questionKey` to the submitted `optionKey`s. Never returns the answer key, correct options, or per-question correctness — only the aggregate `attemptNumber`/`score`/`passed`/`activityStatus`. A quiz with a configured `maxAttempts` rejects a submission past the ceiling with 409 MAX_ATTEMPTS_EXCEEDED.","summary":"Submit a quiz attempt","tags":["Learning"],"parameters":[{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"activityId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeLearningEnrollmentsByEnrollmentIdActivitiesByActivityIdQuiz-attempts"}},"/v1/me/search":{"post":{"security":[{"bearerAuth":[]}],"summary":"Search my authorized content","tags":["Search"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeSearch"}},"/v1/me/search/suggest":{"post":{"security":[{"bearerAuth":[]}],"summary":"Suggest from my authorized content","tags":["Search"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeSearchSuggest"}},"/v1/accounts":{"get":{"security":[{"bearerAuth":[]}],"description":"The caller's customer companies with the role they hold in each. Roles come from Auth0 Organization member roles, not the tenant-wide token role.","summary":"List my companies","tags":["Accounts"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1Accounts"}},"/v1/accounts/{accountId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns an account from the caller's verified membership inventory. Auth0 organization identifiers remain separate from the Dataverse account ID.","summary":"Get an accessible account","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountId"},"patch":{"security":[{"bearerAuth":[]}],"description":"Updates one of the caller's companies using { version, patch }. Read the current version from /v1/accounts. Stale versions return 409.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"patch":{"type":"object","properties":{"addressCity":{"type":"string"},"addressCountry":{"type":"string"},"addressLine1":{"type":"string"},"addressPostalCode":{"type":"string"},"email":{"type":"string"},"logoUrl":{"type":"string"},"name":{"type":"string","minLength":1},"organizationNumber":{"anyOf":[{"type":"string","enum":[""]},{"type":"string"}]},"phone":{"type":"string"},"website":{"type":"string"}}},"version":{"type":"string","minLength":1}},"required":["patch","version"]}}},"required":true},"summary":"Update my company","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"patchV1AccountsByAccountId"}},"/v1/accounts/{accountId}/members":{"get":{"security":[{"bearerAuth":[]}],"description":"Members of one of the caller's own companies. Membership is re-checked in MODEL before anything is returned.","summary":"List members of my company","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountIdMembers"}},"/v1/accounts/{accountId}/event-registrations":{"get":{"security":[{"bearerAuth":[]}],"description":"Every event registration belonging to one of the organization's contacts. Owner-only in MODEL (Q7, Feature #3324) — a non-owner or non-member gets an empty page, not an error.","summary":"List my company's event registrations","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountIdEvent-registrations"}},"/v1/accounts/{accountId}/event-session-registrations":{"get":{"security":[{"bearerAuth":[]}],"description":"Every session registration belonging to one of the organization's contacts. Owner-only in MODEL (Q7, Feature #3324) — a non-owner or non-member gets an empty page, not an error.","summary":"List my company's session registrations","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountIdEvent-session-registrations"}},"/v1/accounts/{accountId}/members/{contactId}/table-roles":{"get":{"security":[{"bearerAuth":[]}],"description":"Owner-only: one member's per-table role overrides (Feature #3324 Phase 3). Every Class-O parent table is listed with its override, or null when the default matrix applies.","summary":"Get a member's per-table role overrides","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"contactId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountIdMembersByContactIdTable-roles"}},"/v1/accounts/{accountId}/members/{contactId}/table-roles/{table}":{"put":{"security":[{"bearerAuth":[]}],"description":"Owner-only: restrict a member's effective role on one Class-O parent table. Rejected when the role would exceed the member's organization role, when the table is not a valid override target, or when it would restrict the sole remaining Owner's own access.","summary":"Set a member's table role override","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"contactId","in":"path","required":true,"schema":{"type":"string"}},{"name":"table","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1AccountsByAccountIdMembersByContactIdTable-rolesByTable"},"delete":{"security":[{"bearerAuth":[]}],"description":"Owner-only: clear a member's override for one table, reverting them to the default role matrix.","summary":"Clear a member's table role override","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"contactId","in":"path","required":true,"schema":{"type":"string"}},{"name":"table","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1AccountsByAccountIdMembersByContactIdTable-rolesByTable"}},"/v1/accounts/{accountId}/invitations":{"get":{"security":[{"bearerAuth":[]}],"description":"Owner-only: pending and expired invitations for one of the caller's companies. A non-owner gets an empty list, not an error.","summary":"List my company's invitations","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1AccountsByAccountIdInvitations"},"post":{"security":[{"bearerAuth":[]}],"description":"Owner-only: invite a person by email with a company role. Auth0 sends the invitation; the invitee accepts it in the browser.","summary":"Invite a member to my company","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1AccountsByAccountIdInvitations"}},"/v1/accounts/{accountId}/invitations/{invitationId}/resend":{"post":{"security":[{"bearerAuth":[]}],"description":"Owner-only: send an existing invitation again with a fresh expiry.","summary":"Resend an invitation","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"invitationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1AccountsByAccountIdInvitationsByInvitationIdResend"}},"/v1/accounts/{accountId}/invitations/{invitationId}":{"delete":{"security":[{"bearerAuth":[]}],"description":"Owner-only: withdraw a pending invitation.","summary":"Revoke an invitation","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"invitationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1AccountsByAccountIdInvitationsByInvitationId"}},"/v1/accounts/{accountId}/memberships/{userId}/role":{"put":{"security":[{"bearerAuth":[]}],"description":"Owner-only: set a member's company role. The sole remaining Owner cannot demote themself.","summary":"Change a member's role","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1AccountsByAccountIdMembershipsByUserIdRole"}},"/v1/accounts/{accountId}/memberships/{userId}":{"delete":{"security":[{"bearerAuth":[]}],"description":"Owner-only: remove a member from the company. The sole remaining Owner cannot remove themself.","summary":"Remove a member","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1AccountsByAccountIdMembershipsByUserId"}},"/v1/accounts/{accountId}/ownership":{"post":{"security":[{"bearerAuth":[]}],"description":"Owner-only: make another member Owner and step down to Contributor. Promotion happens first so the company never has no Owner.","summary":"Transfer ownership of my company","tags":["Accounts"],"parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1AccountsByAccountIdOwnership"}},"/v1/projects":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible projects across verified accounts and active record shares. Optional accountId narrows the authorized collection before pagination.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Maximum projects per page.","in":"query","name":"top","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer"}}],"summary":"List accessible projects","tags":["Projects"],"operationId":"getV1Projects"}},"/v1/projects/{projectId}/risks":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists customer risk reports for an owned project, including their customer-safe lifecycle.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List project risk reports","tags":["Projects","Risks"],"operationId":"getV1ProjectsByProjectIdRisks"},"post":{"security":[{"bearerAuth":[]}],"description":"Creates a customer risk report for an owned project. The project, account, contact and initial Submitted lifecycle are derived server-side.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Report a project risk","tags":["Projects","Risks"],"requestBody":{"content":{},"required":true},"operationId":"postV1ProjectsByProjectIdRisks"}},"/v1/projects/{projectId}/risks/{submissionId}/withdraw":{"post":{"security":[{"bearerAuth":[]}],"description":"Withdraws the signed-in customer's own Submitted or Under review risk report.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"submissionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Withdraw a project risk report","tags":["Projects","Risks"],"operationId":"postV1ProjectsByProjectIdRisksBySubmissionIdWithdraw"}},"/v1/projects/{projectId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible project. MODEL enforces the collection authorization and the separate permissions of child sections; missing and foreign projects are indistinguishable.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible project","tags":["Projects"],"operationId":"getV1ProjectsByProjectId"}},"/v1/projects/{projectId}/messages":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists the signed-in Contact's customer-visible active conversations related to an owned organization project.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List project messages","tags":["Projects","Messages"],"operationId":"getV1ProjectsByProjectIdMessages"}},"/v1/me/settings":{"get":{"security":[{"bearerAuth":[]}],"description":"All of my settings, merged one row per key across the CRM contact id and Auth0 subject. The newer `updatedAt` wins; a tie is broken in favour of the contact-linked row.","summary":"Get my settings","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeSettings"}},"/v1/me/settings/{key}":{"put":{"security":[{"bearerAuth":[]}],"description":"Sets one of my settings, last-write-wins on `updatedAt` (a stale write is a no-op — the stored row is returned unchanged). `updatedAt` must be an ISO-8601 instant; anything else is a 400. A key another authority owns — Auth0, the Dataverse projection, or the Convex account settings once those are the active authority — is refused with a 409 rather than stored as a second copy.","summary":"Set one of my settings","tags":["Me"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeSettingsByKey"}},"/v1/me/settings-sync":{"get":{"security":[{"bearerAuth":[]}],"description":"Opt-in Preview account-settings view. Identity comes from the verified bearer; existing settings routes retain their current authority.","summary":"Read my synchronized settings","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeSettings-sync"}},"/v1/me/settings-sync/intents":{"post":{"security":[{"bearerAuth":[]}],"description":"Submit one classified, replayable intent atomically. Retain its operation ID after an ambiguous response; a 503 does not prove that a write was rejected.","summary":"Apply my settings intent","tags":["Me"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1MeSettings-syncIntents"}},"/v1/assets":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible customer assets across accounts. Optional accountId narrows the authorized collection; MODEL applies roles, overrides and active shares before pagination.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible assets","tags":["Assets"],"operationId":"getV1Assets"}},"/v1/assets/{assetId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible customer asset. MODEL filters the detail query and verifies its account lookup; inaccessible and missing IDs return 404.","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible asset","tags":["Assets"],"operationId":"getV1AssetsByAssetId"}},"/v1/cases/{caseId}/attachments":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List case attachments","tags":["Cases"],"operationId":"getV1CasesByCaseIdAttachments"}},"/v1/cases/{caseId}/attachments/{attachmentId}":{"put":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Upload or replace a case attachment","tags":["Cases"],"requestBody":{"content":{},"required":true},"operationId":"putV1CasesByCaseIdAttachmentsByAttachmentId"},"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Download a case attachment","tags":["Cases"],"operationId":"getV1CasesByCaseIdAttachmentsByAttachmentId"},"delete":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Delete a case attachment","tags":["Cases"],"operationId":"deleteV1CasesByCaseIdAttachmentsByAttachmentId"}},"/v1/cases/{caseId}/inline-images/{imageId}":{"put":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"imageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Upload or replace a case inline image","tags":["Cases"],"requestBody":{"content":{},"required":true},"operationId":"putV1CasesByCaseIdInline-imagesByImageId"},"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"imageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Download a case inline image","tags":["Cases"],"operationId":"getV1CasesByCaseIdInline-imagesByImageId"},"delete":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"imageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Delete a case inline image","tags":["Cases"],"operationId":"deleteV1CasesByCaseIdInline-imagesByImageId"}},"/v1/contracts/{contractId}/signature":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Read customer contract signing status","tags":["Contracts"],"operationId":"getV1ContractsByContractIdSignature"},"post":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Confirm sending a ready contract for signature","tags":["Contracts"],"requestBody":{"content":{},"required":true},"operationId":"postV1ContractsByContractIdSignature"}},"/v1/contracts/{contractId}/signing-review/documents/{documentId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Requires a version query parameter containing the contract ETag returned by signing review.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Download an exact frozen signing document","tags":["Contracts"],"operationId":"getV1ContractsByContractIdSigning-reviewDocumentsByDocumentId"}},"/v1/contracts/{contractId}/signing-review":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Review frozen contract and current signatories","tags":["Contracts"],"operationId":"getV1ContractsByContractIdSigning-review"}},"/v1/contracts/{contractId}/signature/revoke":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Confirm revoking contract signature with a reason","tags":["Contracts"],"requestBody":{"content":{},"required":true},"operationId":"postV1ContractsByContractIdSignatureRevoke"}},"/v1/contracts/{contractId}/documents/{documentId}/commitments":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Read signed contract commitments","tags":["Contracts"],"operationId":"getV1ContractsByContractIdDocumentsByDocumentIdCommitments"}},"/v1/contracts":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible contracts across accounts. MODEL applies per-account authorization and active shares before pagination; accountId only narrows the collection.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible contracts","tags":["Contracts"],"operationId":"getV1Contracts"}},"/v1/contracts/{contractId}/documents":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists customer-visible Office contract documents from the authorized document runtime. The response contains only document metadata, never Graph or SharePoint URLs.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List customer Office contract documents","tags":["Contracts"],"operationId":"getV1ContractsByContractIdDocuments"}},"/v1/contracts/{contractId}/proposals":{"post":{"security":[{"bearerAuth":[]}],"description":"Stages at most 3 MiB for malware scanning. Retry the same request ID and bytes after a 202 response. Does not replace the released contract.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Submit a proposed Word revision","tags":["Contracts"],"requestBody":{"content":{},"required":true},"operationId":"postV1ContractsByContractIdProposals"}},"/v1/contracts/{contractId}/documents/{documentId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Streams one customer-visible Office contract document through the authenticated API. `preview=1` permits inline PDF only; Graph or SharePoint URLs are never returned.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Download customer Office contract document","tags":["Contracts"],"operationId":"getV1ContractsByContractIdDocumentsByDocumentId"}},"/v1/contracts/{contractId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible contract using the same MODEL authorization as the collection. Its account lookup is independently verified.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible contract","tags":["Contracts"],"operationId":"getV1ContractsByContractId"}},"/v1/contracts/{contractId}/document":{"get":{"security":[{"bearerAuth":[]}],"description":"Retired compatibility route. Use the Office document list and authenticated download endpoints instead.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Retired contract document route","tags":["Contracts"],"operationId":"getV1ContractsByContractIdDocument"}},"/v1/contracts/{contractId}/files":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists seller-uploaded PDF/Word contract files (Dataverse `annotation` rows on `pp_contract`), newest first, capped at 50, for one owned contract (design §7a).","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List organization contract files","tags":["Contracts"],"operationId":"getV1ContractsByContractIdFiles"}},"/v1/contracts/{contractId}/files/{fileId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Streams one seller-uploaded contract file's bytes as an authenticated download for one owned contract. `404` when the annotation is missing, foreign, or not a supported document mimetype; no public URL ever exists.","parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"fileId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Download organization contract file","tags":["Contracts"],"operationId":"getV1ContractsByContractIdFilesByFileId"}},"/v1/orders":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible sales and Field Service orders across accounts. MODEL evaluates each source independently before pagination. accountId optionally narrows the authorized collection; sourceKind distinguishes the sources.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible orders","tags":["Orders"],"operationId":"getV1Orders"}},"/v1/orders/{orderId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible order and its lines. MODEL enforces the same record authorization as the collection; inaccessible and missing IDs return 404.","parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible order","tags":["Orders"],"operationId":"getV1OrdersByOrderId"}},"/v1/quotes":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible quotes across accounts. MODEL applies roles, restrictive overrides and active shares before pagination; accountId only narrows the collection.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible quotes","tags":["Quotes"],"operationId":"getV1Quotes"}},"/v1/quotes/{quoteId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible quote and its lines using the same MODEL record authorization as the collection.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible quote","tags":["Quotes"],"operationId":"getV1QuotesByQuoteId"},"patch":{"security":[{"bearerAuth":[]}],"description":"Edits the description and preferred delivery date (YYYY-MM-DD) of an editable draft quote. Omitted fields stay unchanged and null clears a field. Membership, role, quote ownership, revision, state and expiry are rechecked in MODEL; returns the refreshed quote.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Edit organization quote header","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"patchV1QuotesByQuoteId"}},"/v1/quotes/{quoteId}/products":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists active products with a price in the quote's Dataverse price list.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List products available for organization quote","tags":["Quotes","Products"],"operationId":"getV1QuotesByQuoteIdProducts"}},"/v1/quotes/{quoteId}/lines":{"post":{"security":[{"bearerAuth":[]}],"description":"Adds a priced product to an editable draft quote; Dataverse remains authoritative for price and totals.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Add organization quote line","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"postV1QuotesByQuoteIdLines"},"put":{"security":[{"bearerAuth":[]}],"description":"Reconciles the complete editable quote cart in one request and returns authoritative Dataverse prices, totals, and revision.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Save organization quote cart","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"putV1QuotesByQuoteIdLines"}},"/v1/quotes/{quoteId}/lines/{lineId}":{"patch":{"security":[{"bearerAuth":[]}],"description":"Updates quantity on an owned quote line using the quote revision and line ETag for concurrency.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"lineId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Update organization quote line","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"patchV1QuotesByQuoteIdLinesByLineId"},"delete":{"security":[{"bearerAuth":[]}],"description":"Removes an owned quote line using the quote revision and line ETag for concurrency. expectedRevision may be sent in JSON or query string.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"lineId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Remove organization quote line","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"deleteV1QuotesByQuoteIdLinesByLineId"}},"/v1/quotes/{quoteId}/order":{"post":{"security":[{"bearerAuth":[]}],"description":"Confirms an eligible organization quote and converts it to one sales order. Membership, role, quote ownership, revision, state, expiry, and quote-linked idempotency are rechecked in MODEL.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Convert organization quote to order","tags":["Quotes","Orders"],"requestBody":{"content":{},"required":true},"operationId":"postV1QuotesByQuoteIdOrder"}},"/v1/quotes/{quoteId}/reject":{"post":{"security":[{"bearerAuth":[]}],"description":"Rejects a draft or active organization quote by closing it as Lost. Idempotent: an already rejected quote returns 200 with its current detail. Membership, role, quote ownership, revision and state are rechecked in MODEL.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Reject organization quote","tags":["Quotes"],"requestBody":{"content":{},"required":true},"operationId":"postV1QuotesByQuoteIdReject"}},"/v1/work-orders/quotes":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible work order quotes: quotes whose order type is service maintenance (msdyn_ordertype 690970002). Same authorization and paging as GET /v1/quotes; items are QuoteSummary with sourceKind service-maintenance-quote. Details and actions use the /v1/quotes/:quoteId routes.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible work order quotes","tags":["Work orders","Quotes"],"operationId":"getV1Work-ordersQuotes"}},"/v1/work-orders":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible work order orders: every Field Service work order (sourceKind field-service-work-order, detail at GET /v1/work-orders/:workOrderId) plus service-maintenance sales orders (sourceKind service-maintenance-order, detail at GET /v1/orders/:orderId). Same authorization and paging as GET /v1/orders.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible work orders","tags":["Work orders","Orders"],"operationId":"getV1Work-orders"}},"/v1/work-orders/bookings":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists accessible work-order bookings (bookableresourcebooking) with the customer booking status (requested, confirmed, inProgress, completed, cancelled, changeRequested), plus a kind request entry for each unscheduled work order that has a preferred window and no booking that is not cancelled. Latest start (or preferred start) first; same authorization and paging as GET /v1/work-orders.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List accessible work order bookings","tags":["Work orders"],"operationId":"getV1Work-ordersBookings"}},"/v1/work-orders/booking-requests":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists the queued booking requests of the given work orders (Task #5541), newest first per work order, so a client can show «Forespurt – behandles» or a failure until the Dataverse write lands. Each item is a WorkOrderBookingRequestState: kind, bookingId, the requested dateWindow (YYYY-MM-DD) and timeWindow (HH:mm, Europe/Oslo), status (pending, writing, done, failed), attempts, a redacted failureCode, createdAt and updatedAt; never the contact or the message. A non-member gets 404; a role that reads no work order gets an empty list.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Required. The Dataverse account GUID whose work orders' requests are read; MODEL checks membership.","in":"query","name":"accountId","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Required. Comma-separated work order GUIDs, at most 50.","in":"query","name":"workOrderIds","required":true,"schema":{"type":"string"}}],"summary":"List queued work order booking requests","tags":["Work orders"],"operationId":"getV1Work-ordersBooking-requests"}},"/v1/work-orders/{workOrderId}/booking-request":{"post":{"security":[{"bearerAuth":[]}],"description":"Requests a first visit (kind new) or a changed visit (kind change, bookingId required) for an accessible work order. Every check runs before the answer: Owner and Contributor only (Read only is 403), unreadable work orders and bookings 404, a changed work order (expectedRevision, the detail's concurrencyToken) 409, an invalid or past window 400. An accepted request is queued and answered with 202 Accepted and its WorkOrderBookingRequestState (status pending); a background job then sets the work order's preferred date window (YYYY-MM-DD, Europe/Oslo) and optional time window (HH:mm, Europe/Oslo) and posts a customer message about the work order, retrying for about 35 minutes. No booking is created. Follow the request with GET /v1/work-orders/booking-requests until it is done or failed. The request is idempotent on operationId: a resend returns the stored state, and the same operationId with a different request is 409.","parameters":[{"name":"workOrderId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Request a work order booking or booking change","tags":["Work orders"],"requestBody":{"content":{},"required":true},"operationId":"postV1Work-ordersByWorkOrderIdBooking-request"}},"/v1/work-orders/{workOrderId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one accessible Field Service work order: the order detail plus summary, work order type, system status, date and time windows, product lines, service lines and bookings. Inaccessible and missing IDs return 404.","parameters":[{"name":"workOrderId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get accessible work order","tags":["Work orders"],"operationId":"getV1Work-ordersByWorkOrderId"}},"/v1/subscriptions":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists Microsoft licenses and Azure subscriptions for one authorized business.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Opaque continuation from meta.nextCursor. Bound to the caller, filters and current authorization.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"List business subscriptions","tags":["Subscriptions"],"operationId":"getV1Subscriptions"}},"/v1/subscriptions/products":{"get":{"security":[{"bearerAuth":[]}],"description":"Lists active products that can be requested for manual fulfillment. Prices are null when Dataverse has no trusted price.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"List purchasable products","tags":["Subscriptions","Products"],"operationId":"getV1SubscriptionsProducts"}},"/v1/subscriptions/{subscriptionId}":{"get":{"security":[{"bearerAuth":[]}],"description":"Returns one business subscription. Missing and unauthorized records both return 404.","parameters":[{"name":"subscriptionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Get business subscription","tags":["Subscriptions"],"operationId":"getV1SubscriptionsBySubscriptionId"}},"/v1/subscriptions/requests":{"post":{"security":[{"bearerAuth":[]}],"description":"Creates one idempotent sales order for manual purchase or subscription change fulfillment. Existing entitlements remain unchanged.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Optional Dataverse account GUID. Narrows records already authorized by MODEL; never grants access.","in":"query","name":"accountId","required":false,"schema":{"format":"uuid","type":"string"}}],"summary":"Request subscription purchase or change","tags":["Subscriptions","Orders"],"requestBody":{"content":{},"required":true},"operationId":"postV1SubscriptionsRequests"}},"/v1/narration":{"get":{"security":[{"bearerAuth":[]}],"description":"Probes the narration cache for a public document. `200` with `audioUrl`/`vttUrl` when a narration exists; `404 {cached:false, canSynthesize}` otherwise — `canSynthesize: false` means the tier is off for this deployment and the client should use the device voice.","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}},{"description":"Document type (the detail route's breadcrumb type, e.g. `article`, `faq`).","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Document slug.","in":"query","name":"slug","required":false,"schema":{"type":"string"}},{"description":"Document locale: `nb-NO` or `en`.","in":"query","name":"locale","required":false,"schema":{"type":"string"}}],"summary":"Probe a document's narration","tags":["Narration"],"operationId":"getV1Narration"},"post":{"security":[{"bearerAuth":[]}],"description":"Synthesizes a public document's narration (or serves the cached one). Costs money on a cache miss: per-subject daily cap (`429`), text ceiling (`413`), unknown document (`404`), vendor failure (`502`).","summary":"Synthesize a document's narration","tags":["Narration"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1Narration"}},"/v1/me/prosessbot/history":{"get":{"security":[{"bearerAuth":[]}],"summary":"Manage my saved Piloten conversations","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeProsessbotHistory"}},"/v1/me/prosessbot/history/{conversationId}":{"get":{"security":[{"bearerAuth":[]}],"summary":"Manage my saved Piloten conversations","tags":["ProsessBot"],"parameters":[{"name":"conversationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getV1MeProsessbotHistoryByConversationId"},"put":{"security":[{"bearerAuth":[]}],"summary":"Manage my saved Piloten conversations","tags":["ProsessBot"],"parameters":[{"name":"conversationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"putV1MeProsessbotHistoryByConversationId"},"delete":{"security":[{"bearerAuth":[]}],"summary":"Manage my saved Piloten conversations","tags":["ProsessBot"],"parameters":[{"name":"conversationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"deleteV1MeProsessbotHistoryByConversationId"}},"/v1/prosessbot":{"post":{"security":[{"bearerAuth":[]}],"description":"NDJSON chat with short-lived public follow-up context. Tools enforce current MODEL record authorization; protected transcript text is not persisted.","summary":"Chat with ProsessBot","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1Prosessbot"}},"/v1/prosessbot/intake/review":{"post":{"security":[{"bearerAuth":[]}],"summary":"Review a conversational submission","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1ProsessbotIntakeReview"}},"/v1/prosessbot/intake/confirm":{"post":{"security":[{"bearerAuth":[]}],"summary":"Confirm a conversational submission","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1ProsessbotIntakeConfirm"}},"/v1/voice/transcribe":{"post":{"security":[{"bearerAuth":[]}],"summary":"Transcribe a consented voice recording","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1VoiceTranscribe"}},"/v1/voice/synthesize":{"post":{"security":[{"bearerAuth":[]}],"summary":"Synthesize speech for a signed-in user","tags":["ProsessBot"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"postV1VoiceSynthesize"}},"/v1/staff/engagement/sanity-backfill":{"post":{"security":[{"bearerAuth":[]}],"summary":"Reconcile one bounded page of published Sanity engagement content","tags":["Engagement"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1StaffEngagementSanity-backfill"}},"/v1/staff/notifications/dispatch":{"post":{"security":[{"bearerAuth":[]}],"description":"Servicedesk broadcast (Feature #4815): sends a push notification and/or Varslinger entry to every user, a company's contacts, or selected members. Requires the manage:notification-broadcast permission and ProsessPilotene employee membership; never available to machine tokens.","summary":"Send a notification from the Servicedesk","tags":["Notifications"],"parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","pattern":"^Bearer\\s+\\S.+$"}},{"name":"x-correlation-id","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"postV1StaffNotificationsDispatch"}},"/v1/search":{"get":{"summary":"Search published public content","tags":["Search"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"maximum":50,"minimum":1,"anyOf":[{"format":"numeric","default":0,"type":"string"},{"maximum":50,"minimum":1,"type":"number"}]}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["nb-NO","en"]}},{"name":"offset","in":"query","required":false,"schema":{"maximum":1000,"minimum":0,"anyOf":[{"format":"numeric","default":0,"type":"string"},{"maximum":1000,"minimum":0,"type":"number"}]}},{"name":"q","in":"query","required":true,"schema":{"maxLength":1000,"minLength":1,"type":"string"}},{"name":"types","in":"query","required":false,"schema":{"maxLength":500,"type":"string"}}],"operationId":"getV1Search"}},"/v1/search/suggest":{"get":{"summary":"Suggest published public content","tags":["Search"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"maximum":50,"minimum":1,"anyOf":[{"format":"numeric","default":0,"type":"string"},{"maximum":50,"minimum":1,"type":"number"}]}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["nb-NO","en"]}},{"name":"offset","in":"query","required":false,"schema":{"maximum":1000,"minimum":0,"anyOf":[{"format":"numeric","default":0,"type":"string"},{"maximum":1000,"minimum":0,"type":"number"}]}},{"name":"q","in":"query","required":true,"schema":{"maxLength":1000,"minLength":1,"type":"string"}},{"name":"types","in":"query","required":false,"schema":{"maxLength":500,"type":"string"}}],"operationId":"getV1SearchSuggest"}},"/v1/events/":{"get":{"description":"Returns published event summaries without authentication. Published events can include past events; this is not an upcoming-only feed. Registration rules are returned per event.","summary":"List published events","tags":["Public Events"],"operationId":"getV1Events"}},"/v1/events/{eventId}":{"get":{"summary":"Get a published event","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventId"}},"/v1/events/{eventId}/sessions":{"get":{"summary":"List event sessions","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventIdSessions"}},"/v1/events/{eventId}/passes":{"get":{"summary":"List event passes","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventIdPasses"}},"/v1/events/{eventId}/speakers":{"get":{"summary":"List event speakers","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventIdSpeakers"}},"/v1/events/{eventId}/sponsors":{"get":{"summary":"List event sponsors","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventIdSponsors"}},"/v1/events/{eventId}/registration-fields":{"get":{"summary":"List registration fields","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getV1EventsByEventIdRegistration-fields"}},"/v1/events/{eventId}/registrations":{"post":{"description":"Submits one attendee exactly once. The server does not blindly retry this non-idempotent operation.","summary":"Register for an event","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postV1EventsByEventIdRegistrations"}},"/v1/events/{eventId}/waitlist":{"post":{"description":"Uses the tenant-proven waitlist flag through a separate semantic MODEL operation.","summary":"Join an event waitlist","tags":["Public Events"],"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postV1EventsByEventIdWaitlist"}},"/v1/public/engagement/content/{contentKey}":{"get":{"summary":"Read public engagement for content","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"maxLength":512,"minLength":1,"type":"string"}}],"operationId":"getV1PublicEngagementContentByContentKey"}},"/v1/public/engagement/content/{contentKey}/contributions":{"get":{"summary":"List public contributions for content","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"maxLength":512,"minLength":1,"type":"string"}}],"operationId":"getV1PublicEngagementContentByContentKeyContributions"}},"/v1/public/engagement/contributions/{contributionId}":{"get":{"summary":"Read a public contribution","tags":["Engagement"],"parameters":[{"name":"contributionId","in":"path","required":true,"schema":{"maxLength":64,"minLength":1,"type":"string"}}],"operationId":"getV1PublicEngagementContributionsByContributionId"}},"/v1/public/forum/threads":{"get":{"summary":"List public forum threads","tags":["Forum"],"operationId":"getV1PublicForumThreads"}},"/v1/public/forum/threads/{slug}":{"get":{"summary":"Read a public forum thread","tags":["Forum"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"maxLength":128,"minLength":1,"type":"string"}}],"operationId":"getV1PublicForumThreadsBySlug"}},"/v1/public/narration/":{"get":{"description":"Anonymous probe of the narration cache: `200` with `audioUrl`/`vttUrl` when a narration exists, else `404 {cached:false, canSynthesize:false}`. Synthesis requires the scoped `/v1/narration`.","summary":"Probe a document's cached narration (public)","tags":["Narration"],"operationId":"getV1PublicNarration"}},"/v1/search/answer":{"post":{"description":"Published-source answers. Supplied bearer tokens require read:profile and protected processing; invalid tokens never downgrade to public.","summary":"Answer from published sources","tags":["Search"],"operationId":"postV1SearchAnswer"}},"/webhooks/docusign":{"post":{"summary":"Receive HMAC authenticated DocuSign Connect events","tags":["Contracts"],"operationId":"postWebhooksDocusign"}},"/employee/contracts/{contractId}/signing-review":{"get":{"summary":"Review frozen contract sources and Dataverse signatories","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdSigning-review"}},"/employee/contracts/{contractId}/sales/retry":{"post":{"summary":"Queue signed sales processing for reconciliation","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdSalesRetry"}},"/employee/contracts/{contractId}/documents/{documentId}/synchronize":{"post":{"summary":"Refresh editable Word fields from authoritative Dataverse records","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdDocumentsByDocumentIdSynchronize"}},"/employee/contracts/{contractId}/workflow":{"post":{"summary":"Perform a confirmed employee contract workflow action","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdWorkflow"}},"/employee/contracts/{contractId}/sales":{"get":{"summary":"Read the employee-authorized contract quote links","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdSales"}},"/employee/contracts/{contractId}/sales/quotes":{"post":{"summary":"Link an existing customer quote to a draft contract","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdSalesQuotes"}},"/employee/contracts/{contractId}/sales/selection":{"post":{"summary":"Choose the linked quote to convert after signature","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdSalesSelection"}},"/employee/contracts/{contractId}/documents/{documentId}/commitments":{"post":{"summary":"Add a reviewed commitment missed by extraction","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdDocumentsByDocumentIdCommitments"},"get":{"summary":"Read signed contract commitments as an employee","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdDocumentsByDocumentIdCommitments"}},"/employee/contracts/{contractId}/documents/{documentId}/commitments/{commitmentId}/review":{"post":{"summary":"Review an extracted contract commitment","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"commitmentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postEmployeeContractsByContractIdDocumentsByDocumentIdCommitmentsByCommitmentIdReview"}},"/employee/contracts/commands/review":{"post":{"summary":"Review an employee write without applying it","tags":["Contracts"],"operationId":"postEmployeeContractsCommandsReview"}},"/employee/contracts/commands/confirm":{"post":{"summary":"Confirm the reviewed employee write once","tags":["Contracts"],"operationId":"postEmployeeContractsCommandsConfirm"}},"/employee/contracts/commands":{"post":{"summary":"Read an employee-authorized contract or contact","tags":["Contracts"],"operationId":"postEmployeeContractsCommands"}},"/employee/contracts/{contractId}/documents":{"get":{"summary":"List employee contract documents","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdDocuments"}},"/employee/contracts/{contractId}/documents/{documentId}/content":{"get":{"summary":"Download an employee-authorized contract document","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdDocumentsByDocumentIdContent"}},"/employee/contracts/{contractId}/documents/{documentId}/word":{"get":{"summary":"Open employee contract in Word","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}},{"name":"documentId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdDocumentsByDocumentIdWord"}},"/employee/contracts/generate":{"post":{"summary":"Generate a contract Word bundle","tags":["Contracts"],"operationId":"postEmployeeContractsGenerate"}},"/employee/contracts/{contractId}/operation":{"get":{"summary":"Inspect contract operation recovery state","tags":["Contracts"],"parameters":[{"name":"contractId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"getEmployeeContractsByContractIdOperation"}},"/employee/contracts/recover-terminal-signing":{"post":{"summary":"Reopen a provider-confirmed declined or voided signing attempt","tags":["Contracts"],"operationId":"postEmployeeContractsRecover-terminal-signing"}},"/employee/contracts/abandon-release":{"post":{"summary":"Abandon an unfinished draft release","tags":["Contracts"],"operationId":"postEmployeeContractsAbandon-release"}},"/employee/contracts/release":{"post":{"summary":"Release contract documents to the customer","tags":["Contracts"],"operationId":"postEmployeeContractsRelease"}},"/employee/contracts/send":{"post":{"summary":"Send contract Word documents for signature","tags":["Contracts"],"operationId":"postEmployeeContractsSend"}},"/employee/contracts/reconcile":{"post":{"summary":"Reconcile a contract signing transaction","tags":["Contracts"],"operationId":"postEmployeeContractsReconcile"}},"/v1/public/prosessbot/":{"post":{"summary":"Chat with ProsessBot using public sources","tags":["ProsessBot"],"operationId":"postV1PublicProsessbot"}},"/v1/public/prosessbot/intake/review":{"post":{"summary":"Review a public conversational submission","tags":["ProsessBot"],"operationId":"postV1PublicProsessbotIntakeReview"}},"/v1/public/prosessbot/intake/confirm":{"post":{"summary":"Confirm a reviewed public submission","tags":["ProsessBot"],"operationId":"postV1PublicProsessbotIntakeConfirm"}},"/v1/public/voice/transcribe":{"post":{"summary":"Transcribe a consented public voice recording","tags":["ProsessBot"],"operationId":"postV1PublicVoiceTranscribe"}},"/v1/public/voice/synthesize":{"post":{"summary":"Synthesize speech for a public conversation","tags":["ProsessBot"],"operationId":"postV1PublicVoiceSynthesize"}},"/v1/public/engagement/anonymous-session":{"post":{"summary":"Issue an anonymous engagement visitor token","tags":["Engagement"],"operationId":"postV1PublicEngagementAnonymous-session"}},"/v1/public/engagement/content/{contentKey}/useful":{"get":{"summary":"Get anonymous useful state","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"maxLength":512,"minLength":1,"type":"string"}}],"operationId":"getV1PublicEngagementContentByContentKeyUseful"},"put":{"summary":"Mark content useful anonymously","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"maxLength":512,"minLength":1,"type":"string"}}],"operationId":"putV1PublicEngagementContentByContentKeyUseful"},"delete":{"summary":"Remove anonymous useful mark","tags":["Engagement"],"parameters":[{"name":"contentKey","in":"path","required":true,"schema":{"maxLength":512,"minLength":1,"type":"string"}}],"operationId":"deleteV1PublicEngagementContentByContentKeyUseful"}},"/internal/sanity/engagement-sync":{"post":{"description":"Receives Sanity publication changes. Requires a valid Sanity webhook signature; a Bearer token does not authorize this operation.","summary":"Synchronize Sanity engagement content","tags":["Integrations"],"operationId":"postInternalSanityEngagement-sync"}},"/v1/notifications/register-device":{"post":{"description":"Registers an Expo push token for this device. Works signed-out (no Authorization header); a valid bearer token additionally records the caller's user_key — their CRM contact id when linked, else their Auth0 subject.","summary":"Register a device for push notifications","tags":["Notifications"],"requestBody":{"content":{},"required":true},"operationId":"postV1NotificationsRegister-device"}},"/v1/notifications/unregister-device":{"post":{"description":"Unregisters a device from push notifications. Anonymous (unlinked) devices are removed by possession of the token alone; a device linked to a `user_key` requires a bearer token resolving to that same key.","summary":"Unregister a device from push notifications","tags":["Notifications"],"requestBody":{"content":{},"required":true},"operationId":"postV1NotificationsUnregister-device"}},"/v1/notifications/dispatch":{"post":{"description":"Webhook for Dynamics 365 (Customer Insights journeys and Power Automate/Dataverse workflows): writes inbox rows and/or fans out the same push payload through Expo and Web Push. Authenticated with `X-Notification-Secret` against `NOTIFICATION_WEBHOOK_SECRET`.","summary":"Dispatch a notification (push and/or inbox)","tags":["Notifications"],"requestBody":{"content":{},"required":true},"operationId":"postV1NotificationsDispatch"}},"/v1/notifications/by-record/{guid}":{"patch":{"description":"The Dynamics-workflow hook: matches `guid` against both thread- and entry-level `related_record_id`. A thread match can set `taskStatus` and/or mark all its entries read; an entry match marks that entry read. Authenticated with `X-Notification-Secret`.","summary":"Update inbox state by Dataverse record GUID","tags":["Notifications"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{},"required":true},"operationId":"patchV1NotificationsBy-recordByGuid"}},"/v1/podcast-follows":{"get":{"summary":"List podcast follows","tags":["Podcast follows"],"parameters":[{"name":"deviceId","in":"query","required":false,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"operationId":"getV1Podcast-follows"},"put":{"summary":"Replace podcast follows","tags":["Podcast follows"],"requestBody":{"content":{},"required":true},"operationId":"putV1Podcast-follows"}},"/v1/notifications/internal/podcast/new-episode":{"post":{"description":"Idempotent Sanity Studio publish webhook for followers of a podcast episode. Since Task #4095 it commits the episode intent and one leased delivery job per batch of followers in a single transaction and answers `202` — no push is sent inside the request. A retried delivery re-derives the same event keys and enqueues nothing (`enqueued: 0`).","summary":"Queue a new-episode notification for podcast followers","tags":["Podcast follows"],"requestBody":{"content":{},"required":true},"operationId":"postV1NotificationsInternalPodcastNew-episode"}},"/v1/newsletter/subscriptions":{"post":{"summary":"Subscribe to ProsessPilotene newsletter","tags":["Newsletter"],"requestBody":{"content":{},"required":true},"operationId":"postV1NewsletterSubscriptions"}},"/v1/contact/":{"post":{"description":"Submits the generated ProsessPilotene Kontakt oss contract to Customer Insights Journeys without exposing its transport to clients.","summary":"Submit the Kontakt oss contact form","tags":["Contact"],"requestBody":{"content":{},"required":true},"operationId":"postV1Contact"}}}}