Skip to main content
The LLM API sends your prompts to ChatGPT and Gemini with country-level targeting, then hands you the rendered answer through three plain REST endpoints. A credit is spent only when a query actually succeeds - a failed one refunds itself automatically, no ticket required.

Quickstart flow

Four steps, start to finish - from copying your key to reading back an answer.
1

Get your API key

Your key lives in the dashboard’s Profile section. Every call below sends it as a Bearer-style header, prefixed x-api-key instead of Bearer.dashboard → Profile
2

Submit your questions

One call can carry several prompts across several platforms and up to 10 locations - one row is created per question × platform × location.POST /submit/
3

Poll for results

Every row starts pending. Poll the same batch until each one turns success or failed.GET /results/{request_id}/
4

Read the answer

A successful row’s raw_response.text is the rendered answer. Failed rows refund their own credit.raw_response.text
This is the whole surface. Three endpoints, total: check your balance any time before you submit, submit a batch, poll it. There’s no fourth thing to learn.

Authentication

One key, one header - but note the prefix isn’t Bearer.

Where to get it

Your API key is shown in the Profile section of the NodeMaven dashboard - the same key used across NodeMaven’s base API, not a separate token per product.

How to send it

Authorization: x-api-key <your key> on every request. Note the literal prefix is x-api-key, not Bearer.
Purchase a credit pack before you integrate. All three endpoints below - including balance - return 403 until your account has at least one completed credit-pack purchase. Free monthly credits alone don’t unlock the API; that gate only applies to the dashboard’s own GEO page.

Errors and status codes

The body shape depends on why a request failed - a validation problem reports field-by-field, an operational one reports a single message.

Limits

Defaults below - ask support if your workload needs more headroom.

Platforms and targeting

Every question is sent to one or more platforms, aimed at one or more locations (each with a required country and, optionally, a region and city). perplexity is still a valid value in the request schema, but the platform is currently unavailable - leave it out of platforms for now. It’ll be listed as Available here once that changes.
Not every country is available. country is a required, lowercase, 2-letter ISO code - but a small set of countries return a 400 because the underlying models aren’t offered there at all. Check the response’s country field for the exact message rather than hardcoding a list, since availability is enforced server-side and can change.
region and city are both optional and both normalized for you - send a region’s display name or its code, and a city in any case, and the request still resolves correctly. Each row in the response carries the exact location it ran against, so a multi-location submit can be split back apart client-side by grouping on country/region/city.

Credits

One credit is spent per question × platform pair, upfront - and refunded automatically if that specific row fails.

GET /api/v2/base/llm/balance/

string
required
x-api-key <your key>
Your current balance. Also grants this month’s free credits automatically, the first time you check in a given calendar month - nothing to request separately.
200 Response

Queries

Submit a batch, then poll the same request_id until every row leaves pending.

POST /api/v2/base/llm/submit/

string
required
x-api-key <your key>
Charges questions × platforms credits and returns immediately - every row starts pending, nothing here is the final answer yet.

GET /api/v2/base/llm/results/{request_id}/

string
required
x-api-key <your key>
Every row from one submit, by its shared request_id. Call this again a few seconds later for whatever’s still pending.
200 Response
A failed row’s credit has already been refunded by the time you see it - raw_response stays null, there’s nothing else to read.
raw_response.sources is best-effort, not guaranteed. ChatGPT populates it when (and only when) it actually ran a web search for that answer - plenty of prompts never trigger that, and get an empty [] back, which is normal, not an error. Gemini only ever returns citations through this same field (never inline in text), and does so noticeably less often than ChatGPT - an empty list from Gemini isn’t a sign anything’s broken, and shorter or plainer answers from Gemini than ChatGPT are also expected, not a bug.

Polling for results

There’s no webhook - results only ever arrive by asking again.

How long it takes

Most rows resolve in 20 to 90 seconds, occasionally longer - a real Chrome session is rendering the answer on the other end. Poll every few seconds rather than continuously.

The three states

pending → still rendering. success → read raw_response.text. failed → already refunded, nothing to retry manually.

Billing timing

Credits are charged at submit, not on success - a row that later fails refunds itself the moment it’s marked failed, before you even poll.

Batching platforms

One request_id can hold rows across every platform you asked for - poll it once and read whichever rows have already turned.

Full walkthrough

Every step above, chained into one script: check your balance, ask two platforms the same question, wait it out, then read both answers.

For any questions contact support@nodemaven.com.