Income Graph Developers

Quickstart

Make your first Income Graph API call in under a minute.

You need an active Income Graph Cloud subscription and at least one graph synced to the cloud. The REST API lives at https://api.incomegraph.net/v1 and the MCP server at https://mcp.incomegraph.net/mcp.

1. Create an API key

Sign in, open your account page, and choose Create API key (leave access on Read only unless you want to write; step 4 needs Read and write). Copy the key when it appears: it is shown once and only a hash is stored. Keys start with igk_.

2. Make a call

export INCOMEGRAPH_API_KEY=igk_paste_your_key_here

curl -s https://api.incomegraph.net/v1/me \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY"

You should see your key’s name, your subscription status and your limits:

{
  "key": { "id": "key_3f9a1c7e", "name": "laptop", "scope": "read", "prefix": "igk_mzxw6", "createdAt": "2026-10-22T20:15:00Z" },
  "subscription": { "status": "active" },
  "limits": { "requestsPerMinute": 60, "requestsPerDay": 5000, "writesPerMinute": 20 }
}

3. Read your graphs

List them, then ask for the computed results of one:

curl -s https://api.incomegraph.net/v1/graphs \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY"

curl -s https://api.incomegraph.net/v1/graphs/GRAPH_ID/summary \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY"

4. Create, change and delete a graph

Writes need a key created with Read and write access. Create a graph with one $100,000-a-year income source (the Idempotency-Key makes a retried request safe):

curl -s -X POST https://api.incomegraph.net/v1/graphs \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"Consulting","targetAnnualRevenue":150000,"sources":[{"id":"1","type":"recurring","name":"Consulting retainer","amount":100000,"units":1,"period":"annual","fees":[]}]}'

The response is the saved graph plus its computed summary. Note its id and updatedAt, then rename it, quoting that updatedAt as expectedUpdatedAt so you cannot overwrite a newer edit:

curl -s -X PATCH https://api.incomegraph.net/v1/graphs/GRAPH_ID \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedUpdatedAt":"UPDATED_AT","name":"Consulting 2027"}'

Deleting also needs the latest updatedAt (from the update response) and returns the deleted graph:

curl -s -X DELETE "https://api.incomegraph.net/v1/graphs/GRAPH_ID?expectedUpdatedAt=UPDATED_AT" \
  -H "Authorization: Bearer $INCOMEGRAPH_API_KEY"

Open the app and the graph appears, changes and disappears as you go. With a read-only key these calls return 403 insufficient_scope. See Errors and rate limits for conflicts and retries.

The same call in code

const res = await fetch("https://api.incomegraph.net/v1/graphs", {
  headers: { Authorization: `Bearer ${process.env.INCOMEGRAPH_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.code);
console.log((await res.json()).data);
import os, requests

r = requests.get(
    "https://api.incomegraph.net/v1/graphs",
    headers={"Authorization": f"Bearer {os.environ['INCOMEGRAPH_API_KEY']}"},
    timeout=10,
)
r.raise_for_status()
print(r.json()["data"])
req, _ := http.NewRequest("GET", "https://api.incomegraph.net/v1/graphs", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("INCOMEGRAPH_API_KEY"))
resp, err := http.DefaultClient.Do(req)

Try it in the browser

The API reference is a Swagger UI console, and it works on a phone: tap Authorize, paste your key, pick an endpoint, tap Try it out, then Execute. The key stays in this page until you close or reload it; it is never saved. Requests are real, so use a read-only key unless you mean to change a graph.

Next