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.
Get from zero to your first successful API call displaying detailed verification data in 15 minutes. Plus tier provides enterprise-grade features including basic profile data, detailed verification metadata, and bulk validation capabilities.
Important
Enterprise Partnership Required
Plus tier access requires approval from LinkedIn Business Development. This tier is designed for enterprise partners with strategic use cases.
Overview
What You'll Get
✅ Basic profile data - Current job, education, and professional details
✅ Detailed verification metadata - Verified names, timestamps, methods, organization info
✅ Bulk validation API - Check freshness for up to 500 members per request
✅ Custom rate limits - Enterprise-scale API access
✅ Priority support - Dedicated partner support team
API Access
| Endpoint | Available | Response Data |
|---|---|---|
| /identityMe | ✅ Yes | Basic profile (name, email, photo, URL, education, job) |
| /verificationReport | ✅ Yes | Detailed verification metadata with timestamps |
| /validationStatus | ✅ Yes | Bulk member validation (up to 500 members) |
OAuth Scopes
| Scope | Available | Purpose |
|---|---|---|
r_profile_basicinfo |
✅ Yes | Basic profile information |
r_verify_details |
✅ Yes | Detailed verification metadata with timestamps |
r_primary_current_experience |
✅ Yes | Current job title and company |
r_most_recent_education |
✅ Yes | Most recent education information |
Rate Limits
- Custom limits - Negotiated based on partnership agreement
- Bulk validation - Up to 500 members per
/validationStatusrequest
Prerequisites
Before starting, ensure you have:
- ✅ Approved partner access from LinkedIn Business Development
- ✅ Developer application created in LinkedIn Developer Portal
- ✅ Client ID and Client Secret from your app's Auth tab
- ✅ Verified on LinkedIn Plus product enabled for your application
Tip
To request access, visit Verified on LinkedIn and submit an access request.
Step 1: Set Up OAuth (2 minutes)
Configure Redirect URI
- Go to Developer Portal → Your App → Auth tab
- Add your redirect URI (e.g.,
https://yourapp.com/auth/linkedin/callback) - Note your Client ID and Client Secret
Request Authorization
Redirect the member to LinkedIn's authorization page with all required scopes:
GET https://www.linkedin.com/oauth/v2/authorization
?response_type=code
&client_id={YOUR_CLIENT_ID}
&redirect_uri={YOUR_REDIRECT_URI}
&state={RANDOM_STRING}
&scope=r_verify_details%20r_profile_basicinfo%20r_primary_current_experience%20r_most_recent_education
Required OAuth Scopes (Plus Tier):
r_verify_details– Detailed verification metadatar_profile_basicinfo– Basic profile infor_primary_current_experience– Current job detailsr_most_recent_education– Education information
Note
Request all scopes at once for the best user experience. See Implementation Guide for details.
Exchange Code for Access Token
After the member approves, LinkedIn redirects to your URI with an authorization code. Exchange it for an access token:
curl -X POST 'https://www.linkedin.com/oauth/v2/accessToken' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code' \
-d 'code={AUTHORIZATION_CODE}' \
-d 'redirect_uri={YOUR_REDIRECT_URI}' \
-d 'client_id={YOUR_CLIENT_ID}' \
-d 'client_secret={YOUR_CLIENT_SECRET}'
Sample Response:
{
"access_token": "AQWsGriMiJuFpzv7...",
"expires_in": 5183999,
"refresh_token": "AQVObXp9RNF9RuuN...",
"scope": "r_verify_details,r_profile_basicinfo,r_primary_current_experience,r_most_recent_education",
"token_type": "Bearer"
}
Important
- Access tokens expire in 60 days
- Refresh tokens expire in 365 days
- Store both tokens securely and implement automatic refresh
Step 2: Call /identityMe API (3 minutes)
Get comprehensive member profile data including education and current position:
curl -X GET 'https://api.linkedin.com/rest/identityMe' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: {LATEST_VERSION}'
Sample Response (Plus Tier):
{
"id": "abc123",
"lastRefreshedAt": 1760631246905,
"basicInfo": {
"firstName": {
"localized": { "en_US": "John" },
"preferredLocale": { "country": "US", "language": "en" }
},
"lastName": {
"localized": { "en_US": "Doe" },
"preferredLocale": { "country": "US", "language": "en" }
},
"primaryEmailAddress": "john.doe@example.com",
"profileUrl": "https://www.linkedin.com/profile-thirdparty-redirect/...",
"profilePicture": {
"croppedImage": {
"downloadUrl": "https://media.licdn.com/dms/image/...",
"downloadUrlExpiresAt": 1763596800000
}
}
},
"primaryCurrentExperience": {
"title": {
"localized": { "en_US": "Software Engineer" },
"preferredLocale": { "country": "US", "language": "en" }
},
"companyName": {
"localized": { "en_US": "Tech Corp" },
"preferredLocale": { "country": "US", "language": "en" }
}
},
"mostRecentEducation": {
"schoolName": {
"localized": { "en_US": "University of Example" },
"preferredLocale": { "country": "US", "language": "en" }
},
"degreeName": {
"localized": { "en_US": "Bachelor of Science" },
"preferredLocale": { "country": "US", "language": "en" }
},
"fieldOfStudy": {
"localized": { "en_US": "Computer Science" },
"preferredLocale": { "country": "US", "language": "en" }
}
}
}
Note
Plus tier returns additional fields: primaryCurrentExperience and mostRecentEducation. See /identityMe API Reference for complete schema.
Explore Plus tier capabilities using our Postman collection, including verification metadata and bulk validation examples.
Step 3: Call /verificationReport API (3 minutes)
Get detailed verification status with metadata:
curl -X GET 'https://api.linkedin.com/rest/verificationReport' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: {LATEST_VERSION}'
Sample Response (Plus Tier):
{
"id": "abc123",
"verifications": ["IDENTITY", "WORKPLACE"],
"identityVerification": {
"verifiedName": {
"firstName": {
"localized": { "en_US": "John" },
"preferredLocale": { "country": "US", "language": "en" }
},
"lastName": {
"localized": { "en_US": "Doe" },
"preferredLocale": { "country": "US", "language": "en" }
}
},
"verifiedAt": 1698796800000
},
"workplaceVerification": {
"organizationName": "Tech Corp",
"organizationLogoUrl": "https://media.licdn.com/dms/image/...",
"verificationMethod": "WORK_EMAIL",
"verifiedAt": 1698796800000
}
}
Note
Plus tier returns detailed metadata including verified names, timestamps, and verification methods. Development/Lite tiers only return verification categories.
Step 4: Call /validationStatus API (3 minutes)
Check data freshness for multiple members in bulk (Plus tier exclusive):
curl -X POST 'https://api.linkedin.com/rest/validationStatus' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: {LATEST_VERSION}' \
-H 'Content-Type: application/json' \
-d '{
"memberIds": ["abc123", "def456", "ghi789"]
}'
Sample Response:
{
"results": [
{
"memberId": "abc123",
"status": "FRESH",
"lastRefreshedAt": 1760631246905
},
{
"memberId": "def456",
"status": "STALE",
"lastRefreshedAt": 1698796800000
},
{
"memberId": "ghi789",
"status": "FRESH",
"lastRefreshedAt": 1760500000000
}
]
}
Important
- 2-legged OAuth - Uses client credentials (no member consent required)
- Batch limit - Up to 500 member IDs per request
- Use case - Check if cached data needs refreshing
See /validationStatus API Reference for complete documentation.
Step 5: Display Verification Data
Show Verification Badges
Follow branding guidelines to display verification badges:
<!-- Identity Verified -->
<div class="verification-badge">
<img src="identity-verified-badge.svg" alt="Identity Verified" />
<span>Identity Verified</span>
</div>
<!-- Workplace Verified -->
<div class="verification-badge">
<img src="workplace-verified-badge.svg" alt="Workplace Verified" />
<span>Workplace Verified at Tech Corp</span>
</div>
Display Profile Data
<div class="member-profile">
<img src="{profilePicture.downloadUrl}" alt="{firstName} {lastName}" />
<h2>{firstName} {lastName}</h2>
<p>{primaryCurrentExperience.title} at {primaryCurrentExperience.companyName}</p>
<p>Education: {mostRecentEducation.degreeName} from {mostRecentEducation.schoolName}</p>
</div>
Best Practices
OAuth & Tokens
- ✅ Request all scopes at once (better UX)
- ✅ Store tokens encrypted at rest
- ✅ Implement automatic token refresh
- ✅ Use refresh tokens to keep data fresh
Data Freshness
- ✅ Use
/validationStatusto check if data is stale - ✅ Refresh stale data proactively
- ✅ Cache API responses appropriately
- ✅ See Data Freshness Guide
Security
- ✅ Enforce unique member ID validation
- ✅ Use HTTPS only
- ✅ Implement CSRF protection
- ✅ See Implementation Guide
Production Readiness
- ✅ Complete certification requirements
- ✅ Follow implementation guidelines
- ✅ Implement comprehensive error handling
- ✅ Monitor API usage and performance
Next Steps
Plus Tier Features
- Data Freshness - Keep member data up-to-date
- Certification - Production readiness requirements
Implementation Guide
- Implementation Guide - OAuth, tokens, testing, production best practices
API References
- /identityMe API - Profile details endpoint
- /verificationReport API - Verification details endpoint
- /validationStatus API - Bulk validation endpoint
- Authentication - OAuth details
Resources
- Branding Guidelines - Display badges correctly
- Common FAQ - Frequently asked questions
- Release Notes - API updates and changes
Troubleshooting
"Insufficient scope" Error
Cause: Missing required OAuth scopes
Solution:
- Verify all 4 scopes are requested:
r_verify_details,r_profile_basicinfo,r_primary_current_experience,r_most_recent_education - Re-authorize the member with correct scopes
- Check token scope in OAuth response
"Product not assigned" Error
Cause: Plus tier not enabled for your application
Solution:
- Verify Plus tier approval with LinkedIn Business Development
- Check Developer Portal → Products tab shows "Plus Tier"
- Contact your LinkedIn partner manager
Missing Education or Job Data
Cause: Member hasn't added data to LinkedIn profile, or missing scopes
Solution:
- Check member's LinkedIn profile has education/job data
- Verify
r_primary_current_experienceandr_most_recent_educationscopes granted - Handle missing fields gracefully in your UI
Rate Limit Exceeded
Cause: Exceeded custom rate limits
Solution:
- Review your rate limit agreement
- Implement caching and optimize API calls
- Contact your LinkedIn partner manager to discuss limits
🎉 Congratulations! You're now using Verified on LinkedIn Plus tier with enterprise features. Complete certification requirements before going to production.
