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/list and tools/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

ToolArgumentsReturns
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" }
limits

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.