https://api.nexscope.ai/jev/evaluateRun this API
Send a JSON request to execute this API and receive the documented response payload.
Endpoint
| Method | POST |
| Path | https://api.nexscope.ai/jev/evaluate |
| Auth | Bearer API key |
| Content-Type | application/json |
Evaluation modes and examples
Use this same endpoint and Bearer API key for both modes. Send either useCase + input or state + questions. Do not mix them or send model. MCP tool nexscope_jev_evaluate accepts the same body.
Custom mode accepts non-empty text, an object, or an array as state and 1–32 questions. Instructions are required strings (up to 4,000 characters). Choice accepts 2–255 options; Score accepts 2–32 ordered text levels. Criterion descriptions allow up to 2,000 characters. Question and choice IDs use 1–64 letters, digits, underscores, or hyphens. Keyword, evidence, fact, and candidate IDs use the same format and must be unique within their respective arrays.
The whole serialized request must fit within 16,000 UTF-8 bytes, even when individual fields are within their limits. One call counts as one request, including a keyword batch. No data is fetched automatically. Only submit context you are authorized to share with TypeSafe.
Custom questions
Evaluate all three question types together. Each question reads the same state independently. Questions cannot depend on another answer in the same request.
{
"state": {
"product": "750ml insulated steel water bottle",
"keyword": "hiking water bottle"
},
"questions": {
"relevant": {
"type": "noul",
"instructions": "Is the keyword relevant to this product?"
},
"intent": {
"type": "choice",
"instructions": "Classify the search intent.",
"criteria": {
"purchase": "Looking for a product to buy",
"research": "Looking for information",
"other": "Neither"
}
},
"fit": {
"type": "score",
"instructions": "Rate keyword fit using only the product description.",
"criteria": [
"Unrelated",
"Weak fit",
"Good fit",
"Direct fit"
]
}
}
}Response guardrails
Checks response risks and severity. Returns pass, review, or block.
{
"useCase": "response_guardrails",
"input": {
"content": "Never share your password with anyone."
}
}IP risk triage
Flags possible IP concerns. Always returns review; it is not legal clearance.
{
"useCase": "ip_risk_triage",
"input": {
"text": "A product description using a third-party brand name."
}
}SEO relevance
Supply query and at least one of title, metaDescription, or contentExcerpt. Scores relevance, not rankings or search volume.
{
"useCase": "seo_relevance",
"input": {
"query": "insulated hiking bottle",
"title": "Insulated steel water bottle for hiking"
}
}Evidence check
Assesses only sourceText. An optional quote must occur after whitespace normalization; otherwise quote_not_found is returned without a model call.
{
"useCase": "evidence_check",
"input": {
"claim": "The bottle holds 750ml.",
"sourceText": "Capacity: 750ml. Material: steel.",
"quote": "Capacity: 750ml."
}
}Keyword business relevance
1–10 keywords per call. exclusions is required and may be empty. Optional serpEvidence contains up to 30 supplied excerpts; keywordId must reference a keyword in this request. Labels: relevant, irrelevant, uncertain.
{
"useCase": "keyword_business_relevance",
"input": {
"businessDescription": "We sell reusable hiking bottles.",
"exclusions": [
"Disposable bottles"
],
"keywords": [
{
"id": "k1",
"keyword": "steel hiking bottle"
}
],
"serpEvidence": [
{
"id": "e1",
"keywordId": "k1",
"source": "Supplied search result excerpt",
"text": "Reusable steel bottles for outdoor use."
}
]
}
}Keyword cluster fit
Compare 1–10 keywords with 1–5 candidate representatives. This evaluates topic/page fit; it does not build an entire clustering workflow. Labels: same_page, separate_page, uncertain. candidateId can be null. The candidate ID no_candidate is reserved.
{
"useCase": "keyword_cluster_fit",
"input": {
"keywords": [
{
"id": "k1",
"keyword": "insulated hiking bottle"
}
],
"candidates": [
{
"id": "c1",
"keyword": "hiking water bottles"
}
]
}
}Amazon keyword product fit
Evaluate 1–10 keywords using 1–30 supplied product facts. Fact sources: title, bullet, attribute, description. Labels: match, partial, conflict, unknown. Supported marketplaces: US, UK, DE, FR, JP, CA, IT, ES, MX, IN.
{
"useCase": "amazon_keyword_product_fit",
"input": {
"marketplace": "US",
"productFacts": [
{
"id": "f1",
"source": "title",
"value": "750ml insulated steel water bottle"
}
],
"keywords": [
{
"id": "k1",
"keyword": "steel water bottle"
}
]
}
}Read a custom response
The Nexscope envelope remains code / msg / data. Custom mode returns data.useCase = custom, policyVersion = jev-custom-v1, decision = evaluated, empty reasonCodes and checks, and answers under data.result.answers. Evaluated confirms that answers are available; it does not approve an action. Use your own decision thresholds. Token usage is not exposed.
{
"code": 0,
"msg": "success",
"data": {
"useCase": "custom",
"policyVersion": "jev-custom-v1",
"model": "<resolved model>",
"decision": "evaluated",
"reasonCodes": [],
"checks": {},
"result": {
"answers": {
"relevant": {
"type": "noul",
"noul": 0.92
},
"intent": {
"type": "choice",
"choice": "purchase",
"confidence": 0.9,
"probabilities": {
"purchase": 0.9,
"research": 0.08,
"other": 0.02
}
},
"fit": {
"type": "score",
"score": 2.8,
"confidence": 0.9,
"probabilities": {
"0": 0,
"1": 0,
"2": 0.2,
"3": 0.8
},
"legend": {
"0": "Unrelated",
"1": "Weak fit",
"2": "Good fit",
"3": "Direct fit"
}
}
}
}
}
}The values above are illustrative. Noul is the probability of yes, not a Boolean. Score is the probability-weighted average of zero-based levels and may be fractional. Keyword presets return rows in data.result.rows, keyed by input ID, with labels, confidence, and reasonCodes; evidenceRefs identify supplied context, not independently verified sources. Keyword policy version is jev-keyword-tools-v1; original presets retain jev-evaluation-v1.
Errors and limits
Check the response code before reading data. 99001: invalid parameters; fix the request. 99009: shared quota exceeded; wait before retrying. 13007: evaluation unavailable, timeout, or invalid upstream answer; no usable decision is returned. An active subscription is required. Each evaluation has a 10-second upstream deadline and no automatic upstream retry.
This is the Nexscope API contract. It uses TypeSafe internally and intentionally applies the limits above; it is not an unrestricted passthrough of the TypeSafe API.
Request parameters
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Fields depend on the selected preset; see the mode schemas below. |
questions | object | optional | Required in custom mode. 1–32 independent questions, keyed by caller-defined IDs. |
state | string | object | array | optional | Required in custom mode. Non-empty context shared by every question; supplied data is sent to TypeSafe. Minimum length: 1 Minimum items: 1 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Allowed: response_guardrails, ip_risk_triage, seo_relevance, evidence_check, keyword_business_relevance, keyword_cluster_fit, amazon_keyword_product_fit |
Preset mode
response_guardrails
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Checks credential_exposure, harmful_instruction, deceptive_claim, instruction_override, and severity. The fixed server policy maps the checks to pass, review, or block. |
input.content | string | required | Authorized response or draft content. Minimum length: 1 Maximum length: 6000 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: response_guardrails |
ip_risk_triage
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Checks trademark, copyright, patent, other IP, and insufficient-context signals plus risk type and severity. The result always requires human review and is not legal clearance. |
input.text | string | required | Authorized product or description text for advisory IP-risk triage. Minimum length: 1 Maximum length: 4000 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: ip_risk_triage |
seo_relevance
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Requires query and at least one supplied title, metaDescription, or contentExcerpt. Scores relevance only; it does not predict rankings, traffic, search volume, or intent data. |
input.contentExcerpt | string | optional | Content excerpt value used by this API operation. Minimum length: 1 Maximum length: 4000 |
input.metaDescription | string | optional | Meta description value used by this API operation. Minimum length: 1 Maximum length: 1000 |
input.query | string | required | Query value used by this API operation. Minimum length: 1 Maximum length: 500 |
input.title | string | optional | Title value used by this API operation. Minimum length: 1 Maximum length: 300 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: seo_relevance |
Any of option 1 — requires title
| Name | Type | Required | Description |
|---|---|---|---|
input | any | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
Any of option 2 — requires metaDescription
| Name | Type | Required | Description |
|---|---|---|---|
input | any | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
Any of option 3 — requires contentExcerpt
| Name | Type | Required | Description |
|---|---|---|---|
input | any | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
evidence_check
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Assesses the claim only against sourceText. If supplied quote is absent after whitespace normalization, the server returns deterministic quote_not_found without a model call. |
input.claim | string | required | Claim value used by this API operation. Minimum length: 1 Maximum length: 1000 |
input.quote | string | optional | Optional quote that must occur in sourceText after whitespace normalization. Minimum length: 1 Maximum length: 1000 |
input.sourceText | string | required | Source text value used by this API operation. Minimum length: 1 Maximum length: 6000 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: evidence_check |
keyword_business_relevance
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
input.businessDescription | string | required | Business description value used by this API operation. Minimum length: 1 Maximum length: 4000 |
input.exclusions | array | required | Exclusions value used by this API operation. Maximum items: 50 |
input.exclusions[] | string | required | Item in input exclusions. Minimum length: 1 Maximum length: 200 |
input.keywords | array | required | Keywords value used by this API operation. Minimum items: 1 Maximum items: 10 |
input.keywords[] | object | required | Item in input keywords. |
input.keywords[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.keywords[].keyword | string | required | Keyword value used by this API operation. Minimum length: 1 Maximum length: 500 |
input.serpEvidence | array | optional | Serp evidence value used by this API operation. Maximum items: 30 |
input.serpEvidence[] | object | required | Item in input serpEvidence. |
input.serpEvidence[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.serpEvidence[].keywordId | string | required | Keyword id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.serpEvidence[].source | string | required | Source value used by this API operation. Minimum length: 1 Maximum length: 200 |
input.serpEvidence[].text | string | required | Text value used by this API operation. Minimum length: 1 Maximum length: 2000 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: keyword_business_relevance |
keyword_cluster_fit
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
input.candidates | array | required | Candidates value used by this API operation. Minimum items: 1 Maximum items: 5 |
input.candidates[] | object | required | Item in input candidates. |
input.candidates[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.candidates[].keyword | string | required | Keyword value used by this API operation. Minimum length: 1 Maximum length: 500 |
input.keywords | array | required | Keywords value used by this API operation. Minimum items: 1 Maximum items: 10 |
input.keywords[] | object | required | Item in input keywords. |
input.keywords[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.keywords[].keyword | string | required | Keyword value used by this API operation. Minimum length: 1 Maximum length: 500 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: keyword_cluster_fit |
amazon_keyword_product_fit
| Name | Type | Required | Description |
|---|---|---|---|
input | object | optional | Required with useCase in preset mode. Strict preset-specific input. Keyword presets accept only bounded keyword, candidate, SERP-evidence, and product-fact fields. |
input.keywords | array | required | Keywords value used by this API operation. Minimum items: 1 Maximum items: 10 |
input.keywords[] | object | required | Item in input keywords. |
input.keywords[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.keywords[].keyword | string | required | Keyword value used by this API operation. Minimum length: 1 Maximum length: 500 |
input.marketplace | string | required | Marketplace value used by this API operation. Allowed: US, UK, DE, FR, JP, CA, IT, ES, MX, IN |
input.productFacts | array | required | Product facts value used by this API operation. Minimum items: 1 Maximum items: 30 |
input.productFacts[] | object | required | Item in input productFacts. |
input.productFacts[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
input.productFacts[].source | string | required | Source value used by this API operation. Allowed: title, bullet, attribute, description |
input.productFacts[].value | string | required | Value value used by this API operation. Minimum length: 1 Maximum length: 2000 |
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: amazon_keyword_product_fit |
Custom mode
Code example
{
"input": {
"content": "Never share passwords. Contact customer support through the official website."
},
"useCase": "response_guardrails"
}Response example
Platform response envelope. code 0 indicates success or acceptance; data contains the business result.
{
"code": 0,
"data": {
"checks": {},
"decision": "pass",
"model": "<resolved model>",
"policyVersion": "jev-evaluation-v1",
"reasonCodes": [
"no_rule_triggered"
],
"result": {},
"useCase": "response_guardrails"
},
"msg": "success"
}Response fields
Nexscope response envelope for preset or custom evaluation. Decisions are advisory and never trigger another API or publishing action.
| Name | Type | Required | Description |
|---|---|---|---|
code | integer | required | Zero on success; non-zero for validation, access, quota, or availability errors. |
data | object | required | Fixed server policies cover response safety, IP triage, SEO relevance, evidence checks, business-keyword relevance, keyword same-page clustering, and Amazon product-keyword fit. Keyword presets return bounded rows keyed only by caller-supplied IDs. |
data.checks | object | required | Empty in custom mode; answers are in result.answers. Fixed Noul, Score, or Choice checks for the preset: response risks and severity; IP signals, risk_type, severity, and insufficient_context; supplied SEO dimensions; or evidence verdict. Deterministic quote_not_found returns an empty object. |
data.decision | string | required | Presets return pass/review/block. Custom mode returns evaluated, which means answers are available, not that an action is approved. Allowed: pass, review, block, evaluated |
data.model | string | null | required | Resolved model version, or null for deterministic quote_not_found. |
data.policyVersion | string | required | jev-evaluation-v1 for original presets; jev-keyword-tools-v1 for keyword presets; jev-custom-v1 for custom questions. |
data.reasonCodes | array | required | Fixed reason codes without submitted text. |
data.reasonCodes[] | string | required | Item in data reasonCodes. |
data.result | object | required | Preset-specific bounded result. Keyword presets return result.rows with caller-supplied IDs, fixed labels, confidence, and fixed reason or evidence references. |
data.result.answers | object | optional | Custom mode only. Answers keyed by question ID: noul returns {type, noul}; choice returns {type, choice, confidence, probabilities}; score returns {type, score, confidence, probabilities, legend}. No automatic policy or token usage is returned. |
data.result.rows | array | optional | Rows value used by this API operation. Maximum items: 10 |
data.result.rows[] | any | required | Item in data result rows. |
data.useCase | string | required | Use case value used by this API operation. Allowed: response_guardrails, ip_risk_triage, seo_relevance, evidence_check, keyword_business_relevance, keyword_cluster_fit, amazon_keyword_product_fit, custom |
msg | string | required | Response message. |
Business relevance row
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
data.result.rows[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
data.result.rows[].evidenceRefs | array | required | Evidence refs value used by this API operation. |
data.result.rows[].evidenceRefs[] | string | required | Item in data result rows[] evidenceRefs. |
data.result.rows[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
data.result.rows[].label | string | required | Label value used by this API operation. Allowed: relevant, irrelevant, uncertain |
data.result.rows[].reasonCodes | array | required | Reason codes value used by this API operation. |
data.result.rows[].reasonCodes[] | string | required | Item in data result rows[] reasonCodes. |
Keyword cluster fit row
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
data.result.rows[].candidateId | string | null | required | Candidate id value used by this API operation. |
data.result.rows[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
data.result.rows[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
data.result.rows[].label | string | required | Label value used by this API operation. Allowed: same_page, separate_page, uncertain |
data.result.rows[].reasonCodes | array | required | Reason codes value used by this API operation. |
data.result.rows[].reasonCodes[] | string | required | Item in data result rows[] reasonCodes. |
data.result.rows[].samePage | boolean | required | Same page value used by this API operation. |
data.result.rows[].sameTopic | boolean | required | Same topic value used by this API operation. |
Amazon keyword product fit row
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
data.result.rows[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
data.result.rows[].evidenceRefs | array | required | Evidence refs value used by this API operation. |
data.result.rows[].evidenceRefs[] | string | required | Item in data result rows[] evidenceRefs. |
data.result.rows[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
data.result.rows[].label | string | required | Label value used by this API operation. Allowed: match, partial, conflict, unknown |
data.result.rows[].reasonCodes | array | required | Reason codes value used by this API operation. |
data.result.rows[].reasonCodes[] | string | required | Item in data result rows[] reasonCodes. |
Responses
| Code | Description |
|---|---|
| 200 | HTTP request completed. Check JSON code; only 0 indicates business success or acceptance. |
| 400 | Request JSON or required API parameters are invalid. |
| 401 | API key is missing, invalid, or cannot be matched to a user. |
| 5xx | API execution or upstream service failed. |
Data source, freshness, and limitations
Source, freshness, coverage, rate limits, and estimation notes are not specified in this API definition unless they appear in the request or response field documentation above. Do not assume official marketplace data or real-time freshness when it is not explicitly documented.