SDK (JavaScript / TypeScript)
Complete method reference for @hatched/sdk-js — HatchedClient, resources, error classes.
Package: @hatched/sdk-js
pnpm add @hatched/sdk-jsHatchedClient
Official Hatched SDK client for JavaScript/TypeScript.
Server-side (secret key):
const hatched = new HatchedClient({
apiKey: process.env.HATCHED_API_KEY!,
});
const egg = await hatched.eggs.create({ userId: 'user_designer_priya' });
await hatched.eggs.updateStatus(egg.eggId, 'ready');
const op = await hatched.eggs.hatch(egg.eggId);Browser (publishable key, scoped):
const hatched = new HatchedClient({
publishableKey: 'hatch_pk_xxxxxxxx',
});
const buddy = await hatched.buddies.get('bdy_abc');HatchedClient.health()
health()Health check; returns API status metadata.
HatchedClient.getRateLimitInfo()
getRateLimitInfo()Latest X-RateLimit-* snapshot from the most recent response.
HatchedClient.getLastRequestId()
getLastRequestId(): string | nullRequest id of the most recent response (for support correlation).
HatchedClient.getLastRetryMetadata()
getLastRetryMetadata()Retry metadata from the most recent request. attempts === 1 means
the call succeeded on the first try; higher means at least one retry
happened. Useful for tracing and observability:
await hatched.events.send({ eventId, userId: 'user_42', type: 'lesson_completed' });
const retry = hatched.getLastRetryMetadata();
if (retry && retry.attempts > 1) {
logger.info({ attempts: retry.attempts, reasons: retry.reasons });
}EggsResource
EggsResource.create()
create(params: CreateEggParams, signal?: AbortSignal): Promise<Egg>Creates a new pending egg bound to an external user.
New eggs start in waiting; call updateStatus(eggId, 'ready')
before hatch(). Pass ensure: true during a first-run bootstrap to
reuse the user's existing waiting/ready egg instead of creating one.
@example
// Greenwave Learning Co. — a new instructional designer joins the workspace.
const egg = await hatched.eggs.create({ userId: 'user_designer_priya' });
await hatched.eggs.updateStatus(egg.eggId, 'ready');
// Multi-audience workspace: bind the buddy to the right audience up front
// so audience-scoped widgets (streak/badges/marketplace) resolve.
await hatched.eggs.create({ userId: 'user_rep_amir', audience: 'sales_rep', ensure: true });EggsResource.get()
get(eggId: string, signal?: AbortSignal): Promise<Egg>Fetches the canonical state of a single egg.
EggsResource.list()
list(params: ListEggsParams = {}): Promise<Egg[]>Lists eggs with optional filters.
EggsResource.updateStatus()
updateStatus(eggId: string, status: 'ready' | 'cancelled', signal?: AbortSignal): Promise<EggStatusChange>Transitions an egg to ready or cancelled. The API only permits
ready and cancelled terminal statuses via this endpoint.
EggsResource.hatch()
hatch(eggId: string, signal?: AbortSignal): Promise<HatchResult>Kicks off an async hatch operation. Poll the returned operationId via
operations.wait() to resolve when the buddy art is ready. The egg
must already be in ready status.
BuddiesResource
BuddiesResource.get()
get(buddyId: string, signal?: AbortSignal): Promise<Buddy>Fetches a buddy by id.
BuddiesResource.list()
list(params: BuddyListParams = {}): Promise<BuddyList>Lists buddies with optional filters.
@example
// Greenwave Learning Co. — list the first page of active buddies.
const { data: buddies } = await hatched.buddies.list({
status: 'active',
limit: 25,
});BuddiesResource.updateName()
updateName(buddyId: string, name: string, signal?: AbortSignal): Promise<Buddy>BuddiesResource.archive()
archive(buddyId: string, signal?: AbortSignal): Promise<Buddy>BuddiesResource.updateSkills()
updateSkills(buddyId: string, updates: SkillUpdate[], signal?: AbortSignal)BuddiesResource.earn()
earn(buddyId: string, params: EarnCoinsParams, idempotencyKey?: string, signal?: AbortSignal)Adds coins to a buddy's ledger for a given reason.
Alias: BuddiesResource.earnCoins.
BuddiesResource.spend()
spend(buddyId: string, params: SpendCoinsParams, idempotencyKey?: string, signal?: AbortSignal)Debits coins from a buddy's ledger. Fails with
InsufficientBalanceError if the buddy doesn't have enough.
BuddiesResource.awardBadge()
awardBadge(buddyId: string, badgeKey: string, reason?: string, signal?: AbortSignal)BuddiesResource.getBadges()
getBadges(buddyId: string, signal?: AbortSignal): Promise<{ badges: Badge[] }>BuddiesResource.equip()
equip(buddyId: string, params: EquipItemsParams, signal?: AbortSignal): Promise<EquipItemsResult>Equips or unequips items on a buddy.
BuddiesResource.rerenderAppearance()
rerenderAppearance(buddyId: string, signal?: AbortSignal): Promise<RerenderAppearanceResult>Regenerate the buddy's bare stage base image. Use after a hard generation
failure or when appearance.status === 'failed' with code: 'needs_rerender'.
Equipped items are removed from the rendered set; re-equip after the
appearance returns to ready.
BuddiesResource.purchaseItem()
purchaseItem(buddyId: string, itemId: string, idempotencyKey?: string, signal?: AbortSignal)BuddiesResource.getPurchasedItems()
getPurchasedItems(buddyId: string, signal?: AbortSignal)BuddiesResource.getEvolution()
getEvolution(buddyId: string, signal?: AbortSignal)BuddiesResource.evolve()
evolve(buddyId: string, signal?: AbortSignal)Starts the async operation that advances a ready buddy to its next
evolution stage. Use after events.send() returns
effects.evolutionReady === true when auto-evolve is disabled.
BuddiesResource.getProgression()
getProgression(buddyId: string, signal?: AbortSignal)BuddiesResource.tokens()
tokens(buddyId: string, signal?: AbortSignal): Promise<TokensSummary>Typed token balances for a buddy, grouped into primary (spendable) and progression (accumulate-only). Returns null for either slot if the customer has not configured that kind.
BuddiesResource.evolutions()
evolutions(buddyId: string, params: { page?: number; limit?: number; signal?: AbortSignal } = {}): Promise<{
data: BuddyEvolutionRecord[];
pagination: { page: number; limit: number; total: number };
}>Paginated stage-transition timeline for a buddy (includes both prod and demo evolutions).
BuddiesResource.getUserSummary()
getUserSummary(userId: string, signal?: AbortSignal)BuddiesResource.prestigeStatus()
prestigeStatus(signal?: AbortSignal): Promise<PrestigeStatus>F4.3 Prestige Loop — whether the widget buddy can prestige right now.
A widget-token endpoint: available: false means the tenant has not
enabled the prestige loop; canPrestige: false carries the blocking
reason. Read this to decide whether to surface a Prestige CTA.
BuddiesResource.prestige()
prestige(signal?: AbortSignal): Promise<PrestigeResult>F4.3 Prestige Loop — prestige the widget buddy: reset it to evolution
stage 0 in exchange for an incremented prestige level and a permanent
prestige aura (Yu-kai Ch.9 #66 Crowning). A widget-token endpoint.
Throws when the buddy fails any precondition (prestige_not_available).
EventsResource
EventsResource.send()
send(params: SendEventParams, signal?: AbortSignal): Promise<EventEffects>Ingests a domain event. The same eventId returning twice yields the
cached effect without re-applying rules.
@example
// Greenwave Learning Co. — Priya completed the week's module review.
const effects = await hatched.events.send({
eventId: 'lesson_module_review_user_designer_priya_2026_05_03',
userId: 'user_designer_priya',
type: 'lesson_completed',
properties: { score: 94, module: 'module_review_week_4' },
});EventsResource.sendBatch()
sendBatch(events: SendEventParams[], signal?: AbortSignal): Promise<{ results: EventEffects[] }>Sends a batch of events in a single call.
OperationsResource
OperationsResource.get()
get(operationId: string, signal?: AbortSignal): Promise<Operation<TResult>>Fetches an operation's current status.
OperationsResource.wait()
wait(operationId: string, options: WaitOptions = {}): Promise<Operation<TResult>>Polls an operation until it reaches a terminal status (completed,
failed, or cancelled).
@throws Error if the operation doesn't finish before timeoutMs elapses.
@example
await hatched.eggs.updateStatus(egg.eggId, 'ready');
const op = await hatched.eggs.hatch(egg.eggId);
const finished = await hatched.operations.wait(op.operationId);OperationsResource.waitForCompletion()
waitForCompletion(operationId: string, options: { timeout?: number; interval?: number; signal?: AbortSignal } = {}): Promise<Operation<TResult>>@deprecated Use OperationsResource.wait instead.
WidgetSessionsResource
WidgetSessionsResource.create()
create(params: CreateSessionParams, signal?: AbortSignal): Promise<SessionToken>Mints a short-lived widget session token for browser/interactive widgets. Never ship a secret API key to the browser — always go through this endpoint.
WidgetSessionsResource.revoke()
revoke(sessionId: string, signal?: AbortSignal): Promise<void>EmbedTokensResource
EmbedTokensResource.create()
create(params: CreateEmbedTokenParams, signal?: AbortSignal): Promise<EmbedToken>Mints a signed token for a read-only embedded widget.
WebhooksResource
WebhooksResource.list()
list(signal?: AbortSignal): Promise<WebhookEndpoint[]>Lists webhook endpoints registered for the current customer.
WebhooksResource.create()
create(params: CreateWebhookParams, signal?: AbortSignal): Promise<WebhookEndpoint>Registers a new webhook endpoint.
WebhooksResource.delete()
delete(endpointId: string, signal?: AbortSignal): Promise<void>Deletes a webhook endpoint.
WebhooksResource.deliveries()
deliveries(params: ListDeliveriesParams): Promise<Page<WebhookDelivery>>Lists recent deliveries for a given endpoint.
WebhooksResource.replay()
replay(endpointId: string, deliveryId: string, signal?: AbortSignal): Promise<unknown>Replays a specific delivery attempt.
WebhooksResource.rotateSecret()
rotateSecret(endpointId: string, signal?: AbortSignal): Promise<{ secret: string }>Rotates the signing secret on a webhook endpoint. Returns the new plaintext secret — store it before the response goes out of scope.
Recommended rollout: deploy your handler with verifySignature set
to accept BOTH the old and new secret simultaneously, then call
rotateSecret(). After every host has the new secret in its
environment, remove the old one from the verifier list. See the
rotation playbook.
WebhooksResource.redeliver()
redeliver(endpointId: string, deliveryId: string, signal?: AbortSignal): Promise<unknown>Re-enqueues a stored webhook delivery.
WebhooksResource.verifySignature()
static verifySignature(rawBody: string | Buffer, signatureHeader: string, secret: string | readonly string[], options: VerifySignatureOptions = {}): booleanVerifies the X-Hatched-Signature header for a webhook payload.
Hatched signs ${timestamp}.${rawBody} with HMAC-SHA256 and sends:
X-Hatched-Signature: sha256=<hex>X-Hatched-Timestamp: <unix_seconds>← pass viaoptions.timestamp
Pass the raw request body bytes (not the parsed JSON) — any
reformatting will invalidate the signature. Prefer the framework adapters
in @hatched/sdk-js/webhooks, which extract both headers and the raw body
for you.
secret accepts either a single string or an array — pass an array
during a secret-rotation window so the verifier accepts payloads
signed by either the previous or the new secret.
@example
const valid = WebhooksResource.verifySignature(
rawBody,
req.headers['x-hatched-signature'],
process.env.HATCHED_WEBHOOK_SECRET!,
{ timestamp: req.headers['x-hatched-timestamp'] },
);
if (!valid) return new Response('invalid signature', { status: 400 });HatchedError
Base class for every error raised by the Hatched SDK. Every subclass carries the HTTP status, stable error code, optional details payload, and the request id the API echoed back for support correlation.
No public methods.
AuthError
Shared base for 401/403 responses.
No public methods.
UnauthorizedError
No public methods.
ForbiddenError
No public methods.
PublishableKeyScopeError
Raised when a request uses a publishable key for an operation the publishable key is not scoped for (e.g. mutation endpoints).
No public methods.
WidgetTokenScopeError
Raised when a widget-token client tries to call a non-widget-token mutation. Widget tokens are scoped to one buddy/session.
No public methods.
NotFoundError
No public methods.
ValidationError
No public methods.
RateLimitError
No public methods.
InsufficientBalanceError
No public methods.
TooManyItemsError
Raised when an equip request asks the buddy to wear more items than the
image compositing pipeline can reliably render. The current cap is four —
the SDK surfaces max and attempted on details so callers can show a
precise error to the end-user.
No public methods.
CategoryConflictError
Raised when an equip request tries to put two items in the same category
slot (e.g. two head items). Only the accessory category allows stacking.
No public methods.
ConflictError
No public methods.
ConfigVersionMismatchError
Raised when a buddy is pinned to a config version that does not match the one the caller expected (e.g. after a migration race).
No public methods.
NoPublishedConfigError
Raised by POST /eggs (and the bootstrap flow) when the customer has not
published a config version yet. details.publish_url points at the
dashboard publish page.
No public methods.
ActiveEggLimitError
Raised when POST /eggs would exceed the per-user active-egg cap.
details.active lists the existing eggs (id + status) so you can hatch or
cancel one — or retry the create with ?ensure=true to reuse one.
No public methods.
UpstreamImageError
No public methods.
CreditInsufficientError
Raised when an AI / generative request cannot be authorised because the
customer has no available credits across any pool. The details object
includes the amount required and what remains in each pool, plus a URL
the caller can redirect to so the end-customer can top up.
No public methods.
EventQuotaExceededError
Raised when a POST /events call would push the customer over the monthly
event quota allowed by their plan. reset_at is an ISO timestamp for the
first of the next UTC month; callers should back off until then or upgrade.
No public methods.
PlanFeatureLockedError
Raised when the customer's plan does not include the requested feature (e.g. a Free tier customer trying to use the marketplace API). The SDK surfaces which plan is required so callers can prompt an upgrade.
No public methods.
PlayersResource
Player Zero — the reserved per-workspace demo player (user_id "player-0").
Every dashboard widget preview binds to this buddy, and it is the
recommended first test user during integration: send events as
player-0 and watch them land without polluting real user data.
PlayersResource.zero()
zero(signal?: AbortSignal): Promise<PlayerZeroResult>Create-or-get the workspace demo player. Idempotent: a second call
returns the existing buddy with created: false. Instant — returns a
safe placeholder image first, then Hatched queues a background base render
so Player Zero settles into the workspace's visual style.
@example
const { buddy } = await hatched.players.zero();
await hatched.events.ingest({
userId: buddy.userId, // "player-0"
type: 'lesson.completed',
eventId: 'evt_demo_1',
});PlayersResource.zeroStatus()
zeroStatus(signal?: AbortSignal): Promise<PlayerZeroStatus>Read Player Zero's status without provisioning it. Never creates the player — safe for polling (e.g. an activation checklist).
GatesResource
Generic spend-to-unlock primitive. Customers define gates in their
dashboard (gate_key, token_key, cost, metadata). A buddy calls unlock
to spend the configured token cost and flip the gate open — idempotent:
repeat calls return alreadyUnlocked: true without touching the economy.
GatesResource.list()
list(signal?: AbortSignal): Promise<{ gates: TokenGate[] }>Lists gates configured on this customer. Secret-key only.
GatesResource.unlock()
unlock(buddyId: string, gateKey: string, signal?: AbortSignal): Promise<UnlockResult>Buddy spends gate.cost of gate.tokenKey to unlock gateKey.
Fails with InsufficientBalanceError if the buddy lacks tokens and
with ValidationError('progression_not_spendable') if the gate
references a progression token.
GatesResource.unlocks()
unlocks(buddyId: string, signal?: AbortSignal): Promise<{ unlocks: BuddyUnlock[] }>List gates a buddy has unlocked.
PathsResource
Guided journey primitive — a path is an ordered list of steps; each
step holds an ordered list of sub-steps with an optional completion
condition. Sub-step completions advance the buddy through the path
automatically (rule-engine) or manually via completeSubStep.
The HttpClient auto-converts wire snake_case → camelCase on every
response, so resource methods read camelCase fields directly without
an intermediate DTO mapping layer.
PathsResource.list()
list(audience?: string, signal?: AbortSignal): Promise<PathDefinition[]>PathsResource.get()
get(definitionId: string, signal?: AbortSignal): Promise<PathDefinitionWithSteps>PathsResource.create()
create(params: CreatePathDefinitionParams, signal?: AbortSignal): Promise<PathDefinition>PathsResource.update()
update(definitionId: string, params: UpdatePathDefinitionParams, signal?: AbortSignal): Promise<PathDefinition>PathsResource.delete()
delete(definitionId: string, signal?: AbortSignal): Promise<void>PathsResource.setActive()
setActive(definitionId: string, isActive: boolean, signal?: AbortSignal): Promise<PathDefinition>Atomic single-active activation: deactivates every other path on the same (customer, audience) in a single transaction.
PathsResource.addStep()
addStep(definitionId: string, params: CreatePathStepParams, signal?: AbortSignal): Promise<PathStep>PathsResource.updateStep()
updateStep(definitionId: string, stepId: string, params: UpdatePathStepParams, signal?: AbortSignal): Promise<PathStep>PathsResource.deleteStep()
deleteStep(definitionId: string, stepId: string, signal?: AbortSignal): Promise<void>PathsResource.reorderSteps()
reorderSteps(definitionId: string, ordering: Array<{ id: string; ordinal: number }>, signal?: AbortSignal): Promise<PathStep[]>PathsResource.addSubStep()
addSubStep(definitionId: string, stepId: string, params: CreatePathSubStepParams, signal?: AbortSignal): Promise<PathSubStep>PathsResource.updateSubStep()
updateSubStep(definitionId: string, stepId: string, subStepId: string, params: UpdatePathSubStepParams, signal?: AbortSignal): Promise<PathSubStep>PathsResource.deleteSubStep()
deleteSubStep(definitionId: string, stepId: string, subStepId: string, signal?: AbortSignal): Promise<void>PathsResource.reorderSubSteps()
reorderSubSteps(definitionId: string, stepId: string, ordering: Array<{ id: string; ordinal: number }>, signal?: AbortSignal): Promise<PathSubStep[]>PathsResource.getForBuddy()
getForBuddy(buddyId: string, pathKey: string, signal?: AbortSignal): Promise<PathRuntimePayload>PathsResource.completeSubStep()
completeSubStep(buddyId: string, pathKey: string, subStepKey: string, signal?: AbortSignal): Promise<ManualCompleteResult>Manually mark a sub-step complete. Idempotent on (buddy, sub-step). Returns cascade flags so callers can paint celebrations without an extra round-trip.
MarketplaceResource
MarketplaceResource.list()
list(params: MarketplaceListParams = {}): Promise<MarketplaceListResponse>Lists widget marketplace items visible to the current buddy/session.
MarketplaceResource.gift()
gift(params: GiftItemParams): Promise<GiftItemResult>F2.4 Social Treasure — gift a marketplace item to a teammate. The current
buddy pays; the item lands in the recipient's inventory with gift
metadata. Works for gift-only and ordinary items alike. Throws a 402-class
error when the sender is short on coins; returns duplicate: true when the
same gift is re-sent inside the 60s accident-click window.
MarketplaceResource.previewOutfit()
previewOutfit(slotItemMap: SlotItemMap, signal?: AbortSignal): Promise<OutfitPreviewResponse>Previews a slot-to-item outfit without mutating the buddy. Returns a ready cached variant or a pending variant id for polling.
MarketplaceResource.compositionStatus()
compositionStatus(variantId: string, signal?: AbortSignal): Promise<CompositionStatusResponse>Polls an outfit composition variant until it is ready or failed.
MarketplaceResource.listOutfits()
listOutfits(signal?: AbortSignal): Promise<OutfitListResponse>Lists saved outfits for the current buddy/session.
MarketplaceResource.saveOutfit()
saveOutfit(params: SaveOutfitParams, idempotencyKey?: string, signal?: AbortSignal): Promise<OutfitSummary>Saves a named outfit for the current buddy/session.
MarketplaceResource.activateOutfit()
activateOutfit(outfitId: string, signal?: AbortSignal): Promise<ActivateOutfitResponse>Activates a saved outfit and delegates to the equip pipeline.
MarketplaceResource.deleteOutfit()
deleteOutfit(outfitId: string, signal?: AbortSignal): Promise<DeleteOutfitResponse>Deletes a saved outfit for the current buddy/session.
BadgesResource
BadgesResource.list()
list(params: BadgeListParams = {}): Promise<BadgeListResponse>Lists the current widget buddy's earned and locked badge catalog.
LeaderboardResource
LeaderboardResource.get()
get(params: LeaderboardParams = {}): Promise<LeaderboardResponse>Returns the current widget buddy's leaderboard in top, around-me, or
hybrid mode. Pass scope: 'team' to restrict to the buddy's active team
roster.
NextBestActionResource
NextBestActionResource.get()
get(signal?: AbortSignal): Promise<NextBestActionResponse>HTCH-26 — Returns the single highest-priority next-best-action for the widget session's buddy. Cached server-side for 30s per buddy.
TeamsResource
F2.1 Teams — widget-token resource. Lets an embedded buddy see its team and leave it. Admin team CRUD lives in the dashboard, not the SDK.
TeamsResource.me()
me(signal?: AbortSignal): Promise<MyTeamResponse>The current widget buddy's team, role and members (PII-filtered).
TeamsResource.leave()
leave(teamId: string, signal?: AbortSignal): Promise<{ left: boolean }>Leave a team. A sole lead is rejected with a single_lead_cannot_leave
conflict until another lead is promoted.
KudosResource
F2.3 Kudos — widget-token resource. Lets an embedded buddy send peer
recognition and read its recent received / given kudos. A send 429s when
the workspace daily cap is reached; the thrown error carries
retry_after_seconds.
KudosResource.send()
send(params: SendKudosParams): Promise<SentKudos>Send a kudos to a teammate.
@example
// Greenwave Learning Co. — a senior designer recognises a junior's question.
await hatched.kudos.send({
toBuddyId: 'buddy_priya_buddy',
kudoTypeKey: 'patient_teacher',
message: 'Your follow-up on the module review walkthrough was exactly the prompt I needed.',
});KudosResource.types()
types(signal?: AbortSignal): Promise<KudoTypeView[]>The effective kudo taxonomy for the composer's type picker.
KudosResource.received()
received(limit = 10, signal?: AbortSignal): Promise<KudosFeedEntry[]>The buddy's most recent received kudos (Trophy Shelf).
KudosResource.given()
given(limit = 10, signal?: AbortSignal): Promise<GivenKudosResponse>The buddy's most recent sent kudos plus the lifetime assist count.
GroupQuestsResource
F2.5 Group Quest — widget-token resource. Lets an embedded buddy list the active quests visible to it, opt in (join) and reconsider (leave).
Gated by the group_quest plan feature — calls 403 with plan_feature_locked
on a workspace whose plan does not entitle Group Quest.
GroupQuestsResource.list()
list(signal?: AbortSignal): Promise<ActiveGroupQuest[]>The active quests visible to the current buddy.
GroupQuestsResource.join()
join(questId: string, signal?: AbortSignal): Promise<JoinGroupQuestResult>Join a quest. Idempotent — a second join returns already_joined: true
with no further write.
GroupQuestsResource.leave()
leave(questId: string, signal?: AbortSignal): Promise<LeaveGroupQuestResult>Leave a quest. The buddy's prior contribution stays counted toward the team's progress — only the roster membership is removed.
AdminGroupQuestsResource
F2.5 Group Quest — tenant admin resource (secret key / dashboard JWT).
Backs the Planner "Group Quest" drawer: CRUD, the publish transition, and
the manual forceResolve watchdog override.
AdminGroupQuestsResource.list()
list(params: { status?: GroupQuestStatus; teamId?: string } = {}, signal?: AbortSignal): Promise<AdminGroupQuest[]>List the tenant's quests, optionally filtered by status / team.
AdminGroupQuestsResource.create()
create(params: CreateGroupQuestParams, signal?: AbortSignal): Promise<AdminGroupQuest>Create a quest (always starts as a draft).
AdminGroupQuestsResource.update()
update(questId: string, params: UpdateGroupQuestParams, signal?: AbortSignal): Promise<AdminGroupQuest>Patch a quest — draft fields, active deadline-extension, or cancel.
AdminGroupQuestsResource.publish()
publish(questId: string, signal?: AbortSignal): Promise<AdminGroupQuest>Publish a draft quest (draft → active).
AdminGroupQuestsResource.delete()
delete(questId: string, signal?: AbortSignal): Promise<void>Delete a quest — only draft or cancelled quests may be removed.
AdminGroupQuestsResource.forceResolve()
forceResolve(questId: string, signal?: AbortSignal): Promise<ForceResolveResult>HTCH-56 — manually resolve an active quest now, overriding the cron watchdog. Distributes rewards on a hit, closes blame-free on a miss.
MentorResource
F2.6 Mentorship (visibility-only) — widget-token resource. The buddy toggles its own mentor availability, reads a team's available mentors, and self-reports mentoring hours. Hatched counts status and renders a contact deep link; it never matches, pairs, or messages.
MentorResource.setAvailability()
setAvailability(params: { available: boolean; signal?: AbortSignal }): Promise<{ available: boolean }>Toggle the current buddy's mentor availability flag.
MentorResource.teamMentors()
teamMentors(teamId: string, signal?: AbortSignal): Promise<MentorDirectoryEntry[]>List a team's available mentors with contact deep links.
MentorResource.logSession()
logSession(params: LogSessionParams): Promise<LogSessionResult>Self-report a mentoring session (honor system).
MentorResource.sessionsForMe()
sessionsForMe(signal?: AbortSignal): Promise<MentorSessionsResponse>The buddy's recent mentor sessions plus all-time / season hour totals.
BragResource
HTCH-60 — F2.7 Brag Button — widget-token resource.
Records the share funnel (consent modal opened → channel clicked → post sent → dismissed) and dispatches a Slack/Teams webhook post. Every call here corresponds to an explicit user action in the consent modal — there is no auto-share path (Codex ethics rule).
BragResource.recordTelemetry()
recordTelemetry(params: RecordBragTelemetryParams): Promise<BragTelemetryResult>Record one brag funnel event for the HTCH-61 Planner telemetry tab. Best-effort — the server never fails the share flow on a telemetry write.
BragResource.sendSlackPost()
sendSlackPost(params: SendBragSlackPostParams): Promise<BragSlackPostResult>Send a Win-State brag to the tenant's configured Slack/Teams incoming
webhook. Only call this after the user pressed "Send" in the consent
modal. Throws webhook_failed when delivery times out or is rejected.
TeamEventsResource
HTCH-63 — F2.11 SeeSaw Bump feed — teamEvents sub-resource.
Lists the buddy's team feed and toggles the idempotent 👏 clap. Clapping
is one-per-buddy; a repeat call unclaps. Self-clap is rejected with a 400
self_clap_forbidden.
TeamEventsResource.list()
list(params: ListTeamEventsParams = {}): Promise<TeamEventsPage>The buddy's team feed — cursor-paginated, newest first.
TeamEventsResource.clap()
clap(eventId: string, signal?: AbortSignal): Promise<ClapResult>Toggle a 👏 clap on a feed item. Idempotent — a repeat call unclaps.
FeedResource
HTCH-63 — F2.11 SeeSaw Bump feed — top-level feed resource.
Namespaces the teamEvents sub-resource so the public surface reads
client.feed.teamEvents.list(...) / client.feed.teamEvents.clap(id).
No public methods.
SocialNormsResource
HTCH-62 — F2.9 Social Norm — widget-token resource.
Reads the buddy's positive-framing team norms for today. Yu-kai Ch.9, the
Petrified Forest study: negative descriptive norms are structurally
forbidden, and norms below the believability floor are silently skipped
server-side. A buddy with no active team gets an empty norms array.
SocialNormsResource.today()
today(signal?: AbortSignal): Promise<SocialNormsTodayResponse>The current widget buddy's positive-framing team norms for today.
CausesResource
F2.12 Symbolic Cause Counter — tenant admin resource (secret key / dashboard JWT). Backs the Planner "Humanity Hero — Cause Counter" drawer: CRUD plus the 30-day believability simulation.
CausesResource.list()
list(signal?: AbortSignal): Promise<AdminCause[]>List the tenant's cause definitions.
CausesResource.create()
create(params: CreateCauseParams, signal?: AbortSignal): Promise<AdminCause>Create a cause definition (disabled by default).
CausesResource.update()
update(causeId: string, params: UpdateCauseParams, signal?: AbortSignal): Promise<AdminCause>Patch a cause definition.
CausesResource.delete()
delete(causeId: string, signal?: AbortSignal): Promise<void>Delete a cause definition.
CausesResource.preview30Days()
preview30Days(causeId: string, signal?: AbortSignal): Promise<CausePreview>Project how many symbolic units the current config would have produced from the last 30 days of eligible events — the believability simulation shown in the Planner drawer.
FoundingCohortResource
F2.13 Founding Cohort — tenant admin resource (secret key / dashboard JWT). Backs the Planner "Founding Cohort" drawer: the eligibility preview, the one-shot retroactive backfill, and the assignment history. The cohort config itself is read and written through the feature-config surface.
FoundingCohortResource.preview()
preview(signal?: AbortSignal): Promise<FoundingCohortPreview>Project how many buddies the current config would mark.
FoundingCohortResource.backfill()
backfill(signal?: AbortSignal): Promise<FoundingCohortBackfillResult>Retroactively mark every currently-eligible buddy (idempotent).
FoundingCohortResource.listAudit()
listAudit(page = 1, signal?: AbortSignal): Promise<{
entries: FoundingCohortAuditEntry[];
page: number;
has_more: boolean;
}>Paginated Founding Cohort assignment history.
FlashSalesResource
F3.9 Marketplace FOMO — tenant admin resource (secret key / dashboard JWT). Backs the Planner "Marketplace FOMO" drawer: list, schedule and cancel flash sales. The API runs a once-a-minute cron that starts scheduled sales and ends running ones; at most one sale runs per tenant at a time.
FlashSalesResource.list()
list(signal?: AbortSignal): Promise<FlashSale[]>List the tenant's flash sales — scheduled, running and recently ended.
FlashSalesResource.schedule()
schedule(params: ScheduleFlashSaleParams): Promise<FlashSale>Schedule a flash sale. Rejects a past start time or an overlapping window.
FlashSalesResource.cancel()
cancel(saleId: string, signal?: AbortSignal): Promise<FlashSale>Cancel a scheduled or running sale. A running sale's temporary discounts
are cleared and flash_sale.ended fires, exactly as a natural end would.
LotteryResource
F3.11 Lottery (Rolling Reward) — tenant admin resource (secret key / dashboard JWT). Backs the Planner "Lottery" drawer: list and CRUD, the past-draw history, the live "Next draw" preview and a non-persisted draw simulation. The API runs a once-a-minute cron that resolves due draws.
LotteryResource.list()
list(signal?: AbortSignal): Promise<LotteryDefinition[]>List the tenant's lottery definitions (active and paused).
LotteryResource.create()
create(params: CreateLotteryParams): Promise<LotteryDefinition>Create a lottery definition.
LotteryResource.update()
update(lotteryId: string, params: UpdateLotteryParams): Promise<LotteryDefinition>Update a lottery definition.
LotteryResource.delete()
delete(lotteryId: string, signal?: AbortSignal): Promise<void>Soft-delete a lottery — past draws stay queryable.
LotteryResource.draws()
draws(lotteryId: string, signal?: AbortSignal): Promise<LotteryDraw[]>Past draw history for a lottery, newest first.
LotteryResource.previewNextDraw()
previewNextDraw(lotteryId: string, signal?: AbortSignal): Promise<LotteryNextDrawPreview>Current-period entry count and the next scheduled draw time.
LotteryResource.simulateDraw()
simulateDraw(lotteryId: string, signal?: AbortSignal): Promise<SimulatedLotteryDraw>Simulate a draw with the current entries — grants nothing.
EventBadgesResource
F3.13 Event-Triggered Badge (Yu-kai Ch.11 #30 Easter Egg) — tenant admin resource (secret key / dashboard JWT). Backs the Planner "Surprise badge campaign" drawer: list with grant counts, create, update and delete. A campaign binds a badge to a time window; any buddy active inside the window earns the badge once.
EventBadgesResource.list()
list(signal?: AbortSignal): Promise<EventBadgeCampaign[]>List the tenant's campaigns, newest window first, with grant counts.
EventBadgesResource.create()
create(params: CreateEventBadgeParams): Promise<EventBadgeDefinition>Create an event-triggered badge campaign.
EventBadgesResource.update()
update(campaignId: string, params: UpdateEventBadgeParams): Promise<EventBadgeDefinition>Update an event-triggered badge campaign.
EventBadgesResource.delete()
delete(campaignId: string, signal?: AbortSignal): Promise<void>Delete an event-triggered badge campaign.
ProfileTemplatesResource
F3.14 Profile Page Editor v2 (Yu-kai Ch.7 #11 Meaningful Choices) — tenant
admin resource (secret key / dashboard JWT). Backs the Planner "Profile Page
v2" drawer: the template gallery + CRUD, and the bulk-apply wizard that
assigns a template to many buddies in one call. Plan-gated on
profile_pages_v2 (GROWTH+).
ProfileTemplatesResource.list()
list(signal?: AbortSignal): Promise<ProfileTemplateList>List the gallery — built-in system templates plus the tenant's own.
ProfileTemplatesResource.create()
create(params: CreateProfileTemplateParams): Promise<ProfileTemplate>Create a custom profile-page template.
ProfileTemplatesResource.update()
update(templateId: string, params: UpdateProfileTemplateParams): Promise<ProfileTemplate>Update a custom profile-page template.
ProfileTemplatesResource.delete()
delete(templateId: string, signal?: AbortSignal): Promise<void>Delete a custom template — its buddies revert to the tenant default.
ProfileTemplatesResource.applyBulk()
applyBulk(params: BulkApplyProfileTemplateParams): Promise<{ applied: number }>Assign a template to many buddies in one statement.
LeaguesResource
F4.1 LEAGUES — end-user widget resource. Reads the widget buddy's live
league standing, the season-long Boss Fight challenge and, after a season
closes, the personalized season-closing highlights. Backs the league
widget and the season-closing ceremony.
LeaguesResource.me()
me(signal?: AbortSignal): Promise<LeagueWidgetSnapshot>The widget buddy's live league standing for the active season.
LeaguesResource.bossFightProgress()
bossFightProgress(signal?: AbortSignal): Promise<BossFightProgressView>The season-long Boss Fight challenge for the widget buddy — F4.2. The buddy's progress toward the season target, the deadline and the challenge leaderboard. An unavailable view means there is no active boss fight.
LeaguesResource.seasonHighlights()
seasonHighlights(seasonId: string, signal?: AbortSignal): Promise<LeagueSeasonHighlightsSnapshot>The buddy's personalized season-closing highlights for a finalized season — best week, kudos sent, items collected and cohort role.
LeaguesResource.latestSeasonHighlights()
latestSeasonHighlights(signal?: AbortSignal): Promise<LeagueSeasonHighlightsSnapshot>The buddy's latest finalized season-closing highlights. Useful for widgets that should show the most recent ceremony without first resolving a concrete season id.
HexadSurveyResource
HTCH-142 — Marczewski Hexad survey, widget-token scoped. The buddy fetches the question catalog, submits Likert answers, reads their own stored response, or withdraws consent (DELETE /me).
The API is intentionally minimal — admin-only operations (audience recompute, aggregate views) are exposed through the dashboard, not the SDK. A widget-token client cannot reach them.
HexadSurveyResource.questions()
questions(signal?: AbortSignal): Promise<HexadSurveyQuestionsResponse>Question catalog + current consent version.
HexadSurveyResource.submit()
submit(params: SubmitHexadSurveyParams): Promise<HexadSurveySubmitResult>UPSERT the buddy's response — re-takes overwrite in place.
HexadSurveyResource.me()
me(signal?: AbortSignal): Promise<HexadSurveyMyResponse>The buddy's latest survey row, or { response: null } when none.
HexadSurveyResource.deleteMine()
deleteMine(signal?: AbortSignal): Promise<void>Withdraw consent: deletes the raw answers + derived scores. The next nightly aggregation absorbs the lower response count; audience-level aggregates are preserved.
AuthResource
client.auth.whoami() lets a tenant verify a key during onboarding, CI,
or --health style scripts without performing a side-effectful call.
It returns the identity of the calling credential, the plan, and the
full capability list — no separate dashboard round-trip needed.
AuthResource.whoami()
whoami(signal?: AbortSignal): Promise<WhoamiResult>NotificationsResource
HTCH-75 — F3.1 Notification primitive — widget-token resource. The HTCH-76
banner widget polls list (which folds in the unread badge count and the
vacation paused_until) plus unreadCount, and drives the buddy's reads,
dismissals and snoozes. The primitive is universally entitled — every Faz 3+
feature that emits a message writes into this one feed.
NotificationsResource.list()
list(params: ListNotificationsParams = {}): Promise<NotificationFeedPage>The buddy's notification feed — cursor-paginated, newest first.
NotificationsResource.unreadCount()
unreadCount(signal?: AbortSignal): Promise<UnreadCountResult>The unread, non-dismissed notification count for the badge.
NotificationsResource.dismissAll()
dismissAll(signal?: AbortSignal): Promise<DismissAllResult>Read + dismiss every notification for the buddy in one call.
NotificationsResource.markRead()
markRead(id: string, signal?: AbortSignal): Promise<Notification>Mark a single notification read. Returns the updated notification.
NotificationsResource.dismiss()
dismiss(id: string, signal?: AbortSignal): Promise<DismissResult>Read + dismiss a single notification (HTCH-76).
NotificationsResource.snooze()
snooze(id: string, hours?: number, signal?: AbortSignal): Promise<Notification>Snooze a notification for a number of hours, clamped server-side to the
1–24h band. hours defaults to 1 when omitted. Returns the updated
notification.
MysteryBoxResource
HTCH-83 — F3.6 Mystery Box (Yu-kai Ch.11 Skinner Box) — widget-token
resource. A once-a-day box: read getState to render it (eligible / capped
/ locked), then claim on tap. The daily cap of 1 is a hard-coded addiction
guardrail that resets at UTC midnight; a claim past the cap throws a 409
whose body carries next_eligible_at. The draw is deterministically seeded
per (buddy, UTC day), so it cannot be re-rolled.
MysteryBoxResource.getState()
getState(signal?: AbortSignal): Promise<MysteryBoxState>The Mystery Box state for the current buddy.
MysteryBoxResource.claim()
claim(signal?: AbortSignal): Promise<MysteryBoxClaimResult>Open the Mystery Box. Throws a 409 (mystery_box_daily_cap) when the
daily cap is already spent.
CouncilResource
HTCH-108 — F4.6 Council Elitism — widget-token resource. A Council member
proposes user-facing narrative copy and tracks their own submissions
(Yu-kai Ch.7 #2 Elitism + #1 Narrative co-creation). Membership is the gate:
submitProposal rejects non-members with not_council_member, and a
non-enterprise tenant never has members. Over the weekly quota a submit
throws a 429 (rate_limited).
CouncilResource.listMyProposals()
listMyProposals(signal?: AbortSignal): Promise<MyProposalsView>The buddy's own narrative proposals plus their Council standing and remaining weekly quota.
CouncilResource.submitProposal()
submitProposal(params: SubmitProposalParams): Promise<Proposal>Submit a narrative proposal. Council members only.
FreeLunchResource
HTCH-44 — F1.10 Free Lunch (Yu-kai #24) — widget-token resource. The buddy
widget polls getNotification on mount to surface the unexpected welcome
credit banner; dismissing it posts acknowledge, which closes the
granted → seen → dismissed funnel so the banner does not reappear.
FreeLunchResource.getNotification()
getNotification(signal?: AbortSignal): Promise<FreeLunchNotification>The buddy's most recent unacknowledged Free Lunch grant, or
has_pending: false when there is nothing to show.
FreeLunchResource.acknowledge()
acknowledge(id: string, signal?: AbortSignal): Promise<FreeLunchAcknowledgeResult>Acknowledge a Free Lunch banner so it does not reappear.
BeginnersLuckResource
HTCH-43 — Beginner's Luck reveal — widget-token resource. The hatch ceremony
calls getResult once when the act-5 celebration mounts. The evaluation is
idempotent (HTCH-41), so a refresh mid-ceremony resolves to the same
outcome.
BeginnersLuckResource.getResult()
getResult(signal?: AbortSignal): Promise<BeginnersLuckResult>Idempotently evaluate Beginner's Luck for the buddy's first hatch and return the winner-only reveal payload.
WidgetActivationResource
Loader-level activation beacons for widget-token clients. The CDN loader calls this after a widget mounts so activation emails, referrals and product analytics do not count a copied snippet until it really rendered.
WidgetActivationResource.recordRendered()
recordRendered(params: RecordWidgetRenderedParams = {}): Promise<WidgetRenderedResult>Record that one or more widgets rendered successfully.
Configuration
These shapes describe the object passed to new HatchedClient({ ... }). The three auth-mode variants (ApiKeyConfig, PublishableKeyConfig, WidgetTokenConfig) are mutually exclusive — pick one and the other key fields are forbidden.
ApiKeyConfig
export interface ApiKeyConfig extends BaseConfig {
/** Secret API key (hatch_live_*, hatch_test_*). Server-only. */
apiKey: string;
publishableKey?: never;
widgetToken?: never;
}PublishableKeyConfig
export interface PublishableKeyConfig extends BaseConfig {
/** Browser-safe publishable key (hatch_pk_*). Scoped auth. */
publishableKey: string;
apiKey?: never;
widgetToken?: never;
}WidgetTokenConfig
export interface WidgetTokenConfig extends BaseConfig {
/** Widget embed/session token minted by the server. Browser-safe, buddy-scoped. */
widgetToken: string;
apiKey?: never;
publishableKey?: never;
}HatchedClientConfig
export type HatchedClientConfig =
| ApiKeyConfig
| PublishableKeyConfig
| WidgetTokenConfig;Functions
Top-level helpers exported from @hatched/sdk-js. These are framework-agnostic utilities you can call without a HatchedClient instance.
paginate()
paginate(fetchPage: (page: number) => Promise<OffsetPage<T>>, options: PaginateOptions = {}): AsyncIterableIterator<T>Walks an offset-paginated list endpoint, yielding each row as it
arrives. fetchPage receives a 1-indexed page number and must return
the offset envelope { data, meta }. For cursor-paginated endpoints,
use paginateCursor instead.
@example
for await (const buddy of paginate(
(page) => hatched.buddies.list({ page, limit: 100, status: 'active' }),
)) {
if (buddy.id === target) break; // early-exit; iterator stops paging
}paginateCursor()
paginateCursor(fetchPage: (cursor?: string) => Promise<CursorPage<T>>, options: PaginateOptions = {}): AsyncIterableIterator<T>Walks a cursor-paginated list endpoint. fetchPage is invoked with
undefined on the first call and the server-returned nextCursor on
each subsequent call. Iteration stops automatically when
pagination.nextCursor === null.
Cursor pagination is Hatched's canonical shape for new list
endpoints — it's stable under concurrent writes and supports unbounded
streams. For legacy offset endpoints, use paginate.
@example
for await (const op of paginateCursor(
(cursor) => hatched.operations.list({ cursor, limit: 100 }),
)) {
console.log(op.id);
}collect()
collect(fetchPage: (page: number) => Promise<OffsetPage<T>>, options: PaginateOptions = {}): Promise<T[]>Drains an offset-paginated list endpoint into a single array.
Convenient for one-off scripts; prefer paginate in
long-running code so you don't hold the entire result set in memory.
For cursor-paginated endpoints, use collectCursor.
@example
const allActive = await collect(
(page) => hatched.buddies.list({ page, limit: 100, status: 'active' }),
);collectCursor()
collectCursor(fetchPage: (cursor?: string) => Promise<CursorPage<T>>, options: PaginateOptions = {}): Promise<T[]>Drains a cursor-paginated list endpoint into a single array.
Convenient for one-off scripts; prefer paginateCursor in
long-running code so you don't hold the entire result set in memory.
@example
const allOps = await collectCursor(
(cursor) => hatched.operations.list({ cursor, limit: 100 }),
);consoleLogger()
consoleLogger(): SdkLoggerDefault logger — writes to console.warn for warn/error and to
console.log for debug/info. Used when the host hasn't provided a
logger but debug is on, or when the SDK needs to surface a
warn-level message and the host left logger undefined.
verifyExpressRequest()
verifyExpressRequest(req: MinimalExpressRequest, secret: string | readonly string[], options: VerifyAdapterOptions = {}): VerifyResultVerify the signature on an incoming Express request and return the parsed
raw payload plus Hatched metadata headers. Pass req directly — the adapter reads req.headers,
req.body (Buffer from express.raw()), or req.rawBody fallback.
verifyFastifyRequest()
verifyFastifyRequest(req: MinimalFastifyRequest, secret: string | readonly string[], options: VerifyAdapterOptions = {}): VerifyResultverifyHonoRequest()
verifyHonoRequest(c: MinimalHonoContext, secret: string | readonly string[], options: VerifyAdapterOptions = {}): Promise<VerifyResult>verifyNextAppRequest()
verifyNextAppRequest(req: MinimalFetchRequest, secret: string | readonly string[], options: VerifyAdapterOptions = {}): Promise<VerifyResult>App Router (Route Handlers): pass the Request you received in POST(req).
verifyNextPagesRequest()
verifyNextPagesRequest(req: MinimalPagesRequest, rawBody: Buffer | string, secret: string | readonly string[], options: VerifyAdapterOptions = {}): VerifyResultPages Router (API Routes): pass (req) plus the raw body you captured
yourself. Because Next disables raw bytes by default, read them with
something like getRawBody(req) from the raw-body npm package.
Constants
Frozen exported values. Use them in switch statements and comparisons instead of re-typing string literals — the type system catches typos and renames.
ErrorCode
Canonical Hatched API error code strings, surfaced as a typed object so
consumers can switch on err.code without re-typing literals.
Each value matches the error.code field in the API's JSON error
envelope and the code property on every HatchedError subclass.
@example
import { ErrorCode, HatchedError } from '@hatched/sdk-js';
try {
await hatched.events.send({ eventId, userId: 'user_42', type: 'lesson_completed' });
} catch (err) {
if (err instanceof HatchedError) {
switch (err.code) {
case ErrorCode.EventQuotaExceeded: showUpgradeBanner(); break;
case ErrorCode.RateLimited: queueRetry(err.retryAfter); break;
case ErrorCode.PlanFeatureLocked: hideFeature(); break;
default: throw err;
}
}
}Adding new codes here is additive only — codes are part of the public contract and never renamed within a major version. If a new code ships, add a key to this object in a minor release.
export const ErrorCode = {
// 400 — bad request
BadRequest: 'bad_request',
InsufficientBalance: 'insufficient_balance',
TooManyItems: 'too_many_items',
CategoryConflict: 'category_conflict',
MissingAudience: 'missing_audience',
UnknownAudience: 'unknown_audience',
// 422 — validation
ValidationFailed: 'validation_failed',
// 401 / 403 — auth & scope
Unauthorized: 'unauthorized',
Forbidden: 'forbidden',
PublishableKeyScope: 'publishable_key_scope',
WidgetTokenScope: 'widget_token_scope',
PlanFeatureLocked: 'plan_feature_locked',
CapabilityDisabled: 'capability_disabled',
// 402 — billing
PaymentRequired: 'payment_required',
CreditInsufficient: 'credit_insufficient',
EventQuotaExceeded: 'event_quota_exceeded',
OnboardingCapReached: 'onboarding_cap_reached',
// 404 — not found
ResourceNotFound: 'resource_not_found',
NotFound: 'not_found',
// 409 — conflicts
Conflict: 'conflict',
ConfigVersionMismatch: 'config_version_mismatch',
NoPublishedConfig: 'no_published_config',
ActiveEggLimit: 'active_egg_limit',
IdempotencyKeyConflict: 'idempotency_key_conflict',
// 429 — throttling
RateLimited: 'rate_limited',
// 502 — upstream
UpstreamImageError: 'upstream_image_error',
BadGateway: 'bad_gateway',
// 503 — service unavailable
ServiceUnavailable: 'service_unavailable',
OnboardingExtractFailed: 'onboarding_extract_failed',
// 500 — internal
InternalServerError: 'internal_server_error',
} as const;Types
NoPublishedConfigDetails
export interface NoPublishedConfigDetails {
customerId?: string;
customer_id?: string;
publishUrl?: string;
publish_url?: string;
docsUrl?: string;
docs_url?: string;
}ActiveEggLimitEgg
export interface ActiveEggLimitEgg {
eggId: string;
status: string;
createdAt: string;
}ActiveEggLimitDetails
export interface ActiveEggLimitDetails {
max?: number;
active?: ActiveEggLimitWireEgg[];
}CreditInsufficientDetails
export interface CreditInsufficientDetails {
required?: number;
available?: number;
welcome?: number;
paid?: number;
promo?: number;
upgrade_url?: string;
top_up_url?: string;
}EventQuotaExceededDetails
export interface EventQuotaExceededDetails {
used?: number;
limit?: number;
reset_at?: string;
upgrade_url?: string;
}PlanFeatureLockedDetails
export interface PlanFeatureLockedDetails {
feature?: string;
required_plan?: string;
current_plan?: string;
upgrade_url?: string;
}SdkLogger
Pluggable logger for the SDK.
The SDK emits four kinds of log lines:
- debug — Request/response traces. Only emitted when
HatchedClientConfig.debug === true. - info — Reserved; the SDK does not currently emit info lines, but downstream extensions (custom middleware) may.
- warn — Non-fatal observations the SDK wants the operator to see
regardless of
debug: a literal-looking secret key, a retry hint, an unrecognized rate-limit header. - error — Reserved for unrecoverable conditions the SDK is about to throw. Errors are still thrown — logging is in addition.
All methods are optional. Provide only the ones you care about; the SDK
checks for the method before calling it. This means you can pass a
Pino/Winston/Bunyan instance directly without writing an adapter, as
long as it has compatible debug / info / warn / error methods.
@example
import pino from 'pino';
const log = pino({ name: 'hatched' });
const hatched = new HatchedClient({
apiKey: process.env.HATCHED_API_KEY!,
logger: log,
});@example
// Minimal "ignore debug, send warnings to Sentry" adapter
const hatched = new HatchedClient({
apiKey: process.env.HATCHED_API_KEY!,
debug: false,
logger: {
warn: (msg, fields) => Sentry.captureMessage(msg, { extra: fields }),
},
});export interface SdkLogger {
debug?(message: string, fields?: Record<string, unknown>): void;
info?(message: string, fields?: Record<string, unknown>): void;
warn?(message: string, fields?: Record<string, unknown>): void;
error?(message: string, fields?: Record<string, unknown>): void;
}FetchLike
export type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;HttpClientConfig
export interface HttpClientConfig {
baseUrl: string;
apiKey?: string;
publishableKey?: string;
widgetToken?: string;
timeout: number;
maxRetries: number;
debug: boolean;
fetch?: FetchLike;
userAgent: string;
logger?: SdkLogger;
}RateLimitSnapshot
export interface RateLimitSnapshot {
limit?: number;
remaining?: number;
reset?: number;
retryAfter?: number;
}RetryMetadata
Snapshot of what the SDK retried while serving the most recent request.
attempts is always 1 for a request that succeeded on the first try;
> 1 means at least one retry happened. reasons lists the trigger for
each retry ('5xx', '429', '408', 'network'). totalDelayMs is
the cumulative time spent in backoff waits, not including the requests
themselves.
The snapshot is overwritten on every request. Read it immediately after
the call returns, or pipe it into your tracing/observability layer via
the logger config.
export interface RetryMetadata {
attempts: number;
reasons: Array<'5xx' | '429' | '408' | 'network'>;
totalDelayMs: number;
totalElapsedMs: number;
}RequestOptions
export interface RequestOptions {
headers?: Record<string, string>;
idempotent?: boolean;
signal?: AbortSignal;
/** When false, skips automatic camelCase → snake_case mapping on the body. */
mapCase?: boolean;
/** Query parameters (camelCase; converted to snake_case on the wire). */
query?: Record<string, string | number | boolean | undefined>;
/**
* Whether this endpoint accepts publishable keys. When `false` (default
* for mutations) and the client is initialised with a publishable key,
* the SDK throws `PublishableKeyScopeError` without a network round-trip.
*/
allowPublishable?: boolean;
/** Whether this endpoint accepts a widget embed/session token. */
allowWidgetToken?: boolean;
}EggStatus
export type EggStatus = 'waiting' | 'ready' | 'hatching' | 'hatched' | 'cancelled';CreateEggParams
export interface CreateEggParams {
/** The external user id that owns the egg. */
userId: string;
/**
* Binds the egg — and the buddy it hatches into — to a named audience.
* Audience-scoped content (streaks, badges, marketplace items) is keyed by
* audience, so a buddy born in the wrong audience makes those widgets 404 or
* render empty. Single-audience workspaces can omit this (the server binds the
* sole configured audience automatically); multi-audience workspaces must set
* it. This is shorthand for `metadata.audience` and takes precedence over it.
*/
audience?: string;
/** Free-form metadata attached to the egg. */
metadata?: Record<string, unknown>;
/**
* When true, return the user's most recent `waiting`/`ready` egg if one
* already exists instead of creating a new one (idempotent first-run
* bootstrap; avoids hitting the per-user active-egg cap on retries).
*/
ensure?: boolean;
}Egg
export interface Egg {
eggId: string;
userId: string;
status: EggStatus;
visualVariant: number;
configVersionId: string;
/** The buddy hatched from this egg. Non-null once `status === 'hatched'`. */
buddyId: string | null;
metadata: Record<string, unknown>;
createdAt: string;
}EggStatusChange
export interface EggStatusChange {
eggId: string;
status: EggStatus;
previousStatus: EggStatus;
}HatchResult
export interface HatchResult {
operationId: string;
status: string;
}ListEggsParams
export interface ListEggsParams {
userId?: string;
status?: EggStatus;
page?: number;
limit?: number;
signal?: AbortSignal;
}AuraTier
export type AuraTier = 'mythic' | 'legendary' | 'epic' | 'rare' | 'common';Buddy
export interface Buddy {
id: string;
customerId: string;
userId: string;
audience: string;
name: string;
configVersionId: string;
evolutionStage: number;
coins: number;
status: 'active' | 'archived';
skills: Record<string, number>;
tokens: Record<string, number>;
progression?: BuddyProgression;
imageUrl: string | null;
baseImageUrl: string | null;
thumbUrl: string | null;
equippedItems: BuddyEquippedItem[];
appearance?: BuddyAppearance;
auraTier?: AuraTier;
/** HTCH-27 — true when the buddy has no equipped items. */
isNaked?: boolean;
/** HTCH-105 — F4.4 true when the buddy holds the mentor role. */
isMentor?: boolean;
createdAt: string;
updatedAt: string;
}BuddyProgression
export interface BuddyProgression {
/** Player-facing XP. Currently maps to totalSkillLevel. */
xp: number;
totalSkillLevel: number;
badgeCount: number;
itemCount: number;
currentStreak: number;
longestStreak: number;
customCounters: Record<string, number>;
}BuddyEquippedItem
export interface BuddyEquippedItem {
itemId: string;
name: string;
imageUrl: string | null;
}Badge
export interface Badge {
badgeKey: string;
label: string;
description: string | null;
/**
* HTCH-16 user-facing "How to earn" copy. Distinct from `description`
* (admin-internal) — the badges widget renders this in the locked-tile
* tooltip. Falls back to `description` when null.
*/
criteriaCopy: string | null;
iconUrl: string | null;
awardedAt: string;
coinReward: number;
alreadyAwarded: boolean;
}BuddyAppearanceStatus
export type BuddyAppearanceStatus = 'ready' | 'pending' | 'awaiting_credits' | 'failed';BuddyAppearance
export interface BuddyAppearance {
status: BuddyAppearanceStatus;
operationId: string | null;
desiredEquippedItemIds: string[];
renderedEquippedItemIds: string[];
retryable: boolean;
message: string | null;
error: Record<string, unknown> | null;
}BuddyListParams
export interface BuddyListParams {
userId?: string;
status?: string;
evolutionStage?: number;
page?: number;
limit?: number;
sort?: string;
order?: 'asc' | 'desc';
signal?: AbortSignal;
}SkillUpdate
export interface SkillUpdate {
key: string;
action: 'increase' | 'decrease' | 'set';
amount?: number;
value?: number;
}EarnCoinsParams
export interface EarnCoinsParams {
amount: number;
reason: string;
referenceId?: string;
/**
* Token key to earn. Defaults to the customer's `primary` token. Passing
* a progression token grants progress; passing any other configured token
* key is accepted by the rule engine. Omit to earn the default coin / primary.
*/
token?: string;
}SpendCoinsParams
export interface SpendCoinsParams {
amount: number;
reason: string;
itemId?: string;
/**
* Token key to spend. Defaults to the customer's `primary` token. Spending
* a progression token fails with ValidationError('progression_not_spendable').
*/
token?: string;
}TokenBalance
export interface TokenBalance {
/** Canonical `primary` or `progression` identifier. */
kind: 'primary' | 'progression';
/** Customer-defined token key (e.g. `gems`, `xp`). */
key: string;
/** Human-readable label for display. */
label: string;
/** Current balance. */
balance: number;
/** Lifetime earned (earn ledger sum). */
lifetimeEarned: number;
/** Lifetime spent (spend ledger sum) — always 0 for progression. */
lifetimeSpent: number;
}TokensSummary
export interface TokensSummary {
primary: TokenBalance | null;
progression: TokenBalance | null;
}BuddyEvolutionRecord
export interface BuddyEvolutionRecord {
id: string;
buddyId: string;
fromStage: number;
toStage: number;
triggeredByEventId: string | null;
imageUrl: string | null;
source: 'prod' | 'demo' | 'auto';
metadata: Record<string, unknown>;
occurredAt: string;
}EquipItemsParams
export interface EquipItemsParams {
equip?: string[];
unequip?: string[];
}EquipItemsResult
export interface EquipItemsResult {
accepted: boolean;
operationId: string | null;
status: 'pending' | 'completed' | string;
appearanceStatus: BuddyAppearanceStatus | string;
cached: boolean;
}RerenderAppearanceResult
export interface RerenderAppearanceResult {
accepted: boolean;
operationId: string;
status: 'pending' | string;
appearanceStatus: BuddyAppearanceStatus | string;
}BuddyList
export interface BuddyList {
data: Buddy[];
meta: { total: number; page: number; limit: number };
}PrestigeBlockReason
Why a buddy cannot prestige right now — F4.3 Prestige Loop.
export type PrestigeBlockReason =
| 'disabled'
| 'not_max_stage'
| 'appearance_pending'
| 'cooldown_active'
| 'champion_required';PrestigeAuraTint
The permanent prestige aura ladder.
export type PrestigeAuraTint = 'none' | 'silver' | 'gold' | 'rainbow';PrestigeStatus
GET /widget/buddy/prestige payload — whether the widget buddy can
prestige and, when it cannot, the reason.
export interface PrestigeStatus {
/** False when the tenant has not enabled the prestige loop. */
available: boolean;
canPrestige: boolean;
reason: PrestigeBlockReason | null;
prestigeLevel: number;
evolutionStage: number;
maxEvolutionStage: number;
/** When `cooldown_active`, the ISO instant the cooldown clears. */
cooldownEndsAt: string | null;
}PrestigeResult
POST /widget/buddy/prestige success payload.
export interface PrestigeResult {
prestigeLevel: number;
fromEvolutionStage: number;
evolutionStage: number;
auraTint: PrestigeAuraTint;
prestigedAt: string;
seasonId: string | null;
/** The buddy's image after the reset (reverted to its clean base). */
imageUrl: string;
}SendEventParams
export interface SendEventParams {
/** Stable id used for idempotency. Re-sending the same eventId is a no-op. */
eventId: string;
/** External user id the event belongs to. */
userId: string;
/** Event type (e.g. `lesson_completed`, `workout_finished`). */
type: string;
/**
* Audience (role) this event belongs to. Required for customers with 2+
* audiences; omit for single-audience customers and the server applies
* the implicit default. Lowercase, snake_case, max 32 chars.
*/
audience?: string;
/** When the event occurred. Defaults to "now" server-side if omitted. */
occurredAt?: Date | string;
/** Arbitrary key-value payload forwarded to the rule engine. */
properties?: Record<string, unknown>;
}EventStreakUpdate
Per-streak progression entry returned alongside coin/badge effects when a tracked event advances a streak. The HTTP client deep-converts snake_case → camelCase, so SDK consumers see camelCase keys here.
export interface EventStreakUpdate {
definitionKey: string;
label: string;
icon: string;
current: number;
longest: number;
milestoneHit: number | null;
hero: boolean;
}EventPathSubStepCompletion
Per-path completion delta produced when a tracked event closes a sub-step.
export interface EventPathSubStepCompletion {
pathKey: string;
stepKey: string;
subStepKey: string;
rewardCoins: number;
rewardBadgeKey: string | null;
}EventPathStepCompletion
export interface EventPathStepCompletion {
pathKey: string;
stepKey: string;
rewardCoins: number;
rewardBadgeKey: string | null;
}EventPathCompletion
export interface EventPathCompletion {
pathKey: string;
}EventPathUpdate
export interface EventPathUpdate {
pathKey: string;
subStepCompleted?: EventPathSubStepCompletion;
stepCompleted?: EventPathStepCompletion;
pathCompleted?: EventPathCompletion;
}EventEffects
export interface EventEffects {
coins?: number;
badgesAwarded?: string[];
badgesReady?: string[];
tokens?: string[];
/** Present when the event was accepted but produced no user-visible effect. */
debugReason?: 'no_active_buddies_for_user' | 'no_matching_rules' | string;
/**
* True when the buddy has met the next evolution condition. If the
* customer's config does not auto-evolve, call `buddies.evolve(buddyId)`
* server-side and wait on the returned operation.
*/
evolutionReady?: boolean;
streakMilestones?: number[];
/** Per-streak deltas (current/longest, milestone hits) for active streaks. */
streakUpdates?: EventStreakUpdate[];
/**
* Path widget reconciliation deltas. Each entry covers one sub-step
* completion plus optional step / path roll-up flags so the host page
* can paint celebrations without an extra round-trip.
*/
pathUpdates?: EventPathUpdate[];
}OperationStatus
export type OperationStatus =
| 'pending'
| 'processing'
| 'completed'
| 'failed'
| 'cancelled';Operation
export interface Operation<TResult = unknown> {
operationId: string;
/** Alias for {@link Operation.operationId} for callers that prefer `id`. */
id: string;
type: string;
status: OperationStatus;
result?: TResult;
error?: string;
createdAt: string;
updatedAt: string;
}WaitOptions
export interface WaitOptions {
/** Maximum total time to wait, in milliseconds. Default 30_000. */
timeoutMs?: number;
/** Poll interval, in milliseconds. Default 2000. */
intervalMs?: number;
/** External abort signal. */
signal?: AbortSignal;
}PlayerZeroBuddy
export interface PlayerZeroBuddy {
id: string;
userId: string;
name: string;
audience: string;
evolutionStage: number;
imageUrl: string | null;
}PlayerZeroResult
export interface PlayerZeroResult {
/** False when Player Zero already existed and was returned as-is. */
created: boolean;
buddy: PlayerZeroBuddy;
}PlayerZeroStatus
export interface PlayerZeroStatus {
exists: boolean;
/** True once the demo player's hatch ceremony has completed. */
hatched: boolean;
buddyId: string | null;
}CreateSessionParams
export interface CreateSessionParams {
buddyId: string;
userId: string;
scopes: string[];
ttlSeconds?: number;
}SessionToken
export interface SessionToken {
token: string;
sessionId: string;
expiresAt: string;
scopes: string[];
}CreateEmbedTokenParams
export interface CreateEmbedTokenParams {
buddyId: string;
userId: string;
ttlSeconds?: number;
}EmbedToken
export interface EmbedToken {
token: string;
expiresAt: string;
mode: 'read-only';
}WebhookEvent
Every webhook event a customer can subscribe to.
The canonical source is the API's WEBHOOK_EVENTS list in
apps/api/src/webhooks/webhook-events.ts (the @IsIn(WEBHOOK_EVENTS)
validation on CreateWebhookConfigDto). This union MUST stay in sync with
that list — copy names verbatim, do not invent them. Subscribing to a name
not in this union is rejected by the API at config-create time.
Grouped by domain for readability; entries are sorted alphabetically within each group.
export type WebhookEvent =
// appearance
| 'appearance.composed'
// badge
| 'badge.awarded'
| 'badge.ready'
| 'event_badge.awarded'
// beginner's luck
| 'beginners_luck.day_3'
| 'beginners_luck.day_7_complete'
| 'beginners_luck.evaluated'
// booster
| 'booster.consumed_event'
| 'booster.granted'
// buddy
| 'buddy.aura_tier_changed'
| 'buddy.ceremony_completed'
| 'buddy.config_migrated'
| 'buddy.evolved'
| 'buddy.first_outfit_saved'
| 'buddy.founding_cohort_awarded'
| 'buddy.hatched'
| 'buddy.prestiged'
// cause (Humanity Hero)
| 'cause.threshold_reached'
// celebration (White Hat)
| 'celebration.milestone_acknowledged'
| 'celebration.streak_recovered'
// coins
| 'coins.earned'
| 'coins.spent'
// council
| 'council.proposal_approved'
// egg
| 'egg.created'
// evolution
| 'evolution.hr_forced'
| 'evolution.ready'
// feed (SeeSaw Bump)
| 'feed.team_event_clapped'
| 'feed.team_event_created'
// flash sale
| 'flash_sale.ended'
| 'flash_sale.started'
// free lunch (Welcome Gift funnel)
| 'free_lunch.dismissed'
| 'free_lunch.granted'
| 'free_lunch.seen'
// gate
| 'gate.unlocked'
// group quest
| 'group_quest.joined'
| 'group_quest.left'
| 'group_quest.missed'
| 'group_quest.won'
// hexad survey
| 'hexad.survey_completed'
// item
| 'item.equipped'
| 'item.gifted'
| 'item.purchased'
// kudos
| 'kudos.received'
| 'kudos.sent'
// league
| 'league.off_season_ended'
| 'league.off_season_started'
| 'league.season_closed'
| 'league.season_ended'
| 'league.season_started'
| 'league.tier_down'
| 'league.tier_up'
// lottery
| 'lottery.drawn'
| 'lottery.entered'
| 'lottery.won'
// mentor
| 'mentor.availability_changed'
| 'mentor.badge_threshold_hit'
| 'mentor.session_logged'
// mystery box
| 'mystery_box.opened'
// notification
| 'notification.created'
// operation
| 'operation.completed'
| 'operation.failed'
// outfit (Dress mode)
| 'outfit.deleted'
| 'outfit.saved'
| 'outfit.worn'
// path
| 'path.completed'
| 'path.step_completed'
| 'path.sub_step_completed'
// recovery (White Hat)
| 'recovery.streak_restored'
// returning champion
| 'returning_champion.crown_equipped'
| 'returning_champion.dismissed'
| 'returning_champion.shown'
// scouting quest
| 'scouting_quest.completed'
// season challenge
| 'season_challenge.completed'
// showroom (HR)
| 'showroom.award_given'
| 'showroom.published'
| 'showroom.qr_regenerated'
| 'showroom.unpublished'
// skill
| 'skill.decayed'
| 'skill.level_up'
| 'skill.updated'
// streak
| 'streak.at_risk'
| 'streak.milestone'
// surprise drop
| 'surprise_drop.granted'
// team
| 'team.member_joined'
| 'team.member_left'
| 'team.role_changed'
| 'team_membership.role_upgraded'
// token
| 'token.earned'
| 'token.spent'
// usage
| 'usage.limit_reached'
| 'usage.threshold_reached'
// user lifecycle
| 'user.lapsed_day_3'
| 'user.lapsed_day_7'
| 'user.lapsed_day_14'
| 'user.welcome_back';WebhookEndpoint
export interface WebhookEndpoint {
id: string;
url: string;
events: WebhookEvent[];
active: boolean;
status: 'active' | 'paused';
secret?: string;
maskedSecret?: string;
createdAt: string;
updatedAt: string;
}CreateWebhookParams
export interface CreateWebhookParams {
url: string;
events: WebhookEvent[];
description?: string;
}WebhookDelivery
export interface WebhookDelivery {
id: string;
endpointId?: string;
event: WebhookEvent | string;
eventType: WebhookEvent | string;
status: 'pending' | 'success' | 'succeeded' | 'failed';
responseCode?: number | null;
responseStatus?: number | null;
attempt: number;
attempts: number;
durationMs?: number | null;
errorMessage?: string | null;
createdAt: string;
timestamp: string;
lastAttemptAt?: string;
}ListDeliveriesParams
export interface ListDeliveriesParams {
endpointId: string;
status?: 'pending' | 'success' | 'failed';
cursor?: string;
limit?: number;
signal?: AbortSignal;
}Page
export interface Page<T> {
data: T[];
nextCursor: string | null;
}VerifySignatureOptions
export interface VerifySignatureOptions {
/**
* The `X-Hatched-Timestamp` header value (unix seconds). Hatched sends the
* timestamp in its own header, separate from the signature. Pass it here so
* the verifier can recompute the HMAC and enforce the replay window.
*
* The framework adapters in `@hatched/sdk-js/webhooks` extract this for you.
* If omitted, the verifier falls back to a `t=<ts>` segment embedded in the
* signature header (legacy/combined format) and fails closed if neither is
* present.
*/
timestamp?: string | number;
/** Maximum clock-skew in seconds. Defaults to 5 minutes. */
toleranceSeconds?: number;
/** Clock used for timestamp validation — useful in tests. */
now?: () => number;
}TokenGate
export interface TokenGate {
id: string;
gateKey: string;
tokenKey: string;
cost: number;
label: string | null;
description: string | null;
metadata: Record<string, unknown>;
isActive: boolean;
createdAt: string;
updatedAt: string;
}UnlockResult
export interface UnlockResult {
gateKey: string;
unlocked: true;
alreadyUnlocked: boolean;
unlockedAt: string;
balanceAfter: number | null;
metadata: Record<string, unknown>;
}BuddyUnlock
export interface BuddyUnlock {
gateKey: string;
unlockedAt: string;
metadata: Record<string, unknown>;
}PathDisplayMode
export type PathDisplayMode = 'straight' | 'zigzag' | 'stepper';PathIcon
export type PathIcon = 'path' | 'flame' | 'heart' | 'bolt' | 'star' | 'leaf';PathConditionType
export type PathConditionType =
| 'event_count'
| 'milestone'
| 'streak'
| 'skill_level'
| 'collection'
| 'evolution'
| 'coin'
| 'badge_earned'
| 'gate_unlocked'
| 'custom';PathCondition
export interface PathCondition {
type: PathConditionType;
config: Record<string, unknown>;
}PathDefinition
export interface PathDefinition {
id: string;
customerId: string;
audience: string;
key: string;
label: string;
description: string | null;
icon: PathIcon;
accentColor: string | null;
displayMode: PathDisplayMode;
isActive: boolean;
createdAt: string;
updatedAt: string;
}PathStep
export interface PathStep {
id: string;
pathDefinitionId: string;
key: string;
label: string;
description: string | null;
icon: string | null;
ordinal: number;
unlockCondition: Record<string, unknown> | null;
completionCondition: PathCondition | null;
rewardCoins: number;
rewardBadgeKey: string | null;
isActive: boolean;
createdAt: string;
updatedAt: string;
}PathSubStep
export interface PathSubStep {
id: string;
pathStepId: string;
key: string;
label: string;
description: string | null;
ordinal: number;
completionCondition: PathCondition | null;
allowManualComplete: boolean;
allowSkipAhead: boolean;
rewardCoins: number;
rewardBadgeKey: string | null;
contentUrl: string | null;
ctaLabel: string | null;
isActive: boolean;
createdAt: string;
updatedAt: string;
}PathSubStepStatus
export type PathSubStepStatus = 'locked' | 'available' | 'completed';PathSubStepRuntime
export interface PathSubStepRuntime {
id: string;
key: string;
label: string;
description: string | null;
ordinal: number;
rewardCoins: number;
rewardBadgeKey: string | null;
contentUrl: string | null;
ctaLabel: string | null;
allowManualComplete: boolean;
allowSkipAhead: boolean;
isActive: boolean;
status: PathSubStepStatus;
completedAt: string | null;
}PathStepRuntime
export interface PathStepRuntime {
id: string;
key: string;
label: string;
description: string | null;
icon: string | null;
ordinal: number;
rewardCoins: number;
rewardBadgeKey: string | null;
isActive: boolean;
unlocked: boolean;
completed: boolean;
subSteps: PathSubStepRuntime[];
}PathRuntimePayload
export interface PathRuntimePayload {
definition: {
key: string;
label: string;
description: string | null;
icon: PathIcon;
accentColor: string | null;
displayMode: PathDisplayMode;
};
steps: PathStepRuntime[];
currentStepKey: string | null;
completed: boolean;
completedAt: string | null;
}CreatePathDefinitionParams
export interface CreatePathDefinitionParams {
audience?: string;
key: string;
label: string;
description?: string;
icon?: PathIcon;
accentColor?: string;
displayMode?: PathDisplayMode;
isActive?: boolean;
}UpdatePathDefinitionParams
export type UpdatePathDefinitionParams = Partial<CreatePathDefinitionParams>;CreatePathStepParams
export interface CreatePathStepParams {
key: string;
label: string;
description?: string;
icon?: string;
ordinal: number;
unlockCondition?: Record<string, unknown>;
completionCondition?: PathCondition;
rewardCoins?: number;
rewardBadgeKey?: string;
isActive?: boolean;
}UpdatePathStepParams
export type UpdatePathStepParams = Partial<CreatePathStepParams>;CreatePathSubStepParams
export interface CreatePathSubStepParams {
key: string;
label: string;
description?: string;
ordinal: number;
completionCondition?: PathCondition;
allowManualComplete?: boolean;
allowSkipAhead?: boolean;
rewardCoins?: number;
rewardBadgeKey?: string;
contentUrl?: string;
ctaLabel?: string;
isActive?: boolean;
}UpdatePathSubStepParams
export type UpdatePathSubStepParams = Partial<CreatePathSubStepParams>;ManualCompleteResult
export interface ManualCompleteResult {
alreadyCompleted: boolean;
subStepKey: string;
stepKey: string;
stepCompleted: boolean;
pathCompleted: boolean;
rewardCoins: number;
rewardBadgeKey: string | null;
}MarketplaceItemRarity
export type MarketplaceItemRarity = 'common' | 'rare' | 'epic' | 'legendary' | string;OutfitThumbnailStatus
export type OutfitThumbnailStatus = 'pending' | 'ready' | 'failed';OutfitPreviewStatus
export type OutfitPreviewStatus = 'pending' | 'ready';CompositionStatus
export type CompositionStatus = 'pending' | 'ready' | 'failed';SlotItemMap
export type SlotItemMap = Record<string, string>;MarketplaceItem
export interface MarketplaceItem {
id: string;
name: string;
description: string | null;
imageUrl: string | null;
category: string;
rarity: MarketplaceItemRarity;
price: number;
isActive: boolean;
/**
* F2.4 Social Treasure — when true the item can only be received as a gift
* from a teammate; a normal purchase is rejected.
*/
isGiftOnly?: boolean;
owned?: boolean;
equipped?: boolean;
locked?: boolean;
lockReason?: string;
availableFrom?: string | null;
availableUntil?: string | null;
}GiftItemParams
export interface GiftItemParams {
/** UUID of the item to gift. */
itemId: string;
/** UUID of the teammate buddy that receives the gift. */
toBuddyId: string;
/** Optional note delivered with the gift, ≤280 chars. */
message?: string;
signal?: AbortSignal;
}GiftItemResult
export interface GiftItemResult {
gifted: boolean;
/** True when the call hit the 60s accident-click guard — no new debit. */
duplicate: boolean;
item_id: string;
from_buddy_id: string;
to_buddy_id: string;
price_paid: number;
/** Sender's coin balance after the debit. */
remaining_coins: number;
/** The receiver-side item purchase row id. */
purchase_id: string;
message: string | null;
gifted_at: string;
}MarketplaceListParams
export interface MarketplaceListParams {
category?: string;
rarity?: string;
page?: number;
limit?: number;
signal?: AbortSignal;
}MarketplaceListResponse
export interface MarketplaceListResponse {
data: MarketplaceItem[];
pagination: {
page: number;
limit: number;
total: number;
totalPages: number;
};
}OutfitSummary
export interface OutfitSummary {
id: string;
buddyId: string;
customerId: string;
name: string;
slotItemMap: SlotItemMap;
isActive: boolean;
thumbnailVariantId: string | null;
thumbnailStatus: OutfitThumbnailStatus;
thumbnailUrl?: string | null;
createdAt: string;
updatedAt: string;
}OutfitListResponse
export interface OutfitListResponse {
outfits: OutfitSummary[];
}OutfitPreviewResponse
export interface OutfitPreviewResponse {
variantId: string | null;
status: OutfitPreviewStatus;
imageUrl: string | null;
}CompositionStatusResponse
export interface CompositionStatusResponse {
status: CompositionStatus;
variantUrl: string | null;
error: string | null;
}SaveOutfitParams
export interface SaveOutfitParams {
name: string;
slotItemMap: SlotItemMap;
}ActivateOutfitResponse
export interface ActivateOutfitResponse {
outfit: OutfitSummary;
equip: unknown;
}DeleteOutfitResponse
export interface DeleteOutfitResponse {
deleted: true;
}BadgeProgress
export interface BadgeProgress {
current: number;
target: number;
}WidgetBadge
export interface WidgetBadge {
id: string;
key?: string;
name: string;
iconUrl: string | null;
description: string | null;
earnedAt: string | null;
criteriaCopy: string;
progress?: BadgeProgress;
}EarnedWidgetBadge
export interface EarnedWidgetBadge {
badgeKey: string;
label: string;
description: string | null;
criteriaCopy?: string | null;
iconUrl: string | null;
awardedAt: string;
coinReward: number;
alreadyAwarded: boolean;
}LockedWidgetBadge
export interface LockedWidgetBadge {
key: string;
label: string;
description: string | null;
criteriaCopy?: string | null;
iconUrl: string | null;
coinReward: number;
conditionType: string;
progress: { current: number; required: number } | null;
hint: string | null;
}BadgeListParams
export interface BadgeListParams {
includeLocked?: boolean;
include_locked?: boolean;
signal?: AbortSignal;
}BadgeListResponse
export interface BadgeListResponse {
badges: WidgetBadge[];
earned: EarnedWidgetBadge[];
locked: LockedWidgetBadge[];
total?: number;
}LeaderboardMetric
export type LeaderboardMetric =
| 'total_xp'
| 'coins'
| 'badge_count'
| 'evolution_stage'
| 'badges'
| 'evolution'
| 'skills';LeaderboardPeriod
export type LeaderboardPeriod = 'daily' | 'weekly' | 'monthly' | 'all_time';LeaderboardViewMode
export type LeaderboardViewMode = 'top' | 'around_me' | 'hybrid';LeaderboardScope
export type LeaderboardScope = 'global' | 'team';LeaderboardScopeParam
Request-side scope filter for leaderboard.get.
export type LeaderboardScopeParam = LeaderboardScope;LeaderboardEntry
export interface LeaderboardEntry {
rank: number;
buddyId: string;
userId: string;
name: string;
imageUrl: string | null;
thumbUrl: string | null;
evolutionStage: number;
score: number;
auraTier: AuraTier;
}LeaderboardUserEntry
export interface LeaderboardUserEntry {
rank: number;
buddyId: string;
name: string;
score: number;
}LeaderboardUrgentOptimism
export interface LeaderboardUrgentOptimism {
rankAbove: number;
name: string;
scoreGap: number;
}LeaderboardWindow
export interface LeaderboardWindow {
size: number;
currentUserRank: number | null;
}LeaderboardScopePolicy
export interface LeaderboardScopePolicy {
allowOverride: boolean;
teamLabel: string | null;
globalLabel: string | null;
defaultScope: LeaderboardScope;
}LeaderboardResponse
export interface LeaderboardResponse {
entries: LeaderboardEntry[];
topStrip: LeaderboardEntry[] | null;
urgentOptimism: LeaderboardUrgentOptimism | null;
currentUserRank?: number;
currentUser?: LeaderboardUserEntry;
userRank: number | null;
userEntry: LeaderboardUserEntry | null;
viewMode: LeaderboardViewMode;
window: LeaderboardWindow;
metric: 'total_xp' | 'coins' | 'badge_count' | 'evolution_stage';
period: LeaderboardPeriod;
totalEntries: number;
/** HTCH-48: resolved scope after applying tenant default + override. */
effectiveScope?: LeaderboardScope;
/** HTCH-48: team id actually filtered on (null unless scope='team'). */
effectiveTeamId?: string | null;
/** HTCH-21: scope-toggle policy + admin label overrides. */
scopePolicy?: LeaderboardScopePolicy;
}LeaderboardParams
export interface LeaderboardParams {
metric?: LeaderboardMetric;
period?: LeaderboardPeriod;
limit?: number;
viewMode?: LeaderboardViewMode;
aroundMe?: boolean;
around_me?: boolean;
topStripSize?: number;
top_strip_size?: number;
/**
* 'team' restricts to the requesting buddy's active team roster, 'global'
* lifts the filter.
*/
scope?: LeaderboardScopeParam;
signal?: AbortSignal;
}NextBestActionKind
export type NextBestActionKind =
| 'streak_warning'
| 'almost_badge'
| 'level_up_close'
| 'group_quest_invite'
| 'kudos_owed'
| 'dress_first_outfit'
| 'try_new_outfit'
| 'fill_cohort';NextBestAction
export interface NextBestAction {
kind: NextBestActionKind;
copy: string;
priority: number;
targetWidget?: string;
targetUrl?: string;
}NextBestActionResponse
export interface NextBestActionResponse {
action: NextBestAction | null;
fallbackUsed: boolean;
}TeamRole
export type TeamRole = 'member' | 'lead' | 'mentor';TeamMember
export interface TeamMember {
buddy_id: string;
display_name: string;
avatar_url: string | null;
role: TeamRole;
/** F2.6 mentor availability flag — false until Mentor visibility ships. */
mentor_available: boolean;
}Team
export interface Team {
id: string;
name: string;
slug: string;
avatar_url: string | null;
member_count: number;
}MyTeamResponse
export interface MyTeamResponse {
team: Team | null;
role: TeamRole | null;
members: TeamMember[];
}SendKudosParams
export interface SendKudosParams {
toBuddyId: string;
kudoTypeKey: string;
/** Optional note, ≤280 chars. Required when the workspace enforces it. */
message?: string;
signal?: AbortSignal;
}SentKudos
export interface SentKudos {
id: string;
from_buddy_id: string;
to_buddy_id: string;
kudo_type_key: string;
weight: number;
message: string | null;
created_at: string;
/** True when the call hit the 60s accident-click guard — no new kudos. */
duplicate: boolean;
daily_cap: number;
sent_today: number;
}KudosFeedEntry
export interface KudosFeedEntry {
id: string;
/** The counterparty buddy — sender on a received kudos, receiver on a given one. */
buddy_id: string;
display_name: string;
avatar_url: string | null;
kudo_type_key: string;
kudo_type_label: string;
kudo_type_icon: string | null;
weight: number;
message: string | null;
created_at: string;
}GivenKudosResponse
export interface GivenKudosResponse {
kudos: KudosFeedEntry[];
/** Lifetime count of kudos this buddy has sent — the assist metric. */
total: number;
}KudoTypeView
export interface KudoTypeView {
/** null for the virtual generic fallback (not yet persisted). */
id: string | null;
key: string;
label: string;
icon: string | null;
description: string | null;
weight: number;
is_active: boolean;
sort_order: number;
is_virtual: boolean;
}ActiveGroupQuest
An active Group Quest as seen by an embedded buddy (widget-token surface).
export interface ActiveGroupQuest {
id: string;
title: string;
description: string | null;
target_metric: string;
target_metric_label: string;
target_value: number;
current_value: number;
deadline: string;
min_participants: number;
participants_count: number;
/** 'team' = scoped to the buddy's team; 'workspace' = customer-wide. */
team_scope: 'team' | 'workspace';
/** True when the requesting buddy is already a participant. */
joined: boolean;
/** Compact reward chip label, e.g. "🎁 +500 coins". */
reward_summary: string;
}JoinGroupQuestResult
export interface JoinGroupQuestResult {
joined: boolean;
/** True when the buddy was already a participant — the call was a no-op. */
already_joined: boolean;
participants_count: number;
}LeaveGroupQuestResult
export interface LeaveGroupQuestResult {
left: boolean;
participants_count: number;
}GroupQuestStatus
export type GroupQuestStatus =
| 'draft'
| 'active'
| 'won'
| 'missed'
| 'cancelled';GroupQuestRewardConfig
Reward distributed to every participant when a quest is won.
export interface GroupQuestRewardConfig {
economy_grant?: number;
item_grant?: string;
badge_grant?: string;
}AdminGroupQuest
A Group Quest as seen on the tenant admin (Planner) surface.
export interface AdminGroupQuest {
id: string;
team_id: string | null;
title: string;
description: string | null;
target_metric: string;
target_value: number;
current_value: number;
deadline: string;
min_participants: number;
reward_config: GroupQuestRewardConfig;
participants_count: number;
status: GroupQuestStatus;
created_at: string;
updated_at: string;
completed_at: string | null;
}CreateGroupQuestParams
export interface CreateGroupQuestParams {
title: string;
description?: string | null;
targetMetric: string;
targetValue: number;
/** ISO 8601 — must be more than 1 hour in the future. */
deadline: string;
minParticipants?: number;
rewardConfig: GroupQuestRewardConfig;
/** Null / omitted = customer-wide quest. */
teamId?: string | null;
}UpdateGroupQuestParams
export interface UpdateGroupQuestParams {
title?: string;
description?: string | null;
deadline?: string;
minParticipants?: number;
targetValue?: number;
rewardConfig?: GroupQuestRewardConfig;
/** Set to 'cancelled' to end an active quest. */
status?: 'cancelled';
}ForceResolveResult
export interface ForceResolveResult {
status: 'won' | 'missed';
current_value: number;
target_value: number;
participants_count: number;
reward_summary: {
economy_per_buddy: number | null;
item_id: string | null;
badge_key: string | null;
} | null;
}MentorDirectoryEntry
A team member open to mentoring, with a server-rendered contact deep link.
export interface MentorDirectoryEntry {
buddy_id: string;
display_name: string;
avatar_url: string | null;
/** Resolved contact URL, or null when the workspace has no template. */
contact_url: string | null;
}MentorSession
export interface MentorSession {
id: string;
/** Quarter-hour granularity, 0.25–8. */
hours: number;
mentee_label: string | null;
summary: string | null;
logged_at: string;
}MentorSessionsResponse
export interface MentorSessionsResponse {
sessions: MentorSession[];
total_hours_all_time: number;
total_hours_this_season: number;
}LogSessionParams
export interface LogSessionParams {
/** Single-session hours, 0.25–8, quarter-hour steps. */
hours: number;
/** Optional mentee name / project label, ≤80 chars. */
menteeLabel?: string;
/** Optional session note, ≤280 chars. */
summary?: string;
signal?: AbortSignal;
}LogSessionResult
export interface LogSessionResult {
session: MentorSession;
total_hours_all_time: number;
/** True when this log crossed the threshold and earned the Mentor badge. */
badge_awarded: boolean;
}BragEventKind
The Win-State that surfaced the Brag Button (HTCH-60).
export type BragEventKind =
| 'evolution'
| 'hatch_complete'
| 'badge_awarded'
| 'league_promotion'
| 'kudos_received_high_weight'
| 'group_quest_won';BragChannel
A share destination the Brag Button can target.
export type BragChannel =
| 'linkedin'
| 'slack'
| 'teams'
| 'twitter'
| 'web_share';BragWebhookChannel
Channels a Slack/Teams webhook post can be sent to.
export type BragWebhookChannel = 'slack' | 'teams';BragTelemetryAction
One step of the brag share funnel.
export type BragTelemetryAction =
| 'opened'
| 'clicked'
| 'completed'
| 'dismissed';RecordBragTelemetryParams
export interface RecordBragTelemetryParams {
/** The Win-State that surfaced the Brag Button. */
eventKind: BragEventKind;
/** The share destination the funnel step relates to. */
channel: BragChannel;
/** The funnel step being recorded. */
action: BragTelemetryAction;
signal?: AbortSignal;
}SendBragSlackPostParams
export interface SendBragSlackPostParams {
/** The Win-State being bragged about. */
eventKind: BragEventKind;
/** Webhook channel — `slack` or `teams`. */
channel: BragWebhookChannel;
/** The user-edited post body (≤1000 chars). */
customMessage: string;
signal?: AbortSignal;
}BragSlackPostResult
export interface BragSlackPostResult {
/** Always true on success — a non-2xx webhook throws `webhook_failed`. */
delivered: true;
}BragTelemetryResult
export interface BragTelemetryResult {
recorded: true;
}TeamEventKind
The kinds of team event the SeeSaw Bump feed surfaces (HTCH-63).
export type TeamEventKind =
| 'streak_milestone'
| 'group_quest_won'
| 'group_quest_missed'
| 'evolution'
| 'badge_awarded_rare'
| 'kudos_received_high_weight'
| 'first_outfit_saved'
| 'mentor_hours_milestone';TeamEvent
export interface TeamEvent {
id: string;
event_kind: TeamEventKind;
subject_buddy_id: string;
subject_name: string;
subject_avatar_url: string | null;
/** Server-rendered display copy — positive framing only. */
copy_rendered: string;
payload: Record<string, unknown>;
clap_count: number;
/** True when the requesting buddy has clapped this event. */
i_clapped: boolean;
created_at: string;
}TeamEventsPage
export interface TeamEventsPage {
events: TeamEvent[];
/** Opaque cursor for the next page, or null when the feed is exhausted. */
next_cursor: string | null;
}ListTeamEventsParams
export interface ListTeamEventsParams {
/** Opaque cursor from a previous page's `next_cursor`. */
cursor?: string;
/** Page size — clamped server-side to the tenant's max. */
limit?: number;
signal?: AbortSignal;
}ClapResult
export interface ClapResult {
team_event_id: string;
clap_count: number;
/** True when the buddy now holds a clap, false after an unclap. */
i_clapped: boolean;
}SocialNormFraming
The three positive framings a social norm may take (HTCH-62).
export type SocialNormFraming =
| 'positive_completion'
| 'elitism_first_n'
| 'momentum_today';SocialNorm
export interface SocialNorm {
/** Stable catalog key. */
key: string;
/** The copy template (with `{{placeholders}}`), tenant override applied. */
copy_template: string;
/** Server-rendered copy, ready to display — positive framing only. */
copy_rendered: string;
framing: SocialNormFraming;
/** The metric value (percent or count) the copy renders. */
metric_value: number;
/** Denominator for count framings, null for percent/scarcity. */
total: number | null;
/** ISO timestamp — end of the UTC day the norm is valid for. */
expires_at: string;
}SocialNormsTodayResponse
export interface SocialNormsTodayResponse {
norms: SocialNorm[];
}CauseTriggerEvent
Rule-engine event types a cause may count.
export type CauseTriggerEvent =
| 'skill.completed'
| 'badge.awarded'
| 'kudos.sent'
| 'level_up'
| 'hatch.completed';AdminCause
A tenant-defined symbolic cause ("Trees planted") as seen on the admin
(Planner) surface. webhookUrl is a Phase-2 placeholder — always null until
the Phase-4 Humanity Hero integration (F4.5).
export interface AdminCause {
id: string;
key: string;
label: string;
icon: string | null;
unit: string;
/** Every N eligible events advance the symbolic counter by one unit. */
rate: number;
trigger_events: CauseTriggerEvent[];
webhook_url: string | null;
enabled: boolean;
created_at: string;
updated_at: string;
}CreateCauseParams
export interface CreateCauseParams {
key: string;
label: string;
icon?: string | null;
unit: string;
/** Defaults to 1 (every event = 1 unit). */
rate?: number;
triggerEvents: CauseTriggerEvent[];
/** Defaults to false — the believability gate is opt-in. */
enabled?: boolean;
}UpdateCauseParams
export interface UpdateCauseParams {
label?: string;
icon?: string | null;
unit?: string;
rate?: number;
triggerEvents?: CauseTriggerEvent[];
enabled?: boolean;
}CausePreview
Projected symbolic units from the last 30 days of eligible events.
export interface CausePreview {
event_count: number;
rate: number;
projected_units: number;
window_days: number;
}FoundingCohortMode
How the Founding Cohort decides which buddies count as early joiners.
export type FoundingCohortMode =
| 'first_n'
| 'first_percent'
| 'first_until_date';FoundingCohortPreview
Projection of how many buddies the current cohort config would mark.
export interface FoundingCohortPreview {
enabled: boolean;
mode: FoundingCohortMode;
eligible_count: number;
ineligible_count: number;
already_member_count: number;
total_buddies: number;
/** False when `first_percent` falls back to the live buddy count. */
uses_expected_total: boolean;
sample_buddies: Array<{ id: string; name: string; created_at: string }>;
}FoundingCohortBackfillResult
export interface FoundingCohortBackfillResult {
awarded_count: number;
total_members: number;
scanned: number;
}FoundingCohortAuditEntry
export interface FoundingCohortAuditEntry {
id: string;
buddy_id: string;
source: 'real_time' | 'backfill';
awarded_at: string;
title_label: string | null;
}FlashSaleStatus
export type FlashSaleStatus =
| 'scheduled'
| 'running'
| 'ended'
| 'cancelled';FlashSaleSelectionMode
export type FlashSaleSelectionMode = 'random' | 'curated';FlashSale
A marketplace flash sale as seen on the tenant admin (Planner) surface.
export interface FlashSale {
id: string;
customer_id: string;
name: string;
starts_at: string;
duration_minutes: number;
discount_percent: number;
item_selection_mode: FlashSaleSelectionMode;
curated_item_ids: string[] | null;
status: FlashSaleStatus;
affected_item_ids: string[] | null;
ends_at: string | null;
created_at: string;
updated_at: string;
}ScheduleFlashSaleParams
export interface ScheduleFlashSaleParams {
name: string;
/** ISO 8601 — must be a future time. */
startsAt: string;
/** 5–1440 minutes. Defaults to 60. */
durationMinutes?: number;
/** 1–90 percent. Defaults to 50. */
discountPercent?: number;
/** `random` lets the cron pick 5 items; `curated` uses `curatedItemIds`. */
itemSelectionMode?: FlashSaleSelectionMode;
/** Required (non-empty) when `itemSelectionMode` is `curated`. */
curatedItemIds?: string[];
signal?: AbortSignal;
}LotteryCadence
export type LotteryCadence = 'weekly' | 'monthly';LotteryEligibilityRule
When a buddy is entered: M events of a type within a rolling N-day window.
export interface LotteryEligibilityRule {
/** Event type that counts — `*` matches every ingested event. */
event_type: string;
min_count: number;
window_days: number;
}LotteryPrizeTier
One prize tier — winners_count buddies share it.
export interface LotteryPrizeTier {
type: 'item' | 'coins' | 'badge';
/** Item key/id or badge key — required for `item` and `badge`. */
ref?: string | null;
/** Coin amount — required for `coins`. */
amount?: number | null;
winners_count: number;
}LotteryDrawSchedule
Structured draw schedule — wall-clock time in the definition timezone.
export interface LotteryDrawSchedule {
/** 0=Sun..6=Sat — weekly cadence. */
day_of_week?: number;
/** 1..28 — monthly cadence. */
day_of_month?: number;
hour: number;
minute: number;
}LotteryDefinition
A lottery definition on the tenant admin surface.
export interface LotteryDefinition {
id: string;
customer_id: string;
name: string;
eligibility_rule: LotteryEligibilityRule;
cadence: LotteryCadence;
prize_pool: LotteryPrizeTier[];
draw_at: LotteryDrawSchedule;
tz: string;
active: boolean;
created_at: string;
updated_at: string;
}LotteryResolvedPrize
A prize tier resolved onto a specific winning entry.
export interface LotteryResolvedPrize {
buddy_id: string;
entry_id: string;
prize: LotteryPrizeTier;
}LotteryDraw
A resolved period draw.
export interface LotteryDraw {
id: string;
lottery_definition_id: string;
period_key: string;
period_start: string;
period_end: string;
drawn_at: string;
winner_entry_ids: string[];
total_entries: number;
prize_resolved: LotteryResolvedPrize[];
seed: string;
}LotteryNextDrawPreview
The live "Next draw" preview card.
export interface LotteryNextDrawPreview {
current_period_key: string;
current_period_entries: number;
next_draw_at: string;
}SimulatedLotteryDraw
A non-persisted simulated draw.
export interface SimulatedLotteryDraw {
total_entries: number;
seed: string;
winners: LotteryResolvedPrize[];
}CreateLotteryParams
export interface CreateLotteryParams {
name: string;
eligibilityRule: LotteryEligibilityRule;
cadence: LotteryCadence;
prizePool: LotteryPrizeTier[];
drawAt: LotteryDrawSchedule;
/** IANA timezone for the draw schedule. Defaults to `UTC`. */
tz?: string;
active?: boolean;
signal?: AbortSignal;
}UpdateLotteryParams
export type UpdateLotteryParams = Partial<CreateLotteryParams>;EventBadgeCondition
The eligibility condition a campaign checks against the triggering event.
logged_in_during_window — any activity inside the window earns the badge
(the broadest mode); event_type — only a specific event type earns it.
export type EventBadgeCondition =
| { type: 'logged_in_during_window' }
| { type: 'event_type'; event_type: string };EventBadgeNarrativeCallout
Bilingual reveal copy shown in the badge tooltip.
export interface EventBadgeNarrativeCallout {
tr?: string;
en?: string;
}EventBadgeDefinition
An event-triggered badge campaign as returned by create / update.
export interface EventBadgeDefinition {
id: string;
customer_id: string;
badge_key: string;
trigger_window_start: string;
trigger_window_end: string;
condition: EventBadgeCondition;
narrative_callout: EventBadgeNarrativeCallout;
enabled: boolean;
created_at: string;
updated_at: string;
}EventBadgeCampaign
A campaign enriched with the badge label and its grant count (list view).
export interface EventBadgeCampaign extends EventBadgeDefinition {
badge_name: string | null;
grant_count: number;
}CreateEventBadgeParams
export interface CreateEventBadgeParams {
/** Badge key — resolved per-buddy by audience + config version at grant time. */
badgeKey: string;
/** ISO-8601 — the campaign window opens. */
triggerWindowStart: string;
/** ISO-8601 — the campaign window closes. Must be after the start. */
triggerWindowEnd: string;
/** Defaults to `{ type: 'logged_in_during_window' }`. */
condition?: EventBadgeCondition;
narrativeCallout?: EventBadgeNarrativeCallout;
enabled?: boolean;
signal?: AbortSignal;
}UpdateEventBadgeParams
export type UpdateEventBadgeParams = Partial<CreateEventBadgeParams>;ProfileSlot
The fixed layout slots a profile page composes into.
export type ProfileSlot = 'header' | 'hero' | 'left' | 'right' | 'footer';WidgetSpec
One placed widget — a catalog key plus its props.
export interface WidgetSpec {
widget_key: string;
props: Record<string, unknown>;
}ProfileTemplateLayout
A full profile layout — a versioned widget tree keyed by slot.
export interface ProfileTemplateLayout {
version: number;
slots: Record<ProfileSlot, WidgetSpec[]>;
}ProfileTemplateSource
The built-in starting point a custom template was forked from.
export type ProfileTemplateSource =
| 'minimal'
| 'showcase_heavy'
| 'mission_driven'
| 'showcase_mentor'
| 'custom';ProfileTemplate
A tenant-authored profile-page template.
export interface ProfileTemplate {
id: string;
customer_id: string | null;
name: string;
source_template: ProfileTemplateSource;
layout: ProfileTemplateLayout;
theme_overrides: Record<string, string> | null;
is_default: boolean;
created_at: string;
updated_at: string;
}SystemProfileTemplate
A built-in system template — global, forkable, never edited in place.
export interface SystemProfileTemplate {
source_template: Exclude<ProfileTemplateSource, 'custom'>;
name: string;
description: string;
layout: ProfileTemplateLayout;
}ProfileTemplateList
The gallery payload: code-defined system templates + the tenant's own.
export interface ProfileTemplateList {
system: SystemProfileTemplate[];
custom: ProfileTemplate[];
}CreateProfileTemplateParams
export interface CreateProfileTemplateParams {
name: string;
/** The built-in starting point this template was forked from. */
sourceTemplate: ProfileTemplateSource;
/** The widget composition — `{ version, slots }`. Normalized server-side. */
layout: ProfileTemplateLayout;
themeOverrides?: Record<string, string> | null;
/** Make this the tenant default — unsets any previous default. */
isDefault?: boolean;
signal?: AbortSignal;
}UpdateProfileTemplateParams
export type UpdateProfileTemplateParams = Partial<
Omit<CreateProfileTemplateParams, 'sourceTemplate'>
>;BulkApplyTarget
Who a bulk-apply targets — all buddies, or a single audience.
export type BulkApplyTarget =
| { type: 'all' }
| { type: 'audience'; audience: string };BulkApplyProfileTemplateParams
export interface BulkApplyProfileTemplateParams {
/** The template to assign. */
templateId: string;
target: BulkApplyTarget;
signal?: AbortSignal;
}LeagueWidgetUnavailableReason
Why the league widget has nothing to show.
export type LeagueWidgetUnavailableReason =
| 'capability_off'
| 'no_active_season'
| 'not_enrolled';LeagueTierView
A tier rendered in the widget — banner colour + the next-tier target.
export interface LeagueTierView {
id: string;
name: string;
colorHex: string;
iconKey: string;
order: number;
}LeagueStandingRow
One row of the cohort standings the widget renders.
export interface LeagueStandingRow {
buddyId: string;
name: string;
imageUrl: string | null;
points: number;
rank: number;
isSelf: boolean;
}LeagueSelfStanding
The buddy's own season summary.
export interface LeagueSelfStanding {
buddyId: string;
name: string;
points: number;
rank: number;
/** True when the buddy sits in the bottom quarter of the cohort. */
inDemotionZone: boolean;
}LeagueSeasonView
The active season the buddy is competing in.
export interface LeagueSeasonView {
id: string;
seasonNumber: number;
name: string | null;
scheduledEndAt: string;
}LeagueWidgetSnapshot
The GET /widget/leagues/me payload. available: false is a normal
outcome (plan not entitled, no active season, or the buddy not enrolled) —
callers render nothing rather than treating it as an error.
export interface LeagueWidgetSnapshot {
available: boolean;
reason: LeagueWidgetUnavailableReason | null;
tier: LeagueTierView | null;
/** The tier one rung up — the promotion target. Null at the top tier. */
nextTier: LeagueTierView | null;
season: LeagueSeasonView | null;
cohortSize: number;
/** Top 5 of the cohort, plus the buddy's own row pinned if outside the top 5. */
standings: LeagueStandingRow[];
self: LeagueSelfStanding | null;
/** Advisory promotion threshold for the progress bar. */
minPointsForPromotion: number;
}LeagueSeasonHighlightKind
Which kind of season-closing highlight a scene represents.
export type LeagueSeasonHighlightKind =
| 'best_week'
| 'most_kudos_sent'
| 'most_items_collected'
| 'cohort_role';LeagueSeasonHighlight
One personalized season-closing highlight scene.
export interface LeagueSeasonHighlight {
kind: LeagueSeasonHighlightKind;
title: string;
value: number;
detail: string;
/** Standardised score within the cohort — the highest is the Brag pick. */
zScore: number;
}LeagueSeasonHighlightsSnapshot
The GET /widget/leagues/seasons/:id/highlights/me payload.
export interface LeagueSeasonHighlightsSnapshot {
available: boolean;
seasonId: string;
seasonNumber: number;
highlights: LeagueSeasonHighlight[];
topHighlightKind: LeagueSeasonHighlightKind | null;
outcome: 'promoted' | 'stayed' | 'demoted';
finalRank: number;
cohortSize: number;
shareCode: string | null;
}BossFightTargetMetric
The metric a Boss Fight counts toward its season-long target.
export type BossFightTargetMetric =
| 'skill_events'
| 'kudos_sent'
| 'items_collected';BossFightCopy
A Boss Fight's name or description copy (English-only).
export type BossFightCopy = string;BossFightLeaderRow
One row of the Boss Fight challenge leaderboard.
export interface BossFightLeaderRow {
buddyId: string;
name: string;
imageUrl: string | null;
progressValue: number;
/** Set once the buddy clears the boss, in completion order (1 = first). */
completedRank: number | null;
isSelf: boolean;
}BossFightProgressView
The GET /widget/leagues/boss-fight payload — F4.2 Seasonal Challenge.
available: false is a normal outcome (no active season, no boss fight on
it, or the buddy not enrolled) — callers render nothing.
export interface BossFightProgressView {
available: boolean;
seasonId: string | null;
seasonNumber: number | null;
name: BossFightCopy | null;
description: BossFightCopy | null;
targetMetric: BossFightTargetMetric | null;
targetValue: number;
/** The requesting buddy's accumulated progress. */
selfProgress: number;
/** The buddy's completion rank, or null if the boss is not yet cleared. */
selfCompletedRank: number | null;
/** When the boss-fight season closes (ISO) — the challenge deadline. */
endsAt: string | null;
/** Top finishers by progress. */
leaderboard: BossFightLeaderRow[];
}HexadType
export type HexadType =
| 'philanthropist'
| 'socialiser'
| 'free_spirit'
| 'achiever'
| 'player'
| 'disruptor';HexadSurveyQuestion
A single survey question as advertised to the widget.
export interface HexadSurveyQuestion {
/** Stable key — `q1..q24` in the default catalog. */
key: string;
/** Which Hexad axis the answer feeds. */
axis: HexadType;
/** When true, the scorer flips the Likert direction (1↔5). */
reverse?: boolean;
}HexadSurveyQuestionsResponse
export interface HexadSurveyQuestionsResponse {
/** Current consent version — re-stamp by submitting a fresh response. */
consent_version: string;
questions: HexadSurveyQuestion[];
}HexadAnswerMap
Map of questionKey -> Likert (1..5).
export interface HexadAnswerMap {
[questionKey: string]: number;
}SubmitHexadSurveyParams
export interface SubmitHexadSurveyParams {
answers: HexadAnswerMap;
/** Consent version the buddy is explicitly acknowledging. */
consentVersion: string;
signal?: AbortSignal;
}HexadSurveySubmitResult
export interface HexadSurveySubmitResult {
primary_type: HexadType;
derived_scores: Record<HexadType, number>;
consent_version: string;
/** ISO timestamp — raw row is purged on/after this date. */
retention_expires_at: string;
}HexadSurveyMyResponse
export interface HexadSurveyMyResponse {
response: {
primary_type: HexadType;
derived_scores: Record<HexadType, number>;
consent_version: string;
retention_expires_at: string;
responded_at: string;
} | null;
}AuthMethod
export type AuthMethod = 'api_key' | 'dashboard_jwt';ApiKeyType
export type ApiKeyType = 'secret' | 'publishable';PlanKey
export type PlanKey = 'starter' | 'growth' | 'pro' | 'enterprise';ApiKeySummary
export interface ApiKeySummary {
id: string;
label: string | null;
keyType: ApiKeyType;
scopes: string[];
lastUsedAt: string | null;
createdAt: string;
}WhoamiResult
export interface WhoamiResult {
customerId: string;
customerName: string;
plan: PlanKey;
/** Capability flags currently entitled by the customer's plan. */
capabilities: string[];
/** Whether the caller authenticated with an API key or a dashboard JWT. */
authMethod: AuthMethod;
/** Null when authenticating with a dashboard JWT. */
apiKey: ApiKeySummary | null;
workspaceRef: string;
}Notification
One in-app notification, as the banner widget renders it.
export interface Notification {
id: string;
/** The emitter's notification type key (e.g. `streak_watchdog`). */
type: string;
/** Display severity — drives the banner's accent treatment. */
severity: string;
title: string;
body: string;
/** Icon key the widget maps to its glyph set. */
icon: string;
ctaUrl: string | null;
ctaLabel: string | null;
/** When the notification self-expires, or null when it never does. */
expiresAt: string | null;
readAt: string | null;
dismissedAt: string | null;
metadata: Record<string, unknown>;
createdAt: string;
}NotificationFeedPage
export interface NotificationFeedPage {
notifications: Notification[];
/** Opaque cursor for the next page, or null when the feed is exhausted. */
nextCursor: string | null;
/** Unread, non-dismissed count — folded in so the badge needs one poll. */
unreadCount: number;
/** When the buddy's vacation pause lifts, or null when not paused. */
pausedUntil: string | null;
}ListNotificationsParams
export interface ListNotificationsParams {
/** Opaque cursor from a previous page's `nextCursor`. */
cursor?: string;
/** Page size — clamped server-side. */
limit?: number;
/** Include already-read notifications in the feed (default false). */
includeRead?: boolean;
signal?: AbortSignal;
}UnreadCountResult
export interface UnreadCountResult {
unreadCount: number;
}DismissAllResult
export interface DismissAllResult {
/** How many notifications were read + dismissed by the sweep. */
dismissed: number;
}DismissResult
export interface DismissResult {
dismissed: true;
}MysteryBoxReward
A resolved Mystery Box reward. The pool is coins-only today, so type is
always coins; is_lucky is true when the draw landed in the rare tier.
export interface MysteryBoxReward {
type: 'coins';
amount: number;
isLucky: boolean;
}MysteryBoxState
The GET /widget/mystery-box/state payload. locked: true means the
tenant's plan does not entitle the box — the widget renders nothing rather
than treating it as an error.
export interface MysteryBoxState {
locked: boolean;
eligible: boolean;
/** Midnight UTC that opens the next claim, or null when eligible now. */
nextEligibleAt: string | null;
/** The most recent reward this buddy drew, or null if never opened. */
lastReward: MysteryBoxReward | null;
}MysteryBoxClaimResult
The POST /widget/mystery-box/claim payload.
export interface MysteryBoxClaimResult {
reward: MysteryBoxReward;
claimedAt: string;
}NarrativeProposalStatus
Lifecycle of a Council narrative proposal.
export type NarrativeProposalStatus =
| 'pending'
| 'approved'
| 'rejected'
| 'live';Proposal
One narrative proposal authored by a Council member.
export interface Proposal {
id: string;
proposerBuddyId: string;
/** The narrative slot the copy targets (e.g. `level_up_copy_stage_3`). */
targetSlot: string;
proposedText: string;
status: NarrativeProposalStatus;
reviewerNote: string | null;
reviewedAt: string | null;
createdAt: string;
}MyProposalsView
The GET /widget/council/proposals/mine payload. When the buddy is not a
Council member (or the tenant is not entitled), is_council_member is false
and the quota fields are zeroed — the widget renders its locked state.
export interface MyProposalsView {
isCouncilMember: boolean;
/** Narrative stages open to Council proposals. */
allowedStages: number[];
/** Proposals the buddy may submit per ISO week. */
weeklyLimit: number;
usedThisWeek: number;
proposals: Proposal[];
}SubmitProposalParams
export interface SubmitProposalParams {
/** The narrative slot key to target (e.g. `level_up_copy_stage_3`). */
targetSlot: string;
proposedText: string;
signal?: AbortSignal;
}FreeLunchNotification
The GET /widget/free-lunch/notification payload. When there is nothing to
show, has_pending is false and the reward fields are absent — the widget
renders no banner.
export interface FreeLunchNotification {
hasPending: boolean;
/** The grant to acknowledge once the banner is shown. */
grantId?: string;
/** The coin amount the welcome credit granted. */
amount?: number;
/** Tenant-configured banner copy. */
calloutCopy?: string;
}FreeLunchAcknowledgeResult
export interface FreeLunchAcknowledgeResult {
/** False when the grant was already acknowledged or did not match. */
acknowledged: boolean;
}BeginnersLuckAwardedItem
The collectible a Beginner's Luck winner is awarded.
export interface BeginnersLuckAwardedItem {
id: string;
name: string;
thumbnailUrl: string | null;
rarityLabel: string;
}BeginnersLuckResult
The GET /widget/beginners-luck/result payload. The reveal is winner-only:
losers and a disabled feature both resolve to won: false with no awarded
item or copy.
export interface BeginnersLuckResult {
won: boolean;
awardedItem: BeginnersLuckAwardedItem | null;
calloutCopy: string | null;
}RecordWidgetRenderedParams
export interface RecordWidgetRenderedParams {
/** Widget mount IDs that rendered successfully on this page view. */
widgets?: string[];
/** Loader semantic version. */
loaderVersion?: string;
/** Opaque loader build identifier. */
buildId?: string;
signal?: AbortSignal;
}WidgetRenderedResult
export interface WidgetRenderedResult {
ok: true;
/** True only for the first production render event accepted for the workspace. */
first: boolean;
/** Present when the server accepts but intentionally ignores the beacon. */
skipped?: 'preview';
}KnownErrorCode
Union of every known error code string. Use this when annotating your own switch statement's exhaustiveness:
function handle(code: KnownErrorCode) { switch (code) { ... } }Unknown codes (e.g. ones added server-side between SDK releases) still
arrive on HatchedError.code as plain strings; this union covers only
what the current SDK knows about.
export type KnownErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];paths
Auto-generated from apps/api/openapi.public.json.
Do NOT edit by hand — run pnpm --filter @hatched/sdk-js generate:types
after a contract change. The CI check:types step fails if this file
drifts from the committed openapi.public.json.
export type paths = {
"/customers/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["CustomersController_getProfile"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch: operations["CustomersController_updateProfile"];
trace?: never;
};
"/customers/me/referral": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the current workspace referral link
* @description Returns a referral link only after activation has reached first widget render. Referred signups grant promo AI credits to both workspaces.
*/
get: operations["CustomersController_getReferral"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/settings": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch: operations["CustomersController_updateSettings"];
trace?: never;
};
"/customers/me/widget-theme/suggest": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Suggest widget theme customization
* @description Drafts widget CSS variables and starter custom CSS from the customer visual theme. The dashboard applies it as an editable draft.
*/
post: operations["CustomersController_suggestWidgetTheme"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/audiences": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Replace the customer audience list
* @description Defines 1..5 rol-based audiences. Removing an audience that still has buddies returns 409 audience_in_use.
*/
patch: operations["CustomersController_updateAudiences"];
trace?: never;
};
"/customers/me/assets/regenerate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Bulk regenerate AI assets
* @description Flips every non-uploaded badge + item to pending and enqueues icon/image generation jobs. Use mode=missing to queue only failed/missing assets. Uploaded (manual) assets are skipped.
*/
post: operations["CustomersController_regenerateAssets"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/users/{user_id}/data": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete: operations["CustomersController_deleteUserData"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/feature-toggles": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant feature toggle state
* @description Returns the effective toggle state (registry defaults merged with tenant overrides), the published map, and any pending draft. Drives the Gamification Planner.
*/
get: operations["CustomerFeatureToggleController_getState"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update tenant feature toggles
* @description Merges a partial toggle map into the tenant state. `mode: "draft"` keeps the change in a draft column; `mode: "publish"` writes through to the live `feature_toggles`.
*/
patch: operations["CustomerFeatureToggleController_updateToggles"];
trace?: never;
};
"/customers/me/octalysis-state": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant Octalysis aggregate state
* @description Returns effective toggles plus radar, hat balance, and brain balance aggregates. Cached for 60 seconds and invalidated by toggle writes.
*/
get: operations["CustomerFeatureToggleController_getOctalysisState"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/feature-toggles/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Publish the pending draft toggle map
* @description Promotes `feature_toggles_draft` to `feature_toggles` atomically and clears the draft.
*/
post: operations["CustomerFeatureToggleController_publishDraft"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/feature-toggles/draft": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Discard the pending draft toggle map
* @description Clears `feature_toggles_draft` without affecting the published state.
*/
delete: operations["CustomerFeatureToggleController_discardDraft"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/feature-config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant feature_config blob
* @description Returns customer-scoped configuration for every Planner-managed feature, with zod defaults applied for keys the admin has not touched.
*/
get: operations["CustomerFeatureToggleController_getFeatureConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/feature-config/{feature_key}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update one feature_config block
* @description Validates the body against the schema registered for `feature_key` and persists the parsed result.
*/
patch: operations["CustomerFeatureToggleController_updateFeatureConfig"];
trace?: never;
};
"/customers/me/narrative": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant narrative state
* @description Returns the effective (published, resolved over Hatched defaults) narrative, the raw published blob, and any pending draft.
*/
get: operations["CustomerNarrativeController_getNarrative"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update the tenant narrative
* @description Merges a partial narrative patch. `mode: "draft"` keeps the change in `narrative_draft`; `mode: "publish"` writes through to `narrative` and busts the widget caches. Every changed field is recorded in the narrative audit log.
*/
patch: operations["CustomerNarrativeController_updateNarrative"];
trace?: never;
};
"/customers/me/narrative/audit": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List narrative copy change history
* @description Returns the most recent narrative field changes (B2B compliance). Filter by `field` (dot-notation path); `limit` defaults to 50, capped at 200.
*/
get: operations["CustomerNarrativeController_getNarrativeAudit"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/mission-anchor-config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the Mission Anchor admin config
* @description Returns the resolved Mission Anchor policy — per-widget visibility, modal toggles, theme override, and the A/B test on the short copy.
*/
get: operations["CustomerMissionAnchorController_getConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update the Mission Anchor admin config
* @description Merges a partial config patch. Each section present in the body (`visibility`, `modal`, `theme_override`, `ab_test`) replaces that section wholesale; missing sections are left untouched. Busts the widget cache.
*/
patch: operations["CustomerMissionAnchorController_updateConfig"];
trace?: never;
};
"/customers/me/onboarding/six-d": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant 6D wizard state
* @description Returns `null` when the tenant has not run the wizard yet; otherwise the full validated `six_d` config (objectives → fun + completed_at).
*/
get: operations["SixDWizardController_get"];
put?: never;
/**
* Apply the full 6D wizard payload
* @description Writes through to `customers.feature_config.six_d`, optionally seeds the toggle draft with the wizard-recommended features, and records `six_d_wizard_applied` in the admin audit log. Completing the wizard also counts as onboarding: a first-time completion sets `preset_plan` and publishes a minimal config version, so login skips /onboarding/start and `POST /players/zero` works immediately. Re-applies never create extra config versions.
*/
post: operations["SixDWizardController_apply"];
delete?: never;
options?: never;
head?: never;
/**
* Patch one or more 6D wizard sections
* @description Merges the partial payload over the current config, re-validates the full shape, and records `six_d_wizard_patched` in the admin audit log. Returns the new full config.
*/
patch: operations["SixDWizardController_patch"];
trace?: never;
};
"/customers/me/onboarding/six-d/skip": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* HTCH-137 — Expert skip
* @description Marks the wizard (at /onboarding/six-d) as completed with an empty objective set; the Planner then shows audience-only recommendations. Counts as onboarding the same way a full apply does (sets `preset_plan`, publishes a minimal config version). Records `six_d_wizard_skipped` in the audit log.
*/
post: operations["SixDWizardController_skip"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/onboarding/six-d/audit": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* HTCH-137 — Audit timeline
* @description Returns the most recent `six_d_wizard_*` audit log entries for this tenant. Powers the wizard history timeline in Planner Insights.
*/
get: operations["SixDWizardController_audit"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/onboarding/six-d/drift-stats": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* HTCH-137 — Config drift stats
* @description Returns the `six_d_wizard_applied` count over the last 30 days and a `drift_detected` flag (>= 3 reapplies).
*/
get: operations["SixDWizardController_driftStats"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/register": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Register a new customer account */
post: operations["AuthController_register"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/login": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Authenticate and obtain a JWT token */
post: operations["AuthController_login"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/sso/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Return public dashboard SSO configuration */
get: operations["AuthController_getSsoConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/sso/start": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Start dashboard SSO via generic OIDC */
get: operations["AuthController_startSso"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/sso/callback": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Complete dashboard SSO callback from OIDC provider */
get: operations["AuthController_completeSso"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/password/change": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Change the current dashboard account password */
post: operations["AuthController_changePassword"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/password/reset/request": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Request a dashboard password reset token */
post: operations["AuthController_requestPasswordReset"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/password/reset": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Reset dashboard password with a one-time token */
post: operations["AuthController_resetPassword"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/email/verify": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Verify dashboard account email with a one-time token */
post: operations["AuthController_verifyEmail"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/email/verification/request": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Request a fresh dashboard email verification link */
post: operations["AuthController_requestEmailVerification"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get the currently authenticated customer profile */
get: operations["AuthController_me"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/api-keys/whoami": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Return the identity, plan, capabilities, and scopes of the calling credential
* @description Use this to validate an API key during onboarding/CI without performing a side-effectful call. For dashboard JWT auth, the api_key field is null. For secret API keys, scopes is an empty array (full surface). For publishable keys, scopes carries the publishable-scope list.
*/
get: operations["AuthController_whoami"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/api-keys": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List all active API keys for the current customer */
get: operations["AuthController_listApiKeys"];
put?: never;
/** Create a new API key */
post: operations["AuthController_createApiKey"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/api-keys/rotate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Rotate API keys by revoking all existing keys and creating a new one */
post: operations["AuthController_rotateApiKey"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/api-keys/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Revoke an API key by its ID */
delete: operations["AuthController_revokeApiKey"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/publishable-keys": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Issue a browser-safe publishable key (hatch_pk_*) with a scoped set of permissions. */
post: operations["AuthController_createPublishableKey"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/operations/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get an operation by its ID */
get: operations["OperationsController_findOne"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/operations": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List operations with optional type and status filters */
get: operations["OperationsController_findAll"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/operations/{id}/cancel": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Cancel a pending or processing operation */
post: operations["OperationsController_cancel"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget-sessions/preview": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Create automatic dashboard preview tokens
* @description Finds the current customer’s latest active buddy and returns short-lived tokens for the widget customization preview.
*/
get: operations["WidgetSessionsController_createPreviewTokens"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/players/zero": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Read Player Zero status without provisioning it
* @description Returns whether the workspace demo player exists and whether a hatch ceremony has completed for any buddy in the workspace. Read-only — never creates the player. Powers the activation checklist "Hatch your buddy" step.
*/
get: operations["WidgetSessionsController_getPlayerZeroStatus"];
put?: never;
/**
* Create or get the workspace demo player (Player Zero)
* @description Idempotently provisions a canonical demo buddy ("Player Zero", user_id "player-0") for the current workspace, bound by every dashboard widget preview. Instant — uses a preset Fern sprite instead of the async AI image pipeline. It does not publish Planner drafts; preview tokens read drafts separately.
*/
post: operations["WidgetSessionsController_createPlayerZero"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/embed-tokens": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Create embed token
* @description Generate a read-only embed token for widget rendering
*/
post: operations["WidgetSessionsController_createEmbedToken"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget-sessions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Create session token
* @description Create an interactive widget session with scoped permissions
*/
post: operations["WidgetSessionsController_createSessionToken"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget-sessions/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Revoke widget session
* @description Revoke an active widget session by ID
*/
delete: operations["WidgetSessionsController_revokeSession"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget-sessions/verify-installation": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Verify widget installation
* @description Server-side fetches a page and reports whether the Hatched loader snippet is present in the served HTML. Falls back to the first configured allowed origin when no URL is supplied.
*/
post: operations["WidgetSessionsController_verifyInstallation"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget buddy
* @description Returns buddy canonical state along with widget configuration
*/
get: operations["WidgetApiController_getBuddy"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/share": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Mint (or fetch) the public share link for the widget buddy
* @description Returns { enabled, share_code, share_url, card_url }. Mints the code on first call. Pass ?channel= to also log the share to that channel.
*/
post: operations["WidgetApiController_createShareLink"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/share/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Record a share-sheet funnel event (opened) */
post: operations["WidgetApiController_recordShareEvent"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/hatched": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Record that the hatch ceremony completed for the widget buddy
* @description HTCH — persists `hatch_ceremony_seen` so read-only previews and re-mounts render the hatched buddy instead of replaying the egg ceremony. Requires an interactive session with events:track. Idempotent; the buddy widget calls it once the celebration beat settles.
*/
post: operations["WidgetApiController_markBuddyHatched"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/seo": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Set the per-buddy search-indexing preference
* @description HTCH-66 — lets the end-user keep their public share page out of (or in) search engines. Omit `public_search_indexable` to inherit the tenant default.
*/
patch: operations["WidgetApiController_updateBuddySeo"];
trace?: never;
};
"/widget/buddy/profile": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update the buddy public Profile Page preferences
* @description HTCH-101 — toggles, per buddy, whether the public Profile Page shows the "Champion of Season N" Hall of Fame trophies.
*/
patch: operations["WidgetApiController_updateBuddyProfile"];
trace?: never;
};
"/widget/state": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get aggregate widget state
* @description Single-request snapshot of everything a mounted widget set needs: buddy canonical state, badge catalog, and any async operations still pending for the buddy. Responds with an ETag — send it back via If-None-Match to get a 304 when nothing changed.
*/
get: operations["WidgetApiController_getState"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/narrative": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant narrative
* @description Returns the published tenant narrative resolved over the Hatched defaults — the 5-act hatch ceremony copy, evolution level-up copy, win-state meaning templates, and mission fields. Cached server-side for 5 minutes.
*/
get: operations["WidgetApiController_getNarrative"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/narrative/arc": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the Program Chapters arc
* @description HTCH-15x — Yu-kai #10 Narrative. Returns the workspace program-chapter arc: authored chapters (empties dropped) plus each chapter’s reveal state, where a chapter is revealed once the workspace wins a group-quest tagged with its key. `available:false` → the arc is disabled or has no authored chapter and the widget renders nothing. Cached server-side for 5 minutes.
*/
get: operations["WidgetApiController_getNarrativeArc"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mission-anchor": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the Mission Anchor payload
* @description HTCH-35 — the persistent CD1 mission badge for widget chrome. Returns the (A/B-resolved) short copy, the full mission, the user’s weekly contribution, and the admin anchor config. `anchor_config` is null when the mission_anchor feature is off — the widget then skips the mount.
*/
get: operations["WidgetApiController_getMissionAnchor"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/rendered": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Record a successful widget render
* @description Loader-level activation beacon. Requires only a valid widget token, not events:track scope, and does not consume customer event quota. Preview tokens are ignored so dashboard previews do not claim production activation.
*/
post: operations["WidgetApiController_recordRendered"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/track": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Track event from browser
* @description Browser-safe event ingestion. Derives user_id and audience from the widget token, so the browser only supplies type + optional properties. Returns the same effects payload as the server-to-server ingest so widgets can apply it optimistically.
*/
post: operations["WidgetApiController_trackEvent"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget marketplace
* @description Returns marketplace items visible to the buddy, with ownership and lock status
*/
get: operations["WidgetApiController_getMarketplace"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/items/{id}/track-view": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Track marketplace item impression
* @description Records an impression each time a widget surfaces an item. Feeds the marketplace funnel analytics. Fire-and-forget from the widget — never blocks the user flow.
*/
post: operations["WidgetApiController_trackMarketplaceItemView"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/purchase": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Purchase item
* @description Purchase a marketplace item using coins. Requires marketplace:purchase scope.
*/
post: operations["WidgetApiController_purchaseItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/equip": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Equip or unequip items
* @description Equip or unequip items on the buddy. Requires items:equip scope.
*/
post: operations["WidgetApiController_equipItems"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/appearance/rerender": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Rerender stage base
* @description Regenerate the buddy’s bare stage image. Use when appearance.status is "failed" with code="needs_rerender" or after a hard generation failure that left the base contaminated. Equipped items are cleared from the rendered set; the user can re-equip after status returns to "ready".
*/
post: operations["WidgetApiController_rerenderAppearance"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/preview-outfit": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Preview an outfit composition
* @description Returns the cached composite variant for a slot→item map, or kicks off a background composition job and returns status="pending". The buddy state is NOT mutated.
*/
post: operations["WidgetApiController_previewOutfit"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/composition-status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Poll an outfit composition variant
* @description Returns the current state of a buddy_image_variant row scoped to the current customer. Used by the dress-mode widget to swap the preview image once composition completes.
*/
get: operations["WidgetApiController_compositionStatus"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/outfits": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List saved outfits
* @description Returns the buddy’s saved outfits ordered by active-first then most-recent.
*/
get: operations["WidgetApiController_listOutfits"];
put?: never;
/**
* Save a new outfit
* @description Persists a slot→item map under a user-supplied name. Cap is driven by marketplace_dress.outfit_limit_per_buddy.
*/
post: operations["WidgetApiController_saveOutfit"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/outfits/{id}/activate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Activate a saved outfit
* @description Marks the outfit active and delegates to the equip pipeline so the buddy’s composite stays in lockstep.
*/
patch: operations["WidgetApiController_activateOutfit"];
trace?: never;
};
"/widget/marketplace/outfits/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Delete a saved outfit
* @description Removes the outfit row for the current widget buddy.
*/
delete: operations["WidgetApiController_deleteOutfit"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/badges": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget badge catalog
* @description Returns the buddy’s earned badges plus locked definitions with progress hints. HTCH-16: locked badges default-on so the collection grid surfaces "to go" tiles; pass `include_locked=false` to suppress them for tight embedded surfaces.
*/
get: operations["WidgetApiController_getBadges"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/path": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the active path for the buddy’s audience
* @description Resolves the audience’s currently active path definition and returns the buddy-scoped runtime payload (locked/available/completed sub-step states + current_step_key). Returns `null` when no path is active for this audience.
*/
get: operations["WidgetApiController_getActivePath"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/path/{key}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get a specific path for a buddy
* @description Forces the runtime payload for a specific path key (caller-driven mount), independent of which path is currently active.
*/
get: operations["WidgetApiController_getPathByKey"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/path/{key}/sub-steps/{subKey}/complete": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Manually mark a sub-step complete
* @description Idempotent on (buddy, sub-step). Only succeeds for sub-steps where allow_manual_complete=true. Returns the cascade flags so the widget can paint step.completed / path.completed celebrations without an extra fetch.
*/
post: operations["WidgetApiController_completePathSubStep"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/streak/{key}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget streak
* @description Returns the current streak progress for a specific admin-defined streak key. The widget instance mounts with data-streak-key="..." to select which streak it renders.
*/
get: operations["WidgetApiController_getStreak"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/evolutions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget evolution timeline
* @description Returns the stage-transition history for the current buddy, newest first. Covers prod, auto-evolve, and demo paths.
*/
get: operations["WidgetApiController_getEvolutions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/tokens": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the buddy’s token wallet
* @description Returns the spendable primary balance (coins) plus every active progression-token balance for the buddy’s audience. Used by the tokens widget to render a multi-currency wallet card.
*/
get: operations["WidgetApiController_getTokens"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/operations/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get widget operation
* @description Get the status of an async operation for the current buddy
*/
get: operations["WidgetApiController_getOperation"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/theme": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Live widget theme
* @description Returns the customer's authoritative widget theme (vars, custom CSS, size). Loader uses this to keep the deployed snippet in sync with Widget Studio without manual re-deploys.
*/
get: operations["WidgetApiController_getLiveTheme"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/next-best-action": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the single next-best-action recommendation
* @description HTCH-26 — Yu-kai #28 Desert Oasis. Runs eight strategies, applies tenant overrides (enable per kind, priority multiplier, copy override), and returns the winning action plus a `fallback_used` flag (true when the try_new_outfit strategy fired because nothing higher-priority matched). Cached per buddy for 30 seconds.
*/
get: operations["WidgetApiController_getNextBestAction"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/presets": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List presets
* @description List all available presets with summaries
*/
get: operations["PresetsController_listPresets"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/presets/{key}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get preset
* @description Get full preset configuration by key
*/
get: operations["PresetsController_getPreset"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/apply-preset": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Apply preset
* @description Apply a preset configuration to the authenticated customer
*/
post: operations["PresetsController_applyPreset"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/config-versions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List config versions
* @description List all config versions for the customer
*/
get: operations["ConfigVersionsController_findAll"];
put?: never;
/**
* Create or open the draft config version
* @description Idempotent for the "open a draft to edit" intent: with no (or an empty) snapshot it returns the existing unpublished draft if one exists, otherwise creates one. A non-empty snapshot is a deliberate create. This stops the dashboard "New draft" button (and any double-click) from 400-ing with "An unpublished draft already exists".
*/
post: operations["ConfigVersionsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/config-versions/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get config version
* @description Get a single config version by ID
*/
get: operations["ConfigVersionsController_findById"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update config version
* @description Update a draft config version
*/
patch: operations["ConfigVersionsController_update"];
trace?: never;
};
"/config-versions/{id}/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Publish config version
* @description Publish a draft config version, making it the active configuration
*/
post: operations["ConfigVersionsController_publish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/config-versions/{id}/impact": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Preview config impact
* @description Get an impact preview for a draft config version before publishing
*/
get: operations["ConfigVersionsController_getImpact"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/config-versions/{id}/clone": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Clone config version
* @description Create a new draft from an existing config version
*/
post: operations["ConfigVersionsController_clone"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/config-versions/{id}/migrate-buddies": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Migrate buddies
* @description Re-point active buddies to a published config version
*/
post: operations["ConfigVersionsController_migrateBuddies"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/eggs": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List eggs with optional user and status filters */
get: operations["EggsController_findAll"];
put?: never;
/** Create a new egg for a user */
post: operations["EggsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/eggs/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get an egg by its ID */
get: operations["EggsController_findById"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/eggs/{id}/status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update an egg status to ready or cancelled */
patch: operations["EggsController_updateStatus"];
trace?: never;
};
"/eggs/{id}/hatch": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Start the asynchronous hatch process for an egg */
post: operations["EggsController_hatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List buddies with pagination and optional filters */
get: operations["BuddiesController_findAll"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/users/{user_id}/summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get a user summary including buddy count, coins, and badges */
get: operations["BuddiesController_getUserSummary"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get buddy details with full canonical state */
get: operations["BuddiesController_findById"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update a buddy name */
patch: operations["BuddiesController_update"];
trace?: never;
};
"/buddies/{id}/archive": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Archive a buddy (one-way transition from active to archived) */
patch: operations["BuddiesController_archive"];
trace?: never;
};
"/buddies/{id}/skills": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update buddy skill levels (increase, decrease, or set) */
patch: operations["BuddiesController_updateSkills"];
trace?: never;
};
"/buddies/{buddy_id}/coins": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Earn coins for a buddy (supports idempotency) */
post: operations["BuddiesController_earnCoins"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/coins/spend": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Spend coins for a buddy (supports idempotency) */
post: operations["BuddiesController_spendCoins"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/badges": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List all badges awarded to a buddy */
get: operations["BuddiesController_getBuddyBadges"];
put?: never;
/** Award a badge to a buddy */
post: operations["BuddiesController_awardBadge"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/evolution": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Check evolution readiness and progress for a buddy */
get: operations["BuddiesController_getEvolutionReadiness"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/evolve": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Trigger asynchronous buddy evolution */
post: operations["BuddiesController_evolve"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/purchase-item": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Purchase a marketplace item using coins (supports idempotency) */
post: operations["BuddiesController_purchaseItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/unlock-item": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Unlock an item without spending coins */
post: operations["BuddiesController_unlockItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/equipped-items": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Equip or unequip items on a buddy */
patch: operations["BuddiesController_equipItems"];
trace?: never;
};
"/buddies/{buddy_id}/appearance/rerender": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Regenerate the buddy stage base image */
post: operations["BuddiesController_rerenderAppearance"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/purchased-items": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List all purchased items for a buddy */
get: operations["BuddiesController_getPurchasedItems"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/tokens": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Typed token balances (primary + progression)
* @description Returns the buddy's balances grouped by token kind. Each slot is null if the customer has not configured that kind.
*/
get: operations["BuddiesController_getTokens"];
put?: never;
/** Earn or spend tokens for a buddy (supports idempotency) */
post: operations["BuddiesController_tokenTransaction"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/evolutions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Stage transition timeline for a buddy */
get: operations["BuddiesController_listEvolutions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/progression": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get buddy progression metrics (legacy endpoint) */
get: operations["BuddiesController_getProgressionLegacy"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/progression-metrics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get buddy progression metrics (lessons, quizzes, streaks, etc.) */
get: operations["BuddiesController_getProgression"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/users/{user_id}/summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["CustomersSummaryController_getUserSummary"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{id}/share": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Mint (or fetch) the public share link for a buddy */
post: operations["BuddyShareController_createShare"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{id}/share/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Record a share-sheet funnel event (opened / shared) */
post: operations["BuddyShareController_recordEvent"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddy-share/stats": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Rolling-window buddy-share funnel for the tenant */
get: operations["BuddyShareStatsController_getStats"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddy-share/settings": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Tenant buddy-share settings (toggles + resolved link origin) */
get: operations["BuddyShareStatsController_getSettings"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update buddy-share toggles (enabled / show_tenant_name / cta_url) */
patch: operations["BuddyShareStatsController_updateSettings"];
trace?: never;
};
"/public/b/{code}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Resolve a buddy share code to its public card data */
get: operations["PublicShareController_getPublicBuddy"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/b/{code}/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Record a share-page funnel event (viewed / cta_clicked) */
post: operations["PublicShareController_recordEvent"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/share-index": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List public share codes eligible for the sitemap (paged) */
get: operations["PublicShareIndexController_getShareIndex"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/p/{code}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Resolve a share code to the rich Profile Page v1 payload */
get: operations["ProfilePageController_getProfile"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-sets": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List all skill sets
* @description Returns all skill sets configured for the current customer.
*/
get: operations["SkillSetsController_findAll"];
put?: never;
/**
* Create a skill set
* @description Create a new skill set with one or more skill definitions.
*/
post: operations["SkillSetsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-sets/generate-icon": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Generate a skill icon with AI
* @description Runs the AI image pipeline to create a skill icon for the given label/description. Returns a stored icon URL, the generation prompt, and the recorded cost.
*/
post: operations["SkillSetsController_generateIcon"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-sets/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get a skill set
* @description Returns a single skill set by its ID, including all skill definitions.
*/
get: operations["SkillSetsController_findById"];
/**
* Update a skill set
* @description Update an existing skill set and its skill definitions by ID.
*/
put: operations["SkillSetsController_update"];
post?: never;
/**
* Delete a skill set
* @description Permanently delete a skill set. Fails if any buddies are currently using it.
*/
delete: operations["SkillSetsController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-rules": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List all skill rules
* @description Returns all skill rules configured for the current customer.
*/
get: operations["SkillRulesController_findAll"];
put?: never;
/**
* Create a skill rule
* @description Create a new skill rule that defines how skill XP is awarded for a specific trigger event.
*/
post: operations["SkillRulesController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-rules/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/**
* Update a skill rule
* @description Update an existing skill rule by ID.
*/
put: operations["SkillRulesController_update"];
post?: never;
/**
* Delete a skill rule
* @description Permanently delete a skill rule by ID.
*/
delete: operations["SkillRulesController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-rules/apply-theme-pack": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Apply a theme-aware skill-rule pack (HTCH-128)
* @description Appends a preset bundle of 3–6 skill rules (industry × theme_vibe) onto the tenant draft config. Duplicates are skipped (never overwritten). The response carries created + skipped + a theme/industry mismatch warning when applicable.
*/
post: operations["SkillRulesController_applyThemePack"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-decay-rules": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List skill decay rules */
get: operations["SkillDecayRulesController_findAll"];
put?: never;
/**
* Create a skill decay rule
* @description Define how a skill level decays over time (daily/weekly/monthly). Decay is opt-in per customer via settings.features.decay.
*/
post: operations["SkillDecayRulesController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-decay-rules/{id}/preview": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Preview the cumulative effect of a decay rule
* @description Returns the projected skill level after N cadence periods given a starting level. Used by the dashboard to show "in 30 days, 100 → ?".
*/
get: operations["SkillDecayRulesController_preview"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-decay-rules/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Update a skill decay rule */
put: operations["SkillDecayRulesController_update"];
post?: never;
/** Delete a skill decay rule */
delete: operations["SkillDecayRulesController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-decay-rules/{id}/history": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Recent decay applications for a rule
* @description Returns the latest applications recorded against this rule so the dashboard can show "last 30 days" activity per rule.
*/
get: operations["SkillDecayRulesController_history"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/skill-decay-rules/run-now": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Trigger a decay sweep immediately for this customer
* @description Enqueues a one-off decay sweep scoped to this customer. The sweep is idempotent (a buddy already decayed for the current cadence period will not be touched), so this is safe to run during the day for QA or when an operator activates a rule and wants to see the effect now instead of waiting for the 03:00 UTC cron.
*/
post: operations["SkillDecayRulesController_runNow"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/coin-rules": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List all coin rules
* @description Returns all coin rules configured for the current customer.
*/
get: operations["CoinRulesController_findAll"];
put?: never;
/**
* Create a coin rule
* @description Create a new coin rule that defines how coins are awarded for a specific trigger event.
*/
post: operations["CoinRulesController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/coin-rules/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/**
* Update a coin rule
* @description Update an existing coin rule by ID.
*/
put: operations["CoinRulesController_update"];
post?: never;
/**
* Delete a coin rule
* @description Permanently delete a coin rule by ID.
*/
delete: operations["CoinRulesController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/coin-rules/{id}/reward-pool/telemetry": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Reward pool telemetry
* @description Returns the real reward-pool pick distribution for a coin rule over the last 30 days, for the Planner drawer believability check.
*/
get: operations["CoinRulesController_rewardPoolTelemetry"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/economy/buddies/{buddyId}/ledger": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get coin ledger for a buddy
* @description Returns a paginated list of coin transactions (credits and debits) for a specific buddy.
*/
get: operations["EconomyController_getLedger"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/badge-definitions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List all badge definitions
* @description Returns all badge definitions configured for the current customer.
*/
get: operations["BadgeDefinitionsController_findAll"];
put?: never;
/**
* Create a badge definition
* @description Create a new badge definition with criteria for automatic or manual awarding.
*/
post: operations["BadgeDefinitionsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/badge-definitions/upload-icon": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Upload a badge icon
* @description Upload a PNG or SVG image file to use as a badge icon. Max size: 500KB.
*/
post: operations["BadgeDefinitionsController_uploadIcon"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/badge-definitions/generate-icon": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Generate a badge icon with AI
* @description Runs the AI image pipeline to create a badge icon for the given label/description. Returns a stored icon URL, the generation prompt, and the recorded cost.
*/
post: operations["BadgeDefinitionsController_generateIcon"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/badge-definitions/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get a badge definition
* @description Returns a single badge definition by its ID.
*/
get: operations["BadgeDefinitionsController_findById"];
/**
* Update a badge definition
* @description Update an existing badge definition by ID.
*/
put: operations["BadgeDefinitionsController_update"];
post?: never;
/**
* Delete a badge definition
* @description Permanently delete a badge definition. Fails if awards already exist for this badge.
*/
delete: operations["BadgeDefinitionsController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/badge-definitions/{id}/regenerate-icon": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Queue an AI regeneration for this badge icon
* @description Flips the badge to icon_status=pending and enqueues a background job that drafts a fresh prompt from the customer theme and re-renders the medallion.
*/
post: operations["BadgeDefinitionsController_regenerateIcon"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/event-badges": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List event-triggered badge campaigns */
get: operations["EventTriggeredBadgeController_list"];
put?: never;
/** Create an event-triggered badge campaign */
post: operations["EventTriggeredBadgeController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/event-badges/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Delete an event-triggered badge campaign */
delete: operations["EventTriggeredBadgeController_remove"];
options?: never;
head?: never;
/** Update an event-triggered badge campaign */
patch: operations["EventTriggeredBadgeController_update"];
trace?: never;
};
"/streak-definitions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List all streak definitions */
get: operations["StreakDefinitionsController_findAll"];
put?: never;
/** Create a streak definition */
post: operations["StreakDefinitionsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/streak-definitions/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get a streak definition */
get: operations["StreakDefinitionsController_findById"];
/** Update a streak definition */
put: operations["StreakDefinitionsController_update"];
post?: never;
/** Delete a streak definition */
delete: operations["StreakDefinitionsController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/image-usage": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get image usage
* @description Get current image generation usage and limits for the customer
*/
get: operations["ImageCostController_getUsage"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/image-usage/report": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get image usage report
* @description Get a detailed image generation usage report for a specific month
*/
get: operations["ImageCostController_getUsageReport"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List events
* @description List events with optional filters for user, type, date range, and limit
*/
get: operations["EventsController_findAll"];
put?: never;
/**
* Ingest event
* @description Ingest a new event from an integration. Triggers coin, badge, and skill rules.
*/
post: operations["EventsController_ingest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events/admin-trigger": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Trigger an event from the dashboard admin tools
* @description Runs the same event ingestion and rule-engine path as the public event API, but accepts dashboard JWT auth for operator QA and support actions.
*/
post: operations["EventsController_adminTrigger"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events/batch": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Ingest event batch
* @description Ingest multiple events in a single request (max 100)
*/
post: operations["EventsController_ingestBatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events/types": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List distinct event types
* @description Returns distinct event type strings ever ingested for this customer. Used by rule editors so operators pick from observed events instead of a hardcoded list.
*/
get: operations["EventsController_findTypes"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events/active-users": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List most-active users in a recent window
* @description Returns a leaderboard of users (players) ordered by event volume in the last N hours. Each row carries event count, last activity, top event types, and active-buddy count — enough for a single-glance activity feed.
*/
get: operations["EventsController_findActiveUsers"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get event
* @description Get a single event by ID including its processing effects
*/
get: operations["EventsController_findById"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/event-types": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List event types */
get: operations["EventTypesController_findAll"];
put?: never;
/** Register an event type */
post: operations["EventTypesController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/event-types/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get an event type */
get: operations["EventTypesController_findById"];
/**
* Update or rename an event type
* @description Renaming propagates to coin_rules, skill_rules, badge_definitions, streak_definitions, webhook_configs, event_ingestions, and custom_counters keys — all in a single transaction.
*/
put: operations["EventTypesController_update"];
post?: never;
/**
* Delete an event type
* @description Rejects the delete if any rule references this event. 409 response includes per-table reference counts.
*/
delete: operations["EventTypesController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/token-config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List token configurations
* @description Returns all token type configurations for the current customer.
*/
get: operations["TokenConfigController_list"];
put?: never;
/**
* Upsert token configuration
* @description Create or update the token type configurations for the current customer.
*/
post: operations["TokenConfigController_upsert"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List marketplaces
* @description List all marketplaces for the authenticated customer
*/
get: operations["MarketplaceController_list"];
put?: never;
/**
* Create marketplace
* @description Create a new marketplace for the authenticated customer
*/
post: operations["MarketplaceController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get marketplace
* @description Get a single marketplace by ID
*/
get: operations["MarketplaceController_findOne"];
/**
* Update marketplace
* @description Update an existing marketplace
*/
put: operations["MarketplaceController_update"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List items
* @description List items in a marketplace with optional filters and pagination
*/
get: operations["MarketplaceController_listItems"];
put?: never;
/**
* Create item
* @description Create a new item in a marketplace
*/
post: operations["MarketplaceController_createItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items/import": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Import items
* @description Bulk import items into a marketplace from JSON or CSV
*/
post: operations["MarketplaceController_importItems"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items/{item_id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get item
* @description Get a single item by ID within a marketplace
*/
get: operations["MarketplaceController_findItem"];
/**
* Update item
* @description Update an existing marketplace item
*/
put: operations["MarketplaceController_updateItem"];
post?: never;
/**
* Delete item
* @description Delete a marketplace item
*/
delete: operations["MarketplaceController_deleteItem"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items/reorder": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Reorder items
* @description Set the display order of items in a marketplace
*/
post: operations["MarketplaceController_reorderItems"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items/{item_id}/upload-image": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Upload item image
* @description Upload a PNG image for a marketplace item (max 2MB)
*/
post: operations["MarketplaceController_uploadItemImage"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketplaces/{id}/items/{item_id}/regenerate-image": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Queue an AI regeneration for this item image
* @description Flips the item to image_status=pending and enqueues a background job that drafts a fresh prompt from the customer theme and re-renders the item art.
*/
post: operations["MarketplaceController_regenerateItemImage"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/items/{id}/gift": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Gift a marketplace item to a teammate
* @description Debits the sender and writes the item into the recipient inventory with gift metadata. 402 when the sender is short on coins; 200 with duplicate=true when the same gift is re-sent inside the 60s window.
*/
post: operations["MarketplaceWidgetController_gift"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/flash-sales": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List flash sales for the Planner drawer */
get: operations["FlashSaleController_list"];
put?: never;
/** Schedule a flash sale */
post: operations["FlashSaleController_schedule"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/flash-sales/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Cancel a flash sale — a running sale clears its discounts */
delete: operations["FlashSaleController_cancel"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/marketplace/fomo": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Marketplace FOMO poll
* @description Records the buddy as a current viewer of every supplied item and returns per-item viewer counts, real stock and flash-sale discounted prices, plus the active flash sale. Returns enabled=false when the tenant has the marketplace_fomo feature switched off.
*/
post: operations["MarketplaceFomoWidgetController_resolve"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/returning-champion": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the Returning Champion re-onboarding scene payload
* @description HTCH-100 — resolves whether this buddy is a 30+ day-lapsed past LEAGUES champion. Returns `{ available: false }` for everyone else. Clears an expired legacy-crown overlay as a side effect.
*/
get: operations["LegacyEquipController_getReturningChampion"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/returning-champion/dismiss": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Dismiss the Returning Champion scene
* @description HTCH-100 — skip or continue past the re-onboarding scene. Clears the payload and resumes the HTCH-91 lapsed sweep; the 90-day cooldown stands so the scene cannot re-trigger before then.
*/
post: operations["LegacyEquipController_dismissReturningChampion"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/equip-legacy-item": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Temp-equip a legacy crown for the returning-champion scene
* @description HTCH-100 — re-equips a still-owned legendary item as a 7-day temporary overlay (Endowment Effect). It never mutates the buddy’s real inventory and triggers no image re-composition.
*/
post: operations["LegacyEquipController_equipLegacyItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/returning-champion/welcome-back": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Resolve a Returning Champion welcome-back token to a widget session */
get: operations["ReturningChampionPublicController_resolveWelcomeBack"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List webhook configs
* @description List all webhook configurations for the customer
*/
get: operations["WebhooksController_list"];
put?: never;
/**
* Create webhook config
* @description Register a new webhook endpoint to receive event notifications
*/
post: operations["WebhooksController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List webhook event types
* @description Return the canonical event types accepted by webhook subscriptions.
*/
get: operations["WebhooksController_listEvents"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/health": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get webhook delivery health
* @description Customer-scoped delivery health, active endpoint count, alerts, and digest status.
*/
get: operations["WebhooksController_getHealth"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get webhook config
* @description Get a single webhook configuration by ID
*/
get: operations["WebhooksController_findOne"];
/**
* Update webhook config
* @description Update an existing webhook configuration
*/
put: operations["WebhooksController_update"];
post?: never;
/**
* Delete webhook config
* @description Delete a webhook configuration
*/
delete: operations["WebhooksController_delete"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/{id}/rotate-secret": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Rotate webhook secret
* @description Generate a new signing secret for a webhook endpoint
*/
post: operations["WebhooksController_rotateSecret"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/{id}/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Send test webhook
* @description Send a test payload to the webhook endpoint
*/
post: operations["WebhooksController_sendTest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/{id}/deliveries": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List webhook deliveries
* @description Get delivery log history for a webhook config
*/
get: operations["WebhooksController_getDeliveries"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/webhook-configs/{id}/deliveries/{deliveryId}/redeliver": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Redeliver webhook
* @description Re-enqueue a previous delivery using its stored payload.
*/
post: operations["WebhooksController_redeliver"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/prestige": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Whether the current buddy can prestige, and why not if it cannot */
get: operations["PrestigeController_status"];
put?: never;
/** Prestige the current buddy — reset to stage 0 for a prestige level */
post: operations["PrestigeController_prestige"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/overview": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get analytics overview
* @description Get high-level platform analytics overview for the customer
*/
get: operations["AnalyticsController_getOverview"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/engagement": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get engagement metrics
* @description Get user engagement metrics over time with configurable period and date range
*/
get: operations["AnalyticsController_getEngagement"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/activity-summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get activity summary
* @description Get aggregated activity summary for the customer
*/
get: operations["AnalyticsController_getActivitySummary"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/economy-summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get economy summary
* @description Get coin economy summary including earnings and spending
*/
get: operations["AnalyticsController_getEconomySummary"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/economy-health": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get economy health
* @description Get health indicators for the coin economy (inflation, velocity, etc.)
*/
get: operations["AnalyticsController_getEconomyHealth"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/popular-items": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get popular items
* @description Get the most popular marketplace items by purchase count
*/
get: operations["AnalyticsController_getPopularItems"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/popular-badges": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get popular badges
* @description Get the most frequently awarded badges
*/
get: operations["AnalyticsController_getPopularBadges"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/retention": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get retention metrics
* @description Get cohort retention analysis for user engagement
*/
get: operations["AnalyticsController_getRetention"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/roi-metrics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get ROI metrics
* @description Get return on investment metrics for gamification features
*/
get: operations["AnalyticsController_getRoiMetrics"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/streaks": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get streak health
* @description Active streak rate, milestone hit rates, and length distribution
*/
get: operations["AnalyticsController_getStreakHealth"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/tokens": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get per-token economy
* @description Earn, spend, net, and holder counts per token key
*/
get: operations["AnalyticsController_getTokenEconomy"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/audiences": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get audience breakdown
* @description Per-audience DAU, events, coins earned, avg streak
*/
get: operations["AnalyticsController_getAudienceBreakdown"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/evolution": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get evolution timeline
* @description Per-stage buddy counts and time-to-reach statistics
*/
get: operations["AnalyticsController_getEvolutionTimeline"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/marketplace-funnel": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get marketplace funnel
* @description Per-item views / purchases / equips conversion funnel
*/
get: operations["AnalyticsController_getMarketplaceFunnel"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/webhooks": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get webhook delivery health
* @description Success rate, latency percentiles, retries, failures by event
*/
get: operations["AnalyticsController_getWebhookHealth"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/event-counts": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Per-event counts
* @description Per-event aggregates (24h / 7d / 30d + last_seen) for every event ingested by the customer. Powers the /dashboard/events Lexicon page.
*/
get: operations["AnalyticsController_getEventCounts"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/custom-events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get custom event trends
* @description Top event types with daily trend sparklines
*/
get: operations["AnalyticsController_getCustomEventTrends"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/analytics/feature-activity": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get feature activity
* @description Weekly usage counts per Planner feature (kudos, group quests, mystery box, free lunch, outfits), rolled up from system telemetry events.
*/
get: operations["AnalyticsController_getFeatureActivity"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leaderboard": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get leaderboard
* @description HTCH-18: returns the leaderboard in one of three Yu-kai Ch.6 view modes — top, around_me, hybrid (default driven by tenant LeaderboardConfig). User-side query param overrides tenant default for the requesting widget.
*/
get: operations["LeaderboardController_getLeaderboard"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/leaderboard-config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the tenant leaderboard view-mode config
* @description Returns the effective LeaderboardConfig (defaults applied) used by the widget. No separate draft slot: the drawer holds unsaved state client-side, persist = publish.
*/
get: operations["LeaderboardConfigController_get"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update the tenant leaderboard view-mode config
* @description Validates the body against the shared zod schema, upserts the dedicated row, and busts the `leaderboard:config:{customer_id}` cache so the next widget read sees the new view mode immediately.
*/
patch: operations["LeaderboardConfigController_patch"];
trace?: never;
};
"/customers/me/analytics/share-funnel": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Public share-page gift funnel (gift CTA + signup wall) */
get: operations["ShareFunnelController_giftFunnel"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/billing/status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get billing status
* @description Get the current billing status, plan, credit balances, event usage, and live subscription summary for the customer.
*/
get: operations["BillingController_getStatus"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/billing/checkout": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Create checkout session
* @description Create a Stripe checkout session for subscription (flow=subscription) or top-up (flow=credit_bundle)
*/
post: operations["BillingController_createCheckout"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/billing/checkout/session/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Reconcile a Stripe checkout session
* @description Synchronously confirm a completed Stripe Checkout Session on the dashboard return (?session_id=...) and idempotently apply the plan/credits if the async webhook has not yet. Returns the reconciled billing state so the UI can show an honest status before bridging into onboarding. Safe to call repeatedly.
*/
get: operations["BillingController_reconcileCheckout"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/billing/portal": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Create billing portal session
* @description Create a Stripe billing portal session for subscription management.
*/
post: operations["BillingController_createPortal"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/credits/balance": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get credit balance
* @description Returns welcome, paid and promo pool balances plus total spendable.
*/
get: operations["CreditsController_getBalance"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/credits/ledger": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List recent AI usage ledger entries
* @description Paginated ledger of AI jobs (authorize / commit / rollback).
*/
get: operations["CreditsController_listLedger"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Create or resume the current onboarding session */
post: operations["OnboardingController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/preparing-status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Aggregate asset-generation status for the current customer */
get: operations["OnboardingController_preparingStatus"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/seed-from-url": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Seed onboarding from a landing-page URL */
post: operations["OnboardingController_seedFromUrl"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/seed-from-repo": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Seed onboarding from a repo-analysis brief produced by a local AI agent */
post: operations["OnboardingController_seedFromRepo"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/seed-from-description": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Seed onboarding from operator-provided chips + optional description */
post: operations["OnboardingController_seedFromDescription"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/waitlist": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Join the waitlist for an upcoming onboarding channel */
post: operations["OnboardingController_joinWaitlist"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/current": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Fetch the current onboarding session */
get: operations["OnboardingController_current"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/reset": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Reset the current onboarding session */
post: operations["OnboardingController_reset"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/answers": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Patch structured onboarding answers */
put: operations["OnboardingController_updateAnswers"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/message": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Send a user message and stream the assistant reply via server-sent events */
post: operations["OnboardingController_message"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/generate-plan": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Generate a gamification plan from the conversation */
post: operations["OnboardingController_generatePlan"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/regenerate-plan": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Regenerate the plan with a variant seed */
post: operations["OnboardingController_regeneratePlan"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/apply": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Apply the generated plan to the customer (writes gamification config) */
post: operations["OnboardingController_apply"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/onboarding/sessions/{id}/generate-guide": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Generate a personalized integration guide */
post: operations["OnboardingController_generateGuide"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/stage-assets": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List per-customer stage assets (preset mode buddy art) plus the default library URLs resolved for the customer's creature_style. */
get: operations["StageAssetsController_list"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/stage-assets/upload-url": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Issue a presigned PUT URL for a client-side stage asset upload */
post: operations["StageAssetsController_createUploadUrl"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/stage-assets/{stage}/regenerate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Queue AI generation for a customer preset stage asset */
post: operations["StageAssetsController_regenerate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/stage-assets/{stage}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Commit an uploaded object as the preset asset for a stage */
put: operations["StageAssetsController_commit"];
post?: never;
/** Remove the preset asset for a stage */
delete: operations["StageAssetsController_remove"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/gates": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List token gates for this customer */
get: operations["GatesController_list"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/gates/{gate_key}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Create or update a token gate */
put: operations["GatesController_upsert"];
post?: never;
/** Delete a token gate */
delete: operations["GatesController_remove"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/gates/{gate_key}/unlock": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Spend tokens to unlock a gate for a buddy
* @description Idempotent. Returns already_unlocked: true on repeat calls without touching the economy.
*/
post: operations["GatesController_unlock"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/buddies/{buddy_id}/unlocks": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List gates this buddy has unlocked */
get: operations["GatesController_listUnlocks"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List path definitions */
get: operations["PathsController_listDefinitions"];
put?: never;
/** Create a path definition */
post: operations["PathsController_createDefinition"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get a path definition (with steps + sub-steps) */
get: operations["PathsController_getDefinition"];
/** Update a path definition */
put: operations["PathsController_updateDefinition"];
post?: never;
/** Delete a path definition */
delete: operations["PathsController_deleteDefinition"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/activate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Activate a path (atomic single-active per audience)
* @description Sets is_active=true on this path and is_active=false on every other path with the same (customer, audience) in a single transaction.
*/
post: operations["PathsController_activate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/deactivate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Deactivate a path */
post: operations["PathsController_deactivate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List steps in a path */
get: operations["PathsController_listSteps"];
put?: never;
/** Create a step in a path */
post: operations["PathsController_createStep"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps/reorder": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Reorder steps in a path */
put: operations["PathsController_reorderSteps"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps/{stepId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Update a step */
put: operations["PathsController_updateStep"];
post?: never;
/** Delete a step */
delete: operations["PathsController_deleteStep"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps/{stepId}/sub-steps": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List sub-steps within a step */
get: operations["PathsController_listSubSteps"];
put?: never;
/** Create a sub-step */
post: operations["PathsController_createSubStep"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps/{stepId}/sub-steps/reorder": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Reorder sub-steps within a step */
put: operations["PathsController_reorderSubSteps"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/{id}/steps/{stepId}/sub-steps/{subStepId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Update a sub-step */
put: operations["PathsController_updateSubStep"];
post?: never;
/** Delete a sub-step */
delete: operations["PathsController_deleteSubStep"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/buddies/{buddyId}/paths/{pathKey}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get path runtime payload for a buddy
* @description Returns the buddy-scoped path with sub-step status (locked/available/completed). Admin/api-key path; the widget uses /widget/path instead.
*/
get: operations["PathsController_getBuddyPath"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/path-definitions/buddies/{buddyId}/paths/{pathKey}/sub-steps/{subKey}/complete": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Manually mark a sub-step complete (admin) */
post: operations["PathsController_manualComplete"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/beginners-luck/analytics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Beginner's Luck winner analytics
* @description Returns the per-tenant evaluation totals — total evaluations, total winners, winner percentage, last-30-day winners, and the configured expected rate.
*/
get: operations["BeginnersLuckController_getAnalytics"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/beginners-luck/result": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the buddy's Beginner's Luck result
* @description HTCH-43 — idempotently evaluates Beginner's Luck for the first hatch and returns the winner-only reveal payload. Losers and a disabled feature both resolve to `won: false` with no awarded item or copy.
*/
get: operations["BeginnersLuckWidgetController_getResult"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/free-lunch/notification": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the buddy's pending Free Lunch banner
* @description HTCH-44 — returns the buddy's most recent unacknowledged Free Lunch grant, or `has_pending: false` when there is nothing to show.
*/
get: operations["FreeLunchWidgetController_getNotification"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/free-lunch/{id}/acknowledge": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Acknowledge a Free Lunch banner
* @description HTCH-44 — marks the grant dismissed so the banner does not reappear.
*/
post: operations["FreeLunchWidgetController_acknowledge"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/teams": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the tenant teams with member counts */
get: operations["TeamsAdminController_list"];
put?: never;
/** Create a team */
post: operations["TeamsAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/teams/{teamId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Soft-delete a team and archive its memberships */
delete: operations["TeamsAdminController_remove"];
options?: never;
head?: never;
/** Update a team */
patch: operations["TeamsAdminController_update"];
trace?: never;
};
"/customers/me/teams/{teamId}/members": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the active members of a team */
get: operations["TeamsAdminController_listMembers"];
put?: never;
/** Add a buddy to a team */
post: operations["TeamsAdminController_addMember"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/teams/{teamId}/members/{buddyId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Remove a buddy from a team (soft leave) */
delete: operations["TeamsAdminController_removeMember"];
options?: never;
head?: never;
/** Change a member role */
patch: operations["TeamsAdminController_changeRole"];
trace?: never;
};
"/customers/me/teams/import": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Bulk-import team memberships from a CSV
* @description CSV columns: team_slug, buddy_external_user_id, role (+ optional team_name, team_description). `?dry_run=true` validates without writing.
*/
post: operations["TeamsAdminController_import"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/teams/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get the current buddy’s team, role and members */
get: operations["TeamsWidgetController_me"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/teams/{id}/leave": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Leave a team — blocked for a sole lead until another is promoted */
post: operations["TeamsWidgetController_leave"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/kudo-types": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List the effective kudo taxonomy
* @description Returns the customer authored types, or a virtual generic set (thanks / shoutout / support) when the taxonomy is empty.
*/
get: operations["KudoTypesAdminController_list"];
put?: never;
/** Create a custom kudo type */
post: operations["KudoTypesAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/kudo-types/apply-template": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Apply an industry preset taxonomy
* @description mode=replace archives all active types then seeds the template; mode=append adds the template and 409s on any key collision.
*/
post: operations["KudoTypesAdminController_applyTemplate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/kudo-types/apply-theme-template": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Apply a theme-aware kudos pack (HTCH-128)
* @description Creates a draft/inactive `<industry>-<theme_vibe>` kudos pack. Duplicate keys are skipped (never overwritten); the response carries the created rows and any skipped keys so the Planner can render a clean confirmation before publishing.
*/
post: operations["KudoTypesAdminController_applyThemeTemplate"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/kudo-types/reorder": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Persist a new display order */
patch: operations["KudoTypesAdminController_reorder"];
trace?: never;
};
"/customers/me/kudo-types/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Archive a kudo type (soft delete) */
delete: operations["KudoTypesAdminController_remove"];
options?: never;
head?: never;
/** Update a kudo type */
patch: operations["KudoTypesAdminController_update"];
trace?: never;
};
"/widget/kudos/types": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List the effective kudo taxonomy for the composer
* @description Returns the workspace authored types, or the virtual generic set (thanks / shoutout / support) when the taxonomy is empty.
*/
get: operations["KudosWidgetController_types"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/kudos": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Send a kudos to a teammate
* @description Records a buddy→buddy recognition transfer. 429s when the sender has reached the workspace daily cap; 200 with duplicate=true when the same kudos is re-sent inside the 60s accident-click window.
*/
post: operations["KudosWidgetController_send"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/kudos/received": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the buddy’s most recent received kudos */
get: operations["KudosWidgetController_received"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/kudos/given": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the buddy’s most recent sent kudos + lifetime count */
get: operations["KudosWidgetController_given"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/group-quests": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the tenant Group Quests (filter by status / team) */
get: operations["GroupQuestsAdminController_list"];
put?: never;
/** Create a Group Quest (status: draft) */
post: operations["GroupQuestsAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/group-quests/{questId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Delete a Group Quest (draft / cancelled only) */
delete: operations["GroupQuestsAdminController_remove"];
options?: never;
head?: never;
/** Update a Group Quest — draft fields, active deadline-extension, or cancel */
patch: operations["GroupQuestsAdminController_update"];
trace?: never;
};
"/customers/me/group-quests/{questId}/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Publish a draft Group Quest (draft → active) */
post: operations["GroupQuestsAdminController_publish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/group-quests/{questId}/force-resolve": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** HTCH-56 — manually resolve a Group Quest now (admin watchdog override) */
post: operations["GroupQuestsAdminController_forceResolve"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/group-quests/active": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the active Group Quests visible to the current buddy */
get: operations["GroupQuestsWidgetController_active"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/group-quests/{id}/join": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Join a Group Quest — idempotent (already_joined on re-join) */
post: operations["GroupQuestsWidgetController_join"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/group-quests/{id}/leave": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Leave a Group Quest — the buddy’s prior contribution stays counted */
post: operations["GroupQuestsWidgetController_leave"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mentor/availability": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Toggle the current buddy’s mentor availability
* @description Flips `mentor_available` on the buddy’s active team membership. 403 `not_a_mentor` when the buddy’s role is not mentor.
*/
post: operations["MentorWidgetController_setAvailability"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mentor/team/{id}/mentors": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List a team’s available mentors with contact deep links */
get: operations["MentorWidgetController_teamMentors"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mentor/sessions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Self-report a mentoring session
* @description Logs an honor-system mentoring session (hours 0.25–8). 403 `not_a_mentor` for non-mentors, 403 `hours_self_report_disabled` when the workspace has the feature off.
*/
post: operations["MentorWidgetController_logSession"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mentor/sessions/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the buddy’s recent mentor sessions + hour aggregates */
get: operations["MentorWidgetController_mySessions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/mentor-visibility/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get the mentor-visibility config */
get: operations["MentorAdminController_getConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update the mentor-visibility config
* @description Validates the contact-URL placeholder allow-list and the PII opt-in. An unknown {{token}} or an {{email}} placeholder without PII opt-in is a 400.
*/
patch: operations["MentorAdminController_updateConfig"];
trace?: never;
};
"/customers/me/mentor-visibility/directory": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List every active mentor across the tenant’s teams */
get: operations["MentorAdminController_directory"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/mentor-visibility/sessions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* Reset all mentor session logs for the workspace
* @description Destructive — wipes every mentor hours log. Intended for the B2B workspace-reset compliance scenario.
*/
delete: operations["MentorAdminController_resetSessions"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/brag/share-profile": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Build the Brag Button "share my profile" payload
* @description HTCH-68 — returns the buddy's public Profile Page URL (/p/<code>, minted on first call) plus the tenant brag copy template.
*/
post: operations["BragWidgetController_shareProfile"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/brag/win-state": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Build the full Brag Button Win-State payload + enabled channels
* @description HTCH-60 — returns { payload: BragPayload, enabled_channels }. The widget ceremonies (hatch act-5, evolution) call this once to render the Share CTA. enabled_channels is [] when the Planner toggle is off, so the BragButton self-hides — the single-toggle gate is honored server-side.
*/
post: operations["BragWidgetController_winState"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/brag/slack-post": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Send a Win-State brag to the tenant Slack/Teams webhook
* @description Per-event consent only — the user pressed "Send" in the consent modal. The webhook URL is decrypted server-side; 400 webhook_failed when delivery times out or the endpoint rejects it.
*/
post: operations["BragWidgetController_slackPost"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/brag/telemetry": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Record one brag funnel event
* @description Persists a consent-modal-opened / channel-clicked / completed / dismissed event for the HTCH-61 Planner telemetry dashboard.
*/
post: operations["BragWidgetController_telemetry"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/brag/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Get the Brag Button channel + copy-template config
* @description Webhook URLs are returned masked ({ configured, hint }) — the ciphertext envelope never leaves the server.
*/
get: operations["BragAdminController_getConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* Update channel toggles, copy templates and webhook URLs
* @description Webhook URLs are encrypted at rest. Copy templates are validated against the placeholder allow-list and per-channel char limits.
*/
patch: operations["BragAdminController_updateConfig"];
trace?: never;
};
"/customers/me/brag/webhook-test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Send a dummy message to a Slack/Teams webhook URL
* @description Verifies a webhook URL before the admin saves it. The message is tagged "Hatched webhook test" so it is obviously not production noise.
*/
post: operations["BragAdminController_webhookTest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/brag/funnel": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Brag funnel aggregate over a date window */
get: operations["BragAdminController_funnel"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/brag/by-channel": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Channel × event_kind click / completion matrix */
get: operations["BragAdminController_byChannel"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/brag/telemetry.csv": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Export raw brag telemetry as CSV */
get: operations["BragAdminController_telemetryCsv"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/social-norms/today": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* The buddy's positive-framing team norms for today
* @description Returns up to `max_banners_per_session` rendered norms. Norms whose metric falls below the believability floor are silently skipped — a "positive" framing under that floor would be a lie (Yu-kai Ch.9).
*/
get: operations["SocialNormsWidgetController_today"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/feed/team-events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* The buddy's team feed — cursor-paginated, newest first
* @description Returns the last N SeeSaw Bump events for the buddy’s team plus customer-wide events. `next_cursor` is null when the feed is exhausted.
*/
get: operations["FeedWidgetController_listTeamEvents"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/feed/team-events/{id}/clap": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Toggle a 👏 clap on a feed item
* @description Idempotent — a buddy claps once; a repeat call unclaps. Clapping your own event is rejected with 400 `self_clap_forbidden`. A fresh clap notifies the subject over the `feed.team_event` channel.
*/
post: operations["FeedWidgetController_clap"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the tenant Cause Counter definitions */
get: operations["CauseAdminController_list"];
put?: never;
/** Create a Cause Counter definition */
post: operations["CauseAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/audit": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-71 — paginated Cause Counter change history (drawer) */
get: operations["CauseAdminController_audit"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/preview-30-days": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-71 — project symbolic units for an unsaved rate config (the drawer rate builder simulation) */
get: operations["CauseAdminController_previewConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/analytics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-107 — F4.5 Humanity Hero admin analytics: customer-wide and per-team contribution rollups, time series, threshold ETA and webhook delivery health (Planner drawer "Analytics" tab) */
get: operations["CauseAdminController_analyticsView"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/analytics.csv": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-107 — download the cause analytics as a CSV attachment */
get: operations["CauseAdminController_analyticsCsv"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Delete a Cause Counter definition */
delete: operations["CauseAdminController_remove"];
options?: never;
head?: never;
/** Update a Cause Counter definition */
patch: operations["CauseAdminController_update"];
trace?: never;
};
"/customers/me/causes/{id}/draft": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Stage draft edits for a published Cause Counter definition */
post: operations["CauseAdminController_draft"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/{id}/preview-30-days": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Project symbolic units from the last 30 days of eligible events for a saved cause */
get: operations["CauseAdminController_preview"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/causes/{id}/webhook": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-106 — F4.5 cause webhook config + recent delivery attempts */
get: operations["CauseAdminController_getWebhook"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** HTCH-106 — F4.5 set the cause webhook URL, secret and threshold step */
patch: operations["CauseAdminController_updateWebhook"];
trace?: never;
};
"/customers/me/causes/{id}/webhook/test": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** HTCH-106 — F4.5 send a test cause.threshold_reached event and return the delivery outcome inline */
post: operations["CauseAdminController_testWebhook"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/causes/counters": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List symbolic cause counters for the current buddy / team / tenant */
get: operations["CauseWidgetController_counters"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/causes/surfaces": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** HTCH-70 — cause counters grouped per opted-in surface (banner / buddy strip / profile) */
get: operations["CauseWidgetController_surfaces"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/foundations": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the tenant's active foundation selections — read-only for widget rendering. */
get: operations["FoundationsController_widgetList"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/council/proposals": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The Council narrative-proposal moderation queue */
get: operations["CouncilAdminController_list"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/council/proposals/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Approve or reject a pending proposal */
patch: operations["CouncilAdminController_moderate"];
trace?: never;
};
"/customers/me/council/narrative/slots/{slot}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Promote an approved proposal into a live narrative slot */
put: operations["CouncilAdminController_promote"];
post?: never;
/** Retire the live proposal in a slot and restore the default copy */
delete: operations["CouncilAdminController_revert"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/council/proposals/mine": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's own narrative proposals plus Council standing and quota */
get: operations["CouncilWidgetController_mine"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/council/proposals": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Submit a narrative proposal (Council members only) */
post: operations["CouncilWidgetController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/founding-cohort/preview": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Project how many buddies the Founding Cohort config would mark. Optional query params preview an unsaved mode/threshold. */
get: operations["FoundingCohortAdminController_preview"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/founding-cohort/backfill": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Retroactively mark every currently-eligible buddy (idempotent) */
post: operations["FoundingCohortAdminController_backfill"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/founding-cohort/audit": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Paginated Founding Cohort assignment history */
get: operations["FoundingCohortAdminController_audit"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/founding-cohort/audit/export.csv": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Export the full Founding Cohort assignment history as CSV */
get: operations["FoundingCohortAdminController_exportAuditCsv"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/founding-cohort/status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Founding Cohort status for the current buddy */
get: operations["FoundingCohortWidgetController_status"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Paginated notification feed for the current buddy */
get: operations["NotificationWidgetController_list"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications/unread-count": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Unread, non-dismissed notification count (badge) */
get: operations["NotificationWidgetController_unreadCount"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications/dismiss-all": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Read + dismiss every notification for the buddy */
post: operations["NotificationWidgetController_dismissAll"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications/{id}/read": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Mark a single notification read */
post: operations["NotificationWidgetController_read"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications/{id}/dismiss": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Read + dismiss a single notification (HTCH-76) */
post: operations["NotificationWidgetController_dismiss"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/notifications/{id}/snooze": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Snooze a notification for a number of hours (HTCH-76) */
post: operations["NotificationWidgetController_snooze"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/profile/sunk-cost-summary": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Sunk-Cost 'Your journey so far' summary for the current buddy */
get: operations["SunkCostController_summary"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/profile/sunk-cost-summary/acknowledge": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Acknowledge the Sunk-Cost panel on first open — fires the paired White Hat celebration.milestone_acknowledged (idempotent per buddy) */
post: operations["SunkCostController_acknowledge"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/pause": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Put the current buddy on vacation until a date */
post: operations["VacationWidgetController_pause"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/resume": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** End the current buddy vacation early */
post: operations["VacationWidgetController_resume"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/buddy/vacation-status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Current buddy vacation status */
get: operations["VacationWidgetController_status"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/vacation/analytics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Vacation usage analytics for the Planner drawer panel */
get: operations["VacationAdminController_analytics"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/streak-at-risk/analytics": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Streak-at-risk volume + recovery analytics for the Planner drawer */
get: operations["StreakWatchdogAdminController_analytics"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/profile/history": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Visual Grave history — faded lost streaks + reclaimable items */
get: operations["ProfileHistoryController_getHistory"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/profile/history/items/{id}/reclaim": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Earn a relinquished starter-rare back — fires recovery.streak_restored */
post: operations["ProfileHistoryController_reclaim"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mystery-box/state": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Mystery Box state — eligible / capped / locked */
get: operations["MysteryBoxController_state"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/mystery-box/claim": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Open the Mystery Box — 409 with next_eligible_at when the daily cap is spent */
post: operations["MysteryBoxController_claim"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/surprise-drops": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List surprise-drop definitions for the Planner */
get: operations["SurpriseDropsController_list"];
put?: never;
/** Create a custom surprise drop */
post: operations["SurpriseDropsController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/surprise-drops/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Delete a custom surprise drop */
delete: operations["SurpriseDropsController_remove"];
options?: never;
head?: never;
/** Update a surprise drop — global templates edit copy-on-write */
patch: operations["SurpriseDropsController_update"];
trace?: never;
};
"/customers/me/boosters/grant": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Grant a catalog booster to a buddy (admin one-off) */
post: operations["BoostersAdminController_grant"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/boosters/active": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy’s currently active boosters */
get: operations["BoostersController_active"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/boosters/catalog": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Buyable boosters for this tenant */
get: operations["BoostersController_catalog"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/boosters/purchase": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Buy a catalog booster — 400 insufficient_balance when too few coins */
post: operations["BoostersController_purchase"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/lotteries": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List lottery definitions for the Planner */
get: operations["LotteriesController_list"];
put?: never;
/** Create a lottery definition */
post: operations["LotteriesController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/lotteries/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Soft-delete a lottery (history stays queryable) */
delete: operations["LotteriesController_remove"];
options?: never;
head?: never;
/** Update a lottery definition */
patch: operations["LotteriesController_update"];
trace?: never;
};
"/customers/me/lotteries/{id}/draws": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Past draw history + analytics for a lottery */
get: operations["LotteriesController_draws"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/lotteries/{id}/preview-next-draw": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Current-period entry count + next draw time for the preview card */
get: operations["LotteriesController_previewNextDraw"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/lotteries/{id}/simulate-draw": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Simulate a draw with the current entries — no rewards granted */
post: operations["LotteriesController_simulateDraw"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/lottery/active-entries": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's live lottery entries with their next-draw time */
get: operations["LotteryWidgetController_activeEntries"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/lottery/last-win": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's most recent lottery win, if any */
get: operations["LotteryWidgetController_lastWin"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/profile-templates": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List profile-page templates (system + custom) */
get: operations["ProfileTemplateController_list"];
put?: never;
/** Create a profile-page template */
post: operations["ProfileTemplateController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/profile-templates/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** Delete a profile-page template */
delete: operations["ProfileTemplateController_remove"];
options?: never;
head?: never;
/** Update a profile-page template */
patch: operations["ProfileTemplateController_update"];
trace?: never;
};
"/customers/me/profile-templates/apply-bulk": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Assign a template to many buddies in one statement */
post: operations["ProfileTemplateController_applyBulk"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's live league standing — tier, cohort, countdown */
get: operations["LeagueWidgetController_me"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/boss-fight": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The season's Boss Fight challenge — progress, target, leaderboard */
get: operations["LeagueWidgetController_bossFight"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/seasons/latest/highlights/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's latest closed season-closing highlights */
get: operations["LeagueHighlightsController_latest"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/seasons/{seasonId}/highlights/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The buddy's personalized season-closing highlights */
get: operations["LeagueHighlightsController_me"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/off-season/status": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The off-season window — Mystery Box boost, wardrobe drops, scouting quest */
get: operations["OffSeasonController_status"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/off-season/scouting-quest": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Start the cohort pre-season scouting quest with a prediction */
post: operations["OffSeasonController_startScoutingQuest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/leagues/off-season/scouting-quest/join": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Join the cohort's already-started scouting quest */
post: operations["OffSeasonController_joinScoutingQuest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/leagues/config": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Full tier ladder, cohort/cadence config and season state */
get: operations["LeagueAdminController_getConfig"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update the cohort maths, season cadence and off-season window */
patch: operations["LeagueAdminController_updateConfig"];
trace?: never;
};
"/customers/me/leagues/tiers": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/** Bulk-replace the tier ladder — 409 if a removed tier still has buddies */
put: operations["LeagueAdminController_replaceTiers"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/leagues/seasons/preview": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Project the next three season windows (no write) */
post: operations["LeagueAdminController_previewSeasons"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/leagues/seasons": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Schedule the next upcoming season */
post: operations["LeagueAdminController_scheduleSeason"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/leagues/seasons/{seasonId}/force-close": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Manually trigger the rollover for a season (audit logged) */
post: operations["LeagueAdminController_forceClose"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/hall-of-fame/{tenantSlug}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List a tenant's finalized Hall of Fame seasons */
get: operations["HallOfFameController_getList"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/hall-of-fame/{tenantSlug}/{seasonId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** One finalized season in the public Hall of Fame */
get: operations["HallOfFameController_getSeason"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/hall-of-fame-index": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List public Hall of Fame season URLs (paged) */
get: operations["HallOfFameIndexController_getIndex"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/hexad-survey/questions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* List Hexad survey question metadata
* @description Returns the 24 question keys + axis assignment. Verbatim Marczewski text is loaded by the widget from its tenant-installable copy bundle, not from this endpoint.
*/
get: operations["HexadSurveyController_questions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/hexad-survey/responses": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Submit (or replace) the buddy Hexad survey response
* @description UPSERT keyed by buddy_id. Re-takes overwrite the previous row in place; audience_key + customer_id are sourced from the buddy row so the widget can not spoof them.
*/
post: operations["HexadSurveyController_submit"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/widget/hexad-survey/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Fetch the current buddy Hexad response
* @description Lets the survey widget render the user's own profile after they submit; absent rows resolve to `null`.
*/
get: operations["HexadSurveyController_me"];
put?: never;
post?: never;
/**
* Delete the buddy raw response (GDPR / consent withdrawal)
* @description Removes the raw answers + derived scores. The nightly aggregator picks up the lower response_count on the next run; audience-level aggregates are preserved.
*/
delete: operations["HexadSurveyController_deleteMe"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/marketing/cta": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Record a public marketing CTA click
* @description Unauthenticated browser beacon endpoint used by the marketing site to track CTA intent and first-touch attribution.
*/
post: operations["MarketingAnalyticsController_recordCtaClick"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/showrooms": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the customer’s Showroom pages */
get: operations["ShowroomAdminController_list"];
put?: never;
/** Create a Showroom page from a template */
post: operations["ShowroomAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/showrooms/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Fetch one Showroom page (admin lens) */
get: operations["ShowroomAdminController_getOne"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update layout / header / visibility */
patch: operations["ShowroomAdminController_update"];
trace?: never;
};
"/customers/me/showrooms/{id}/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Publish a Showroom (status → published) */
post: operations["ShowroomAdminController_publish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/showrooms/{id}/unpublish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Unpublish a Showroom (status → draft) */
post: operations["ShowroomAdminController_unpublish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/showrooms/{id}/regenerate-qr": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Rotate the QR token, invalidating any printed code */
post: operations["ShowroomAdminController_regenerateQr"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/showrooms/{id}/archive": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Archive a Showroom (hidden from list, kept for audit) */
post: operations["ShowroomAdminController_archive"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/players/{buddyId}/award": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** HR Award Drawer — grant a badge / skill_event / coin / kudo / forced evolution to a buddy */
post: operations["ShowroomAdminController_award"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/players/{buddyId}/awards": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Recent HR awards for a buddy (audit lens) */
get: operations["ShowroomAdminController_listPlayerAwards"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/awards": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Customer-wide HR award audit log */
get: operations["ShowroomAdminController_listAudit"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/showroom/{slug}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Resolve a Showroom slug to its public view */
get: operations["PublicShowroomController_getPublicShowroom"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/showroom/{slug}/qr": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Return the QR payload for a Showroom (url + token). PNG rendering is client-side in v1. */
get: operations["PublicShowroomController_getQrPayload"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List the customer’s hosted surfaces */
get: operations["HostedSurfacesAdminController_list"];
put?: never;
/** Create a hosted surface from a template */
post: operations["HostedSurfacesAdminController_create"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Fetch one hosted surface (admin lens) */
get: operations["HostedSurfacesAdminController_getOne"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** Update name / theme / layout / mode / widget version */
patch: operations["HostedSurfacesAdminController_update"];
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/readiness": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Per-widget content readiness for the go-live checklist
* @description Mirrors the public layout resolver: widgets without tenant content (no active streak, no marketplace items, no badge definitions) are hidden from players — this endpoint tells the operator which and why before they share the URL.
*/
get: operations["HostedSurfacesAdminController_readiness"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/logo": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Upload a hosted surface logo and attach it to the public shell theme */
post: operations["HostedSurfacesAdminController_uploadLogo"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/publish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["HostedSurfacesAdminController_publish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/unpublish": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["HostedSurfacesAdminController_unpublish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/archive": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["HostedSurfacesAdminController_archive"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/players": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["HostedSurfacesAdminController_listPlayers"];
put?: never;
/** Add a player. Provide buddy_id to link an existing buddy or display_name to mint a new one. */
post: operations["HostedSurfacesAdminController_createPlayer"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/players/{playerId}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch: operations["HostedSurfacesAdminController_updatePlayer"];
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/players/{playerId}/regenerate-access": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["HostedSurfacesAdminController_regenerateAccess"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/players/{playerId}/access-code": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Re-view a player’s current access code + QR token without rotating them. Returns available:false for players created before encrypted-at-rest storage existed — regenerate once to mint a re-viewable copy. Audited. */
get: operations["HostedSurfacesAdminController_revealAccess"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/recipes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get: operations["HostedSurfacesAdminController_listRecipes"];
put?: never;
post: operations["HostedSurfacesAdminController_upsertRecipe"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/customers/me/hosted-surfaces/{id}/recipes/{key}/run": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["HostedSurfacesAdminController_runRecipe"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/hosted-surfaces/{slug}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Resolve a hosted surface slug to its public config (theme, layout, loader URL, auth requirement). */
get: operations["PublicHostedSurfacesController_getPublic"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/hosted-surfaces/{slug}/session": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Exchange an access code or QR token for a short-lived widget session token. */
post: operations["PublicHostedSurfacesController_startSession"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/health": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Health check
* @description Full health check of all service dependencies (database, Redis, queues, image provider)
*/
get: operations["HealthController_check"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/health/ready": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Readiness check
* @description Kubernetes-style readiness probe. Returns 200 when all critical dependencies are up, 503 otherwise — load balancers use this to stop routing traffic to unhealthy instances.
*/
get: operations["HealthController_readiness"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/health/live": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Liveness check
* @description Kubernetes-style liveness probe confirming the process is alive
*/
get: operations["HealthController_liveness"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/health/version": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Build metadata
* @description Returns the API version, git commit SHA, and ISO build timestamp. Useful as a deployment fingerprint — pin a partner client against a known build, or compare expected vs actual when debugging a rollout.
*/
get: operations["HealthController_version"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/healthz": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Liveness probe (top-level alias)
* @description Kubernetes-style liveness probe. Bare path so probes do not need the API prefix.
*/
get: operations["ProbeController_healthz"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/readyz": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Readiness probe (top-level alias)
* @description Returns 200 only when database and Redis are both reachable. Bare path mirrors `/api/v1/health/ready`.
*/
get: operations["ProbeController_readyz"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/version": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* Build metadata (top-level alias)
* @description Returns API version, git commit SHA, and ISO build timestamp. Useful as a deployment fingerprint.
*/
get: operations["ProbeController_version"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
};webhooks
export type webhooks = Record<string, never>;components
export type components = {
schemas: {
UpdateCustomerDto: {
/**
* @description Customer display name
* @example Acme Corp
*/
name?: string;
};
CustomerFeaturesDto: {
/** @description Enable marketplace features */
marketplace?: boolean;
/** @description Enable token currency */
tokens?: boolean;
/** @description Enable evolution stages */
evolution?: boolean;
/** @description Enable badges */
badges?: boolean;
/** @description Enable streaks */
streaks?: boolean;
/** @description Enable the Teams social graph */
teams?: boolean;
/** @description Enable peer recognition (Kudos) */
kudos?: boolean;
/** @description Enable Group Quest widgets */
group_quest?: boolean;
/** @description Enable mentorship widgets */
mentorship?: boolean;
/** @description Enable SeeSaw Bump feed widgets */
seesaw_bump?: boolean;
/** @description Enable Mystery Box surprise-drop widgets */
mystery_box?: boolean;
/** @description Enable LEAGUES seasonal competition widgets */
leagues?: boolean;
/** @description Enable Council prestige UGC widgets */
council?: boolean;
/** @description Enable Gamification Planner admin surface */
gamification_planner?: boolean;
/** @description Enable guided path journeys */
paths?: boolean;
/** @description Enable time-based skill decay sweeps */
decay?: boolean;
};
BuddySharingSettingsDto: {
/** @description Enable public buddy sharing */
enabled?: boolean;
/** @description Show the tenant name on public share cards */
show_tenant_name?: boolean;
/**
* @description Absolute HTTP(S) URL for the primary share-page CTA
* @example https://app.example.com/signup
*/
cta_url?: string;
/**
* @description Verified share hostname, without protocol or path
* @example share.example.com
*/
custom_domain?: Record<string, never>;
/** @description Whether custom_domain DNS ownership has been verified */
custom_domain_verified?: boolean;
};
UpdateSettingsDto: {
/**
* @description Visual style for generated creatures
* @example cute
* @enum {string}
*/
creature_style?: "cute" | "fantasy" | "scifi" | "nature" | "minimal" | "custom";
/**
* @description Custom prompt for creature image generation
* @example A friendly dragon with blue scales
*/
custom_prompt?: string;
/**
* @description Widget color theme
* @example light
* @enum {string}
*/
widget_theme?: "light" | "dark" | "custom";
/**
* @description Default widget layout size
* @example medium
* @enum {string}
*/
widget_size?: "small" | "medium" | "large";
/** @description Custom CSS injected into Hatched widget shadow roots */
widget_custom_css?: string;
/** @description Structured widget theme tokens generated from onboarding or edited in the dashboard */
widget_theme_config?: Record<string, never>;
/**
* @description Language code for widget UI
* @example en
*/
language?: string;
/**
* @description IANA timezone identifier
* @example Europe/Istanbul
*/
timezone?: string;
/**
* @description Show buddy name in the widget
* @example true
*/
widget_show_name?: boolean;
/**
* @description Show skill levels in the widget
* @example true
*/
widget_show_skills?: boolean;
/**
* @description Show coin balance in the widget
* @example true
*/
widget_show_coins?: boolean;
/**
* @description Show earned badges in the widget
* @example false
*/
widget_show_badges?: boolean;
/**
* @description Show evolution progress in the widget
* @example true
*/
widget_show_evolution?: boolean;
/**
* @description Show the XP chip in the widget
* @example true
*/
widget_show_xp?: boolean;
/**
* @description Show leaderboard rank in the widget
* @example false
*/
widget_show_leaderboard_rank?: boolean;
/**
* @description Enable leaderboard feature
* @example true
*/
widget_enable_leaderboard?: boolean;
/**
* @description Browser origins allowed to call widget runtime endpoints for this customer
* @example [
* "https://app.example.com",
* "http://localhost:4002"
* ]
*/
widget_allowed_origins?: string[];
/**
* @description Image generation model identifier
* @example dall-e-3
*/
image_model?: string;
/**
* @description Image generation quality tier
* @example standard
* @enum {string}
*/
image_tier?: "standard" | "premium";
/**
* @description Maximum number of buddies a single user can own
* @example 5
*/
max_buddies_per_user?: number;
/**
* @description Maximum number of active eggs a single user can have
* @example 3
*/
max_active_eggs_per_user?: number;
/** @description Feature toggles (marketplace/tokens/evolution/badges/streaks/paths/decay) */
features?: components["schemas"]["CustomerFeaturesDto"];
/** @description Buddy-share public page and CTA preferences */
sharing?: components["schemas"]["BuddySharingSettingsDto"];
/** @description Narrative brand/visual prompt used to seed all AI-generated assets (badge icons, marketplace item art). Editable at any time. */
theme_prompt?: string;
/** @description Set true when the user manually edits theme_prompt */
theme_prompt_locked?: boolean;
};
AudienceDto: {
/** @example student */
key: string;
/** @example Students */
label: string;
/** @description Short human-readable description used in plan prompts. */
description?: string;
};
UpdateAudiencesDto: {
audiences: components["schemas"]["AudienceDto"][];
};
RegisterCustomerDto: {
/**
* @description Customer or company name
* @example Acme Corp
*/
name: string;
/**
* Format: email
* @description Email address for the account
* @example [email protected]
*/
email: string;
/**
* @description Account password (min 8 characters)
* @example S3cur3P@ss!
*/
password: string;
/**
* @description Must be true to confirm acceptance of current Hatched Terms and Privacy Policy
* @example true
*/
terms_accepted: boolean;
/**
* @description Referral attribution token, e.g. share:<buddyShareCode>, marketing, demo, or demo_try
* @example demo_try
*/
ref?: string;
};
LoginDto: {
/**
* Format: email
* @description Account email address
* @example [email protected]
*/
email: string;
/**
* @description Account password
* @example S3cur3P@ss!
*/
password: string;
};
ChangePasswordDto: {
current_password: string;
new_password: string;
};
PasswordUpdatedResponseDto: {
/** @example true */
updated: boolean;
/** @description Fresh dashboard JWT returned when the currently authenticated user changes their own password. */
token?: string;
};
RequestPasswordResetDto: {
/** Format: email */
email: string;
};
PasswordResetRequestedResponseDto: {
/** @example If that account exists, password reset instructions are available. */
message: string;
/** @description One-time reset link. Only returned for local dashboard origins so local QA can complete the flow without an email sender. */
reset_url?: string;
/**
* Format: date-time
* @description Expiry of the reset token. Present only when reset_url is.
*/
expires_at?: string;
};
ResetPasswordDto: {
token: string;
new_password: string;
};
VerifyEmailDto: {
/** @description One-time email verification token */
token: string;
};
EmailVerificationResponseDto: {
/** @example true */
verified: boolean;
};
EmailVerificationRequestedResponseDto: {
/** @example Verification instructions are available. */
message: string;
/** @description One-time verification link. Only returned for local dashboard origins so local QA can complete the flow without an email sender. */
verification_url?: string;
/**
* Format: date-time
* @description Expiry of the verification token. Present only when verification_url is.
*/
expires_at?: string;
/** @description True when the authenticated email is already verified. */
already_verified?: boolean;
};
CreateApiKeyDto: {
/**
* @description Human-readable label for the API key
* @example Production key
*/
label?: string;
};
OperationResponseDto: {
/**
* @description Unique operation identifier
* @example 550e8400-e29b-41d4-a716-446655440000
*/
id: string;
/**
* @description Operation type
* @example hatch
*/
type: string;
/**
* @description Current operation status
* @example completed
* @enum {string}
*/
status: "pending" | "processing" | "completed" | "failed" | "cancelled";
/**
* @description Type of the resource associated with this operation
* @example buddy
*/
resource_type?: string | null;
/**
* @description Identifier of the resource associated with this operation
* @example 550e8400-e29b-41d4-a716-446655440002
*/
resource_id?: string | null;
/**
* @description Result payload on success
* @example {
* "buddy_id": "550e8400-e29b-41d4-a716-446655440002"
* }
*/
result?: Record<string, never> | null;
/**
* @description Error payload on failure
* @example {
* "code": "IMAGE_GENERATION_FAILED",
* "message": "Timeout"
* }
*/
error?: Record<string, never> | null;
/**
* Format: date-time
* @description Timestamp when the operation was created
* @example 2026-04-09T12:00:00.000Z
*/
created_at: string;
/**
* Format: date-time
* @description Timestamp when the operation was last updated
* @example 2026-04-09T12:05:00.000Z
*/
updated_at: string;
};
PlayerZeroBuddyResponseDto: {
/**
* @description Buddy UUID for the workspace demo player.
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
id: string;
/**
* @description Reserved external user id used by dashboard previews.
* @example player-0
*/
user_id: string;
/**
* @description Display name shown in preview surfaces.
* @example Player Zero
*/
name: string;
/**
* @description Audience segment attached to the buddy.
* @example default
*/
audience: string;
/**
* @description Current evolution stage used by the widget preview.
* @example 1
*/
evolution_stage: number;
/**
* @description Image URL rendered by widget previews. A newly-created Player Zero may return a safe placeholder while the background base render completes.
* @example https://demo.staging.hatched.live/fern/stage-1.webp
*/
image_url: string;
};
PlayerZeroResponseDto: {
/**
* @description True only when Player Zero was created by this request.
* @example true
*/
created: boolean;
buddy: components["schemas"]["PlayerZeroBuddyResponseDto"];
};
PlayerZeroStatusResponseDto: {
/**
* @description Whether the workspace demo player has been provisioned.
* @example true
*/
exists: boolean;
/**
* @description Whether any active buddy in the workspace has completed the hatch ceremony (Player Zero or a real player — e.g. on a hosted surface).
* @example false
*/
hatched: boolean;
/**
* @description Buddy UUID, or null when Player Zero does not exist yet.
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
buddyId: string | null;
};
CreateEmbedTokenDto: {
/**
* @description UUID of the buddy to render in the widget
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
buddy_id: string;
/**
* @description Identifier of the end user viewing the widget
* @example usr_67890
*/
user_id: string;
/**
* @description Embed token lifetime in seconds. Defaults to 86400.
* @example 3600
*/
ttl_seconds?: number;
};
CreateEmbedTokenResponseDto: {
/**
* @description The signed read-only embed JWT to hand to the widget loader.
* @example eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
*/
token: string;
/**
* @description ISO 8601 timestamp when the embed token expires.
* @example 2026-05-31T12:00:00.000Z
*/
expires_at: string;
/**
* @description Always `read-only` — embed tokens never carry write scopes.
* @example read-only
*/
mode: string;
};
CreateSessionTokenDto: {
/**
* @description UUID of the buddy for this widget session
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
buddy_id: string;
/**
* @description Identifier of the end user for this session
* @example usr_67890
*/
user_id: string;
/**
* @description Permission scopes granted to this widget session
* @example [
* "read",
* "marketplace:purchase"
* ]
*/
scopes: ("read" | "events:track" | "marketplace:purchase" | "items:equip" | "marketplace:browse" | "kudos:send" | "quests:join" | "mysterybox:claim" | "council:propose" | "survey:submit" | "feed:react" | "buddy:write" | "teams:manage")[];
/**
* @description Session lifetime in seconds. Defaults to 3600.
* @example 900
*/
ttl_seconds?: number;
};
CreateSessionTokenResponseDto: {
/**
* @description The signed session JWT to hand to the widget loader.
* @example eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
*/
token: string;
/**
* @description UUID of the persisted widget session, used to revoke it.
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
session_id: string;
/**
* @description ISO 8601 timestamp when the session token expires.
* @example 2026-05-30T12:00:00.000Z
*/
expires_at: string;
/**
* @description The permission scopes granted to this session.
* @example [
* "read",
* "events:track",
* "kudos:send"
* ]
*/
scopes: ("read" | "events:track" | "marketplace:purchase" | "items:equip" | "marketplace:browse" | "kudos:send" | "quests:join" | "mysterybox:claim" | "council:propose" | "survey:submit" | "feed:react" | "buddy:write" | "teams:manage")[];
};
VerifyInstallationDto: {
/**
* @description Page URL to probe for the Hatched loader. Defaults to the first configured allowed origin when omitted.
* @example https://app.acme.com
*/
url?: string;
};
VerifyInstallationResponseDto: {
/**
* @description The final URL actually fetched, after any redirects.
* @example https://app.acme.com
*/
checked_url: string;
/** @description Whether the page could be fetched at all. */
reachable: boolean;
/** @description Whether the Hatched loader was detected in the served HTML. */
found: boolean;
/**
* @description Which signals matched, e.g. `loader script`, `mount target`.
* @example [
* "loader script",
* "mount target"
* ]
*/
signals: string[];
/** @description Human-readable outcome or failure reason, safe to surface. */
detail: string;
};
RecordShareEventDto: Record<string, never>;
WidgetBuddyHatchedDto: Record<string, never>;
BuddyHatchedBuddyDto: {
/** @description Buddy UUID. */
id: string;
/** @description Buddy display name (possibly just set by the ceremony). */
name: string | null;
/**
* @description True once the hatch ceremony completion is persisted.
* @example true
*/
hatch_ceremony_seen: boolean;
};
BuddyHatchedResponseDto: {
/** @example true */
ok: boolean;
buddy: components["schemas"]["BuddyHatchedBuddyDto"];
};
WidgetBuddySeoDto: Record<string, never>;
WidgetBuddyProfileDto: Record<string, never>;
WidgetRenderedDto: {
/**
* @description Widget IDs that successfully mounted on this page view.
* @example [
* "buddy"
* ]
*/
widgets?: string[];
/**
* @description Loader semantic version.
* @example 0.4.2
*/
loader_version?: string;
/**
* @description Opaque loader build identifier.
* @example 20260614.1
*/
build_id?: string;
};
TrackEventDto: {
/**
* @description Event type. Must already be registered for the buddy’s audience via POST /api/v1/event-types.
* @example lesson_completed
*/
type: string;
/**
* @description Client-generated unique event identifier. When omitted the server derives one from buddy + type + timestamp. Used for idempotency — send the same event_id to retry without double-counting.
* @example evt_browser_abc123
*/
event_id?: string;
/**
* @description ISO 8601 timestamp. When omitted the server uses its current time.
* @example 2026-04-22T10:00:00Z
*/
occurred_at?: string;
/**
* @description Additional properties associated with the event
* @example {
* "lesson_id": "lesson_42",
* "score": 95
* }
*/
properties?: Record<string, never>;
};
PurchaseItemDto: Record<string, never>;
EquipItemsDto: Record<string, never>;
PreviewOutfitDto: Record<string, never>;
SaveOutfitDto: Record<string, never>;
ApplyPresetDto: {
/**
* @description Key identifying the preset configuration to apply
* @example language-learning
*/
preset_key: string;
};
CreateConfigVersionDto: {
/**
* @description Configuration snapshot object containing all settings for this version
* @example {
* "coin_rules": [],
* "skill_rules": [],
* "badge_definitions": []
* }
*/
snapshot?: Record<string, never>;
};
UpdateConfigVersionDto: {
/**
* @description Updated configuration snapshot object
* @example {
* "coin_rules": [],
* "skill_rules": [],
* "badge_definitions": []
* }
*/
snapshot?: Record<string, never>;
};
CreateEggDto: {
/**
* @description Unique identifier of the end-user who owns the egg
* @example user_abc123
*/
user_id: string;
/**
* @description Arbitrary metadata to attach to the egg
* @example {
* "source": "onboarding",
* "campaign": "spring2026"
* }
*/
metadata?: Record<string, never>;
};
EggResponseDto: {
/**
* @description Unique egg identifier
* @example 550e8400-e29b-41d4-a716-446655440000
*/
egg_id: string;
/**
* @description Current egg status
* @example incubating
* @enum {string}
*/
status: "incubating" | "ready" | "hatched" | "cancelled";
/**
* @description Visual variant number for the egg appearance
* @example 3
*/
visual_variant: number;
/**
* @description Configuration version used for this egg
* @example 550e8400-e29b-41d4-a716-446655440001
*/
config_version_id: string;
/**
* @description Owner user identifier
* @example user_abc123
*/
user_id: string;
/**
* @description Identifier of the buddy hatched from this egg. Present once status === "hatched".
* @example 550e8400-e29b-41d4-a716-446655440002
*/
buddy_id?: Record<string, never> | null;
/**
* @description Arbitrary metadata attached to the egg
* @example {
* "source": "onboarding"
* }
*/
metadata?: Record<string, never> | null;
/**
* Format: date-time
* @description Timestamp when the egg was created
* @example 2026-04-09T12:00:00.000Z
*/
created_at: string;
};
UpdateEggStatusDto: {
/**
* @description New egg status
* @example ready
* @enum {string}
*/
status: "ready" | "cancelled";
};
EggStatusChangeResponseDto: {
/**
* @description Egg identifier
* @example 550e8400-e29b-41d4-a716-446655440000
*/
egg_id: string;
/**
* @description New egg status after the update
* @example ready
*/
status: string;
/**
* @description Egg status before the update
* @example incubating
*/
previous_status: string;
};
UpdateBuddyDto: {
/**
* @description New display name for the buddy
* @example Sparky
*/
name?: string;
};
SkillUpdateDto: {
/**
* @description Skill key (lowercase alphanumeric with underscores)
* @example vocabulary
*/
key: string;
/**
* @description Action to perform on the skill value
* @example increase
* @enum {string}
*/
action: "increase" | "decrease" | "set";
/**
* @description Amount to increase or decrease (used with increase/decrease actions)
* @example 10
*/
amount?: number;
/**
* @description Absolute value to set (used with set action)
* @example 50
*/
value?: number;
};
UpdateBuddySkillsDto: {
/** @description Array of skill update operations */
updates: components["schemas"]["SkillUpdateDto"][];
};
EarnCoinsDto: {
/**
* @description Action type, must be "earn"
* @example earn
* @enum {string}
*/
action: "earn";
/**
* @description Number of coins to earn
* @example 10
*/
amount: number;
/**
* @description Reason for earning coins
* @example completed_lesson
*/
reason: string;
/**
* @description Optional reference ID for tracking the source event
* @example lesson_abc123
*/
reference_id?: string;
};
SpendCoinsDto: {
/**
* @description Number of coins to spend
* @example 5
*/
amount: number;
/**
* @description Optional item ID associated with the purchase
* @example hat_red_01
*/
item_id?: string;
/**
* @description Reason for spending coins
* @example purchase_accessory
*/
reason: string;
};
AwardBadgeDto: {
/**
* @description Key of the badge definition to award
* @example first_hatch
*/
badge_key: string;
/**
* @description Optional reason for awarding the badge
* @example Manually awarded by admin
*/
reason?: string;
};
UnlockItemDto: {
/**
* @description UUID of the item to unlock
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
item_id: string;
/**
* @description Reason for unlocking the item
* @example Achievement reward
*/
reason?: string;
};
TokenTransactionDto: {
/**
* @description Customer-defined token key (e.g. "gems", "xp"). Must match a configured token_config row.
* @example gems
*/
token_type: string;
/**
* @description Transaction direction. `earn` always succeeds for active tokens; `spend` fails with progression_not_spendable for progression tokens.
* @example earn
* @enum {string}
*/
action: "earn" | "spend";
/**
* @description Number of tokens to transact
* @example 1
*/
amount: number;
/**
* @description Reason for the token transaction
* @example lesson_completed
*/
reason: string;
/**
* @description Optional reference ID for tracking the source event
* @example evt_abc123
*/
reference_id?: string;
};
CreateShareDto: Record<string, never>;
ShareEventDto: Record<string, never>;
UpdateSharingDto: Record<string, never>;
PublicShareEventDto: Record<string, never>;
CreateSkillSetDto: {
/**
* @description Name of the skill set
* @example Language Skills
*/
name: string;
/** @description Array of skill definitions (1-10 skills) */
skills: unknown[][];
};
GenerateSkillIconDto: {
/**
* @description Skill label — drives the subject of the generated icon (e.g. "Writing", "Listening")
* @example Listening
*/
label: string;
/**
* @description Optional skill description for additional context
* @example Tracks how often the learner focuses on audio-based practice
*/
description?: string;
/**
* @description Visual treatment style
* @default flat
* @enum {string}
*/
style: "flat" | "line" | "duotone" | "glyph" | "isometric";
/** @description Free-form hint to nudge the composition (e.g. "a single headphone, minimalist") */
hint?: string;
};
UpdateSkillSetDto: {
/**
* @description Name of the skill set
* @example Language Skills
*/
name?: string;
/** @description Array of skill definitions (1-10 skills) */
skills?: unknown[][];
};
CreateSkillRuleDto: {
/**
* @description Trigger event key that activates this rule
* @example lesson_completed
*/
trigger: string;
/**
* @description Skill key that receives XP when this rule triggers
* @example vocabulary
*/
skill_key: string;
/**
* @description Amount of XP to award
* @example 10
*/
amount: number;
/**
* @description Maximum times this rule can trigger per day
* @example 5
*/
daily_limit?: number;
/**
* @description Whether this skill rule is active
* @example true
*/
active?: boolean;
};
UpdateSkillRuleDto: {
/**
* @description Trigger event key that activates this rule
* @example lesson_completed
*/
trigger?: string;
/**
* @description Skill key that receives XP when this rule triggers
* @example vocabulary
*/
skill_key?: string;
/**
* @description Amount of XP to award
* @example 15
*/
amount?: number;
/**
* @description Maximum times this rule can trigger per day
* @example 5
*/
daily_limit?: number;
/**
* @description Whether this skill rule is active
* @example true
*/
active?: boolean;
};
CreateSkillDecayRuleDto: {
/**
* @description Skill key whose level decays on the chosen cadence
* @example vocabulary
*/
skill_key: string;
/**
* @description How often the decay is applied
* @example daily
* @enum {string}
*/
cadence: "daily" | "weekly" | "monthly";
/**
* @description Amount subtracted from the skill level each cadence period
* @example 2
*/
amount: number;
/**
* @description Lower bound — the skill level will never decay below this value. Defaults to 0.
* @example 20
*/
floor_level?: number;
/**
* @description Number of days after a buddy is created during which decay is suppressed.
* @example 7
*/
grace_days?: number;
/**
* @description Decay only applies when the current skill level is strictly greater than this threshold. Use to keep low-skill users from being further punished.
* @example 50
*/
apply_only_above?: number;
/**
* @description Audience scope for this rule. Defaults to "default".
* @example default
*/
audience?: string;
/**
* @description Whether the rule is active. Defaults to false so a draft rule does not start decaying production users on creation.
* @example false
*/
active?: boolean;
};
UpdateSkillDecayRuleDto: {
skill_key?: string;
/** @enum {string} */
cadence?: "daily" | "weekly" | "monthly";
amount?: number;
floor_level?: number;
grace_days?: number;
apply_only_above?: number | null;
audience?: string;
active?: boolean;
};
CreateCoinRuleDto: {
/**
* @description Trigger event key (lowercase alphanumeric with underscores)
* @example lesson_completed
*/
trigger: string;
/**
* @description Number of coins awarded when the rule triggers
* @example 10
*/
amount: number;
/**
* @description Maximum times this rule can trigger per day
* @example 5
*/
daily_limit?: number;
/**
* @description Maximum times this rule can trigger per week
* @example 20
*/
weekly_limit?: number;
/**
* @description Maximum times this rule can trigger in total
* @example 100
*/
total_limit?: number;
/**
* @description Streak multiplier configuration (e.g. { "3": 2, "7": 3 })
* @example {
* "3": 2,
* "7": 3
* }
*/
streak_config?: Record<string, never>;
/**
* @description Whether the rule is active
* @example true
*/
active?: boolean;
/** @description HTCH-79 weighted-random reward pool. When set, a deterministic weighted pick replaces the flat amount (Yu-kai Ch.11 Skinner Box). Pass null to clear. */
reward_pool?: Record<string, never> | null;
};
UpdateCoinRuleDto: {
/**
* @description Trigger event key (lowercase alphanumeric with underscores)
* @example lesson_completed
*/
trigger?: string;
/**
* @description Number of coins awarded when the rule triggers
* @example 15
*/
amount?: number;
/**
* @description Maximum times this rule can trigger per day (null to remove)
* @example 5
*/
daily_limit?: number | null;
/**
* @description Maximum times this rule can trigger per week (null to remove)
* @example 20
*/
weekly_limit?: number | null;
/**
* @description Maximum times this rule can trigger in total (null to remove)
* @example 100
*/
total_limit?: number | null;
/**
* @description Whether the rule is active
* @example true
*/
active?: boolean;
/**
* @description Streak multiplier configuration (e.g. { "3": 2, "7": 3 })
* @example {
* "3": 2,
* "7": 3
* }
*/
streak_config?: Record<string, never>;
/** @description HTCH-79 weighted-random reward pool. When set, a deterministic weighted pick replaces the flat amount (Yu-kai Ch.11 Skinner Box). Pass null to clear. */
reward_pool?: Record<string, never> | null;
};
CreateBadgeDefinitionDto: {
/**
* @description Unique badge key identifier
* @example first_hatch
*/
key: string;
/**
* @description Audiences this badge applies to. Omit for single-audience customers. One badge_definitions row is created per audience; the badge shares its key across them.
* @example [
* "student",
* "teacher"
* ]
*/
audiences?: string[];
/**
* @description Human-readable badge label
* @example First Hatch
*/
label: string;
/**
* @description Detailed badge description
* @example Awarded for hatching your first egg
*/
description?: string;
/**
* @description HTCH-16 user-facing "How to earn" copy rendered by the badges widget. Falls back to description when empty.
* @example Reach a 10-day streak by checking in every morning.
*/
criteria_copy?: string;
/**
* @description URL to the badge icon image
* @example https://cdn.example.com/badges/first_hatch.png
*/
icon_url?: string;
/**
* @description Number of coins awarded when this badge is earned
* @example 50
*/
coin_reward: number;
/**
* @description Type of criteria used to determine badge eligibility
* @example milestone
* @enum {string}
*/
criteria_type: "milestone" | "streak" | "skill_level" | "collection" | "evolution" | "coin" | "custom";
/**
* @description Configuration object for the criteria (schema depends on criteria_type)
* @example {
* "threshold": 1,
* "event": "egg_hatched"
* }
*/
criteria_config: Record<string, never>;
/**
* @description Whether the badge should be automatically awarded when criteria are met
* @example true
*/
auto_award?: boolean;
/**
* @description Whether this badge definition is active
* @example true
*/
active?: boolean;
};
GenerateBadgeIconDto: {
/**
* @description Badge label — drives the subject of the generated icon
* @example First Hatch
*/
label: string;
/**
* @description Optional badge description for additional context
* @example Awarded when a user hatches their very first buddy
*/
description?: string;
/**
* @description Visual treatment style
* @default enamel_pin
* @enum {string}
*/
style: "enamel_pin" | "medal" | "flat_modern" | "storybook" | "pixel";
/** @description Free-form hint to nudge the composition (e.g., "include a little egg with sparkles") */
hint?: string;
};
UpdateBadgeDefinitionDto: {
/**
* @description Unique badge key identifier
* @example first_hatch
*/
key?: string;
/**
* @description Replacement set of audiences for this badge. Rows are added for new audiences and removed for dropped ones (removal fails with 409 if awards exist). Omit to leave the audience set unchanged.
* @example [
* "student",
* "teacher"
* ]
*/
audiences?: string[];
/**
* @description Human-readable badge label
* @example First Hatch
*/
label?: string;
/**
* @description Detailed badge description
* @example Awarded for hatching your first egg
*/
description?: string;
/**
* @description HTCH-16 user-facing "How to earn" copy rendered by the badges widget. Pass null to clear.
* @example Reach a 10-day streak by checking in every morning.
*/
criteria_copy?: string | null;
/**
* @description URL to the badge icon image
* @example https://cdn.example.com/badges/first_hatch.png
*/
icon_url?: string;
/**
* @description Number of coins awarded when this badge is earned
* @example 50
*/
coin_reward?: number;
/**
* @description Type of criteria used to determine badge eligibility
* @example milestone
* @enum {string}
*/
criteria_type?: "milestone" | "streak" | "skill_level" | "collection" | "evolution" | "coin" | "custom";
/**
* @description Configuration object for the criteria (schema depends on criteria_type)
* @example {
* "threshold": 1,
* "event": "egg_hatched"
* }
*/
criteria_config?: Record<string, never>;
/**
* @description Whether the badge should be automatically awarded when criteria are met
* @example true
*/
auto_award?: boolean;
/**
* @description Whether this badge definition is active
* @example true
*/
active?: boolean;
};
CreateEventBadgeDto: {
badge_key: string;
trigger_window_start: string;
trigger_window_end: string;
condition?: Record<string, never>;
narrative_callout?: Record<string, never>;
enabled?: boolean;
};
UpdateEventBadgeDto: {
badge_key?: string;
trigger_window_start?: string;
trigger_window_end?: string;
condition?: Record<string, never>;
narrative_callout?: Record<string, never>;
enabled?: boolean;
};
CreateStreakDefinitionDto: {
/**
* @description Audience key. Omit for single-audience customers; required if the customer has 2+ audiences configured.
* @example learner
*/
audience?: string;
/** @example daily-practice */
key: string;
/** @example Daily practice streak */
label: string;
description?: string;
/** @enum {string} */
period: "daily" | "weekly" | "monthly";
/**
* @description Events that count toward the streak (OR-matched).
* @example [
* "lesson_completed",
* "practice_done"
* ]
*/
event_types: string[];
/**
* @default flame
* @enum {string}
*/
icon: "flame" | "heart" | "bolt" | "star" | "leaf";
/**
* @default count
* @enum {string}
*/
display_mode: "count" | "row" | "mini";
/** @default 7 */
max_row_icons: number;
/**
* @example [
* 3,
* 7,
* 30,
* 100
* ]
*/
milestones?: number[];
/** @default true */
is_active: boolean;
};
UpdateStreakDefinitionDto: {
/**
* @description Audience key. Omit for single-audience customers; required if the customer has 2+ audiences configured.
* @example learner
*/
audience?: string;
/** @example daily-practice */
key?: string;
/** @example Daily practice streak */
label?: string;
description?: string;
/** @enum {string} */
period?: "daily" | "weekly" | "monthly";
/**
* @description Events that count toward the streak (OR-matched).
* @example [
* "lesson_completed",
* "practice_done"
* ]
*/
event_types?: string[];
/**
* @default flame
* @enum {string}
*/
icon: "flame" | "heart" | "bolt" | "star" | "leaf";
/**
* @default count
* @enum {string}
*/
display_mode: "count" | "row" | "mini";
/** @default 7 */
max_row_icons: number;
/**
* @example [
* 3,
* 7,
* 30,
* 100
* ]
*/
milestones?: number[];
/** @default true */
is_active: boolean;
};
IngestEventDto: {
/**
* @description Unique event identifier from the source system
* @example evt_lesson_completed_12345
*/
event_id: string;
/**
* @description Identifier of the user who triggered the event
* @example usr_67890
*/
user_id: string;
/**
* @description Type of the event
* @example lesson_completed
*/
type: string;
/**
* @description ISO 8601 timestamp of when the event occurred. Defaults to "now" server-side if omitted.
* @example 2026-04-09T12:00:00Z
*/
occurred_at?: string;
/**
* @description Audience (rol) this event belongs to. Required when the customer has 2+ audiences; omitted for single-audience customers (server uses the implicit default).
* @example student
*/
audience?: string;
/**
* @description Additional properties associated with the event
* @example {
* "lesson_id": "lesson_42",
* "score": 95,
* "duration_seconds": 300
* }
*/
properties?: Record<string, never>;
};
IngestBatchDto: {
/** @description Array of events to ingest (max 100) */
events: components["schemas"]["IngestEventDto"][];
};
CreateEventTypeDto: {
/**
* @description Machine event name. Lowercase identifiers with underscores or dots recommended.
* @example lesson_completed
*/
name: string;
/**
* @description Audience key. Omit for single-audience customers.
* @example learner
*/
audience?: string;
/**
* @description Human-readable label shown in the dashboard.
* @example Lesson completed
*/
display_label?: string;
/** @description Free-form description of when this event is emitted. */
description?: string;
/**
* @description Whether ingest accepts this event type. Defaults to true.
* @default true
*/
is_active: boolean;
};
UpdateEventTypeDto: {
/** @description Rename the event. Propagates to event_ingestions, coin_rules, skill_rules, badge_definitions.condition_config.event, streak_definitions.event_types, webhook_configs.events, and custom_counters JSONB keys. */
name?: string;
display_label?: string;
description?: string;
is_active?: boolean;
};
UpsertTokenConfigDto: {
/** @description Token configurations to create or update. A typical customer has exactly two entries: one primary + one progression. */
tokens: unknown[][];
};
CreateMarketplaceDto: {
/**
* @description Name of the marketplace
* @example Avatar Shop
*/
name: string;
/**
* @description Pricing mode for marketplace items
* @example mixed
* @enum {string}
*/
pricing_mode?: "coins_only" | "free_only" | "mixed";
/**
* @description How items can be unlocked
* @example both
* @enum {string}
*/
unlock_mode?: "purchase" | "earn" | "both";
/**
* @description List of item categories available in this marketplace
* @example [
* "head",
* "background",
* "accessory"
* ]
*/
categories?: string[];
};
UpdateMarketplaceDto: {
/**
* @description Name of the marketplace
* @example Avatar Shop
*/
name?: string;
/**
* @description Pricing mode for marketplace items
* @example mixed
* @enum {string}
*/
pricing_mode?: "coins_only" | "free_only" | "mixed";
/**
* @description How items can be unlocked
* @example both
* @enum {string}
*/
unlock_mode?: "purchase" | "earn" | "both";
/**
* @description List of item categories available in this marketplace
* @example [
* "head",
* "background",
* "accessory"
* ]
*/
categories?: string[];
/**
* @description Whether the marketplace is active
* @example true
*/
active?: boolean;
};
CreateItemDto: {
/**
* @description Unique key identifier for the item
* @example wizard-hat
*/
key: string;
/**
* @description Display label for the item
* @example Wizard Hat
*/
label: string;
/**
* @description Description of the item
* @example A mystical hat that grants wisdom
*/
description?: string;
/**
* @description Canonical item category. Drives compositing z-order and equip conflict detection.
* @example head
* @enum {string}
*/
category: "background" | "body" | "feet" | "hand" | "neck" | "face" | "head" | "accessory" | "booster";
/**
* @description Price of the item in coins
* @example 100
*/
price?: number;
/**
* @description Rarity tier of the item
* @example rare
* @enum {string}
*/
rarity?: "common" | "uncommon" | "rare" | "epic" | "legendary";
/**
* @description URL to the item image
* @example https://cdn.example.com/items/wizard-hat.png
*/
image_url?: string;
/**
* @description Visibility rules controlling who can see this item
* @example {
* "type": "all",
* "config": {}
* }
*/
visibility_rules?: Record<string, never>;
/**
* @description Requirements a buddy must meet to purchase this item
* @example {
* "min_evolution_stage": 2,
* "min_total_level": 5
* }
*/
requirements?: Record<string, never>;
/**
* @description Feature-specific item metadata. Booster items use booster_type, multiplier and duration_seconds.
* @example {
* "booster_type": "coin_x2_24h",
* "multiplier": 2,
* "duration_seconds": 86400
* }
*/
metadata?: Record<string, never>;
/**
* @description Whether the item is active and available for purchase
* @example true
*/
active?: boolean;
/**
* @description HTCH-53 Social Treasure — when true the item is gift-only: it cannot be bought for oneself, only received as a gift from a teammate.
* @example false
*/
is_gift_only?: boolean;
/**
* @description HTCH-14 availability window start (ISO-8601). Null = no lower bound.
* @example 2026-06-01T00:00:00.000Z
*/
available_from?: Record<string, never> | null;
/**
* @description HTCH-14 availability window end (ISO-8601). Null = no upper bound.
* @example 2026-07-01T00:00:00.000Z
*/
available_until?: Record<string, never> | null;
};
ImportMarketplaceItemsDto: {
/**
* @description Format of the import payload
* @example json
* @enum {string}
*/
format: "json" | "csv";
/**
* @description Serialized import data in the specified format
* @example [{"key":"sword","label":"Sword","category":"weapons","price":50}]
*/
payload: string;
};
UpdateItemDto: {
/**
* @description Unique key identifier for the item
* @example wizard-hat
*/
key?: string;
/**
* @description Display label for the item
* @example Wizard Hat
*/
label?: string;
/**
* @description Description of the item
* @example A mystical hat that grants wisdom
*/
description?: string;
/**
* @description Canonical item category. Drives compositing z-order and equip conflict detection.
* @example head
* @enum {string}
*/
category?: "background" | "body" | "feet" | "hand" | "neck" | "face" | "head" | "accessory" | "booster";
/**
* @description Price of the item in coins
* @example 100
*/
price?: number;
/**
* @description Rarity tier of the item
* @example rare
* @enum {string}
*/
rarity?: "common" | "uncommon" | "rare" | "epic" | "legendary";
/**
* @description URL to the item image
* @example https://cdn.example.com/items/wizard-hat.png
*/
image_url?: string;
/**
* @description Visibility rules controlling who can see this item
* @example {
* "type": "all",
* "config": {}
* }
*/
visibility_rules?: Record<string, never>;
/**
* @description Requirements a buddy must meet to purchase this item
* @example {
* "min_evolution_stage": 2,
* "min_total_level": 5
* }
*/
requirements?: Record<string, never>;
/**
* @description Feature-specific item metadata. Booster items use booster_type, multiplier and duration_seconds.
* @example {
* "booster_type": "coin_x2_24h",
* "multiplier": 2,
* "duration_seconds": 86400
* }
*/
metadata?: Record<string, never>;
/**
* @description Whether the item is active and available for purchase
* @example true
*/
active?: boolean;
/**
* @description HTCH-53 Social Treasure — when true the item is gift-only: it cannot be bought for oneself, only received as a gift from a teammate.
* @example false
*/
is_gift_only?: boolean;
/**
* @description HTCH-14 availability window — ISO-8601. null clears the bound. Both nullable; null = open in that direction.
* @example 2026-06-01T00:00:00.000Z
*/
available_from?: Record<string, never> | null;
/**
* @description HTCH-14 availability window end. Null clears.
* @example 2026-07-01T00:00:00.000Z
*/
available_until?: Record<string, never> | null;
};
ReorderItemsDto: {
/**
* @description Ordered list of item UUIDs defining the new display order
* @example [
* "b3d7c8a0-1234-4f5e-9abc-def012345678",
* "c4e8d9b1-5678-4a6f-0bcd-ef1234567890"
* ]
*/
item_ids: string[];
};
GiftItemDto: {
/**
* @description UUID of the buddy that receives the gift
* @example b3d7c8a0-1234-4f5e-9abc-def012345678
*/
to_buddy_id: string;
/**
* @description Optional note delivered with the gift (max 280 chars)
* @example Great work on the launch — wear it with pride!
*/
message?: string;
};
ScheduleFlashSaleDto: {
name: string;
starts_at: string;
duration_minutes?: number;
discount_percent?: number;
item_selection_mode?: string;
curated_item_ids?: string[];
};
MarketplaceFomoQueryDto: {
item_ids: string[];
};
EquipLegacyItemDto: Record<string, never>;
CreateWebhookConfigDto: {
/**
* @description URL that will receive webhook POST requests
* @example https://api.example.com/webhooks/hatched
*/
url: string;
/**
* @description List of event types to subscribe to. If omitted, subscribes to all events.
* @example [
* "buddy.hatched",
* "coins.earned",
* "badge.awarded"
* ]
*/
events?: string[];
};
WebhookEventTypesResponseDto: {
/**
* @description Canonical event types accepted by webhook subscriptions.
* @example [
* "egg.created",
* "buddy.hatched",
* "badge.awarded"
* ]
*/
events: string[];
};
UpdateWebhookConfigDto: {
/**
* @description URL that will receive webhook POST requests
* @example https://api.example.com/webhooks/hatched
*/
url?: string;
/**
* @description List of event types to subscribe to
* @example [
* "buddy.hatched",
* "coins.earned",
* "badge.awarded"
* ]
*/
events?: string[];
/**
* @description Whether the webhook config is active
* @example true
*/
active?: boolean;
};
FeatureActivityWeekDto: {
/**
* @description ISO week start date.
* @example 2026-06-01
*/
week_start: string;
/**
* @description Events in that week.
* @example 12
*/
count: number;
};
FeatureActivityFeatureDto: {
/**
* @description Planner feature key.
* @example kudos
*/
feature_key: string;
/**
* @description Display label.
* @example Kudos
*/
label: string;
/**
* @description Telemetry event types rolled up under this feature.
* @example [
* "kudos.sent"
* ]
*/
event_types: string[];
/**
* @description Total events in the window.
* @example 84
*/
total: number;
/**
* @description Total events in the preceding window (delta baseline).
* @example 61
*/
prev_total: number;
weekly: components["schemas"]["FeatureActivityWeekDto"][];
};
FeatureActivityResponseDto: {
/**
* @description Lookback window in weeks.
* @example 8
*/
weeks: number;
features: components["schemas"]["FeatureActivityFeatureDto"][];
};
BillingCreditsDto: {
/** @example 20 */
welcome: number;
/** @example 600 */
paid: number;
/** @example 50 */
promo: number;
/**
* Format: date-time
* @description Promo credit expiry, or null when there are no expiring promo credits.
*/
promo_expires_at?: string | null;
/** @example 670 */
total_spendable: number;
};
BillingEventQuotaDto: {
/**
* @description Monthly event limit. Null means unlimited.
* @example 500000
*/
limit: Record<string, never> | null;
/** @example 120450 */
used: number;
/** Format: date-time */
reset_at: string;
};
BillingIncludedCreditsDto: {
/**
* @description Monthly included AI credit grant. Null means unlimited.
* @example 50
*/
monthly: Record<string, never> | null;
/**
* @description Included AI credit grant for the current Stripe billing period. Null means unlimited or unknown.
* @example 600
*/
current_period: Record<string, never> | null;
/**
* @description Detected Stripe billing interval for the current subscription, if known.
* @enum {string|null}
*/
interval: "monthly" | "annual" | null;
};
BillingSubscriptionDto: {
/**
* @description Current Stripe subscription id, if the customer has one.
* @example sub_123
*/
stripe_subscription_id?: Record<string, never> | null;
/**
* @description Live Stripe subscription status when it could be fetched.
* @example active
*/
status?: Record<string, never> | null;
/**
* Format: date-time
* @description Current Stripe period end. For active subscriptions this is the next invoice date.
*/
current_period_end_at?: string | null;
/**
* Format: date-time
* @description Next invoice date for the current subscription, when known.
*/
next_invoice_at?: string | null;
/** @example false */
cancel_at_period_end: boolean;
/**
* @description Detected Stripe billing interval for the current subscription, if known.
* @enum {string|null}
*/
interval: "monthly" | "annual" | null;
/**
* @description True when the subscription summary was refreshed from Stripe during this request.
* @example true
*/
synced: boolean;
};
BillingStatusResponseDto: {
/** @enum {string} */
plan: "starter" | "growth" | "pro" | "enterprise";
/** @example Launch */
plan_public_name: string;
/** @example active */
billing_status: string;
/** @example cus_123 */
stripe_customer_id?: Record<string, never> | null;
/** @example true */
has_subscription: boolean;
credits: components["schemas"]["BillingCreditsDto"];
event_quota: components["schemas"]["BillingEventQuotaDto"];
included_credits: components["schemas"]["BillingIncludedCreditsDto"];
subscription: components["schemas"]["BillingSubscriptionDto"];
/** @description Raw plan definition from PLAN_MATRIX retained for backwards compatibility. */
plan_matrix: Record<string, never>;
};
SeedFromUrlDto: {
/**
* @description Operator's public website URL to scrape for onboarding seed
* @example https://flalingo.com
*/
url: string;
};
RepoIntegrationContextDto: Record<string, never>;
RepoBriefDto: {
product_description: string;
audience: string;
sector?: string;
gamification_goals: string[];
possible_events: string[];
feature_fit_scores: Record<string, never>;
integration_context?: components["schemas"]["RepoIntegrationContextDto"];
confidence?: Record<string, never>;
notes?: string;
};
SeedFromRepoDto: {
/** @description Brand brief JSON produced by the operator's AI coding assistant after running the Hatched repo-analysis prompt. */
brief: components["schemas"]["RepoBriefDto"];
/** @description Which agent produced the brief (claude-code / codex / copilot / other). */
agent?: string;
};
SeedFromDescriptionDto: {
/** @enum {string} */
audience: "employees" | "customers" | "learners" | "players" | "members" | "mixed";
/** @enum {string} */
surface: "web" | "mobile" | "intranet" | "offline" | "internal_tool";
/** @enum {string} */
org_type: "hr" | "ld" | "sales" | "customer_success" | "community" | "other";
/** @description Optional free-text the operator adds after the chips. */
description?: string;
};
WaitlistDto: {
/**
* @description Integration kind the operator wants to be notified about
* @example github
* @enum {string}
*/
kind: "github" | "mixpanel";
/**
* @description Email to notify
* @example [email protected]
*/
email: string;
/** @description Optional free-text note from the operator */
notes?: string;
};
ProductSummary: Record<string, never>;
PriorityProfile: Record<string, never>;
UpdateAnswersDto: {
product?: components["schemas"]["ProductSummary"];
goals?: string[];
events?: string[];
marketplace_enabled?: boolean;
evolution_enabled?: boolean;
badges_enabled?: boolean;
tokens_enabled?: boolean;
streaks_enabled?: boolean;
paths_enabled?: boolean;
skill_names_approved?: string[];
badge_names_approved?: string[];
item_categories_enabled?: string[];
priority_profile?: components["schemas"]["PriorityProfile"];
feature_recommendations?: Record<string, never>;
};
SendMessageDto: {
content: string;
};
CreateUploadUrlDto: {
stage: number;
mime_type: string;
byte_size: number;
};
CommitAssetDto: {
storage_path: string;
};
UpsertTokenGateDto: {
/**
* @description Stable gate identifier. snake_case, under 100 chars. Unique per customer.
* @example advanced-mode
*/
gate_key: string;
/**
* @description Token key this gate consumes (must match a token_config row).
* @example gems
*/
token_key: string;
/**
* @description Token cost to unlock this gate.
* @example 50
*/
cost: number;
/** @description Display label shown in dashboard/widgets. */
label?: string;
/** @description Free-form description of what unlocking grants. */
description?: string;
/**
* @description Arbitrary metadata the app code reads to decide what the unlock enables.
* @example {
* "feature": "advanced-mode",
* "min_evolution_stage": 2
* }
*/
metadata?: Record<string, never>;
/** @default true */
is_active: boolean;
};
CreatePathDefinitionDto: {
/**
* @description Audience key. Omit for single-audience customers; required if 2+ audiences are configured.
* @example learner
*/
audience?: string;
/** @example english_a2 */
key: string;
/** @example English A2 path */
label: string;
description?: string;
/**
* @default path
* @enum {string}
*/
icon: "path" | "flame" | "heart" | "bolt" | "star" | "leaf";
/** @description Hex accent color override (e.g. "#7c3aed"). Falls back to brand accent. */
accent_color?: string;
/**
* @default straight
* @enum {string}
*/
display_mode: "straight" | "zigzag" | "stepper";
/** @default true */
is_active: boolean;
};
UpdatePathDefinitionDto: {
/**
* @description Audience key. Omit for single-audience customers; required if 2+ audiences are configured.
* @example learner
*/
audience?: string;
/** @example english_a2 */
key?: string;
/** @example English A2 path */
label?: string;
description?: string;
/**
* @default path
* @enum {string}
*/
icon: "path" | "flame" | "heart" | "bolt" | "star" | "leaf";
/** @description Hex accent color override (e.g. "#7c3aed"). Falls back to brand accent. */
accent_color?: string;
/**
* @default straight
* @enum {string}
*/
display_mode: "straight" | "zigzag" | "stepper";
/** @default true */
is_active: boolean;
};
CreatePathStepDto: {
/** @example speaking_sprint */
key: string;
/** @example Speaking sprint */
label: string;
description?: string;
icon?: string;
/** @example 1 */
ordinal: number;
/**
* @description Optional override for unlock semantics. If omitted, the step unlocks when the previous step (by ordinal) is completed.
* @example {
* "type": "badge_earned",
* "config": {
* "badge_key": "novice"
* }
* }
*/
unlock_condition?: Record<string, never>;
/**
* @description Optional step-level completion shortcut. When set and matched by the rule engine, the step completes outright and any incomplete sub-steps cascade to completed. Cannot be `custom` (use sub-step manual completion for that flow).
* @example {
* "type": "event_count",
* "config": {
* "event_type": "lesson_completed",
* "threshold": 5
* }
* }
*/
completion_condition?: Record<string, never>;
/** @default 0 */
reward_coins: number;
reward_badge_key?: string;
/** @default true */
is_active: boolean;
};
ReorderEntryDto: {
/** @description UUID of the step or sub-step to place at this ordinal */
id: string;
ordinal: number;
};
ReorderDto: {
ordering: components["schemas"]["ReorderEntryDto"][];
};
UpdatePathStepDto: {
/** @example speaking_sprint */
key?: string;
/** @example Speaking sprint */
label?: string;
description?: string;
icon?: string;
/** @example 1 */
ordinal?: number;
/**
* @description Optional override for unlock semantics. If omitted, the step unlocks when the previous step (by ordinal) is completed.
* @example {
* "type": "badge_earned",
* "config": {
* "badge_key": "novice"
* }
* }
*/
unlock_condition?: Record<string, never>;
/**
* @description Optional step-level completion shortcut. When set and matched by the rule engine, the step completes outright and any incomplete sub-steps cascade to completed. Cannot be `custom` (use sub-step manual completion for that flow).
* @example {
* "type": "event_count",
* "config": {
* "event_type": "lesson_completed",
* "threshold": 5
* }
* }
*/
completion_condition?: Record<string, never>;
/** @default 0 */
reward_coins: number;
reward_badge_key?: string;
/** @default true */
is_active: boolean;
};
CreatePathSubStepDto: {
/** @example lesson_3 */
key: string;
/** @example Greetings */
label: string;
description?: string;
/** @example 1 */
ordinal: number;
/**
* @description Rule-engine predicate evaluated after each event. Omit and set allow_manual_complete=true for purely manual sub-steps.
* @example {
* "type": "event_count",
* "config": {
* "event_type": "lesson_completed",
* "threshold": 3
* }
* }
*/
completion_condition?: Record<string, never>;
/** @default false */
allow_manual_complete: boolean;
/**
* @description When true, sub-steps inside the same step can be completed out of ordinal order.
* @default false
*/
allow_skip_ahead: boolean;
/** @default 0 */
reward_coins: number;
reward_badge_key?: string;
/** @description Optional deep-link to the customer LMS/app where the sub-step lives. The widget renders a CTA button when present. */
content_url?: string;
/** @example Open lesson */
cta_label?: string;
/** @default true */
is_active: boolean;
};
UpdatePathSubStepDto: {
/** @example lesson_3 */
key?: string;
/** @example Greetings */
label?: string;
description?: string;
/** @example 1 */
ordinal?: number;
/**
* @description Rule-engine predicate evaluated after each event. Omit and set allow_manual_complete=true for purely manual sub-steps.
* @example {
* "type": "event_count",
* "config": {
* "event_type": "lesson_completed",
* "threshold": 3
* }
* }
*/
completion_condition?: Record<string, never>;
/** @default false */
allow_manual_complete: boolean;
/**
* @description When true, sub-steps inside the same step can be completed out of ordinal order.
* @default false
*/
allow_skip_ahead: boolean;
/** @default 0 */
reward_coins: number;
reward_badge_key?: string;
/** @description Optional deep-link to the customer LMS/app where the sub-step lives. The widget renders a CTA button when present. */
content_url?: string;
/** @example Open lesson */
cta_label?: string;
/** @default true */
is_active: boolean;
};
WinStateBragResponseDto: {
/** @description BragPayload — share copy, public profile URL, and OG-card refs the ceremony Share CTA renders. */
payload: Record<string, never>;
/**
* @description Tenant-enabled share channels; empty when the Planner toggle is off (the BragButton self-hides).
* @example [
* "linkedin",
* "copy_link"
* ]
*/
enabled_channels: string[];
};
CreateSurpriseDropDto: {
name: string;
trigger_event: string;
chance: number;
reward_type: string;
reward_amount?: number;
reward_ref?: string;
condition?: Record<string, never>;
narrative_copy: Record<string, never>;
enabled?: boolean;
};
UpdateSurpriseDropDto: {
name?: string;
trigger_event?: string;
chance?: number;
reward_type?: string;
reward_amount?: number;
reward_ref?: string;
condition?: Record<string, never>;
narrative_copy?: Record<string, never>;
enabled?: boolean;
};
AdminGrantBoosterDto: {
buddy_id: string;
key: string;
};
PurchaseBoosterDto: {
key: string;
};
CreateLotteryDto: {
name: string;
eligibility_rule: Record<string, never>;
cadence: string;
prize_pool: string[];
draw_at: Record<string, never>;
tz?: string;
active?: boolean;
};
UpdateLotteryDto: {
name?: string;
eligibility_rule?: Record<string, never>;
cadence?: string;
prize_pool?: string[];
draw_at?: Record<string, never>;
tz?: string;
active?: boolean;
};
CreateProfileTemplateDto: {
name: string;
source_template: string;
layout: Record<string, never>;
theme_overrides?: Record<string, never>;
is_default?: boolean;
};
UpdateProfileTemplateDto: {
name?: string;
layout?: Record<string, never>;
theme_overrides?: Record<string, never>;
is_default?: boolean;
};
BulkApplyTargetDto: Record<string, never>;
BulkApplyDto: {
template_id: string;
target: components["schemas"]["BulkApplyTargetDto"];
};
SeasonClosingDiscoveryResponseDto: {
/** @description SeasonHighlightsSnapshot — the four personalized highlights plus cohort outcome; `available: false` when the buddy has no closed season. */
snapshot: Record<string, never>;
/** @description Closed season UUID, or null when none exists. */
season_id: string | null;
/** @description Name of the tier below the buddy’s final tier (demotion-grief copy), or null. */
lower_tier_name: string | null;
};
StartScoutingQuestDto: {
prediction_value: number;
};
ReplaceLeagueTiersDto: {
tiers: string[];
};
BossFightConfigDto: {
enabled: boolean;
name: string;
description: string;
target_metric: string;
target_value: number;
badge_key?: Record<string, never>;
mythic_item_id?: Record<string, never>;
ghost_grave_enabled: boolean;
};
UpdateLeagueConfigDto: {
season_duration_days?: number;
start_day_of_week?: number;
start_hour?: number;
cohort_size?: number;
promote_pct?: number;
demote_pct?: number;
off_season_duration_days?: number;
off_season_mystery_box_multiplier?: number;
off_season_wardrobe_drop_ids?: string[];
off_season_scouting_quest_enabled?: boolean;
boss_fight?: components["schemas"]["BossFightConfigDto"];
auto_renew?: boolean;
promotion_reward_coins?: number;
};
ScheduleLeagueSeasonDto: {
name?: string;
starts_at?: string;
};
CreateShowroomDto: Record<string, never>;
UpdateShowroomDto: Record<string, never>;
AwardDto: Record<string, never>;
CreateSurfaceDto: Record<string, never>;
SurfaceWidgetReadinessEntryDto: {
/**
* @description Widget mount key from the surface layout.
* @example streak
*/
key: string;
/**
* @description False when the public layout resolver will hide this widget from players.
* @example false
*/
servable: boolean;
/**
* @description Why the widget is (un)servable.
* @example no_active_streak
* @enum {string}
*/
reason: "ready" | "no_active_streak" | "no_marketplace_items" | "no_badge_definitions";
/**
* @description Resolved tenant streak key injected into the streak mount (streak widgets only).
* @example daily_lesson
*/
streak_key?: string;
};
SurfaceWidgetReadinessResponseDto: {
entries: components["schemas"]["SurfaceWidgetReadinessEntryDto"][];
};
UpdateSurfaceDto: Record<string, never>;
CreatePlayerDto: Record<string, never>;
UpdatePlayerDto: Record<string, never>;
UpsertRecipeDto: Record<string, never>;
RunRecipeDto: Record<string, never>;
StartSessionDto: Record<string, never>;
};
responses: never;
parameters: never;
requestBodies: never;
headers: never;
pathItems: never;
};$defs
export type $defs = Record<string, never>;operations
export interface operations {
CustomersController_getProfile: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_updateProfile: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateCustomerDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_getReferral: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_updateSettings: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSettingsDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_suggestWidgetTheme: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_updateAudiences: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateAudiencesDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_regenerateAssets: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersController_deleteUserData: {
parameters: {
query?: never;
header?: never;
path: {
user_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_getState: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_updateToggles: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_getOctalysisState: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_publishDraft: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_discardDraft: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_getFeatureConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerFeatureToggleController_updateFeatureConfig: {
parameters: {
query?: never;
header?: never;
path: {
feature_key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerNarrativeController_getNarrative: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerNarrativeController_updateNarrative: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerNarrativeController_getNarrativeAudit: {
parameters: {
query: {
field: string;
limit: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerMissionAnchorController_getConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomerMissionAnchorController_updateConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_apply: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_patch: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_skip: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_audit: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SixDWizardController_driftStats: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_register: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RegisterCustomerDto"];
};
};
responses: {
/** @description Customer registered successfully. Returns a dashboard JWT; raw API keys are NOT returned here — call POST /auth/api-keys after login to mint one. */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error or email already in use */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_login: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LoginDto"];
};
};
responses: {
/** @description Login successful, returns customer data and JWT token */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid email or password */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_getSsoConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_startSso: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_completeSso: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_changePassword: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ChangePasswordDto"];
};
};
responses: {
/** @description Password changed */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PasswordUpdatedResponseDto"];
};
};
};
};
AuthController_requestPasswordReset: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RequestPasswordResetDto"];
};
};
responses: {
/** @description Always returns the same message regardless of whether the account exists (no account enumeration). reset_url/expires_at are only present for local dashboard origins. */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PasswordResetRequestedResponseDto"];
};
};
};
};
AuthController_resetPassword: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ResetPasswordDto"];
};
};
responses: {
/** @description Password reset */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PasswordUpdatedResponseDto"];
};
};
};
};
AuthController_verifyEmail: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["VerifyEmailDto"];
};
};
responses: {
/** @description Email verified */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EmailVerificationResponseDto"];
};
};
};
};
AuthController_requestEmailVerification: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Email verification requested */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EmailVerificationRequestedResponseDto"];
};
};
};
};
AuthController_me: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the authenticated customer profile and settings */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized - invalid or missing JWT token */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_whoami: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Caller identity + plan capabilities resolved. */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized — credential is missing, expired, or revoked */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_listApiKeys: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns a list of active API keys with masked key values */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_createApiKey: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateApiKeyDto"];
};
};
responses: {
/** @description API key created successfully. The raw key is returned only once. */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Maximum number of API keys reached */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_rotateApiKey: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateApiKeyDto"];
};
};
responses: {
/** @description All previous keys revoked and a new key created */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_revokeApiKey: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description API key revoked successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description API key not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AuthController_createPublishableKey: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Publishable key created. The raw key is returned only once. */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Scope set rejected */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OperationsController_findOne: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the operation details */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["OperationResponseDto"];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Operation not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OperationsController_findAll: {
parameters: {
query: {
type: string;
status: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns an array of operations */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["OperationResponseDto"][];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OperationsController_cancel: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Operation cancelled successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Operation cannot be cancelled in its current state */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Operation not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_createPreviewTokens: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_getPlayerZeroStatus: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Player Zero existence + hatch status */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PlayerZeroStatusResponseDto"];
};
};
};
};
WidgetSessionsController_createPlayerZero: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Player Zero created or already present */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PlayerZeroResponseDto"];
};
};
/** @description No published config version to attach the player to */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_createEmbedToken: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateEmbedTokenDto"];
};
};
responses: {
/** @description Embed token created */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CreateEmbedTokenResponseDto"];
};
};
/** @description Buddy does not exist for this tenant */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation failed */
422: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_createSessionToken: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSessionTokenDto"];
};
};
responses: {
/** @description Session token created with scoped permissions */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CreateSessionTokenResponseDto"];
};
};
/** @description Buddy does not exist for this tenant */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation failed */
422: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_revokeSession: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Widget session UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Session revoked successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Widget session not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetSessionsController_verifyInstallation: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["VerifyInstallationDto"];
};
};
responses: {
/** @description Verification result */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["VerifyInstallationResponseDto"];
};
};
/** @description No URL supplied and none configured */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getBuddy: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Buddy state and widget config returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_createShareLink: {
parameters: {
query: {
channel: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Share link payload */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_recordShareEvent: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RecordShareEventDto"];
};
};
responses: {
/** @description Recorded (best-effort) */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_markBuddyHatched: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["WidgetBuddyHatchedDto"];
};
};
responses: {
/** @description Recorded (idempotent) */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["BuddyHatchedResponseDto"];
};
};
};
};
WidgetApiController_updateBuddySeo: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["WidgetBuddySeoDto"];
};
};
responses: {
/** @description Updated SEO preference */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_updateBuddyProfile: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["WidgetBuddyProfileDto"];
};
};
responses: {
/** @description Updated profile preferences */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getState: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Aggregate state returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Not modified (ETag matched) */
304: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getNarrative: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Resolved narrative returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getNarrativeArc: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Program Chapters arc view returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getMissionAnchor: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Mission Anchor payload returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_recordRendered: {
parameters: {
query?: never;
header: {
origin: string;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["WidgetRenderedDto"];
};
};
responses: {
/** @description Render beacon accepted */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_trackEvent: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["TrackEventDto"];
};
};
responses: {
/** @description Event accepted; effects returned */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid event or type not registered */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getMarketplace: {
parameters: {
query?: {
/** @description Filter by item category */
category?: string;
/** @description Filter by rarity tier */
rarity?: string;
/** @description Page number (default: 1) */
page?: number;
/** @description Items per page (default: 50) */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paginated marketplace items with visibility and ownership info */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_trackMarketplaceItemView: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Item UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Impression recorded */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_purchaseItem: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PurchaseItemDto"];
};
};
responses: {
/** @description Item purchased successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Insufficient coins or item not available */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Missing required scope */
403: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_equipItems: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["EquipItemsDto"];
};
};
responses: {
/** @description Items equipped/unequipped successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Missing required scope */
403: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_rerenderAppearance: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Rerender queued */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy is already ready or has another op in flight */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_previewOutfit: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PreviewOutfitDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_compositionStatus: {
parameters: {
query: {
variant_id: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_listOutfits: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_saveOutfit: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SaveOutfitDto"];
};
};
responses: {
/** @description Outfit saved */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Outfit cap reached */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_activateOutfit: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_deleteOutfit: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getBadges: {
parameters: {
query?: {
/** @description Include locked badge definitions in the legacy locked array (default true) */
include_locked?: boolean;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Earned + locked badges returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getActivePath: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Path runtime payload, or null when no active path exists */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getPathByKey: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Path definition key (URL-safe slug) */
key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Path runtime payload returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Path not found for this audience */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_completePathSubStep: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Path definition key */
key: string;
/** @description Sub-step key */
subKey: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getStreak: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Streak definition key (URL-safe slug) */
key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Streak definition + current progress */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Streak not found or inactive */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getEvolutions: {
parameters: {
query?: {
/** @description Max rows (default 10, max 50) */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paginated evolution history */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getTokens: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Token wallet returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getOperation: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Operation UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Operation status returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Operation not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getLiveTheme: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Live theme returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WidgetApiController_getNextBestAction: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Next-best-action returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PresetsController_listPresets: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of available presets returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PresetsController_getPreset: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Preset key identifier */
key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Preset configuration returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Preset not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PresetsController_applyPreset: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ApplyPresetDto"];
};
};
responses: {
/** @description Preset applied successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid preset key */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Preset not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_findAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of config versions returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateConfigVersionDto"];
};
};
responses: {
/** @description Draft config version created or returned */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid input */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Config version UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Config version returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Config version UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateConfigVersionDto"];
};
};
responses: {
/** @description Config version updated */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_publish: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Config version UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Config version published */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Draft has no configuration to publish */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version is not a draft (already published or archived) and cannot be published */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_getImpact: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Config version UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Impact analysis returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_clone: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Source config version UUID to clone from */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description New draft config version created from clone */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Source config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ConfigVersionsController_migrateBuddies: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Published config version UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Buddies migrated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Config version not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EggsController_findAll: {
parameters: {
query: {
user_id: string;
status: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns an array of eggs matching the filters */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EggResponseDto"][];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EggsController_create: {
parameters: {
query?: {
/** @description When true, return the user's most recent waiting/ready egg if one exists instead of creating a new one (idempotent first-run bootstrap). */
ensure?: boolean;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateEggDto"];
};
};
responses: {
/** @description Egg created (or existing active egg returned when ensure=true) */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EggResponseDto"];
};
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description No published config version (no_published_config), or the per-user active-egg limit was reached (active_egg_limit) */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EggsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the egg details */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EggResponseDto"];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Egg not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EggsController_updateStatus: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateEggStatusDto"];
};
};
responses: {
/** @description Egg status updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["EggStatusChangeResponseDto"];
};
};
/** @description Invalid status transition */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Egg not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EggsController_hatch: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Hatch process initiated, returns an operation ID to poll for status */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Egg is not in a hatchable state */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Egg not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_findAll: {
parameters: {
query?: {
/** @description Page number (1-based) */
page?: number;
/** @description Number of items per page */
limit?: number;
/** @description Field name to sort by */
sort?: string;
/** @description Sort direction */
order?: "asc" | "desc";
/** @description Filter buddies by user identifier */
user_id?: string;
/** @description Free-text search across buddy name and user_id (case-insensitive substring). */
search?: string;
/** @description Filter buddies by status */
status?: "active" | "archived";
/** @description Filter buddies by evolution stage */
evolution_stage?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns a paginated list of buddies */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getUserSummary: {
parameters: {
query?: never;
header?: never;
path: {
user_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the aggregated user summary */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_findById: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the buddy with skills, items, badges, and evolution info */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateBuddyDto"];
};
};
responses: {
/** @description Buddy name updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Name is required */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_archive: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Buddy archived successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy is already archived */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_updateSkills: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateBuddySkillsDto"];
};
};
responses: {
/** @description Skill levels updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error in skill updates */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_earnCoins: {
parameters: {
query?: never;
header: {
"idempotency-key": string;
};
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["EarnCoinsDto"];
};
};
responses: {
/** @description Coins earned successfully, returns updated balance */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_spendCoins: {
parameters: {
query?: never;
header: {
"idempotency-key": string;
};
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SpendCoinsDto"];
};
};
responses: {
/** @description Coins spent successfully, returns updated balance */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Insufficient coin balance */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getBuddyBadges: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the list of badge awards */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_awardBadge: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["AwardBadgeDto"];
};
};
responses: {
/** @description Badge awarded successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Badge already awarded or invalid badge key */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getEvolutionReadiness: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the evolution status and progress toward the next stage */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_evolve: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Evolution process initiated, returns an operation ID to poll */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy does not meet evolution requirements */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_purchaseItem: {
parameters: {
query?: never;
header: {
"idempotency-key": string;
};
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PurchaseItemDto"];
};
};
responses: {
/** @description Item purchased successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Insufficient coins or item already owned */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy or item not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_unlockItem: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UnlockItemDto"];
};
};
responses: {
/** @description Item unlocked successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item already unlocked */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy or item not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_equipItems: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["EquipItemsDto"];
};
};
responses: {
/** @description Items equipped/unequipped successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item not owned or invalid item ID */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_rerenderAppearance: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Rerender queued; returns operation_id */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy already ready or another op in flight */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getPurchasedItems: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns the list of purchased items */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getTokens: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Typed token summary */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_tokenTransaction: {
parameters: {
query?: never;
header: {
"idempotency-key": string;
};
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["TokenTransactionDto"];
};
};
responses: {
/** @description Token transaction completed successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Insufficient token balance or invalid token type */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_listEvolutions: {
parameters: {
query: {
page: string;
limit: string;
};
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getProgressionLegacy: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns progression metrics for the buddy */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddiesController_getProgression: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returns detailed progression metrics for the buddy */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CustomersSummaryController_getUserSummary: {
parameters: {
query?: never;
header?: never;
path: {
user_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddyShareController_createShare: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateShareDto"];
};
};
responses: {
/** @description { enabled, share_code, share_url, card_url } */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddyShareController_recordEvent: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ShareEventDto"];
};
};
responses: {
/** @description Recorded (best-effort) */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddyShareStatsController_getStats: {
parameters: {
query: {
window_days: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Share funnel aggregate */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddyShareStatsController_getSettings: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Resolved + raw sharing settings */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BuddyShareStatsController_updateSettings: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSharingDto"];
};
};
responses: {
/** @description Updated sharing settings */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicShareController_getPublicBuddy: {
parameters: {
query?: never;
header?: never;
path: {
code: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Public buddy view */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unknown code or sharing disabled */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicShareController_recordEvent: {
parameters: {
query?: never;
header?: never;
path: {
code: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PublicShareEventDto"];
};
};
responses: {
/** @description Recorded (best-effort) */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicShareIndexController_getShareIndex: {
parameters: {
query: {
offset: number;
limit: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paged share-code index */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfilePageController_getProfile: {
parameters: {
query?: never;
header?: never;
path: {
code: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Profile page view */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unknown code, sharing disabled, or capability not entitled */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_findAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of skill sets returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSkillSetDto"];
};
};
responses: {
/** @description Skill set created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_generateIcon: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["GenerateSkillIconDto"];
};
};
responses: {
/** @description Skill icon generated successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Image generation budget exceeded */
402: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill set */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Skill set returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill set not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill set */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSkillSetDto"];
};
};
responses: {
/** @description Skill set updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill set not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillSetsController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill set */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Skill set deleted successfully */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill set not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Cannot delete skill set in use by buddies */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillRulesController_findAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of skill rules returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillRulesController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSkillRuleDto"];
};
};
responses: {
/** @description Skill rule created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill rule with this trigger and skill_key already exists */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillRulesController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill rule */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSkillRuleDto"];
};
};
responses: {
/** @description Skill rule updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill rule not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillRulesController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Skill rule deleted successfully */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Skill rule not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillRulesController_applyThemePack: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Pack applied */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Template key not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_findAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSkillDecayRuleDto"];
};
};
responses: {
/** @description Skill decay rule created */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_preview: {
parameters: {
query: {
/** @description Starting skill level */
start: number;
/** @description How many cadence periods to project */
periods: number;
};
header?: never;
path: {
/** @description UUID of the skill decay rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Preview computed */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill decay rule */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSkillDecayRuleDto"];
};
};
responses: {
/** @description Updated */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill decay rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_history: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the skill decay rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SkillDecayRulesController_runNow: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Sweep enqueued */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CoinRulesController_findAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of coin rules returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CoinRulesController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateCoinRuleDto"];
};
};
responses: {
/** @description Coin rule created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Coin rule with this trigger already exists */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CoinRulesController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the coin rule */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateCoinRuleDto"];
};
};
responses: {
/** @description Coin rule updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Coin rule not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CoinRulesController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the coin rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Coin rule deleted successfully */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Coin rule not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CoinRulesController_rewardPoolTelemetry: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the coin rule */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Telemetry returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Coin rule not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EconomyController_getLedger: {
parameters: {
query?: {
/** @description Filter by transaction direction */
direction?: "credit" | "debit";
/** @description Filter by transaction reason */
reason?: string;
/** @description Page number (default: 1) */
page?: number;
/** @description Items per page (default: 20) */
limit?: number;
};
header?: never;
path: {
/** @description UUID of the buddy */
buddyId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paginated coin ledger returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Buddy not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_findAll: {
parameters: {
query: {
audience: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of badge definitions returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateBadgeDefinitionDto"];
};
};
responses: {
/** @description Badge definition created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Badge definition with this key already exists */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_uploadIcon: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Badge icon uploaded successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid file type or missing file */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_generateIcon: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["GenerateBadgeIconDto"];
};
};
responses: {
/** @description Badge icon generated successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Image generation budget exceeded */
402: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the badge definition */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Badge definition returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Badge definition not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the badge definition */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateBadgeDefinitionDto"];
};
};
responses: {
/** @description Badge definition updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Badge definition not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the badge definition */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Badge definition deleted successfully */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Badge definition not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Cannot delete badge with existing awards */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BadgeDefinitionsController_regenerateIcon: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Regeneration queued */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTriggeredBadgeController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTriggeredBadgeController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateEventBadgeDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTriggeredBadgeController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTriggeredBadgeController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateEventBadgeDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakDefinitionsController_findAll: {
parameters: {
query: {
audience: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of streak definitions */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakDefinitionsController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateStreakDefinitionDto"];
};
};
responses: {
/** @description Streak definition created */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakDefinitionsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the streak definition */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakDefinitionsController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateStreakDefinitionDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakDefinitionsController_delete: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ImageCostController_getUsage: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Image usage stats returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ImageCostController_getUsageReport: {
parameters: {
query?: {
/** @description Month in YYYY-MM format (defaults to current month) */
month?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Image usage report returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_findAll: {
parameters: {
query?: {
/** @description Filter events by user identifier */
user_id?: string;
/** @description Filter events by event type */
type?: string;
/** @description Maximum number of events to return (1-100) */
limit?: number;
/** @description Filter events from this ISO 8601 date */
date_from?: string;
/** @description Filter events up to this ISO 8601 date */
date_to?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Filtered list of events returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_ingest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["IngestEventDto"];
};
};
responses: {
/** @description Event accepted and processed */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid event payload */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Monthly event quota exceeded */
402: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_adminTrigger: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["IngestEventDto"];
};
};
responses: {
/** @description Event accepted and processed */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_ingestBatch: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["IngestBatchDto"];
};
};
responses: {
/** @description Events accepted and processed */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid events payload */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Monthly event quota exceeded */
402: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_findTypes: {
parameters: {
query: {
audience: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Distinct event type list returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_findActiveUsers: {
parameters: {
query?: {
/** @description Window in hours to look back (1-168) */
hours?: number;
/** @description Maximum number of users to return (1-200) */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Active users returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventsController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Event UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Event returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Event not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTypesController_findAll: {
parameters: {
query: {
audience: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTypesController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateEventTypeDto"];
};
};
responses: {
/** @description Event type created */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Event type already exists */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTypesController_findById: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Event type UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTypesController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateEventTypeDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
EventTypesController_delete: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TokenConfigController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Token configurations returned successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TokenConfigController_upsert: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpsertTokenConfigDto"];
};
};
responses: {
/** @description Token configuration upserted successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation error */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of marketplaces returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateMarketplaceDto"];
};
};
responses: {
/** @description Marketplace created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid input */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_findOne: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Marketplace returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Marketplace not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateMarketplaceDto"];
};
};
responses: {
/** @description Marketplace updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Marketplace not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_listItems: {
parameters: {
query?: {
/** @description Filter by category */
category?: string;
/** @description Filter by rarity tier */
rarity?: string;
/** @description Only show active items */
active_only?: string;
/** @description Page number */
page?: string;
/** @description Items per page */
limit?: string;
};
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paginated list of items returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_createItem: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateItemDto"];
};
};
responses: {
/** @description Item created successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid input */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Marketplace not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_importItems: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ImportMarketplaceItemsDto"];
};
};
responses: {
/** @description Items imported successfully */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid import payload */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_findItem: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
/** @description Item UUID */
item_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Item returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_updateItem: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
/** @description Item UUID */
item_id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateItemDto"];
};
};
responses: {
/** @description Item updated successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_deleteItem: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
/** @description Item UUID */
item_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Item deleted successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_reorderItems: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ReorderItemsDto"];
};
};
responses: {
/** @description Items reordered successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_uploadItemImage: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
/** @description Item UUID */
item_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Item image uploaded successfully */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid file or missing image */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceController_regenerateItemImage: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Marketplace UUID */
id: string;
/** @description Item UUID */
item_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Regeneration queued */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceWidgetController_gift: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Item UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["GiftItemDto"];
};
};
responses: {
/** @description Item gifted (or idempotent replay) */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Sender has insufficient coins */
402: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Missing marketplace:purchase scope */
403: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FlashSaleController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FlashSaleController_schedule: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ScheduleFlashSaleDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FlashSaleController_cancel: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketplaceFomoWidgetController_resolve: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["MarketplaceFomoQueryDto"];
};
};
responses: {
/** @description FOMO signals returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LegacyEquipController_getReturningChampion: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Returning-champion view returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LegacyEquipController_dismissReturningChampion: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Scene dismissed */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LegacyEquipController_equipLegacyItem: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["EquipLegacyItemDto"];
};
};
responses: {
/** @description Legacy crown temp-equipped */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Item not owned or not a crown */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ReturningChampionPublicController_resolveWelcomeBack: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Widget session minted */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid token or tenant slug */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description List of webhook configs returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateWebhookConfigDto"];
};
};
responses: {
/** @description Webhook config created with signing secret */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Validation failed */
422: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_listEvents: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook event types returned */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["WebhookEventTypesResponseDto"];
};
};
};
};
WebhooksController_getHealth: {
parameters: {
query?: {
/** @description Lookback window in days (default: 7, max: 30) */
days?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook health returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_findOne: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook config returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_update: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateWebhookConfigDto"];
};
};
responses: {
/** @description Webhook config updated */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_delete: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook config deleted */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_rotateSecret: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook secret rotated */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_sendTest: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Test webhook delivered */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_getDeliveries: {
parameters: {
query?: {
/** @description Maximum number of deliveries to return */
limit?: string;
};
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Delivery log returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Webhook config not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
WebhooksController_redeliver: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Webhook config UUID */
id: string;
/** @description Delivery log UUID */
deliveryId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Redelivery enqueued */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Delivery log not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PrestigeController_status: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PrestigeController_prestige: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getOverview: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Analytics overview returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getEngagement: {
parameters: {
query?: {
/** @description Aggregation period */
period?: "daily" | "weekly" | "monthly";
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Engagement metrics returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getActivitySummary: {
parameters: {
query?: {
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Activity summary returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getEconomySummary: {
parameters: {
query?: {
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Economy summary returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getEconomyHealth: {
parameters: {
query?: {
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Economy health metrics returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getPopularItems: {
parameters: {
query?: {
/** @description Number of items to return (default: 10) */
limit?: number;
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Popular items list returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getPopularBadges: {
parameters: {
query?: {
/** @description Number of badges to return (default: 10) */
limit?: number;
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Popular badges list returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getRetention: {
parameters: {
query?: {
/** @description Cohort period */
cohort?: "weekly" | "monthly";
/** @description Number of days to look back (default: 90) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Retention metrics returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getRoiMetrics: {
parameters: {
query?: {
/** @description Number of days to look back (default: 30) */
days?: number;
/** @description Start date (ISO 8601) */
from?: string;
/** @description End date (ISO 8601) */
to?: string;
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description ROI metrics returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getStreakHealth: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Streak health returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getTokenEconomy: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
/** @description Lookback window in days (default: 30) */
days?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Token economy returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getAudienceBreakdown: {
parameters: {
query?: {
/** @description Lookback window in days (default: 30) */
days?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Audience breakdown returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getEvolutionTimeline: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Evolution timeline returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getMarketplaceFunnel: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
/** @description Max rows to return (default: 10) */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Marketplace funnel returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getWebhookHealth: {
parameters: {
query?: {
/** @description Lookback window in days (default: 7) */
days?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Webhook health returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getEventCounts: {
parameters: {
query?: {
audience?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Per-event counts returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getCustomEventTrends: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
/** @description Lookback window in days (default: 30) */
days?: number;
/** @description Max event types to return (default: 10) */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Custom event trends returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
AnalyticsController_getFeatureActivity: {
parameters: {
query?: {
/** @description Optional audience key filter */
audience?: string;
/** @description Lookback window in weeks (default: 8) */
weeks?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Feature activity returned */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["FeatureActivityResponseDto"];
};
};
};
};
LeaderboardController_getLeaderboard: {
parameters: {
query?: {
/** @description Metric to rank by */
metric?: "total_xp" | "coins" | "badge_count" | "evolution_stage";
/** @description Time period for ranking */
period?: "daily" | "weekly" | "monthly" | "all_time";
/** @description Number of entries to return (default: 50) */
limit?: number;
/** @description Override tenant default view mode for this request */
view_mode?: "top" | "around_me" | "hybrid";
/** @description Legacy shorthand override for view_mode=around_me */
around_me?: boolean;
/** @description Hybrid mode: how many leaders to show in the top strip (default 3) */
top_strip_size?: number;
/** @description HTCH-48: override tenant default scope. friends → 501 until Phase 3. */
scope?: "global" | "team" | "friends";
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Leaderboard entries returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeaderboardConfigController_get: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeaderboardConfigController_patch: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShareFunnelController_giftFunnel: {
parameters: {
query?: {
/** @description Rolling window (default 30) */
window_days?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BillingController_getStatus: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Billing status returned */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["BillingStatusResponseDto"];
};
};
};
};
BillingController_createCheckout: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Checkout session URL returned */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Invalid plan or bundle key */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BillingController_reconcileCheckout: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Checkout session reconciled; billing state returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Session does not belong to the caller */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BillingController_createPortal: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Portal session URL returned */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CreditsController_getBalance: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Credit balance returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CreditsController_listLedger: {
parameters: {
query: {
cursor: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Ledger entries returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_preparingStatus: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_seedFromUrl: {
parameters: {
query?: never;
header: {
origin: string;
};
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SeedFromUrlDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_seedFromRepo: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SeedFromRepoDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_seedFromDescription: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SeedFromDescriptionDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_joinWaitlist: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["WaitlistDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_current: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_reset: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_updateAnswers: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateAnswersDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_message: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["SendMessageDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_generatePlan: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_regeneratePlan: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_apply: {
parameters: {
query?: never;
header: {
"if-match": string;
};
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OnboardingController_generateGuide: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StageAssetsController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StageAssetsController_createUploadUrl: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateUploadUrlDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StageAssetsController_regenerate: {
parameters: {
query?: never;
header?: never;
path: {
stage: number;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StageAssetsController_commit: {
parameters: {
query?: never;
header?: never;
path: {
stage: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CommitAssetDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StageAssetsController_remove: {
parameters: {
query?: never;
header?: never;
path: {
stage: number;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GatesController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GatesController_upsert: {
parameters: {
query?: never;
header?: never;
path: {
gate_key: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpsertTokenGateDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GatesController_remove: {
parameters: {
query?: never;
header?: never;
path: {
gate_key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GatesController_unlock: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
gate_key: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description insufficient_balance or progression_not_spendable */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Gate not found / inactive */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GatesController_listUnlocks: {
parameters: {
query?: never;
header?: never;
path: {
buddy_id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_listDefinitions: {
parameters: {
query: {
audience: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_createDefinition: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreatePathDefinitionDto"];
};
};
responses: {
/** @description Path definition created */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_getDefinition: {
parameters: {
query?: never;
header?: never;
path: {
/** @description UUID of the path definition */
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_updateDefinition: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdatePathDefinitionDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_deleteDefinition: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_activate: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_deactivate: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_listSteps: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_createStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreatePathStepDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_reorderSteps: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ReorderDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_updateStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdatePathStepDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_deleteStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_listSubSteps: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_createSubStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreatePathSubStepDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_reorderSubSteps: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ReorderDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_updateSubStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
subStepId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdatePathSubStepDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_deleteSubStep: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
stepId: string;
subStepId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_getBuddyPath: {
parameters: {
query?: never;
header?: never;
path: {
buddyId: string;
pathKey: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PathsController_manualComplete: {
parameters: {
query?: never;
header?: never;
path: {
buddyId: string;
pathKey: string;
subKey: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BeginnersLuckController_getAnalytics: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BeginnersLuckWidgetController_getResult: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Beginner's Luck result returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FreeLunchWidgetController_getNotification: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Free Lunch notification returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FreeLunchWidgetController_acknowledge: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Acknowledgement recorded */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_remove: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_listMembers: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_addMember: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_removeMember: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
buddyId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_changeRole: {
parameters: {
query?: never;
header?: never;
path: {
teamId: string;
buddyId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsAdminController_import: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsWidgetController_me: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
TeamsWidgetController_leave: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_applyTemplate: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_applyThemeTemplate: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_reorder: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudoTypesAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudosWidgetController_types: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudosWidgetController_send: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudosWidgetController_received: {
parameters: {
query?: {
limit?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
KudosWidgetController_given: {
parameters: {
query?: {
limit?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_list: {
parameters: {
query: {
status: string;
team_id: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_remove: {
parameters: {
query?: never;
header?: never;
path: {
questId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
questId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_publish: {
parameters: {
query?: never;
header?: never;
path: {
questId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsAdminController_forceResolve: {
parameters: {
query?: never;
header?: never;
path: {
questId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsWidgetController_active: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsWidgetController_join: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
GroupQuestsWidgetController_leave: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorWidgetController_setAvailability: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorWidgetController_teamMentors: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorWidgetController_logSession: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorWidgetController_mySessions: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorAdminController_getConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorAdminController_updateConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorAdminController_directory: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MentorAdminController_resetSessions: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragWidgetController_shareProfile: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragWidgetController_winState: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Win-State brag payload + enabled channels */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["WinStateBragResponseDto"];
};
};
};
};
BragWidgetController_slackPost: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragWidgetController_telemetry: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_getConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_updateConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_webhookTest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_funnel: {
parameters: {
query?: {
from?: string;
to?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_byChannel: {
parameters: {
query?: {
from?: string;
to?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BragAdminController_telemetryCsv: {
parameters: {
query?: {
from?: string;
to?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SocialNormsWidgetController_today: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FeedWidgetController_listTeamEvents: {
parameters: {
query?: {
cursor?: string;
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FeedWidgetController_clap: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_audit: {
parameters: {
query?: {
page?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_previewConfig: {
parameters: {
query: {
trigger_events: string;
rate: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_analyticsView: {
parameters: {
query?: {
period?: "7d" | "30d" | "90d" | "lifetime";
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_analyticsCsv: {
parameters: {
query?: {
period?: "7d" | "30d" | "90d" | "lifetime";
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_draft: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_preview: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_getWebhook: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_updateWebhook: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseAdminController_testWebhook: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseWidgetController_counters: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CauseWidgetController_surfaces: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundationsController_widgetList: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilAdminController_list: {
parameters: {
query?: {
status?: "pending" | "approved" | "rejected" | "live";
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilAdminController_moderate: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilAdminController_promote: {
parameters: {
query?: never;
header?: never;
path: {
slot: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilAdminController_revert: {
parameters: {
query?: never;
header?: never;
path: {
slot: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilWidgetController_mine: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CouncilWidgetController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundingCohortAdminController_preview: {
parameters: {
query?: {
mode?: "first_n" | "first_percent" | "first_until_date";
first_n?: string;
first_percent?: string;
until_date?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundingCohortAdminController_backfill: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundingCohortAdminController_audit: {
parameters: {
query?: {
page?: string;
source?: "real_time" | "backfill";
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundingCohortAdminController_exportAuditCsv: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
FoundingCohortWidgetController_status: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_list: {
parameters: {
query?: {
cursor?: string;
limit?: string;
include_read?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_unreadCount: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_dismissAll: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_read: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_dismiss: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
NotificationWidgetController_snooze: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SunkCostController_summary: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SunkCostController_acknowledge: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
VacationWidgetController_pause: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
VacationWidgetController_resume: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
VacationWidgetController_status: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
VacationAdminController_analytics: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
StreakWatchdogAdminController_analytics: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileHistoryController_getHistory: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileHistoryController_reclaim: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MysteryBoxController_state: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MysteryBoxController_claim: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SurpriseDropsController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SurpriseDropsController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSurpriseDropDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SurpriseDropsController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
SurpriseDropsController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSurpriseDropDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BoostersAdminController_grant: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["AdminGrantBoosterDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BoostersController_active: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BoostersController_catalog: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
BoostersController_purchase: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PurchaseBoosterDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateLotteryDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateLotteryDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_draws: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_previewNextDraw: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteriesController_simulateDraw: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteryWidgetController_activeEntries: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LotteryWidgetController_lastWin: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileTemplateController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileTemplateController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateProfileTemplateDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileTemplateController_remove: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileTemplateController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateProfileTemplateDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProfileTemplateController_applyBulk: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["BulkApplyDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueWidgetController_me: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueWidgetController_bossFight: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueHighlightsController_latest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Season-closing discovery payload */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SeasonClosingDiscoveryResponseDto"];
};
};
};
};
LeagueHighlightsController_me: {
parameters: {
query?: never;
header?: never;
path: {
seasonId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OffSeasonController_status: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OffSeasonController_startScoutingQuest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["StartScoutingQuestDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
OffSeasonController_joinScoutingQuest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_getConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_updateConfig: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateLeagueConfigDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_replaceTiers: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ReplaceLeagueTiersDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_previewSeasons: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_scheduleSeason: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ScheduleLeagueSeasonDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
LeagueAdminController_forceClose: {
parameters: {
query?: never;
header?: never;
path: {
seasonId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HallOfFameController_getList: {
parameters: {
query?: never;
header?: never;
path: {
tenantSlug: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Hall of Fame season list */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description No finalized seasons / sharing off */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HallOfFameController_getSeason: {
parameters: {
query?: never;
header?: never;
path: {
tenantSlug: string;
seasonId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Hall of Fame season detail */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unknown season / sharing off */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HallOfFameIndexController_getIndex: {
parameters: {
query: {
offset: number;
limit: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paged Hall of Fame URL index */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HexadSurveyController_questions: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HexadSurveyController_submit: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HexadSurveyController_me: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HexadSurveyController_deleteMe: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
MarketingAnalyticsController_recordCtaClick: {
parameters: {
query?: never;
header: {
"user-agent": string;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateShowroomDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_getOne: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateShowroomDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_publish: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_unpublish: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_regenerateQr: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_archive: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_award: {
parameters: {
query?: never;
header: {
"idempotency-key": string;
};
path: {
buddyId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["AwardDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_listPlayerAwards: {
parameters: {
query: {
limit: number;
};
header?: never;
path: {
buddyId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ShowroomAdminController_listAudit: {
parameters: {
query: {
page: number;
page_size: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicShowroomController_getPublicShowroom: {
parameters: {
query: {
qr_token: string;
qr: string;
};
header?: never;
path: {
slug: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Public Showroom view */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unknown slug or page is not published */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicShowroomController_getQrPayload: {
parameters: {
query?: never;
header?: never;
path: {
slug: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description QR payload */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unknown slug or page is not published */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreateSurfaceDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_getOne: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdateSurfaceDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_readiness: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Per-widget readiness entries */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SurfaceWidgetReadinessResponseDto"];
};
};
};
};
HostedSurfacesAdminController_uploadLogo: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_publish: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_unpublish: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_archive: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_listPlayers: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_createPlayer: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CreatePlayerDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_updatePlayer: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
playerId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpdatePlayerDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_regenerateAccess: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
playerId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_revealAccess: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
playerId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_listRecipes: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_upsertRecipe: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UpsertRecipeDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HostedSurfacesAdminController_runRecipe: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
key: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RunRecipeDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicHostedSurfacesController_getPublic: {
parameters: {
query?: never;
header?: never;
path: {
slug: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
PublicHostedSurfacesController_startSession: {
parameters: {
query?: never;
header: {
"user-agent": string;
};
path: {
slug: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["StartSessionDto"];
};
};
responses: {
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HealthController_check: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Health status returned with component details */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HealthController_readiness: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description All dependencies up */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description One or more critical dependencies unavailable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HealthController_liveness: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Process is alive */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
HealthController_version: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Build metadata returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProbeController_healthz: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Process is alive */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProbeController_readyz: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Service is ready to serve traffic */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Database or Redis is not reachable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProbeController_version: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Build metadata returned */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
}OffsetPage
Pagination helpers — paginate() and collect().
Hatched list endpoints ship in two shapes:
- Offset (legacy) —
{ data, meta: { total, page, limit } }. The helper drivesfetchPage(page)with a 1-indexed page number and stops on the last page. - Cursor (canonical) —
{ data, pagination: { nextCursor, hasMore, limit } }. The helper drivesfetchPage(cursor)withundefinedfirst and the server-returnednextCursorthereafter; iteration stops whennextCursor === null.
paginate() autodetects the shape from the first response — you don't
have to know which one your endpoint serves.
@example Cursor pagination (canonical)
for await (const op of paginate((cursor) => hatched.operations.list({ cursor, limit: 100 }))) {
console.log(op.id);
}@example Offset pagination (legacy)
for await (const buddy of paginate((page) => hatched.buddies.list({ page, limit: 100 }))) {
console.log(buddy.id);
}export interface OffsetPage<T> {
data: T[];
meta: { total: number; page: number; limit: number };
}CursorPage
export interface CursorPage<T> {
data: T[];
pagination: { nextCursor: string | null; hasMore: boolean; limit: number };
}PaginatedResponse
export type PaginatedResponse<T> = OffsetPage<T> | CursorPage<T>;PaginateOptions
export interface PaginateOptions {
/**
* Maximum number of pages to walk. Useful as a runaway guard in scripts
* where you want to bail out after, say, 50 pages even if the API
* reports more available. Defaults to `Infinity`.
*/
maxPages?: number;
/**
* AbortSignal to abort the iteration. The current in-flight request is
* aborted via the fetcher (if it forwards `signal`), and iteration
* stops immediately.
*/
signal?: AbortSignal;
}WebhookPayload
export type WebhookPayload = Record<string, unknown>;VerifyResult
export interface VerifyResult {
/** True only when both the signature is valid and the body parses as JSON. */
valid: boolean;
/** Parsed raw event payload when `valid` is true; null when verification or parsing failed. */
event: WebhookPayload | null;
/** `X-Hatched-Event` header value. The event name is not wrapped into the body. */
eventType: WebhookEvent | string | null;
/** `X-Hatched-Delivery` header value. Use this as the dedupe key. */
deliveryId: string | null;
/** Reason a verification failed. Useful for logs/observability. */
reason?:
| 'missing_header'
| 'missing_secret'
| 'missing_body'
| 'invalid_signature'
| 'invalid_json';
}VerifyAdapterOptions
export interface VerifyAdapterOptions {
/** Allowed clock skew between Hatched and the consumer host. Default 300s. */
toleranceSeconds?: number;
/** Custom now() — useful for testing replay-window edge cases. */
now?: () => number;
}