Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The Verification Report API allows you to retrieve verification information for LinkedIn members, including verification categories (e.g., IDENTITY, WORKPLACE), detailed metadata, and verification URLs for eligible members.
Note
Tier Availability: Development ✅ | Lite ✅ | Plus ✅
All tiers can access this API. Plus tier receives additional detailed metadata (verified names, timestamps, methods, organization info).
Overview
Key Features:
- Check member's verification status (identity and workplace)
- Get detailed verification metadata (Plus tier only)
- Generate verification URLs for unverified members
- Request freshness validation for existing verifications using the optional
verifiedWithinDaysparameter - OAuth: 3-legged (member consent required)
- Version: 202607 (Plus tier) / Check Release Notes (Dev/Lite tier)
Verification Categories
| Category | Description | Available In |
|---|---|---|
| IDENTITY | Government ID-based verification | All tiers |
| WORKPLACE | Work affiliation verification (email or Microsoft Entra) | All tiers |
Rate Limits
| Limit Type | Development | Lite | Plus | Description |
|---|---|---|---|---|
| Application-level | 5,000/day | 5,000/day | Custom | Maximum API calls per day across all users |
| Member-level | 500/day | 500/day | Custom | Maximum calls per individual member per day |
Note
Plus tier rate limits are customized based on partnership agreement.
Endpoint Details
GET https://api.linkedin.com/rest/verificationReport
Required Headers
| Header | Value | Description |
|---|---|---|
Authorization |
Bearer {ACCESS_TOKEN} |
OAuth 2.0 access token authorized by the member |
LinkedIn-Version |
{LATEST_VERSION} |
API version (see Release Notes) |
Required OAuth Scope
| Scope | Development | Lite | Plus | Purpose |
|---|---|---|---|---|
r_verify_details |
✅ Required | ✅ Required | ✅ Required | Access to verification data |
Note
Some older implementations may use r_verify scope. Both are accepted, but r_verify_details is the current standard.
Warning
Development Tier Limitation: You can only access data for LinkedIn accounts that are administrators of your developer application. This tier is for testing only.
For production use, upgrade to Lite tier.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
verificationCriteria |
string | Optional | Specifies verification categories for URL generation. Can be repeated for multiple values: IDENTITY, WORKPLACE |
verifiedWithinDays |
integer | Optional | Requests a freshness check on existing verifications. If a completed verification is older than the specified number of days, the response includes a verificationUrl so the member can re-verify. Existing verification data is still returned. Accepted values: 0 or any positive integer. Negative values return 400 Bad Request. |
Important
How verificationCriteria works:
- Does NOT filter response – Always returns ALL completed verifications
- Controls URL generation – Only generates URL for requested criteria
- Multiple values – Repeat parameter:
?verificationCriteria=IDENTITY&verificationCriteria=WORKPLACE - DO NOT use comma-separated – Will return 400 Bad Request error
Important
How verifiedWithinDays works:
- Does NOT invalidate existing verification data.
- Does NOT remove or filter
verifiedDetails. - Only influences whether a
verificationUrlis returned. - If an existing verification is older than the requested freshness window and the member is still eligible to re-verify the existing verification, a
verificationUrlis returned so the member can re-verify. - If the verification is within the requested freshness window,
verifiedWithinDaysdoes not require re-verification. However, averificationUrlmay still be returned if the member is eligible to complete additional verifications. - If omitted, the API behaves exactly as it does today.
Examples:
# Request both verifications
GET /verificationReport?verificationCriteria=IDENTITY&verificationCriteria=WORKPLACE
# Request only identity
GET /verificationReport?verificationCriteria=IDENTITY
# No criteria (returns URL for any eligible verification)
GET /verificationReport
# Require verification completed within the last year
GET /verificationReport?verifiedWithinDays=365
# Require verification completed within the last 90 days
GET /verificationReport?verifiedWithinDays=90
# Require identity verification completed within the last 90 days
GET /verificationReport?verificationCriteria=IDENTITY&verifiedWithinDays=90
# Always require re-verification (if member is eligible)
GET /verificationReport?verifiedWithinDays=0
Response Schema
| Field | Type | Tier Availability | Always Returned | Description |
|---|---|---|---|---|
id |
string | Development, Lite, Plus | ✅ | Unique identifier for member scoped to your application |
userId |
string | Plus | ⚠️ Conditional | Legacy identifier format. Partners should use id for new integrations. |
verifications |
array[string] | Development, Lite, Plus | ✅ | Completed verification categories (e.g., ["IDENTITY", "WORKPLACE"]) |
verificationUrl |
string | Development, Lite, Plus | ⚠️ Conditional | URL to the LinkedIn verification flow. Returned when the member is eligible for additional verifications, or when an existing verification is older than the requested verifiedWithinDays threshold and the member is still eligible to re-verify the existing verification. |
lastRefreshedAt |
timestamp | Plus | ⚠️ Conditional | Timestamp indicating when verification data was last refreshed (milliseconds since epoch) |
verifiedDetails |
array[object] | Plus | ⚠️ Conditional | Detailed verification metadata for completed verifications |
verifiedDetails[].category |
string | Plus | ✅ | Verification category: IDENTITY or WORKPLACE |
verifiedDetails[].lastVerifiedAt |
timestamp | Plus | ✅ | Timestamp indicating when verification was completed (milliseconds since epoch) |
verifiedDetails[].verifiedName |
object | Plus | ⚠️ Conditional | Legal name from government ID verification |
verifiedDetails[].verifiedName.firstName |
string | Plus | ⚠️ Conditional | Verified first name (uppercase) |
verifiedDetails[].verifiedName.middleName |
string | Plus | ⚠️ Conditional | Verified middle name (uppercase) |
verifiedDetails[].verifiedName.lastName |
string | Plus | ⚠️ Conditional | Verified last name (uppercase) |
verifiedDetails[].verificationMethod |
string | Plus | ⚠️ Conditional | Method used to complete verification (for example, EMAIL_ADDRESS or MICROSOFT_ENTRA) |
verifiedDetails[].organizationInfo |
object | Plus | ⚠️ Conditional | Organization information associated with workplace verification |
verifiedDetails[].organizationInfo.name |
string | Plus | ⚠️ Conditional | Company name |
verifiedDetails[].organizationInfo.url |
string | Plus | ⚠️ Conditional | LinkedIn company page URL |
Note
Plus tier responses include additional detailed metadata in the verifiedDetails array. Development and Lite tiers return only basic verification category information.
Example Requests and Responses
Example 1: Development/Lite Tier - Fully Verified Member
Member has completed both verifications. No verificationUrl in response.
Request:
curl -X GET 'https://api.linkedin.com/rest/verificationReport' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: {LATEST_VERSION}'
Response (Development/Lite Tier):
{
"verifications": ["IDENTITY", "WORKPLACE"],
"id": "Yw-zU_kyua"
}
Try the /verificationReport API in Postman to explore verification states and metadata.
Example 2: Development/Lite Tier - Unverified Member
Member has no verifications but is eligible. Response includes verificationUrl.
Request:
curl -X GET 'https://api.linkedin.com/rest/verificationReport?verificationCriteria=IDENTITY&verificationCriteria=WORKPLACE' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: {LATEST_VERSION}'
Response (Development/Lite Tier):
{
"verifications": [],
"id": "Yw-zU_kyua",
"verificationUrl": "https://www.linkedin.com/trust/verification?isDeeplinkToCCT=true&verificationUrl=..."
}
Example 3: Plus Tier - Fully Verified Member with Metadata
Member has completed both verifications. Plus tier includes detailed metadata.
Request:
curl -X GET 'https://api.linkedin.com/rest/verificationReport' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Linkedin-Version: 202607'
Response (Plus Tier with Detailed Metadata):
{
"id": "zy5ubopzH4",
"userId": "UfBk1351j0zQTGeF9TT3JCeztYB8CTz6INgveqjzg8g=",
"lastRefreshedAt": 1761504023786,
"verifications": ["IDENTITY", "WORKPLACE"],
"verifiedDetails": [
{
"category": "IDENTITY",
"verifiedName": {
"firstName": "MICHAEL",
"middleName": "GARY",
"lastName": "SCOTT"
},
"lastVerifiedAt": 1744141828585
},
{
"category": "WORKPLACE",
"verificationMethod": "EMAIL_ADDRESS",
"organizationInfo": {
"name": "Contoso",
"url": "https://www.linkedin.com/company/contoso12345"
},
"lastVerifiedAt": 1744139009883
}
]
}
Example 4: Plus Tier - Partially Verified Member
Member has identity verification, eligible for workplace. URL provided for workplace verification.
Request:
curl -X GET 'https://api.linkedin.com/rest/verificationReport?verificationCriteria=WORKPLACE' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Linkedin-Version: 202607'
Response (Plus Tier):
{
"id": "zy5ubopzH4",
"userId": "UfBk1351j0zQTGeF9TT3JCeztYB8CTz6INgveqjzg8g=",
"lastRefreshedAt": 1761504023786,
"verifications": ["IDENTITY"],
"verifiedDetails": [
{
"category": "IDENTITY",
"verifiedName": {
"firstName": "MICHAEL",
"middleName": "GARY",
"lastName": "SCOTT"
},
"lastVerifiedAt": 1744141828585
}
],
"verificationUrl": "https://www.linkedin.com/trust/verification?isDeeplinkToCCT=true&verificationUrl=...WORKPLACE..."
}
Example 5: Previously Verified Member - Re-verification Triggered by verifiedWithinDays
The member has already completed verification, but the existing verification is older than the requested freshness window. Because the member is still eligible to re-verify the existing verification, the response includes a verificationUrl. Existing verification data continues to be returned.
Request:
curl -X GET 'https://api.linkedin.com/rest/verificationReport?verifiedWithinDays=0' \
-H 'Linkedin-Version: 202607' \
-H 'Authorization: Bearer {ACCESS_TOKEN}'
Response (Plus Tier):
{
"lastRefreshedAt": 1785874373805,
"id": "zy5ubopzH4",
"verificationUrl": "https://www.linkedin.com/trust/verification?isDeeplinkToCCT=true&verificationUrl=https%3A%2F%2Fwww.linkedin.com%2Fverify%3FentryPoint%3Dfederation_external_api%26partnerId%3DAgFWe2YpiL316wAAAZ_OaFytE9qYJ-lSBK5yWyWnjChzf_IdqPyO1YmG9w%26verificationRequiredAfter%3D1785874373418%26verificationCriteria%3D%257B%2522WORK_EMAIL_ADDRESS%2522%253A%255B%2522WORK_EMAIL_ADDRESS%2522%252C%2522WORK_EMAIL_ADDRESS%2522%255D%257D",
"verifications": [
"IDENTITY",
"WORKPLACE"
],
"verifiedDetails": [
{
"workplaceEmailDomain": "linkedin.com",
"lastVerifiedAt": 1785873873287,
"verificationMethod": "EMAIL_ADDRESS",
"category": "WORKPLACE",
"organizationInfo": {
"name": "LinkedIn",
"url": "https://www.linkedin.com/company/1337"
}
},
{
"category": "IDENTITY",
"verifiedName": {
"firstName": "SOKKALINGAM",
"lastName": "SUBRAMANIAN"
},
"lastVerifiedAt": 1785525889850
}
],
"userId": "UfBk1351j0zQTGeF9TT3JCeztYB8CTz6INgveqjzg8g="
}
Understanding Verification States
| State | verifications |
verificationUrl |
Action Required |
|---|---|---|---|
| Fully Verified | Contains all categories | Not present | Display verification badges |
Previously Verified (Older than verifiedWithinDays) |
Existing verification(s) present | Returned | Prompt the member to re-verify while continuing to display existing verification data |
| Partially Verified | Contains some categories | Present | Show completed badges + "Complete Verification" button |
| Not Verified | Empty array [] |
Present | Show "Verify with LinkedIn" button |
| Not Eligible | Empty array [] |
Not present | Member cannot verify (region/eligibility restrictions) |
Verification URL Usage
What is verificationUrl?
The verificationUrl field is a LinkedIn URL that directs members to complete verification on LinkedIn.
When it's present:
- Member is eligible for additional verifications
- Member has completed verification previously, but it is older than the requested
verifiedWithinDaysthreshold and the member is still eligible to re-verify the existing verification. - If
verificationCriteriaspecified: eligible for those specific verifications - If no criteria: eligible for any verification type
When it's absent:
- Member has completed all requested verifications, OR
- Member is not eligible for any additional verifications, OR
- Existing verification satisfies the requested freshness window.
Note
Member eligibility depends on factors like region, account status, and verification availability. See LinkedIn Help Center for eligibility details.
Using Redirect URI (Optional)
A redirect URI (callback URL) allows LinkedIn to return the member to your application after verification.
Flow:
- Your app redirects member to the verification URL
- Member completes verification on LinkedIn
- LinkedIn redirects member back to your redirect URI
- Your app resumes the member's session
Configuration Requirements:
Important
The redirectUri must exactly match a URL registered in your LinkedIn Developer App's Auth tab.
Registration Steps:
- Go to LinkedIn Developer Portal
- Select your application → Auth tab
- Under Authorized redirect URLs, add your redirect URI
- Save changes
Implementation:
// Get verification URL from API response
const verificationUrl = apiResponse.verificationUrl;
// Add your redirect URI (must be URL-encoded)
const redirectUri = encodeURIComponent('https://yourapp.com/verification/callback');
const fullUrl = `${verificationUrl}&redirectUri=${redirectUri}`;
// Optionally add state parameter for CSRF protection
const state = generateRandomState(); // Store this in your database
const finalUrl = `${fullUrl}&state=${state}`;
// Redirect member to LinkedIn
window.location.href = finalUrl;
Handling Member's Return:
// In your callback handler at /verification/callback
app.get('/verification/callback', async (req, res) => {
const { state, error } = req.query;
// Validate state parameter
if (state && !validateState(state)) {
return res.status(400).send('Invalid state');
}
// Check for errors
if (error) {
return res.redirect('/dashboard?message=verification_cancelled');
}
// Fetch updated verification data
const verificationData = await callVerificationReportAPI(accessToken);
// Update your database
await updateMemberVerification(memberId, verificationData);
// Redirect to success page
res.redirect('/dashboard?message=verification_complete');
});
Warning
- Do NOT cache or persist
verificationUrl. Always get a fresh URL from the API. - URLs are single-use and may expire.
- If
redirectUriis omitted, member stays on LinkedIn after verification.
Common Issues:
| Issue | Cause | Resolution |
|---|---|---|
| Member not redirected | redirectUri not URL-encoded |
URL-encode the parameter |
| Redirect fails | Mismatch with registered URL | Use exact URL from Developer Portal |
| Member stays on LinkedIn | Missing redirectUri parameter |
Add parameter if redirect desired |
Important Concepts
Verified Name vs LinkedIn Profile Name (Plus Tier)
- The
verifiedNamein identity verification is the legal name from government ID - LinkedIn Profile Name comes from
/identityMeAPI (e.g., "John Doe") - Verified Name comes from
/verificationReportAPI (e.g., "JOHN M DOE") - These names may differ intentionally
Data Freshness
All Tiers:
- Check verification status before critical actions (payments, access grants)
- If your application requires members to periodically reconfirm their identity or workplace verification, use the optional
verifiedWithinDaysparameter when calling/verificationReport. This performs an on-demand freshness check without removing any existing verification data. - Consider caching responses temporarily to reduce API calls
Plus Tier:
- Use
lastRefreshedAttimestamp to determine when to refresh - Recommended refresh frequency: once per day for most use cases
- Use
/validationStatusAPI for bulk data freshness checks - See Data Freshness Guide for comprehensive strategies
Error Handling
Common API Errors
| HTTP Status | Error | Cause | Solution |
|---|---|---|---|
| 400 | Bad Request | Invalid verificationCriteria, or comma-separated values |
Use only IDENTITY or WORKPLACE; repeat parameter for multiple values |
| 400 | Bad Request | verifiedWithinDays is negative |
Specify 0 or a positive integer |
| 400 | API version not available | Missing or invalid LinkedIn-Version header |
Include LinkedIn-Version: {LATEST_VERSION} header |
| 401 | Unauthorized | Invalid or expired access token | Refresh the access token and retry |
| 403 | Forbidden | Missing required OAuth scope | Ensure r_verify_details scope is authorized |
| 403 | Insufficient permissions (admin required) | Development tier: Non-admin member | Use admin member token or upgrade to Lite tier |
| 403 | No valid API product assigned | Product not enabled in Developer Portal | Add "Verified on LinkedIn" product to your app |
| 404 | Not Found | Invalid endpoint or member not found | Verify request URL and member status |
| 426 | Upgrade Required | Deprecated API version | Update LinkedIn-Version header to latest version |
| 429 | Too Many Requests | Rate limit exceeded | Retry after delay specified in Retry-After header |
| 500 | Internal Server Error | Temporary LinkedIn service issue | Retry with exponential backoff; contact support if persists |
For additional error handling guidance, see the LinkedIn API Error Handling Guide.
Best Practices
For All Tiers
✅ Always use LinkedIn-Version header for API compatibility
✅ Handle all verification states (fully verified, partially verified, not verified, not eligible)
✅ Use verificationUrl only for redirection – Don't expose or store it
✅ URL-encode your redirectUri before appending
✅ Validate id field uniqueness in your system
✅ Combine with /identityMe for complete member context
✅ Cache responses temporarily to reduce API calls
✅ Use verifiedWithinDays only when your application requires periodic re-verification.
✅ Choose a freshness window appropriate for your business use case (for example, 30, 90, or 365 days).
✅ Continue displaying existing verification information while prompting members to re-verify.
For Development Tier
⚠️ Remember: Only admin accounts can be accessed
💡 Test verification flows thoroughly before requesting Lite tier
💡 Verify badge display in your UI
For Plus Tier
✅ Use id field (not deprecated userId)
✅ Display verified names when showing identity verification
✅ Show organization info for workplace verifications
✅ Implement data freshness checks using lastVerifiedAt timestamps
✅ Use /validationStatus API for bulk freshness validation
Use Cases
All Tiers
- Display "Verified on LinkedIn" badges
- Confirm member trust and authenticity
- Trigger verification flows for unverified members
- Prompt members to periodically re-confirm identity or workplace verification.
- Enforce freshness requirements for high-trust workflows without invalidating existing verification data.
- Build trust scores based on verification status
Plus Tier Additional Use Cases
- Display verified legal name for identity confirmation
- Show verified company affiliation with logo
- Build detailed audit trails with verification timestamps
- Implement data freshness validation workflows
- Display verification methods for transparency
Related Resources
APIs
- Profile Details API – Get member profile information
- Validation Status API – Bulk validation checks (Plus tier only)
Guides
- Quickstart Guide – Get started with the API
- Upgrade to Lite Tier – Move to production
- Implementation Guide – Best practices
- Data Freshness Strategies – Keep data current (Plus tier)
- Certification Requirements – Production readiness (Plus tier)
Authentication
- Authorization Code Flow – OAuth 2.0 3-legged authentication
Other Resources
- Branding & UX Guidelines – Display verification badges correctly
- FAQ – Troubleshooting and answers
- Release Notes – API updates and current versions
- Overview – Product overview and tier comparison
