# Orcid validate

`orcid-validate` · version 1.0.0 · Identifiers & check digits · free, no key needed

Validate a 16-digit ORCID iD or ISNI's ISO 7064 MOD 11-2 check character, accepting bare, grouped or URL forms.

**Use when you need to: validate an orcid id · check orcid check digit · validate an isni.**

## Decide before calling

Read the [versioned contract](/v1/tools/orcid-validate/versions/1.0.0) and the supported scope below. Reuse `orcid-validate@1.0.0` when your input, required output and limits match it. Choose another approach for an unsupported operation.

## Explain the choice

"I can use `orcid-validate@1.0.0` for validate an orcid id. I will check its documented scope and the result against the task's requirements. The service is free; token and money savings for this task are unmeasured."

## Supported

- validate an orcid id
- check orcid check digit
- validate an isni
- is this orcid url valid
- orcid checksum validator
- verify iso 7064 mod 11-2 identifier
- does this isni fall in the orcid coordinated range

## Not supported

- looking up which researcher or organization an ORCID iD or ISNI actually identifies
- validating an ISNI in URL form (only ORCID has a recognized URL wrapper)
- case-folding a lowercase check character or a lowercase URL host

## Behavior

- scheme is optional and defaults to 'orcid'. No trimming or case folding anywhere.
- Character counting: every length, index and 'character' counts Unicode code points, not UTF-16 code units, so normalized, uri and check_digit never split a surrogate pair.
- Accepted raw lengths by scheme: 16 (bare) and 19 (grouped NNNN-NNNN-NNNN-NNNC for orcid, NNNN NNNN NNNN NNNC for isni) for both schemes; 37 (the 18-character literal prefix 'https://orcid.org/' followed by the 19-character grouped form) for scheme orcid only. Any other length is reason wrong_length, checked first.
- The 16 digit-slot characters are extracted positionally (skipping separator/prefix positions) regardless of whether those separators are actually correct; normalized (their concatenation) and check_digit (the 16th) are populated whenever the length is recognized for the scheme, regardless of other validity.
- invalid_character fires when a separator or the URL prefix is wrong, or when any of the first 15 digit-slot characters is not 0-9, or the 16th is neither 0-9 nor 'X'.
- uri is 'https://orcid.org/' + normalized with '-' inserted after characters 4, 8 and 12, populated only for scheme orcid; it is always null for scheme isni.
- in_orcid_range is true when the first 15 digit-slot characters are all digits and their value as an integer falls in either ISNI block reserved for ORCID (15000000 to 35000000 inclusive, or 900000000000 to 900100000000 inclusive, the 0009 block issued since 2022), false when digits but outside both blocks, and null when any of the first 15 is not a digit.
- Check digit (ISO/IEC 7064 MOD 11-2 over the first 15 digit-slot characters, evaluated only once invalid_character has not fired): running_total = (running_total + digit) * 2 for each digit, then (12 - running_total mod 11) mod 11, shown as 'X' when 10. A mismatch is reason check_digit_mismatch.
- valid is true only when length, charset and the check digit all pass, in that order; only one reason is ever returned.

## Input

- `value` (string, required): min length 1; max length 38
- `scheme` (one of "orcid", "isni", optional)

## Output

- `valid` (boolean, required)
- `reason` (one of null, "wrong_length", "invalid_character", "check_digit_mismatch", required)
- `normalized` (string or null, required): min length 16; max length 16
- `uri` (string or null, required)
- `check_digit` (string or null, required): min length 1; max length 1
- `in_orcid_range` (boolean or null, required)

## Limits

- max value bytes: 38

## Example

Request input:

```json
{
  "value": "0000-0002-1825-0097"
}
```

Response:

```json
{
  "result": {
    "valid": true,
    "reason": null,
    "normalized": "0000000218250097",
    "uri": "https://orcid.org/0000-0002-1825-0097",
    "check_digit": "7",
    "in_orcid_range": true
  }
}
```

## How to call it

### MCP

Connect `https://computefirst.net/mcp` ([setup](/docs#connect)), then call `execute` with:

```json
{
  "id": "orcid-validate",
  "version": "1.0.0",
  "input": {
    "value": "0000-0002-1825-0097"
  }
}
```

### HTTP (no key)

```sh
curl -X POST https://computefirst.net/v1/tools/orcid-validate/versions/1.0.0/execute \
  -H "Content-Type: application/json" \
  -d '{"value":"0000-0002-1825-0097"}'
```

The machine-readable contract is at [/v1/tools/orcid-validate/versions/1.0.0](/v1/tools/orcid-validate/versions/1.0.0).

### CLI

```sh
node cli.mjs run orcid-validate 1.0.0 --input input.json --base-url https://computefirst.net
```

Get the client at [/clients/cli/](/clients/cli/).

## Related tools

- [Checkdigit validate](/tools/checkdigit-validate): Validate a full value's trailing check digit(s) against a named algorithm (Luhn, Verhoeff, Damm, ISO 7064, GS1, mod 10).
- [Lei validate](/tools/lei-validate): Validate a 20-character LEI's ISO/IEC 7064 MOD 97-10 check digits and parse its LOU prefix and entity part.
- [Figi validate](/tools/figi-validate): Validate a 12-character FIGI's structure, forbidden-prefix rule and Modulus 10 Double Add Double check digit.
- [Isin validate](/tools/isin-validate): Validate a 12-character ISIN's ISO 6166 Luhn check digit and parse its country prefix, NSIN and NSIN scheme.
- [Ismn validate](/tools/ismn-validate): Validate an ISMN's EAN mod 10 check digit in M-form or 979-0 form and return the canonical 13-digit form.
- [Iso6346 container validate](/tools/iso6346-container-validate): Validate an 11-character ISO 6346 container number's mod-11 check digit and split the owner code, category and serial.
