PAN and Company Name to LEI Lookup API
Overview
The PAN and Company Name to LEI Lookup API returns the Legal Entity Identifier (LEI) records of an Indian business when you provide its PAN or its company name. For each request you get:
- LEI records (records): the LEI, legal name, legal address and a name-match score for each match, best match first.
- Searched company name (companyName): for a PAN request, the registered name resolved from the PAN.
- Total count (totalRecordsFound): the number of matches found, even when the list is capped.
Why does this exist? An LEI is a 20-character code that users do not remember, and as FIs do not want to ask customers to enter it in a journey. This API fetches the records from a PAN or company name, so customers never type an LEI.
How it works. The API is synchronous:
- Call Lookup with a PAN or a company name, plus the consent text.
- For a PAN, the API first resolves the registered company name.
- It searches the LEI source by name and scores each record against the searched name.
- You get the records in the same response, best match first.
Basics
Item | Value |
|---|---|
Base URL (UAT / Pre-production) | https://api-preproduction.signzy.app |
Base URL (Production) | https://api.signzy.app |
Authentication | Credentials from the SSP portal: https://portal.signzy.app/#/api-credentials |
Method | POST |
Content type | application/json |
Response | Synchronous. The records are returned in the same call. |
1. Lookup
POST /api/lei/pan-to-lei
Returns the LEI records for a PAN or a company name.
Request body
Parameter | Type | Required | Description |
|---|---|---|---|
panNumber | string | One of panNumber / companyName | PAN of the business: 5 letters, 4 digits, 1 letter (AAAAA9999A). Trimmed and uppercased before validation. |
companyName | string | One of panNumber / companyName | Company name to search. Maximum 200 characters. Trimmed and uppercased. |
consentText | string | Yes | Must equal the consent declaration below. Case and extra spaces are ignored. |
consent | string | No | Y or N. N is rejected. |
Send exactly one of panNumber or companyName. Sending both, or neither, returns 400. An empty string counts as not sent.
Consent declaration
Obtain the customer's consent first, then send this wording unchanged in consentText:
I hereby provide my consent to fetch the Legal Entity Identifier details of this company
A request with consent set to N is rejected before any lookup is made.
Sample request
curl --location 'https://api-preproduction.signzy.app/api/lei/pan-to-lei' \
--header 'Content-Type: application/json' \
--header 'Authorization: <ACCESS_TOKEN>' \
--data '{
"panNumber": "AAFFM0294F",
"consent": "Y",
"consentText": "I hereby provide my consent to fetch the Legal Entity Identifier details of this company"
}'By company name:
{
"companyName": "ECLERX SERVICES LIMITED",
"consent": "Y",
"consentText": "I hereby provide my consent to fetch the Legal Entity Identifier details of this company"
}Response 200
{
"result": {
"panNumber": "AAFFM0294F",
"companyName": "ECLERX SERVICES LIMITED",
"companyNameSource": "PAN",
"typeOfHolder": "Company",
"totalRecordsFound": 1,
"records": [
{
"lei": "3358001T7DKZ8QUCEO12",
"legalName": "ECLERX SERVICES LIMITED",
"legalAddress": { "city": "MUMBAI", "country": "IN" },
"nameMatchScore": 100
}
]
}
}For a company name request, panNumber and typeOfHolder are "" and companyNameSource is INPUT.
Response fields
Field | Description |
|---|---|
panNumber | The PAN you sent, or "" for a company name request |
companyName | The name that was searched |
companyNameSource | PAN if the name was resolved from your PAN, INPUT if you supplied it |
typeOfHolder | Entity type returned for the PAN; "" for a company name request |
totalRecordsFound | Total records found, counted before the response cap |
records[] | LEI records, best match first, up to 100 per response |
records[].lei | The 20-character LEI |
records[].legalName | Legal name on the LEI record |
records[].legalAddress | Legal address, for example city and country |
records[].nameMatchScore | Similarity of the record name to the searched name, 0 to 100. "" when no score is available |
Record fields beyond those above are passed through from the LEI source as available.
Good to know
- Records are sorted by nameMatchScore, highest first. Records without a score stay in the list, at the bottom.
- Any field with no value is returned as "", never null.
Errors
Errors return a non-200 status with an error object. A 404 means the record does not exist; a 409 means the lookup could not be completed and is safe to retry.
Condition | Status | Reason | Message |
|---|---|---|---|
Request fails validation | 400 | VALIDATION_ERROR | Describes the invalid field |
consent is N | 400 | error | Need your consent to fetch data |
PAN is not valid | 400 | INVALID_PARAM | PAN number is not valid |
PAN not found | 404 | NOT_FOUND | No record found for the given PAN number |
PAN valid but no company name found | 404 | NOT_FOUND | Company name could not be resolved… |
Company name rejected by the LEI source, for example too generic | 400 | INVALID_PARAM | Message from the LEI source |
No LEI record matches | 404 | NOT_FOUND | No LEI record found for the given input |
PAN service unavailable | 409 | CONFLICT | Error in fetching data from PAN service |
LEI source unavailable | 409 | CONFLICT | Error in getting data from upstream |
Unexpected error | 409 | CONFLICT | Unable to complete the request at the moment! |
Error body
{
"error": {
"name": "error",
"message": "No LEI record found for the given input",
"status": 404,
"reason": "NOT_FOUND",
"type": "Not Found",
"statusCode": 404
}
}Error Code List
Symptom | Likely cause | Action |
|---|---|---|
400 on consentText | The wording differs from the consent declaration | Send the declaration exactly as given in Lookup |
400 with both or neither identifier | panNumber and companyName were both sent, or both missing | Send exactly one |
404 for a PAN | The PAN has no record, or no company name could be resolved | Check the PAN, or search by companyName |
404 for a company name | No LEI record matches the name | Check the spelling, or try the full registered name |
400 INVALID_PARAM from the LEI source | The company name is too generic | Send a more specific name |
409 CONFLICT | A data source was unavailable | Retry later; contact support if it repeats |
nameMatchScore is "" | No score was available for that record | Check legalName yourself; the record is still valid |
Fewer records than totalRecordsFound | The response is capped at 100 records | Narrow the search with a more specific name |
Glossary
Term | Meaning |
|---|---|
LEI | Legal Entity Identifier, a 20-character code that identifies a legal entity (ISO 17442) |
PAN | Permanent Account Number, the 10-character Indian tax ID in the format AAAAA9999A |
Consent declaration | The fixed wording the end customer must agree to, sent in consentText |
Record | One LEI entry returned for the searched name |
nameMatchScore | How closely a record's legal name matches the searched name, from 0 to 100 |
Please contact [email protected] for any support and clarification needed.