A YNAB-compatible API
Same endpoints, same JSON, same errors. If your code talks to the YNAB API, it can talk to INMB — change the base URL and the token.
Base URL
All endpoints live under https://budget.netcope.ch/v1 and mirror https://api.ynab.com/v1 path for path. Plan resources are available under /v1/plans/{plan_id}/… and under the legacy /v1/budgets/{budget_id}/… paths. Wherever a plan ID is expected, you can also use last-used or default.
Responses use the same {"data": …} envelope, field names and *_formatted / *_currency fields as YNAB. Amounts are in milliunits (12.50 = 12500).
Personal access tokens
For your own scripts: in INMB, open Settings → Developer Settings and create a token. It’s shown once — store it like a password. Send it as a bearer token.
OAuth 2.0
Building an app for other INMB users? Register an OAuth application under Settings → Developer Settings. INMB supports the same flows as YNAB: authorization code (with refresh tokens) and implicit grant, plus the read-only scope. Access tokens are valid for 2 hours; refresh tokens rotate on every use.
Example: create a transaction
Payees are matched by name or created, transfers create the matching transaction in the other account, and import_id duplicates are skipped — exactly as in YNAB.
Delta requests
Pass last_knowledge_of_server to get only what changed. Plans migrated from YNAB continue from YNAB’s server_knowledge, so a client switching from api.ynab.com keeps syncing without a full reload.
Switching an existing integration
Change the base URL and the token — nothing else. Most YNAB clients let you set the base URL; the official JavaScript SDK, for example, takes it as the second constructor argument.
Rate limits and errors
200 requests per rolling hour per token, like YNAB. Every response carries an X-Rate-Limit header (used/limit); over the limit you get HTTP 429. Errors use YNAB’s format and IDs.
Requests that load a whole plan — the full plan export (GET /plans/{plan_id} without last_knowledge_of_server) and transaction lists with a since_date more than 400 days back — are queued when several arrive at once. If the queue is full or a request waits longer than 30 seconds, INMB answers HTTP 503 (service_unavailable) with a Retry-After header: wait that many seconds and try again. Delta requests are never queued.
If the account’s trial or subscription has ended, every API endpoint (including /v1/user) answers 403 with YNAB’s own IDs: 403.2 trial_expired or 403.1 subscription_lapsed.
Reference and differences
Because the endpoints match, YNAB’s API documentation at https://api.ynab.com is the reference for every endpoint, parameter and field. There are no known differences in endpoints or payloads. The one INMB-specific behaviour is the queue for whole-plan requests described above (HTTP 503 with Retry-After). If you find a difference, it’s a bug — please let us know (contact details are in the imprint).
INMB is not affiliated with YNAB LLC. YNAB is a trademark of YNAB LLC.
INMB is an independent product and is not affiliated with, endorsed by or sponsored by YNAB LLC. YNAB is a trademark of YNAB LLC.