● Beta   Free for every team and project. No card. No caps.
02 · Feature flags · for the calm side of shipping

Flags PMs can flip,
devs can trust.

Group flags into folders. Records inside a folder share the same schema — different values per customer, plan, or region. Read values over HTTP in milliseconds.

Plan entitlements· 5 flags × 4 records
recordmax_seatsssoauditsupport
plan:starter3○ false○ falsecommunity
plan:growth10○ false● trueemail
plan:pro25● true● truepriority
plan:enterprise● true● truededicated
GET /api/projects/:projectId/flags/entitlements?record=cus_8x9k2L{ max_seats: 50 }
01 · GROUP
Folders, not a junk drawer.

A folder is a typed schema. Every flag inside it shares the same fields — boolean, number, enum, string. Approval rules and rollout caps live on the folder.

02 · RECORDS
One schema, many overrides.

Records are rows: a plan tier, a customer, a region. Each record sets values for the folder’s flags. Look up by ID; values fall back to defaults if untouched.

03 · READ
Plain HTTP, no client required.

Read flag values over a small REST surface. Cache however your stack already caches; the API is the contract — nothing more to install.

API · REST
# Look up a record's values for one folder
curl https://api.swisstools.dev/api/projects/$PROJECT_ID/flags \
  -H "Authorization: Bearer $TOKEN" \
  -G --data-urlencode "folder=entitlements" \
       --data-urlencode "record=cus_8x9k2L"

# → 200 OK
# { "max_seats": 50, "sso": true, "audit": true,
#   "support": "dedicated" }

# Read a single flag value
curl https://api.swisstools.dev/api/projects/$PROJECT_ID/flags/checkout-experiment-b \
  -H "Authorization: Bearer $TOKEN" \
  -G --data-urlencode "userId=u_123"   # → true (25% rollout)
Plain HTTP, no client required.

Two endpoints cover the common cases: /flags returns every value for a record (your customer's plan, region, tenant); /flags/:key returns a single flag, with percentage rollouts and A/B targeting resolved server-side.