K Khay Elixir SDK 💧

Official Elixir and Phoenix SDK for K Khay — The Non-Custodial Crypto Payment Gateway

Hex version CI License: MIT Elixir

Accept non-custodial cryptocurrency payments across 190+ blockchain networks and 500+ tokens (EVM, Bitcoin, Solana, TON, Tron, and XRPL) with zero custody and automatic direct-to-wallet settlement in Phoenix web applications and distributed Elixir OTP nodes.

Gateway Dashboard • API Keys • Website


⚡ Highlights


📦 Installation

Add kkhay to your list of dependencies in mix.exs:

def deps do
  [
    {:kkhay, "~> 1.0.4"}
  ]
end

Then run:

mix deps.get

🚀 Quick Start

1. Initialize the Client

Generate your API key in the K Khay Gateway Dashboard.

client = Kkhay.client(System.get_env("KKHAY_API_KEY"))

2. Create a Crypto Payment Invoice

Accept stablecoins, native coins, or let the customer choose their chain on checkout:

# Example: USDT on BNB Smart Chain (BSC)
{:ok, response} =
  Kkhay.create_invoice(client, %{
    amount: 49.99,
    currency: "USD",
    pay_network: "bsc",       # "bsc" | "polygon" | "base" | "arbitrum" | "ethereum" | "solana" | "bitcoin" | "ton"
    pay_token: "USDT",        # "USDT" | "USDC" | "BTC" | "ETH" | "SOL" | "TON"
    order_id: "ORDER-7711",   # Your internal order ID
    title: "Pro Subscription",
    customer_email: "elixirdev@example.com",
    redirect_url: "https://myshop.com/success"
  })

invoice = response["invoice"]
IO.puts("Invoice ID: #{invoice["id"]}")
IO.puts("Gateway ID: #{invoice["gatewayId"]}")
IO.puts("Deposit Address: #{invoice["depositAddress"]}")
IO.puts("Checkout Hosted URL: #{invoice["hostedUrl"]}")

# Redirect customer to the hosted checkout:
# Phoenix.Controller.redirect(conn, external: invoice["hostedUrl"])
# Example: Native Bitcoin or Solana
{:ok, btc_res} =
  Kkhay.create_invoice(client, %{
    amount: 120.00,
    currency: "USD",
    pay_network: "bitcoin",
    pay_token: "BTC",
    order_id: "ORDER-7712"
  })

3. Fetch & List Invoices

# Retrieve a single invoice with blockchain transaction history
{:ok, res} = Kkhay.get_invoice(client, "01940000-0000-7000-8000-000000000001")
invoice = res["invoice"]
payments = res["payments"]

IO.puts("Status: #{invoice["status"]}") # WAITING | PAID | EXPIRED | CANCELED

# List invoices with pagination
{:ok, list} = Kkhay.list_invoices(client, %{status: "PAID", limit: 10})
IO.puts("Total Paid Invoices: #{list["totalCount"]}")

4. Verify Incoming Webhooks (Phoenix Controller)

When a customer pays and the blockchain confirms the transaction, K Khay sends a cryptographically signed POST webhook to your server:

defmodule MyAppWeb.KkhayWebhookController do
  use MyAppWeb, :controller
  alias Kkhay.Webhook

  def handle(conn, _params) do
    {:ok, raw_body, conn} = Plug.Conn.read_body(conn)
    signature = Plug.Conn.get_req_header(conn, "x-kkhay-signature") |> List.first()
    secret = System.get_env("KKHAY_WEBHOOK_SECRET")

    case Webhook.parse_event(raw_body, signature, secret) do
      {:ok, event} ->
        if event["event"] == "payment.paid" do
          # Fulfill customer order in database
          MyApp.Orders.complete_order(event["order_id"], event["tx_hash"])
        end

        json(conn, %{ok: true})

      {:error, _reason} ->
        conn
        |> put_status(:unauthorized)
        |> json(%{error: "Invalid webhook signature"})
    end
  end
end

🌐 Supported Networks & Families

Network Family Popular Chains Supported Tokens
EVM (180+ Chains) Ethereum, BNB Smart Chain, Polygon, Arbitrum, Base, Optimism, Avalanche USDT, USDC, ETH, BNB, POL, AVAX, DAI, ERC-20s
UTXO Bitcoin, Dogecoin, Litecoin, Bitcoin Cash BTC, DOGE, LTC, BCH
Solana Solana Mainnet SOL, USDT, USDC
TON The Open Network TON, USDT
Tron (TVM) Tron Mainnet TRX, USDT
XRPL XRP Ledger XRP

📄 License

MIT © K Khay