---
title: "ISIN validator plus CUSIP, SEDOL and FIGI check-digit validation; builds an ISIN from an NSIN"
method: GET
path: "/v1/id/security"
tags: ["deterministic", "no-api-key", "id", "identifiers", "validation", "finance"]
---

# ISIN validator plus CUSIP, SEDOL and FIGI check-digit validation; builds an ISIN from an NSIN

`GET /v1/id/security`

## Request

- Base URL: `https://api.duoleads.com`
- URL: `https://api.duoleads.com/v1/id/security`
- Auth: none declared

ISIN validator plus CUSIP, SEDOL and FIGI check digits: validate the check digit of a financial security identifier (ISIN per ISO 6166). Returns the verdict, the computed correct check character, and for an ISIN the issuing country prefix and the embedded NSIN. Also builds an ISIN from a country code plus a 9-character NSIN. Format and checksum only, no security master lookup.

**Output (`data`):** validate: valid, type (isin|cusip|sedol|figi|unknown), normalised, check_char (string|null, null when the type is unknown), check_char_ok, country (ISIN only; string|null), nsin (ISIN only; string|null), reason (string|null, null when valid), algorithm (string|null, null when the type is unknown). build-isin: isin plus the same fields.

Deterministic: identical input returns identical output, so the response is served with `Cache-Control: private, max-age=31536000, immutable` (the paying client may cache it indefinitely; shared caches must not, because the response is paid).

Price: $0.05 USDC per call (x402, Base). Route contract version 1.0.0. Docs: https://api.duoleads.com/docs#id-security

## Query parameters

- `op` 'validate' | 'build-isin'
- `value` string
- `country` string
- `nsin` string

## Response `200`

Paid and settled. `data` is route-specific; a route that judges its input returns 200 with `data.valid: false` for a bad value.

- object
  - `ok` unknown, required
  - `route` '/v1/id/security', required
  - `version` '1.0.0', required
  - `data` object, required: validate: valid, type (isin|cusip|sedol|figi|unknown), normalised, check_char (string|null, null when the type is unknown), check_char_ok, country (ISIN only; string|null), nsin (ISIN only; string|null), reason (string|null, null when valid), algorithm (string|null, null when the type is unknown). build-isin: isin plus the same fields.
    - `valid` boolean
    - `type` string
    - `normalised` string
    - `check_char` string, nullable
    - `check_char_ok` boolean
    - `country` string, nullable
    - `nsin` string, nullable
    - `reason` string, nullable
    - `algorithm` string, nullable
    - `isin` string
  - `meta` Meta, required
    - `disclaimer` string, required: Legal short disclaimer, identical on every response.
    - `request_id` string, required: ULID.
    - `computed_at` string, date-time, required: RFC 3339 UTC with milliseconds.
    - `price_usd` string, required: Decimal string, "0.05".
    - `deterministic` boolean, required
    - `sources` object[]: Present only on routes that read a vendored dataset: the exact edition that answered.
      - `id` string, required
      - `version` string, required
      - `published` string, required
      - `attribution` string
      - `licence` string

## Other responses

- `400`: MISSING_PARAM, INVALID_PARAM or UNSUPPORTED_VALUE. Not charged: validation runs before the paywall.
- `402`: Payment required. No valid PAYMENT-SIGNATURE was supplied: read the base64 PAYMENT-REQUIRED header (or this body) for the price ($0.05 = 50000 atomic USDC on eip155:8453), sign an EIP-3009 authorization and retry. Also returned when settlement is declined (PAYMENT_FAILED). Nothing is charged on a 402.
- `404`: NOT_FOUND: unknown path. Not charged.
- `405`: METHOD_NOT_ALLOWED: only GET and HEAD are served. Not charged.
- `413`: INPUT_TOO_LARGE: a parameter exceeded its documented maximum length. Not charged.
- `500`: INTERNAL: a server bug. Not charged.

---

[API](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo.md) · [All operations](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/llms.txt) · [OpenAPI document](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/revisions/18790d59615e?raw)
