Why developers pick Norbelys: the API-first case, with receipts
Not 'developers love APIs' — the specific, checkable reasons a technical buyer picks Norbelys: one contract, 83 operations, four SDKs, a CLI, and MCP.
By Norbelys Chirinos, Co-founder
Founder-reviewed ·How we research and correct articles
“Developers love a good API” isn’t a reason — it’s a slogan every product page uses. The actual reasons a technical buyer picks one cold-email platform over another are more specific than that, and they’re checkable: does the thing you’d script against actually exist, does it match what the dashboard does, and does it stay in sync when the product changes. Here’s what that looks like concretely at Norbelys.
The claim: one contract, everything else generated
Most “API-first” claims mean “we have an API.” Norbelys’s version is narrower and more testable: there’s exactly one typed contract describing the product’s surface, and the REST API, the four official SDKs, the CLI, and the MCP server are all generated from that same document — not four separate implementations that happen to agree today.
That matters less as a philosophy and more as a guarantee: a field rename or a new operation shows up in the OpenAPI spec, the regenerated SDKs, and the CLI’s help output in the same release, because there’s nothing to hand-sync after the fact. There’s one name per field, chosen from Schema.org vocabulary where one already exists, and it’s the same name in every surface you touch.
Reason one: the dashboard has no private API
A common failure mode in “API-first” products is a public API that’s a second-class citizen — missing endpoints the UI quietly relies on, or a UI that was clearly built first and the API bolted on after. Norbelys’s public API is the same REST API the dashboard itself runs on — base URL, 83 operations, described in a single OpenAPI 3.1 spec. There’s no gap between “what you can click” and “what you can script,” because they’re the same surface.
Practically, that means anything a human can do in the app — enroll a contact, launch a program, pause a sender, pull analytics — a script can do too, with the same guarantees and the same field names.
Reason two: pick your runtime, not a second-class client
Norbelys ships four official SDKs, all generated from the same spec:
@norbelys/sdk on npm, norbelys on PyPI, plus Go and Ruby. That means
there’s no “the real one is TypeScript, the rest are afterthoughts” trap —
the 83 operations behind each are identical, because they’re generated from
the identical contract, not hand-ported between languages by different
teams on different release schedules.
| Situation | What you reach for |
|---|---|
| Edge Worker or serverless function | Node/TypeScript SDK — runs natively on Workers, Deno and Node |
| Data script, notebook, or scheduled job | Python SDK — fits directly into pandas/Jupyter/cron workflows |
| High-throughput backend service | Go SDK — compiled, low overhead, concurrent by default |
| Existing Rails or Ruby app | Ruby SDK — idiomatic error handling, snake_case conventions |
| A language none of the four cover | The REST API directly, or generate a client from the OpenAPI spec |
The decision isn’t “which SDK is better” — it’s “where does the calling code already run,” which is a much easier question to answer honestly.
Reason three: the CLI and MCP aren’t separate products
A lot of platforms treat command-line and AI-agent access as an afterthought
bolted onto the “real” API years later, with its own inconsistent naming and
gaps in coverage. The norbelys CLI and the MCP server at
mcp.norbelys.com/mcp are both generated from the same contract
as the REST API and the SDKs — so a script running through the CLI, an agent
calling Norbelys over MCP, and a backend service using the Go SDK are all
hitting the identical operation set, with the identical field names.
That matters specifically for anyone building agent workflows in 2026: an AI agent calling Norbelys through MCP doesn’t get a stripped-down or differently-shaped version of the product — it gets the same 83 operations a human developer would call directly, described the same way.
Reason four: typed errors and cursor pagination, not ad-hoc conventions
Two smaller but concrete signals of API-first design, both checkable against the actual spec rather than taken on faith: every operation returns typed, predictable error shapes instead of a grab-bag of status-code conventions that differ by endpoint, and every list operation uses consistent cursor pagination rather than a mix of offset, page-number, and cursor styles across different resources. Neither is exotic on its own — together they’re the difference between an API you can build generic tooling against and one where every integration needs its own special-case error handling.
Reason five: authentication built for both humans and agents
The auth story is a small detail that reveals a lot about whether a platform
was designed API-first or had an API retrofitted. Norbelys supports two paths
deliberately: an org-scoped API key (ak_…) for headless callers and CI
jobs, sent as a plain Authorization: Bearer header, and OAuth 2.1
discovery for interactive agents that need to register themselves rather
than have a human paste in a secret. Both are documented in one place
(/auth.md), and both authenticate against the identical operation set —
there’s no reduced “agent tier” of the API with fewer capabilities than the
key-based one.
That two-path design isn’t incidental. A platform bolting API access onto an existing UI-only product usually ships one crude auth mechanism, because it was built to satisfy one use case (a developer with a key) rather than anticipating that autonomous agents would eventually need to authenticate themselves without a human in the loop.
What this looks like next to a UI-only competitor
The clearest way to see the difference is to try the check yourself: pick a UI-only cold-email tool and search its public docs for a REST endpoint matching a dashboard feature you use daily — pausing a sender, bulk-updating suppressions, filtering analytics by a custom window. Often the answer is a support ticket or “that’s on our roadmap,” not a working call. Compare that against Norbelys vs. the rest of the market and the pattern holds: platforms built UI-first tend to treat the API as a feature to eventually add, not the foundation everything else sits on.
What this actually saves you
None of this is abstract elegance. It’s fewer integration bugs from a field that’s named differently in the docs than in the actual response, fewer support tickets from “the API doesn’t support what the UI does,” and no migration cost when you outgrow no-code automation and need a real script — because the script and the no-code layer were always calling the same contract.
The honest limits
API-first isn’t free of trade-offs. It means Norbelys invests engineering time in contract discipline and generation tooling instead of, say, a wider library of pre-built no-code templates — if your team has zero developer capacity and wants the richest possible click-only workflow builder, that’s a different set of priorities than the ones this design optimizes for. And generated SDKs, by nature, favor consistency over language-specific idiosyncrasy — they’re deliberately similar to each other rather than each one reinventing conventions to feel maximally native.
If you do have any developer capacity at all — even just someone comfortable scripting a CSV import or wiring a Slack/HubSpot/Pipedrive integration — the payoff is that nothing you build against Norbelys today becomes throwaway work when the product adds a feature tomorrow. The contract doesn’t change shape under you; it just grows.
Read the full developer portal for the base URL, the spec, the SDKs and the CLI install command, or start with why the API and the UI never drift apart for the broader argument this post is one instance of. If you’re weighing Norbelys against a specific incumbent rather than the category, the pricing page still applies the same way — the API is included at every tier, not sold as a developer add-on above a certain plan.