From bankr-agent-dev
Documents Bankr Agent API endpoints, async submit-poll-complete job pattern, TypeScript examples, and response schemas for crypto trading and market analysis.
npx claudepluginhub bankrbot/claude-plugins --plugin bankr-agent-devThis skill uses the workspace's default tool permissions.
When answering questions about the Bankr API:
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Checks Next.js compilation errors using a running Turbopack dev server after code edits. Fixes actionable issues before reporting complete. Replaces `next build`.
When answering questions about the Bankr API:
references/job-response-schema.mdexamples/ directoryThe Bankr Agent API enables programmatic access to crypto trading, market analysis, and prediction markets through a simple asynchronous job pattern.
All Bankr operations follow a submit-poll-complete pattern:
This pattern handles operations that may take 30 seconds to 2+ minutes (trades, complex analysis).
https://api.bankr.bot
All requests require the x-api-key header:
x-api-key: bk_your_api_key_here
The API key is tied to a specific user's Bankr account and wallet.
POST /agent/prompt
Content-Type: application/json
{
"prompt": "Buy $50 of ETH on Base"
}
Response:
{
"success": true,
"jobId": "job_abc123",
"status": "pending"
}
Code example:
async function submitPrompt(prompt: string): Promise<{ jobId: string }> {
const response = await fetch(`${API_URL}/agent/prompt`, {
method: "POST",
headers: {
"x-api-key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ prompt }),
});
const data = await response.json();
if (!data.success) throw new Error(data.error || "Failed to submit");
return { jobId: data.jobId };
}
GET /agent/job/{jobId}
Response:
{
"success": true,
"jobId": "job_abc123",
"status": "completed",
"prompt": "What is the price of ETH?",
"response": "Ethereum (ETH) is currently trading at $3,245.67...",
"transactions": [],
"statusUpdates": [
{ "message": "Fetching price data...", "timestamp": "2024-01-15T10:00:02Z" }
],
"createdAt": "2024-01-15T10:00:00Z",
"completedAt": "2024-01-15T10:00:05Z",
"processingTime": 5000
}
Code example:
async function getJobStatus(jobId: string): Promise<JobStatusResponse> {
const response = await fetch(`${API_URL}/agent/job/${jobId}`, {
headers: { "x-api-key": API_KEY },
});
return response.json();
}
For complete TypeScript interfaces, see references/job-response-schema.md.
POST /agent/job/{jobId}/cancel
Content-Type: application/json
Response:
{
"success": true,
"jobId": "job_abc123",
"status": "cancelled",
"prompt": "Buy $50 of ETH on Base",
"cancelledAt": "2024-01-15T10:00:15Z"
}
When to cancel:
Code example:
async function cancelJob(jobId: string): Promise<JobStatusResponse> {
const response = await fetch(`${API_URL}/agent/job/${jobId}/cancel`, {
method: "POST",
headers: {
"x-api-key": API_KEY,
"Content-Type": "application/json",
},
});
return response.json();
}
// Usage: Cancel if job takes too long
const timeout = setTimeout(async () => {
console.log("Job taking too long, cancelling...");
await cancelJob(jobId);
}, 60000); // Cancel after 60 seconds
| Status | Meaning | Action |
|---|---|---|
pending | Job queued, not started | Keep polling |
processing | Job running | Keep polling, check statusUpdates |
completed | Job finished successfully | Read response and transactions |
failed | Job encountered error | Check error field |
cancelled | Job was cancelled | No further action |
The Bankr API accepts natural language prompts for:
Crypto Trading:
Price & Market Data:
Polymarket Predictions:
DeFi Operations:
async function waitForCompletion(jobId: string): Promise<JobStatus> {
const POLL_INTERVAL = 2000; // 2 seconds
const MAX_POLLS = 120; // 4 minutes max
for (let i = 0; i < MAX_POLLS; i++) {
const status = await getJobStatus(jobId);
// Terminal states
if (['completed', 'failed', 'cancelled'].includes(status.status)) {
return status;
}
// Log progress updates
if (status.statusUpdates?.length) {
console.log('Progress:', status.statusUpdates.at(-1)?.message);
}
await new Promise(r => setTimeout(r, POLL_INTERVAL));
}
throw new Error('Job timed out');
}
When a job completes, the response includes:
response: The text answer from Bankrtransactions: Array of executed transactions with chain/token detailsrichData: Images or charts (base64 or URL)statusUpdates: Progress messages during executionprocessingTime: Duration in millisecondsFor complete field documentation, see references/job-response-schema.md.
Handle these error cases:
BANKR_API_KEY before making requestsstatus === 'failed' and read error field// 1. Submit prompt
const { jobId } = await submitPrompt("What is the price of ETH?");
// 2. Poll until complete
const result = await waitForCompletion(jobId);
// 3. Handle result
if (result.status === 'completed') {
console.log(result.response);
// "Ethereum (ETH) is currently trading at $3,245.67..."
} else if (result.status === 'failed') {
console.error('Error:', result.error);
}
references/job-response-schema.md - Complete TypeScript interfaces and field documentationexamples/basic-client.ts - Simple API client implementationexamples/polling-with-updates.ts - Polling with status update handling