Data catalog · Enrichment
Send a LinkedIn profile URL and get the person back as structured JSON: name, headline, current title and company, location, and the full experience, education, skills and certifications arrays. One provider, one flat credit cost, billed on any 2xx.
Last updated September 22, 2026
`POST /enrich_profile` takes one field — a LinkedIn profile URL — and returns the person as JSON: name, headline, current title and company, location, and the full work history, education, skills and certification arrays. **[Get 25 free credits — no card](https://app.richapi.ai)**
The request body is `{"url": ".."}` and nothing else. A LinkedIn profile URL goes in; a person record comes out. It does not take an email. It does not take a name plus a company. If your input is an email address, you need two calls: [email to LinkedIn URL](/api/email-to-linkedin) resolves the address to a profile, and this endpoint enriches that profile. Price the chain as two billed calls, not one, and build it as two steps so you can see which half failed. The response is wide. Alongside the scalars (`firstname`, `lastname`, `headline`, `currentTitle`, `currentCompany`, `location`, `summary`, `followerCount`, `connectionCount`, `profilePicture`, `linkedinUrl`) you get `experience`, `education`, `skills`, `certifications` and `languages` as arrays. Flatten this into a CRM contact and you throw most of it away, and the arrays are usually why people call this endpoint at all.
This endpoint is **not** a multi-provider waterfall. Billing is on HTTP 2xx. A thin 2xx still bills. 4xx and 5xx bill nothing, on any endpoint. The miss-free rule on the email finder, phone finder and email verifier does not apply here.
**1. Get a key.** Sign up at [app.richapi.ai](https://app.richapi.ai). 25 free credits, no card. **2. POST the profile URL.** ```bash curl -X POST https://api.richapi.ai/api/v1/enrich_profile \ -H "x-api-key: $RICHAPI_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://www.linkedin.com/in/example/"}' ``` **3. Read the record.** Shape and key names below; the values are the OpenAPI example's literal placeholders: ```json { "firstname": "example", "lastname": "example", "headline": "example", "currentTitle": "example", "currentCompany": "example", "location": "example", "summary": "example", "experience": [], "education": [], "skills": [], "certifications": [], "languages": [], "followerCount": 1, "connectionCount": 1, "profilePicture": "example", "linkedinUrl": "example" } ``` **4. Start from an email instead, if that is what you have.** Two calls: ```bash # 1. email -> profile URL curl -X POST https://api.richapi.ai/api/v1/find_linkedin_url_by_email \ -H "x-api-key: $RICHAPI_KEY" -H "Content-Type: application/json" \ -d '{"email": "jane@acme.com"}' # 2. profile URL -> person record curl -X POST https://api.richapi.ai/api/v1/enrich_profile \ -H "x-api-key: $RICHAPI_KEY" -H "Content-Type: application/json" \ -d '{"url": "https://www.linkedin.com/in/example/"}' ``` **5. Or run either shape from an agent.** The [hosted MCP server](/integrations/claude) exposes both tools, so the two-step chain is one sentence: ``` Take this email, find the LinkedIn profile, and tell me their current title and last two roles. ```
| Field | Type | What it is | |---|---|---| | `firstname` / `lastname` | string | Name, split | | `headline` | string | The profile headline | | `currentTitle` | string | Current job title | | `currentCompany` | string | Current employer | | `location` | string | Location as shown on the profile | | `summary` | string | The About section | | `experience` | array | Work history entries | | `education` | array | Education entries | | `skills` | array | Listed skills | | `certifications` | array | Listed certifications | | `languages` | array | Listed languages | | `followerCount` | integer | Followers | | `connectionCount` | integer | Connections | | `profilePicture` | string | Image URL | | `linkedinUrl` | string | Canonical profile URL |
Flat `1 credit` per call, billed on every 2xx. The email-to-person chain costs this plus [email to LinkedIn URL](/api/email-to-linkedin) at `4 credits`, so `5 credits` per person end to end, and both legs bill independently. Credits are prepaid with no seats and no contract; the rate per credit depends on package tier, so take yours from [the pricing page](/pricing). Two things follow from that. Cache the profile URL once you have resolved it, because re-running the lookup leg on a contact you already resolved is the most common way teams double their bill here. And when you are refreshing records on a schedule, refresh the ones that matter rather than the whole table — the endpoint has no "has this changed" check, so every refresh is a full-price call.
**Keeping CRM contact records from rotting.** Titles change, people move companies, and a contact record two years old is mostly fiction. A scheduled refresh on the accounts you are actively working keeps `currentTitle` and `currentCompany` honest without a data-entry task for anyone. **Screening inbound applicants or leads against a real work history.** The `experience` array gives you the whole sequence of roles rather than a single current title, which is what you need when the question is "has this person actually done this job before" rather than "what is their title today". **Giving an agent the context to write something specific.** An SDR agent that has read `summary`, `skills` and the last two `experience` entries writes a different first line than one working from a name and a company. The record is the prompt context.
Proxycurl's person endpoint was profile-URL-in too, so the migration is mostly field-name mapping rather than a redesign. See [the migration notes](/alternatives/proxycurl).
- [Email to LinkedIn URL API](/api/email-to-linkedin) — the first leg when you start from an email - [Company enrichment API](/api/company-enrichment) — same input shape, for a company page - [LinkedIn profile search API](/api/linkedin-profile-search) — find the profile URLs in the first place - [Email finder API](/api/email-finder) — a work email for the person you just enriched - [All endpoints](/api) — the full catalog - [Pricing](/pricing) — credit packages and tier rates
**What am I charged for?** Any 2xx. This is a single-provider enrichment endpoint rather than a waterfall, so a sparse record bills the same as a rich one. A 4xx or 5xx bills nothing. **Can I enrich by email address?** Not in one call. Resolve the email to a profile URL with [email to LinkedIn URL](/api/email-to-linkedin), then pass that URL here. Two calls, two charges. **What happens if someone changed their LinkedIn vanity URL?** The stored URL stops pointing at them. This is the quiet failure in every profile-URL-keyed system: you get an error or a different person, not a helpful warning. Store `linkedinUrl` from each response and write it back, so your stored key follows the profile rather than drifting from it. **Do I get the whole work history or just the current role?** `experience` is an array of entries, not a single value, and `education`, `skills`, `certifications` and `languages` are arrays too. If your schema has one job-title column you are discarding most of what you paid for. **How fresh is the data?** Each call is a live fetch at request time rather than a read from a licensed dump refreshed on someone else's schedule. A file bought last quarter has already drifted; a call made now has not. **Can I call this from Claude or Cursor (MCP)?** Yes. The hosted MCP server exposes `enrich_profile` as a tool with a copy-paste config and no install. **Do I need a credit card?** No. 25 free credits on signup, no card.
Pull your first person record in two minutes. **[Get 25 free credits](https://app.richapi.ai)**