openapi: 3.0.1
info:
  title: Lightning Payment Gateway API
  description: Bitcoin Lightning Network payment gateway for .NET e-commerce platforms
  version: v1
paths:
  /api/agents/register:
    post:
      tags:
        - Agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterAgentRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/RegisterAgentRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/RegisterAgentRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentDto'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/agents/challenge:
    get:
      tags:
        - Agent
      parameters:
        - name: pubkey
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChallengeResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/agents/verify:
    post:
      tags:
        - Agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyAgentRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/VerifyAgentRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/VerifyAgentRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '410':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/agents:
    get:
      tags:
        - Agent
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentListResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/agents/{pubkey}:
    get:
      tags:
        - Agent
      parameters:
        - name: pubkey
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentDto'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/agents/capabilities:
    get:
      tags:
        - Agent
      parameters:
        - name: category
          in: query
          schema:
            type: string
        - name: q
          in: query
          schema:
            type: string
        - name: hashtags
          in: query
          schema:
            type: string
        - name: limit
          in: query
          schema:
            type: integer
            format: int32
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CapabilityListResponse'
  /api/agents/{pubkey}/stats:
    get:
      tags:
        - Agent
      parameters:
        - name: pubkey
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentStatsResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/checkout/products:
    get:
      tags:
        - Checkout
      responses:
        '200':
          description: Success
  /api/checkout/products/{productId}:
    get:
      tags:
        - Checkout
      parameters:
        - name: productId
          in: path
          required: true
          schema:
            type: string
      responses:
        '302':
          description: Redirect
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
  /checkout/{invoiceId}/status:
    get:
      tags:
        - CheckoutStatus
      parameters:
        - name: invoiceId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckoutStatusResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/demo:
    get:
      tags:
        - L402
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/premium-data:
    get:
      tags:
        - L402
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/pricing:
    get:
      tags:
        - L402
      responses:
        '200':
          description: Success
  /api/l402/status:
    get:
      tags:
        - L402
      responses:
        '200':
          description: Success
  /api/l402/challenges:
    post:
      tags:
        - L402Challenge
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateL402ChallengeRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/CreateL402ChallengeRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/CreateL402ChallengeRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateL402ChallengeResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/challenges/verify:
    post:
      tags:
        - L402Challenge
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyL402TokenRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/VerifyL402TokenRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/VerifyL402TokenRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyL402TokenResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/content:
    get:
      tags:
        - L402Content
      responses:
        '200':
          description: Success
  /api/l402/content/{slug}:
    get:
      tags:
        - L402Content
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            text/markdown:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            text/markdown:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/l402/content/bundle:
    get:
      tags:
        - L402Content
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /l402/proxy/{proxyId}/.well-known/l402-manifest.json:
    get:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /l402/proxy/{proxyId}/{path}:
    get:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    post:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    put:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    delete:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    patch:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    head:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
    options:
      tags:
        - L402Proxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '500':
          description: Server Error
        '502':
          description: Server Error
        '504':
          description: Server Error
  /l402/test/ping:
    get:
      tags:
        - L402Test
      responses:
        '200':
          description: Success
  /openapi.json:
    get:
      tags:
        - LightningEnable.Api
      responses:
        '200':
          description: Success
  /privacy:
    get:
      tags:
        - LightningEnable.Api
      responses:
        '200':
          description: Success
  /terms:
    get:
      tags:
        - LightningEnable.Api
      responses:
        '200':
          description: Success
  /api/manifests/registry:
    get:
      tags:
        - ManifestRegistry
      parameters:
        - name: q
          in: query
          schema:
            type: string
        - name: category
          in: query
          schema:
            type: string
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            default: 1
        - name: pageSize
          in: query
          schema:
            type: integer
            format: int32
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistryListDto'
  /api/manifests/validate:
    post:
      tags:
        - ManifestRegistry
      requestBody:
        content:
          application/json:
            schema: {}
          text/json:
            schema: {}
          application/*+json:
            schema: {}
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ManifestValidationResultDto'
  /api/mcp/version-check:
    get:
      tags:
        - McpVersion
      parameters:
        - name: currentVersion
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Success
  /api/shopify/{slug}/catalog:
    get:
      tags:
        - ShopifyStore
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShopifyCatalogResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/shopify/{slug}/checkout:
    post:
      tags:
        - ShopifyStore
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ShopifyCheckoutRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ShopifyCheckoutRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/ShopifyCheckoutRequest'
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '402':
          description: Client Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShopifyCheckoutResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '503':
          description: Server Error
  /api/shopify/{slug}/claim:
    post:
      tags:
        - ShopifyStore
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ShopifyClaimRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ShopifyClaimRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/ShopifyClaimRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShopifyClaimResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/shopify/{slug}/orders/{orderId}:
    get:
      tags:
        - ShopifyStore
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
        - name: orderId
          in: path
          required: true
          schema:
            type: string
        - name: claimToken
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShopifyOrderStatusResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
  /api/stats/downloads:
    get:
      tags:
        - Stats
      responses:
        '200':
          description: Success
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/AggregatedStats'
            application/json:
              schema:
                $ref: '#/components/schemas/AggregatedStats'
            text/json:
              schema:
                $ref: '#/components/schemas/AggregatedStats'
  /api/stats/shopify:
    get:
      tags:
        - Stats
      responses:
        '200':
          description: Success
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ShopifyAggregateStats'
            application/json:
              schema:
                $ref: '#/components/schemas/ShopifyAggregateStats'
            text/json:
              schema:
                $ref: '#/components/schemas/ShopifyAggregateStats'
  /api/stats/l402:
    get:
      tags:
        - Stats
      responses:
        '200':
          description: Success
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/L402UsageAggregate'
            application/json:
              schema:
                $ref: '#/components/schemas/L402UsageAggregate'
            text/json:
              schema:
                $ref: '#/components/schemas/L402UsageAggregate'
components:
  schemas:
    AgentCapabilityResponse:
      type: object
      properties:
        proxyId:
          type: string
          nullable: true
        serviceId:
          type: string
          nullable: true
        targetUrl:
          type: string
          nullable: true
        priceSats:
          type: integer
          format: int32
        description:
          type: string
          nullable: true
        categories:
          type: array
          items:
            type: string
          nullable: true
        l402Url:
          type: string
          nullable: true
        settlementMode:
          type: string
          nullable: true
        producerApiUrl:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    AgentDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        pubkey:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        isActive:
          type: boolean
        isVerified:
          type: boolean
        verifiedAt:
          type: string
          format: date-time
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
          nullable: true
        totalRequests:
          type: integer
          format: int64
        totalRevenueSats:
          type: integer
          format: int64
        activeAgreements:
          type: integer
          format: int32
      additionalProperties: false
    AgentListResponse:
      type: object
      properties:
        agents:
          type: array
          items:
            $ref: '#/components/schemas/AgentDto'
          nullable: true
        total:
          type: integer
          format: int32
      additionalProperties: false
    AgentStatsResponse:
      type: object
      properties:
        pubkey:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        totalRequests:
          type: integer
          format: int64
        totalRevenueSats:
          type: integer
          format: int64
        activeAgreements:
          type: integer
          format: int32
        averageRevenuePerRequest:
          type: number
          format: double
        isActive:
          type: boolean
        registeredAt:
          type: string
          format: date-time
        lastUpdated:
          type: string
          format: date-time
      additionalProperties: false
    AggregatedStats:
      type: object
      properties:
        total:
          type: integer
          format: int64
        breakdown:
          type: object
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/PackageDownloadEntry'
          nullable: true
        updatedAt:
          type: string
          format: date-time
      additionalProperties: false
    ApiKeyInfoResponse:
      type: object
      properties:
        maskedApiKey:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        lastRegeneratedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ApprovePendingSubscriptionRequest:
      type: object
      properties:
        merchantName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        openNodeApiKey:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        callbackUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
      additionalProperties: false
    BulkCreateEndpointsRequest:
      required:
        - endpoints
      type: object
      properties:
        endpoints:
          type: array
          items:
            $ref: '#/components/schemas/CreateManifestEndpointRequest'
      additionalProperties: false
    BulkCreateResultDto:
      type: object
      properties:
        created:
          type: integer
          format: int32
        skipped:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
      additionalProperties: false
    CapabilityDto:
      type: object
      properties:
        serviceId:
          type: string
          nullable: true
        content:
          type: string
          nullable: true
        categories:
          type: array
          items:
            type: string
          nullable: true
        priceSats:
          type: integer
          format: int32
        l402Endpoint:
          type: string
          nullable: true
        proxyId:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CapabilityListResponse:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/CapabilityDto'
          nullable: true
        total:
          type: integer
          format: int32
      additionalProperties: false
    ChallengeResponse:
      type: object
      properties:
        challenge:
          type: string
          nullable: true
        pubkey:
          type: string
          nullable: true
        expiresInSeconds:
          type: integer
          format: int32
      additionalProperties: false
    CheckoutStatusResponse:
      type: object
      properties:
        invoiceId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        amount:
          type: number
          format: double
        currency:
          type: string
          nullable: true
        lightningInvoice:
          type: string
          nullable: true
        expiresAt:
          type: string
          format: date-time
          nullable: true
        isDemo:
          type: boolean
        satsAmount:
          type: integer
          format: int64
      additionalProperties: false
    CommunitySubmissionRequest:
      required:
        - submissionId
      type: object
      properties:
        submissionId:
          maxLength: 200
          minLength: 1
          type: string
        designerName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        designerEmail:
          maxLength: 200
          minLength: 0
          type: string
          format: email
          nullable: true
        designerHandle:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        twitterUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        nostrPubkey:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        designName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        designDescription:
          maxLength: 2000
          minLength: 0
          type: string
          nullable: true
        productType:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        designFileUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
        designPreviewUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
        status:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        rejectionReason:
          maxLength: 1000
          minLength: 0
          type: string
          nullable: true
        adminNotes:
          maxLength: 2000
          minLength: 0
          type: string
          nullable: true
        paymentHash:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        preimage:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        feePaidSats:
          minimum: 0
          type: integer
          format: int64
        printfulSyncProductId:
          type: integer
          format: int64
          nullable: true
        catalogProductId:
          type: integer
          format: int32
          nullable: true
        approvedAt:
          type: string
          format: date-time
          nullable: true
        publishedAt:
          type: string
          format: date-time
          nullable: true
        rejectedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    CreateBitcoinSubscriptionRequest:
      required:
        - email
        - planTier
      type: object
      properties:
        email:
          maxLength: 200
          minLength: 0
          type: string
          format: email
        planTier:
          maxLength: 50
          minLength: 0
          pattern: >-
            ^(individual|standalone|standaloneapi|standard|kenticocommerce|l402|l402microtransactions)$
          type: string
        customerName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    CreateBitcoinSubscriptionResponse:
      type: object
      properties:
        invoiceId:
          type: integer
          format: int32
        payPageUrl:
          type: string
          nullable: true
        lightningInvoice:
          type: string
          nullable: true
        satsAmount:
          type: integer
          format: int64
        usdAmount:
          type: number
          format: double
        expiresInSeconds:
          type: integer
          format: int32
      additionalProperties: false
    CreateCheckoutSessionRequest:
      required:
        - customerEmail
        - planTier
      type: object
      properties:
        planTier:
          minLength: 1
          pattern: >-
            ^(individual|standaloneapi|kenticocommerce|l402microtransactions|standard)$
          type: string
        customerEmail:
          maxLength: 200
          minLength: 0
          type: string
          format: email
        customerName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        successUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        cancelUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
      additionalProperties: false
    CreateCheckoutSessionResponse:
      type: object
      properties:
        sessionId:
          type: string
          nullable: true
        checkoutUrl:
          type: string
          nullable: true
        publishableKey:
          type: string
          nullable: true
      additionalProperties: false
    CreateEndpointPricingRequest:
      required:
        - pathPattern
      type: object
      properties:
        pathPattern:
          maxLength: 200
          minLength: 0
          type: string
        priceSats:
          maximum: 1000000
          minimum: 0
          type: integer
          format: int32
        description:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        priority:
          type: integer
          format: int32
          nullable: true
      additionalProperties: false
    CreateL402ChallengeRequest:
      required:
        - priceSats
        - resource
      type: object
      properties:
        resource:
          minLength: 1
          type: string
        priceSats:
          minimum: 1
          type: integer
          format: int64
        description:
          type: string
          nullable: true
      additionalProperties: false
    CreateL402ChallengeResponse:
      type: object
      properties:
        invoice:
          type: string
          nullable: true
        macaroon:
          type: string
          nullable: true
        paymentHash:
          type: string
          nullable: true
        expiresAt:
          type: string
          format: date-time
        resource:
          type: string
          nullable: true
        priceSats:
          type: integer
          format: int64
        mppChallenge:
          type: string
          nullable: true
      additionalProperties: false
    CreateLightningCheckoutRequest:
      required:
        - amount
        - successUrl
      type: object
      properties:
        amount:
          maximum: 1000000
          minimum: 0.01
          type: number
          format: double
        currency:
          maxLength: 10
          minLength: 0
          pattern: ^[A-Z]{3}$
          type: string
          nullable: true
        description:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        successUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
        cancelUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
        orderId:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        metadata:
          type: object
          additionalProperties:
            type: string
          nullable: true
      additionalProperties: false
    CreateManifestEndpointRequest:
      required:
        - endpointId
        - httpMethod
        - path
      type: object
      properties:
        endpointId:
          maxLength: 200
          minLength: 0
          type: string
        path:
          maxLength: 500
          minLength: 0
          type: string
        httpMethod:
          maxLength: 10
          minLength: 0
          type: string
        summary:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        description:
          maxLength: 2000
          minLength: 0
          type: string
          nullable: true
        pricingModel:
          $ref: '#/components/schemas/PricingModel'
        basePriceSats:
          maximum: 10000000
          minimum: 0
          type: integer
          format: int32
        pricePerKb:
          type: integer
          format: int32
          nullable: true
        pricePerToken:
          type: integer
          format: int32
          nullable: true
        freeQuota:
          type: integer
          format: int32
          nullable: true
        requestContentType:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        requestSchemaJson:
          type: string
          nullable: true
        requestExampleJson:
          type: string
          nullable: true
        responseContentType:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        responseSchemaJson:
          type: string
          nullable: true
        responseExampleJson:
          type: string
          nullable: true
        tags:
          type: array
          items:
            type: string
          nullable: true
        manifestVisible:
          type: boolean
          nullable: true
        l402Enabled:
          type: boolean
          nullable: true
        requiresAdditionalAuth:
          type: boolean
          nullable: true
        isDeprecated:
          type: boolean
          nullable: true
        sortOrder:
          type: integer
          format: int32
          nullable: true
        requestsPerMinute:
          type: integer
          format: int32
          nullable: true
        requestsPerDay:
          type: integer
          format: int32
          nullable: true
      additionalProperties: false
    CreateMerchantWebhookRequest:
      required:
        - url
      type: object
      properties:
        url:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
        secret:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        name:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        events:
          maxLength: 1000
          minLength: 0
          type: string
          nullable: true
        isActive:
          type: boolean
          nullable: true
      additionalProperties: false
    CreatePaymentRequest:
      required:
        - amount
        - currency
        - orderId
      type: object
      properties:
        orderId:
          maxLength: 100
          minLength: 1
          type: string
        amount:
          minimum: 0
          type: number
          format: double
        currency:
          maxLength: 10
          minLength: 3
          pattern: ^[A-Z]{3}$
          type: string
        description:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        customerEmail:
          maxLength: 200
          minLength: 0
          type: string
          format: email
          nullable: true
        customerName:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        successUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        metadata:
          type: object
          additionalProperties:
            type: string
          nullable: true
      additionalProperties: false
    CreatePaymentResponse:
      type: object
      properties:
        invoiceId:
          type: string
          nullable: true
        providerChargeId:
          type: string
          nullable: true
        openNodeChargeId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        amount:
          type: number
          format: double
        currency:
          type: string
          nullable: true
        lightningInvoice:
          type: string
          nullable: true
        paymentHash:
          type: string
          nullable: true
        onchainAddress:
          type: string
          nullable: true
        hostedCheckoutUrl:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        expiresAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    CreateProxyRequest:
      required:
        - name
        - targetBaseUrl
      type: object
      properties:
        name:
          maxLength: 100
          minLength: 1
          type: string
        description:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        targetBaseUrl:
          minLength: 1
          type: string
          format: uri
        defaultPriceSats:
          maximum: 1000000
          minimum: 1
          type: integer
          format: int32
      additionalProperties: false
    CreateRefundRequest:
      required:
        - invoiceId
        - refundAddress
      type: object
      properties:
        invoiceId:
          minLength: 1
          type: string
        refundAddress:
          maxLength: 500
          minLength: 26
          type: string
        refundType:
          pattern: ^(chain|ln)$
          type: string
          nullable: true
        email:
          maxLength: 200
          minLength: 0
          type: string
          format: email
          nullable: true
        reason:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        amountSatoshis:
          minimum: 1
          type: integer
          format: int64
          nullable: true
      additionalProperties: false
    CreateRefundResponse:
      type: object
      properties:
        refundId:
          type: string
          nullable: true
        providerRefundId:
          type: string
          nullable: true
        openNodeRefundId:
          type: string
          nullable: true
        invoiceId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        amountSatoshis:
          type: integer
          format: int64
        feeSatoshis:
          type: integer
          format: int64
        refundAddress:
          type: string
          nullable: true
        refundType:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        transactionHash:
          type: string
          nullable: true
      additionalProperties: false
    CreateServiceRequestDto:
      required:
        - capabilityEventId
      type: object
      properties:
        capabilityEventId:
          minLength: 1
          type: string
        budgetSats:
          maximum: 10000000
          minimum: 1
          type: integer
          format: int32
        parameters:
          type: string
          nullable: true
      additionalProperties: false
    CustomerPortalRequest:
      required:
        - returnUrl
      type: object
      properties:
        returnUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
      additionalProperties: false
    CustomerPortalResponse:
      type: object
      properties:
        portalUrl:
          type: string
          nullable: true
      additionalProperties: false
    EndpointPricingDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        pathPattern:
          type: string
          nullable: true
        priceSats:
          type: integer
          format: int32
        description:
          type: string
          nullable: true
        priority:
          type: integer
          format: int32
        isActive:
          type: boolean
      additionalProperties: false
    GetBitcoinPricingResponse:
      type: object
      properties:
        plans:
          type: array
          items:
            $ref: '#/components/schemas/PlanPricingDto'
          nullable: true
      additionalProperties: false
    L402LicenseStatusDto:
      type: object
      properties:
        l402Enabled:
          type: boolean
        planTier:
          type: string
          nullable: true
        subscriptionStatus:
          type: string
          nullable: true
        isActive:
          type: boolean
      additionalProperties: false
    L402UsageAggregate:
      type: object
      properties:
        totalChallenges:
          type: integer
          format: int64
        successfulPayments:
          type: integer
          format: int64
        uniqueResources:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        breakdown:
          type: array
          items:
            $ref: '#/components/schemas/L402UsageCategoryEntry'
          nullable: true
        updatedAt:
          type: string
          format: date-time
        retentionWindowDays:
          type: integer
          format: int32
        windows:
          $ref: '#/components/schemas/L402UsageWindowSet'
        trend:
          type: array
          items:
            $ref: '#/components/schemas/L402UsageDailyTrendEntry'
          nullable: true
      additionalProperties: false
    L402UsageCategoryEntry:
      type: object
      properties:
        category:
          type: string
          nullable: true
        totalChallenges:
          type: integer
          format: int64
        successfulPayments:
          type: integer
          format: int64
        uniqueResources:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        lastUpdatedAt:
          type: string
          format: date-time
        lastError:
          type: string
          nullable: true
      additionalProperties: false
    L402UsageDailyTrendEntry:
      type: object
      properties:
        date:
          type: string
          nullable: true
        totalChallenges:
          type: integer
          format: int64
        successfulPayments:
          type: integer
          format: int64
      additionalProperties: false
    L402UsageWindowSet:
      type: object
      properties:
        last24h:
          $ref: '#/components/schemas/L402UsageWindowView'
        last7d:
          $ref: '#/components/schemas/L402UsageWindowView'
        last30d:
          $ref: '#/components/schemas/L402UsageWindowView'
        last90d:
          $ref: '#/components/schemas/L402UsageWindowView'
      additionalProperties: false
    L402UsageWindowView:
      type: object
      properties:
        totalChallenges:
          type: integer
          format: int64
        successfulPayments:
          type: integer
          format: int64
        uniqueResources:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        breakdown:
          type: array
          items:
            $ref: '#/components/schemas/L402UsageCategoryEntry'
          nullable: true
        updatedAt:
          type: string
          format: date-time
      additionalProperties: false
    ManifestEndpointDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        endpointId:
          type: string
          nullable: true
        path:
          type: string
          nullable: true
        httpMethod:
          type: string
          nullable: true
        summary:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        pricingModel:
          $ref: '#/components/schemas/PricingModel'
        basePriceSats:
          type: integer
          format: int32
        pricePerKb:
          type: integer
          format: int32
          nullable: true
        pricePerToken:
          type: integer
          format: int32
          nullable: true
        freeQuota:
          type: integer
          format: int32
          nullable: true
        requestContentType:
          type: string
          nullable: true
        responseContentType:
          type: string
          nullable: true
        tags:
          type: array
          items:
            type: string
          nullable: true
        manifestVisible:
          type: boolean
        l402Enabled:
          type: boolean
        requiresAdditionalAuth:
          type: boolean
        isDeprecated:
          type: boolean
        isActive:
          type: boolean
        sortOrder:
          type: integer
          format: int32
        requestsPerMinute:
          type: integer
          format: int32
          nullable: true
        requestsPerDay:
          type: integer
          format: int32
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ManifestEndpointListDto:
      type: object
      properties:
        endpoints:
          type: array
          items:
            $ref: '#/components/schemas/ManifestEndpointDto'
          nullable: true
        total:
          type: integer
          format: int32
      additionalProperties: false
    ManifestSettingsDto:
      type: object
      properties:
        manifestEnabled:
          type: boolean
        serviceDescription:
          type: string
          nullable: true
        logoUrl:
          type: string
          nullable: true
        contactEmail:
          type: string
          nullable: true
        documentationUrl:
          type: string
          nullable: true
        termsOfServiceUrl:
          type: string
          nullable: true
        categories:
          type: array
          items:
            type: string
          nullable: true
        manifestPubliclyListed:
          type: boolean
        manifestUrl:
          type: string
          nullable: true
      additionalProperties: false
    ManifestValidationResultDto:
      type: object
      properties:
        valid:
          type: boolean
        errors:
          type: array
          items:
            type: string
          nullable: true
      additionalProperties: false
    MerchantAccountDto:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        name:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        planTier:
          type: string
          nullable: true
        subscriptionStatus:
          type: string
          nullable: true
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        features:
          $ref: '#/components/schemas/MerchantFeaturesDto'
        onboarding:
          $ref: '#/components/schemas/OnboardingStatusDto'
      additionalProperties: false
    MerchantFeaturesDto:
      type: object
      properties:
        refundsEnabled:
          type: boolean
        multiCurrencyEnabled:
          type: boolean
        analyticsEnabled:
          type: boolean
        prioritySupport:
          type: boolean
        customBrandingEnabled:
          type: boolean
        maxWebhookEndpoints:
          type: integer
          format: int32
        l402Enabled:
          type: boolean
      additionalProperties: false
    MerchantSummary:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        name:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        callbackUrl:
          type: string
          nullable: true
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        totalInvoices:
          type: integer
          format: int32
        totalProcessed:
          type: number
          format: double
      additionalProperties: false
    MerchantWebhookDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        merchantId:
          type: integer
          format: int32
        url:
          type: string
          nullable: true
        secret:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        events:
          type: string
          nullable: true
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
          nullable: true
        consecutiveFailures:
          type: integer
          format: int32
        lastSuccessAt:
          type: string
          format: date-time
          nullable: true
        lastFailureAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    OnboardingStatusDto:
      type: object
      properties:
        hasOpenNodeKey:
          type: boolean
        hasStrikeKey:
          type: boolean
        hasWebhookUrl:
          type: boolean
        hasActiveProxy:
          type: boolean
        proxyCount:
          type: integer
          format: int32
        isFullyConfigured:
          type: boolean
      additionalProperties: false
    PackageDownloadEntry:
      type: object
      properties:
        registry:
          type: string
          nullable: true
        packageName:
          type: string
          nullable: true
        totalDownloads:
          type: integer
          format: int64
        lastUpdatedAt:
          type: string
          format: date-time
        lastError:
          type: string
          nullable: true
      additionalProperties: false
    PaymentStatusResponse:
      type: object
      properties:
        invoiceId:
          type: string
          nullable: true
        orderId:
          type: string
          nullable: true
        providerChargeId:
          type: string
          nullable: true
        openNodeChargeId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        amount:
          type: number
          format: double
        currency:
          type: string
          nullable: true
        lightningInvoice:
          type: string
          nullable: true
        onchainAddress:
          type: string
          nullable: true
        hostedCheckoutUrl:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        paidAt:
          type: string
          format: date-time
          nullable: true
        expiresAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    PendingSubscriptionDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        email:
          type: string
          nullable: true
        customerName:
          type: string
          nullable: true
        stripeCustomerId:
          type: string
          nullable: true
        stripeSubscriptionId:
          type: string
          nullable: true
        planTier:
          type: string
          nullable: true
        subscriptionStatus:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        isApproved:
          type: boolean
        isRejected:
          type: boolean
        reviewedAt:
          type: string
          format: date-time
          nullable: true
        rejectionReason:
          type: string
          nullable: true
        linkedMerchantId:
          type: integer
          format: int32
          nullable: true
      additionalProperties: false
    PlanLimitsDto:
      type: object
      properties:
        maxMerchants:
          type: integer
          format: int32
        maxEnvironments:
          type: integer
          format: int32
        maxWebhookEndpoints:
          type: integer
          format: int32
      additionalProperties: false
    PlanPricingDto:
      type: object
      properties:
        tierId:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        originalUsdPrice:
          type: number
          format: double
        discountedUsdPrice:
          type: number
          format: double
        satsAmount:
          type: integer
          format: int64
        discountPercent:
          type: number
          format: double
        features:
          type: array
          items:
            type: string
          nullable: true
      additionalProperties: false
    PricingModel:
      enum:
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
      type: integer
      format: int32
    PricingPlan:
      type: object
      properties:
        tier:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        monthlyPriceCents:
          type: integer
          format: int32
        annualPriceCents:
          type: integer
          format: int32
          nullable: true
        monthlyPriceFormatted:
          type: string
          nullable: true
          readOnly: true
        annualPriceFormatted:
          type: string
          nullable: true
          readOnly: true
        features:
          type: array
          items:
            type: string
          nullable: true
        refundsEnabled:
          type: boolean
        multiCurrencyEnabled:
          type: boolean
        maxWebhookEndpoints:
          type: integer
          format: int32
        analyticsEnabled:
          type: boolean
        prioritySupport:
          type: boolean
        customBrandingEnabled:
          type: boolean
        slaUptimePercentage:
          type: number
          format: double
          nullable: true
      additionalProperties: false
    PricingPlansResponse:
      type: object
      properties:
        plans:
          type: array
          items:
            $ref: '#/components/schemas/PricingPlan'
          nullable: true
      additionalProperties: false
    ProblemDetails:
      type: object
      properties:
        type:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        status:
          type: integer
          format: int32
          nullable: true
        detail:
          type: string
          nullable: true
        instance:
          type: string
          nullable: true
      additionalProperties: {}
    ProxyAnalyticsDto:
      type: object
      properties:
        proxyId:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        totalRequests:
          type: integer
          format: int64
        totalSatsEarned:
          type: integer
          format: int64
        averageRevenuePerRequest:
          type: number
          format: double
        createdAt:
          type: string
          format: date-time
        lastUpdated:
          type: string
          format: date-time
      additionalProperties: false
    ProxyDetailDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        proxyId:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        targetBaseUrl:
          type: string
          nullable: true
        defaultPriceSats:
          type: integer
          format: int32
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
          nullable: true
        requestCount:
          type: integer
          format: int64
        totalSatsEarned:
          type: integer
          format: int64
        endpointPricingCount:
          type: integer
          format: int32
        proxyUrl:
          type: string
          nullable: true
        endpointPricings:
          type: array
          items:
            $ref: '#/components/schemas/EndpointPricingDto'
          nullable: true
      additionalProperties: false
    ProxyDto:
      type: object
      properties:
        id:
          type: integer
          format: int32
        proxyId:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        targetBaseUrl:
          type: string
          nullable: true
        defaultPriceSats:
          type: integer
          format: int32
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
          nullable: true
        requestCount:
          type: integer
          format: int64
        totalSatsEarned:
          type: integer
          format: int64
        endpointPricingCount:
          type: integer
          format: int32
        proxyUrl:
          type: string
          nullable: true
      additionalProperties: false
    ProxyListResponse:
      type: object
      properties:
        proxies:
          type: array
          items:
            $ref: '#/components/schemas/ProxyDto'
          nullable: true
        total:
          type: integer
          format: int32
      additionalProperties: false
    ProxyTestResult:
      type: object
      properties:
        success:
          type: boolean
        targetUrl:
          type: string
          nullable: true
        statusCode:
          type: integer
          format: int32
          nullable: true
        statusDescription:
          type: string
          nullable: true
        responseTimeMs:
          type: integer
          format: int64
        message:
          type: string
          nullable: true
      additionalProperties: false
    QuickStartGuideDto:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        merchantName:
          type: string
          nullable: true
        completedSteps:
          type: integer
          format: int32
        totalSteps:
          type: integer
          format: int32
        requiredStepsCompleted:
          type: integer
          format: int32
        requiredStepsTotal:
          type: integer
          format: int32
        isReadyForProduction:
          type: boolean
        steps:
          type: array
          items:
            $ref: '#/components/schemas/QuickStartStepDto'
          nullable: true
      additionalProperties: false
    QuickStartStepDto:
      type: object
      properties:
        stepNumber:
          type: integer
          format: int32
        title:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        endpoint:
          type: string
          nullable: true
        exampleRequest:
          type: string
          nullable: true
        isCompleted:
          type: boolean
        isRequired:
          type: boolean
      additionalProperties: false
    RefundStatusResponse:
      type: object
      properties:
        refundId:
          type: string
          nullable: true
        providerRefundId:
          type: string
          nullable: true
        openNodeRefundId:
          type: string
          nullable: true
        invoiceId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        amountSatoshis:
          type: integer
          format: int64
        feeSatoshis:
          type: integer
          format: int64
        refundAddress:
          type: string
          nullable: true
        refundType:
          type: string
          nullable: true
        transactionHash:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        processedAt:
          type: string
          format: date-time
          nullable: true
        reason:
          type: string
          nullable: true
      additionalProperties: false
    RegenerateApiKeyResponse:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        newApiKey:
          type: string
          nullable: true
        regeneratedAt:
          type: string
          format: date-time
      additionalProperties: false
    RegenerateKeyResponse:
      type: object
      properties:
        newApiKey:
          type: string
          nullable: true
        regeneratedAt:
          type: string
          format: date-time
        message:
          type: string
          nullable: true
      additionalProperties: false
    RegisterAgentRequest:
      required:
        - pubkey
      type: object
      properties:
        pubkey:
          maxLength: 64
          minLength: 64
          type: string
        name:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        description:
          maxLength: 1000
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    RegisterCapabilityRequest:
      required:
        - serviceId
      type: object
      properties:
        serviceId:
          maxLength: 100
          minLength: 1
          type: string
        targetUrl:
          type: string
          format: uri
          nullable: true
        priceSats:
          maximum: 1000000
          minimum: 1
          type: integer
          format: int32
        description:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        categories:
          type: array
          items:
            type: string
          nullable: true
        settlementMode:
          maxLength: 20
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    RegisterMerchantRequest:
      required:
        - email
        - name
      type: object
      properties:
        name:
          maxLength: 200
          minLength: 1
          type: string
        email:
          maxLength: 200
          minLength: 0
          type: string
          format: email
        openNodeApiKey:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        callbackUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        webhookSecret:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    RegisterMerchantResponse:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        name:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        apiKey:
          type: string
          nullable: true
        callbackUrl:
          type: string
          nullable: true
        webhookSecret:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    RegistryItemDto:
      type: object
      properties:
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        logoUrl:
          type: string
          nullable: true
        parsedCategories:
          type: array
          items:
            type: string
          nullable: true
        endpointCount:
          type: integer
          format: int32
        defaultPriceSats:
          type: integer
          format: int32
        manifestUrl:
          type: string
          nullable: true
        proxyBaseUrl:
          type: string
          nullable: true
        documentationUrl:
          type: string
          nullable: true
        contactEmail:
          type: string
          nullable: true
      additionalProperties: false
    RegistryListDto:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/RegistryItemDto'
          nullable: true
        total:
          type: integer
          format: int32
        page:
          type: integer
          format: int32
        pageSize:
          type: integer
          format: int32
      additionalProperties: false
    RejectPendingSubscriptionRequest:
      type: object
      properties:
        reason:
          maxLength: 1000
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    ScanRequest:
      type: object
      properties:
        specUrlOverride:
          type: string
          nullable: true
      additionalProperties: false
    ScanResultDto:
      type: object
      properties:
        success:
          type: boolean
        error:
          type: string
          nullable: true
        specUrl:
          type: string
          nullable: true
        specVersion:
          type: string
          nullable: true
        apiTitle:
          type: string
          nullable: true
        apiDescription:
          type: string
          nullable: true
        endpoints:
          type: array
          items:
            $ref: '#/components/schemas/ScannedEndpointDto'
          nullable: true
      additionalProperties: false
    ScannedEndpointDto:
      type: object
      properties:
        endpointId:
          type: string
          nullable: true
        path:
          type: string
          nullable: true
        httpMethod:
          type: string
          nullable: true
        summary:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        requestContentType:
          type: string
          nullable: true
        responseContentType:
          type: string
          nullable: true
        tags:
          type: array
          items:
            type: string
          nullable: true
        isDeprecated:
          type: boolean
      additionalProperties: false
    ShopifyAggregateStats:
      type: object
      properties:
        totalStores:
          type: integer
          format: int32
        totalCheckouts:
          type: integer
          format: int32
        paidOrders:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        totalPaidSats:
          type: integer
          format: int64
        totalPaidUsd:
          type: number
          format: double
        fulfilled:
          type: integer
          format: int32
        shipped:
          type: integer
          format: int32
        firstOrderAt:
          type: string
          format: date-time
          nullable: true
        lastOrderAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ShopifyCatalogProduct:
      type: object
      properties:
        productId:
          type: integer
          format: int64
        title:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        imageUrl:
          type: string
          nullable: true
        variants:
          type: array
          items:
            $ref: '#/components/schemas/ShopifyCatalogVariant'
          nullable: true
      additionalProperties: false
    ShopifyCatalogResponse:
      type: object
      properties:
        storeName:
          type: string
          nullable: true
        slug:
          type: string
          nullable: true
        shipping:
          $ref: '#/components/schemas/ShopifyShippingRules'
        products:
          type: array
          items:
            $ref: '#/components/schemas/ShopifyCatalogProduct'
          nullable: true
      additionalProperties: false
    ShopifyCatalogVariant:
      type: object
      properties:
        variantId:
          type: integer
          format: int64
        title:
          type: string
          nullable: true
        priceUsd:
          type: number
          format: double
        available:
          type: boolean
      additionalProperties: false
    ShopifyCheckoutItem:
      required:
        - variantId
      type: object
      properties:
        variantId:
          type: integer
          format: int64
        quantity:
          maximum: 10
          minimum: 1
          type: integer
          format: int32
      additionalProperties: false
    ShopifyCheckoutLineItem:
      type: object
      properties:
        variantId:
          type: integer
          format: int64
        productTitle:
          type: string
          nullable: true
        variantTitle:
          type: string
          nullable: true
        quantity:
          type: integer
          format: int32
        priceUsd:
          type: number
          format: double
      additionalProperties: false
    ShopifyCheckoutRequest:
      required:
        - items
      type: object
      properties:
        items:
          maxItems: 10
          minItems: 1
          type: array
          items:
            $ref: '#/components/schemas/ShopifyCheckoutItem'
      additionalProperties: false
    ShopifyCheckoutResponse:
      type: object
      properties:
        orderId:
          type: string
          nullable: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/ShopifyCheckoutLineItem'
          nullable: true
        subtotalUsd:
          type: number
          format: double
        shippingUsd:
          type: number
          format: double
        taxUsd:
          type: number
          format: double
        taxNote:
          type: string
          nullable: true
        totalUsd:
          type: number
          format: double
        totalSats:
          type: integer
          format: int64
        claimToken:
          type: string
          nullable: true
        claimExpiresAt:
          type: string
          format: date-time
        claimPageUrl:
          type: string
          nullable: true
        invoice:
          type: string
          nullable: true
        macaroonBase64:
          type: string
          nullable: true
        paymentHash:
          type: string
          nullable: true
        invoiceExpiresAt:
          type: string
          format: date-time
      additionalProperties: false
    ShopifyClaimRequest:
      required:
        - claimToken
        - email
        - shippingAddress
      type: object
      properties:
        claimToken:
          maxLength: 20
          minLength: 1
          type: string
        email:
          maxLength: 200
          minLength: 1
          type: string
          format: email
        shippingAddress:
          $ref: '#/components/schemas/ShopifyShippingAddress'
      additionalProperties: false
    ShopifyClaimResponse:
      type: object
      properties:
        orderId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        shopifyOrderNumber:
          type: string
          nullable: true
        claimPageUrl:
          type: string
          nullable: true
        message:
          type: string
          nullable: true
      additionalProperties: false
    ShopifyIntegrationRequest:
      required:
        - shopifyDomain
        - slug
      type: object
      properties:
        slug:
          maxLength: 100
          minLength: 1
          pattern: ^[a-z0-9\-]+$
          type: string
        shopifyDomain:
          maxLength: 200
          minLength: 1
          type: string
        adminApiAccessToken:
          maxLength: 500
          type: string
          nullable: true
        shopifyClientId:
          maxLength: 100
          type: string
          nullable: true
        domesticShippingUsd:
          maximum: 1000
          minimum: 0
          type: number
          format: double
        internationalShippingUsd:
          maximum: 1000
          minimum: 0
          type: number
          format: double
        freeShippingEnabled:
          type: boolean
        freeShippingThresholdUsd:
          maximum: 100000
          minimum: 0
          type: number
          format: double
        catalogCacheTtlMinutes:
          maximum: 1440
          minimum: 1
          type: integer
          format: int32
        allowedProductTypes:
          maxLength: 500
          type: string
          nullable: true
        claimPageUrl:
          maxLength: 500
          type: string
          nullable: true
        domesticOnly:
          type: boolean
        defaultTaxLocation:
          maxLength: 50
          pattern: ^[A-Z]{2}-[A-Z]{2,3}-[A-Za-z0-9]{3,10}$
          type: string
          nullable: true
        claimExpiryDays:
          maximum: 365
          minimum: 1
          type: integer
          format: int32
        listInRegistry:
          type: boolean
          nullable: true
        registryCategories:
          maxLength: 500
          type: string
          nullable: true
        registryDescription:
          maxLength: 2000
          type: string
          nullable: true
      additionalProperties: false
    ShopifyIntegrationResponse:
      type: object
      properties:
        id:
          type: integer
          format: int32
        slug:
          type: string
          nullable: true
        shopifyDomain:
          type: string
          nullable: true
        hasAdminApiToken:
          type: boolean
        hasShopifyClientId:
          type: boolean
        domesticShippingUsd:
          type: number
          format: double
        internationalShippingUsd:
          type: number
          format: double
        freeShippingEnabled:
          type: boolean
        freeShippingThresholdUsd:
          type: number
          format: double
        catalogCacheTtlMinutes:
          type: integer
          format: int32
        isActive:
          type: boolean
        createdAt:
          type: string
          format: date-time
        allowedProductTypes:
          type: string
          nullable: true
        claimPageUrl:
          type: string
          nullable: true
        domesticOnly:
          type: boolean
        defaultTaxLocation:
          type: string
          nullable: true
        claimExpiryDays:
          type: integer
          format: int32
        listInRegistry:
          type: boolean
        registryCategories:
          type: string
          nullable: true
        registryDescription:
          type: string
          nullable: true
        tokenSource:
          type: string
          nullable: true
        shopifyMyShopifyDomain:
          type: string
          nullable: true
        tokenObtainedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ShopifyIntegrationUpdateRequest:
      type: object
      properties:
        shopifyDomain:
          maxLength: 200
          type: string
          nullable: true
        adminApiAccessToken:
          maxLength: 500
          type: string
          nullable: true
        shopifyClientId:
          maxLength: 100
          type: string
          nullable: true
        domesticShippingUsd:
          maximum: 1000
          minimum: 0
          type: number
          format: double
          nullable: true
        internationalShippingUsd:
          maximum: 1000
          minimum: 0
          type: number
          format: double
          nullable: true
        freeShippingEnabled:
          type: boolean
          nullable: true
        freeShippingThresholdUsd:
          maximum: 100000
          minimum: 0
          type: number
          format: double
          nullable: true
        catalogCacheTtlMinutes:
          maximum: 1440
          minimum: 1
          type: integer
          format: int32
          nullable: true
        isActive:
          type: boolean
          nullable: true
        allowedProductTypes:
          maxLength: 500
          type: string
          nullable: true
        claimPageUrl:
          maxLength: 500
          type: string
          nullable: true
        domesticOnly:
          type: boolean
          nullable: true
        defaultTaxLocation:
          maxLength: 50
          pattern: ^$|^[A-Z]{2}-[A-Z]{2,3}-[A-Za-z0-9]{3,10}$
          type: string
          nullable: true
        claimExpiryDays:
          maximum: 365
          minimum: 1
          type: integer
          format: int32
          nullable: true
        listInRegistry:
          type: boolean
          nullable: true
        registryCategories:
          maxLength: 500
          type: string
          nullable: true
        registryDescription:
          maxLength: 2000
          type: string
          nullable: true
      additionalProperties: false
    ShopifyMerchantAggregate:
      type: object
      properties:
        totalIntegrations:
          type: integer
          format: int32
        totalCheckouts:
          type: integer
          format: int32
        paidOrders:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        totalPaidSats:
          type: integer
          format: int64
        totalPaidUsd:
          type: number
          format: double
        fulfilled:
          type: integer
          format: int32
        shipped:
          type: integer
          format: int32
        firstOrderAt:
          type: string
          format: date-time
          nullable: true
        lastOrderAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ShopifyMerchantStats:
      type: object
      properties:
        merchantId:
          type: integer
          format: int32
        total:
          $ref: '#/components/schemas/ShopifyMerchantAggregate'
        byStore:
          type: array
          items:
            $ref: '#/components/schemas/ShopifyStoreStats'
          nullable: true
      additionalProperties: false
    ShopifyOrderStatusResponse:
      type: object
      properties:
        orderId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        totalUsd:
          type: number
          format: double
        paidSats:
          type: integer
          format: int64
        shopifyOrderNumber:
          type: string
          nullable: true
        trackingNumber:
          type: string
          nullable: true
        trackingCarrier:
          type: string
          nullable: true
        trackingUrl:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        paidAt:
          type: string
          format: date-time
          nullable: true
        shippedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    ShopifyOrderSummary:
      type: object
      properties:
        orderId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        totalUsd:
          type: number
          format: double
        paidSats:
          type: integer
          format: int64
        email:
          type: string
          nullable: true
        shopifyOrderNumber:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    ShopifyShippingAddress:
      required:
        - address1
        - city
        - country
        - firstName
        - lastName
      type: object
      properties:
        firstName:
          maxLength: 200
          minLength: 1
          type: string
        lastName:
          maxLength: 200
          minLength: 1
          type: string
        address1:
          maxLength: 500
          minLength: 1
          type: string
        address2:
          maxLength: 500
          type: string
          nullable: true
        city:
          maxLength: 100
          minLength: 1
          type: string
        province:
          maxLength: 100
          type: string
          nullable: true
        zip:
          maxLength: 20
          type: string
          nullable: true
        country:
          maxLength: 100
          minLength: 1
          type: string
        phone:
          maxLength: 30
          type: string
          nullable: true
      additionalProperties: false
    ShopifyShippingRules:
      type: object
      properties:
        domesticUsd:
          type: number
          format: double
        domesticOnly:
          type: boolean
        freeShippingEnabled:
          type: boolean
        freeShippingThresholdUsd:
          type: number
          format: double
          nullable: true
      additionalProperties: false
    ShopifyStoreStats:
      type: object
      properties:
        slug:
          type: string
          nullable: true
        shopifyDomain:
          type: string
          nullable: true
        totalCheckouts:
          type: integer
          format: int32
        paidOrders:
          type: integer
          format: int32
        conversionRate:
          type: number
          format: double
        totalPaidSats:
          type: integer
          format: int64
        totalPaidUsd:
          type: number
          format: double
        fulfilled:
          type: integer
          format: int32
        shipped:
          type: integer
          format: int32
        firstOrderAt:
          type: string
          format: date-time
          nullable: true
        lastOrderAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    StoreOrderRequest:
      required:
        - orderId
      type: object
      properties:
        orderId:
          maxLength: 200
          minLength: 1
          type: string
        productId:
          maximum: 10000
          minimum: 0
          type: integer
          format: int32
        quantity:
          maximum: 1000
          minimum: 0
          type: integer
          format: int32
        paidSats:
          minimum: 0
          type: integer
          format: int64
        openNodeChargeId:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        paymentHash:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        preimage:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        status:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        claimToken:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        claimExpiresAt:
          type: string
          format: date-time
          nullable: true
        selectedVariantsJson:
          maxLength: 10000
          minLength: 0
          type: string
          nullable: true
        email:
          maxLength: 200
          minLength: 0
          type: string
          format: email
          nullable: true
        shippingAddressJson:
          maxLength: 5000
          minLength: 0
          type: string
          nullable: true
        printfulOrderId:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        printfulStatus:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        trackingNumber:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        trackingCarrier:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        trackingUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
        macaroon:
          maxLength: 5000
          minLength: 0
          type: string
          nullable: true
        createdByIp:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        createdByUserAgent:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        claimedByIp:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
        paidAt:
          type: string
          format: date-time
          nullable: true
        claimedAt:
          type: string
          format: date-time
          nullable: true
        fulfilledAt:
          type: string
          format: date-time
          nullable: true
        shippedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    SubscriptionDetails:
      type: object
      properties:
        subscriptionId:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        planTier:
          type: string
          nullable: true
        currentPeriodStart:
          type: string
          format: date-time
        currentPeriodEnd:
          type: string
          format: date-time
        transactionsUsed:
          type: integer
          format: int32
        amountProcessed:
          type: number
          format: double
        customerPortalUrl:
          type: string
          nullable: true
        isTrialing:
          type: boolean
        trialEnd:
          type: string
          format: date-time
          nullable: true
        features:
          $ref: '#/components/schemas/SubscriptionFeatures'
      additionalProperties: false
    SubscriptionDetailsDto:
      type: object
      properties:
        planTier:
          type: string
          nullable: true
        planName:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        stripeCustomerId:
          type: string
          nullable: true
        limits:
          $ref: '#/components/schemas/PlanLimitsDto'
      additionalProperties: false
    SubscriptionFeatures:
      type: object
      properties:
        refundsEnabled:
          type: boolean
        multiCurrencyEnabled:
          type: boolean
        maxWebhookEndpoints:
          type: integer
          format: int32
        analyticsEnabled:
          type: boolean
        prioritySupport:
          type: boolean
        customBrandingEnabled:
          type: boolean
        slaUptimePercentage:
          type: number
          format: double
          nullable: true
      additionalProperties: false
    SubscriptionResultResponse:
      type: object
      properties:
        apiKey:
          type: string
          nullable: true
        merchantName:
          type: string
          nullable: true
        planTier:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        alreadyDisclosed:
          type: boolean
      additionalProperties: false
    UpdateEndpointPricingRequest:
      type: object
      properties:
        pathPattern:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        priceSats:
          maximum: 1000000
          minimum: 0
          type: integer
          format: int32
          nullable: true
        description:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        priority:
          type: integer
          format: int32
          nullable: true
        isActive:
          type: boolean
          nullable: true
      additionalProperties: false
    UpdateManifestEndpointRequest:
      type: object
      properties:
        summary:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        description:
          maxLength: 2000
          minLength: 0
          type: string
          nullable: true
        pricingModel:
          $ref: '#/components/schemas/PricingModel'
        basePriceSats:
          maximum: 10000000
          minimum: 0
          type: integer
          format: int32
          nullable: true
        pricePerKb:
          type: integer
          format: int32
          nullable: true
        pricePerToken:
          type: integer
          format: int32
          nullable: true
        freeQuota:
          type: integer
          format: int32
          nullable: true
        requestContentType:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        requestSchemaJson:
          type: string
          nullable: true
        requestExampleJson:
          type: string
          nullable: true
        responseContentType:
          maxLength: 100
          minLength: 0
          type: string
          nullable: true
        responseSchemaJson:
          type: string
          nullable: true
        responseExampleJson:
          type: string
          nullable: true
        tags:
          type: array
          items:
            type: string
          nullable: true
        manifestVisible:
          type: boolean
          nullable: true
        l402Enabled:
          type: boolean
          nullable: true
        requiresAdditionalAuth:
          type: boolean
          nullable: true
        isDeprecated:
          type: boolean
          nullable: true
        isActive:
          type: boolean
          nullable: true
        sortOrder:
          type: integer
          format: int32
          nullable: true
        requestsPerMinute:
          type: integer
          format: int32
          nullable: true
        requestsPerDay:
          type: integer
          format: int32
          nullable: true
      additionalProperties: false
    UpdateManifestSettingsRequest:
      type: object
      properties:
        manifestEnabled:
          type: boolean
          nullable: true
        serviceDescription:
          maxLength: 2000
          minLength: 0
          type: string
          nullable: true
        logoUrl:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        contactEmail:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        documentationUrl:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        termsOfServiceUrl:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        categories:
          type: array
          items:
            type: string
          nullable: true
        manifestPubliclyListed:
          type: boolean
          nullable: true
      additionalProperties: false
    UpdateMerchantRequest:
      type: object
      properties:
        name:
          maxLength: 200
          minLength: 1
          type: string
          nullable: true
        email:
          maxLength: 200
          minLength: 0
          type: string
          format: email
          nullable: true
        openNodeApiKey:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        callbackUrl:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        webhookSecret:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        isActive:
          type: boolean
          nullable: true
        planTier:
          maxLength: 50
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    UpdateMerchantWebhookRequest:
      type: object
      properties:
        url:
          maxLength: 500
          minLength: 0
          type: string
          format: uri
          nullable: true
        name:
          maxLength: 200
          minLength: 0
          type: string
          nullable: true
        events:
          maxLength: 1000
          minLength: 0
          type: string
          nullable: true
        isActive:
          type: boolean
          nullable: true
        regenerateSecret:
          type: boolean
          nullable: true
      additionalProperties: false
    UpdateOpenNodeKeyRequest:
      required:
        - openNodeApiKey
      type: object
      properties:
        openNodeApiKey:
          maxLength: 500
          minLength: 1
          type: string
      additionalProperties: false
    UpdatePaymentProviderRequest:
      required:
        - provider
      type: object
      properties:
        provider:
          minLength: 1
          pattern: ^(strike|opennode)$
          type: string
      additionalProperties: false
    UpdateProxyRequest:
      type: object
      properties:
        name:
          maxLength: 100
          minLength: 1
          type: string
          nullable: true
        description:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
        targetBaseUrl:
          type: string
          format: uri
          nullable: true
        defaultPriceSats:
          maximum: 1000000
          minimum: 1
          type: integer
          format: int32
          nullable: true
        isActive:
          type: boolean
          nullable: true
      additionalProperties: false
    UpdateSettingsResponse:
      type: object
      properties:
        success:
          type: boolean
        message:
          type: string
          nullable: true
      additionalProperties: false
    UpdateStrikeKeyRequest:
      required:
        - strikeApiKey
      type: object
      properties:
        strikeApiKey:
          maxLength: 500
          minLength: 1
          type: string
      additionalProperties: false
    UpdateWebhookUrlRequest:
      type: object
      properties:
        webhookUrl:
          maxLength: 2000
          minLength: 0
          type: string
          format: uri
          nullable: true
        webhookSecret:
          maxLength: 500
          minLength: 0
          type: string
          nullable: true
      additionalProperties: false
    ValidationResultDto:
      type: object
      properties:
        isValid:
          type: boolean
        message:
          type: string
          nullable: true
      additionalProperties: false
    VerifyAgentRequest:
      required:
        - challenge
        - pubkey
        - signature
      type: object
      properties:
        pubkey:
          maxLength: 64
          minLength: 64
          type: string
        challenge:
          maxLength: 64
          minLength: 64
          type: string
        signature:
          maxLength: 128
          minLength: 128
          type: string
      additionalProperties: false
    VerifyL402TokenRequest:
      required:
        - preimage
      type: object
      properties:
        macaroon:
          type: string
          nullable: true
        preimage:
          minLength: 1
          type: string
      additionalProperties: false
    VerifyL402TokenResponse:
      type: object
      properties:
        valid:
          type: boolean
        resource:
          type: string
          nullable: true
        merchantId:
          type: integer
          format: int32
          nullable: true
        amountSats:
          type: integer
          format: int64
          nullable: true
        paymentHash:
          type: string
          nullable: true
        error:
          type: string
          nullable: true
      additionalProperties: false
    VerifyResponse:
      type: object
      properties:
        pubkey:
          type: string
          nullable: true
        isVerified:
          type: boolean
        verifiedAt:
          type: string
          format: date-time
          nullable: true
        message:
          type: string
          nullable: true
      additionalProperties: false
  securitySchemes:
    ApiKey:
      type: apiKey
      description: 'API Key authentication. Use header: X-API-Key'
      name: X-API-Key
      in: header
security:
  - ApiKey: []
