{"openapi":"3.0.0","paths":{"/v1/partners/me":{"get":{"operationId":"getPartnerMe","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Partner self-record for the authenticated caller","tags":["Partners Me"]},"patch":{"operationId":"updatePartnerMe","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PartnerSelfUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Patch editable fields on the authenticated caller partner (multipart; optional logo file)","tags":["Partners Me"]}},"/v1/partners/me/accept-terms":{"post":{"operationId":"acceptPartnerTerms","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptTermsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Accept the current terms of service on behalf of the caller partner","tags":["Partners Me"]}},"/v1/partners/me/vxp-summary":{"get":{"operationId":"getPartnerVxpSummary","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerVxpSummaryDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Personal VXP rollup (total + current calendar month)","tags":["Partners Me"]}},"/v1/partners/me/activities":{"get":{"operationId":"listPartnerActivities","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","APPROVED","AUTO_APPROVED","REJECTED","CANCELLED"]}},{"name":"scope","required":false,"in":"query","schema":{"type":"string","enum":["BUSINESS","PERSONAL"]}},{"name":"submittedById","required":false,"in":"query","description":"Local `workos_user.id` to filter activities by their submitter.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPartnerActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List caller partner activities (paginated, filterable by status)","tags":["Partners Me Activities"]},"post":{"operationId":"submitPartnerActivity","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerActivitySubmitDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Submit a new partner activity for VXP review","tags":["Partners Me Activities"]}},"/v1/partners/me/activities/{id}":{"get":{"operationId":"getPartnerActivityById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Partner activity detail (must belong to caller partner)","tags":["Partners Me Activities"]},"delete":{"operationId":"cancelPartnerActivity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Cancel a PENDING partner activity (soft transition, returns the cancelled row)","tags":["Partners Me Activities"]}},"/v1/partners/me/plugins":{"get":{"operationId":"listPartnerPlugins","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPartnerPluginDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List caller partner plugins (paginated, all approval states)","tags":["Partners Me Plugins"]},"post":{"operationId":"submitPartnerPlugin","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PartnerPluginSubmitDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPluginDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Submit a new plugin (multipart; optional icon file)","tags":["Partners Me Plugins"]}},"/v1/partners/me/plugins/{id}":{"get":{"operationId":"getPartnerPluginById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPluginDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Plugin detail (must belong to caller partner)","tags":["Partners Me Plugins"]},"patch":{"operationId":"updatePartnerPlugin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PartnerPluginUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPluginDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Patch editable plugin fields (multipart; optional icon file)","tags":["Partners Me Plugins"]},"delete":{"operationId":"deletePartnerPlugin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Plugin deleted"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Delete a plugin (draft, pending_review, or rejected only)","tags":["Partners Me Plugins"]}},"/v1/partners/me/plugins/{id}/resubmit":{"post":{"operationId":"resubmitPartnerPlugin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPluginDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Resubmit a rejected plugin (rejected -> pending_review)","tags":["Partners Me Plugins"]}},"/v1/partners/me/showcases":{"get":{"operationId":"listPartnerShowcases","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List caller partner showcases (paginated)","tags":["Partners Me Showcases"]},"post":{"operationId":"createPartnerShowcase","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Create a new partner showcase (multipart with optional thumbnail)","tags":["Partners Me Showcases"]}},"/v1/partners/me/showcases/{id}":{"get":{"operationId":"getPartnerShowcaseById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Showcase detail (must belong to caller partner)","tags":["Partners Me Showcases"]},"patch":{"operationId":"updatePartnerShowcase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Patch editable showcase fields (multipart; optional thumbnail)","tags":["Partners Me Showcases"]},"delete":{"operationId":"deletePartnerShowcase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Showcase deleted"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Delete a showcase","tags":["Partners Me Showcases"]}},"/v1/partners/me/showcases/{id}/publish":{"post":{"operationId":"publishPartnerShowcase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Publish a showcase (flip visibility to PUBLIC)","tags":["Partners Me Showcases"]}},"/v1/partners/me/showcases/{id}/unpublish":{"post":{"operationId":"unpublishPartnerShowcase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectShowcaseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Unpublish a showcase","tags":["Partners Me Showcases"]}},"/v1/partners":{"get":{"operationId":"listPartners","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":false,"in":"query","description":"Free-text search","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"tier","required":false,"in":"query","schema":{"type":"string","enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]}},{"name":"countryCode","required":false,"in":"query","description":"ISO 3166-1 alpha-2 country code","schema":{"minLength":2,"maxLength":2,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPartnerPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List APPROVED partners for the public directory","tags":["Public Partners"]}},"/v1/partners/search":{"get":{"operationId":"searchPartners","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":true,"in":"query","description":"Required search query","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"tier","required":false,"in":"query","schema":{"type":"string","enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]}},{"name":"countryCode","required":false,"in":"query","description":"ISO 3166-1 alpha-2 country code","schema":{"minLength":2,"maxLength":2,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPartnerPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Typesense-ranked search over APPROVED partners (falls back to SQL)","tags":["Public Partners"]}},"/v1/partners/facets":{"get":{"operationId":"getPartnerFacets","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerFacetsDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Distinct tier + country values present in the public directory","tags":["Public Partners"]}},"/v1/partners/{slug}":{"get":{"operationId":"getPartnerBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerDetailPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Partner detail by slug with embedded team + showcases","tags":["Public Partners"]}},"/v1/partners/{slug}/contact":{"post":{"operationId":"submitPartnerInquiry","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-vendure-inquiry-signature","in":"header","description":"HMAC-SHA256 proof generated by the trusted website workflow.","required":true,"schema":{"type":"string"}},{"name":"x-vendure-inquiry-timestamp","in":"header","description":"Unix timestamp in milliseconds for the signed website workflow request.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerContactRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerContactAcknowledgementDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Relay a contact-form inquiry to a partner (To: partner, BCC: Vendure)","tags":["Public Partners"]}},"/v1/customers/me":{"get":{"operationId":"getCustomerMe","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerSelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Customer self-record for the authenticated caller","tags":["Customers Me"]},"patch":{"operationId":"updateCustomerMe","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CustomerSelfUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerSelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Patch editable fields on the authenticated caller customer (multipart; optional logo file)","tags":["Customers Me"]}},"/v1/customers/me/install-tokens":{"get":{"operationId":"listCustomerInstallTokens","parameters":[{"name":"showExpired","required":false,"in":"query","schema":{"enum":["true","false"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerInstallTokenListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List every install token across every project owned by the caller customer","tags":["Customers Me"]}},"/v1/orgs/{workosOrgId}/assignable-roles":{"get":{"operationId":"listOrgAssignableRoles","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAssignableRoleListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List WorkOS roles assignable inside this org","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/members":{"get":{"operationId":"listOrgMembers","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List members of the resolved org","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/memberships/me":{"delete":{"operationId":"leaveOrg","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Remove the caller own membership. Blocked for owners (must be demoted first).","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/memberships/{membershipId}":{"patch":{"operationId":"updateOrgMembership","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"membershipId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMembershipBodyDto"}}}},"responses":{"204":{"description":""},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Change a member role. Blocked for non-owners on owner-targets and on the sole owner.","tags":["Org Team"]},"delete":{"operationId":"removeOrgMembership","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"membershipId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Remove a member. Blocked for non-owners on owner-targets and on the sole owner.","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/invitations":{"get":{"operationId":"listOrgInvitations","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"state","required":false,"in":"query","description":"Filter invitations by state. Defaults to \"pending\".","schema":{"default":"pending","type":"string","enum":["pending","accepted","expired","revoked","all"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgInvitationListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List WorkOS invitations for this org (pending by default)","tags":["Org Team"]},"post":{"operationId":"sendOrgInvitation","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInvitationBodyDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgInvitationEnvelopeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Send a WorkOS invitation with an explicit role slug","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/invitations/{invitationId}/resend":{"post":{"operationId":"resendOrgInvitation","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"invitationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgInvitationEnvelopeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Resend a pending invitation","tags":["Org Team"]}},"/v1/orgs/{workosOrgId}/invitations/{invitationId}":{"delete":{"operationId":"revokeOrgInvitation","parameters":[{"name":"workosOrgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"invitationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Revoke a pending invitation","tags":["Org Team"]}},"/v1/projects":{"get":{"operationId":"listProjects","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedProjectPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List caller-customer projects (paginated)","tags":["Projects"]},"post":{"operationId":"createProject","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Create a new project for the caller customer","tags":["Projects"]}},"/v1/projects/{id}":{"get":{"operationId":"getProjectById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Project detail (must belong to caller customer)","tags":["Projects"]},"patch":{"operationId":"updateProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Update a caller-owned project (name and/or description)","tags":["Projects"]},"delete":{"operationId":"deleteProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Project deleted"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Delete a project","tags":["Projects"]}},"/v1/projects/{id}/phone-home-token":{"get":{"operationId":"getPhoneHomeToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"env","required":false,"in":"query","schema":{"default":"production","type":"string","enum":["production","staging","uat","dev"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneHomeTokenDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Current phone-home JWT for a caller-owned project","tags":["Projects"]}},"/v1/projects/{id}/phone-home-tokens":{"post":{"operationId":"mintPhoneHomeToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneHomeTokenMintDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneHomeTokenDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Mint a per-env phone-home JWT (GTM-440)","tags":["Projects"]}},"/v1/projects/{id}/install-tokens":{"get":{"operationId":"listInstallTokens","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List install tokens for a project","tags":["Projects"]},"post":{"operationId":"createInstallToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenCreatedDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Create an install token (plaintext returned ONCE)","tags":["Projects"]}},"/v1/projects/{id}/install-tokens/{tokenId}":{"delete":{"operationId":"revokeInstallToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tokenId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Revoke an install token (soft transition, returns the revoked row)","tags":["Projects"]},"patch":{"operationId":"renameInstallToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tokenId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenRenameDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallTokenDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Rename an install token label","tags":["Projects"]}},"/v1/projects/{id}/bindings":{"get":{"operationId":"listProjectBindings","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBindingListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Every currently-held seat for a caller-owned project, across every env it has activated in (GTM-444).","tags":["Projects"]}},"/v1/projects/{id}/rebind-binding":{"post":{"operationId":"rebindProjectBinding","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRebindBindingDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBindingDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Revoke the caller-owned project binding for one env so the next activate call succeeds (GTM-444).","tags":["Projects"]}},"/v1/projects/phone-home":{"post":{"operationId":"phoneHome","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneHomeBodyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneHomeResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Runtime phone-home verification called by EE deployments","tags":["Projects"]}},"/v1/projects/{projectId}/break-glass":{"post":{"operationId":"issueBreakGlassToken","parameters":[{"name":"projectId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BreakGlassIssueRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BreakGlassIssueResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Mint a short-lived (max 72h) hub-signed break-glass token so license-guard can boot in soft mode while phone-home is failing (ECO-114).","tags":["Projects"]}},"/v1/projects/{projectId}/break-glass/events":{"get":{"operationId":"listBreakGlassEvents","parameters":[{"name":"projectId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BreakGlassEventListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List recent break-glass token issuances and revocations for a project (ECO-114).","tags":["Projects"]}},"/v1/users/me":{"get":{"operationId":"getUserMe","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"WorkOS user self-record for the authenticated caller","tags":["Users Me"]}},"/v1/users/me/profile":{"patch":{"operationId":"updateUserMeProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeUpdateProfileBodyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Update the caller enthusiast-profile fields (e.g. directory opt-in)","tags":["Users Me"]}},"/v1/users/me/sync-github":{"post":{"operationId":"syncUserGithub","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeSyncGithubResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Reconcile the caller WorkOS GitHub identity into workos_user","tags":["Users Me"]}},"/v1/users/me/link-github":{"post":{"operationId":"linkUserGithub","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeLinkGithubBodyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeLinkGithubResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Exchange a WorkOS OAuth code and persist the GitHub link on the session user","tags":["Users Me"]}},"/v1/users/me/link-github-otp":{"post":{"operationId":"linkUserGithubViaOtp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeLinkGithubOtpBodyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeLinkGithubResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Complete a pending GitHub link with the email-verification OTP","tags":["Users Me"]}},"/v1/users/me/github-link":{"delete":{"operationId":"unlinkUserGithub","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeUnlinkGithubResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Remove the GitHub link from the session user (and any cross-email ghost)","tags":["Users Me"]}},"/v1/users/me/activities":{"get":{"operationId":"listUserActivities","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["PENDING","APPROVED","AUTO_APPROVED","REJECTED","CANCELLED"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedUserActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List caller's personal activities (paginated, filterable by status)","tags":["Users Me Activities"]},"post":{"operationId":"submitUserActivity","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivitySubmitDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Submit a new personal activity for VXP review","tags":["Users Me Activities"]}},"/v1/users/me/activities/{id}":{"delete":{"operationId":"cancelUserActivity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivitySelfDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Cancel a PENDING personal activity (soft transition, returns the cancelled row)","tags":["Users Me Activities"]}},"/v1/users/me/sessions":{"get":{"operationId":"listUserSessions","parameters":[{"name":"status","required":false,"in":"query","description":"Filter sessions by status. Defaults to \"active\".","schema":{"default":"active","type":"string","enum":["active","all"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSessionListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List the caller WorkOS sessions (active by default)","tags":["Users Me Sessions"]}},"/v1/licenses":{"get":{"operationId":"listLicenses","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedLicensePublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List licenses for the caller customer (paginated)","tags":["Licenses"]}},"/v1/licenses/policy":{"get":{"operationId":"getLicensePolicy","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicensePolicyDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Server-published licensing UI thresholds (POC countdown, etc.)","tags":["Licenses"]}},"/v1/licenses/{id}/assign-project":{"post":{"operationId":"assignLicenseProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignProjectDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignProjectResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Bind a caller-owned license to a caller-owned project","tags":["Licenses"]}},"/v1/licenses/{id}/unassign-project":{"post":{"operationId":"unassignLicenseProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicensePublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Clear the project binding on a caller-owned license","tags":["Licenses"]}},"/v1/licenses/me":{"get":{"operationId":"getLicenseStatus","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocsGateResponseDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Docs-gate license status for the caller (anonymous-safe)","tags":["Licenses"]}},"/v1/license/activate":{"post":{"operationId":"activateLicenseBinding","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateLicenseBindingDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseBindingEnvelopeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"First-boot binding activation — mints an instance seal for the calling Vendure deployment","tags":["License Binding"]}},"/v1/license/heartbeat":{"post":{"operationId":"heartbeatLicenseBinding","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseBindingHeartbeatDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseBindingEnvelopeDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Rotating heartbeat — verifies + rotates the binding nonce, emits split-detection on mismatch","tags":["License Binding"]}},"/v1/enterprise-plugins":{"get":{"operationId":"listEnterprisePlugins","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterprisePluginPublicListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List every first-party enterprise plugin in the catalog","tags":["Enterprise Plugins"]}},"/v1/enterprise-plugins/{slug}":{"get":{"operationId":"getEnterprisePlugin","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterprisePluginPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Fetch a single enterprise plugin by slug","tags":["Enterprise Plugins"]}},"/v1/enterprise-plugins/{slug}/changelog":{"get":{"description":"Resolves the latest version on the registry and extracts CHANGELOG.md from its tarball. Always returns 200 — `available: false` signals that no changelog could be fetched (no published version, missing file, or registry error). Cache at the caller; the endpoint hits the upstream registry on every request.","operationId":"getEnterprisePluginChangelog","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterprisePluginChangelogDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Fetch the latest published CHANGELOG.md for an enterprise plugin","tags":["Enterprise Plugins"]}},"/v1/plugins":{"get":{"operationId":"listPlugins","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":false,"in":"query","description":"Free-text search","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"category","required":false,"in":"query","description":"Category code filter","schema":{"minLength":1,"maxLength":100,"type":"string"}},{"name":"partnerId","required":false,"in":"query","description":"Filter by partner","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPluginPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List APPROVED plugins with optional q / category / partner filters","tags":["Public Plugins"]}},"/v1/plugins/search":{"get":{"operationId":"searchPlugins","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":true,"in":"query","description":"Required search query","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"category","required":false,"in":"query","description":"Category code filter","schema":{"minLength":1,"maxLength":100,"type":"string"}},{"name":"partnerId","required":false,"in":"query","description":"Filter by partner","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedPluginPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Typesense-ranked search over APPROVED plugins (falls back to SQL)","tags":["Public Plugins"]}},"/v1/plugins/{slug}":{"get":{"operationId":"getPluginBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Plugin detail by slug (APPROVED only)","tags":["Public Plugins"]}},"/v1/plugin-categories":{"get":{"operationId":"listPluginCategories","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginCategoryPublicListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List all plugin categories ordered by sortOrder","tags":["Public Plugin Categories"]}},"/v1/vxp-awards":{"get":{"operationId":"listVxpAwards","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VxpAwardPublicListDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List enabled VXP awards","tags":["Public VXP Awards"]}},"/v1/vxp-awards/{name}":{"get":{"operationId":"getVxpAwardByName","parameters":[{"name":"name","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VxpAwardPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"VXP award detail by stable name","tags":["Public VXP Awards"]}},"/v1/enthusiasts":{"get":{"operationId":"listEnthusiasts","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":false,"in":"query","description":"Free-text search","schema":{"minLength":1,"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedEnthusiastPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"List public enthusiasts (anonymous)","tags":["Public Enthusiasts"]}},"/v1/enthusiasts/search":{"get":{"operationId":"searchEnthusiasts","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-based)","schema":{"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"q","required":true,"in":"query","description":"Required search query","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"sort","required":false,"in":"query","description":"Result ordering. `vxp` (default) ranks by search relevance then VXP; `name` sorts A–Z; `newest` sorts by most recent enthusiast.","schema":{"type":"string","enum":["vxp","name","newest"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedEnthusiastPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Typesense-ranked search over public enthusiasts (falls back to SQL)","tags":["Public Enthusiasts"]}},"/v1/enthusiasts/{slug}":{"get":{"operationId":"getEnthusiastBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnthusiastPublicDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Enthusiast detail by slug (anonymous)","tags":["Public Enthusiasts"]}},"/v1/assets/upload":{"post":{"operationId":"uploadAsset","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetUploadBodyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUploadResultDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Upload a file asset (multipart)","tags":["Assets"]}},"/v1/protected-assets/{prefix}/{uuid}/{filename}":{"get":{"operationId":"getProtectedAssetUrl","parameters":[{"name":"prefix","required":true,"in":"path","schema":{"type":"string"}},{"name":"uuid","required":true,"in":"path","schema":{"type":"string"}},{"name":"filename","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtectedAssetUrlDto"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"summary":"Mint a short-lived presigned GET URL for a private S3 object after ACL check","tags":["Protected Assets"]}},"/.well-known/jwks.json":{"get":{"operationId":"getJwks","parameters":[],"responses":{"200":{"description":"RFC 7517 JWK Set"}},"summary":"Public JWKS for project phone-home JWT + response signature verification","tags":["Well-Known"]}}},"info":{"title":"@vendure-io/api — public","description":"","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"PartnerSocialLinkDto":{"type":"object","properties":{"platform":{"type":"string"},"url":{"type":"string"}},"required":["platform","url"]},"PartnerTierTargetsDto":{"type":"object","properties":{"businessVxp":{"type":"number"},"enthusiasts":{"type":"number"},"developers":{"type":"number"},"clientProjects":{"type":"number"}},"required":["businessVxp","enthusiasts"]},"NextTierProgressDto":{"type":"object","properties":{"tier":{"type":"string","enum":["FRIEND","PARTNER"]},"targets":{"$ref":"#/components/schemas/PartnerTierTargetsDto"}},"required":["tier","targets"]},"PartnerSelfDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workosOrgId":{"type":"string"},"slug":{"type":"string"},"legalName":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"contractUrl":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"githubOrg":{"type":"string","nullable":true},"technologyTags":{"type":"array","items":{"type":"string"}},"socialLinks":{"type":"array","items":{"$ref":"#/components/schemas/PartnerSocialLinkDto"}},"tier":{"type":"string","enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]},"profileStatus":{"type":"string","enum":["INCOMPLETE","READY"]},"suspendedAt":{"type":"string","nullable":true},"opsPartnerApprovalAt":{"type":"string","nullable":true},"partnerUpgradeBlocked":{"type":"boolean"},"businessVxp":{"type":"number"},"enthusiastCount":{"type":"number"},"developerCount":{"type":"number"},"approvedClientProjects":{"type":"number"},"termsAcceptedAt":{"type":"string","nullable":true},"termsVersion":{"type":"string","nullable":true},"contractSignedAt":{"type":"string","nullable":true},"nextTiers":{"description":"Upcoming tiers the partner can still graduate into, in ladder order (ascending). Empty when the partner is already at the highest tier (`PARTNER`) or when `partnerUpgradeBlocked` caps progression below it.","type":"array","items":{"$ref":"#/components/schemas/NextTierProgressDto"}},"enthusiastThreshold":{"type":"number","description":"Personal VXP a team member must earn to count as an Enthusiast (`ENTHUSIAST_VXP_THRESHOLD`). Served so the tier-progress explainer renders the number without mirroring the backend constant."}},"required":["id","workosOrgId","slug","legalName","displayName","description","websiteUrl","logoUrl","contractUrl","contactEmail","countryCode","city","githubOrg","technologyTags","socialLinks","tier","profileStatus","suspendedAt","opsPartnerApprovalAt","partnerUpgradeBlocked","businessVxp","enthusiastCount","developerCount","approvedClientProjects","termsAcceptedAt","termsVersion","contractSignedAt","nextTiers","enthusiastThreshold"]},"ApiErrorDto":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code","enum":["not_found","validation_failed","forbidden","unauthorized","conflict","rate_limited","internal"],"example":"not_found"},"message":{"type":"string","description":"Human-readable error message","example":"Resource not found"},"details":{"type":"object","description":"Optional structured details (e.g. field validation errors)"}},"required":["code","message"]},"PartnerSelfUpdateDto":{"type":"object","properties":{"displayName":{"type":"string"},"legalName":{"type":"string"},"description":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"githubOrg":{"type":"string","nullable":true},"technologyTags":{"type":"array","items":{"type":"string"}},"socialLinks":{"type":"array","items":{"$ref":"#/components/schemas/PartnerSocialLinkDto"}},"logo":{"type":"string","format":"binary","description":"Logo image file"}}},"AcceptTermsDto":{"type":"object","properties":{"version":{"type":"string","description":"Terms version string the caller is accepting"}},"required":["version"]},"VxpAwardBreakdownEntry":{"type":"object","properties":{"awardId":{"type":"string","format":"uuid"},"awardLabel":{"type":"string"},"vxp":{"type":"integer"}},"required":["awardId","awardLabel","vxp"]},"VxpMonthlyEntry":{"type":"object","properties":{"month":{"type":"string","example":"2026-04","description":"ISO calendar month key, `YYYY-MM` (UTC)."},"vxp":{"type":"integer"}},"required":["month","vxp"]},"PartnerVxpSummaryDto":{"type":"object","properties":{"totalVxp":{"type":"number"},"monthlyVxp":{"type":"number"},"byAward":{"description":"Per-award VXP breakdown for the current VXP window, sorted by vxp descending. Empty when the caller has earned no VXP.","type":"array","items":{"$ref":"#/components/schemas/VxpAwardBreakdownEntry"}},"monthly":{"description":"Calendar-month VXP totals — always six entries, oldest→newest, covering the current month plus the five preceding months. Zero-filled where no activity was approved.","type":"array","items":{"$ref":"#/components/schemas/VxpMonthlyEntry"}},"isEnthusiast":{"type":"boolean","description":"Authoritative Enthusiast flag, read from `workos_user.isEnthusiast`. Clients render this directly — they must not re-derive it from `totalVxp` against the threshold."},"enthusiastThreshold":{"type":"number","description":"Personal VXP required to reach Enthusiast standing (`ENTHUSIAST_VXP_THRESHOLD`). Served so the progress bar renders without the client mirroring the backend constant."},"enthusiastSince":{"type":"string","nullable":true,"description":"ISO-8601 timestamp the caller first crossed into Enthusiast standing, or `null` if they never have."}},"required":["totalVxp","monthlyVxp","byAward","monthly","isEnthusiast","enthusiastThreshold","enthusiastSince"]},"PartnerActivitySelfDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"vxpAwardId":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["PERSONAL","BUSINESS"]},"status":{"type":"string","enum":["PENDING","APPROVED","AUTO_APPROVED","REJECTED","CANCELLED"]},"source":{"type":"string","enum":["MANUAL","GITHUB_BOT"]},"title":{"type":"string"},"description":{"type":"string","nullable":true},"evidenceUrl":{"type":"string","nullable":true},"baseVxp":{"type":"integer"},"awardedVxp":{"type":"integer","nullable":true},"activityDate":{"type":"string","format":"date-time"},"reviewerNotes":{"type":"string","nullable":true},"decisionReason":{"type":"string","nullable":true},"reviewedAt":{"type":"string","nullable":true,"format":"date-time"},"clientName":{"type":"string","nullable":true},"clientUrl":{"type":"string","nullable":true},"projectDescription":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","vxpAwardId","scope","status","source","title","description","evidenceUrl","baseVxp","awardedVxp","activityDate","reviewerNotes","decisionReason","reviewedAt","clientName","clientUrl","projectDescription","createdAt"]},"PagedPartnerActivitySelfDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PartnerActivitySelfDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"PartnerActivitySubmitDto":{"type":"object","properties":{"vxpAwardId":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["PERSONAL","BUSINESS"]},"title":{"type":"string","minLength":1,"maxLength":500},"description":{"type":"string","maxLength":5000,"nullable":true},"evidenceUrl":{"type":"string","maxLength":1000,"nullable":true,"description":"Evidence URL"},"activityDate":{"type":"string","format":"date-time","description":"When the activity happened (cannot be in the future)"},"clientName":{"type":"string","maxLength":200,"nullable":true},"clientUrl":{"type":"string","maxLength":1000,"nullable":true,"description":"Client URL"},"projectDescription":{"type":"string","maxLength":5000,"nullable":true}},"required":["vxpAwardId","scope","title","activityDate"]},"PartnerPluginDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"packageName":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"partnerDescription":{"type":"string","nullable":true},"approvalStatus":{"type":"string","enum":["draft","pending_review","approved","rejected","suspended","hidden"]},"registry":{"type":"string"},"repositoryUrl":{"type":"string","nullable":true},"iconUrl":{"type":"string","nullable":true},"categoryIds":{"description":"Category UUIDs","type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","packageName","slug","name","description","partnerDescription","approvalStatus","registry","repositoryUrl","iconUrl","categoryIds","createdAt","updatedAt"]},"PagedPartnerPluginDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPluginDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"PartnerPluginSubmitDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"partnerDescription":{"type":"string","minLength":10,"maxLength":1000},"packageName":{"type":"string","minLength":1,"maxLength":214,"description":"Valid npm package name"},"repositoryUrl":{"type":"string","maxLength":500,"description":"HTTPS URL"},"categoryIds":{"description":"At least one category UUID","type":"array","items":{"type":"string"}},"icon":{"type":"string","format":"binary","description":"Plugin icon file"}},"required":["name","partnerDescription","packageName","repositoryUrl","categoryIds"]},"PartnerPluginUpdateDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"partnerDescription":{"type":"string","minLength":10,"maxLength":1000},"packageName":{"type":"string","minLength":1,"maxLength":214,"description":"Valid npm package name"},"repositoryUrl":{"type":"string","maxLength":500,"description":"HTTPS URL"},"categoryIds":{"description":"Category UUIDs","type":"array","items":{"type":"string"}},"icon":{"type":"string","format":"binary","description":"Plugin icon file"}}},"ProjectShowcaseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"thumbnailUrl":{"type":"string","nullable":true},"projectUrl":{"type":"string","nullable":true},"projectId":{"type":"string","nullable":true,"format":"uuid"},"technologyTags":{"type":"array","items":{"type":"string"}},"clientName":{"type":"string","nullable":true},"clientUrl":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE"]},"publishedAt":{"type":"string","nullable":true,"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","title","description","thumbnailUrl","projectUrl","projectId","technologyTags","clientName","clientUrl","visibility","publishedAt","createdAt","updatedAt"]},"PagedProjectShowcaseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectShowcaseDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"ProjectShowcaseCreateDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":500},"description":{"type":"string","minLength":1,"maxLength":10000},"projectUrl":{"type":"object","maxLength":1000,"nullable":true,"description":"Project URL"},"projectId":{"type":"object","format":"uuid","nullable":true},"technologyTags":{"description":"Technology tags (max 30)","type":"array","items":{"type":"string"}},"clientName":{"type":"object","maxLength":200,"nullable":true},"clientUrl":{"type":"object","maxLength":1000,"nullable":true,"description":"Client URL"},"thumbnail":{"type":"string","format":"binary","description":"Thumbnail image"}},"required":["title","description"]},"ProjectShowcaseUpdateDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":500},"description":{"type":"string","minLength":1,"maxLength":10000},"projectUrl":{"type":"object","maxLength":1000,"nullable":true,"description":"Project URL"},"projectId":{"type":"object","format":"uuid","nullable":true},"technologyTags":{"description":"Technology tags (max 30)","type":"array","items":{"type":"string"}},"clientName":{"type":"object","maxLength":200,"nullable":true},"clientUrl":{"type":"object","maxLength":1000,"nullable":true,"description":"Client URL"},"thumbnail":{"type":"string","format":"binary","description":"Thumbnail image"}}},"PartnerPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true},"githubOrg":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"tier":{"type":"string","enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"technologyTags":{"type":"array","items":{"type":"string"}},"businessVxp":{"type":"number","description":"Aggregate business VXP","example":500},"enthusiastCount":{"type":"number","example":3},"developerCount":{"type":"number","example":8},"partnerSince":{"type":"string","nullable":true,"format":"date-time","description":"When the partner was promoted to PARTNER tier (null if not yet promoted)"}},"required":["id","slug","displayName","description","websiteUrl","githubOrg","logoUrl","tier","countryCode","city","technologyTags","businessVxp","enthusiastCount","developerCount","partnerSince"]},"PagedPartnerPublicDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPublicDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"PartnerFacetsDto":{"type":"object","properties":{"tiers":{"description":"Partner tiers present in the directory","example":["PARTNER","FRIEND"],"type":"array","items":{"type":"string"}},"countryCodes":{"description":"ISO 3166-1 alpha-2 country codes present in the directory","example":["DE","GB"],"type":"array","items":{"type":"string"}}},"required":["tiers","countryCodes"]},"PartnerTeamMemberDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"firstName":{"type":"string","nullable":true},"lastName":{"type":"string","nullable":true},"githubUsername":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true,"description":"Public URL of the uploaded avatar. `null` when the user has not uploaded one."},"personalVxp":{"type":"number","example":120}},"required":["id","firstName","lastName","githubUsername","avatarUrl","personalVxp"]},"PartnerDirectoryShowcaseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"thumbnailUrl":{"type":"string","nullable":true},"projectUrl":{"type":"string","nullable":true},"technologyTags":{"type":"array","items":{"type":"string"}},"publishedAt":{"type":"string","nullable":true,"format":"date-time"}},"required":["id","title","description","thumbnailUrl","projectUrl","technologyTags","publishedAt"]},"PartnerDetailPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true},"githubOrg":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"tier":{"type":"string","enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"technologyTags":{"type":"array","items":{"type":"string"}},"businessVxp":{"type":"number","description":"Aggregate business VXP","example":500},"enthusiastCount":{"type":"number","example":3},"developerCount":{"type":"number","example":8},"partnerSince":{"type":"string","nullable":true,"format":"date-time","description":"When the partner was promoted to PARTNER tier (null if not yet promoted)"},"teamEnthusiasts":{"type":"array","items":{"$ref":"#/components/schemas/PartnerTeamMemberDto"}},"showcases":{"type":"array","items":{"$ref":"#/components/schemas/PartnerDirectoryShowcaseDto"}},"acceptsContact":{"type":"boolean","description":"Whether the partner can be reached through the directory contact form. True when a contact email is on file. The address itself is never exposed publicly.","example":true}},"required":["id","slug","displayName","description","websiteUrl","githubOrg","logoUrl","tier","countryCode","city","technologyTags","businessVxp","enthusiastCount","developerCount","partnerSince","teamEnthusiasts","showcases","acceptsContact"]},"PartnerContactRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Visitor's name","maxLength":200},"email":{"type":"string","description":"Visitor's email — used as the Reply-To so the partner can reply"},"company":{"type":"string","description":"Visitor's company","maxLength":200},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code","minLength":2,"maxLength":2},"message":{"type":"string","description":"The inquiry message","maxLength":2000}},"required":["name","email","company","countryCode","message"]},"PartnerContactAcknowledgementDto":{"type":"object","properties":{"accepted":{"type":"boolean","description":"Always true once the inquiry has been accepted for delivery.","example":true}},"required":["accepted"]},"CustomerSelfDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workosOrgId":{"type":"string"},"slug":{"type":"string"},"legalName":{"type":"string"},"displayName":{"type":"string"},"contactEmail":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"status":{"type":"string","enum":["ACTIVE","SUSPENDED","CHURNED"]},"suspendedAt":{"type":"string","nullable":true}},"required":["id","workosOrgId","slug","legalName","displayName","contactEmail","logoUrl","countryCode","city","status","suspendedAt"]},"CustomerSelfUpdateDto":{"type":"object","properties":{"displayName":{"type":"string"},"legalName":{"type":"string"},"contactEmail":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"logo":{"type":"string","format":"binary","description":"Logo image file"}}},"CustomerInstallTokenDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string","nullable":true},"tokenPrefix":{"type":"string"},"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"revokedAt":{"type":"string","nullable":true},"lastUsedAt":{"type":"string","nullable":true},"projectName":{"type":"string"},"projectKey":{"type":"string"}},"required":["id","projectId","label","tokenPrefix","createdAt","expiresAt","revokedAt","lastUsedAt","projectName","projectKey"]},"CustomerInstallTokenListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInstallTokenDto"}}},"required":["items"]},"OrgAssignableRolePermissionDto":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true}},"required":["slug","name","description"]},"OrgAssignableRoleDto":{"type":"object","properties":{"slug":{"type":"string","description":"WorkOS role slug (e.g. \"partner-admin\")"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"segment":{"type":"string","enum":["partner","customer"]},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/OrgAssignableRolePermissionDto"}}},"required":["slug","name","description","segment","permissions"]},"OrgAssignableRoleListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/OrgAssignableRoleDto"}}},"required":["items"]},"OrgMemberDto":{"type":"object","properties":{"membershipId":{"type":"string","description":"WorkOS organization_membership id"},"workosUserId":{"type":"string","description":"WorkOS user id (stable external id)"},"workosUserLocalId":{"type":"string","nullable":true,"description":"Local `workos_user.id` UUID (the same id `partner_activity.submittedByWorkosUserId` targets). `null` when the local mirror has not yet synced this WorkOS user."},"firstName":{"type":"string","nullable":true},"lastName":{"type":"string","nullable":true},"email":{"type":"string"},"roleSlug":{"type":"string","nullable":true},"role":{"type":"string","enum":["owner","admin","developer","member"],"nullable":true},"personalVxp":{"type":"number","description":"Personal VXP rollup for this user. `0` when the local mirror has not yet synced."},"isEnthusiast":{"type":"boolean"},"enthusiastSince":{"type":"string","nullable":true,"format":"date-time"}},"required":["membershipId","workosUserId","workosUserLocalId","firstName","lastName","email","roleSlug","role","personalVxp","isEnthusiast","enthusiastSince"]},"OrgMemberListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/OrgMemberDto"}}},"required":["items"]},"UpdateMembershipBodyDto":{"type":"object","properties":{"roleSlug":{"type":"string","description":"New WorkOS role slug (must match the org segment)"}},"required":["roleSlug"]},"OrgInvitationDto":{"type":"object","properties":{"id":{"type":"string","description":"WorkOS invitation id"},"email":{"type":"string"},"state":{"type":"string","enum":["pending","accepted","expired","revoked"]},"createdAt":{"type":"string"},"expiresAt":{"type":"string","nullable":true},"acceptedAt":{"type":"string","nullable":true},"revokedAt":{"type":"string","nullable":true}},"required":["id","email","state","createdAt","expiresAt","acceptedAt","revokedAt"]},"OrgInvitationListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/OrgInvitationDto"}},"hasMore":{"type":"boolean","description":"True when the first page was saturated — callers should contact support instead of paging further."}},"required":["items","hasMore"]},"SendInvitationBodyDto":{"type":"object","properties":{"email":{"type":"string"},"roleSlug":{"type":"string","description":"WorkOS role slug to grant on invite acceptance"}},"required":["email","roleSlug"]},"OrgInvitationEnvelopeDto":{"type":"object","properties":{"invitation":{"$ref":"#/components/schemas/OrgInvitationDto"}},"required":["invitation"]},"ProjectPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"projectKey":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"tokenExpiresAt":{"type":"string","nullable":true,"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","customerId","projectKey","name","description","tokenExpiresAt","createdAt","updatedAt"]},"PagedProjectPublicDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectPublicDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"ProjectCreateDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":5000,"nullable":true}},"required":["name"]},"ProjectUpdateDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":5000,"nullable":true}}},"PhoneHomeTokenDto":{"type":"object","properties":{"token":{"type":"string","description":"Signed project phone-home JWT."},"expiresAt":{"type":"string","format":"date-time"},"jti":{"type":"string","description":"JWT id for audit correlation."},"issuedAt":{"type":"string","format":"date-time"},"env":{"type":"string","enum":["production","staging","uat","dev"],"description":"Deployment environment stamped into the JWT `env` claim. Tokens minted before GTM-441 surface as `production`."}},"required":["token","expiresAt","jti","issuedAt","env"]},"PhoneHomeTokenMintDto":{"type":"object","properties":{"env":{"type":"string","enum":["production","staging","uat","dev"]}},"required":["env"]},"InstallTokenDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"label":{"type":"string","nullable":true},"tokenPrefix":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"revokedAt":{"type":"string","nullable":true,"format":"date-time"},"lastUsedAt":{"type":"string","nullable":true,"format":"date-time"}},"required":["id","projectId","label","tokenPrefix","createdAt","expiresAt","revokedAt","lastUsedAt"]},"InstallTokenListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/InstallTokenDto"}}},"required":["items"]},"InstallTokenCreateDto":{"type":"object","properties":{"label":{"type":"object","maxLength":200,"nullable":true},"expiresAt":{"type":"string","format":"date-time"}}},"InstallTokenCreatedDto":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/InstallTokenDto"},"plaintext":{"type":"string","description":"Plaintext token value — only returned at creation time"}},"required":["token","plaintext"]},"InstallTokenRenameDto":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120}},"required":["label"]},"ProjectBindingDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"instanceId":{"type":"string","format":"uuid"},"env":{"type":"string","enum":["production","staging","uat","dev"],"description":"Deployment env this seat is scoped to. Prod is singleton per project; non-prod envs (dev / uat / staging) allow N concurrent ACTIVE seats so one project JWT can back multiple sandboxes, each with its own instanceId."},"status":{"type":"string","enum":["ACTIVE","SPLIT_LOCKED","REVOKED"]},"boundAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"currentTokenIssuedAt":{"type":"string","format":"date-time"},"splitDetectedAt":{"type":"string","nullable":true,"format":"date-time","description":"First time this row was flipped to SPLIT_LOCKED. Present only on split-locked seats."}},"required":["id","projectId","instanceId","env","status","boundAt","lastSeenAt","currentTokenIssuedAt","splitDetectedAt"]},"ProjectBindingListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectBindingDto"}}},"required":["items"]},"ProjectRebindBindingDto":{"type":"object","properties":{"env":{"type":"string","enum":["production","staging","uat","dev"]},"reason":{"type":"string","minLength":1,"maxLength":2000}},"required":["env","reason"]},"PhoneHomeBodyDto":{"type":"object","properties":{"token":{"type":"string","minLength":1}},"required":["token"]},"PhoneHomeResponseBodyDto":{"type":"object","properties":{"ok":{"type":"boolean"},"reason":{"type":"string","enum":["revoked","no_active_license","invalid"]},"projectId":{"type":"string","format":"uuid","description":"Hub-side project id when the inbound JWT resolved to a project. Absent on `invalid`."},"sub":{"type":"string","description":"Project key (JWT `sub`) echoed back so denial responses can still be bound to a subject when no project exists."},"expiresAt":{"type":"string","format":"date-time"},"iat":{"type":"number","description":"Issued-at as unix seconds."},"exp":{"type":"number","description":"Envelope expiry as unix seconds — enforced server-side via the JWS `exp` claim to defeat replay."}},"required":["ok","iat","exp"]},"PhoneHomeResponseDto":{"type":"object","properties":{"body":{"$ref":"#/components/schemas/PhoneHomeResponseBodyDto"},"signature":{"type":"string","description":"Compact JWS (RS256) whose payload equals `body`. Verify against the JWKS."}},"required":["body","signature"]},"BreakGlassIssueRequestDto":{"type":"object","properties":{"env":{"type":"string","enum":["production","staging","uat","dev"]},"reason":{"type":"string","minLength":1,"maxLength":200},"durationHours":{"type":"integer","minimum":1,"maximum":72}},"required":["env","reason","durationHours"]},"BreakGlassIssueResponseDto":{"type":"object","properties":{"token":{"type":"string","description":"Compact JWS (RS256). Treat as bearer credential; do not log."},"jti":{"type":"string","format":"uuid"},"expiresAt":{"type":"string","format":"date-time"}},"required":["token","jti","expiresAt"]},"BreakGlassEventDto":{"type":"object","properties":{"jti":{"type":"string","format":"uuid"},"env":{"type":"string","enum":["production","staging","uat","dev"]},"durationHours":{"type":"number","minimum":1,"maximum":72},"notAfter":{"type":"string","format":"date-time"},"reason":{"type":"string"},"issuedAt":{"type":"string","format":"date-time"},"revokedAt":{"type":"string","nullable":true,"format":"date-time"},"revokedReason":{"type":"string","nullable":true}},"required":["jti","env","durationHours","notAfter","reason","issuedAt","revokedAt","revokedReason"]},"BreakGlassEventListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BreakGlassEventDto"}}},"required":["items"]},"UserMeDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workosUserId":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string","nullable":true},"lastName":{"type":"string","nullable":true},"bio":{"type":"string","nullable":true},"githubUserId":{"type":"string","nullable":true},"githubUsername":{"type":"string","nullable":true},"personalVxp":{"type":"number"},"isEnthusiast":{"type":"boolean"},"publicProfile":{"type":"boolean"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","workosUserId","email","firstName","lastName","bio","githubUserId","githubUsername","personalVxp","isEnthusiast","publicProfile","avatarUrl"]},"UserMeUpdateProfileBodyDto":{"type":"object","properties":{"publicProfile":{"type":"boolean","description":"Opt the caller into (or out of) the public enthusiast directory."},"avatarKey":{"type":"string","nullable":true,"description":"S3 key of an uploaded user-avatar asset (set), `null` to clear, or omit to leave unchanged."}}},"UserMeSyncGithubResponseDto":{"type":"object","properties":{"githubUserId":{"type":"string","nullable":true},"githubUsername":{"type":"string","nullable":true}},"required":["githubUserId","githubUsername"]},"UserMeLinkGithubBodyDto":{"type":"object","properties":{"code":{"type":"string","description":"Authorization code returned by WorkOS to /connections/callback."}},"required":["code"]},"UserMeLinkGithubResponseDto":{"type":"object","properties":{"status":{"type":"string","enum":["linked","pending_verification"]},"githubUserId":{"type":"string","nullable":true},"githubUsername":{"type":"string","nullable":true},"pendingAuthenticationToken":{"type":"string","nullable":true}},"required":["status","githubUserId","githubUsername","pendingAuthenticationToken"]},"UserMeLinkGithubOtpBodyDto":{"type":"object","properties":{"code":{"type":"string","description":"OTP code the user entered on /connections/verify."},"pendingAuthenticationToken":{"type":"string","description":"Pending authentication token returned by an earlier link attempt."}},"required":["code","pendingAuthenticationToken"]},"UserMeUnlinkGithubResponseDto":{"type":"object","properties":{"ghostDeleted":{"type":"boolean"}},"required":["ghostDeleted"]},"UserActivitySelfDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"vxpAwardId":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["PERSONAL","BUSINESS"]},"status":{"type":"string","enum":["PENDING","APPROVED","AUTO_APPROVED","REJECTED","CANCELLED"]},"source":{"type":"string","enum":["MANUAL","GITHUB_BOT"]},"title":{"type":"string"},"description":{"type":"string","nullable":true},"evidenceUrl":{"type":"string","nullable":true},"baseVxp":{"type":"integer"},"awardedVxp":{"type":"integer","nullable":true},"activityDate":{"type":"string","format":"date-time"},"reviewerNotes":{"type":"string","nullable":true},"decisionReason":{"type":"string","nullable":true},"reviewedAt":{"type":"string","nullable":true,"format":"date-time"},"clientName":{"type":"string","nullable":true},"clientUrl":{"type":"string","nullable":true},"projectDescription":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","vxpAwardId","scope","status","source","title","description","evidenceUrl","baseVxp","awardedVxp","activityDate","reviewerNotes","decisionReason","reviewedAt","clientName","clientUrl","projectDescription","createdAt"]},"PagedUserActivitySelfDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UserActivitySelfDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"UserActivitySubmitDto":{"type":"object","properties":{"vxpAwardId":{"type":"string","format":"uuid"},"title":{"type":"string","minLength":1,"maxLength":500},"description":{"type":"string","maxLength":5000,"nullable":true},"evidenceUrl":{"type":"string","maxLength":1000,"nullable":true,"description":"Evidence URL"},"activityDate":{"type":"string","format":"date-time","description":"When the activity happened (cannot be in the future)"}},"required":["vxpAwardId","title","activityDate"]},"UserSessionDto":{"type":"object","properties":{"id":{"type":"string","description":"WorkOS session id"},"device":{"type":"string","nullable":true,"description":"Pre-formatted user-agent (e.g. \"Chrome 142 on macOS\")"},"ipAddress":{"type":"string","nullable":true},"authMethod":{"type":"string"},"status":{"type":"string","enum":["active","expired","revoked"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"expiresAt":{"type":"string"},"endedAt":{"type":"string","nullable":true},"isCurrent":{"type":"boolean","description":"True when this row is the caller current session"}},"required":["id","device","ipAddress","authMethod","status","createdAt","updatedAt","expiresAt","endedAt","isCurrent"]},"UserSessionListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UserSessionDto"}}},"required":["items"]},"LicensePublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"customerId":{"type":"string","format":"uuid"},"projectId":{"type":"string","nullable":true,"format":"uuid"},"replacesId":{"type":"string","nullable":true,"format":"uuid"},"kind":{"type":"string","enum":["PRODUCTION","POC","DEMO","EVAL"]},"status":{"type":"string","enum":["ACTIVE","REVOKED","REPLACED"]},"startsAt":{"type":"string"},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","key","customerId","projectId","replacesId","kind","status","startsAt","expiresAt","createdAt"]},"PagedLicensePublicDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LicensePublicDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"LicensePolicyDto":{"type":"object","properties":{"pocWarnThresholdDays":{"type":"number","description":"Days-until-expiry threshold for POC countdown escalation."},"evalWarnThresholdDays":{"type":"number","description":"Days-until-expiry threshold for EVAL countdown escalation."}},"required":["pocWarnThresholdDays","evalWarnThresholdDays"]},"AssignProjectDto":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid"}},"required":["projectId"]},"AssignProjectResponseDto":{"type":"object","properties":{"license":{"$ref":"#/components/schemas/LicensePublicDto"},"phoneHomeToken":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PhoneHomeTokenDto"}]},"outcome":{"type":"string","enum":["minted","revoked","noop"]}},"required":["license","outcome"]},"DocsGateResponseDto":{"type":"object","properties":{"hasActiveLicense":{"type":"boolean"},"expiresAt":{"type":"string","nullable":true},"customerId":{"type":"string","nullable":true,"format":"uuid"},"customerDisplayName":{"type":"string","nullable":true},"kind":{"type":"string","enum":["PRODUCTION","POC","DEMO","EVAL"],"nullable":true}},"required":["hasActiveLicense","expiresAt","customerId","customerDisplayName","kind"]},"ActivateLicenseBindingDto":{"type":"object","properties":{"projectToken":{"type":"string","description":"Signed project phone-home JWT"}},"required":["projectToken"]},"LicenseBindingEnvelopeBodyDto":{"type":"object","properties":{"kind":{"type":"string","enum":["project_binding"]},"projectId":{"type":"string","format":"uuid"},"instanceId":{"type":"string","format":"uuid"},"jti":{"type":"string","description":"Rotating nonce — echo back on next heartbeat"},"env":{"type":"string","enum":["production","staging","uat","dev"],"description":"Deployment environment stamped on the project JWT the plugin presented. Mirrors the verified `env` claim so the plugin can log / expose the active env without re-parsing the project JWT. Prod is singleton per project; non-prod envs allow N concurrent ACTIVE seats."},"iat":{"type":"number","description":"Issued-at, unix seconds. Informational mirror of the JWS `iat` — trust the verified signature payload, not this field."},"exp":{"type":"number","description":"Expiry, unix seconds. The hub enforces this on the next heartbeat via a verifier-side `exp` check with ±30s clock-skew tolerance. Plugins SHOULD rotate well before this value — the expiry exists as a belt-and-braces defence against replay while the hub is paused, not as the primary freshness guarantee (that is the rotating `jti`)."}},"required":["kind","projectId","instanceId","jti","env","iat","exp"]},"LicenseBindingEnvelopeDto":{"type":"object","properties":{"body":{"$ref":"#/components/schemas/LicenseBindingEnvelopeBodyDto"},"signature":{"type":"string","description":"Compact JWS signed with the project-JWT signing key"}},"required":["body","signature"]},"LicenseBindingHeartbeatDto":{"type":"object","properties":{"projectToken":{"type":"string","description":"Signed project phone-home JWT"},"bindingToken":{"type":"string","description":"Signed binding token from the last activate / heartbeat response"}},"required":["projectToken","bindingToken"]},"EnterprisePluginCategory":{"type":"string","enum":["search","auth","organization","b2b","commerce","content","governance","automation"],"description":"One or more categories the plugin belongs to. The grid filter matches when any entry matches, and each entry renders as a chip on the detail page. Order is significant — the first entry is the canonical category."},"EnterprisePluginPublicDto":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug — unique identifier used on detail routes."},"packageName":{"type":"string","description":"Fully qualified npm package name."},"name":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string","description":"Multi-paragraph plain-text description; double newlines split paragraphs."},"benefits":{"type":"array","items":{"type":"string"}},"whenToUse":{"type":"string"},"categories":{"type":"array","description":"One or more categories the plugin belongs to. The grid filter matches when any entry matches, and each entry renders as a chip on the detail page. Order is significant — the first entry is the canonical category.","items":{"$ref":"#/components/schemas/EnterprisePluginCategory"}},"icon":{"type":"string","description":"Lucide icon name, resolved dynamically in the portal."},"docsUrl":{"type":"string","nullable":true,"description":"External documentation URL. Null while no per-plugin docs page exists yet — clients should suppress \"View docs\" affordances."}},"required":["slug","packageName","name","tagline","description","benefits","whenToUse","categories","icon","docsUrl"]},"EnterprisePluginPublicListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EnterprisePluginPublicDto"}}},"required":["items"]},"EnterprisePluginChangelogDto":{"type":"object","properties":{"slug":{"type":"string","description":"URL slug of the plugin the changelog belongs to."},"packageName":{"type":"string","description":"Fully qualified npm package name."},"version":{"type":"string","nullable":true,"description":"Resolved version from the registry `latest` dist-tag, or null when no published version was found."},"changelog":{"type":"string","nullable":true,"description":"Raw markdown contents of CHANGELOG.md as published in the tarball."},"available":{"type":"boolean","description":"True only when both a version was resolved and a non-empty CHANGELOG.md was extracted."}},"required":["slug","packageName","version","changelog","available"]},"PluginPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"packageName":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"registry":{"type":"string"},"repositoryUrl":{"type":"string","nullable":true},"iconUrl":{"type":"string","nullable":true},"downloadCount":{"type":"number","example":1234},"latestVersion":{"type":"string","nullable":true},"lastPublish":{"type":"string","nullable":true,"format":"date-time"},"compatibility":{"type":"string","nullable":true},"readme":{"type":"string","nullable":true,"description":"Markdown readme"},"changelog":{"type":"string","nullable":true,"description":"Markdown changelog"},"docs":{"type":"string","nullable":true,"description":"Markdown docs"},"metadataVersion":{"type":"string","nullable":true,"description":"The npm version the markdown was sourced from. `null` when the package has not yet been synced from npm."},"partnerId":{"type":"string","nullable":true,"format":"uuid"},"categories":{"description":"Category codes","type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","packageName","slug","name","description","registry","repositoryUrl","iconUrl","downloadCount","latestVersion","lastPublish","compatibility","readme","changelog","docs","metadataVersion","partnerId","categories","createdAt"]},"PagedPluginPublicDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PluginPublicDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"PluginCategoryPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"sortOrder":{"type":"number"}},"required":["id","code","name","description","color","sortOrder"]},"PluginCategoryPublicListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PluginCategoryPublicDto"}}},"required":["items"]},"VxpAwardPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"label":{"type":"string"},"description":{"type":"string","nullable":true},"scope":{"type":"string","enum":["PERSONAL","BUSINESS","BOTH"]},"category":{"type":"string","enum":["code-build","content-voice","community-reviews","projects-sales","community-tech","marketing-content"]},"baseVxp":{"type":"number","example":50},"sortOrder":{"type":"number"}},"required":["id","name","label","description","scope","category","baseVxp","sortOrder"]},"VxpAwardPublicListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/VxpAwardPublicDto"}}},"required":["items"]},"EnthusiastPublicDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"firstName":{"type":"string","nullable":true},"lastName":{"type":"string","nullable":true},"githubUsername":{"type":"string","nullable":true},"avatarUrl":{"type":"string","nullable":true,"description":"Public URL of the uploaded avatar. `null` when the user has not uploaded one."},"bio":{"type":"string","nullable":true},"personalVxp":{"type":"number","example":120},"enthusiastSince":{"type":"string","nullable":true,"format":"date-time"},"socialLinks":{"type":"object","nullable":true,"description":"Key-value map of social links"},"partnerName":{"type":"string","nullable":true},"partnerSlug":{"type":"string","nullable":true},"partnerTier":{"type":"string","nullable":true,"enum":["NONE","FRIEND","PARTNER_PENDING","PARTNER"]}},"required":["id","firstName","lastName","githubUsername","avatarUrl","bio","personalVxp","enthusiastSince","socialLinks","partnerName","partnerSlug","partnerTier"]},"PagedEnthusiastPublicDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EnthusiastPublicDto"}},"total":{"type":"number","description":"Total number of items matching the query","example":42},"page":{"type":"number","description":"Current page (1-based)","example":1},"pageSize":{"type":"number","description":"Items per page","example":20}},"required":["items","total","page","pageSize"]},"AssetUploadBodyDto":{"type":"object","properties":{"category":{"type":"string","description":"Upload category (e.g. plugin-icon, partner-logo, customer-logo, showcase-thumbnail)"},"file":{"type":"string","format":"binary","description":"The file to upload"}},"required":["category","file"]},"UploadedImageVariantDto":{"type":"object","properties":{"key":{"type":"string"},"width":{"type":"number"},"height":{"type":"number"}},"required":["key","width","height"]},"AssetUploadResultDto":{"type":"object","properties":{"kind":{"type":"string","enum":["public","private"]},"key":{"type":"string","description":"Canonical S3 object key — store this on the entity"},"url":{"type":"string","description":"Minted public URL of the original (only when kind is public)"},"variants":{"description":"Image variants (only for image categories)","type":"array","items":{"$ref":"#/components/schemas/UploadedImageVariantDto"}}},"required":["kind","key"]},"ProtectedAssetUrlDto":{"type":"object","properties":{"url":{"type":"string","description":"Short-lived presigned GET URL for the private asset"},"expiresInSeconds":{"type":"number","description":"Lifetime of the presigned URL in seconds"}},"required":["url","expiresInSeconds"]}}}}