← Launch Cohort
API
Tokens

Run Launch Cohort from your own code

Both metered lanes are available over HTTP and each returns one JSON object. The division of labour: the page ranks the founding cohort, featuring and rationing, checks every launch claim against the review gate and the vetted roster, and checks the embargo, the paid-placement label, the allocation rule and the demand-gen reach, then hands it all to the run as facts. The run writes the launch plan or the co-marketing program; the page then holds it to its own facts (lcreply.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":"launch-cohort"}), so no slug header is needed afterwards. Send it as Authorization: Bearer YOUR_TOKEN. The run body is the input object, sent bare.

StatusCodeMeaning
400validation_errorThe body is not a JSON object, or a required key (task, operator, roster, facts) is missing. The page always sends all five of task, operator, roster, carry, facts; carry is an empty string for launch.
401unauthorizedNo token, or a stale one. Mint a guest token or sign in again.
402insufficient_creditsThe balance is under min_credits. Price with /estimate first.
403forbiddenA guest token tried to run: both lanes are metered and need a personal sign-in.
404not_foundUnknown job id.
429rate_limitedBack off and retry.
5xxserver_errorTransient. Retry with the same Idempotency-Key so a retry never double-bills.

The task field comes first

Two lanes, chosen by task, in the order the work runs - the launch, then the program every partner lives under after it:

A missing or unknown task is answered as launch; a live marketplace (no launch moment) starts at program. Both lanes send the same five fields. The facts are the page's checks, one row per line, and a line starting "must:" is a rule the reply has to hold. The page's handoff carries the launch into carry for the program lane.

The input

FieldRequiredWhat
taskyeslaunch or program. If it is missing or neither, do launch and set "task": "launch".
operatoryesthe operator and the launch, the moment, supply, the review gate, the flagship event, the embargo, editorial hours, the program choices, the deadline and the mandate; "not given" means not given.
rosteryesthe partner roster (partner, review status, marquee, tier) and the launch claims drafted so far, each marked backed or not backed by the page.
carrysend it (empty for launch)program task only: the launch decisions, when the launch task ran first; may be empty.
factsyesthe page's checks, one line each as area | id | status | evidence, the verdict and the rankings. A line starting "must:" applies to your reply.
retry_notenooptional; if present, your previous reply was unusable - follow it.

The rules the model applies

From the source skill, @samber/app-marketplace-launch-marketing - the only standard the run applies:

House rules

The replies

launch

Write the launch plan the partner-marketing team will run.

  1. summary - one sentence, at most 40 words: the cohort shape, and the first thing that must change.
  2. cohort - shape (curated, micro, migration or waves, exactly as the facts rank first), size (the apps in it - for a catalog migration, the catalog moving over; for a design-partner micro-cohort, the partners named on the roster; otherwise counted from the vetted roster), marquee (the roster's marquee partners the review gate has vetted, as named there - for a catalog migration, any marquee partner moving over; [] when none qualifies, with the gap in a caveat), why (one sentence naming the moves), waves (when the shape is waves, at least two objects: wave, apps, moment; else []).
  3. claims - one object per launch claim the input drafted, plus your own when fewer than two were drafted: claim (as drafted), backed (true only when the facts mark it backed), fix (for an unbacked claim, one sentence the gate does back - counting only vetted apps; else empty).
  4. reveal - embargo (one canonical date, time and timezone - the input's when it gives a complete one, else proposed and said so), anchor (the flagship moment it rides), sequence (short strings in order, from kit delivery to the lift), social (one sentence: when partners post, in minutes from the lift).
  5. kit - at least four objects: item (the embargo notice, each partner's pre-approved quote, both brands' boilerplate, the assets, and anything else this launch needs), owner (a role, as the input names it or proposed), due (when, relative to the embargo - labelled proposed when the input gives none).
  6. kpis - at least three short strings.
  7. caveats - at most 4 short strings; [] when there is nothing to say.
{
  "task": "launch",
  "summary": "one sentence",
  "cohort": { "shape": "curated", "size": "18 vetted apps", "marquee": [ "a partner" ], "why": "one sentence", "waves": [ ] },
  "claims": [ { "claim": "as drafted", "backed": false, "fix": "one sentence" } ],
  "reveal": { "embargo": "a date, time and timezone", "anchor": "the moment", "sequence": [ "a step" ], "social": "one sentence" },
  "kit": [ { "item": "Embargo notice", "owner": "a role", "due": "when" } ],
  "kpis": [ "a measure" ],
  "caveats": [ ]
}

The page holds it to its own facts (check() in lcreply.js; any warning makes the reply flagged): the reply answers the task it was sent; no web link; no backticks; a summary of at most 40 words; the ranked cohort shape, with at least two waves when it is waves; marquee partners from the roster, vetted unless the cohort is a migration; every drafted claim listed, each one the page finds unbacked marked so with a rewrite, and no vetting claim or count the gate does not back; one canonical embargo date, time and timezone, anchored to the flagship event; partner posts timed in minutes; a kit with the embargo notice, the quote, both boilerplates and the assets, each with an owner and a due time; at least three measures.

program

Write the featuring and co-marketing program the marketplace publishes to its partners.

  1. summary - one sentence, at most 40 words.
  2. featuring - one object per rung the program runs, starting with the rung the facts rank first, never one the facts ruled out: rung (badges, editorial or paid), rule (one sentence: the published eligibility or selection rule, named in this marketplace's own terms), cadence (how often it re-audits or rotates - labelled proposed when the input gives none).
  3. placement - one sentence: how paid placement is labelled as paid - or that the program sells none.
  4. demand_gen - at least two short strings: the non-rival efforts that reach every partner.
  5. rationing - mechanism (tiers, cohorts or catalog, exactly as the facts rank first), rule (one sentence: the allocation rule a partner can read - a threshold, criteria or prices, labelled proposed when the input gives none), where (one sentence: where it is published - labelled proposed when the input names no place).
  6. figures - one object per effect or price figure you quote (an install lift, a rate, a price point - plain counts the input gives, such as apps listed or hours a week, need no entry): figure, label (operator-published, contested, vendor-reported or proposed); [] when you quote none.
  7. starved - one sentence: when new-app surfacing and technical enablement are re-promoted, on a schedule - for a compounding program; else empty.
  8. kpis - at least three short strings, one of them featuring lift baselined against each app's own prior fortnight.
  9. caveats - at most 4 short strings; [] when there is nothing to say.
{
  "task": "program",
  "summary": "one sentence",
  "featuring": [ { "rung": "badges", "rule": "one sentence", "cadence": "a cadence" } ],
  "placement": "one sentence",
  "demand_gen": [ "an effort" ],
  "rationing": { "mechanism": "tiers", "rule": "one sentence", "where": "one sentence" },
  "figures": [ ],
  "starved": "one sentence",
  "kpis": [ "a measure" ],
  "caveats": [ ]
}

The page requires: the reply answers the task it was sent; the same text rules; featuring starting with the ranked rung, never a ruled-out one, each with a published rule and a cadence; paid placement labelled; at least two demand-gen efforts; the ranked rationing mechanism with its rule and where it is published; every figure labelled operator-published, contested, vendor-reported or proposed; the starved rungs re-promoted on a schedule for a compounding program; at least three measures, featuring lift baselined against a prior fortnight.

Worked examples

Three runs from the page's free samples (invented companies): the launch plan for a CRM debut promising more than it vetted, the program for the same marketplace carrying that launch, and the launch plan for a payroll debut ready for its summit. Each input is exactly what the page sends; each reply is the saved reply the sample replays, shipped unedited - but the facts and long strings are shortened in this display only, and every cut is listed under the example. The last line is the page's own check of the full reply.

launch - A CRM debut promising more than it vetted

The page read it as: the launch claims outrun the gate - fix them first; cohort curated, micro, waves; 11 apps vetted; 1 of 4 gates; failing checks: vetted, embargo, allocation.

Input (facts is 1776 characters; the first 1394 are shown):

{
 "task": "launch",
 "operator": "Operator: Quellmont CRM Marketplace\nThe marketplace and the launch: Quellmont is opening its first app marketplace for mid-market sales teams; 20 partners are building, and marketing wants a big number on launch day.\nMoment: The marketplace's own debut; supply: Partners mid-build under review; review gate: Live; the gate can vet the full cohort by the date: yes; target cohort size: 50\nFlagship event: Quellmont Connect on 2027-03-03; two events a season apart: no; marquee brands who could co-sign: Three to six; canonical embargo time: March 3, 9am; kits ship with the embargo notice: no; partner quotes pre-approved: no\nEditorial hours a week: 6; new and small apps need surfacing: yes; co-marketing demand outstrips the team even after gating: no; a partner-tier program exists: no; paid placement planned: no (labelled: no); allocation rule published: no; demand gen reaches every partner: yes\nHard date: yes; a compounding program; effort ceiling: medium; as-of: 2026-11-01",
 "roster": "Partner roster (partner | review status | marquee | tier):\n- Dialstream | vetted | marquee yes\n- Quotewise | vetted | marquee yes\n- Signhaven | vetted | marquee yes\n- Leadloom | vetted | marquee no\n- Mailcrate | vetted | marquee no\n- Callnote | vetted | marquee no\n- Forecastly | vetted | marquee no\n- Territo | vetted | marquee no\n- Pipewright | vetted | marquee no\n- Renewly | vetted | marquee no\n- Dealdesk | vetted | marquee no\n- Notewharf | in review | marquee no\n- Cadencer | in review | marquee no\n- Scorely | in review | marquee no\n- Meetfold | in review | marquee yes\n- Chatpost | not submitted | marquee no\n- Pitchwren | not submitted | marquee no\n- Seatmap | not submitted | marquee no\n- Tixbramble | not submitted | marquee no\n- Quotaflow | not submitted | marquee no\n\nLaunch-copy claims drafted so far:\n- Launching with 50+ vetted apps | not backed: claims 50+ where 11 are vetted - press counts independently\n- Every app security-reviewed by Quellmont | backed\n- The CRM ecosystem your sales team already uses | backed",
 "carry": "",
 "facts": "The page's checks (3 fail, 0 warn, 1 pass, 4 n/a); verdict: the launch claims outrun the gate - fix them first:\n- The launch | roster | na | 11 apps vetted, 4 in review, 5 not submitted; 3 vetted marquee brands\n- The launch | cohort | na | A curated vetted cohort > A design-partner micro-cohort > Staggered waves\n- The launch | vetted | fail | \"Launching with 50+ vetted apps\" claims 50+ where 11 are vetted - press counts independently\n- The launch | embargo | fail | \"March 3, 9am\" is not one canonical date, time and timezone; partners do not get the co-marketing kit with the embargo notice before the lift; partner quotes are not pre-approved by their comms teams\n- Featuring | featuring | na | Always-on quality-gated badges > A time-boxed editorial rotation > A menu-priced paid catalog\n- Featuring | placement | na | no paid placement planned\n- The budget split | allocation | fail | co-marketing granted without a published rule reads as favoritism to everyone who did not get it; ranked: Invitation cohorts > A partner-tier ladder > A menu-priced catalog - no partner-tier program exists yet - ration with invitation cohorts, and design the ladder separately\n- The budget split | broad | pass | marketplace SEO, collections and launches fund every partner\nCohort shapes in order: curated, micro, waves; featuring in order: badges, editorial, paid; rationing in order: cohorts, tiers,\n\n[... 382 more characters cut from this display ...]"
}

Reply:

{
 "task": "launch",
 "summary": "Quellmont launches a curated cohort of the 11 vetted apps at Quellmont Connect; first, replace the 50+ vetted-apps line with the true count of 11 before any copy reaches press.",
 "cohort": {
  "shape": "curated",
  "size": "11 vetted apps",
  "marquee": [
   "Dialstream",
   "Quotewise",
   "Signhaven"
  ],
  "why": "The live gate has vetted 11 apps with three marquee brands among them, so Quellmont launches those 11 as a tiered curated cohort led by Dialstream, Quotewise and Signhaven, and adds the 4 apps in review only once the gate clears them.",
  "waves": []
 },
 "claims": [
  {
   "claim": "Launching with 50+ vetted apps",
   "backed": false,
   "fix": "Launching with 11 apps vetted by Quellmont's live review gate, with more joining as they clear it."
  },
  {
   "claim": "Every app security-reviewed by Quellmont",
   "backed": true,
   "fix": ""
  },
  {
   "claim": "The CRM ecosystem your sales team already uses",
   "backed": true,
   "fix": ""
  }
 ],
 "reveal": {
  "embargo": "2027-03-03 09:00 PT (proposed - the input gives March 3, 9am with no timezone)",
  "anchor": "The Quellmont Connect keynote on 2027-03-03",
  "sequence": [
   "Confirm the canonical embargo date, time and timezone with all 11 partners",
   "Collect each partner's quote and get it approved by their comms team",
   "Ship the co-marketing kit with the embargo notice to every partner",
   "Brief press under embargo with the vetted count of 11",
   "Lift the embargo as the Quellmont Connect keynote reveals the marketplace",
   "Partners post on social and the cohort goes live in the marketplace"
  ],
  "social": "All 11 partners post within 15 minutes of the 09:00 PT (proposed) lift, and none before it."
 },
 "kit": [
  {
   "item": "Embargo notice with the canonical date, time and timezone",
   "owner": "Partner marketing lead (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Each partner's quote, pre-approved by their comms team",
   "owner": "Partner marketing manager per partner (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Approved boilerplate for Quellmont and for each partner",
   "owner": "Quellmont communications lead (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Launch assets: logos, screenshots and the marketplace listing for each vetted app",
   "owner": "Brand design lead (proposed)",
   "due": "Ten days before the embargo (proposed)"
  },
  {
   "item": "Social copy and timing sheet for posting within 15 minutes of the lift",
   "owner": "Social media manager (proposed)",
   "due": "One week before the embargo (proposed)"
  }
 ],
 "kpis": [
  "Press pickup on 2027-03-03 against a cohort of 11 apps",
  "Share of the 11 partners posting within 15 minutes of the lift",
  "Day-one installs across the 11 vetted apps",
  "Zero partner posts before the embargo lifts"
 ],
 "caveats": [
  "Marketing wants a big number, but press will count the 11 vetted apps independently.",
  "Meetfold is a marquee brand still in review, so it stays out of launch copy until the gate vets it.",
  "The 9am time has no timezone in the input; PT is proposed and must be confirmed with every partner.",
  "Kits and quote approvals are not in place today; both must reach partners before the lift."
 ]
}

What step 5 prints for it: curated: Quellmont launches a curated cohort of the 11 vetted apps at Quellmont Connect; first, replace the 50+ vetted-apps line with the true count of 11 before any copy reaches press.

The page's check: kept - nothing to flag

program - A CRM debut promising more than it vetted

The input carries the saved launch (R.laneForm fills carry from the launch reply), as the page's handoff does. Featuring ranked: badges, editorial, paid; rationing ranked: cohorts, tiers, catalog; failing checks: vetted, embargo, allocation.

Input (facts is 1832 characters; the first 1394 are shown):

{
 "task": "program",
 "operator": "Operator: Quellmont CRM Marketplace\nThe marketplace and the launch: Quellmont is opening its first app marketplace for mid-market sales teams; 20 partners are building, and marketing wants a big number on launch day.\nMoment: The marketplace's own debut; supply: Partners mid-build under review; review gate: Live; the gate can vet the full cohort by the date: yes; target cohort size: 50\nFlagship event: Quellmont Connect on 2027-03-03; two events a season apart: no; marquee brands who could co-sign: Three to six; canonical embargo time: March 3, 9am; kits ship with the embargo notice: no; partner quotes pre-approved: no\nEditorial hours a week: 6; new and small apps need surfacing: yes; co-marketing demand outstrips the team even after gating: no; a partner-tier program exists: no; paid placement planned: no (labelled: no); allocation rule published: no; demand gen reaches every partner: yes\nHard date: yes; a compounding program; effort ceiling: medium; as-of: 2026-11-01",
 "roster": "Partner roster (partner | review status | marquee | tier):\n- Dialstream | vetted | marquee yes\n- Quotewise | vetted | marquee yes\n- Signhaven | vetted | marquee yes\n- Leadloom | vetted | marquee no\n- Mailcrate | vetted | marquee no\n- Callnote | vetted | marquee no\n- Forecastly | vetted | marquee no\n- Territo | vetted | marquee no\n- Pipewright | vetted | marquee no\n- Renewly | vetted | marquee no\n- Dealdesk | vetted | marquee no\n- Notewharf | in review | marquee no\n- Cadencer | in review | marquee no\n- Scorely | in review | marquee no\n- Meetfold | in review | marquee yes\n- Chatpost | not submitted | marquee no\n- Pitchwren | not submitted | marquee no\n- Seatmap | not submitted | marquee no\n- Tixbramble | not submitted | marquee no\n- Quotaflow | not submitted | marquee no\n\nLaunch-copy claims drafted so far:\n- Launching with 50+ vetted apps | not backed: claims 50+ where 11 are vetted - press counts independently\n- Every app security-reviewed by Quellmont | backed\n- The CRM ecosystem your sales team already uses | backed",
 "carry": "Cohort: A curated vetted cohort, 11 vetted apps - The live gate has vetted 11 apps with three marquee brands among them, so Quellmont launches those 11 as a tiered curated cohort led by Dialstream, Quotewise and Signhaven, and adds the 4 apps in review only once the gate clears them.\nMarquee: Dialstream, Quotewise, Signhaven\nEmbargo: 2027-03-03 09:00 PT (proposed - the input gives March 3, 9am with no timezone), anchored to The Quellmont Connect keynote on 2027-03-03\nClaims kept: Every app security-reviewed by Quellmont; The CRM ecosystem your sales team already uses",
 "facts": "The page's checks (3 fail, 0 warn, 1 pass, 4 n/a); verdict: the launch claims outrun the gate - fix them first:\n- The launch | roster | na | 11 apps vetted, 4 in review, 5 not submitted; 3 vetted marquee brands\n- The launch | cohort | na | A curated vetted cohort > A design-partner micro-cohort > Staggered waves\n- The launch | vetted | fail | \"Launching with 50+ vetted apps\" claims 50+ where 11 are vetted - press counts independently\n- The launch | embargo | fail | \"March 3, 9am\" is not one canonical date, time and timezone; partners do not get the co-marketing kit with the embargo notice before the lift; partner quotes are not pre-approved by their comms teams\n- Featuring | featuring | na | Always-on quality-gated badges > A time-boxed editorial rotation > A menu-priced paid catalog\n- Featuring | placement | na | no paid placement planned\n- The budget split | allocation | fail | co-marketing granted without a published rule reads as favoritism to everyone who did not get it; ranked: Invitation cohorts > A partner-tier ladder > A menu-priced catalog - no partner-tier program exists yet - ration with invitation cohorts, and design the ladder separately\n- The budget split | broad | pass | marketplace SEO, collections and launches fund every partner\nCohort shapes in order: curated, micro, waves; featuring in order: badges, editorial, paid; rationing in order: cohorts, tiers,\n\n[... 438 more characters cut from this display ...]"
}

Reply (long strings shortened for display - see the cuts below):

{
 "task": "program",
 "summary": "Quellmont runs always-on quality badges plus a six-hour weekly editorial rotation, sells no paid placement, funds marketplace demand gen for every partner, and rations co-marketing through published invitation cohorts.",
 "featuring": [
  {
   "rung": "badges",
   "rule": "A Quellmont Verified badge goes to any app that has passed the live security review and meets published listing-quality criteria, and is removed when an app falls out of them.",
   "cadence": "Re-audited every quarter (proposed)"
  },
  {
   "rung": "editorial",
   "rule": "Quellmont's editors pick new and small CRM apps for a time-boxed spotlight on published criteria that explicitly exclude install base, using the 6 editorial hours a week.",
   "cadence": "Rotates every two weeks (proposed)"
  }
 ],
 "placement": "Quellmont sells no paid placement, so every featured slot is a badge or an editorial pick, and the program page says so.",
 "demand_gen": [
  "Marketplace SEO pages for mid-market sales workflows that list every vetted app",
  "Curated collections by sales use case, open to every vetted partner",
  "The Quellmont Connect launch and later marketplace launch moments covering the whole catalog"
 ],
 "rationing": {
  "mechanism": "cohorts",
  "rule": "Each quarter, Quellmont invites up to 4 vetted partners (proposed) into a co-marketing cohort, chosen on published criteria - vetted status, a complete listing and a joint customer story - with no partner in consecutive cohorts (proposed); [... 38 more characters cut from this display]",
  "where": "On the Quellmont partner portal's co-marketing page, alongside each cohort's selected partners."
 },
 "figures": [
  {
   "figure": "Up to 4 partners per quarterly co-marketing cohort",
   "label": "proposed"
  },
  {
   "figure": "Two-week editorial rotation",
   "label": "proposed"
  }
 ],
 "starved": "Every quarter (proposed), Quellmont sets aside editorial slots and a technical enablement session for apps that cleared the gate in the last 90 days, before measured co-marketing gets its share.",
 "kpis": [
  "Featuring lift during and after each badge or editorial window, baselined against each app's own prior fortnight",
  "Share of the marketing budget on demand gen against co-marketing, and partners touched by each",
  "Number of distinct partners reached by co-marketing cohorts per quarter",
  "Installs for newly vetted apps in their first editorial window"
 ],
 "caveats": [
  "No allocation rule is published today; the cohort rule must be live before any co-marketing is granted.",
  "No partner-tier program exists yet, so cohorts ration until a ladder is designed."
 ]
}

Cut from this display only (the saved reply and the check use the full text): rationing.rule (277 characters, 239 shown).

What step 5 prints for it: badges: Re-audited every quarter (proposed) | editorial: Rotates every two weeks (proposed)

The page's check: kept - nothing to flag

launch - A payroll debut ready for its summit

The page read it as: a launch program partners can read without crying favoritism; cohort curated, micro, waves; 18 apps vetted; 4 of 4 gates; failing checks: none.

Input (facts is 1483 characters; the first 1398 are shown):

{
 "task": "launch",
 "operator": "Operator: Tarnowey Payroll Apps\nThe marketplace and the launch: Tarnowey is revealing its marketplace at its annual customer summit; every launch app passed the security review that gates payroll data.\nMoment: The marketplace's own debut; supply: Partners mid-build under review; review gate: Live; the gate can vet the full cohort by the date: yes; target cohort size: 18\nFlagship event: Tarnowey Summit on 2027-04-14; two events a season apart: no; marquee brands who could co-sign: Three to six; canonical embargo time: 2027-04-14 09:00 PT; kits ship with the embargo notice: yes; partner quotes pre-approved: yes\nEditorial hours a week: 8; new and small apps need surfacing: yes; co-marketing demand outstrips the team even after gating: no; a partner-tier program exists: yes; paid placement planned: no (labelled: no); allocation rule published: yes; demand gen reaches every partner: yes\nHard date: yes; a compounding program; effort ceiling: medium; as-of: 2026-11-01",
 "roster": "Partner roster (partner | review status | marquee | tier):\n- Benefitly | vetted | marquee yes | tier Premier\n- Timecard Pro | vetted | marquee yes | tier Premier\n- Ledgerhook | vetted | marquee yes | tier Premier\n- Hirelane | vetted | marquee yes | tier Select\n- Expenso | vetted | marquee no | tier Select\n- Shiftgrid | vetted | marquee no | tier Select\n- Taxwren | vetted | marquee no | tier Select\n- Onboardrix | vetted | marquee no | tier Registered\n- Perkpath | vetted | marquee no | tier Registered\n- Rostervale | vetted | marquee no | tier Registered\n- Payslipper | vetted | marquee no | tier Registered\n- Compwise | vetted | marquee no | tier Registered\n- Leavebook | vetted | marquee no | tier Registered\n- Clockfen HR | vetted | marquee no | tier Registered\n- Auditrail | vetted | marquee no | tier Registered\n- Equityline | vetted | marquee no | tier Registered\n- Reviewquill | vetted | marquee no | tier Registered\n- Visapath | vetted | marquee no | tier Registered\n\nLaunch-copy claims drafted so far:\n- 18 security-reviewed apps on day one | backed\n- Built with Benefitly, Timecard Pro, Ledgerhook and Hirelane | backed",
 "carry": "",
 "facts": "The page's checks (0 fail, 0 warn, 4 pass, 4 n/a); verdict: a launch program partners can read without crying favoritism:\n- The launch | roster | na | 18 apps vetted, 0 in review, 0 not submitted; 4 vetted marquee brands\n- The launch | cohort | na | A curated vetted cohort > A design-partner micro-cohort > Staggered waves\n- The launch | vetted | pass | 2 claims backed by the live gate and the 18 vetted apps\n- The launch | embargo | pass | lift at 2027-04-14 09:00 PT; kits and approved quotes ship with the notice; anchored to Tarnowey Summit\n- Featuring | featuring | na | Always-on quality-gated badges > A time-boxed editorial rotation > A menu-priced paid catalog\n- Featuring | placement | na | no paid placement planned\n- The budget split | allocation | pass | the allocation rule is published; ranked: A partner-tier ladder > Invitation cohorts > A menu-priced catalog\n- The budget split | broad | pass | marketplace SEO, collections and launches fund every partner\nCohort shapes in order: curated, micro, waves; featuring in order: badges, editorial, paid; rationing in order: tiers, cohorts, catalog; vetted apps today: 18.\nmust: cohort shape curated; claims lists every launch claim with backed true only when the live gate vetted what it says - 18 apps vetted today, review gate live; the reveal names one canonical date, time and timezone anchored to Tarnowey Summit; the kit carries\n\n[... 85 more characters cut from this display ...]"
}

Reply:

{
 "task": "launch",
 "summary": "Tarnowey reveals a curated cohort of all 18 vetted apps at Tarnowey Summit; nothing is broken, so the first change is locking the 2027-04-14 09:00 PT lift into every partner's kit and post schedule.",
 "cohort": {
  "shape": "curated",
  "size": "18 vetted apps",
  "marquee": [
   "Benefitly",
   "Timecard Pro",
   "Ledgerhook",
   "Hirelane"
  ],
  "why": "All 18 apps cleared the live payroll security gate, so Tarnowey launches them as one curated cohort tiered Premier, Select and Registered, with Benefitly, Timecard Pro, Ledgerhook and Hirelane as the marquee logos.",
  "waves": []
 },
 "claims": [
  {
   "claim": "18 security-reviewed apps on day one",
   "backed": true,
   "fix": ""
  },
  {
   "claim": "Built with Benefitly, Timecard Pro, Ledgerhook and Hirelane",
   "backed": true,
   "fix": ""
  }
 ],
 "reveal": {
  "embargo": "2027-04-14 09:00 PT",
  "anchor": "The Tarnowey Summit keynote on 2027-04-14",
  "sequence": [
   "Ship the co-marketing kit with the embargo notice and the approved quotes to all 18 partners",
   "Confirm each partner's comms team has the 09:00 PT lift on its calendar",
   "Brief press under embargo on the 18 security-reviewed apps",
   "Lift the embargo at 09:00 PT as the Tarnowey Summit keynote reveals the marketplace",
   "Partners post on social and all 18 listings go live"
  ],
  "social": "All 18 partners post within 15 minutes of the 09:00 PT lift, led by the four marquee brands, and none before it."
 },
 "kit": [
  {
   "item": "Embargo notice for 2027-04-14 09:00 PT",
   "owner": "Partner marketing lead (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Each partner's pre-approved quote",
   "owner": "Partner marketing manager per tier (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Approved boilerplate for Tarnowey and for each partner",
   "owner": "Tarnowey communications lead (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  },
  {
   "item": "Launch assets: logos, screenshots and listing copy for each of the 18 apps",
   "owner": "Brand design lead (proposed)",
   "due": "Ten days before the embargo (proposed)"
  },
  {
   "item": "Security-review explainer partners can cite when describing the payroll data gate",
   "owner": "Security review lead (proposed)",
   "due": "Two weeks before the embargo (proposed)"
  }
 ],
 "kpis": [
  "Press pickup on 2027-04-14 against a cohort of 18 apps",
  "Share of the 18 partners posting within 15 minutes of the lift",
  "Day-one installs across the 18 vetted apps",
  "Zero partner posts before 09:00 PT"
 ],
 "caveats": [
  "Payroll data makes this a security-sensitive launch, so kits need one to two weeks of embargo lead."
 ]
}

What step 5 prints for it: curated: Tarnowey reveals a curated cohort of all 18 vetted apps at Tarnowey Summit; nothing is broken, so the first change is locking the 2027-04-14 09:00 PT lift into every partner's kit and post schedule.

The page's check: kept - nothing to flag

Build the input yourself

Load the engine in node (global.window = global; require("./lckit.js"); require("./lcreply.js")), then:

const K = LaunchKit, R = LaunchReply;
const f = K.form(Object.assign(K.blank(), { name: "Acme", embargo: "2027-03-01 09:00 PT", kits: "yes", quotes: "yes", published: "yes",
  roster: "Alpha | vetted | yes | Gold\nBeta | in review | no |", claims: "40+ vetted apps at launch" }));
// f.cohortRank, f.featureRank, f.rationRank (the ranked menus), f.rosterRows, f.claimRows (each with backed and why), f.gates
// K.noticeMd(f), K.rosterCsv(f), K.claimsCsv(f) - the embargo notice and the tables
const b = K.buildInput(f, "launch");                         // or "program" (R.laneForm(form, "program", launch) fills carry)
const wire = K.toWire(b.input);                              // POST this to /estimate and /run
// then: const reply = R.normalize(R.parseReply(job.output.output), "launch");
// 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="YOUR_TOKEN"   # from https://launch-cohort.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"}
}

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":"launch-cohort"}' | jq -r '.data.token')

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}' 

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": "launch", "operator": "Operator: Quellmont CRM Marketplace
The marketplace and the launch: ...", "roster": "Partner roster (partner | review status | marquee | tier):
- Dialstream | vetted | marquee yes ...", "carry": "", "facts": "The page's checks (...); verdict: the launch claims outrun the gate - fix them first:
- The launch | vetted | fail | ..."}
# - see the input table
api POST /estimate "$(cat input.json)" | jq '.data | {hold_credits, min_credits, model, model_alias, markup_bps, warnings}' 

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 launch-cohort:<task>:<inputHash>:a<attempt> - the lane is part of the key, retry_note is left out of the hash - and its one automatic reformat retry is a new attempt number, named in the page as one extra run. A launch reply carries summary, cohort, claims, reveal, kit, kpis and caveats; a program reply carries summary, featuring, placement, demand_gen, rationing, figures, starved, kpis and caveats. The code below prints the gist of either: the cohort shape and the summary, or each featuring rung and its cadence.

KEY="launch-cohort:$(jq -r .task input.json):$(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 'if .task == "program" then (.featuring[] | "\(.rung): \(.cadence)") 
       else "\(.cohort.shape): \(.summary)" end' reply.json

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: launch-cohort:$(jq -r .task input.json):$(shasum -a 256 input.json | cut -c1-16):a1" --data @input.json