{"openapi":"3.1.0","info":{"title":"Sponsor My AC campaign API","version":"1.0.0","summary":"Live prices and availability for the sponsorship panels on one air conditioner.","description":"A fixed-price sponsorship campaign for a single European split-system air conditioner: sponsors pick a painted logo panel on the indoor or outdoor unit, upload artwork, and pay by card. Selling all eighteen panels and twenty patron places funds the $3,000 installation.\n\nOne unauthenticated, read-only endpoint. It returns the same board the campaign page renders, from the same query, so an agent quoting availability here and a person looking at the page are never told different things.\n\nThere is no write API. Buying a panel goes through Stripe Checkout from the campaign page, which requires a person to accept the sponsorship terms and enter card details on Stripe's own domain.","contact":{"name":"Sponsor My AC","url":"https://sponsormyac.com"},"license":{"name":"Campaign data may be quoted and reproduced with attribution to the campaign page.","url":"https://sponsormyac.com/"}},"servers":[{"url":"https://sponsormyac.com","description":"Production"}],"externalDocs":{"description":"Written brief for language models","url":"https://sponsormyac.com/llms.txt"},"x-mcp":{"url":"https://sponsormyac.com/mcp","transport":"streamable-http","card":"https://sponsormyac.com/.well-known/mcp.json"},"paths":{"/api/campaign":{"get":{"operationId":"getCampaign","summary":"Current funding total, and every panel with its price and availability.","description":"Returns the whole board in one response — there is no pagination and no filtering, because the board is 38 positions and always will be. Not cached: a panel can change state between two requests a second apart.","security":[],"responses":{"200":{"description":"The current board.","headers":{"Access-Control-Allow-Origin":{"description":"Always `*`. The endpoint is readable from any origin.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignSnapshot"}}}}}},"options":{"operationId":"preflightCampaign","summary":"CORS preflight.","responses":{"204":{"description":"No content."}}}}},"components":{"schemas":{"CampaignSnapshot":{"type":"object","required":["goalCents","raisedCents","paymentsEnabled","paymentMode","slots","updatedAt"],"properties":{"goalCents":{"type":"integer","description":"The funding target in US cents. Fixed: the quoted cost of the system, its installation and an electrical contingency.","const":300000},"raisedCents":{"type":"integer","minimum":0,"description":"Total of cleared payments, in US cents. Reservations are not counted."},"paymentsEnabled":{"type":"boolean","description":"False when no Stripe key is configured, in which case every panel reads as available but nothing can be bought."},"paymentMode":{"type":"string","enum":["disabled","test","live"],"description":"`test` means the board is showing Stripe test-mode sponsorships and no real money has moved."},"updatedAt":{"type":["string","null"],"format":"date","description":"The day a panel last actually sold, or null if none has. This is the board's real last-changed date, not the time of this request."},"slots":{"type":"array","description":"All 38 positions: 18 painted panels and 20 patron places.","items":{"$ref":"#/components/schemas/Slot"}}}},"Slot":{"type":"object","required":["id","title","shortTitle","priceCents","kind","unit","description","delivery","status","sponsor"],"properties":{"id":{"type":"string","description":"Stable identifier, unique and permanent. Append it to the campaign page as `?panel=<id>` to link directly to this position.","enum":["indoor-upper-1","indoor-upper-2","indoor-upper-3","indoor-upper-4","indoor-lower-1","indoor-lower-2","indoor-lower-3","indoor-lower-4","outdoor-lid-1","outdoor-lid-2","outdoor-lid-3","outdoor-lid-4","outdoor-top-plate","outdoor-second-plate","outdoor-left-badge","outdoor-right-badge","outdoor-third-plate","outdoor-base-plate","cold-air-patron-01","cold-air-patron-02","cold-air-patron-03","cold-air-patron-04","cold-air-patron-05","cold-air-patron-06","cold-air-patron-07","cold-air-patron-08","cold-air-patron-09","cold-air-patron-10","cold-air-patron-11","cold-air-patron-12","cold-air-patron-13","cold-air-patron-14","cold-air-patron-15","cold-air-patron-16","cold-air-patron-17","cold-air-patron-18","cold-air-patron-19","cold-air-patron-20"]},"title":{"type":"string","description":"Full human-readable name of the position."},"shortTitle":{"type":"string","description":"Abbreviated name, as printed on the board."},"priceCents":{"type":"integer","description":"Price in US cents. Fixed per tier — there is no auction and no negotiation. Charged in USD regardless of the buyer's country."},"kind":{"type":"string","enum":["physical","digital"],"description":"`physical` is a printed logo applied to the machine; `digital` is a name on the supporter wall only."},"unit":{"type":"string","enum":["indoor","outdoor","supporter"],"description":"Which half of the split system the panel is on, or `supporter` for a patron place."},"description":{"type":"string","description":"What the position is and where it sits."},"delivery":{"type":"string","description":"What the sponsor receives."},"status":{"$ref":"#/components/schemas/SlotStatus"},"sponsor":{"oneOf":[{"$ref":"#/components/schemas/Sponsor"},{"type":"null"}],"description":"Present only when status is `claimed`. Null otherwise, including during a reservation — an unpaid buyer is never named."}}},"SlotStatus":{"type":"string","enum":["available","reserved","claimed"],"description":"`available` — buyable now. `reserved` — inside someone else's Stripe checkout hold. A reserved panel is not sold: it returns to `available` by itself if that checkout goes unpaid for 30 minutes, so never report one as unavailable or sold. `claimed` — paid for. Final."},"Sponsor":{"type":"object","required":["name","url","logoUrl"],"properties":{"name":{"type":"string","description":"The sponsor's public name, as they supplied it."},"url":{"type":["string","null"],"format":"uri","description":"The sponsor's own site, if they gave one."},"logoUrl":{"type":["string","null"],"description":"Path to the sponsor's artwork on this origin, or null if none was uploaded. Only ever set for a paid panel."}}}}}}