Appearance
API & Error Handling
Endpoint
| Path | Method | Format |
|---|---|---|
/ | POST | JSON-RPC |
Request
- Query parameter:
api-key(string, required)
http
POST /?api-key=YOUR_API_KEY
Content-Type: application/jsonBody: Standard Solana JSON-RPC request
Response format
Responses follow the Solana JSON-RPC format.
Success
json
{
"jsonrpc": "2.0",
"result": "5KtPn1LGuxhFiwjxErkxTb7XxtLVYUBe6Cn33ej7ATNQy...",
"id": 1
}result is the transaction signature (Base58).
Error
json
{
"jsonrpc": "2.0",
"error": {
"code": -32005,
"message": "Rate limit exceeded"
},
"id": null
}Supported methods
| Method | Description |
|---|---|
sendTransaction | Submit a transaction |
getHealth | Health check / keepalive |
Keepalive (recommended)
Call getHealth every 60 seconds to keep the connection warm:
json
{"jsonrpc":"2.0","id":1,"method":"getHealth"}Examples
cURL
bash
curl -X POST 'http://fra1.blockgo.trade/?api-key=YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "sendTransaction",
"params": ["YOUR_BASE64_TX", {"encoding": "base64"}]
}'TypeScript
typescript
import { Connection, VersionedTransaction } from '@solana/web3.js';
// Option 1: @solana/web3.js
const connection = new Connection(
'http://fra1.blockgo.trade?api-key=YOUR_API_KEY'
);
const signature = await connection.sendTransaction(transaction);
// Option 2: raw JSON-RPC
async function sendViaJsonRpc(
endpoint: string,
apiKey: string,
transaction: VersionedTransaction
): Promise<string> {
const serialized = transaction.serialize();
const base64Tx = Buffer.from(serialized).toString('base64');
const response = await fetch(`${endpoint}/?api-key=${apiKey}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'sendTransaction',
params: [base64Tx, { encoding: 'base64' }],
}),
});
const result = await response.json();
return result.result;
}Rust
rust
use solana_client::rpc_client::RpcClient;
use solana_sdk::transaction::VersionedTransaction;
fn send_via_jsonrpc(
tx: &VersionedTransaction,
api_key: &str,
) -> Result<String, Box<dyn std::error::Error>> {
let endpoint = format!("http://fra1.blockgo.trade?api-key={}", api_key);
let client = RpcClient::new(endpoint);
let signature = client.send_transaction(tx)?;
Ok(signature.to_string())
}Error handling
Most errors are returned in the JSON-RPC error object. For auth/rate-limit/ban scenarios, you may also see an HTTP status code.
Error codes (sorted by HTTP status)
HTTP 200
-32600Invalid Request (HTTP 200)-32601Method not found (HTTP 200)-32602Invalid params (HTTP 200)-32010Tip too low (HTTP 200)-32013Public key is blocked (HTTP 200)-32099Request too large (HTTP 200)-32099Service unavailable (HTTP 200)
HTTP 400
-32602Invalid transaction (HTTP 400)-32003Duplicate transaction (HTTP 400)
HTTP 401
-32001Missing API key (HTTP 401)-32002Invalid API key (HTTP 401)
HTTP 429
-32005Rate limit exceeded (HTTP 429)-32006Too many in-flight requests (HTTP 429)-32014Public key rate limit exceeded (HTTP 429)
HTTP 503
-32099Maintenance in progress (HTTP 503)-32099Service unavailable (HTTP 503)
Retry guidance
- Retry:
429,503(exponential backoff, cap retries) - Do not retry:
400/401, and clear transaction business errors (e.g. invalid signature, insufficient funds)