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

# StarkPay overview

> Accept crypto, PIX, and card payments with split settlement, webhooks, and KYC rules by flow type.

StarkPay is StarkFi's payment product. You register a payment intent, create a transaction for the payer's chosen method, then execute on-chain or wait for fiat settlement — depending on the flow.

<Info>
  Confirm StarkPay-related products are enabled for your deployment with [`GET /config/products`](/products) (requires `x-api-key`). At minimum, enable the payment methods you plan to offer (`crypto`, `pix`, `credit_card`).
</Info>

## Checkout vs financial transaction

StarkPay distinguishes two payment contexts. KYC/KYB rules depend on which one you use.

| Context                   | What it is                                                                                                                 | KYC/KYB required?                                        |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| **Checkout (order)**      | Payment linked to a pre-created [order](/create-orders). The payer completes a hosted checkout experience.                 | **No** — checkout flows do not require KYC/KYB           |
| **Financial transaction** | Direct payment registration without an order (`executor_id: api_transaction`). Treated as a regulated financial operation. | **Yes** for fiat-related methods; **no** for 100% crypto |

### How checkout is identified

A payment is treated as **checkout** when any of the following is true:

* You register the payment intent with an **`order_code`** that references an existing order (sets `executor_id` to `order_transaction` automatically), or
* The payment's `executor_id` is already **`order_transaction`**

In both cases, [`POST /payment/register/intents-create-transaction`](/create-transaction) **skips KYC/KYB validation**, regardless of payment method.

### When KYC/KYB is required

For **financial transactions** (not checkout), KYC/KYB is enforced when:

* `transaction_type` is **not** pure `crypto` (e.g. `pixcrypto`, `cardcrypto`, `cardfiat`), **and**
* You provide `payer_email` and/or `payer_wallet`

Pure **`crypto`** financial transactions never require KYC/KYB, even when payer identity is sent.

| Status                      | Meaning                                        |
| --------------------------- | ---------------------------------------------- |
| `kyc_verification_required` | Payer has not completed KYC/KYB                |
| `kyc_not_approved`          | Payer started verification but is not approved |

Route the user through the [KYC flow](/getting-started) before retrying transaction creation.

## Payment methods

| `transaction_type` | Product flag  | Description                                             |
| ------------------ | ------------- | ------------------------------------------------------- |
| `crypto`           | `crypto`      | Payer sends tokens on-chain (any supported chain/token) |
| `pixcrypto`        | `pix`         | PIX → crypto settlement                                 |
| `cardcrypto`       | `credit_card` | Card → crypto settlement                                |
| `cardfiat`         | `credit_card` | Card → fiat settlement                                  |
| `cryptopix`        | `crypto`      | Crypto → PIX off-ramp                                   |
| `fiatcrypto`       | `crypto`      | Fiat → crypto (on-ramp style)                           |

## Integration flow

<Steps>
  <Step title="Choose your path">
    **Checkout:** create an [order](/create-orders), then register payment with `order_code`.

    **Financial transaction:** register a standalone payment intent with [`POST /payment/register/intents-create-order`](/register-order-trasanction) (`executor_id: api_transaction`).
  </Step>

  <Step title="Register the payment intent">
    [`POST /payment/register/intents-create-order`](/register-order-trasanction)

    Required tenant fields include `public_client_id` (format `stkf_` + 32 hex characters) and `webhook_url`.
  </Step>

  <Step title="Create the payer transaction">
    With the returned `payment_id`, call [`POST /payment/register/intents-create-transaction`](/create-transaction) with the payer's wallet, email, and `transaction_type`.

    KYC/KYB applies only to **financial transactions** with fiat-related types — not to checkout or pure crypto.
  </Step>

  <Step title="Execute or monitor">
    * **Crypto:** sign the unsigned transaction and submit via [`POST /payment/execute/on-chain`](/broadcast-transactions).
    * **PIX / card:** monitor with [`GET /payment/:id/status`](/check-payment-info) or your webhook.
  </Step>
</Steps>

## Split payments

Use `split_payment_config` to route received funds to multiple wallets:

```json theme={null}
"split_payment_config": [
  {
    "receiver_wallet": "0x9b57847b69D0354837F7b723133B9dBCbefb4F9F",
    "receiver_percent": 100
  }
]
```

Percentages must sum to 100 across receivers.

## Webhooks

Set `tenant_data.webhook_url` when registering the payment. StarkFi forwards status changes so you do not need to poll for every update.

## Related guides

* [Create order (checkout)](/create-orders)
* [Register payment intent](/register-order-trasanction)
* [Create transaction](/create-transaction)
* [Broadcast transactions](/broadcast-transactions)
* [Check payment info](/check-payment-info)
* [KYC getting started](/getting-started)
