Programmatic API
v1 · stable contract · JSON in / JSON out

Give your product a scoring signal.

Put Helmslee’s 10-axis scorecard behind your own workflow. Authenticate once, send one strict JSON body, and receive a structured response your product can render, route, or cache.

Endpoint snapshot

v1
Request
POST /api/v1/score
Authentication
x-api-key header
Budget
60 requests / key / minute

Designed for partner surfaces that need the number and the underlying axes—not another dashboard to maintain.

The contract

Small surface area. Useful signal.

The partner endpoint keeps the integration deliberately narrow. The request is easy to form, the response is typed for a scorecard UI, and authentication never travels in the body.

See request, response, and error details
Endpoint
POST /api/v1/score
Authentication
Send the plaintext key in the x-api-key header.
Body
Send exactly { "input": "…" }. The schema is strict and rejects unknown keys.
Rate limit
60 requests per key per minute. The window is per key, not per IP.
01Authenticate
02POST JSON
03Render the score

Try /v1/score

Make the first call in under a minute.

The label is the product surface; the live handler is /api/v1/score. Here is the smallest useful request and a representative 200 response. Values are illustrative; field names and ranges are the contract.

Request

One strict body, one auth header.

curl
curl --request POST \
  --url https://helmslee.polsia.app/api/v1/score \
  --header "content-type: application/json" \
  --header "x-api-key: hlms_<your-key>" \
  --data '{"input":"A vertical SaaS for independent venue owners."}'

Replace hlms_<your-key> with the plaintext key from the key-management surface. It is shown once.

Response

Representative 200 JSON.

ScoreV1Response
{
  "score": 72,
  "breakdown": {
    "axes": [
      {
        "key": "demand",
        "label": "Demand",
        "score": 8,
        "verdict": "pass",
        "rationale": "A clearly named buyer and durable search intent are present.",
        "sourceUrl": "https://trends.google.com/"
      },
      {
        "key": "competition",
        "label": "Competition",
        "score": 6,
        "verdict": "neutral",
        "rationale": "Existing tools leave room for a narrower wedge.",
        "sourceUrl": "https://www.g2.com/"
      },
      {
        "key": "profitability",
        "label": "Profitability",
        "score": 7,
        "verdict": "pass",
        "rationale": "The buyer has a clear economic reason to pay.",
        "sourceUrl": "https://www.bls.gov/oes/"
      },
      {
        "key": "scalability",
        "label": "Scalability",
        "score": 6,
        "verdict": "neutral",
        "rationale": "A repeatable workflow supports a focused product.",
        "sourceUrl": "https://developer.mozilla.org/"
      },
      {
        "key": "automation",
        "label": "Automation",
        "score": 8,
        "verdict": "pass",
        "rationale": "The core work is structured enough to automate.",
        "sourceUrl": "https://developers.google.com/"
      },
      {
        "key": "retention",
        "label": "Retention",
        "score": 7,
        "verdict": "pass",
        "rationale": "The recurring workflow gives the buyer a reason to return.",
        "sourceUrl": "https://www.g2.com/"
      },
      {
        "key": "seo",
        "label": "SEO surface",
        "score": 6,
        "verdict": "neutral",
        "rationale": "The niche has useful language to build around.",
        "sourceUrl": "https://search.google.com/search-console/about"
      },
      {
        "key": "virality",
        "label": "Virality",
        "score": 4,
        "verdict": "fail",
        "rationale": "The first distribution loop needs a deliberate design.",
        "sourceUrl": "https://www.reddit.com/"
      },
      {
        "key": "startupCost",
        "label": "Startup cost",
        "score": 8,
        "verdict": "pass",
        "rationale": "A narrow first release can launch with modest spend.",
        "sourceUrl": "https://www.shopify.com/"
      },
      {
        "key": "technicalDifficulty",
        "label": "Technical difficulty",
        "score": 6,
        "verdict": "neutral",
        "rationale": "The first version is achievable with a focused surface.",
        "sourceUrl": "https://developer.mozilla.org/"
      }
    ],
    "winnabilityScore": 68,
    "winnabilityBreakdown": {
      "signals": [
        { "key": "incumbentStrength", "label": "Incumbent strength", "score": 7, "verdict": "pass" },
        { "key": "switchingCost", "label": "Switching cost", "score": 6, "verdict": "neutral" },
        { "key": "asymmetricAdvantage", "label": "Asymmetric advantage", "score": 7, "verdict": "pass" },
        { "key": "structuralLiability", "label": "Structural liability", "score": 6, "verdict": "neutral" }
      ],
      "score": 68,
      "verdict": "pass"
    }
  },
  "recommendations": [
    {
      "axis": "virality",
      "verdict": "fail",
      "message": "Improve Virality — this axis is below the pass bar."
    }
  ]
}

Browser checkpoint

Want to feel the scorecard before wiring it into your product?

Try the same engine in-browser, then bring the result shape back to your own surface.

Try the score engine in-browser

Ready for the handoff?

Put the score where your users already work.

Start with a key, skim the complete contract, and ship the first request into your own workflow.