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

# Deliver the gate reward after verification and payment

> Post-verify reward delivery. Requires a verified proof (qHash) for the caller wallet. Paid gates also require paymentCheckoutSessionId (Stripe) or paymentTxHash (USDC). Returns the fulfillment payload and optional rewardProof / rewardPack. Payments are bound to a single gateId + qHash pair. Reuse returns 409 PAYMENT_ALREADY_USED.



## OpenAPI

````yaml /openapi/public-api.json post /api/v1/profile/gates/{gateId}/fulfill
openapi: 3.0.3
info:
  title: Proofable API
  version: 1.3.9
  description: >-
    Public HTTP API for Proofable integrators.


    Recommended integration order (simplest first):

    1. Browser: VerifyGate widget or hosted verify at
    https://proofable.me/verify (wallet, passkey, and OAuth handled by
    Proofable).

    2. JavaScript: `@proofable/sdk` `client.verify()` signs and submits for
    signature-based verifiers; use VerifyGate for hosted/interactive verifiers.

    3. Server gate checks: `GET /api/v1/proofs/check` with `gateId` or criteria
    before granting access.

    4. Raw HTTP: two-phase signing below only when you cannot use the SDK or
    hosted flows.


    Raw HTTP verification uses POST /api/v1/verification/standardize → sign
    signerString → POST /api/v1/verification with the same body plus signature.
    Session-authenticated callers may skip the signature when a valid session is
    present.


    Use your deployment base URL (for example https://api.proofable.me). Some
    verifiers require pro access. Administrative endpoints are not included in
    this specification.


    Versioning: public HTTP is `/api/v1` on https://api.proofable.me. Breaking
    changes ship as a new path version. The current public surface stays
    `/api/v1`. Deprecations are announced in the public changelog. Retired paths
    will send `Deprecation` and `Sunset` headers.


    Machine-readable spec: https://api.proofable.me/openapi.json

    Typed errors use the ErrorResponse object (`success`, `error.code`,
    `error.message`). See https://docs.proofable.me/api/errors.
  license:
    name: Proprietary — all rights reserved
    url: https://proofable.me/legal/terms-of-use
servers:
  - url: https://api.proofable.me
    description: Production API
security: []
paths:
  /api/v1/profile/gates/{gateId}/fulfill:
    post:
      tags:
        - Gates
      summary: Deliver the gate reward after verification and payment
      description: >-
        Post-verify reward delivery. Requires a verified proof (qHash) for the
        caller wallet. Paid gates also require paymentCheckoutSessionId (Stripe)
        or paymentTxHash (USDC). Returns the fulfillment payload and optional
        rewardProof / rewardPack. Payments are bound to a single gateId + qHash
        pair. Reuse returns 409 PAYMENT_ALREADY_USED.
      operationId: fulfillGate
      parameters:
        - name: gateId
          in: path
          required: true
          schema:
            type: string
            maxLength: 80
            pattern: ^[a-zA-Z0-9:_-]+$
      responses:
        '200':
          description: Fulfillment result
        '400':
          description: Invalid request, proof not verified, or gate misconfigured
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Payment required
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Gate or proof not found
        '409':
          description: Payment already used for a different checkout
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Fulfillment temporarily unavailable
components:
  schemas:
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
            type:
              type: string
            details: {}
          additionalProperties: true
        timestamp:
          $ref: '#/components/schemas/Timestamp'
        requestId:
          type: string
      additionalProperties: true
    Timestamp:
      oneOf:
        - type: string
          format: date-time
        - type: number

````