JEV Evaluate API
REST API and MCP service documentation generated from server-side API definitions. Responses use the shared code, msg, and data envelope.
API selector
REST API and MCP service documentation generated from server-side API definitions. Responses use the shared code, msg, and data envelope.
Choose preset mode (useCase + input) or custom mode (state + questions); never mix the two. Custom mode supports noul, choice, and score, with independent answers in result.answers. Model, identity, upstream URL, and execution thresholds remain server-owned. Supplied context and questions are sent to TypeSafe. Decisions are advisory; keyword presets judge only supplied business, SERP, candidate, and product-fact evidence. Requires an active Nexscope subscription. Each route or evaluate call deducts 1 Nexscope credit; any selected data API retains its existing billing. Route and evaluate share limits of 20 requests per user per minute, 200 requests globally per minute, and 5,000 requests globally per rolling day; each route or evaluate call counts as one request. Quota admission is sequential: per-user minute, global minute, then global rolling day; an earlier admitted counter remains incremented if a later check rejects the request.
/api/skill-api/v1/jev/evaluatenexscope_jev_evaluateAll run endpoints require a user API key. Send it as a bearer token in the Authorization header.
Authorization: Bearer nk-xxxxxxxxxxxxxxxxx/api/skill-api/v1/jev/evaluateChoose exactly one request mode: useCase + input, or state + questions. Maximum serialized request: 16,000 UTF-8 bytes. Model, upstream URL, identity, and execution thresholds are server-owned and cannot be supplied. All text must be non-blank.
| Slug | jev-evaluate |
| Headers | Authorization: Bearer nk-...Content-Type: application/json |
| Request body | API-specific JSON object. |
| Response body | Platform envelope: code, msg, data, ts, time, cost, traceId. Inspect data.status for asynchronous completion. |
| 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. |
Replace YOUR_API_KEY, then run this command in your terminal.
curl -X POST 'https://api.nexscope.ai/api/skill-api/v1/jev/evaluate' \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"useCase": "response_guardrails",
"input": {
"content": "Never share passwords. Contact customer support through the official website."
}
}'/api/skill-api/v1/jev/evaluateSend a JSON request to execute this API and receive the documented response payload.
| Method | POST |
| Path | /api/skill-api/v1/jev/evaluate |
| Auth | Bearer API key |
| Content-Type | application/json |
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.
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"
]
}
}
}Checks response risks and severity. Returns pass, review, or block.
{
"useCase": "response_guardrails",
"input": {
"content": "Never share your password with anyone."
}
}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."
}
}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"
}
}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."
}
}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."
}
]
}
}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"
}
]
}
}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"
}
]
}
}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.
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.
| Name | Type | Required | Description |
|---|---|---|---|
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 |
input | object | optional | Fields depend on the selected preset; see the mode schemas below. |
state | string | object | array | optional |
{
"useCase": "response_guardrails",
"input": {
"content": "Never share passwords. Contact customer support through the official website."
}
}Platform response envelope. code 0 indicates success or acceptance; data contains the business result.
{
"code": 0,
"msg": "success",
"data": {
"useCase": "response_guardrails",
"policyVersion": "jev-evaluation-v1",
"model": "<resolved model>",
"decision": "pass",
"reasonCodes": [
"no_rule_triggered"
],
"checks": {},
"result": {}
}
}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. |
msg | string | required | Response message. |
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. |
| 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. |
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.
Connect remote agents through the standard MCP 2025-11-25 Streamable HTTP endpoint. Use OAuth 2.1 Authorization Code with PKCE, or an API key for compatibility.
POST https://api.nexscope.ai/api/skill-api/v2/mcp
MCP-Protocol-Version: 2025-11-25
Content-Type: application/jsonOAuth clients request the mcp:tools scope. The endpoint's 401 response advertises protected-resource metadata for authorization discovery.
{
"jsonrpc": "2.0",
"id": "tool-call-1",
"method": "tools/call",
"params": {
"name": "nexscope_jev_evaluate",
"arguments": {
"useCase": "response_guardrails",
"input": {
"content": "Never share passwords. Contact customer support through the official website."
}
}
}
}Existing API-key clients can continue using the compatibility endpoint. New integrations should use MCP v2.
GET / POST /api/skill-api/v1/mcpExecute the current API with your API key and JSON payload.
Send a real request with the same contract shown in the reference.
/api/skill-api/v1/jev/evaluatenexscope_jev_evaluatecurl -X POST \
https://api.nexscope.ai/api/skill-api/v1/jev/evaluate \
-H "Authorization: Bearer nk-..." \
-H "Content-Type: application/json" \
-d '{ "useCase": "response_guardrails", "input": { "content": "Never share passwords. Contact customer support through the official website." } }'No response yet. Run the request to see the response here.
Required in custom mode. Non-empty context shared by every question; supplied data is sent to TypeSafe. Minimum length: 1 Minimum items: 1 |
questions | object | optional | Required in custom mode. 1–32 independent questions, keyed by caller-defined IDs. |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: response_guardrails |
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 |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: ip_risk_triage |
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 |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: seo_relevance |
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.query | string | required |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: evidence_check |
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 |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: keyword_business_relevance |
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 |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: keyword_cluster_fit |
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 |
| Name | Type | Required | Description |
|---|---|---|---|
useCase | string | optional | Required with input in preset mode. One of seven server-owned presets. Constant: amazon_keyword_product_fit |
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.marketplace | string | required |
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 |
data.policyVersion | string | required | jev-evaluation-v1 for original presets; jev-keyword-tools-v1 for keyword presets; jev-custom-v1 for custom questions. |
data.model | string | null | required | Resolved model version, or null for deterministic quote_not_found. |
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.reasonCodes | array | required | Fixed reason codes without submitted text. |
data.reasonCodes[] | string | required | Item in data reasonCodes. |
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.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. |
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
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[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
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[].evidenceRefs | array | required | Evidence refs value used by this API operation. |
data.result.rows[].evidenceRefs[] | string | required | Item in data result rows[] evidenceRefs. |
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
data.result.rows[].id | string | required | Id value used by this API operation. Pattern: ^[A-Za-z0-9_-]{1,64}$ |
data.result.rows[].candidateId | string | null | required | Candidate id value used by this API operation. |
| Name | Type | Required | Description |
|---|---|---|---|
data.result.rows[] | object | required | Item in data result rows. |
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. |
input.title | string | optional | Title value used by this API operation. Minimum length: 1 Maximum length: 300 |
input.metaDescription | string | optional | Meta description value used by this API operation. Minimum length: 1 Maximum length: 1000 |
input.contentExcerpt | string | optional | Content excerpt value used by this API operation. Minimum length: 1 Maximum length: 4000 |
| 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. |
| 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. |
| 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. |
input.sourceText | string | required | Source text value used by this API operation. Minimum length: 1 Maximum length: 6000 |
input.quote | string | optional | Optional quote that must occur in sourceText after whitespace normalization. Minimum length: 1 Maximum length: 1000 |
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 |
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.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 |
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 |
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 |
data.result.rows[].sameTopic | boolean | required | Same topic value used by this API operation. |
data.result.rows[].samePage | boolean | required | Same page value used by this API operation. |
data.result.rows[].label | string | required | Label value used by this API operation. Allowed: same_page, separate_page, uncertain |
data.result.rows[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
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[].confidence | number | required | Confidence value used by this API operation. Minimum: 0 Maximum: 1 |
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[].evidenceRefs | array | required | Evidence refs value used by this API operation. |
data.result.rows[].evidenceRefs[] | string | required | Item in data result rows[] evidenceRefs. |