Skip to main content

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.

The API still says profile

Project 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" }
]
}'
Auto-populated fields

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.

info

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.

Array fields are replaced, not merged

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:

ParamDefaultDescription
limit20Results per page (1-100)
offset0Pagination offset
sortmarketCapSort order: marketCap or newest
includeFeatured1 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:

ParamDefaultDescription
days30Lookback 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 }]
}
}
}
FieldDescription
activitynull when the profile links no GitHub repository
repo.verifiedThe profile owner's linked GitHub account owns or maintains this repo
statsnull when GitHub was unreachable or rate-limited; the repo link still resolves
stats.commitsCommits in the last 52 weeks (null if GitHub hadn't finished computing them)
stats.pullRequests / stats.releasesOpened / published in the last 12 months (each null if the count was unavailable)
stats.weeklyUp 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" }
}
}
]
}
FieldDescription
sourceproject for the profile's own X account, team for a team member's
roleRole line under the name; the project card falls back to Founder
levelEthos credibility tier for score
reviews.positivePercentnull until the account has at least one review
reviews.itemsNewest first, at most three
vouches.ethETH 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"
}
]
}
info

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");