Truztcube Docs

Tax Verification (TIN)

Look up a Nigerian taxpayer record by tax number or phone number, check whether a TIN is valid, or find a person's TIN from their NIN.

Tax verification answers four questions about a Nigerian taxpayer, one endpoint each:

QuestionEndpointReturns
Who does this tax number belong to?POST /v1/tin/verifyThe full taxpayer record
Who does this phone number belong to?POST /v1/tin/by-phoneThe full taxpayer record
Is this tax number valid?POST /v1/tin/validateVALID or INVALID, and the registry it belongs to
What is this person's tax number?POST /v1/tin/from-ninTheir TIN and basic identity fields

Use it to onboard a business customer, confirm a supplier is tax-registered before raising a purchase order, or complete a taxpayer profile you already hold a NIN for.

There are two different Nigerian TIN formats, and they are not interchangeable

/tin/verify takes the FIRS form — 20304753-0001, eight digits, a hyphen, four digits.

/tin/validate takes the NRS form — bare digits, 10 to 13 of them, no hyphen.

These are two different identifiers issued by two different registries, not two spellings of one number. Sending a FIRS number to /tin/validate will not resolve, and neither will the reverse. If you only have one of them, use the endpoint that matches its shape.

Your first call

curl -X POST https://api.truztcube.com/v1/tin/verify \
  -H "x-api-key: sk_live_your_key" \
  -H "Idempotency-Key: supplier-onboarding-4821" \
  -H "Content-Type: application/json" \
  -d '{ "tin": "20304753-0001" }'
{
  "success": true,
  "statusCode": 200,
  "message": "TIN verification successful",
  "data": {
    "verificationStatus": "VERIFIED",
    "referenceId": "VER-TIN_NG-JPGI3POERX",
    "verificationId": "9f2c1a7b4e6d8f30",
    "charged": true,
    "taxpayer": {
      "firsTin": "20304753-0001",
      "jtbTin": "10001",
      "taxpayerName": "ACME LIMITED",
      "cacRegNumber": "2030404",
      "taxOffice": "MSTO GARKI",
      "phoneNumber": "08012345678",
      "email": "accounts@acme.example",
      "address": "13 Some Street, Garki"
    }
  },
  "timestamp": "2026-09-02T14:12:19.911Z",
  "path": "/v1/tin/verify"
}

Endpoints

Taxpayer record

Two ways in, same record out. Both are covered by one subscription.

POST /v1/tin/verify

FieldRequiredNotes
tinyesFIRS format — NNNNNNNN-NNNN, e.g. 20304753-0001

POST /v1/tin/by-phone

FieldRequiredNotes
phoneNumberyesNigerian mobile number, e.g. 08012345678

Both return a taxpayer object:

FieldNotes
firsTinThe FIRS tax number
jtbTinThe NRS tax number for the same taxpayer, where the registry holds one
taxpayerNameRegistered name
cacRegNumberCAC registration number, for a registered company
taxOfficeThe tax office the taxpayer is administered by
phoneNumber, email, addressContact details as held by the registry

Every field is nullable. The registry does not hold all of them for all taxpayers, and a missing field means the registry had nothing — not that the lookup failed.

jtbTin and firsTin come back together

A successful /tin/verify often returns both numbers for the same taxpayer. If you need the NRS number and hold only the FIRS one, this is the cheaper path — one call rather than a lookup followed by a validation.

Validate a tax number

POST /v1/tin/validate

FieldRequiredNotes
tinyesNRS format — 10 to 13 bare digits, e.g. 1001180000
countrynoTwo-letter country code. Defaults to ng
{
  "verificationStatus": "NOT_VERIFIED",
  "result": "INVALID",
  "format": null,
  "tinType": null,
  "country": "Nigeria (NG)",
  "charged": true,
  "verificationId": "…"
}
FieldNotes
resultVALID or INVALIDthis is the verdict
formatThe number as the registry recognises it
tinTypeWhich registry issued it, e.g. NRS - Tax Identification Number (Tax ID)
countryResolved country

An INVALID answer is still charged

result: "INVALID" is a successful verification: you asked the registry a question and it answered. The call is billed, charged is true, and verificationStatus is NOT_VERIFIED.

Retrying an INVALID will produce the same answer and a second charge. Treat it as a final result, not a transient failure.

verificationStatus on this endpoint is derived from result, so the two always agree. Read either — but read one of them, not the HTTP status. A 200 here means "the registry answered", not "the TIN is good".

Find a TIN from a NIN

POST /v1/tin/from-nin

FieldRequiredNotes
ninyesThe person's 11-digit National Identification Number
{
  "verificationStatus": "VERIFIED",
  "tin": "1234567890123",
  "firstName": "Ada",
  "lastName": "Okoro",
  "dateOfBirth": "01/01/1990",
  "nin": "12345678901",
  "taxResidency": "Lagos State",
  "charged": true,
  "verificationId": "…"
}

nin in the response echoes what you sent. taxResidency is the state the person is registered to for tax purposes.

This endpoint returns personal data

Unlike the other three, this one resolves a person rather than a business. Their tax number is treated as the same class of identifier as a NIN or BVN — collect it under a lawful basis, store it as you would a NIN, and do not log it in plain text.

Headers

HeaderRequiredNotes
x-api-keyyesYour API key
Idempotency-Keyyes on live keysAny unique string per logical request. Required for live-mode calls; optional in test mode
Content-Typeyesapplication/json

Reusing an Idempotency-Key returns the original result without a second charge. Reusing one with a different body is a 409.

Subscriptions

Tax verification is three separately provisioned services:

ServiceGrants
TIN Verification/tin/verify and /tin/by-phone
TIN Validation/tin/validate
TIN from NIN Verification/tin/from-nin

/tin/verify and /tin/by-phone share one subscription because they are the same registry lookup with a different input. The other two return materially different things — a verdict, and a person's tax number — so they are subscribed and priced on their own.

A call to an endpoint you are not subscribed to returns 403. Contact your account manager to have a service enabled; pricing is set per organisation and is not published here.

Errors

StatusMeaningWhat to do
400Malformed request — usually the wrong TIN format for the endpointCheck the format table above
402Insufficient wallet balanceTop up
403Not subscribed to this serviceContact your account manager
404No taxpayer record for this identifierFinal answer, not an error to retry
409Idempotency-Key reused with a different bodyUse a new key
429Endpoint at capacityRetry with backoff
503Tax verification unavailableRetry shortly; contact support if it persists

A 404 and a result: "INVALID" are different answers to different questions. 404 means the registry holds no record for that identifier. INVALID means the number itself is not a well-formed, issued TIN.

See Errors for the shared error envelope.

Not yet available

Lookup by CAC registration number is built but not released. If you need to resolve a taxpayer from an RC number today, use /v1/tin/verify with the FIRS TIN, or Business Verification to confirm the company first.

On this page