INMB

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).

https://budget.netcope.ch/v1

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.

curl https://budget.netcope.ch/v1/user \
  -H "Authorization: Bearer $INMB_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.

# 1. Send the user to:
https://budget.netcope.ch/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&state=STATE

# 2. Exchange the code for tokens:
curl -X POST https://budget.netcope.ch/oauth/token \
  -d client_id=CLIENT_ID \
  -d client_secret=CLIENT_SECRET \
  -d redirect_uri=REDIRECT_URI \
  -d grant_type=authorization_code \
  -d code=CODE

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.

curl -X POST https://budget.netcope.ch/v1/plans/default/transactions \
  -H "Authorization: Bearer $INMB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"transaction": {"account_id": "ACCOUNT_ID", "date": "2026-10-17",
       "amount": -12500, "payee_name": "Bakery", "memo": "Croissants"}}'

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.

curl "https://budget.netcope.ch/v1/plans/default/transactions?last_knowledge_of_server=1234" \
  -H "Authorization: Bearer $INMB_TOKEN"

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.

import * as ynab from "ynab";

// Same SDK, different base URL
const api = new ynab.API(process.env.INMB_TOKEN, "https://budget.netcope.ch/v1");

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.

{"error": {"id": "404.2", "name": "resource_not_found", "detail": "Resource not found"}}

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.

Start your free trial

INMB is an independent product and is not affiliated with, endorsed by or sponsored by YNAB LLC. YNAB is a trademark of YNAB LLC.