API endpoints
This is the main API reference. It explains which route to use, which key to send, and where control stays with the user.
POST /api/v1/wallet/generate
POST /api/v1/verify
GET /api/v1/agent-wallet/capabilities
POST /api/v1/agent-wallet/generate
GET /api/v1/agent-wallet/profile
GET /api/v1/agent-wallet/balances
GET /api/v1/agent-wallet/stats
GET /api/v1/agent-wallet/history
POST /api/v1/agent-wallet/settings
GET /api/v1/transfer/capabilities
POST /api/v1/transfer/execute
GET /api/v1/swap/capabilities
POST /api/v1/swap/execute
GET /api/v1/lightning/capabilities
POST /api/v1/lightning/trade
GET /api/v1/local/capabilities
GET /api/v1/token-builder/capabilities
POST /api/v1/token-builder/create
POST /api/v1/token-builder/claim-cashback
POST /api/v1/dev/analytics/trades
POST /api/v1/local/trade
GET /data-stream
GET /api/v1/token-info/:mint
GET /api/v1/health
GET /api/v1/tx/:signature/status
Slippage: accepted range is 1..99.
Versioning: the current stable API is /api/v1/*. Legacy compatibility is still available via /api/*.
Execution keys and auth
Why the keys are split: one key should not do everything. The regular API key is for normal trading. The agent execution key is for agent trades and transfers. The settings key is only for viewing and changing agent wallet settings.
| Mode | Header | Use | Idempotency |
|---|---|---|---|
| Ordinary wallet execution | X-API-Key | Regular server-side execution for lightning, token-builder, analytics, and the dedicated swap route. | Not required by the API. |
| Agent wallet execution | X-Agent-Execution-Key | Agent routes that can move funds, with limits, permissions, and replay protection. | Required on every request that can move funds. |
| Agent wallet settings | X-Settings-Key | Profile, balances, stats, history, and policy updates only. Do not give this key to an AI agent. It must not be used on transfer, swap, lightning, or any spend route. | Not used. |
Execution routes: POST /api/v1/transfer/execute is agent-wallet only and requires transfer to be enabled in policy. POST /api/v1/swap/execute accepts both the ordinary wallet API key and the agent execution key. POST /api/v1/lightning/trade also accepts the agent execution key when lightning is enabled in policy. POST /api/v1/token-builder/create and POST /api/v1/token-builder/claim-cashback also accept either X-API-Key or X-Agent-Execution-Key. If you use X-Agent-Execution-Key on token-builder routes, also send X-Idempotency-Key. Send exactly one auth header.
Agent Wallet settings
Purpose: these routes let you create an agent wallet, check its state, and change its limits. They are separate from spend routes, so you can give someone a settings key without also giving them spending access. Do not hand this key to the AI agent itself.
| Route | Header | Purpose |
|---|---|---|
| POST /api/v1/agent-wallet/generate | none | Generate the one-time bundle with private key, execution key, and settings key. |
| GET /api/v1/agent-wallet/profile | X-Settings-Key | Read public key, capabilities, limits, and current policy state. |
| GET /api/v1/agent-wallet/balances | X-Settings-Key | Read current SOL and token balances. |
| GET /api/v1/agent-wallet/stats | X-Settings-Key | Read aggregate success/failure counters and rolling policy state. |
| GET /api/v1/agent-wallet/history | X-Settings-Key | Read recent execution history with idempotency records and result summaries. |
| POST /api/v1/agent-wallet/settings | X-Settings-Key | Update capabilities, per-tx limits, rolling windows, memo requirement, and transfer allowlist. |
Default transfer stance: newly generated agent wallets start with transfer=false. Enable transfer explicitly in settings before using the dedicated transfer route.
UI page: use the AI Agents Wallet page for generate, inspect, balances, live state, and policy editing. Use the Operations Builder page only for transfers and swaps.
Token Builder Capabilities
Purpose: returns the current rules used by the builder and integrations before they send create or claim requests.
Response: supported platforms, platform labels, claim type, metadata notes, upload size limit, allowed image types, and the expected create and claim fields.
Why it exists: the web builder and example clients can boot from one source of truth instead of hardcoding pump vs letsbonk differences in multiple places.
const response = await fetch('https://corto.fun/api/v1/token-builder/capabilities', {
method: 'GET'
});
const data = await response.json();
console.log(data.platforms); // pump.fun and letsbonk.fun metadata.
console.log(data.limits); // Upload limits and supported image types.
console.log(data.createContract); // Expected fields for create.
console.log(data.claimContract); // Expected fields for claim.Token Builder Create
Auth: send exactly one execution header: X-API-Key or X-Agent-Execution-Key.
Agent mode: if you use X-Agent-Execution-Key, also send X-Idempotency-Key. Ordinary X-API-Key mode does not use idempotency.
Content-Type: multipart/form-data.
Security: image stays in memory only, max size is 2 MB by default, and only png/jpeg/webp are accepted.
| Field | Type | Required | Description |
|---|---|---|---|
| platform | "pump" | "letsbonk" | yes | Which launch platform to use. |
| name | string | yes | Token name, up to 32 chars. |
| symbol | string | yes | Token symbol, up to 10 chars. |
| description | string | yes | Metadata description. |
| website | string | no | Optional http/https URL. |
| string | no | Optional http/https URL. | |
| telegram | string | no | Optional http/https URL. |
| devBuyEnabled | boolean | no | Enables initial dev wallet buy in the same create flow. |
| devBuySol | number | no | SOL amount for the optional dev buy. Builder presets include 0.01, 0.05, 0.1, 1, 3, 5, and 10, but the server still enforces the current maximum. |
| migrateType | "amm" | "cpmm" | no | letsbonk-only LaunchLab migration mode. Defaults to amm. |
| cashbackEnabled | boolean | no | pump-only cashback accounting flag. Defaults to true in the builder. |
| image | file | yes | Single image file in field image. |
pump metadata flow: the same multipart request uploads image + metadata to pump.fun IPFS, then Corto submits create_v2 on-chain.
letsbonk metadata flow: the same multipart request uploads image + metadata to the Raydium launch-mint host, then Corto submits LaunchLab create with letsbonk platformId.
const form = new FormData();
form.append('platform', 'pump');
form.append('name', 'Corto Nova');
form.append('symbol', 'NOVA');
form.append('description', 'Example launch from Corto token builder');
form.append('website', 'https://example.com');
form.append('devBuyEnabled', 'true');
form.append('devBuySol', '0.001');
form.append('image', fileInput.files[0]);
const response = await fetch('https://corto.fun/api/v1/token-builder/create', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY' // Ordinary wallet example. X-Agent-Execution-Key also works.
},
body: form
});
const data = await response.json();
console.log(data);Token Builder Claim
Auth: send exactly one execution header: X-API-Key or X-Agent-Execution-Key. The JSON body does not include apiKey.
Agent mode: if you use X-Agent-Execution-Key, also send X-Idempotency-Key. Ordinary X-API-Key mode does not use idempotency.
| Field | Type | Required | Description |
|---|---|---|---|
| platform | "pump" | "letsbonk" | yes | Selects which reward contour to claim. |
pump: claims pump cashback for the wallet restored from the execution header you sent.
letsbonk: claims LaunchLab creator fee for the wallet restored from the execution header you sent. The public endpoint name stays shared, but the response exposes claimKind=creator_fee.
const response = await fetch('https://corto.fun/api/v1/token-builder/claim-cashback', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'YOUR_API_KEY' // Ordinary wallet example. X-Agent-Execution-Key also works.
},
body: JSON.stringify({
platform: 'letsbonk'
})
});
const data = await response.json();
console.log(data);Data Stream
Access: Data Stream is free. One IP can keep one active connection open at a time.
Purpose: read public live JSON events in real time. You do not need polling, and you do not need to reconnect every time you change the filter.
Control messages: subscribe, unsubscribe, and current_state.
How filtering works: send a new control message when you want to change pools or event types. Normal filter changes do not require reconnecting. For create subscriptions, you can also set create.detail to min, mid, or full.
| Client message | Body | Result |
|---|---|---|
| subscribe | {"type":"subscribe","events":[...],"pools":[...],"create":{"detail":"mid"}} | Starts or replaces the current subscription and sets the create message detail level. |
| unsubscribe | {"type":"unsubscribe","events":[...],"pools":[...]} | Removes part of the current filter without closing the socket. |
| current_state | {"type":"current_state"} | Returns the current filter, including the active createDetail value. |
Common responses: handshake, subscription_ack, current_state, error, plus event messages such as create, buy, sell, and migration when the current filter matches.
Start here: use the Data Stream Builder to watch live messages, then open the linked schema pages if you need the exact JSON format.
Local Capabilities
Purpose: shows the current rules for Local Build before you send POST /api/v1/local/trade.
Response: supported pools, required vs optional fields, numeric limits, default pool and route budget, and explicit mode differences such as publicKey required and no percent amounts.
Memo policy: local capabilities also expose memo rules. User memo has priority, and the branded suffix is appended only when the combined UTF-8 text still fits the service limit.
Why it exists: Local Build works differently from Lightning, so your client can read the rules first instead of learning them from validation errors.
const response = await fetch('https://corto.fun/api/v1/local/capabilities', {
method: 'GET'
});
const data = await response.json();
console.log(data.supportedPools);
console.log(data.features.requiresPublicKey); // true
console.log(data.features.supportsPercentAmount); // false
console.log(data.fieldRules.amount);Local Trade
Before sending the request: call GET /api/v1/local/capabilities if your client wants to read the current rules before building the request body.
Memo behavior: your memo is the main one. The service adds the branding suffix only if the combined UTF-8 text still fits the memo limit. If the transaction gets too large, the branding suffix is removed first and your memo stays.
| Field | Type | Required | Description |
|---|---|---|---|
| publicKey | string | yes | Wallet public key used as fee payer. |
| action | "buy" | "sell" | yes | Trade direction. |
| mint | string | yes | SPL token mint address. |
| amount | number | yes | Trade size, must be > 0. |
| denominatedInSol | boolean | yes | true = amount in SOL, false = in tokens. |
| slippage | number | yes | Allowed slippage, 1..99. |
| pool | "auto" | "pump" | "pump-amm" | "raydium-launchlab" | "raydium" | "raydium-cpmm" | "meteora-amm" | "meteora-dlmm" | "meteora" | "jupiter" | no | Routing source (default auto). Use raydium-launchlab for the Raydium LaunchLab contour; branded origin is returned separately as launchpadBrand in responses. |
| priorityFeeSol | number | no | Priority fee in SOL (0.0000001..0.01). |
| memo | string | no | Optional user memo up to 120 UTF-8 bytes. If branding memo is enabled and the combined text still fits, the service appends via corto.fun. Otherwise your memo stays unchanged. |
| partnerAddress | string | no | Partner address for additional transfer in the same transaction. |
| partnerFeeRatio | number | no | Share of order size (0..1). Example: 0.005 = 0.5%. |
| partnerFeeFixed | number | no | Fixed partner payout in SOL (0..1). |
| maxRouteMs | number | no | Routing time budget in milliseconds. |
import requests
payload = {
"publicKey": "YOUR_PUBLIC_KEY",
"action": "buy",
"mint": "TOKEN_MINT",
"amount": 0.01,
"denominatedInSol": True,
"slippage": 5,
"pool": "auto",
"memo": "local buy note"
}
res = requests.post(
"https://corto.fun/api/v1/local/trade",
json=payload,
timeout=20
)
print(res.json())const payload = {
publicKey: 'YOUR_PUBLIC_KEY',
action: 'buy',
mint: 'TOKEN_MINT',
amount: 0.01,
denominatedInSol: true,
slippage: 5,
pool: 'auto',
memo: 'local buy note',
partnerAddress: 'PARTNER_SOLANA_ADDRESS',
partnerFeeRatio: 0.005
};
const response = await fetch('https://corto.fun/api/v1/local/trade', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const data = await response.json();
console.log(data);use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() {
let client = Client::new();
let payload = json!({
"publicKey": "YOUR_PUBLIC_KEY",
"action": "buy",
"mint": "TOKEN_MINT",
"amount": 0.01,
"denominatedInSol": true,
"slippage": 5,
"pool": "auto",
"memo": "local buy note"
});
let res = client
.post("https://corto.fun/api/v1/local/trade")
.json(&payload)
.send()
.await
.unwrap();
println!("{}", res.text().await.unwrap());
}package main
import (
"bytes"
"net/http"
)
func main() {
body := []byte(`{"publicKey":"YOUR_PUBLIC_KEY","action":"buy","mint":"TOKEN_MINT","amount":0.01,"denominatedInSol":true,"slippage":5,"pool":"auto","memo":"local buy note"}`)
req, _ := http.NewRequest("POST", "https://corto.fun/api/v1/local/trade", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
client.Do(req)
}Lightning Capabilities
Purpose: shows the current rules for the server-signed Lightning flow before you send POST /api/v1/lightning/trade.
Response: supported pools, required vs optional fields, numeric limits, default ack mode, Jito policy hints, and feature flags such as supports percent amount and supports projectId.
Memo policy: lightning capabilities also expose memo rules. User memo has priority, and the branded suffix is appended only when the combined UTF-8 text still fits the service limit.
Why it exists: Lightning has extra rules beyond the basic field list, especially for ack mode, percent sells, and fees.
const response = await fetch('https://corto.fun/api/v1/lightning/capabilities', {
method: 'GET'
});
const data = await response.json();
console.log(data.defaults.ackMode);
console.log(data.features.supportsPercentAmount); // true
console.log(data.jitoPolicy);
console.log(data.fieldRules.projectId);Lightning Trade
Before sending the request: call GET /api/v1/lightning/capabilities if your client wants to read the current Lightning rules first.
Memo behavior: your memo is the main one. The branding suffix is added only if the combined UTF-8 text still fits the memo limit. In Lightning, an optional auto-Jito tip may also be removed first if the transaction gets too large.
| Field | Type | Required | Description |
|---|---|---|---|
| action | "buy" | "sell" | yes | Trade direction. |
| mint | string | yes | SPL token mint address. |
| amount | number | yes | Trade size, must be > 0. |
| denominatedInSol | boolean | yes | true = amount in SOL, false = in tokens. |
| slippage | number | yes | Allowed slippage, 1..99. |
| pool | "auto" | "pump" | "pump-amm" | "raydium-launchlab" | "raydium" | "raydium-cpmm" | "meteora-amm" | "meteora-dlmm" | "meteora" | "jupiter" | no | Routing source (default auto). Use raydium-launchlab for the Raydium LaunchLab contour; branded origin is returned separately as launchpadBrand in responses. |
| priorityFeeSol | number | no | Priority fee in SOL (0.0000001..0.01). |
| jitoTip | number | no | Explicit Jito tip in SOL. Minimum to join Jito auction is 0.0002 SOL; lower values are ignored. |
| memo | string | no | Optional user memo up to 120 UTF-8 bytes. If branding memo is enabled and the combined text still fits, the service appends via corto.fun. Otherwise your memo stays unchanged. |
| partnerAddress | string | no | Partner address that receives partner fee via separate transfer in the same transaction. |
| partnerFeeRatio | number | no | Share of order size (0..1). Example: 0.005 = 0.5%. |
| partnerFeeFixed | number | no | Fixed partner payout in SOL (0..1). |
| projectId | string | no | Optional project attribution key used by developer analytics. |
| ackMode | "sent" | "confirmed" | no | Response mode: fast-ack after send or wait for confirmation. |
| maxRouteMs | number | no | Routing time budget in milliseconds. |
Auth: send the API key only in the X-API-Key header. The JSON body does not include apiKey.
Jito policy: if only priorityFeeSol is provided and it is ≥ 0.00023 SOL, service auto-splits it 90/10: 90% to Jito tip and 10% to priority fee. If lower than 0.00023 SOL, no split is applied and full value remains priority fee.
Tx size behavior: if a request still overflows after memo/Jito fallback handling, TX_SIZE_EXCEEDED returns safe diagnostic details including the selected memo variant and whether the branded suffix or auto-Jito tip had already been dropped.
Developer analytics: only successful lightning trades are tracked. Local unsigned transactions are never included.
projectId: optional attribution key for segmenting one partner wallet into multiple projects inside developer analytics.
import requests
api_key = "YOUR_API_KEY"
payload = {
"action": "buy",
"mint": "TOKEN_MINT",
"amount": 0.01,
"denominatedInSol": True,
"slippage": 5,
"pool": "auto",
"memo": "alpha entry",
"priorityFeeSol": 0.00023,
"projectId": "alpha-campaign",
"partnerAddress": "PARTNER_SOLANA_ADDRESS",
"partnerFeeRatio": 0.005,
"partnerFeeFixed": 0.0001
}
res = requests.post(
"https://corto.fun/api/v1/lightning/trade",
headers={"X-API-Key": api_key, "Content-Type": "application/json"},
json=payload,
timeout=25
)
print(res.json())const apiKey = 'YOUR_API_KEY';
const payload = {
action: 'buy',
mint: 'TOKEN_MINT',
amount: 0.01,
denominatedInSol: true,
slippage: 5,
pool: 'auto',
memo: 'alpha entry',
priorityFeeSol: 0.00023,
projectId: 'alpha-campaign',
partnerAddress: 'PARTNER_SOLANA_ADDRESS',
partnerFeeRatio: 0.005,
partnerFeeFixed: 0.0001
};
const response = await fetch('https://corto.fun/api/v1/lightning/trade', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
body: JSON.stringify(payload)
});
const data = await response.json();
console.log(data);use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() {
let api_key = "YOUR_API_KEY";
let payload = json!({
"action": "buy",
"mint": "TOKEN_MINT",
"amount": 0.01,
"denominatedInSol": true,
"slippage": 5,
"pool": "auto",
"memo": "alpha entry",
"priorityFeeSol": 0.00023,
"projectId": "alpha-campaign",
"partnerAddress": "PARTNER_SOLANA_ADDRESS",
"partnerFeeRatio": 0.005,
"partnerFeeFixed": 0.0001
});
let res = Client::new()
.post("https://corto.fun/api/v1/lightning/trade")
.header("X-API-Key", api_key)
.json(&payload)
.send()
.await
.unwrap();
println!("{}", res.text().await.unwrap());
}package main
import (
"bytes"
"net/http"
)
func main() {
body := []byte(`{"action":"buy","mint":"TOKEN_MINT","amount":0.01,"denominatedInSol":true,"slippage":5,"pool":"auto","memo":"alpha entry","priorityFeeSol":0.00023,"projectId":"alpha-campaign","partnerAddress":"PARTNER_SOLANA_ADDRESS","partnerFeeRatio":0.005,"partnerFeeFixed":0.0001}`)
req, _ := http.NewRequest("POST", "https://corto.fun/api/v1/lightning/trade", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", "YOUR_API_KEY")
client := &http.Client{}
client.Do(req)
}Swap Capabilities
Purpose: returns the live contract for the dedicated real swap route before you submit POST /api/v1/swap/execute.
Response: required vs optional fields, exact-in semantics, default ack mode, dedicated swap timeout, auth rules, and whether token-to-token execution is supported.
Important: this route is not the Lightning buy/sell contract. Dedicated swap uses inputMint and outputMint directly.
const response = await fetch('https://corto.fun/api/v1/swap/capabilities', {
method: 'GET'
});
const data = await response.json();
console.log(data.defaults.maxRouteMs);
console.log(data.features.supportsTokenToToken); // true
console.log(data.fieldRules.inputMint);
console.log(data.fieldRules.outputMint);Dedicated Swap
Before sending the request: call GET /api/v1/swap/capabilities if your client wants to read the live swap rules first.
Contract: dedicated swap is exact-in. amount is always interpreted in units of inputMint.
Coverage: the route supports SOL -> token, token -> SOL, and token -> token. Use the canonical WSOL mint for SOL legs.
| Field | Type | Required | Description |
|---|---|---|---|
| inputMint | string | yes | Mint of the asset you are spending. |
| outputMint | string | yes | Mint of the asset you want to receive. |
| amount | number | yes | Exact-in amount expressed in input asset units. |
| slippage | number | yes | Allowed slippage, 1..99. |
| pool | "auto" | "jupiter" | no | Dedicated swap engine selection. Default is jupiter. |
| priorityFeeSol | number | no | Priority fee in SOL (0.0000001..0.01). |
| jitoTip | number | no | Explicit Jito tip in SOL. Lower values can be ignored if they do not reach the auction floor. |
| projectId | string | no | Optional project attribution key. |
| ackMode | "sent" | "confirmed" | no | Response mode: fast ack after send or wait for confirmation. |
| maxRouteMs | number | no | Dedicated swap routing budget in milliseconds. If omitted, the route uses the swap-specific ENV default. |
| memo | string | no | Optional user memo up to 120 UTF-8 bytes. |
Auth: send exactly one execution header: X-API-Key for an ordinary wallet or X-Agent-Execution-Key for an agent wallet. Agent execution also requires X-Idempotency-Key.
Route timeout: dedicated swap uses its own runtime default from SWAP_MAX_ROUTE_MS, separate from the generic routing budget used by Lightning and Local Build.
Fees: partner fee fields from Lightning are not part of the dedicated swap contract.
const apiKey = 'YOUR_API_KEY';
const payload = {
inputMint: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',
outputMint: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN',
amount: 1,
slippage: 5,
pool: 'jupiter',
ackMode: 'confirmed',
maxRouteMs: 8000,
priorityFeeSol: 0.00023,
memo: 'rebalance leg'
};
const response = await fetch('https://corto.fun/api/v1/swap/execute', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
body: JSON.stringify(payload)
});
const data = await response.json();
console.log(data.swap);
console.log(data.routePlan);Developer Analytics
| Field | Type | Required | Description |
|---|---|---|---|
| frame | string | yes | Rolling window in 1..24h or 1..30d format, for example 7h or 12d. |
| partnerAddress | string | yes | Must be the same public key that is restored from the API key used in the X-API-Key header. |
| projectId | string | no | Optional project-level filter inside the verified partner scope. |
| userWallet | string | no | Optional wallet filter when you want a single trader row. |
Auth: send the same X-API-Key header used for lightning trading. The server decodes that API key, restores the wallet, and compares the restored public key against partnerAddress.
Access model: generate the wallet on Wallet Tools, use that public key as partnerAddress in lightning trades, and query analytics with the paired API key. If the derived public key and partnerAddress differ, the endpoint returns 403. Rate limit is 1 request per 10 seconds per API key.
Response shape: the endpoint returns summary and rows. Summary includes currentTimestampMs, fromTimestampMs, frame, total volume, total API fee, total partner fee, buy count, and sell count. Rows are aggregated per user wallet.
const apiKey = 'YOUR_API_KEY';
const partnerAddress = 'PUBLIC_KEY_FROM_THE_SAME_GENERATED_WALLET';
const response = await fetch('https://corto.fun/api/v1/dev/analytics/trades', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey
},
body: JSON.stringify({
frame: '7h',
partnerAddress,
projectId: 'alpha-campaign'
})
});
const data = await response.json();
console.log(data.summary);
console.table(data.rows);Token Info (free public probe)
Rate limit: 1 request per 5 seconds per source.
| Response field | Type | Description |
|---|---|---|
| tradable | boolean | Whether route exists on public Jupiter quote. |
| token.decimals | number|null | Token decimals from public Solana RPC. |
| market.buyProbe | object | Estimated buy output for 0.001 SOL probe. |
| market.sellProbe | object|null | Estimated sell output for 1 token probe. |
Tx Status
Rate limit: 60 requests per minute per source.
Use this endpoint to check the latest known confirmation state for a Solana transaction signature when you need an API response instead of opening Solscan.
Memo readback: if the transaction contained a memo instruction, this endpoint returns the final on-chain memo text, not just the raw memo field from the request.
| Response field | Type | Description |
|---|---|---|
| status | string | Current state: not_found, processed, confirmed, finalized, or unknown. |
| confirmed | boolean | true when status is confirmed or finalized. |
| finalized | boolean | true only when finalized. |
| slot | number|null | Observed slot from RPC response. |
| error | object|null | Raw Solana transaction error object if present. |
| memo | object|null | Decoded memo data found in the on-chain transaction, including the final text if a memo instruction exists. |
Live endpoint tests
{}
{}
{}
Pricing and fees
| Item | Value | Comment |
|---|---|---|
| Platform API fee | According to active commercial plan | Check operator quote and billing agreement. |
| Priority fee | User-defined | Sent to Solana network validators. |
| Jito tip | User-defined or auto-split policy | Minimum auction tip is 0.0002 SOL. |
| Partner payout | User-defined | Service does not cap partner commission size and is not liable for it. |
For legal boundaries, open Terms of Service and Legal Notices.
For implementation walkthroughs, open Detailed Examples.