> ## Documentation Index
> Fetch the complete documentation index at: https://docs.server.express/llms.txt
> Use this file to discover all available pages before exploring further.

# Start paying an invoice from a public link

> Creates a hosted checkout (Stripe or the active crypto gateway) for the invoice's full total, records a pending payment against the invoice owner, and returns the checkout URL. Success and cancel both land back on the public invoice page. One checkout per method per invoice per minute (429 otherwise). 409 when card payments are switched off. 400 when the invoice is already paid, cancelled or refunded, or when no crypto gateway is active. Uncertain: unlike the signed-in pay route, this doesn't appear to refuse an invoice that's been folded into a consolidation invoice.



## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/public/invoices/{token}/pay
openapi: 3.1.0
info:
  title: Server.Express API
  version: 1.0.0
  description: >-
    The customer-facing Server.Express API: auth, billing, tickets, cloud and
    dedicated servers, hosting, reselling and account management. Every response
    uses the `{ success, data | error }` envelope.
  contact:
    name: Server.Express
    url: https://server.express
servers:
  - url: https://my.server.express/api
    description: Production
security:
  - bearerAuth: []
  - apiToken: []
tags:
  - name: API Tokens
  - name: Account
  - name: Auth
  - name: Cloud
  - name: Coupons
  - name: Credits
  - name: Dashboard
  - name: Dedicated
  - name: Health
  - name: Hosting
  - name: Integrations
  - name: Invoices
  - name: Livechat
  - name: Notifications
  - name: Passkeys
  - name: Payments
  - name: Products
  - name: Public
  - name: Public Invoices
  - name: Public Tools
  - name: Reseller
  - name: SSH Keys
  - name: Services
  - name: Tasks
  - name: Teams
  - name: Tickets
  - name: Web Hosting
  - name: Webhooks
paths:
  /v1/public/invoices/{token}/pay:
    post:
      tags:
        - Public Invoices
      summary: Start paying an invoice from a public link
      description: >-
        Creates a hosted checkout (Stripe or the active crypto gateway) for the
        invoice's full total, records a pending payment against the invoice
        owner, and returns the checkout URL. Success and cancel both land back
        on the public invoice page. One checkout per method per invoice per
        minute (429 otherwise). 409 when card payments are switched off. 400
        when the invoice is already paid, cancelled or refunded, or when no
        crypto gateway is active. Uncertain: unlike the signed-in pay route,
        this doesn't appear to refuse an invoice that's been folded into a
        consolidation invoice.
      operationId: publicAuthPayPublicInvoice
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            The invoice's public token from its shareable link. At least 16
            characters.
          schema:
            type: string
            minLength: 16
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - method
              properties:
                method:
                  type: string
                  enum:
                    - stripe
                    - crypto
                    - nowpayments
                  description: '`nowpayments` is a legacy alias for `crypto`.'
      responses:
        '200':
          description: Checkout created. Send the browser to `url`.
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    type: object
                    required:
                      - url
                    properties:
                      url:
                        type: string
                        format: uri
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Card payments are temporarily switched off.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/ServerError'
      security: []
components:
  responses:
    BadRequest:
      description: Validation failed or the request is malformed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: The resource doesn't exist or isn't visible to you.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    TooManyRequests:
      description: Rate limit exceeded.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    ServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  schemas:
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          const: false
        error:
          type: string
          description: Human-readable error message.
      additionalProperties: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Session access token (JWT) from POST /v1/auth/login or /v1/auth/refresh.
        A session satisfies every API scope.
    apiToken:
      type: http
      scheme: bearer
      bearerFormat: se_live_<prefix>_<secret>
      description: >-
        Personal API token created under Settings → API tokens. Only routes
        guarded by verifyApiAuth accept it, and the token must carry the scope
        named in the operation's x-required-scope.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.