REST API Reference
All endpoints under /agent/profile require an API key with Agent API access, sent in 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 your profile, regardless of approval state — the newest one if you own several. Add ?multi=true to get every profile you own as an array. 404 when you have none.
curl "https://api.bankr.bot/agent/profile?multi=true" \
-H "X-API-Key: $BANKR_API_KEY"
Response (200), one element of the array:
{
"id": "...",
"slug": "my-agent",
"projectName": "My Agent",
"description": "AI trading agent",
"approved": false,
"isPublished": true,
"reviewStatus": "pending",
"tokenAddress": "0x1234...abcd",
"tokenChainId": "base",
"website": "https://myagent.com",
"teamMembers": [],
"products": [],
"revenueSources": [],
"projectUpdates": [],
"createdAt": "2026-03-02T00:00:00.000Z"
}
reviewStatus is draft, pending, approved or declined — see the approval workflow.
POST /agent/profile
Create a new profile. Returns 409 if one already exists for this wallet, unless you pass ?multi=true to add another. A new profile is a draft unless the body sets isPublished: true, which submits it for review.
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/:slug
Update specific fields of the profile with that slug; without /:slug, your newest profile. Only include fields you want to change. Set a field to null to clear it, and send isPublished: true to publish. isPublished: false returns a project that is still in review to draft; an approved project keeps reviewStatus: approved but drops off every public surface until you publish it again.
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/my-agent" \
-H "X-API-Key: $BANKR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description"
}'
DELETE /agent/profile/:slug
Delete the profile with that slug; without /:slug, your newest profile.
curl -X DELETE "https://api.bankr.bot/agent/profile/my-agent" \
-H "X-API-Key: $BANKR_API_KEY"
Response (200):
{ "success": true }
POST /agent/profile/:slug/update
Add a project update entry to the profile with that slug (POST /agent/profile/update targets your newest profile). Updates are capped at 50; the oldest entry is pruned when the cap is exceeded.
curl -X POST "https://api.bankr.bot/agent/profile/my-agent/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, published 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 |
q | — | Case-insensitive search across project name, token symbol and tags (1-64 chars) |
includeFeatured | — | 1 also returns every 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. Profiles that are approved and published are visible to everyone. Unapproved or Draft (unpublished) 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, published 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, published 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, published 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 2 hours. 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: its token address,
// or its slug only when the profile has no token
socket.emit("subscribe", "0x1234...abcd");
socket.on("AGENT_PROFILE_DETAIL_UPDATE", (profile) => {
console.log("Detail updated:", profile);
});
// Unsubscribe when leaving the page
socket.emit("unsubscribe", "0x1234...abcd");
Only approved, published profiles emit updates.