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 Validation Status API (/validationStatus) allows enterprise partners to retrieve the current validation status of LinkedIn members at scale. This API is optimized for bulk or single-member checks and provides validation results across three categories.
Important
Plus Tier Only: This API is exclusively available to Plus tier partners.
Tier Availability: Development ❌ | Lite ❌ | Plus ✅
Overview
Key Features:
- Check validation status for up to 500 members per request
- No member consent required (2-legged OAuth)
- Get identity, workplace, and profile information status
- OAuth: 2-legged (application-level authorization)
- Version: 202510
Validation Categories
| Category | Description | Possible Values |
|---|---|---|
| identity | Government ID verification status | VALID, INVALID, VALID_WITH_UPDATES |
| workplace | Work affiliation verification status | VALID, INVALID, VALID_WITH_UPDATES |
| profileInformationStatus | Profile data validation status | VALID, INVALID |
Important
This API uses 2-legged OAuth and does NOT require member interaction or consent. You can call this endpoint directly to validate existing member data at scale.
Key Differences from Other APIs
| Feature | /validationStatus |
/verificationReport |
/identityMe |
|---|---|---|---|
| OAuth Type | 2-legged (application) | 3-legged (member) | 3-legged (member) |
| Member Consent | ❌ Not required | ✅ Required | ✅ Required |
| Use Case | Bulk validation checks | Individual verification details | Individual profile details |
| Batch Support | ✅ Up to 500 members | ❌ Single member | ❌ Single member |
| Returns | Validation status | Detailed verification metadata | Profile information |
| Token Lifetime | 30 minutes | 60 days | 60 days |
Tip
Use Case: Use this API to check if any of your members' profile or verification information has changed. This allows you to efficiently identify which members need data refreshes, then pull only the changed member data using /verificationReport and /identityMe.
See the Data Freshness Guide for complete implementation patterns.
Prerequisites
Before using this API, ensure you're using the latest versions of related APIs to get the required id field:
/identityMe– Version 202510.03 or later/verificationReport– Version 202510 or later
Warning
The id field returned by these endpoints is required for validation checks. Without upgrading to these versions, you cannot use the Validation Status API.
Authentication: 2-Legged OAuth
This API requires an application-level access token obtained through OAuth 2.0 Client Credentials flow.
Key Characteristics
- No member consent required – Application acts on its own behalf
- Scope:
r_validation_status - Token validity: 30 minutes
- No refresh token issued – Request new token after expiry
Get Access Token
curl -X POST 'https://www.linkedin.com/oauth/v2/accessToken' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id={YOUR_CLIENT_ID}' \
--data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
--data-urlencode 'scope=r_validation_status'
Sample Response:
{
"access_token": "AQVjYwl_Z-PJW2bChvx9ewKy3hrkQtJuM70LOj17...",
"expires_in": 1799
}
Tip
Request a new access token every 25 minutes to avoid expiry during API calls. Implement token caching and refresh logic in your application.
For complete OAuth details, see the Client Credentials Flow Guide.
Rate Limits
| Limit Type | Default | Description |
|---|---|---|
| Application-level | 5,000 requests/day | Maximum API calls per day |
| Member-level | 500 requests/day | Maximum checks per individual member per day |
Note
Rate limits may be customized based on your partnership agreement. Contact your LinkedIn Partner Solutions Engineer for details.
Endpoint Details
POST https://api.linkedin.com/rest/validationStatus?action=retrieve
Required Headers
| Header | Value | Description |
|---|---|---|
Authorization |
Bearer {ACCESS_TOKEN} |
2-legged OAuth access token |
LinkedIn-Version |
202510 |
API version |
Content-Type |
application/json |
Request body format |
Request Body
{
"validationQueries": [
{
"id": "string"
}
]
}
| Field | Type | Required | Description |
|---|---|---|---|
validationQueries |
array | Yes | Array of validation requests (max 500) |
validationQueries[].id |
string | Yes | Member identifier from /identityMe or /verificationReport |
Important
- Maximum 500 queries per request
- Use the
idfield from/identityMeor/verificationReportresponses - Each unique member ID counts toward member-level rate limits
Example Request and Response
Single Member Validation
Request:
curl -X POST 'https://api.linkedin.com/rest/validationStatus?action=retrieve' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: 202510' \
-H 'Content-Type: application/json' \
-d '{
"validationQueries": [
{"id": "abc123"}
]
}'
Response:
{
"value": [
{
"id": "abc123",
"verificationStatus": {
"identity": "VALID",
"workplace": "VALID"
},
"profileInformationStatus": "VALID"
}
]
}
Bulk Member Validation
Request:
curl -X POST 'https://api.linkedin.com/rest/validationStatus?action=retrieve' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'LinkedIn-Version: 202510' \
-H 'Content-Type: application/json' \
-d '{
"validationQueries": [
{"id": "abc123"},
{"id": "def456"},
{"id": "ghi789"}
]
}'
Response:
{
"value": [
{
"id": "abc123",
"verificationStatus": {
"identity": "VALID",
"workplace": "VALID_WITH_UPDATES"
},
"profileInformationStatus": "VALID"
},
{
"id": "def456",
"verificationStatus": {
"identity": "INVALID",
"workplace": "VALID"
},
"profileInformationStatus": "INVALID"
},
{
"id": "ghi789",
"verificationStatus": {
"identity": "VALID",
"workplace": "VALID"
},
"profileInformationStatus": "VALID"
}
]
}
Response Schema
Top-Level Fields
| Field | Type | Description |
|---|---|---|
value |
array of objects | List of validation results (one per member) |
Validation Result Object
| Field | Type | Description |
|---|---|---|
id |
string | Member identifier (same as submitted in request) |
verificationStatus |
object | Identity and workplace verification status |
profileInformationStatus |
string | Profile data validation status |
verificationStatus Object
| Field | Type | Description |
|---|---|---|
identity |
string | Identity verification status: VALID, INVALID, or VALID_WITH_UPDATES |
workplace |
string | Workplace verification status: VALID, INVALID, or VALID_WITH_UPDATES |
Status Values Explained
| Value | Applies To | Description | Action Required |
|---|---|---|---|
VALID |
All fields | Information is current and valid | No action needed |
INVALID |
All fields | Information is no longer valid (verification removed or expired) | Fetch fresh data via /verificationReport and /identityMe |
VALID_WITH_UPDATES |
identity, workplace | Information is valid, but updates are available (new verifications added or existing re-verified) | Fetch updated data if you need the latest verification details |
Decision Logic
// Example: Determine which members need data refresh
results.value.forEach(member => {
const { id, verificationStatus, profileInformationStatus } = member;
// Check if any verification changed
if (verificationStatus.identity === 'INVALID' ||
verificationStatus.identity === 'VALID_WITH_UPDATES' ||
verificationStatus.workplace === 'INVALID' ||
verificationStatus.workplace === 'VALID_WITH_UPDATES') {
// Fetch fresh verification data
refreshVerificationData(id);
}
// Check if profile changed
if (profileInformationStatus === 'INVALID') {
// Fetch fresh profile data
refreshProfileData(id);
}
});
Best Practices
Token Management
✅ Cache tokens - Don't request new tokens for every API call
✅ Refresh proactively - Get new token at 25 minutes (before 30-minute expiry)
✅ Handle 401 errors gracefully - Automatically retry with fresh token
Batching Strategy
✅ Batch up to 500 members - Maximize efficiency by filling each request
✅ Parallel requests - Send multiple batches in parallel for large datasets
✅ Respect rate limits - Track daily and per-member limits
Data Freshness Workflow
- Daily validation - Run bulk validation once per day for all members
- Identify changes - Filter members with
INVALIDorVALID_WITH_UPDATESstatus - Fetch fresh data - Call
/verificationReportand/identityMeonly for changed members - Update database - Store latest verification and profile data
Tip
This approach reduces 3-legged OAuth API calls by 95% compared to polling all members daily.
Error Handling
✅ Validate id format before sending requests
✅ Handle partial failures gracefully (some IDs may be invalid)
✅ Implement exponential backoff for 500 errors
✅ Log failed IDs for investigation
Error Handling
API-Specific Errors
| HTTP Status | Error Code | Error Message | Cause | Solution |
|---|---|---|---|---|
| 400 | S_400_BAD_REQUEST |
"Validation status request array cannot be null or empty" | Empty validationQueries array |
Include at least one validation query |
| 400 | S_400_BAD_REQUEST |
"Validation status request array size ({size}) exceeds maximum limit of 500" | Request exceeds 500 items | Split into multiple requests with max 500 queries each |
| 400 | S_400_BAD_REQUEST |
"Invalid personId: {personId}" | Invalid or malformed member ID | Use valid id from /identityMe or /verificationReport |
| 400 | S_400_BAD_REQUEST |
"API version is not available in the request" | Missing or invalid LinkedIn-Version header |
Include LinkedIn-Version: 202510 header |
| 401 | - | Unauthorized | Invalid or expired 2-legged token | Request new token using client credentials flow |
| 403 | - | Access denied | r_validation_status permission not enabled |
Contact LinkedIn Partner Solutions Engineer |
| 429 | - | Too Many Requests | Rate limit exceeded | Retry after delay; check Retry-After header |
| 500 | S_500_INTERNAL_SERVER_ERROR |
"Failed to get validation status response" | Downstream service failure | Retry with exponential backoff; contact support if persists |
For additional error handling guidance, see the LinkedIn API Error Handling Guide.
Note
If you receive a 403 "access denied" error, contact your LinkedIn Partner Solutions Engineer to enable the r_validation_status permission for your application.
Common Use Cases
1. Daily Data Freshness Check
Validate all members once per day to identify who needs data refresh:
// Step 1: Get all member IDs from your database
const allMemberIds = await db.getAllMemberIds();
// Step 2: Batch into groups of 500
const batches = chunk(allMemberIds, 500);
// Step 3: Validate each batch
const validationResults = await Promise.all(
batches.map(batch => validateMembers(batch))
);
// Step 4: Identify members needing refresh
const membersToRefresh = validationResults
.flat()
.filter(m =>
m.verificationStatus.identity !== 'VALID' ||
m.verificationStatus.workplace !== 'VALID' ||
m.profileInformationStatus === 'INVALID'
);
// Step 5: Refresh only changed members
await refreshMemberData(membersToRefresh);
2. Pre-Transaction Validation
Validate member data before critical transactions:
// Before processing payment or granting access
const validation = await validateMember(memberId);
if (validation.verificationStatus.identity === 'INVALID') {
// Identity no longer valid - require re-verification
return redirectToReVerification(memberId);
}
if (validation.verificationStatus.workplace === 'INVALID') {
// Workplace verification removed - update member status
await updateMemberWorkplaceStatus(memberId, 'unverified');
}
// Proceed with transaction
3. Compliance Audit Trail
Track verification status changes over time:
// Daily compliance check
const results = await bulkValidateMembers(allMemberIds);
// Store validation results with timestamp
await db.saveValidationSnapshot({
timestamp: Date.now(),
results: results,
summary: {
totalMembers: results.length,
validMembers: results.filter(r => r.verificationStatus.identity === 'VALID').length,
invalidMembers: results.filter(r => r.verificationStatus.identity === 'INVALID').length,
updatedMembers: results.filter(r => r.verificationStatus.identity === 'VALID_WITH_UPDATES').length
}
});
Related Resources
APIs
- Profile Details API – Get member profile information
- Verification Report API – Get detailed verification metadata
Guides
- Client Credentials Flow – OAuth 2.0 2-legged authentication
- Data Freshness Strategies – Keep member data up-to-date with polling strategies
- Implementation Guide – Best practices for OAuth, user ID management, and token storage
Other Resources
- Overview – Learn about Plus tier features
- Certification Requirements – Production readiness checklist
- Common FAQ – Troubleshooting and answers
- LinkedIn API Status Page – Monitor API health
- Release Notes – API updates and current versions