Agents
One endpoint, one key, seven tools. An agent can read every calendar, hold a day and check what it is holding without a browser.
The endpoint
- url
POST https://bidmeme.com/api/mcp- protocol
- JSON-RPC 2.0, the Model Context Protocol shape:
tools/listandtools/call. - auth
Authorization: Bearer bme_live_…- keys
- Minted at /advertise/keys, shown once, revocable. A key acts as the advertiser that made it and spends that balance.
- money
- Integer cents. A day is held at the bid amount and charged at settlement for delivered hours only.
Tools
| Tool | Arguments | Returns |
|---|---|---|
| list_calendars | {} | every active calendar: slug, name, floor_cents_per_hour, composition |
| get_days | { calendar: string, from?: "YYYY-MM-DD", days?: number } | up to 28 days: day, asking_cents, minimum_bid_cents, status, expected_hours, holder, closes_at |
| place_bid | { calendar: string, day: "YYYY-MM-DD", creative_id: string, amount_cents: number } | the bid: id, status, amount_cents, expected_hours_at_bid; the amount is held |
| withdraw_bid | { bid_id: string } | the released bid; refused inside the last 24 hours before close |
| my_days | { status?: "holding" | "outbid" | "won" | "withdrawn" | "refunded" } | your bids with their day rows |
| my_balance | {} | balance_cents, held_cents, available_cents |
| list_creatives | {} | your creatives with review status; only an approved one can be placed |
An open day is taken at asking_cents. A held day is taken at minimum_bid_cents, one step over the holder. A bid under the minimum is refused, never rounded up.
Setup
For a client that reads a servers file. Any client that can POST JSON with a header works the same way.
mcp servers config
{
"mcpServers": {
"bidmeme": {
"url": "https://bidmeme.com/api/mcp",
"headers": { "Authorization": "Bearer bme_live_your_key" }
}
}
}A worked example
Buying the cheapest open day in the iOS calendar under a budget, as three calls.
get_days, my_balance, place_bid
// Goal: hold the cheapest open day in the iOS calendar for at most $600.
// 1. Read the next 28 days.
→ { "jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "get_days", "arguments": { "calendar": "ios" } } }
← { "days": [
{ "day": "2026-09-09", "status": "open", "asking_cents": 53747, "minimum_bid_cents": 53747, "expected_hours": 203.9 },
{ "day": "2026-09-10", "status": "open", "asking_cents": 51244, "minimum_bid_cents": 51244, "expected_hours": 203.9 },
{ "day": "2026-09-12", "status": "held", "asking_cents": 44178, "minimum_bid_cents": 47713, "expected_hours": 203.9 },
... ] }
// 2. Pick the open day with the lowest minimum bid under the budget: 2026-09-10 at $512.44.
// 3. Check the balance covers the hold.
→ { "jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": { "name": "my_balance", "arguments": {} } }
← { "balance_cents": 250000, "held_cents": 47713, "available_cents": 202287 }
// 4. Place the bid at the minimum. The amount is held; settlement charges only delivered hours.
→ { "jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": { "name": "place_bid", "arguments": {
"calendar": "ios", "day": "2026-09-10", "creative_id": "c-1", "amount_cents": 51244 } } }
← { "id": "b-12", "status": "holding", "amount_cents": 51244, "expected_hours_at_bid": 203.9,
"closes_at": "2026-09-09T00:00:00Z" }Keys are rate limited per advertiser. A day cannot be withdrawn inside the last 24 hours before close, by an agent or a person. The creative an agent places must already be approved; a pending one is refused with the reason.