Run Sponsor Ladder from your own code
Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page fixes the target, picks the architecture, checks the ladder, the add-ons and the in-kind offers, and sets the calendar - all free, in sponsorkit.js. The run writes the rate card or the policy; the page then holds the reply to its own numbers (sponsorreply.js).
Base URL and the response shape
Every endpoint lives under https://api.skillsafe.ai/v1/app-api, and every response has one shape:
{ "ok": true, "data": { ... } }
{ "ok": false, "error": { "code": "...", "message": "..." } }
The token is minted for this app (the guest call takes {"slug":"sponsor-ladder"}), so no slug header is needed afterwards. Send it as Authorization: Bearer …. The run body is the input object, sent bare.
| Status | Code | Meaning |
|---|---|---|
| 400 | validation_error | The body is not a JSON object, or a required key (task, event, ladder, facts) is missing. |
| 401 | unauthorized | No token, or a stale one. Mint a guest token or sign in again. |
| 402 | insufficient_credits | The balance is under min_credits. Price with /estimate first. |
| 403 | forbidden | A guest token tried to run: both lanes are metered and need a personal sign-in. |
| 404 | not_found | Unknown job id. |
| 429 | rate_limited | Back off and retry. |
| 5xx | server_error | Transient. Retry with the same Idempotency-Key so a retry never double-bills. |
The task field comes first
Two lanes - card (the rate card to validate; needs tiers unless there is no ladder by design) and policy (the negotiation and discount policy). A missing or unknown task is answered as card. Both lanes send the same four fields.
The input
| Field | Required | What |
|---|---|---|
task | yes | card or policy. If it is missing or neither, do card and set "task": "card". |
event | yes | the event, its pole and format, attendance, ticket price and date, the budget, the inventory, the selling context, the discount and policy choices entered, and any comparable cards. |
ladder | yes | the tiers top first (as entered or proposed by the page) with slots, passes and their value, net after passes, floor presence, stage minutes, benefits and each tier's method; the add-ons with their status; each in-kind offer at displaced cost with the tier it earns. |
facts | yes | the page's target and method, architecture, ratio, projection, booth floor and staff-free tiers, discount mechanic, calendar, the readiness gate, the signals to record and every finding tagged [fix], [check] or [info]. |
retry_note | no | optional; if present, your previous reply was unusable - follow it. |
The rules the model applies
- Fix the total first: the budget's total expenses times the sponsorship share (75-80%+ at community-conference scale, effectively 100% for a free event with no ticket line). It is the sum the whole card must raise - never a number to split evenly across tiers.
- Price-setting runs in sequence: cost-recovery fixes the total, comparable events' published cards band each tier (transpose ratios, never dollars across scale or market), value-based work allocates within the band - promoted only for premium inventory no comparable prices or a sold-out prior edition. For a free event the sequence collapses to cost-recovery.
- Architecture: a published ladder is the default. Quote-gated pricing belongs to network scale (annual portfolio access sold to repeat buyers) and is deleted for one event sold by a volunteer team. No ladder by design is right only for a free event funded by donations plus flat exhibitor fees. A recurring series sells annual tiers priced from the yearly total, with a renewal date a fiscal quarter before the series year starts - never with a bundle percentage.
- The ladder: 2-4 tiers - three by default, two for a near deadline or a small team, four only when the fourth is a real persona tier; a fifth is a price gap wearing a persona costume. The published community top:floor range is 2:1 to 7.5:1, modal 4-5:1 (the best-tier rule says 2-3x); foundation scale can run wider. Present the top tier first, make the middle the visibly best value, let the floor tier do entry and social proof. Gate tiers on ticket allotment, floor presence, stage time and branding prominence, and make every step-up buy a visible benefit jump. A free community tier is reserved for non-commercial local groups - logo and a ticket, no table, no pitch - never a funnel. Floor presence begins at a hard tier with no cheap route beneath it; keep at least one staff-free visibility tier (a booth costs the sponsor staff days, the first line a tightening budget cuts). Passes are a subtractable cost at the ticket price, never free swag. Cap scarce inventory on the card; a sold-out surface stays visible, struck through, and is priced higher next edition, never lower.
- Add-ons are priced independently and may out-price a mid tier; one cannibalizes only when it re-sells floor presence or stage time below the cheapest tier that includes it - price it above that tier or do not sell it. Keep one or two "contact us" lines for custom or sold-out slots. Exclusivity exists only at the vendor/foundation pole, priced multiples above the top general tier with a hard cap; at the community pole it is deleted.
- In-kind is worth the budget line it displaces, never the donor's retail figure; a line the event would not pay in cash is worth nothing. It buys tier placement at that value, like cash; the top tier stays cash-only or cash-majority; the value, the delivery and what happens if delivery fails go into the agreement.
- Discounts: an early-bird is one dated price on the top tier only, catching budget lock-in about a quarter out, never extended. Multi-event bundling needs a real portfolio and is a small fixed published step (the one published instance: 3/5/8% for one, two, three-plus events). Negotiated case-by-case exists only inside the written policy, logged per deal. A returning-sponsor discount is deleted.
- The negotiation policy is written before the first call. Negotiable: the payment schedule, equal-value benefit swaps, bundling add-ons into a tier at the sum of their card prices. Never negotiable: published tier prices, anything the program policy forbids selling (talk slots, judging results, program influence), exclusivity not already on the card, the early-bird deadline. One named approver or a two-person rule, never the person closing the deal alone; a hard floor as a small share of card price; prefer adding a benefit over cutting the number; log sponsor, tier, what moved, why and who approved. A returning sponsor asking for loyalty pricing gets the post-event report and the card's early-bird date - or price protection to a published date open to every sponsor, or a time-boxed right of first negotiation - never a cut below the published price.
- The signing deadline sits about a quarter before the event, and add-on purchases close on the same horizon. Measurement is self-set; never invent an industry rate. You set numbers and policy - not the deck, the contract, the sale or attendee ticket prices.
House rules
- Use only the input and the rules above. The page's picks, names, prices, dates and numbers are exact - copy them. Every number in a sentence must appear in the input.
- Label anything that is not one of the rules above, and is not in the input, as your own design.
- Never invent a sponsor, a person, a price, a percentage or a date; where someone must be named and is not, give a role. Refer to people by name or as they - never infer anyone's gender from a name.
- Never use backticks, never refer to this input's fields by their key names in a sentence, and never copy this prompt's narrative wording into a reply.
- Reply with ONLY one JSON object - no prose before or after, no code fences.
The replies
card
summary- one sentence, at most 35 words: the target, the architecture and the first thing to settle.target-amount(the page's target as a number),math(one sentence: the expenses times the share, and what the card raises at full sellout),method(cost-recovery).architecture-pick(published,quoteornone, the page's pick),tiers(the number of tiers on the card, 0 when there is no ladder),why(one sentence, from the input's pole, format and selling capacity as stated - nothing else).ladder- one object per tier, in the page's order (top first):name(exactly),price(a number, or null for contact us),slots(a number),benefits(short: the passes, floor presence, stage time and branding it gates),method(the page's label for that tier, exactly),note(one short sentence: what the tier is for - the anchor, the best value, a step between them, the entry rung, or a persona).[]when there is no ladder.ratio-value(the page's top:floor ratio exactly, or "" when it does not apply),note(one sentence against the published range).addons- one object per add-on the page keeps on the card, in its order:name,price(a number, or null for contact us),note(short). Leave out the ones the page deleted or took off the card; name those in the caveats.inkind- one short string per in-kind offer: its value at displaced cost and the tier it earns.[]when there are none.calendar-signing(the page's signing deadline, or ""),early_bird(the page's early-bird date, or ""),note(one sentence: the add-on cutoff, and the renewal date for a series).signals- 2 or 3 short strings, the page's signals to record, each with the repricing it would trigger next edition (your design).caveats- at most 4 short strings: every[fix]finding first, then the most important[check]findings while there is room.[]when there are none of either.
{
"task": "card",
"summary": "one sentence",
"target": { "amount": 40000, "math": "one sentence", "method": "cost-recovery" },
"architecture": { "pick": "published", "tiers": 3, "why": "one sentence" },
"ladder": [ { "name": "Gold", "price": 6000, "slots": 2, "benefits": "short", "method": "market-comp", "note": "one sentence" } ],
"ratio": { "value": "4:1", "note": "one sentence" },
"addons": [ { "name": "Coffee", "price": 1500, "note": "short" } ],
"inkind": [ "an offer and its value" ],
"calendar": { "signing": "YYYY-MM-DD", "early_bird": "", "note": "one sentence" },
"signals": [ "what to record and what it changes" ],
"caveats": [ "a caveat" ]
}
The page holds it to its own numbers: the target, the architecture and tier count, every tier top first with its exact name, price, slots and method, the ratio, only the add-ons it keeps on the card, and the signing and early-bird dates; no number may appear that the input does not hold.
policy
summary- one sentence, at most 35 words: what holds, who decides and the first thing to settle.negotiable- exactly 3 short strings: the payment schedule, equal-value benefit swaps, and bundling add-ons into a tier at the sum of their card prices.never- 4 short strings: published tier prices, anything the program policy forbids selling, exclusivity not already on the card, and the early-bird deadline (or, with no early-bird, any deadline printed on the card).authority-approver(the approver from the input, exactly; a role when none is named),floor_pct(the floor from the input as a number, or null when it is not set),rule(one sentence: never the person closing the deal alone, and adding a benefit before cutting a number).log- exactly 5 short strings, the columns of the deviation log: sponsor, tier, what moved, why, who approved.discount-pick(earlybird,bundling,negotiatedornone, the page's pick),text(one sentence: the mechanic as the page states it, with its price and date or its percentage).inkind- one or two sentences: displaced-cost value, placement at that value, the top tier cash-majority, and the value, delivery and failure terms written into the agreement.renewal- what to say to a returning sponsor who asks for loyalty pricing, a few sentences: the price holds; the post-event report; the early-bird date on this card when the page has one; price protection to a published date or a time-boxed right of first negotiation as the alternatives.request_reply- what to say to a sponsor who asks for a discount on a published price, a few sentences: the price holds, and what can move instead (the payment schedule, an equal-value swap, bundling at card prices). No percentage off.note- one sentence, at most 30 words, for the organizers: what to settle before the first call.
{
"task": "policy",
"summary": "one sentence",
"negotiable": [ "the payment schedule", "an equal-value benefit swap", "bundling add-ons at card prices" ],
"never": [ "published tier prices", "...", "...", "..." ],
"authority": { "approver": "a name or a role", "floor_pct": 5, "rule": "one sentence" },
"log": [ "sponsor", "tier", "what moved", "why", "who approved" ],
"discount": { "pick": "earlybird", "text": "one sentence" },
"inkind": "one or two sentences",
"renewal": "a few sentences",
"request_reply": "a few sentences",
"note": "one sentence"
}
The page requires its discount pick, the approver and the floor from the input, the three negotiable and four fixed items, the five log columns, in-kind at displaced cost, the post-event report in the renewal answer, and no percentage off in either answer.
Worked examples - every lane, every sample
These are the page's three free samples (fictional events, people and companies; the comparable cards quote published rate cards with their years). Each input is exactly what the page sends; each reply is the saved reply the sample replays, shipped as the validating model wrote it; the last line is the page's own check. Every sample has both lanes.
Riverbend Ops Conf (300 people, tiers entered) - card
Target $48,000; Published ladder, 4 tiers at 5.3:1; full sellout $53,000; signing deadline 2027-01-14; 4 of 5 settled.
Input:
{
"task": "card",
"event": "Event: Riverbend Ops Conf; community-run; a single one-off event; free to attend no; attendees 300; ticket price $250; event date 2027-04-15\nBudget: total expenses $60,000; sponsorship share 80%\nInventory: booth or table slots the floor supports 8; stage minutes the program policy allows to be sold 6\nContext: signing window a quarter or more; selling capacity some organizer hours for selling; mandate a compounding multi-edition card; local hiring holding; last edition the top tier sold out\nDisclosure wanted: Published ladder; early-bird yes at $7,000; returning-sponsor discount planned yes; bundle percentage none\nNegotiation policy entered: approver Dana Okavell (treasurer); discount floor 10% of card price; deviation log kept\nComparable cards: Baltimore devopsdays 2025: Digital Only $1,500 / Gold $3,500 / Platinum $6,000 / Chattanooga devopsdays 2024: Bronze $1,000 / Silver $3,000 / Gold $5,000 / A neighbouring meetup conference: Gold $5,000 / Silver $2,000",
"ladder": "Tiers, top first (as entered; passes valued at the ticket price):\nPlatinum | $8,000 | 2 slots | 4 passes ($1,000) | net after passes $7,000 | floor: table | stage: 2 min | Largest logo, dedicated slide, a table, a 2-minute pitch | method: value-based\nGold | $4,000 | 4 slots | 2 passes ($500) | net after passes $3,500 | floor: table | stage: none | Logo on slides and web, a table | method: market-comp\nSilver | $1,500 | 8 slots | 1 pass ($250) | net after passes $1,250 | floor: none | stage: none | Logo on web and slides, no table | method: market-comp\nCommunity | $0 | 3 slots | 1 pass ($250) | floor: none | stage: none | Logo and one ticket - non-commercial local groups only | method: persona (free)\nAdd-ons:\nLunch | $5,000 | capped at 1 | gives visibility | on the card\nLanyards | $2,500 | capped at 1 | gives visibility | on the card\nCoffee | $1,500 | capped at 1 | gives visibility | on the card\nHappy hour | contact us | capped at 1 | gives visibility | on the card\nExpo table | $1,000 | capped at 2 | gives booth | off the card until priced above $4,000\nIn-kind offers:\nCumulo Cloud | cloud credits | retail $10,000 | displaced $0 | cash $0 | worth $0 | earns no paid tier | asks for Gold\nBrightline AV | stage AV and streaming | retail $6,000 | displaced $3,500 | cash $0 | worth $3,500 | earns Silver | asks for Gold\nNorthwind Labs | lunch catering | retail $9,000 | displaced $6,000 | cash $2,000 | worth $8,000 | earns Platinum | asks for Platinum",
"facts": "Target (cost-recovery): expenses $60,000 x share 80% = $48,000\nPrice-setting method: Cost-recovery fixes the total, market comps band each tier by ratio, value-based allocates within the band (value-based promoted for the top tier: it sold out last edition)\nArchitecture: published - Published ladder; community-run pole; 4 tiers on the card (3 paid); recommended 3; a persona tier is present\nTop:floor ratio: 5.3:1 (Platinum $8,000 to Silver $1,500; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $44,000 + add-ons on the card $9,000 = $53,000 against $48,000 (110% coverage); 27 passes given away, worth $6,750\nBooth price floor: Gold at $4,000; staff-free visibility tiers: Silver\nDiscount mechanic: earlybird - Early-bird deadline on the top tier; Platinum at $7,000 until 2027-01-14\nCalendar: signing deadline 2027-01-14 (about a quarter, 91 days, before 2027-04-15); early-bird 2027-01-14; add-on purchase cutoff 2027-01-14\nReadiness gate (4 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier settled; No add-on re-selling a gated benefit below its tier MISSING; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log settled\nSignals to record: Target coverage by the signing deadline (2027-01-14): the share of the $48,000 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Booth versus visibility sell-through, read against the hiring market (self-set)\nFindings (16):\n[check] addon_dependent (target): The tiers alone raise $44,000 of the $48,000 target; the card reaches it only if the add-ons sell ($9,000).\n[check] passes_cut (target): Counting the 27 passes the card gives away ($6,750 of tickets not sold), it nets $46,250 - under the target.\n[info] hiring (ladder): Hiring is on hold in the local market - recruiting sponsors leave first, so booth-led tiers sell slower while visibility still sells. Read booth against visibility sell-through.\n[info] prior_top (ladder): The top tier sold out last edition - a sellout is the repricing signal: price it higher, never lower.\n[info] addon_beats_mid (add-ons): Lunch ($5,000) out-prices the Gold tier - published practice, fine: it sells a named surface, not a gated benefit.\n[fix] addon_cannibal (add-ons): Expo table re-sells floor presence at $1,000, below Gold ($4,000), the cheapest tier that includes it - price it above that or don't sell it.\n[check] inkind_zero (in-kind): Cumulo Cloud (cloud credits) displaces no budget line the event would pay in cash, so it is worth nothing on the card - the $10,000 retail figure is the donor's number, not the event's.\n[check] inkind_tier (in-kind): Cumulo Cloud (cloud credits) asks for Gold ($4,000) but is worth $0 at displaced cost - it earns no paid tier.\n[info] inkind_retail (in-kind): Brightline AV (stage AV and streaming) is valued at the $3,500 budget line it displaces, not the $6,000 retail figure - retail framing inflates the tier by the donor's margin.\n[check] inkind_tier (in-kind): Brightline AV (stage AV and streaming) asks for Gold ($4,000) but is worth $3,500 at displaced cost - it earns Silver.\n[info] inkind_retail (in-kind): Northwind Labs (lunch catering) is valued at the $6,000 budget line it displaces, not the $9,000 retail figure - retail framing inflates the tier by the donor's margin.\n[fix] inkind_top_cash (in-kind): Northwind Labs (lunch catering) asks for the top tier with only $2,000 in cash - keep the top tier cash-majority: venue deposits, insurance and catering minimums are paid in cash.\n[fix] returning (discounts): A returning-sponsor discount is deleted - it compounds into a permanently discounted anchor sponsor. The renewal lever is the post-event report and the relationship (price protection to a published date, open to every sponsor, is the compatible alternative).\n[info] earlybird (discounts): One dated price on the top tier only, until 2027-01-14 - a date on the card, not a percentage-off banner, and never extended.\n[check] comp_undated (comps): 1 comp line carries no year - an undated price is a rumor.\n[check] gate (readiness): Readiness: 4 of 5 settled before the first sponsor call - missing: No add-on re-selling a gated benefit below its tier."
}
Reply:
{
"task": "card",
"summary": "The card targets $48,000 by cost-recovery on a published four-tier ladder; settle the Expo table add-on, which re-sells Gold's floor presence below Gold's price, before this goes to the organizers.",
"target": {
"amount": 48000,
"math": "Expenses of $60,000 multiplied by an 80% sponsorship share set the target at $48,000, and the card raises $53,000 if every tier and add-on sells.",
"method": "cost-recovery"
},
"architecture": {
"pick": "published",
"tiers": 4,
"why": "The event is community-run, a single one-off event, with some organizer hours available to sell it."
},
"ladder": [
{
"name": "Platinum",
"price": 8000,
"slots": 2,
"benefits": "4 passes ($1,000), a table, 2 minutes of stage time, the largest logo and a dedicated slide",
"method": "value-based",
"note": "the anchor tier, priced after last edition's sellout"
},
{
"name": "Gold",
"price": 4000,
"slots": 4,
"benefits": "2 passes ($500), a table, logo on slides and web",
"method": "market-comp",
"note": "the best-value tier, the step most sponsors should take"
},
{
"name": "Silver",
"price": 1500,
"slots": 8,
"benefits": "1 pass ($250), no table, logo on web and slides",
"method": "market-comp",
"note": "the entry rung, a staff-free visibility tier"
},
{
"name": "Community",
"price": 0,
"slots": 3,
"benefits": "1 pass ($250), no table, logo and one ticket, for non-commercial local groups only",
"method": "persona (free)",
"note": "a persona tier, not a funnel"
}
],
"ratio": {
"value": "5.3:1",
"note": "At 5.3:1, Platinum to Silver sits inside the published 2:1 to 7.5:1 community range, just above the 4-5:1 mode."
},
"addons": [
{
"name": "Lunch",
"price": 5000,
"note": "capped at one; a named surface, not a gated benefit, so it may out-price Gold"
},
{
"name": "Lanyards",
"price": 2500,
"note": "capped at one; visibility item"
},
{
"name": "Coffee",
"price": 1500,
"note": "capped at one; visibility item"
},
{
"name": "Happy hour",
"price": null,
"note": "contact us; capped at one; visibility item"
}
],
"inkind": [
"Cumulo Cloud's cloud credits displace no cash budget line, so they are worth $0 at displaced cost and earn no paid tier.",
"Brightline AV's stage AV and streaming are worth $3,500 at displaced cost and earn Silver.",
"Northwind Labs' lunch catering is worth $8,000 at displaced cost ($6,000 displaced plus $2,000 cash) and earns Platinum."
],
"calendar": {
"signing": "2027-01-14",
"early_bird": "2027-01-14",
"note": "Add-on purchases close by the same 2027-01-14 cutoff, and no series renewal date applies to this one-off event."
},
"signals": [
"Target coverage of the $48,000 target by 2027-01-14: a shortfall raises next edition's floor tier; full coverage holds prices.",
"Tier fill pattern, including whether Gold moves: any tier that sells out is priced higher next edition, never lower.",
"Booth versus visibility sell-through against the local hiring slowdown: if booth tiers lag, shift inventory toward staff-free visibility next edition."
],
"caveats": [
"[fix] Expo table re-sells floor presence at $1,000, below Gold's $4,000 - price it above $4,000 or don't sell it.",
"[fix] Northwind Labs asks for Platinum with only $2,000 in cash - keep the top tier cash-majority or move it to a lower tier.",
"[fix] A returning-sponsor discount is planned, but the rule deletes it - use the post-event report and price protection instead.",
"[check] The tiers alone raise $44,000 of the $48,000 target; the card reaches it only if the add-ons sell ($9,000)."
]
}
The page's check: kept - nothing to flag
Riverbend Ops Conf (300 people, tiers entered) - policy
Target $48,000; Published ladder, 4 tiers at 5.3:1; full sellout $53,000; signing deadline 2027-01-14; 4 of 5 settled.
Input:
{
"task": "policy",
"event": "Event: Riverbend Ops Conf; community-run; a single one-off event; free to attend no; attendees 300; ticket price $250; event date 2027-04-15\nBudget: total expenses $60,000; sponsorship share 80%\nInventory: booth or table slots the floor supports 8; stage minutes the program policy allows to be sold 6\nContext: signing window a quarter or more; selling capacity some organizer hours for selling; mandate a compounding multi-edition card; local hiring holding; last edition the top tier sold out\nDisclosure wanted: Published ladder; early-bird yes at $7,000; returning-sponsor discount planned yes; bundle percentage none\nNegotiation policy entered: approver Dana Okavell (treasurer); discount floor 10% of card price; deviation log kept\nComparable cards: Baltimore devopsdays 2025: Digital Only $1,500 / Gold $3,500 / Platinum $6,000 / Chattanooga devopsdays 2024: Bronze $1,000 / Silver $3,000 / Gold $5,000 / A neighbouring meetup conference: Gold $5,000 / Silver $2,000",
"ladder": "Tiers, top first (as entered; passes valued at the ticket price):\nPlatinum | $8,000 | 2 slots | 4 passes ($1,000) | net after passes $7,000 | floor: table | stage: 2 min | Largest logo, dedicated slide, a table, a 2-minute pitch | method: value-based\nGold | $4,000 | 4 slots | 2 passes ($500) | net after passes $3,500 | floor: table | stage: none | Logo on slides and web, a table | method: market-comp\nSilver | $1,500 | 8 slots | 1 pass ($250) | net after passes $1,250 | floor: none | stage: none | Logo on web and slides, no table | method: market-comp\nCommunity | $0 | 3 slots | 1 pass ($250) | floor: none | stage: none | Logo and one ticket - non-commercial local groups only | method: persona (free)\nAdd-ons:\nLunch | $5,000 | capped at 1 | gives visibility | on the card\nLanyards | $2,500 | capped at 1 | gives visibility | on the card\nCoffee | $1,500 | capped at 1 | gives visibility | on the card\nHappy hour | contact us | capped at 1 | gives visibility | on the card\nExpo table | $1,000 | capped at 2 | gives booth | off the card until priced above $4,000\nIn-kind offers:\nCumulo Cloud | cloud credits | retail $10,000 | displaced $0 | cash $0 | worth $0 | earns no paid tier | asks for Gold\nBrightline AV | stage AV and streaming | retail $6,000 | displaced $3,500 | cash $0 | worth $3,500 | earns Silver | asks for Gold\nNorthwind Labs | lunch catering | retail $9,000 | displaced $6,000 | cash $2,000 | worth $8,000 | earns Platinum | asks for Platinum",
"facts": "Target (cost-recovery): expenses $60,000 x share 80% = $48,000\nPrice-setting method: Cost-recovery fixes the total, market comps band each tier by ratio, value-based allocates within the band (value-based promoted for the top tier: it sold out last edition)\nArchitecture: published - Published ladder; community-run pole; 4 tiers on the card (3 paid); recommended 3; a persona tier is present\nTop:floor ratio: 5.3:1 (Platinum $8,000 to Silver $1,500; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $44,000 + add-ons on the card $9,000 = $53,000 against $48,000 (110% coverage); 27 passes given away, worth $6,750\nBooth price floor: Gold at $4,000; staff-free visibility tiers: Silver\nDiscount mechanic: earlybird - Early-bird deadline on the top tier; Platinum at $7,000 until 2027-01-14\nCalendar: signing deadline 2027-01-14 (about a quarter, 91 days, before 2027-04-15); early-bird 2027-01-14; add-on purchase cutoff 2027-01-14\nReadiness gate (4 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier settled; No add-on re-selling a gated benefit below its tier MISSING; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log settled\nSignals to record: Target coverage by the signing deadline (2027-01-14): the share of the $48,000 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Booth versus visibility sell-through, read against the hiring market (self-set)\nFindings (16):\n[check] addon_dependent (target): The tiers alone raise $44,000 of the $48,000 target; the card reaches it only if the add-ons sell ($9,000).\n[check] passes_cut (target): Counting the 27 passes the card gives away ($6,750 of tickets not sold), it nets $46,250 - under the target.\n[info] hiring (ladder): Hiring is on hold in the local market - recruiting sponsors leave first, so booth-led tiers sell slower while visibility still sells. Read booth against visibility sell-through.\n[info] prior_top (ladder): The top tier sold out last edition - a sellout is the repricing signal: price it higher, never lower.\n[info] addon_beats_mid (add-ons): Lunch ($5,000) out-prices the Gold tier - published practice, fine: it sells a named surface, not a gated benefit.\n[fix] addon_cannibal (add-ons): Expo table re-sells floor presence at $1,000, below Gold ($4,000), the cheapest tier that includes it - price it above that or don't sell it.\n[check] inkind_zero (in-kind): Cumulo Cloud (cloud credits) displaces no budget line the event would pay in cash, so it is worth nothing on the card - the $10,000 retail figure is the donor's number, not the event's.\n[check] inkind_tier (in-kind): Cumulo Cloud (cloud credits) asks for Gold ($4,000) but is worth $0 at displaced cost - it earns no paid tier.\n[info] inkind_retail (in-kind): Brightline AV (stage AV and streaming) is valued at the $3,500 budget line it displaces, not the $6,000 retail figure - retail framing inflates the tier by the donor's margin.\n[check] inkind_tier (in-kind): Brightline AV (stage AV and streaming) asks for Gold ($4,000) but is worth $3,500 at displaced cost - it earns Silver.\n[info] inkind_retail (in-kind): Northwind Labs (lunch catering) is valued at the $6,000 budget line it displaces, not the $9,000 retail figure - retail framing inflates the tier by the donor's margin.\n[fix] inkind_top_cash (in-kind): Northwind Labs (lunch catering) asks for the top tier with only $2,000 in cash - keep the top tier cash-majority: venue deposits, insurance and catering minimums are paid in cash.\n[fix] returning (discounts): A returning-sponsor discount is deleted - it compounds into a permanently discounted anchor sponsor. The renewal lever is the post-event report and the relationship (price protection to a published date, open to every sponsor, is the compatible alternative).\n[info] earlybird (discounts): One dated price on the top tier only, until 2027-01-14 - a date on the card, not a percentage-off banner, and never extended.\n[check] comp_undated (comps): 1 comp line carries no year - an undated price is a rumor.\n[check] gate (readiness): Readiness: 4 of 5 settled before the first sponsor call - missing: No add-on re-selling a gated benefit below its tier."
}
Reply:
{
"task": "policy",
"summary": "Published tier prices hold for every sponsor; Dana Okavell, the treasurer, decides on any deviation; settle the readiness gate's missing item - the Expo table pricing conflict - before the first call.",
"negotiable": [
"the payment schedule",
"equal-value benefit swaps",
"bundling add-ons into a tier at the sum of their card prices"
],
"never": [
"published tier prices",
"anything the program policy forbids selling (talk slots, judging results, program influence)",
"exclusivity not already on the card",
"the early-bird deadline on Platinum (2027-01-14)"
],
"authority": {
"approver": "Dana Okavell (treasurer)",
"floor_pct": 10,
"rule": "No one closes a deal alone - Dana Okavell or a second approver signs off, and a benefit is added before any number is cut."
},
"log": [
"sponsor",
"tier",
"what moved",
"why",
"who approved"
],
"discount": {
"pick": "earlybird",
"text": "Platinum is $7,000 until 2027-01-14, a dated price on the top tier only, never extended."
},
"inkind": "Each in-kind offer is valued at the budget line it displaces, not the donor's retail figure, and buys tier placement at that value like cash. The top tier stays cash-majority - Northwind Labs' $2,000 cash against its $8,000 value needs more cash or a lower tier - and the value, delivery, and what happens if delivery fails go into the sponsor agreement.",
"renewal": "The published price holds - there is no returning-sponsor discount. What we can offer instead: the post-event report, this card's early-bird price of $7,000 on Platinum until 2027-01-14 open to every sponsor, price protection to a published future date, or a time-boxed right of first negotiation on next edition's card - never a price cut below what is published.",
"request_reply": "The published price holds. What can move instead: the payment schedule, an equal-value benefit swap, or bundling add-ons into your tier at the sum of their card prices - no percentage off the tier price.",
"note": "Before the first call, settle the Expo table add-on's conflict with Gold's floor presence - the one readiness-gate item not yet closed."
}
The page's check: kept - nothing to flag
Harbor JS Monthly (a free monthly series) - card
Target $9,600; Published ladder, 2 tiers at 2:1; full sellout $10,800; signing deadline 2026-10-02; 4 of 5 settled.
Input:
{
"task": "card",
"event": "Event: Harbor JS Monthly; community-run; a recurring series sold as one annual sponsorship; free to attend yes; attendees 80; ticket price not given; event date 2027-01-01 (the series year starts)\nBudget: total expenses $9,600; sponsorship share 100%\nInventory: booth or table slots the floor supports 0; stage minutes the program policy allows to be sold 0\nContext: signing window a quarter or more; selling capacity a volunteer team with no sales capacity; mandate a compounding multi-edition card; local hiring recruiting; last edition no fill record\nDisclosure wanted: Quote-gated; early-bird no; returning-sponsor discount planned no; bundle percentage 10%\nNegotiation policy entered: approver not named; discount floor not set; deviation log not kept\nComparable cards: none entered",
"ladder": "Tiers, top first (proposed by the page; passes valued at the ticket price):\nAnnual Partner | $1,600 | 3 slots | 0 passes | floor: none | stage: none | Logo on site, slides and web, named at the opening for the year, across every edition | method: cost-recovery\nAnnual Supporter | $800 | 6 slots | 0 passes | floor: none | stage: none | Logo on slides and web, no table - staff-free for the year, across every edition | method: cost-recovery\nAdd-ons:\nLivestream and recordings | $1,200 | capped at 1 | gives visibility | on the card\nIn-kind offers:\nTidewater Brewing | bar tab for one evening | retail $600 | displaced $450 | cash $0 | worth $450 | earns no paid tier | asks for Annual Supporter",
"facts": "Target (cost-recovery): expenses $9,600 x share 100% = $9,600\nPrice-setting method: Cost-recovery only - a free event's sequence collapses: the total is a fundraising target divided across tiers\nArchitecture: published - Published ladder; community-run pole; 2 tiers on the card (2 paid); recommended 2\nTop:floor ratio: 2:1 (Annual Partner $1,600 to Annual Supporter $800; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $9,600 + add-ons on the card $1,200 = $10,800 against $9,600 (113% coverage); 0 passes given away\nBooth price floor: no tier includes floor presence; staff-free visibility tiers: Annual Partner, Annual Supporter\nDiscount mechanic: none - No discount mechanic\nCalendar: signing deadline 2026-10-02 (about a quarter, 91 days, before 2027-01-01); early-bird none; add-on purchase cutoff 2026-10-02; annual renewal date 2026-10-02\nReadiness gate (4 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier settled; No add-on re-selling a gated benefit below its tier settled; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log MISSING\nSignals to record: Target coverage by the signing deadline (2026-10-02): the share of the $9,600 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Annual renewal rate against the renewal date, one cohort per series year\nFindings (9):\n[fix] quote_deleted (architecture): Quote-gated pricing is deleted for an event sold by a volunteer team with no sales capacity: \"contact us for pricing\" stalls every deal behind organizer availability and reads as having something to hide. The card is a published ladder.\n[info] proposed (ladder): No tiers entered - the page proposes a 2-tier ladder: the total from cost-recovery, a 2:1 top:floor ratio transposed from the published community range, grossed up for the passes it gives away. Band every price against your own dated comps.\n[info] inkind_retail (in-kind): Tidewater Brewing (bar tab for one evening) is valued at the $450 budget line it displaces, not the $600 retail figure - retail framing inflates the tier by the donor's margin.\n[check] inkind_tier (in-kind): Tidewater Brewing (bar tab for one evening) asks for Annual Supporter ($800) but is worth $450 at displaced cost - it earns no paid tier; for a series, take it as a single-surface deal for one edition, priced at the bill it displaces.\n[fix] bundle_series (discounts): An annual series sponsorship is priced from the yearly total and sold for the organizer time it saves - never with a bundle percentage attached.\n[fix] policy (policy): Discounting without a written policy - missing who approves a deviation, the discount floor, the deviation log. Until it exists, negotiated case-by-case is deleted: the first exception becomes the market price.\n[info] series (calendar): A recurring series sells annual tiers: one sale per sponsor per year, priced from the yearly total; renewal date 2026-10-02, a fiscal quarter before the series year starts.\n[info] no_comps (comps): No comparable cards entered - band each tier against same-community, same-region, same-scale cards, with their dates, and transpose ratios, never dollars.\n[check] gate (readiness): Readiness: 4 of 5 settled before the first sponsor call - missing: The written policy: approver, floor and log."
}
Reply:
{
"task": "card",
"summary": "The card targets $9,600 on a published 2-tier annual ladder for Harbor JS Monthly; settle the written policy - approver, floor and log - before the first sponsor call.",
"target": {
"amount": 9600,
"math": "Expenses of $9,600 times a 100% sponsorship share set the $9,600 target, and the card raises $10,800 across both tiers and the add-on at full sellout.",
"method": "cost-recovery"
},
"architecture": {
"pick": "published",
"tiers": 2,
"why": "The event is community-run, a free-to-attend recurring series, sold by a volunteer team with no sales capacity."
},
"ladder": [
{
"name": "Annual Partner",
"price": 1600,
"slots": 3,
"benefits": "No passes, no floor presence, no stage time; logo on site, slides and web, named at the opening for the year, across every edition.",
"method": "cost-recovery",
"note": "The anchor tier."
},
{
"name": "Annual Supporter",
"price": 800,
"slots": 6,
"benefits": "No passes, no floor presence, no stage time; logo on slides and web only, no table - staff-free for the year, across every edition.",
"method": "cost-recovery",
"note": "The entry rung, staff-free."
}
],
"ratio": {
"value": "2:1",
"note": "2:1 sits at the low end of the published community range of 2:1 to 7.5:1, below the modal 4-5:1."
},
"addons": [
{
"name": "Livestream and recordings",
"price": 1200,
"note": "Capped at one; gives visibility; stays on the card."
}
],
"inkind": [
"Tidewater Brewing's bar tab for one evening is worth $450 at displaced cost, not the $600 retail figure, and earns no paid tier - not the $800 Annual Supporter tier it was asked for; take it as a one-edition, single-surface deal priced at the $450 it displaces."
],
"calendar": {
"signing": "2026-10-02",
"early_bird": "",
"note": "Add-on purchases close 2026-10-02; the annual renewal date for the next series year is also 2026-10-02."
},
"signals": [
"Target coverage against the $9,600 target by the 2026-10-02 signing deadline - short coverage would raise next edition's cost-recovery price.",
"Which tier sells out first, Annual Partner or Annual Supporter - a tier selling out fast would get a higher price next edition.",
"The annual renewal rate against the 2026-10-02 renewal date, one cohort per series year - a weak renewal rate would hold or lower next edition's price."
],
"caveats": [
"Quote-gated pricing is deleted for a volunteer team with no sales capacity - the card is published, not quote-gated.",
"An annual series is priced from the yearly total and sold for the organizer time it saves, never with a bundle percentage - the entered 10% bundle percentage does not apply.",
"Discounting case-by-case is deleted until the written policy - approver, discount floor and deviation log - exists.",
"Tidewater Brewing's bar tab is worth $450 at displaced cost, not the $800 Annual Supporter price it was offered against, so it earns no paid tier."
]
}
The page's check: kept - nothing to flag
Harbor JS Monthly (a free monthly series) - policy
Target $9,600; Published ladder, 2 tiers at 2:1; full sellout $10,800; signing deadline 2026-10-02; 4 of 5 settled.
Input:
{
"task": "policy",
"event": "Event: Harbor JS Monthly; community-run; a recurring series sold as one annual sponsorship; free to attend yes; attendees 80; ticket price not given; event date 2027-01-01 (the series year starts)\nBudget: total expenses $9,600; sponsorship share 100%\nInventory: booth or table slots the floor supports 0; stage minutes the program policy allows to be sold 0\nContext: signing window a quarter or more; selling capacity a volunteer team with no sales capacity; mandate a compounding multi-edition card; local hiring recruiting; last edition no fill record\nDisclosure wanted: Quote-gated; early-bird no; returning-sponsor discount planned no; bundle percentage 10%\nNegotiation policy entered: approver not named; discount floor not set; deviation log not kept\nComparable cards: none entered",
"ladder": "Tiers, top first (proposed by the page; passes valued at the ticket price):\nAnnual Partner | $1,600 | 3 slots | 0 passes | floor: none | stage: none | Logo on site, slides and web, named at the opening for the year, across every edition | method: cost-recovery\nAnnual Supporter | $800 | 6 slots | 0 passes | floor: none | stage: none | Logo on slides and web, no table - staff-free for the year, across every edition | method: cost-recovery\nAdd-ons:\nLivestream and recordings | $1,200 | capped at 1 | gives visibility | on the card\nIn-kind offers:\nTidewater Brewing | bar tab for one evening | retail $600 | displaced $450 | cash $0 | worth $450 | earns no paid tier | asks for Annual Supporter",
"facts": "Target (cost-recovery): expenses $9,600 x share 100% = $9,600\nPrice-setting method: Cost-recovery only - a free event's sequence collapses: the total is a fundraising target divided across tiers\nArchitecture: published - Published ladder; community-run pole; 2 tiers on the card (2 paid); recommended 2\nTop:floor ratio: 2:1 (Annual Partner $1,600 to Annual Supporter $800; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $9,600 + add-ons on the card $1,200 = $10,800 against $9,600 (113% coverage); 0 passes given away\nBooth price floor: no tier includes floor presence; staff-free visibility tiers: Annual Partner, Annual Supporter\nDiscount mechanic: none - No discount mechanic\nCalendar: signing deadline 2026-10-02 (about a quarter, 91 days, before 2027-01-01); early-bird none; add-on purchase cutoff 2026-10-02; annual renewal date 2026-10-02\nReadiness gate (4 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier settled; No add-on re-selling a gated benefit below its tier settled; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log MISSING\nSignals to record: Target coverage by the signing deadline (2026-10-02): the share of the $9,600 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Annual renewal rate against the renewal date, one cohort per series year\nFindings (9):\n[fix] quote_deleted (architecture): Quote-gated pricing is deleted for an event sold by a volunteer team with no sales capacity: \"contact us for pricing\" stalls every deal behind organizer availability and reads as having something to hide. The card is a published ladder.\n[info] proposed (ladder): No tiers entered - the page proposes a 2-tier ladder: the total from cost-recovery, a 2:1 top:floor ratio transposed from the published community range, grossed up for the passes it gives away. Band every price against your own dated comps.\n[info] inkind_retail (in-kind): Tidewater Brewing (bar tab for one evening) is valued at the $450 budget line it displaces, not the $600 retail figure - retail framing inflates the tier by the donor's margin.\n[check] inkind_tier (in-kind): Tidewater Brewing (bar tab for one evening) asks for Annual Supporter ($800) but is worth $450 at displaced cost - it earns no paid tier; for a series, take it as a single-surface deal for one edition, priced at the bill it displaces.\n[fix] bundle_series (discounts): An annual series sponsorship is priced from the yearly total and sold for the organizer time it saves - never with a bundle percentage attached.\n[fix] policy (policy): Discounting without a written policy - missing who approves a deviation, the discount floor, the deviation log. Until it exists, negotiated case-by-case is deleted: the first exception becomes the market price.\n[info] series (calendar): A recurring series sells annual tiers: one sale per sponsor per year, priced from the yearly total; renewal date 2026-10-02, a fiscal quarter before the series year starts.\n[info] no_comps (comps): No comparable cards entered - band each tier against same-community, same-region, same-scale cards, with their dates, and transpose ratios, never dollars.\n[check] gate (readiness): Readiness: 4 of 5 settled before the first sponsor call - missing: The written policy: approver, floor and log."
}
Reply:
{
"task": "policy",
"summary": "Published tier prices hold; the event organizer approves any deviation under a two-person rule; settle the approver, discount floor and deviation log before the first sponsor call.",
"negotiable": [
"the payment schedule",
"equal-value benefit swaps",
"bundling add-ons into a tier at the sum of their card prices"
],
"never": [
"published tier prices",
"anything the program policy forbids selling - talk slots, judging results, program influence",
"exclusivity not already on the card",
"the signing deadline printed on the card, 2026-10-02"
],
"authority": {
"approver": "the event organizer",
"floor_pct": null,
"rule": "No one closes a deal alone - a named approver or a two-person rule signs off, and a benefit is added before any number is cut."
},
"log": [
"sponsor",
"tier",
"what moved",
"why",
"who approved"
],
"discount": {
"pick": "none",
"text": "No discount mechanic is set: there is no early-bird, and the entered 10% bundle percentage does not apply, since an annual series is priced from the yearly total, not bundled."
},
"inkind": "Tidewater Brewing's bar tab for one evening is worth $450 at displaced cost, not the $600 retail figure, and buys placement at that $450 value rather than the $800 Annual Supporter tier it was asked for. The top tier, Annual Partner, stays cash-majority, and the $450 value, the delivery, and what happens if delivery fails go into the agreement.",
"renewal": "The published price holds for a returning sponsor asking for loyalty pricing; share the post-event report so the value is visible. This card has no early-bird date, so offer price protection to a published date open to every sponsor, or a time-boxed right of first negotiation for the next series year - never a cut below the published price.",
"request_reply": "The published price holds. What can move instead is the payment schedule, an equal-value benefit swap, or bundling add-ons into the tier at the sum of their card prices - not a percentage off the price.",
"note": "Before the first sponsor call, settle the named approver, the discount floor and the deviation log - the one gap left in the readiness gate."
}
The page's check: kept - nothing to flag
Cloudline Summit (foundation scale, 3 events) - card
Target $540,000; Published ladder, 4 tiers at 12:1; full sellout $755,000; signing deadline 2027-06-21; 3 of 5 settled.
Input:
{
"task": "card",
"event": "Event: Cloudline Summit; vendor/foundation-run; one edition of a multi-event portfolio; free to attend no; attendees 2000; ticket price $900; event date 2027-09-20\nBudget: total expenses $900,000; sponsorship share 60%\nInventory: booth or table slots the floor supports 32; stage minutes the program policy allows to be sold 30\nContext: signing window a quarter or more; selling capacity people with sales experience; mandate a compounding multi-edition card; local hiring cutting; last edition no fill record\nDisclosure wanted: Published ladder; early-bird yes at $55,000; returning-sponsor discount planned no; bundle percentage 5%\nNegotiation policy entered: approver Sponsorship committee (two-person rule); discount floor 5% of card price; deviation log kept\nComparable cards: PyCon US 2026: Visionary $160,000 down to Associate $1,750; passes valued at $899 / DjangoCon US 2024: Diamond $20,000 / Platinum $10,000 / Gold $6,000 / Silver $3,500 / Bronze $2,300",
"ladder": "Tiers, top first (as entered; passes valued at the ticket price):\nDiamond | $60,000 | 3 slots | 20 passes ($18,000) | net after passes $42,000 | floor: 20x20 booth | stage: 10 min | A 10-minute slot after the keynote, the largest booth | method: market-comp\nPlatinum | $30,000 | 6 slots | 10 passes ($9,000) | net after passes $21,000 | floor: 10x20 booth | stage: none | Booth, logo on every stage screen | method: market-comp\nGold | $15,000 | 10 slots | 6 passes ($5,400) | net after passes $9,600 | floor: 10x10 booth | stage: none | Booth, logo on the web and signage | method: market-comp\nStartup | $5,000 | 12 slots | 2 passes ($1,800) | net after passes $3,200 | floor: shared kiosk | stage: none | A kiosk in startup alley, logo on the web | method: market-comp\nAdd-ons:\nAI track lead | $90,000 | capped at 1 | gives exclusivity | on the card\nSecurity track co-sponsor | $40,000 | capped at 2 | gives exclusivity | on the card\nWi-Fi | $15,000 | capped at 1 | gives visibility | on the card\nLanyards | contact us | capped at 1 | gives visibility | on the card\nExpo kiosk | $3,000 | capped at 4 | gives booth | off the card until priced above $5,000\nIn-kind offers: none entered",
"facts": "Target (cost-recovery): expenses $900,000 x share 60% = $540,000\nPrice-setting method: Cost-recovery fixes the total, market comps band each tier by ratio, value-based allocates within the band\nArchitecture: published - Published ladder; vendor/foundation-run pole; 4 tiers on the card (4 paid); recommended 3; a persona tier is present\nTop:floor ratio: 12:1 (Diamond $60,000 to Startup $5,000; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $570,000 + add-ons on the card $185,000 = $755,000 against $540,000 (140% coverage); 204 passes given away, worth $183,600\nBooth price floor: Startup at $5,000; staff-free visibility tiers: none\nDiscount mechanic: bundling - Multi-event bundling at 5%; plus the early-bird: Diamond at $55,000 until 2027-05-31\nCalendar: signing deadline 2027-06-21 (about a quarter, 91 days, before 2027-09-20); early-bird 2027-05-31; add-on purchase cutoff 2027-06-21\nReadiness gate (3 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier MISSING; No add-on re-selling a gated benefit below its tier MISSING; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log settled\nSignals to record: Target coverage by the signing deadline (2027-06-21): the share of the $540,000 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Booth versus visibility sell-through, read against the hiring market (self-set)\nFindings (8):\n[info] ratio_wide (ladder): Top:floor is 12:1 - wider than the community range, which foundation scale can carry once booth size and pass count step up continuously with price. Carry the scale-appropriate range, never the community one.\n[fix] no_staff_free (ladder): Every paid tier includes a booth or stage time - keep at least one staff-free visibility tier (logo, digital and on-screen placement, no booth): a booth costs the sponsor staff days, the first line a tightening budget cuts.\n[info] hiring (ladder): Hiring is being cut in the local market - recruiting sponsors leave first, so booth-led tiers sell slower while visibility still sells. Read booth against visibility sell-through.\n[check] excl_low (add-ons): Security track co-sponsor at $40,000 does not price above the top general tier ($60,000) - published exclusivity sits multiples above it, never add-on money.\n[fix] addon_cannibal (add-ons): Expo kiosk re-sells floor presence at $3,000, below Startup ($5,000), the cheapest tier that includes it - price it above that or don't sell it.\n[info] bundle (discounts): Bundling at 5% - keep it a small fixed published step, never negotiated (the one published instance is 3/5/8% for one, two, three-plus events, at foundation scale).\n[info] earlybird (discounts): One dated price on the top tier only, until 2027-05-31 - a date on the card, not a percentage-off banner, and never extended.\n[check] gate (readiness): Readiness: 3 of 5 settled before the first sponsor call - missing: A 2-4 tier ladder with a staff-free visibility tier, No add-on re-selling a gated benefit below its tier."
}
Reply:
{
"task": "card",
"summary": "The card targets $540,000 on a published four-tier ladder; settle the missing staff-free visibility tier and the underpriced Expo kiosk add-on before the first sponsor call.",
"target": {
"amount": 540000,
"math": "Total expenses of $900,000 times the 60% sponsorship share set the $540,000 target, and the published ladder plus add-ons would raise $755,000 at full sellout.",
"method": "cost-recovery"
},
"architecture": {
"pick": "published",
"tiers": 4,
"why": "The event is vendor/foundation-run, one edition of a multi-event portfolio, and sold by a team with sales experience."
},
"ladder": [
{
"name": "Diamond",
"price": 60000,
"slots": 3,
"benefits": "20 passes; 20x20 booth, the largest on the floor; a 10-minute slot after the keynote.",
"method": "market-comp",
"note": "This is the anchor tier, the top of the ladder."
},
{
"name": "Platinum",
"price": 30000,
"slots": 6,
"benefits": "10 passes; 10x20 booth; no stage time; logo on every stage screen.",
"method": "market-comp",
"note": "This is the visibly best value tier, the step up from Gold."
},
{
"name": "Gold",
"price": 15000,
"slots": 10,
"benefits": "6 passes; 10x10 booth; no stage time; logo on the web and signage.",
"method": "market-comp",
"note": "This is the step between Platinum and Startup."
},
{
"name": "Startup",
"price": 5000,
"slots": 12,
"benefits": "2 passes; shared kiosk in startup alley; no stage time; logo on the web.",
"method": "market-comp",
"note": "This is the persona tier for startups, doing entry and social proof."
}
],
"ratio": {
"value": "12:1",
"note": "At 12:1 this sits well above the published community range of 2:1 to 7.5:1, modal 4-5:1, which foundation scale can carry as long as booth size and pass count step up continuously with price."
},
"addons": [
{
"name": "AI track lead",
"price": 90000,
"note": "Capped at 1; gives exclusivity."
},
{
"name": "Security track co-sponsor",
"price": 40000,
"note": "Capped at 2; gives exclusivity."
},
{
"name": "Wi-Fi",
"price": 15000,
"note": "Capped at 1; gives visibility."
},
{
"name": "Lanyards",
"price": null,
"note": "Contact us; capped at 1; gives visibility."
}
],
"inkind": [],
"calendar": {
"signing": "2027-06-21",
"early_bird": "2027-05-31",
"note": "Add-on purchases close on 2027-06-21, the same date as signing, and the card sets no renewal date since this is not priced as a recurring annual series."
},
"signals": [
"Track the share of the $540,000 target signed by 2027-06-21; a shortfall would mean repricing the ladder lower or widening the floor tier next edition.",
"Record which tier sells out first and whether Platinum, the middle tier, moves; a Platinum stall next edition would call for repricing it closer to Gold.",
"Compare booth sell-through against visibility sell-through against the local hiring cuts; weak booth sales next edition would call for adding and pricing a staff-free visibility tier."
],
"caveats": [
"No staff-free visibility tier exists; every paid tier requires a booth or stage time, the first line a tightening budget cuts.",
"Expo kiosk at $3,000 re-sells floor presence below Startup at $5,000, the cheapest tier that includes it; price it above $5,000 or do not sell it.",
"Security track co-sponsor at $40,000 does not price above the top tier at $60,000; published exclusivity should sit multiples above it.",
"Readiness is 3 of 5 settled before the first sponsor call; missing are a staff-free visibility tier and fixing the add-on that cannibalizes Startup."
]
}
The page's check: kept - nothing to flag
Cloudline Summit (foundation scale, 3 events) - policy
Target $540,000; Published ladder, 4 tiers at 12:1; full sellout $755,000; signing deadline 2027-06-21; 3 of 5 settled.
Input:
{
"task": "policy",
"event": "Event: Cloudline Summit; vendor/foundation-run; one edition of a multi-event portfolio; free to attend no; attendees 2000; ticket price $900; event date 2027-09-20\nBudget: total expenses $900,000; sponsorship share 60%\nInventory: booth or table slots the floor supports 32; stage minutes the program policy allows to be sold 30\nContext: signing window a quarter or more; selling capacity people with sales experience; mandate a compounding multi-edition card; local hiring cutting; last edition no fill record\nDisclosure wanted: Published ladder; early-bird yes at $55,000; returning-sponsor discount planned no; bundle percentage 5%\nNegotiation policy entered: approver Sponsorship committee (two-person rule); discount floor 5% of card price; deviation log kept\nComparable cards: PyCon US 2026: Visionary $160,000 down to Associate $1,750; passes valued at $899 / DjangoCon US 2024: Diamond $20,000 / Platinum $10,000 / Gold $6,000 / Silver $3,500 / Bronze $2,300",
"ladder": "Tiers, top first (as entered; passes valued at the ticket price):\nDiamond | $60,000 | 3 slots | 20 passes ($18,000) | net after passes $42,000 | floor: 20x20 booth | stage: 10 min | A 10-minute slot after the keynote, the largest booth | method: market-comp\nPlatinum | $30,000 | 6 slots | 10 passes ($9,000) | net after passes $21,000 | floor: 10x20 booth | stage: none | Booth, logo on every stage screen | method: market-comp\nGold | $15,000 | 10 slots | 6 passes ($5,400) | net after passes $9,600 | floor: 10x10 booth | stage: none | Booth, logo on the web and signage | method: market-comp\nStartup | $5,000 | 12 slots | 2 passes ($1,800) | net after passes $3,200 | floor: shared kiosk | stage: none | A kiosk in startup alley, logo on the web | method: market-comp\nAdd-ons:\nAI track lead | $90,000 | capped at 1 | gives exclusivity | on the card\nSecurity track co-sponsor | $40,000 | capped at 2 | gives exclusivity | on the card\nWi-Fi | $15,000 | capped at 1 | gives visibility | on the card\nLanyards | contact us | capped at 1 | gives visibility | on the card\nExpo kiosk | $3,000 | capped at 4 | gives booth | off the card until priced above $5,000\nIn-kind offers: none entered",
"facts": "Target (cost-recovery): expenses $900,000 x share 60% = $540,000\nPrice-setting method: Cost-recovery fixes the total, market comps band each tier by ratio, value-based allocates within the band\nArchitecture: published - Published ladder; vendor/foundation-run pole; 4 tiers on the card (4 paid); recommended 3; a persona tier is present\nTop:floor ratio: 12:1 (Diamond $60,000 to Startup $5,000; published community range 2:1 to 7.5:1, modal 4-5:1; best-tier rule 2-3x)\nProjection at full sellout: tiers $570,000 + add-ons on the card $185,000 = $755,000 against $540,000 (140% coverage); 204 passes given away, worth $183,600\nBooth price floor: Startup at $5,000; staff-free visibility tiers: none\nDiscount mechanic: bundling - Multi-event bundling at 5%; plus the early-bird: Diamond at $55,000 until 2027-05-31\nCalendar: signing deadline 2027-06-21 (about a quarter, 91 days, before 2027-09-20); early-bird 2027-05-31; add-on purchase cutoff 2027-06-21\nReadiness gate (3 of 5): The revenue target with its share math settled; A 2-4 tier ladder with a staff-free visibility tier MISSING; No add-on re-selling a gated benefit below its tier MISSING; Every in-kind deal valued at displaced cost settled; The written policy: approver, floor and log settled\nSignals to record: Target coverage by the signing deadline (2027-06-21): the share of the $540,000 target signed (self-set); Tier fill pattern: which tier sells out first, and whether the middle moves (self-set); Booth versus visibility sell-through, read against the hiring market (self-set)\nFindings (8):\n[info] ratio_wide (ladder): Top:floor is 12:1 - wider than the community range, which foundation scale can carry once booth size and pass count step up continuously with price. Carry the scale-appropriate range, never the community one.\n[fix] no_staff_free (ladder): Every paid tier includes a booth or stage time - keep at least one staff-free visibility tier (logo, digital and on-screen placement, no booth): a booth costs the sponsor staff days, the first line a tightening budget cuts.\n[info] hiring (ladder): Hiring is being cut in the local market - recruiting sponsors leave first, so booth-led tiers sell slower while visibility still sells. Read booth against visibility sell-through.\n[check] excl_low (add-ons): Security track co-sponsor at $40,000 does not price above the top general tier ($60,000) - published exclusivity sits multiples above it, never add-on money.\n[fix] addon_cannibal (add-ons): Expo kiosk re-sells floor presence at $3,000, below Startup ($5,000), the cheapest tier that includes it - price it above that or don't sell it.\n[info] bundle (discounts): Bundling at 5% - keep it a small fixed published step, never negotiated (the one published instance is 3/5/8% for one, two, three-plus events, at foundation scale).\n[info] earlybird (discounts): One dated price on the top tier only, until 2027-05-31 - a date on the card, not a percentage-off banner, and never extended.\n[check] gate (readiness): Readiness: 3 of 5 settled before the first sponsor call - missing: A 2-4 tier ladder with a staff-free visibility tier, No add-on re-selling a gated benefit below its tier."
}
Reply:
{
"task": "policy",
"summary": "Published tier prices hold; the two-person sponsorship committee decides on any deviation; settle the missing staff-free visibility tier and the underpriced Expo kiosk add-on before the first call.",
"negotiable": [
"the payment schedule",
"equal-value benefit swaps",
"bundling add-ons into a tier at the sum of their card prices"
],
"never": [
"published tier prices",
"anything the program policy forbids selling, such as talk slots, judging results or program influence",
"exclusivity not already on the card",
"the early-bird deadline"
],
"authority": {
"approver": "Sponsorship committee (two-person rule)",
"floor_pct": 5,
"rule": "No one closes a deal alone; the committee adds a benefit before it cuts a number."
},
"log": [
"sponsor",
"tier",
"what moved",
"why",
"who approved"
],
"discount": {
"pick": "bundling",
"text": "Multi-event bundling discounts sponsors 5% across the portfolio, and Diamond carries an early-bird price of $55,000 open until 2027-05-31."
},
"inkind": "In-kind offers are valued at the budget line they displace, never at a donor's retail figure, and buy tier placement at that value; none have been entered yet, the top tier stays cash-majority, and the value, delivery and what happens if delivery fails are written into each agreement.",
"renewal": "The published price holds, and we will send the post-event report to support next year's conversation. There is no returning-sponsor discount, but Diamond's own early-bird price of $55,000 is open to every sponsor until 2027-05-31, and we can offer price protection to a published date or a time-boxed right of first negotiation instead of a cut below the published price.",
"request_reply": "The published price holds, and we do not offer a percentage off. What can move instead is the payment schedule, an equal-value benefit swap, or bundling add-ons into the tier at the sum of their card prices.",
"note": "Before the first sponsor call, settle the missing staff-free visibility tier and reprice or drop the Expo kiosk add-on so it does not undercut Startup."
}
The page's check: kept - nothing to flag
The rate card CSV for the first sample
kind,name,price,slots,passes,pass_value,net,floor,stage_minutes,benefits,status
tier,Platinum,8000,2,4,1000,7000,table,2,"Largest logo, dedicated slide, a table, a 2-minute pitch",entered
tier,Gold,4000,4,2,500,3500,table,0,"Logo on slides and web, a table",entered
tier,Silver,1500,8,1,250,1250,none,0,"Logo on web and slides, no table",entered
tier,Community,0,3,1,250,-250,none,0,Logo and one ticket - non-commercial local groups only,entered
add-on,Lunch,5000,1,,,,,,visibility,on the card
add-on,Lanyards,2500,1,,,,,,visibility,on the card
add-on,Coffee,1500,1,,,,,,visibility,on the card
add-on,Happy hour,contact us,1,,,,,,visibility,on the card
add-on,Expo table,1000,2,,,,booth,,booth,off until priced above 4000
Build the input yourself
Load the engine in node (global.window = global; require("./sponsorkit.js"); require("./sponsorreply.js")), then:
const K = SponsorKit, R = SponsorReply;
const f = K.form({ name: "My Conf", expenses: "60000", share: "80", ticket: "250", booths: "8", eventDate: "2027-04-15",
approver: "Treasurer", floorPct: "5", log: "yes", tiers: fs.readFileSync("tiers.csv", "utf8") });
// f.target, f.arch, f.tiers (top first: name, price, slots, passes, passValue, net, booth, stage), f.methods, f.ratioText
// f.ceiling, f.passCost, f.boothFloor, f.staffFree, f.addons (status: card, off, deleted), f.inkind (value, earns)
// f.discount, f.signing, f.ebDate, f.gate, f.findings
K.cardCSV(f) // kind, name, price, slots, passes, pass_value, net, floor, ...
const b = K.buildInput(f, "card"); // or "policy"
const wire = K.toWire(b.input); // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "card");
// R.check(reply, b) // {status: kept or flagged, notes}
Get a token for the steps below from /tokens.html.
Step 1 — a tiny client helper
One function that sends JSON and unwraps the response. Paste a personal token from /tokens.html, or leave it empty and mint a guest token in step 2.
BASE="https://api.skillsafe.ai/v1/app-api"
TOKEN="paste-your-token-here" # from https://sponsor-ladder.skillsafe.ai/tokens.html
api() { # api METHOD PATH [JSON-BODY]
curl -s -X "$1" "$BASE$2" -H "Content-Type: application/json" \
${TOKEN:+-H "Authorization: Bearer $TOKEN"} ${3:+--data "$3"}
}
import json, urllib.request
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "paste-your-token-here" # from https://sponsor-ladder.skillsafe.ai/tokens.html
def api(method, path, body=None, headers=None):
req = urllib.request.Request(BASE + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Content-Type": "application/json", **({"Authorization": "Bearer " + TOKEN} if TOKEN else {}), **(headers or {})})
with urllib.request.urlopen(req) as r:
env = json.load(r)
if env.get("error"):
raise RuntimeError(env["error"])
return env["data"]
// sponsor-ladder.mjs -- Node 18+ (global fetch)
const BASE = "https://api.skillsafe.ai/v1/app-api";
let TOKEN = "paste-your-token-here"; // from https://sponsor-ladder.skillsafe.ai/tokens.html
async function api(method, path, body, headers = {}) {
const r = await fetch(BASE + path, { method, headers: { "Content-Type": "application/json",
...(TOKEN ? { Authorization: "Bearer " + TOKEN } : {}), ...headers },
body: body === undefined ? undefined : JSON.stringify(body) });
const env = await r.json();
if (env.error) throw new Error(env.error.code + ": " + env.error.message);
return env.data;
}
package main
import ("bytes"; "encoding/json"; "fmt"; "net/http")
const base = "https://api.skillsafe.ai/v1/app-api"
var token = "paste-your-token-here" // from https://sponsor-ladder.skillsafe.ai/tokens.html
func api(method, path string, body any, headers map[string]string) (map[string]any, error) {
var buf bytes.Buffer
if body != nil { json.NewEncoder(&buf).Encode(body) }
req, _ := http.NewRequest(method, base+path, &buf)
req.Header.Set("Content-Type", "application/json")
if token != "" { req.Header.Set("Authorization", "Bearer "+token) }
for k, v := range headers { req.Header.Set(k, v) }
res, err := http.DefaultClient.Do(req)
if err != nil { return nil, err }
defer res.Body.Close()
var env struct { Data map[string]any; Error map[string]any }
json.NewDecoder(res.Body).Decode(&env)
if env.Error != nil { return nil, fmt.Errorf("%v", env.Error) }
return env.Data, nil
}
// SponsorLadder.java -- Java 17+, with com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.*;
import java.net.URI; import java.net.http.*; import java.util.*;
public class SponsorLadder {
static final String BASE = "https://api.skillsafe.ai/v1/app-api";
static String token = "paste-your-token-here"; // from https://sponsor-ladder.skillsafe.ai/tokens.html
static final ObjectMapper M = new ObjectMapper();
static final HttpClient C = HttpClient.newHttpClient();
static JsonNode api(String method, String path, Object body, Map<String, String> headers) throws Exception {
var b = HttpRequest.newBuilder(URI.create(BASE + path)).header("Content-Type", "application/json");
if (!token.isEmpty()) b.header("Authorization", "Bearer " + token);
if (headers != null) headers.forEach(b::header);
b.method(method, body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(M.writeValueAsString(body)));
JsonNode env = M.readTree(C.send(b.build(), HttpResponse.BodyHandlers.ofString()).body());
if (env.hasNonNull("error")) throw new RuntimeException(env.get("error").toString());
return env.get("data");
}
}
require "json"
require "net/http"
BASE = "https://api.skillsafe.ai/v1/app-api"
TOKEN = "paste-your-token-here" # from https://sponsor-ladder.skillsafe.ai/tokens.html
def api(method, path, body = nil, headers = {})
uri = URI(BASE + path)
req = Net::HTTPGenericRequest.new(method, !body.nil?, true, uri.request_uri,
{ "Content-Type" => "application/json" }.merge(TOKEN.empty? ? {} : { "Authorization" => "Bearer #{TOKEN}" }).merge(headers))
req.body = JSON.generate(body) unless body.nil?
env = JSON.parse(Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body)
raise env["error"].to_s if env["error"]
env["data"]
end
<?php
const BASE = "https://api.skillsafe.ai/v1/app-api";
$TOKEN = "paste-your-token-here"; // from https://sponsor-ladder.skillsafe.ai/tokens.html
function api(string $method, string $path, $body = null, array $headers = []) {
global $TOKEN;
$h = ["Content-Type: application/json"];
if ($TOKEN) $h[] = "Authorization: Bearer $TOKEN";
foreach ($headers as $k => $v) $h[] = "$k: $v";
$ch = curl_init(BASE . $path);
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $h, CURLOPT_RETURNTRANSFER => true]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$env = json_decode(curl_exec($ch), true);
if (!empty($env["error"])) throw new Exception(json_encode($env["error"]));
return $env["data"];
}
// Program.cs -- .NET 6+ console app
using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Nodes;
static class Api {
public const string Base = "https://api.skillsafe.ai/v1/app-api";
public static string Token = "paste-your-token-here"; // from https://sponsor-ladder.skillsafe.ai/tokens.html
static readonly HttpClient C = new();
public static async Task<JsonNode?> Call(string method, string path, object? body = null, Dictionary<string, string>? headers = null) {
var req = new HttpRequestMessage(new HttpMethod(method), Base + path);
if (Token != "") req.Headers.Add("Authorization", "Bearer " + Token);
if (headers != null) foreach (var h in headers) req.Headers.Add(h.Key, h.Value);
if (body != null) req.Content = JsonContent.Create(body);
var env = JsonNode.Parse(await (await C.SendAsync(req)).Content.ReadAsStringAsync())!;
if (env["error"] is JsonNode e && e.GetValueKind() != JsonValueKind.Null) throw new Exception(e.ToJsonString());
return env["data"];
}
}
Step 2 — a token
A guest token is enough for /me and /estimate. A run is metered, so it needs a personal token: sign in on /tokens.html and copy it from there.
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN=$(curl -s -X POST "$BASE/guest" -H "Content-Type: application/json" -d '{"slug":"sponsor-ladder"}' | jq -r '.data.token')
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = ""
TOKEN = api("POST", "/guest", {"slug": "sponsor-ladder"})["token"]
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN = "";
TOKEN = (await api("POST", "/guest", { slug: "sponsor-ladder" })).token;
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = ""
g, err := api("POST", "/guest", map[string]string{"slug": "sponsor-ladder"}, nil)
if err != nil { panic(err) }
token = g["token"].(string)
// inside main: a guest token (enough for /me and /estimate); a run needs your personal token
token = "";
token = api("POST", "/guest", Map.of("slug", "sponsor-ladder"), null).get("token").asText();
# a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
TOKEN.replace("")
TOKEN.replace(api("POST", "/guest", { slug: "sponsor-ladder" })["token"])
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
$TOKEN = "";
$TOKEN = api("POST", "/guest", ["slug" => "sponsor-ladder"])["token"];
// a guest token (enough for /me and /estimate); a run needs your personal token from /tokens.html
Api.Token = "";
Api.Token = (await Api.Call("POST", "/guest", new { slug = "sponsor-ladder" }))!["token"]!.GetValue<string>();
Step 3 — GET /me
Who the token is (subject_type: user or guest) and the credit balance.
api GET /me | jq '.data | {subject_type, credits}'
me = api("GET", "/me")
print(me["subject_type"], me.get("credits"))
const me = await api("GET", "/me");
console.log(me.subject_type, me.credits);
me, _ := api("GET", "/me", nil, nil)
fmt.Println(me["subject_type"], me["credits"])
JsonNode me = api("GET", "/me", null, null);
System.out.println(me.get("subject_type") + " " + me.get("credits"));
me = api("GET", "/me")
puts [me["subject_type"], me["credits"]].inspect
$me = api("GET", "/me");
echo $me["subject_type"], " ", $me["credits"] ?? "", "\n";
var me = await Api.Call("GET", "/me");
Console.WriteLine($"{me!["subject_type"]} {me["credits"]}");
Step 4 — POST /estimate
Free. The body is the run input itself, the bare object (never wrapped in {"input": ...}). hold_credits is a reservation, not the price; min_credits is what the balance must cover; model_alias reads gpt-terra.
# input.json: the run input object - {"task": "card", "event": "Event: ...; community-run; a single one-off event ...", "ladder": "Tiers, top first (as entered ...): ...", "facts": "Target (cost-recovery): ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}'
inp = json.load(open("input.json")) # {"task": "card", "event": "Event: ...; community-run; a single one-off event ...", "ladder": "Tiers, top first (as entered ...): ...", "facts": "Target (cost-recovery): ..."}
# - see the input table
est = api("POST", "/estimate", inp)
print(est["hold_credits"], est["min_credits"], est["model"], est.get("warnings"))
import { readFileSync } from "node:fs";
const input = JSON.parse(readFileSync("input.json", "utf8")); // {task: "card" or "policy", event, ladder, facts} (see the input table)
const est = await api("POST", "/estimate", input);
console.log(est.hold_credits, est.min_credits, est.model, est.warnings);
raw, _ := os.ReadFile("input.json") // add "os" to the imports
var input map[string]any
json.Unmarshal(raw, &input)
est, _ := api("POST", "/estimate", input, nil)
fmt.Println(est["hold_credits"], est["min_credits"], est["model"])
Map<String, Object> input = M.readValue(new java.io.File("input.json"), Map.class);
JsonNode est = api("POST", "/estimate", input, null);
System.out.println(est.get("hold_credits") + " " + est.get("min_credits") + " " + est.get("model"));
input = JSON.parse(File.read("input.json"))
est = api("POST", "/estimate", input)
puts [est["hold_credits"], est["min_credits"], est["model"]].inspect
$input = json_decode(file_get_contents("input.json"), true);
$est = api("POST", "/estimate", $input);
echo $est["hold_credits"], " ", $est["min_credits"], " ", $est["model"], "\n";
var input = JsonNode.Parse(File.ReadAllText("input.json"))!;
var est = await Api.Call("POST", "/estimate", input);
Console.WriteLine($"{est!["hold_credits"]} {est["min_credits"]} {est["model"]}");
Step 5 — POST /run, then poll the job
Send an Idempotency-Key built from the lane and the input: a retry with the same key never bills twice. The page uses sponsor-ladder:<task>:<inputHash>:a<attempt> - the lane is part of the key - and its one automatic reformat retry is a new attempt number, named in the page as one extra run. A card carries summary, target, architecture, ladder, ratio, addons, calendar, signals and caveats; a policy carries summary, negotiable, never, authority, discount, renewal, request_reply and note. The code below prints the headline parts of either (list items are plain strings).
KEY="sponsor-ladder:card:$(shasum -a 256 input.json | cut -c1-16):a1"
JOB=$(curl -s -X POST "$BASE/run" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $KEY" --data @input.json | jq -r '.data.job_id')
while :; do
J=$(api GET "/jobs/$JOB"); S=$(echo "$J" | jq -r '.data.status')
case "$S" in succeeded|failed|cancelled) break;; esac; sleep 2
done
echo "$J" | jq -r '.data.output.output' > reply.json # one JSON object, the reply contract
echo "$J" | jq '.data | {charged_credits, truncated}'
jq -r '.summary // .format, .note // .request_reply, ((.signals // .caveats)[] | "\(.signal // .caveat): \(.text // .text)")' reply.json
jq -r '.renewal // .note // empty' reply.json # the renewal answer (policy)
import hashlib, time
key = "sponsor-ladder:" + inp["task"] + ":" + hashlib.sha256(json.dumps(inp).encode()).hexdigest()[:16] + ":a1"
job = api("POST", "/run", inp, {"Idempotency-Key": key})
while True:
j = api("GET", "/jobs/" + job["job_id"])
if j["status"] in ("succeeded", "failed", "cancelled"):
break
time.sleep(2)
reply = json.loads(j["output"]["output"]) # the reply as one JSON object
print(j["charged_credits"], j.get("truncated"), reply.get("summary"))
print(reply.get("note") or reply.get("request_reply", ""))
for s in reply.get("signals") or reply.get("caveats") or []:
print(s.get("signal", s.get("caveat")), "-", s.get("text", s.get("text")))
if reply.get("renewal"):
print("renewal:", reply["renewal"])
import { createHash } from "node:crypto";
const key = `sponsor-ladder:${input.task}:${createHash("sha256").update(JSON.stringify(input)).digest("hex").slice(0, 16)}:a1`;
const job = await api("POST", "/run", input, { "Idempotency-Key": key });
let j;
do { await new Promise((r) => setTimeout(r, 2000)); j = await api("GET", "/jobs/" + job.job_id); }
while (!["succeeded", "failed", "cancelled"].includes(j.status));
const reply = JSON.parse(j.output.output);
console.log(j.charged_credits, j.truncated, reply.summary);
console.log(reply.note ?? reply.request_reply);
for (const s of reply.signals || reply.caveats || []) console.log(s.signal ?? s.caveat, "-", s.text ?? s.text);
if (reply.renewal) console.log("renewal:", reply.renewal);
sum := sha256.Sum256(raw) // add "crypto/sha256", "encoding/hex", "time" to the imports
key := "sponsor-ladder:" + input["task"].(string) + ":" + hex.EncodeToString(sum[:8]) + ":a1"
job, _ := api("POST", "/run", input, map[string]string{"Idempotency-Key": key})
var j map[string]any
for {
time.Sleep(2 * time.Second)
j, _ = api("GET", "/jobs/"+job["job_id"].(string), nil, nil)
if s := j["status"]; s == "succeeded" || s == "failed" || s == "cancelled" { break }
}
var reply map[string]any
json.Unmarshal([]byte(j["output"].(map[string]any)["output"].(string)), &reply)
items, _ := reply["signals"].([]any) // signals and caveats are plain strings
fmt.Println(j["charged_credits"], j["truncated"], reply["summary"])
fmt.Println(reply["note"], reply["request_reply"])
for _, x := range items {
c := x.(map[string]any)
fmt.Println(c["signal"], "-", c["status"])
}
if fix, ok := reply["renewal"].(string); ok && fix != "" {
fmt.Println("renewal:", fix)
}
var digest = java.security.MessageDigest.getInstance("SHA-256").digest(M.writeValueAsBytes(input));
String key = "sponsor-ladder:" + input.get("task") + ":" + HexFormat.of().formatHex(digest, 0, 8) + ":a1";
JsonNode job = api("POST", "/run", input, Map.of("Idempotency-Key", key)), j;
do { Thread.sleep(2000); j = api("GET", "/jobs/" + job.get("job_id").asText(), null, null); }
while (!Set.of("succeeded", "failed", "cancelled").contains(j.get("status").asText()));
JsonNode reply = M.readTree(j.get("output").get("output").asText());
System.out.println(j.get("charged_credits") + " " + reply.get("summary"));
System.out.println(reply.path("note").asText(reply.path("request_reply").asText()));
for (JsonNode s : reply.has("signals") ? reply.path("signals") : reply.path("caveats")) System.out.println(s.path("signal").asText(s.path("caveat").asText()) + " - " + s.path("status").asText(s.path("text").asText()));
if (!reply.path("renewal").asText().isEmpty()) System.out.println("renewal: " + reply.get("renewal").asText());
require "digest"
key = "sponsor-ladder:#{input["task"]}:#{Digest::SHA256.hexdigest(JSON.generate(input))[0, 16]}:a1"
job = api("POST", "/run", input, { "Idempotency-Key" => key })
j = nil
loop do
sleep 2
j = api("GET", "/jobs/#{job["job_id"]}")
break if %w[succeeded failed cancelled].include?(j["status"])
end
reply = JSON.parse(j["output"]["output"])
puts [j["charged_credits"], j["truncated"], reply["summary"]].inspect
puts reply["note"] || reply["request_reply"]
(reply["signals"] || reply["caveats"] || []).each { |s| puts "#{s["signal"] || s["caveat"]} - #{s["text"] || s["text"]}" }
puts "renewal: #{reply["renewal"]}" unless reply["renewal"].to_s.empty?
$key = "sponsor-ladder:" . $input["task"] . ":" . substr(hash("sha256", json_encode($input)), 0, 16) . ":a1";
$job = api("POST", "/run", $input, ["Idempotency-Key" => $key]);
do { sleep(2); $j = api("GET", "/jobs/" . $job["job_id"]); }
while (!in_array($j["status"], ["succeeded", "failed", "cancelled"]));
$reply = json_decode($j["output"]["output"], true);
echo $j["charged_credits"], " ", ($reply["summary"] ?? ""), "\n";
echo $reply["note"] ?? $reply["request_reply"] ?? "", "\n";
foreach ($reply["signals"] ?? $reply["caveats"] ?? [] as $s) echo $s["signal"] ?? $s["caveat"], " - ", $s["text"] ?? $s["text"], "\n";
if (!empty($reply["renewal"])) echo "renewal: ", $reply["renewal"], "\n";
var digest = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(input.ToJsonString()));
var key = $"sponsor-ladder:{input["task"]}:{Convert.ToHexString(digest, 0, 8).ToLowerInvariant()}:a1";
var job = await Api.Call("POST", "/run", input, new() { ["Idempotency-Key"] = key });
JsonNode j;
do { await Task.Delay(2000); j = (await Api.Call("GET", "/jobs/" + job!["job_id"]))!; }
while (!new[] { "succeeded", "failed", "cancelled" }.Contains(j["status"]!.GetValue<string>()));
var reply = JsonNode.Parse(j["output"]!["output"]!.GetValue<string>());
Console.WriteLine($"{j["charged_credits"]} {reply!["summary"]}");
Console.WriteLine($"{reply["note"] ?? reply["request_reply"]}");
foreach (var s in (reply["signals"] ?? reply["caveats"]) as JsonArray ?? new JsonArray()) Console.WriteLine($"{s!["signal"] ?? s["caveat"]} - {s["text"] ?? s["text"]}");
if (reply["renewal"] is JsonNode fix && fix.GetValue<string>() != "") Console.WriteLine("renewal: " + fix);
Step 6 — POST /run-stream
The same run as Server-Sent Events, with the same input.json. Browsers receive progress ticks rather than text deltas; the final done event carries the reply.
# Server-Sent Events: tick/delta events while the job runs, then a final event with the job
curl -N -s -X POST "$BASE/run-stream" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: sponsor-ladder:card:$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json
rev = json.load(open("input.json")) # the same run input as input.json: {"task": "card", "event": "Event: ...; community-run; a single one-off event ...", "ladder": "Tiers, top first (as entered ...): ...", "facts": "Target (cost-recovery): ..."}
# - see the input table
req = urllib.request.Request(BASE + "/run-stream", method="POST", data=json.dumps(rev).encode(),
headers={"Content-Type": "application/json", "Authorization": "Bearer " + TOKEN,
"Idempotency-Key": "sponsor-ladder:card:" + hashlib.sha256(json.dumps(rev).encode()).hexdigest()[:16] + ":a1"})
with urllib.request.urlopen(req) as r:
for line in r:
line = line.decode().strip()
if line.startswith("data:"):
print(line[5:].strip()[:200])
const rev = JSON.parse(readFileSync("input.json", "utf8"));
const r = await fetch(BASE + "/run-stream", { method: "POST", body: JSON.stringify(rev), headers: {
"Content-Type": "application/json", Authorization: "Bearer " + TOKEN,
"Idempotency-Key": `sponsor-ladder:card:${createHash("sha256").update(JSON.stringify(rev)).digest("hex").slice(0, 16)}:a1` } });
const dec = new TextDecoder();
for await (const chunk of r.body) for (const line of dec.decode(chunk).split("\n"))
if (line.startsWith("data:")) console.log(line.slice(5).trim().slice(0, 200));
rraw, _ := os.ReadFile("input.json") // add "bufio", "strings" to the imports
rs := sha256.Sum256(rraw)
req, _ := http.NewRequest("POST", base+"/run-stream", bytes.NewReader(rraw))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Idempotency-Key", "sponsor-ladder:card:"+hex.EncodeToString(rs[:8])+":a1")
res, _ := http.DefaultClient.Do(req)
sc := bufio.NewScanner(res.Body)
for sc.Scan() { if l := sc.Text(); strings.HasPrefix(l, "data:") { fmt.Println(l[5:]) } }
String rev = java.nio.file.Files.readString(java.nio.file.Path.of("input.json"));
var rd = java.security.MessageDigest.getInstance("SHA-256").digest(rev.getBytes());
var sreq = HttpRequest.newBuilder(URI.create(BASE + "/run-stream")).header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token).header("Idempotency-Key", "sponsor-ladder:card:" + HexFormat.of().formatHex(rd, 0, 8) + ":a1")
.POST(HttpRequest.BodyPublishers.ofString(rev)).build();
C.send(sreq, HttpResponse.BodyHandlers.ofLines()).body().filter(l -> l.startsWith("data:")).forEach(System.out::println);
rev = File.read("input.json")
uri = URI(BASE + "/run-stream")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json", "Authorization" => "Bearer #{TOKEN}",
"Idempotency-Key" => "sponsor-ladder:card:#{Digest::SHA256.hexdigest(rev)[0, 16]}:a1")
req.body = rev
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |h|
h.request(req) { |res| res.read_body { |chunk| chunk.each_line { |l| puts l if l.start_with?("data:") } } }
end
$rev = file_get_contents("input.json");
$ch = curl_init(BASE . "/run-stream");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $rev, CURLOPT_HTTPHEADER => [
"Content-Type: application/json", "Authorization: Bearer $TOKEN",
"Idempotency-Key: sponsor-ladder:card:" . substr(hash("sha256", $rev), 0, 16) . ":a1"],
CURLOPT_WRITEFUNCTION => function ($ch, $chunk) { foreach (explode("\n", $chunk) as $l) if (str_starts_with($l, "data:")) echo $l, "\n"; return strlen($chunk); }]);
curl_exec($ch);
var rev = File.ReadAllText("input.json");
var rd = System.Security.Cryptography.SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(rev));
var sreq = new HttpRequestMessage(HttpMethod.Post, Api.Base + "/run-stream") { Content = new StringContent(rev, System.Text.Encoding.UTF8, "application/json") };
sreq.Headers.Add("Authorization", "Bearer " + Api.Token);
sreq.Headers.Add("Idempotency-Key", $"sponsor-ladder:card:{Convert.ToHexString(rd, 0, 8).ToLowerInvariant()}:a1");
using var http = new HttpClient();
using var res = await http.SendAsync(sreq, HttpCompletionOption.ResponseHeadersRead);
using var rdr = new StreamReader(await res.Content.ReadAsStreamAsync());
for (string? l; (l = await rdr.ReadLineAsync()) != null;) if (l.StartsWith("data:")) Console.WriteLine(l);