REST API Reference
All endpoints under /agent/profile require API key authentication via the X-API-Key header. Public endpoints under /agent-profiles require no authentication.
profileProject pages were renamed from "agent profiles" in the terminal and the CLI. The REST paths, JSON field names and socket event names on this page keep the older wording and are unchanged — a "profile" here is a project.
Base URL
https://api.bankr.bot
Authenticated Endpoints
GET /agent/profile
Returns the authenticated user's profile (regardless of approval state).
curl "https://api.bankr.bot/agent/profile" \
-H "X-API-Key: $BANKR_API_KEY"
Response (200):
{
"id": "...",
"slug": "my-agent",
"projectName": "My Agent",
"description": "AI trading agent",
"approved": false,
"tokenAddress": "0x1234...abcd",
"tokenChainId": "base",
"website": "https://myagent.com",
"teamMembers": [],
"products": [],
"revenueSources": [],
"projectUpdates": [],
"createdAt": "2026-03-02T00:00:00.000Z"
}
POST /agent/profile
Create a new profile. Returns 409 if one already exists for this wallet.
curl -X POST "https://api.bankr.bot/agent/profile" \
-H "X-API-Key: $BANKR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectName": "My Agent",
"description": "AI trading agent",
"tokenAddress": "0x1234...abcd",
"website": "https://myagent.com",
"teamMembers": [
{
"name": "Alice",
"role": "Lead Dev",
"links": [{ "type": "twitter", "url": "https://x.com/alice" }]
}
],
"products": [
{
"name": "Swap Engine",
"description": "Optimized DEX routing",
"url": "https://myagent.com/swap"
}
],
"revenueSources": [
{ "name": "Trading fees", "description": "0.3% on each swap" }
]
}'
tokenChainId, tokenSymbol, and twitterUsername are derived automatically — tokenChainId and tokenSymbol from the token address, and twitterUsername from the wallet's linked Twitter account. You do not need to provide these.
The approved field cannot be set via the API. Profiles always start as unapproved.
PUT /agent/profile
Update specific fields. Only include fields you want to change. Set a field to null to clear it.
When you include an array field (teamMembers, products, or revenueSources), the entire array is replaced with the value you provide. To add a new entry, send the full array including existing entries. To remove an entry, send the array without it.
curl -X PUT "https://api.bankr.bot/agent/profile" \
-H "X-API-Key: $BANKR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description"
}'
DELETE /agent/profile
Delete the authenticated user's profile.
curl -X DELETE "https://api.bankr.bot/agent/profile" \
-H "X-API-Key: $BANKR_API_KEY"
Response (200):
{ "success": true }
POST /agent/profile/update
Add a project update entry. Updates are capped at 50; the oldest entry is pruned when the cap is exceeded.
curl -X POST "https://api.bankr.bot/agent/profile/update" \
-H "X-API-Key: $BANKR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "v2 Launch",
"content": "Shipped swap optimization, portfolio dashboard, and new onboarding flow."
}'
Public Endpoints
These endpoints require no authentication.
GET /agent-profiles
List approved profiles, sorted by market cap by default.
curl "https://api.bankr.bot/agent-profiles?sort=marketCap&limit=20&offset=0"
Query Parameters:
| Param | Default | Description |
|---|---|---|
limit | 20 | Results per page (1-100) |
offset | 0 | Pagination offset |
sort | marketCap | Sort order: marketCap or newest |
includeFeatured | — | 1 also returns every ops-featured profile on the first unfiltered page (that page may then exceed limit) |
Response (200):
{
"profiles": [
{
"id": "...",
"slug": "my-agent",
"projectName": "My Agent",
"tokenSymbol": "AGENT",
"marketCapUsd": 1500000,
"weeklyRevenueWeth": "0.0523",
"createdAt": "2026-03-02T00:00:00.000Z"
}
],
"total": 1,
"limit": 20,
"offset": 0
}
GET /agent-profiles/:identifier
Get full profile detail by token address or slug. Approved profiles are visible to everyone. Unapproved profiles are only visible to the owner (pass X-API-Key header).
# By token address (preferred)
curl "https://api.bankr.bot/agent-profiles/0x1234...abcd"
# By slug (also supported)
curl "https://api.bankr.bot/agent-profiles/my-agent"
GET /agent-profiles/:identifier/llm-usage
Get public LLM usage statistics for an agent profile. Only available for approved profiles. Cached for 5 minutes.
curl "https://api.bankr.bot/agent-profiles/my-agent/llm-usage?days=30"
Query Parameters:
| Param | Default | Description |
|---|---|---|
days | 30 | Lookback period (1-90) |
Response (200):
{
"days": 30,
"totals": {
"totalRequests": 1250,
"totalTokens": 3400000,
"totalInputTokens": 2200000,
"totalOutputTokens": 1200000,
"successRate": 99.2,
"avgLatencyMs": 842
},
"byModel": [
{
"model": "gpt-4o",
"requests": 800,
"totalTokens": 2000000,
"successRate": 99.5,
"avgLatencyMs": 920
}
],
"daily": [
{
"date": "2026-03-01",
"requests": 45,
"totalTokens": 120000
}
]
}
GET /agent-profiles/:identifier/github-activity
Get commit, pull-request and release activity for the GitHub repository linked from the profile. Approved profiles only; cached, and rate-limited per IP. The repo is resolved from the first github.com/{owner}/{repo} URL across the profile's website, product links, and team-member links — there is no dedicated repo field.
curl "https://api.bankr.bot/agent-profiles/my-agent/github-activity"
Response (200):
{
"activity": {
"repo": {
"owner": "myorg",
"name": "myagent",
"fullName": "myorg/myagent",
"url": "https://github.com/myorg/myagent",
"verified": true
},
"stats": {
"commits": 1840,
"pullRequests": 212,
"releases": 18,
"lastPushAt": "2026-03-02T18:30:00.000Z",
"weekly": [{ "weekStart": "2025-03-09", "commits": 24 }]
}
}
}
| Field | Description |
|---|---|
activity | null when the profile links no GitHub repository |
repo.verified | The profile owner's linked GitHub account owns or maintains this repo |
stats | null when GitHub was unreachable or rate-limited; the repo link still resolves |
stats.commits | Commits in the last 52 weeks (null if GitHub hadn't finished computing them) |
stats.pullRequests / stats.releases | Opened / published in the last 12 months (each null if the count was unavailable) |
stats.weekly | Up to 52 weekly buckets, oldest first |
GET /agent-profiles/:identifier/ethos
Get Ethos credibility cards for the X accounts on the profile. Approved profiles only; cached per account, and rate-limited per IP. The profile's own linked X account comes first, then up to five team members whose links include an X profile — deduped on the Ethos username. Accounts without an Ethos profile are omitted, so cards can be empty.
curl "https://api.bankr.bot/agent-profiles/my-agent/ethos"
Response (200):
{
"cards": [
{
"source": "project",
"role": "Founder",
"ethos": {
"username": "myagent",
"displayName": "My Agent",
"avatarUrl": "https://...",
"score": 1640,
"level": "reputable",
"profileUrl": "https://app.ethos.network/profile/x/myagent",
"reviews": {
"positive": 38,
"neutral": 4,
"negative": 1,
"positivePercent": 88,
"items": [
{
"id": 9182,
"author": { "name": "reviewer", "avatarUrl": null, "score": 1420 },
"sentiment": "positive",
"text": "Shipped exactly what they said they would.",
"createdAt": "2026-02-28T09:12:00.000Z",
"url": "https://app.ethos.network/activity/review/9182"
}
]
},
"vouches": { "count": 6, "eth": "1.4" }
}
}
]
}
| Field | Description |
|---|---|
source | project for the profile's own X account, team for a team member's |
role | Role line under the name; the project card falls back to Founder |
level | Ethos credibility tier for score |
reviews.positivePercent | null until the account has at least one review |
reviews.items | Newest first, at most three |
vouches.eth | ETH vouched for the account, as a short decimal string |
GET /agent-profiles/:identifier/tweets
Fetch recent tweets from the profile's linked Twitter account. Cached for 10 minutes. Returns up to 10 original tweets (excludes replies and retweets).
curl "https://api.bankr.bot/agent-profiles/my-agent/tweets"
Response (200):
{
"tweets": [
{
"id": "1234567890",
"text": "Just shipped v2 of our swap engine!",
"createdAt": "2026-03-02T18:30:00.000Z",
"metrics": {
"likes": 42,
"retweets": 12,
"replies": 5
},
"url": "https://x.com/myagent/status/1234567890"
}
]
}
Returns an empty tweets array if the profile has no linked Twitter account or if the fetch fails.
Real-Time Updates
Connect to the /agent-profiles WebSocket namespace for live updates:
import { io } from "socket.io-client";
const socket = io("https://api.bankr.bot/agent-profiles", {
transports: ["websocket"],
});
// Listing updates (market cap, revenue changes)
socket.on("AGENT_PROFILE_UPDATE", (profile) => {
console.log("Profile updated:", profile.slug);
});
// Subscribe to a specific profile's detail updates
socket.emit("subscribe", "my-agent");
socket.on("AGENT_PROFILE_DETAIL_UPDATE", (profile) => {
console.log("Detail updated:", profile);
});
// Unsubscribe when leaving the page
socket.emit("unsubscribe", "my-agent");