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
- Authentication: rotating and revoking keys.
- Errors and rate limits: what a
403or429means. - Costs and allocations: attach a cost to the sources it hits.
- Use it from Claude.