Skip to main content
Beta

API documentation

Authentication, endpoints, and response formats for the pre-submission check API.

Overview

Every request is JSON over HTTPS, and the result comes back in the response. There is no job ID to poll.

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.

The API can be called from accounts on the Pro or Max plan. A key from a free account gets 403; the key stays, and works again once you subscribe.

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

Reference verification

POST/citations/verify

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.

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/citations/verify \
  -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.

AI-writing detection

POST/preflight/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/preflight/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": 20,
  "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.

Full manuscript check

POST/preflight/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.

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/preflight/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": 15
}
*.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.

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.

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.

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.

Pricing

AI-writing detection costs 44 credits per 10,000 tokens and source quality 32 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 is free. 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

The Pro or Max plan is required.

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 (/preflight/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.

MCP

The same three checks are available as MCP tools (preflight_check, verify_citations, detect_ai_writing). ChatGPT and Claude connect with a sign-in (OAuth) and need no API key; see the MCP connection guide.

Connect via MCP

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_..."