openapi: 3.2.0 info: title: mcpgate-backend Subscription API version: 0.4.20 tags: - name: Subscription paths: /admin/subscription/public-key: get: tags: - Subscription summary: Get Public Key description: 'Return the active public key in PEM form for distribution to gateway images. Admin-only because we don''t need to advertise key material on the open web — gateways receive it via image release.' operationId: get_public_key_admin_subscription_public_key_get parameters: - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' title: Authorization responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicKeyResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /admin/subscription/issue: post: tags: - Subscription summary: Issue Subscription operationId: issue_subscription_admin_subscription_issue_post parameters: - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' title: Authorization requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/IssueRequest' responses: '201': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/IssueResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /admin/subscription/list: get: tags: - Subscription summary: List Subscriptions operationId: list_subscriptions_admin_subscription_list_get parameters: - name: tier in: query required: false schema: anyOf: - type: string pattern: ^(team|enterprise)$ - type: 'null' title: Tier - name: include_revoked in: query required: false schema: type: boolean default: true title: Include Revoked - name: expires_before in: query required: false schema: anyOf: - type: string format: date-time - type: 'null' title: Expires Before - name: limit in: query required: false schema: type: integer maximum: 200 minimum: 1 default: 50 title: Limit - name: offset in: query required: false schema: type: integer minimum: 0 default: 0 title: Offset - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' title: Authorization responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/SubscriptionList' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /admin/subscription/{jti}: get: tags: - Subscription summary: Get Subscription operationId: get_subscription_admin_subscription__jti__get parameters: - name: jti in: path required: true schema: type: string minLength: 1 maxLength: 64 title: Jti - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' title: Authorization responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/SubscriptionRow' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /admin/subscription/{jti}/revoke: post: tags: - Subscription summary: Revoke Subscription operationId: revoke_subscription_admin_subscription__jti__revoke_post parameters: - name: jti in: path required: true schema: type: string minLength: 1 maxLength: 64 title: Jti - name: authorization in: header required: false schema: anyOf: - type: string - type: 'null' title: Authorization responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/RevokeResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError PublicKeyResponse: properties: kid: type: string title: Kid algorithm: type: string title: Algorithm default: EdDSA public_key_pem: type: string title: Public Key Pem type: object required: - kid - public_key_pem title: PublicKeyResponse SubscriptionRow: properties: jti: type: string title: Jti customer_id: type: string title: Customer Id owner_id: anyOf: - type: string - type: 'null' title: Owner Id customer_name: type: string title: Customer Name customer_email: anyOf: - type: string - type: 'null' title: Customer Email tier: type: string enum: - team - enterprise title: Tier kid: type: string title: Kid issued_at: type: string format: date-time title: Issued At expires_at: type: string format: date-time title: Expires At issued_by: type: string title: Issued By revoked_at: anyOf: - type: string format: date-time - type: 'null' title: Revoked At notes: anyOf: - type: string - type: 'null' title: Notes type: object required: - jti - customer_id - customer_name - tier - kid - issued_at - expires_at - issued_by - revoked_at - notes title: SubscriptionRow IssueRequest: properties: owner_id: anyOf: - type: string maxLength: 64 - type: 'null' title: Owner Id customer_name: anyOf: - type: string maxLength: 255 minLength: 1 - type: 'null' title: Customer Name customer_email: anyOf: - type: string format: email - type: 'null' title: Customer Email tier: type: string enum: - team - enterprise title: Tier duration_days: type: integer maximum: 3650.0 minimum: 1.0 title: Duration Days notes: anyOf: - type: string maxLength: 2000 - type: 'null' title: Notes type: object required: - tier - duration_days title: IssueRequest description: 'Issue a new subscription. Either provide ``owner_id`` to link to an existing customer record, or provide ``customer_name`` (and optionally ``customer_email``) to create one inline. When both are given, ``owner_id`` wins.' RevokeResponse: properties: jti: type: string title: Jti revoked_at: type: string format: date-time title: Revoked At type: object required: - jti - revoked_at title: RevokeResponse SubscriptionList: properties: items: items: $ref: '#/components/schemas/SubscriptionRow' type: array title: Items total: type: integer title: Total type: object required: - items - total title: SubscriptionList IssueResponse: properties: jti: type: string title: Jti customer_id: type: string title: Customer Id owner_id: type: string title: Owner Id customer_name: type: string title: Customer Name tier: type: string enum: - team - enterprise title: Tier issued_at: type: string format: date-time title: Issued At expires_at: type: string format: date-time title: Expires At kid: type: string title: Kid token: type: string title: Token type: object required: - jti - customer_id - owner_id - customer_name - tier - issued_at - expires_at - kid - token title: IssueResponse ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: title: Input ctx: type: object title: Context type: object required: - loc - msg - type title: ValidationError