Skip to main content

Nubint API documentation

Authentication, endpoints, and response formats for the Nubint API. One key covers manuscript review, scientific figures, and evidence synthesis.

Overview

Every request is JSON over HTTPS. Manuscript checks, paper search, and data charts return their result in the response. Work that takes minutes, such as figures or a literature review, returns a taskId, and you read the result from the task status endpoint.

Base URLhttps://api.nubint.ai/api/v1

Response fields use camelCase, with two exceptions: bibliographic data (csl) keeps standard CSL-JSON keys such as container-title and DOI, and issue params keep snake_case keys.

Authentication

Send your API key in the X-API-Key header on every request. Not the Authorization header.

Header
X-API-Key: nbk_live_...

Create keys in the Nubint app under Settings → API/MCP. Keys start with nbk_live_ and are shown only once. We store only a hash, so a lost key has to be replaced.

Each account can have up to 10 active keys. If a key may have leaked, revoke it on the same screen; revoked keys are rejected immediately.

Every route needs a Starter, Pro, or Max plan; a key from a free account gets 403. The key stays, and it works as soon as you subscribe. Tools that use no credits (paper search, library, saving a manuscript, reading and suggesting edits to documents, task lookups) and reference verification deduct no credits.

Never put a key in browser code or a public repository. Use it only from a server or a local environment variable.

Nubint

Reference verification

POST/developer/review/reference-verification

Checks each entry of a reference list against a scholarly index to see whether it points to a real work. No language model is called, so the same input gives the same result. If your references live in a `.bib` file, you can send its contents as `referencesBibtex` instead (the server converts each entry into a reference line).

Request

referencesstring[]

Array of reference strings: the entries of the References section, one per string, not the body text. Up to 100. Include DOIs when you have them; matching gets exact.

curl -X POST https://api.nubint.ai/api/v1/developer/review/reference-verification \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "references": [
      "Spiegel, K., Leproult, R., & Van Cauter, E. (1999). Impact of sleep debt on metabolic and endocrine function. The Lancet, 354(9188), 1435-1439.",
      "Anderson, R. T., & Liu, M. (2023). Chronotype misalignment and cognitive load in higher education. Educational Neuroscience Quarterly, 11(4), 501-519."
    ]
  }'

Response

200 OK
{
  "results": [
    {
      "text": "Spiegel, K., Leproult, R., & Van Cauter, E. (1999). ...",
      "status": "verified",
      "basis": "title_exact",
      "paper": {
        "canonicalId": "https://doi.org/10.1016/s0140-6736(99)01376-8",
        "csl": {
          "type": "article-journal",
          "title": "Impact of sleep debt on metabolic and endocrine function",
          "container-title": "The Lancet",
          "DOI": "10.1016/s0140-6736(99)01376-8"
        }
      },
      "csl": null,
      "matchedTitle": "Impact of sleep debt on metabolic and endocrine function",
      "nearMissTitle": null
    },
    {
      "text": "Anderson, R. T., & Liu, M. (2023). ...",
      "status": "off_index",
      "basis": "parsed",
      "paper": null,
      "csl": {
        "type": "article-journal",
        "title": "Chronotype misalignment and cognitive load in higher education",
        "container-title": "Educational Neuroscience Quarterly"
      },
      "matchedTitle": null,
      "nearMissTitle": null
    }
  ],
  "summary": {
    "total": 2,
    "verified": 1,
    "uncertain": 0,
    "offIndex": 1,
    "unparseable": 0,
    "needsReview": 1
  }
}
status

The verdict. See Verdict values below.

basis

Why that verdict: identifier (DOI or other ID matched), title_exact, title_strong, title_partial, parsed (not in the index; metadata read from the string), none.

paper

Metadata and identifiers of the matched paper. Present only for verified and uncertain.

csl

Metadata parsed from the reference string (CSL-JSON) for works outside the index. Present only for off_index.

matchedTitle

Title of the accepted candidate. For uncertain, lets the user compare it with their own reference.

nearMissTitle

Title of a candidate rejected for insufficient overlap (off_index only). A clue when the manuscript's title is mistyped. It is not an accepted match, so never cite it as one.

summary

Totals. needsReview counts everything that isn't verified, i.e. what the user should check.

Nubint

AI-writing detection

POST/developer/review/ai-detection

Judges whether text reads as AI-written, using an independent detection model. It judges paragraph by paragraph and, in flagged paragraphs, ranks the sentences that drove the call.

safe does not mean a human wrote it. Thresholds are set conservatively to avoid flagging human writing, so more AI text is missed than caught. A flag is a signal; no flag means unknown. No probability is returned.

Request

textstring

Text to check. Separate paragraphs with blank lines. Up to 200,000 characters.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/review/ai-detection \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "text": "Full manuscript text, paragraphs separated by blank lines..." }'

Response

200 OK
{
  "verdict": "caution",
  "checked": 9,
  "flagged": 2,
  "creditsCharged": 40,
  "issues": [
    {
      "code": "possibly",
      "category": "possibly",
      "anchor": "The sentence in your manuscript that drove the flag.",
      "reference": null,
      "params": {
        "lang": "en",
        "rank": 1,
        "rank_total": 2,
        "unit_tokens": 142,
        "reasons": [
          { "code": "sentence_contribution", "rank": 1, "total": 2 }
        ]
      },
      "message": null
    }
  ]
}
verdict

Document-level verdict: safe, caution, risk, or inconclusive.

checked

Number of paragraphs judged.

flagged

Number of paragraphs given a band.

creditsCharged

Credits charged for this request. 0 for inconclusive.

issues

Flagged sentences. code is the band (likely or possibly), anchor is the sentence, and params.rank is its rank within the paragraph.

If the detection service doesn't respond, this endpoint returns 502. It never returns safe without a result.

Nubint

Full manuscript check

POST/developer/review/manuscript-check

Send the text and references in one request and get three sections back: reference verification, AI-writing detection, and source quality. References are matched once, so both reference sections look at the same papers. If your references live in a `.bib` file, you can send its contents as `referencesBibtex` instead (the server converts each entry into a reference line).

Request

textstring

Manuscript text. If empty, AI-writing detection and source quality are skipped. Up to 200,000 characters.

referencesstring[]

Array of reference strings. If empty, reference verification and source quality are skipped. Up to 100.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/review/manuscript-check \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Full manuscript text...",
    "references": [
      "Spiegel, K., Leproult, R., & Van Cauter, E. (1999). Impact of sleep debt on metabolic and endocrine function. The Lancet, 354(9188), 1435-1439.",
      "Anderson, R. T., & Liu, M. (2023). Chronotype misalignment and cognitive load in higher education. Educational Neuroscience Quarterly, 11(4), 501-519."
    ]
  }'

Response

An example where AI-writing detection failed: the other sections still return results (some fields omitted).

200 OK
{
  "citations": {
    "status": "ok",
    "reason": null,
    "summary": { "total": 2, "verified": 1, "offIndex": 1, "needsReview": 1, ... },
    "results": [ ... ]
  },
  "aiDetection": {
    "status": "failed",
    "reason": "TimeoutError: detection service did not respond",
    "verdict": null,
    "checked": 0,
    "flagged": 0,
    "issues": []
  },
  "sourceQuality": {
    "status": "ok",
    "reason": null,
    "checked": 1,
    "issues": []
  },
  "creditsCharged": 30
}
*.status

One per section: ok (checked), failed (outage on our side; retry), or skipped (no input). failed and skipped come with a reason.

sourceQuality

Checks verified references only: retractions (retracted_source), expressions of concern (expression_of_concern), preprints (preprint_source, preprint_has_published_version), rarely cited sources (low_citation_source), and more.

creditsCharged

Credits charged for this request. Only successful sections are billed; failed, skipped, and inconclusive AI detection cost 0.

Nubint

Verdict values

Reference verdicts (status)

verified

Confirmed in the index: a DOI or other identifier, or the title, matches.

uncertain

A candidate was found but the title only partly matches. Compare it with matchedTitle.

off_index

Couldn't be confirmed with this index. It may be a book, statute, or closed-access journal that the index never had. It does not mean the work doesn't exist.

unparseable

A line that can't be read as a reference (no title, year, or author found).

AI-writing verdicts (verdict)

safe

This check found no AI-writing signs. Not a guarantee of human authorship.

caution

Some paragraphs show AI-writing signs. Review the flagged sentences.

risk

Several paragraphs show clear AI-writing signs.

inconclusive

Not enough prose to judge (too short, or mostly tables and lists). It does not mean the text isn't AI-written.

Nubint

Issue object

Issues from AI-writing detection and source quality share one shape.

code

A stable identifier. Pick your UI wording from this value.

anchor

The sentence in the manuscript. In author-year (e.g. APA) manuscripts, source-quality issues may have no anchor; use reference to identify the paper.

anchorStart

Where anchor starts in the text you sent. When the same sentence appears twice, a string search finds the first one — use this offset when you add a comment or highlight in the document. null when the position could not be determined. Counted in Unicode code points, which differ from JavaScript string indexes (UTF-16) for characters such as emoji.

anchorEnd

Where anchor ends (anchorStart + anchor length).

reference

Identifier (canonicalId) of the paper the issue is about.

params

Values for rendering the message (reference number, citation count, rank, and so on).

message

Issue text in the user's language, present only when the check produced one.

Nubint Figure

Figure generation and editing

POST/developer/figure/start

Draws a figure from a description, or changes one you already have. It starts a task and returns a taskId at once; read the result from the task status endpoint. The figure is also placed on the project canvas (url in the response).

Request

promptstring

What to draw, how to lay it out, and the labels. Write labels in the language they should appear in. Required for generate and edit.

actionstring

What to do: generate (default), edit, recolor, remove_background, white_background, change_ratio, upscale, to_svg, or to_pptx. Anything other than generate works on an existing figure.

kindstring

The kind of figure to draw from scratch: illustration (default; illustrations and schematics) or flowchart (flowcharts and diagrams made of boxes, arrows, and text).

projectIdstring

The project to place the result in. Leave it empty to create a new project; pass the same value again to keep results on one canvas.

baseImageUrlstring

The imageUrl of the figure to change. If empty, the most recent figure in projectId is used.

stylestring

Drawing style: flat, 2.5d, 3d, sketch, line-art, or hand-drawn.

palettestring

Color palette. Required when action is recolor.

ratiostring

Aspect ratio, such as 16:9, 1:1, or 4:3. Required when action is change_ratio.

upscaleTargetstring

Target size when action is upscale: 2k, 4k, or 8k.

attachmentsstring[]

Array of fileUrl values for files that supply the figure's content. Upload them first through /developer/figure/file.

styleReferencesstring[]

Array of fileUrl values for images whose look the figure should follow. Their content is not carried over.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/figure/start \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Ligand-receptor signaling through the MAPK cascade (RAS, RAF, MEK, ERK) to target gene transcription",
    "style": "flat",
    "ratio": "16:9"
  }'

Response

{
  "taskId": "9f2c41d0...",
  "status": "running",
  "projectId": "5b0f7a3e...",
  "url": "https://app.nubint.ai/figure/5b0f7a3e..."
}
taskId

The value to pass to the task status endpoint. Valid for 24 hours.

projectId

The project this figure belongs to. Pass it in the next request to keep working there.

url

URL that opens the canvas in Nubint Figure, where users fix labels, redraw a region, and export.

result

The result from task status: imageUrl for a figure, fileUrl for SVG or PPTX, and creditsCharged with the credits this task used.

Text inside a figure is drawn by an image model, so tell your users to check the spelling. For charts of real data, use /developer/figure/plot instead of this path.

Nubint Figure

Data charts

POST/developer/figure/plot

Plots a chart from real data. Code draws it, not an image model, so the values are exactly those in your table, and the result comes back in the same response.

Request

csvstring

CSV text. The first line holds the column names. Send values as they are; don't round them or fill in gaps.

dataFilestring

Instead of csv: the fileUrl of a table (CSV, TSV, or XLSX) uploaded to /developer/figure/file with purpose set to data. For Excel files, the first sheet is read.

journalStylestring

Journal style: general (default), nature, science, cell, plos-one, or acs. The chart is drawn at the width and font size that figures in that journal commonly use. It does not guarantee compliance with the journal's submission guidelines.

chart.typestring

Chart type: bar, line, scatter, box, violin, heatmap, or histogram.

chart.x · chart.ystring

Column names for the x and y axes. For histogram, x is the numeric column to bin.

chart.groupBystring

The column that splits the data into series.

chart.aggregatestring

How rows that share an x value are combined in bar and line charts: mean (default), median, sum, count, or none.

chart.errorstring

Error bars: none, sd, or sem.

palette · ratiostring

Color palette and aspect ratio.

includeSvgboolean

Set to true to also get an editable SVG file (svgUrl). The SVG export charge is added.

projectIdstring

The project to place the chart in.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/figure/plot \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "csv": "group,glucose\ncontrol,5.1\ncontrol,5.4\nrestricted,6.2\nrestricted,6.0",
    "chart": { "type": "bar", "x": "group", "y": "glucose", "error": "sd", "showPoints": true }
  }'

Response

200 OK
{
  "imageUrl": "https://.../plot.png",
  "summary": {
    "type": "bar", "rowsRead": 4, "rowsPlotted": 4,
    "rowsDropped": 0, "errorBars": "sd"
  },
  "url": "https://app.nubint.ai/figure/5b0f7a3e..."
}
imageUrl

The chart as a PNG (300 dpi).

summary

What was actually plotted: rows read, plotted, and dropped, plus n, mean, and standard deviation for each series. Quote these values when you report numbers.

creditsCharged

Credits charged for this request. A table that can't be plotted (a missing column, or no numbers) is not charged and returns a 400.

Nubint Evidence

Paper search

POST/developer/search/papers

Searches the scholarly indexes (OpenAlex and KCI) with a research question or keywords. It uses no credits, and the results come back in the response.

Request

querystring

A research question or keywords, in any language.

limitinteger

Number of papers to return. Default 10, maximum 30.

yearFrom · yearTointeger

Range of publication years. You can give just one end.

minCitations · openAccessOnly · excludeRetracted

Minimum citation count, open access only, and exclusion of retracted papers. Only the conditions you pass are applied.

sortstring

Sort order: relevance (default), cited, recent, or oldest.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/search/papers \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "sleep restriction and insulin sensitivity", "limit": 3 }'

Response

200 OK
{
  "papers": [
    {
      "id": "https://doi.org/10.1016/s0140-6736(99)01376-8",
      "title": "Impact of sleep debt on metabolic and ...",
      "year": 1999,
      "venue": "The Lancet"
    },
    ...
  ]
}
papers[].id

Paper identifier. Use it as is when saving the paper to the library.

papers[].supportingPassage

When the full text is indexed, the passage that matches the query comes with the paper.

note

A message attached when there are no results. A query with no searchable topic also returns an empty result.

Nubint Evidence

Literature review

POST/developer/evidence/literature-review

Writes a literature review from a research question. It searches the index, selects the key papers, and returns the review as Markdown, with citation numbers that match the reference list. It runs as a task and takes a few minutes.

Request

questionstring

A research question or topic.

depthstring

Depth: fast (default), balanced, or comprehensive. Deeper runs cite more papers, take longer, and use more credits.

languagestring

Language of the output: ko, en, ja, zh-CN (Simplified Chinese), or zh-TW (Traditional Chinese). Defaults to English.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/evidence/literature-review \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "question": "Does sleep restriction impair glucose metabolism in healthy adults?",
    "depth": "fast",
    "language": "en"
  }'

Response

{
  "taskId": "9f2c41d0...",
  "threadId": "0199c2e4...",
  "status": "running"
}
threadId

A handle for this literature review. Pass it to the task status endpoint instead of taskId to read the result again, even after 24 hours.

url

URL that opens the result in Nubint.

result

The result from task status: the review text and references, in the same order as the [n] markers in the text.

Nubint Evidence

Systematic review and data extraction

Coming soon

Systematic review (protocol proposal, screening, and synthesis report) and data extraction are coming soon. They are not available through the API or MCP yet, and calling their paths returns a 403.

What you can use today is paper search and literature review. Request and response formats will be added to this page at launch.

Common

Task status

POST/developer/tasks/get

Paths that start a task return a taskId at once. Send the taskId to this path to read the result. Poll every 15 to 30 seconds, and don't start the same task again because it seems slow: every start is charged as a new run.

Request

taskIdstring

The taskId from the start response. Valid for 24 hours.

threadIdstring

Pass it instead of taskId to read the latest result of earlier work at any time.

cURL
curl -X POST https://api.nubint.ai/api/v1/developer/tasks/get \
  -H "X-API-Key: $NUBINT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "taskId": "9f2c41d0..." }'

Response

200 OK
{
  "status": "completed",
  "result": {
    "imageUrl": "https://.../figure.png",
    "mimeType": "image/png"
  },
  "projectId": "5b0f7a3e...",
  "url": "https://app.nubint.ai/figure/5b0f7a3e..."
}
status

running, completed, failed, or cancelled.

result

The result, once status is completed. Its shape depends on the task (see the sections above).

error

The reason, when status is failed.

url

URL that opens the result in Nubint.

Requests that start a task, as well as chart and manuscript-save requests, accept an idempotencyKey. Set a value of your own for each request, and use the same value when you resend after a lost response: nothing is started again, the first response is returned as it was (replayed: true), and credits are charged only once. Keys are remembered for 24 hours.

Pricing

AI-writing detection costs 88 credits per 10,000 tokens and source quality 66 credits per 10,000 tokens. Text length is rounded up to blocks of 5 English A4 pages, and one block is the minimum charge. These are the same rates as editor reviews.

Reference verification uses no credits. Sections that failed on our side, sections skipped for lack of input, and inconclusive AI detection are not charged.

The estimated cost is checked before running; if your balance can't cover it, nothing runs and you get a 402.

Errors

Error bodies are JSON with a single detail field.

401 Unauthorized
{ "detail": "Invalid API key" }
400

Limit exceeded: more than 100 references or 200,000 characters. Nothing is truncated.

401

The X-API-Key header is missing, or the key is wrong or revoked.

402

Not enough credits: the balance is 0 or can't cover this request's estimated cost. Nothing was run.

403

This needs a Starter, Pro, or Max plan — a key from a free account gets this response on every route.

422

The request body doesn't match the schema (field names or types).

429

Rate limit exceeded. Retry in a minute.

502

The AI-writing detection service didn't respond (/developer/review/ai-detection). Retry shortly.

503

Authentication is temporarily unavailable. Your key is fine; don't revoke it, just retry.

Limits and timing

Up to 100 references and 200,000 characters (about 80 pages of English A4) per request.

Responses are synchronous, so a long reference list can take tens of seconds. Set your client timeout to 120 seconds or more.

Rate limits per account: 30 reference verifications per minute, and 10 AI-writing detections or full checks per minute. Beyond that you get a 429.

All endpoints

Every MCP tool is also available over REST. The path is /developer/ followed by the group and the feature (for example /developer/evidence/literature-review): POST the same arguments the MCP tool takes as JSON, and you get the same result. Plan, rate limits and credits are the same.

Paths marked as a task start work that takes a few minutes and return a taskId at once. Read the result by sending the taskId to /developer/tasks/get. Poll every 15 to 30 seconds.

POST /developer/search/papersinstant

search_papers

POST /developer/search/libraryinstant

search_library

POST /developer/search/save-to-libraryinstant

save_to_library

POST /developer/review/manuscript-checkinstant

run_manuscript_check

POST /developer/review/reference-verificationinstant

run_manuscript_check

POST /developer/review/ai-detectioninstant

run_manuscript_check

POST /developer/review/manuscriptinstant

save_manuscript

POST /developer/review/documentsinstant

list_documents

POST /developer/review/document/readinstant

read_document

POST /developer/review/document/editinstant

edit_document

POST /developer/review/starttask

start_review

POST /developer/evidence/literature-reviewtask

start_literature_review

POST /developer/evidence/systematic-reviewComing soon

start_systematic_review

POST /developer/evidence/screened-papersComing soon

list_screened_papers

POST /developer/evidence/screeningComing soon

update_screening

POST /developer/evidence/systematic-review-reportComing soon

start_systematic_review_report

POST /developer/evidence/extract-dataComing soon

start_extract_data

POST /developer/evidence/exportComing soon

export_evidence

POST /developer/figure/projectinstant

open_figure_project

POST /developer/figure/fileinstant

upload_figure_file

POST /developer/figure/starttask

start_figure

POST /developer/figure/plotinstant

create_figure_plot

POST /developer/tasks/getinstant

get_task

POST /developer/tasks/listinstant

list_tasks

POST /developer/credits/getinstant

get_credits

MCP

Besides the manuscript check (run_manuscript_check, whose checks argument runs reference verification or AI-writing detection on its own), the MCP server offers paper search, the seven manuscript reviews, listing and reading your Nubint documents and suggesting edits to them (edit_document — suggestions appear in the Nubint editor for the user to accept or reject), literature review and figure tools. All tools need the Starter plan or above. Systematic review and data extraction are coming soon. ChatGPT and Claude connect with a sign-in (OAuth) and need no API key; see the MCP connection guide.

Connect via MCP

Tools

The tools the server currently exposes. Tools starting with start_ kick off a task that takes a few minutes and return at once; read the result with get_task.

search_papersinstant

AI Paper Search

search_libraryinstant

AI Paper Search

save_to_libraryinstant

AI Paper Search

run_manuscript_checkinstant

AI Paper Review

save_manuscriptinstant

AI Paper Review

list_documentsinstant

AI Paper Review

read_documentinstant

AI Paper Review

edit_documentinstant

AI Paper Review

start_reviewtask

AI Paper Review

start_literature_reviewtask

Nubint Evidence

open_figure_projectinstant

Nubint Figure

upload_figure_fileinstant

Nubint Figure

start_figuretask

Nubint Figure

create_figure_plotinstant

Nubint Figure

get_taskinstant

Common

list_tasksinstant

Common

get_creditsinstant

Common

Connect developer tools with an API key

Developer tools that let you set headers can connect with X-API-Key. The server URL is the same.

One command in your terminal. Afterwards, run /mcp to check the connection.

Claude Code
claude mcp add --transport http nubint https://api.nubint.ai/api/v1/mcp \
  --header "X-API-Key: nbk_live_..."