---
title: "Look up people and companies by external identifier"
method: GET
path: "/v1/entities/lookup"
tags: ["Entities", "tier:standard"]
---

# Look up people and companies by external identifier

`GET /v1/entities/lookup`

## Request

- Base URL: `https://api.particle.pro`
- URL: `https://api.particle.pro/v1/entities/lookup`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Resolves external identifiers — LinkedIn slugs, social handles, company domains, stock tickers, SEC CIKs, Wikidata QIDs — to the people and companies that carry them. It is the reverse of GET /v1/people/{slug}/external-links and GET /v1/companies/{id}/external-links. Pass a comma-separated `identifier` list (up to 100 per call); `platform` is optional, so a handle with no known source still resolves. A full profile URL works in place of a bare identifier and the platform is inferred from it, and the stored form is matched for you — pass `satyanadella` or the profile URL, not `in/satyanadella`.

Each result echoes the input identifier and carries a `matches` array, because an identifier is not unique to an entity: a LinkedIn profile claimed by two duplicate person records resolves to both, and `match_count` reports the total. Unresolved identifiers come back with an empty `matches`, so a bulk caller never has to reconcile a shorter response against a longer request. Correlate by the echoed `identifier` rather than by position, since duplicate identifiers collapse to one result.

Use GET /v1/entities/search instead when you have a name rather than an identifier, and GET /v1/podcasts/lookup or GET /v1/podcasts/episodes/lookup for podcast and episode identifiers.

## Query parameters

- `identifier` string[], nullable, required: One or more external identifiers to resolve. Pass a comma-separated list to look up many at once (max 100 per call). A full profile URL works in place of a bare identifier and the platform is inferred from it. The identifier is echoed back exactly as supplied, not normalized.
- `platform` string: Restrict the lookup to one platform. Optional — omit it to match the identifier on any platform, which is what you want when you hold a handle but not its source. Accepts any platform reported on the external-links endpoints plus the company identifier namespaces 'domain', 'ticker', 'sec' (CIK) and 'wikidata' (QID).
- `type` 'person' | 'company': Restrict results to one kind of entity. Omit to search people and companies together.

## Response `200`

OK

- EntityLookup
  - `results` EntityLookupResult[], nullable, required: One result per unique input identifier, in request order. Duplicate identifiers in the request collapse to a single result.
    - `identifier` string, required: The identifier exactly as supplied in the request, not normalized.
    - `match_count` integer, required: How many distinct entities carry this identifier. Larger than the length of 'matches' when more than 10 do. A count above 1 means the identifier is shared, usually by duplicate records for the same real person — 8.7% of LinkedIn identifiers are.
    - `matches` EntityLookupMatch[], nullable, required: The entities carrying this identifier, best first: records linked to a knowledge graph entity come before those without, then oldest first. Empty when the identifier does not resolve.
      - `company` CompanyCompact
        - `description` string: Short company description, when known.
        - `domain` string: Primary website domain (e.g. 'nvidia.com'), when known.
        - `id` string, required: Company identifier (domain, slug, or encoded ID)
        - `image_url` string: Company logo or image URL
        - `name` string, required: Company name
        - `slug` string: Stable human-readable handle (the linked knowledge-graph slug, e.g. 'nvidia'), when known. Companies have no slug of their own; prefer this for display and pass it (or id) to /v1/companies.
        - `ticker` string: Primary stock ticker symbol, when listed.
      - `person` PersonCompact
        - `description` string: Short description (e.g. current role), when known.
        - `id` string, required: Encoded Person identifier
        - `image_url` string: Canonical headshot URL when one is known for the Person
        - `name` string, required: Display name
        - `slug` string: Stable human-readable handle (e.g. 'satya-nadella'). Recommended canonical identifier on every Particle Pro person surface.
      - `type` 'person' | 'company', required: Which kind of entity matched. The corresponding field below is the one that is set.
    - `platforms` string[], nullable: The platforms this identifier matched on, alphabetically. Usually one. Several when a handle is the same across platforms and no 'platform' filter was given. Omitted when nothing matched.

## Other responses

- `402`: Payment Required. Read error_code. payment_required is the x402 path: either a keyless request being challenged — pay $0.01 in USDC per request (requirements in the PAYMENT-REQUIRED header) or send a pp_ API key — or a supplied payment that failed settlement (details in the PAYMENT-RESPONSE header; retry the same signature before signing a new one). See https://docs.particle.pro/x402. Any other code means the credential was accepted but does not cover this request (a plan or session gate such as premium_required or paid_plan_confirmation_required); its resolve says how to obtain access, and no payment header is sent.
- `default`: Error

---

[API](https://skmtc.dev/particle/apis/particle-api.md) · [All operations](https://skmtc.dev/particle/apis/particle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/particle/apis/particle-api/revisions/416ba82ab9d7?raw)
