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

# Create a mobile money payout

> Hold funds and queue a payout to a mobile money number. The endpoint is the rail — there is no rail field in the body. Requires an Idempotency-Key.



## OpenAPI

````yaml /openapi.json post /payouts/momo
openapi: 3.1.0
info:
  title: Jenzy Hermes Client API
  version: 1.0.0
  description: >-
    Draw down your prefunded MWK balance as payouts to Malawian banks and mobile
    money. Authenticate with your `jz_live_…` API key as a bearer token.
servers:
  - url: https://api.jenzy.com/v1
    description: Production
security: []
paths:
  /payouts/momo:
    post:
      summary: Create a mobile money payout
      description: >-
        Hold funds and queue a payout to a mobile money number. The endpoint is
        the rail — there is no rail field in the body. Requires an
        Idempotency-Key.
      parameters:
        - schema:
            type: string
            description: >-
              Required. A key you mint per payout intent (a UUID works). Replays
              of the same key + body return the original response byte-for-byte;
              the same key with a different body is a 409.
          required: true
          description: >-
            Required. A key you mint per payout intent (a UUID works). Replays
            of the same key + body return the original response byte-for-byte;
            the same key with a different body is a 409.
          name: Idempotency-Key
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MomoPayoutCreate'
      responses:
        '202':
          description: >-
            Accepted: funds are held and the payout is queued for submission.
            Track it via webhooks or GET /payouts/{id}.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payout'
        '400':
          description: Malformed body or missing Idempotency-Key header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing, malformed, or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: '`insufficient_funds`: the amount exceeds your available balance.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '409':
          description: >-
            This Idempotency-Key was already used with a different request, or
            its original request is still in progress.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '422':
          description: >-
            The destination is unpayable (`unknown_bank`, `unknown_operator`,
            `invalid_mobile_number`, `invalid_account_number`) or
            `amount_limit_exceeded`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: '`rate_limited` or `org_limit_exceeded` — retry later.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '503':
          description: '`rail_disabled` or `service_unavailable` — retry later.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    MomoPayoutCreate:
      type: object
      properties:
        amount_mwk:
          type: integer
          exclusiveMinimum: 0
          example: 250000
        operator_ref_id:
          type: string
          minLength: 1
          description: From GET /operators (`ref_id`).
        mobile_number:
          type: string
          minLength: 1
          example: '+265991234567'
      required:
        - amount_mwk
        - operator_ref_id
        - mobile_number
    Payout:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Payout id — your handle for polling and support.
        amount_mwk:
          type: integer
          example: 250000
        rail:
          type: string
          enum:
            - bank
            - momo
        status:
          type: string
          enum:
            - received
            - validated
            - held
            - submitted
            - pending
            - succeeded
            - failed
          description: >-
            Lifecycle: received → validated → held → submitted → pending →
            succeeded | failed. Only `succeeded` and `failed` are terminal.
          example: succeeded
        destination:
          $ref: '#/components/schemas/PayoutDestination'
        failure:
          $ref: '#/components/schemas/PayoutFailure'
        created_at:
          type: string
          format: date-time
        terminal_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - amount_mwk
        - rail
        - status
        - destination
        - failure
        - created_at
        - terminal_at
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_error
                - unauthorized
                - forbidden
                - not_found
                - conflict
                - rate_limited
                - internal_error
                - unknown_bank
                - unknown_operator
                - invalid_mobile_number
                - invalid_account_number
                - service_unavailable
                - insufficient_funds
                - rail_disabled
                - amount_limit_exceeded
                - org_limit_exceeded
              description: >-
                Stable identifier a client may branch on — never renamed or
                removed.
            message:
              type: string
          required:
            - code
            - message
      required:
        - error
    PayoutDestination:
      anyOf:
        - type: object
          properties:
            bank_uuid:
              type: string
            account_number:
              type: string
            account_name:
              type: string
          required:
            - bank_uuid
            - account_number
        - type: object
          properties:
            operator_ref_id:
              type: string
            mobile_number:
              type: string
          required:
            - operator_ref_id
            - mobile_number
      description: The destination snapshot as validated at accept — shape follows `rail`.
    PayoutFailure:
      type:
        - object
        - 'null'
      properties:
        code:
          type: string
          enum:
            - recipient_account_invalid
            - declined
            - provider_unavailable
            - temporarily_unavailable
          description: Published failure codes — never renamed or removed; additions only.
        message:
          type: string
          description: Fixed per-code copy — safe to show to your own users.
      required:
        - code
        - message
      description: Set exactly when status is `failed`; null otherwise.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: 'Your Jenzy API key: `Authorization: Bearer jz_live_…`'

````