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

# Create a recipient

> Creates a new payout recipient linked to your account. Use `GET /api/payouts/account-requirements` first to determine the correct `type` and `details` fields for the target currency.

**Wallet verification:** `wallet` is required and must be a KYC-verified wallet (EVM or SVM). Unverified wallets are rejected with `403` — verify your wallet at kyc.madhousewallet.com.

**Email transfer recipients:** Pass `type: "wise_email_recipient"` to create an email-based EUR recipient. `currency` must be `EUR`. No account requirements lookup needed — provide only `details: { email: "recipient@example.com" }`. Email recipients carry no transfer fee.

**Country format:** When `details.address` is present, `details.address.country` is required and must be a valid ISO 3166-1 alpha-2 code (two letters, e.g. `US`, `GB`, `DE`). Country names (`"United States"`) and ISO-3 codes (`"USA"`) are rejected with `400`. This ensures the sanctions screen can reliably match country against the sanctioned record's country list.

**Compliance screening:** The recipient is screened against a sanctions database before creation. The screen matches on three signals: `accountHolderName` (case-folded + accent-stripped exact match), `details.address.country` (ISO 2-letter code), and `details.address` (street + city + postal-code token overlap). A request is rejected with `403` only if all available signals match the same sanctioned entity. When either the sanctioned record or the recipient lacks a country or address, that check falls through to name-only matching to ensure sparse sanctions data still catches matches.

**Rate limit:** 30 requests/minute.



## OpenAPI

````yaml /openapi.json post /api/payouts/recipients
openapi: 3.0.3
info:
  title: MW Payouts API
  version: 1.0.0
  description: >-
    The MW Payouts API lets you programmatically retrieve exchange-rate quotes,
    calculate platform fees, and submit USDC-to-fiat payout transfers on behalf
    of your account.


    All requests must be authenticated with an API key obtained from the
    **Developers** section of the dashboard. API keys are for **server-side use
    only** — never embed them in client-side code.
  contact:
    name: MW Support
    email: support@madhousewallet.com
servers:
  - url: https://business.madhousewallet.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Payouts
    description: USDC-to-fiat payout operations
  - name: Recipients
    description: Payout recipient management
paths:
  /api/payouts/recipients:
    post:
      tags:
        - Recipients
      summary: Create a recipient
      description: >-
        Creates a new payout recipient linked to your account. Use `GET
        /api/payouts/account-requirements` first to determine the correct `type`
        and `details` fields for the target currency.


        **Wallet verification:** `wallet` is required and must be a KYC-verified
        wallet (EVM or SVM). Unverified wallets are rejected with `403` — verify
        your wallet at kyc.madhousewallet.com.


        **Email transfer recipients:** Pass `type: "wise_email_recipient"` to
        create an email-based EUR recipient. `currency` must be `EUR`. No
        account requirements lookup needed — provide only `details: { email:
        "recipient@example.com" }`. Email recipients carry no transfer fee.


        **Country format:** When `details.address` is present,
        `details.address.country` is required and must be a valid ISO 3166-1
        alpha-2 code (two letters, e.g. `US`, `GB`, `DE`). Country names
        (`"United States"`) and ISO-3 codes (`"USA"`) are rejected with `400`.
        This ensures the sanctions screen can reliably match country against the
        sanctioned record's country list.


        **Compliance screening:** The recipient is screened against a sanctions
        database before creation. The screen matches on three signals:
        `accountHolderName` (case-folded + accent-stripped exact match),
        `details.address.country` (ISO 2-letter code), and `details.address`
        (street + city + postal-code token overlap). A request is rejected with
        `403` only if all available signals match the same sanctioned entity.
        When either the sanctioned record or the recipient lacks a country or
        address, that check falls through to name-only matching to ensure sparse
        sanctions data still catches matches.


        **Rate limit:** 30 requests/minute.
      operationId: createRecipient
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateRecipientRequest'
            example:
              currency: EUR
              type: iban
              accountHolderName: Jane Doe
              details:
                legalType: PRIVATE
                iban: DE89370400440532013000
              wallet: '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'
      responses:
        '201':
          description: Recipient created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recipient'
        '400':
          description: >-
            Missing required fields, or `wallet` is invalid / missing when your
            account requires KYC verification (must be a valid EVM or SVM
            address)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            `accountHolderName` failed compliance screening (matches a
            sanctioned entity), or `wallet` is not KYC-verified — verify it at
            kyc.madhousewallet.com
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit exceeded (30 req/min)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            Compliance screening or wallet verification service unavailable.
            Retry after a short delay.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    CreateRecipientRequest:
      type: object
      properties:
        currency:
          type: string
          description: ISO 4217 target currency code (e.g. EUR, GBP, USD)
          example: EUR
        type:
          type: string
          description: >-
            Account type returned by `GET /api/payouts/account-requirements`
            (e.g. `iban`, `sort_code`, `aba`). Use `wise_email_recipient` to
            create an email-based EUR transfer recipient — no account
            requirements lookup needed. `wise_email_recipient` is only valid
            when `currency` is `EUR`.
          example: iban
        accountHolderName:
          type: string
          description: Full legal name of the account holder
          example: Jane Doe
        details:
          type: object
          description: >-
            Account-type-specific fields. For standard types (e.g. `iban`,
            `sort_code`, `aba`): provide the fields returned by `GET
            /api/payouts/account-requirements`. When the account type requires
            an address, `details.address.country` must be a valid ISO 3166-1
            alpha-2 code (e.g. `US`, `GB`, `DE`). For `wise_email_recipient`:
            provide only `{ "email": "recipient@example.com" }`.
          example:
            legalType: PRIVATE
            iban: DE89370400440532013000
        wallet:
          type: string
          description: >-
            Your wallet address (EVM `0x` + 40 hex, or Solana base58 32–44
            chars). Conditionally required: only needed if your account requires
            KYC verification. When required, it must be a KYC-verified wallet —
            unverified wallets are rejected with `403` (verify at
            kyc.madhousewallet.com). If KYC is not enabled for your account,
            this field may be omitted.
          example: '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'
      required:
        - currency
        - type
        - accountHolderName
        - details
    Recipient:
      type: object
      description: A payout recipient account
      properties:
        id:
          type: integer
          description: Recipient account ID
          example: 12345678
        accountHolderName:
          type: string
          description: Name on the account
          example: Jane Doe
        currency:
          type: string
          description: ISO 4217 currency code
          example: EUR
        country:
          type: string
          description: ISO 3166-1 alpha-2 country code
          example: DE
          nullable: true
        type:
          type: string
          description: Account type (e.g. iban, sort_code, aba)
          example: iban
        active:
          type: boolean
          description: Whether the recipient is active
          example: true
        details:
          type: object
          description: Account-type-specific details (routing/account numbers, IBAN, etc.)
      required:
        - id
        - accountHolderName
        - currency
        - type
        - active
        - details
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Pass your API key as a Bearer token: `Authorization: Bearer
        mw_live_<keyId>_<secret>`

````