Muny API

Introduction

The Muny API lets you send $MUNY payouts to any Solana wallet — one at a time or thousands in a batch — with idempotent requests, signed webhooks and a clear payout lifecycle.

Base URL#

All endpoints are versioned under /v1 and accept and return JSON. The same API powers the Muny dashboard and the Muny mobile apps, so anything you can do in the dashboard you can do over the API.

Base URL
https://api.muny.io/v1

The full machine-readable specification is available as OpenAPI 3, with an interactive API explorer.

Conventions#

  • JSON fields are snake_case; timestamps are ISO-8601 strings in UTC.
  • Token amounts are decimal strings in whole token units — "500", "12.5" — never JSON numbers. Floating-point numbers can't represent money exactly, so the API rejects them.
  • IDs are UUIDs. Lists are cursor-paginated: { object: "list", data, has_more, next_cursor }. Pass cursor and limit (max 100).
  • Every response carries an x-request-id header. Include it when you contact support.

Payout lifecycle#

A payout is your business intent — pay this amount to this address. It settles through an on-chain transaction. The two are tracked separately, and a payout only becomes confirmed once its Solana transaction is confirmed by the network.

draft→awaiting_approval→queued→processing→confirmed|failed|cancelled
StatusMeaning
draftCreated but not submitted. Submit it when ready.
awaiting_approvalAbove your organization's approval threshold. A Finance, Admin or Owner member must approve it.
queuedAccepted and waiting to be sent.
processingA Solana transaction has been built and submitted; waiting for network confirmation.
confirmedThe transaction reached confirmed commitment on Solana. Funds are with the recipient.
failedSettlement failed. See failure_code. Failed payouts can be retried safely.
cancelledCancelled before it was sent. No funds moved.

A signature is not a confirmation

Submitting a transaction returns a signature immediately, but that alone proves nothing — the transaction can still be dropped. Muny waits for network confirmation before moving a payout to confirmed and sending payout.confirmed.

SDK#

The official TypeScript SDK wraps every endpoint, generates idempotency keys for you and retries safely.

TypeScript
import { Muny } from "@muny/sdk";

const muny = new Muny({ apiKey: process.env.MUNY_API_KEY });

const payout = await muny.payouts.create({
  recipient: "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  amount: "500",
  reference: "affiliate-123",
});