The Pillar API

Find the ad windows and city billboards for lease on The Pillar and what each costs. JSON, no key, no login. Built for AI agents and the people who build them.

Markdown copy: /developers.md. OpenAPI: /openapi.json.

Basics

Base URL: https://thepillar.io/api/v1. Every response is JSON. No key or login is needed.

A window is a licensed ad pane on the tower, not property: a brand's logo and link on the glass, billed monthly through Stripe, cancel any month. Tower windows cost $9 to $392.85 a month by floor and position (corner panes cost 35% more); city billboards cost $4 to $7.

Prices are monthly, in US cents (priceCents) and as text (price). They are exactly what Stripe charges.

Errors look like {"error":{"code":"bad_request","message":"floor must be from 1 to 80"}}. Each IP address can make 120 requests a minute; past that you get a 429 with a Retry-After header.

MCP server

https://thepillar.io/mcp is an MCP server (Streamable HTTP, no key or login) with the same steps as tools: find_windows, get_window, get_prices, start_lease and check_lease. Add it to Claude or ChatGPT as a custom connector, or to any MCP client, then ask it to put a brand on The Pillar.

start_lease returns checkoutUrl just like the API: the person pays on Stripe, then the agent follows the lease with check_lease until it's live. The same limits apply: 120 requests a minute and 10 lease starts an hour per IP address.

List free windows and billboards

GET /api/v1/windows returns the free slots, cheapest floors first (by floor, then south, east, north, west, then column), then the billboards.

Filters: kind (window or billboard), floor, floorMin, floorMax (1 to 80), face (south, east, north, west), spot (corner or middle), maxPrice (US dollars). Any floor, face or spot filter returns tower windows only.

Pages: limit (1 to 100, default 50). When next isn't null, pass it as cursor for the next page.

Example: curl "https://thepillar.io/api/v1/windows?floor=47&spot=corner&limit=2"

{
  "items": [
    {
      "id": "F47-S1",
      "kind": "window",
      "floor": 47,
      "face": "south",
      "column": 1,
      "spot": "corner",
      "priceCents": 9180,
      "price": "$91.80",
      "currency": "USD",
      "billing": "monthly",
      "pageUrl": "https://thepillar.io/w/F47-S1",
      "leaseUrl": "https://thepillar.io/w/F47-S1/lease",
      "image": "https://thepillar.io/w/F47-S1/opengraph-image"
    },
    {
      "id": "F47-E1",
      "kind": "window",
      "floor": 47,
      "face": "east",
      "column": 1,
      "spot": "corner",
      "priceCents": 9180,
      "price": "$91.80",
      "currency": "USD",
      "billing": "monthly",
      "pageUrl": "https://thepillar.io/w/F47-E1",
      "leaseUrl": "https://thepillar.io/w/F47-E1/lease",
      "image": "https://thepillar.io/w/F47-E1/opengraph-image"
    }
  ],
  "next": "4711"
}

One window or billboard

GET /api/v1/windows/{id} returns { item, available, reason }. Window ids look like F47-S1 (floor 47, south face, column 1); billboard ids like B-1234.

When available is false, reason says why: taken (lit by a brand), reserved (paid, in review), paused, prize (a game prize, only its winner can lease it) or crown (the King of the Tower window, never sold).

Prices

GET /api/v1/prices returns every floor's monthly price for a middle and a corner pane, and the billboard range.

Start a lease

POST /api/v1/leases with JSON: windowId and brandUrl (required), and optionally brandName (40), pitch (140), pricingText (80), logoUrl, banner (billboards: { "fit": "cover" } fills the board), and email (prefills Stripe).

The ad is checked before anything is charged. The answer is 201 with leaseId, checkoutUrl, expiresAt (60 minutes), priceCents, review and message. Give checkoutUrl to the person: they pay the monthly price on Stripe. Nobody needs an account; the window belongs to the email they pay with.

When review is true, a person approves the ad after payment (usually within a day) and it stays dark until then; if it isn't approved, the payment is refunded in full.

Errors: 409 when the slot isn't free (taken, reserved, paused, prize, crown), 422 content_refused with a category and the reason (nothing is charged), 400 for bad input, 429 after 10 lease starts an hour from one IP.

Example: curl -X POST https://thepillar.io/api/v1/leases -H "Content-Type: application/json" -d '{"windowId":"F47-S3","brandUrl":"https://example.com"}'

{
  "leaseId": "lc_3f9c2a7b1e5d4c8a9b0e1f2a",
  "checkoutUrl": "https://checkout.stripe.com/c/pay/cs_live_...",
  "expiresAt": "2026-10-08T18:00:00.000Z",
  "priceCents": 6800,
  "status": "awaiting_payment",
  "review": false,
  "message": "Open checkoutUrl to pay $68 a month on Stripe. The window lights up as soon as the payment goes through."
}

Check a lease

GET /api/v1/leases/{leaseId} returns status: awaiting_payment, in_review (paid, a person checks it first), live, refused (nothing charged), rejected_refunded, refunded (the slot was taken while paying), expired (the link ran out unpaid) or ended, with a plain message.

What can go on The Pillar

Never allowed (refused before payment): illegal drugs; weapons, ammunition and explosives; fake or stolen goods; scams, phishing and malware; sexual content; hate and violent extremism; anything sexual involving minors; pretending to be a brand or person you're not. Allowed only after a person reviews it (paid, then held until approved): gambling; crypto and investment offers; cannabis and CBD; alcohol; tobacco and vapes; medicines and health claims; dating; political ads. Everything else (ordinary companies, products, apps, shops, creators and causes) is allowed.

Live windows are re-checked every day, and anyone can report one from its page.

Without code

Each item's leaseUrl is a plain lease form (/w/{id}/lease) that works without JavaScript, so a browser agent or a person can fill it in and go straight to Stripe.

Machine-readable files

OpenAPI 3.1: https://thepillar.io/openapi.json. API catalog (RFC 9727): https://thepillar.io/.well-known/api-catalog.

MCP server: https://thepillar.io/mcp.

The catalog as a page: https://thepillar.io/lease, and as markdown: https://thepillar.io/lease.md. Both take the same filters as the API.

Shopping feeds: https://thepillar.io/feeds/google.xml (Google Merchant Center) and https://thepillar.io/feeds/openai.jsonl (OpenAI product feed).

Site guides for AI: https://thepillar.io/llms.txt and https://thepillar.io/llms-full.txt.

Contact

Questions or a bug: [email protected].