Quickstart

Create a token, make a call, and page through your investors — then, if you like, hand the same access to an AI assistant.

1. Create a token

In Helm Core OS, open Settings → API Suite and choose Create token.

  • Pick Personal to try things out — calls run as you, within your own permissions.
  • Give it the investors:read scope for this guide, and an expiry.
  • Copy the token. It starts with hlm_ and is shown once.

Not sure which kind of token you need for production? The authentication guide asks two questions and tells you.

export HELM_API_KEY="hlm_…"
export HELM_BASE="https://your-org-domain/kong/core/api/v2"

your-org-domain is your organisation's platform host — the address your users sign in at. Sandbox and production tenants each have their own host and their own tokens.

2. Check you're connected

GET /ping needs a valid token but no scope, so it's the quickest way to check your setup:

curl -i "$HELM_BASE/ping" -H "Authorization: Bearer $HELM_API_KEY"

A 200 means you're in. A 401 means the token is missing, mistyped, revoked or expired; a 403 with ip_blocked means the token has an IP allowlist that doesn't include you.

3. List your investors

curl "$HELM_BASE/investors?limit=5&fields=first_name,last_name,email,status" \
-H "Authorization: Bearer $HELM_API_KEY"

Lists are cursor-paginated: pass meta.next_cursor back as cursor to get the next page, until it's null. fields trims the response to what you need. See Requests for sorting, filtering, idempotent retries and dry runs.

4. Page through everything

async function* allInvestors() {
let cursor: string | null = null
do {
  const url = new URL(`${process.env.HELM_BASE}/investors`)
  url.searchParams.set('limit', '100')
  if (cursor) url.searchParams.set('cursor', cursor)

  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.HELM_API_KEY}` },
  })
  if (res.status === 429) {
    await new Promise((r) => setTimeout(r, Number(res.headers.get('retry-after') ?? 1) * 1000))
    continue
  }
  if (!res.ok) throw new Error((await res.json()).error.message)

  const page = await res.json()
  yield* page.data
  cursor = page.meta.next_cursor

} while (cursor)
}

for await (const investor of allInvestors()) console.log(investor.email)

5. Optional: hand it to an AI assistant

The same access works over MCP. In Claude Code:

claude mcp add --transport http helm "$HELM_BASE/mcp"

Run /mcp to sign in, then ask "How many active investors do we have, and who joined this month?" The MCP guide covers Claude, Cursor, VS Code and custom clients.

Next steps

  • Authentication — organisation tokens, OAuth2 clients, and keeping secrets safe.
  • Scopes — what each scope unlocks.
  • Webhooks — get told when things change instead of polling.
  • Rate limits and Errors — staying within your budget, and the error envelope.