NEWRace-safe redemptions — now generally available

Promo codes,infrastructure included.

Issue, throttle, and redeem promo codes from your mobile app with one HTTP call. Per-user limits, atomic counters, instant analytics — without the lock-and-counter scar tissue.

5,000 redemptions/mo freeSDK-less integrationSOC 2 Type II
Powering campaigns at
Lumen StudioFieldnoteAtlas LabsHalftoneRoamVolt MobileCitrine
// Built for mobile teams

Everything you wished you didn't have to build. All the parts that make promo codes hard.

Atomic counters

Lock-free redemption uses Postgres advisory locks + SKIP LOCKED. Two phones tapping at once never double-spend a single-use code.

~32msp95 redemption latency

Per-user limits

Cap redemptions by the user_id your client sends. One-per-user, three-per-user, or per-cohort — enforced server-side.

1 → ∞caps per code or batch

Live analytics

Redemptions stream into your dashboard the moment they happen. Top codes, sparklines, per-IP and per-user drilldowns — no warehouse, no waiting.

< 500msdashboard freshness

Bulk batches

Spin up 100,000 unique codes from a prefix + length in seconds. Capacity math live, CSV download one click, instantly attributable per influencer or partner.

100k codesin < 4s

Edge-routed API

One endpoint, served from 14 regions. Your South African users hit Cape Town. Your Tokyo users hit Tokyo. No SDK wrapper, no platform-specific code.

14regions, anycast

Publishable + secret keys

Two key kinds, one model. Ship publishable in your app — it can only redeem. Keep secret on your server — it manages everything. Rotate in two clicks.

0secret keys exposed in clients
12.4M
Redemptions processed
99.99%
API uptime, last 90d
~32ms
p95 redemption latency
2.1k
Mobile apps integrated
// Integrate

One endpoint. Every platform.

Promocodes is just HTTP. Drop a publishable key into your app, call /api/v1/redeem with the code and user id, and we handle the rest.

Pick a tab below — Swift, Kotlin, React Native, or raw curl. No SDK to update. No platform-specific code paths.

  • Returns merchant-defined JSON payload on success
  • Structured error codes — expired, limit_reached, unknown_code
  • Atomic redemption — concurrent taps never double-spend a single-use code
// iOS — Swift
let body = ["code": code, "user_id": userID]
var req = URLRequest(url: URL(string: "https://api.promocodes.dev/api/v1/redeem")!)
req.httpMethod = "POST"
req.setValue(publishableKey, forHTTPHeaderField: "X-Api-Key")
req.httpBody = try JSONSerialization.data(withJSONObject: body)

let (data, _) = try await URLSession.shared.data(for: req)
let result = try JSONDecoder().decode(Redemption.self, from: data)
// Pricing

Simple plans. Pay for what you ship. Free until you outgrow it.

Start free with 500 codes. Upgrade when a campaign needs more — no per-seat fees, no platform tax.

Free
$0/mo

Test the API and ship a small drop.

  • 500 codes
  • 300 captured emails
  • 1 project
  • Community support
Start free
Most popularPro
$9/mo

For shipped apps running active campaigns.

  • 10,000 codes
  • 7,500 captured emails
  • 5 projects
  • CSV export
  • Email support
Start Pro
Studio
$29/mo

For indie studios running multiple drops.

  • 50,000 codes
  • 25,000 captured emails
  • Unlimited projects
  • Custom domain
  • Email support, 1-day SLA
Start Studio
Scale
Custom

For high-volume apps and global drops.

  • Unlimited codes + emails
  • Dedicated infra
  • 99.99% uptime SLA
  • Slack + 30-min response SLA
Talk to sales

Issue your first code in two minutes.

Sign up, generate a publishable key, paste one HTTP call into your app. Your next promo campaign goes out tonight.