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
- OAuth: 3-legged (member consent required)
- Version: 202510 (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 |
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
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
Response Fields by Tier
Common Fields (All Tiers)
These fields are available in Development, Lite, and Plus tiers:
| Field | Type | Always Returned | Description |
|---|---|---|---|
id |
string | ✅ | Unique identifier for member scoped to your application |
verifications |
array of strings | ✅ | Completed verification categories (e.g., ["IDENTITY", "WORKPLACE"]). Empty array if no verifications. |
verificationUrl |
string | ⚠️ Optional | URL to LinkedIn verification flow. Present only if member is eligible for additional verifications. |
Development & Lite Tier Response
Development and Lite tiers receive only the basic verification categories without detailed metadata.
Plus Tier Additional Fields
Important
Plus tier only: The following fields provide detailed verification metadata and require Plus tier access.
| Field | Type | Description |
|---|---|---|
userId |
string | Legacy identifier format (being deprecated - use id instead) |
lastRefreshedAt |
timestamp | When verification data was last refreshed (milliseconds since epoch) |
verifiedDetails |
array of objects | Detailed verification metadata for each completed verification |
verifiedDetails Array (Plus Only)
Each object represents a completed verification with detailed metadata.
Common Fields:
| Field | Type | Description |
|---|---|---|
category |
string | Verification category: IDENTITY or WORKPLACE |
lastVerifiedAt |
timestamp | When verification was completed (milliseconds since epoch) |
IDENTITY Verification Fields:
| Field | Type | Description |
|---|---|---|
verifiedName |
object | Legal name from government ID |
verifiedName.firstName |
string | Verified first name (uppercase) |
verifiedName.middleName |
string | Verified middle name (optional, uppercase) |
verifiedName.lastName |
string | Verified last name (uppercase) |
WORKPLACE Verification Fields:
| Field | Type | Description |
|---|---|---|
verificationMethod |
string | EMAIL_ADDRESS or MICROSOFT_ENTRA |
organizationInfo |
object | Company information |
organizationInfo.name |
string | Company name |
organizationInfo.url |
string | LinkedIn company page URL |
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: 202510'
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": "LinkedIn",
"url": "https://www.linkedin.com/company/1337"
},
"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: 202510'
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..."
}
Understanding Verification States
| State | verifications |
verificationUrl |
Action Required |
|---|---|---|---|
| Fully Verified | Contains all categories | Not present | Display verification badges |
| 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
- 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
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)
- 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 | 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
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
- 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
