Unipile Compatibility
Every Unipile LinkedIn route and what Direct does with it: the same, the same with differences, or 501.
Every Unipile route for LinkedIn, and what Direct does with it.
- Same: Unipile's path, parameters, answer shape and status. The read answers are checked in Direct's tests against Unipile's published response schemas.
- Same, but: answered, with the differences listed.
- 501: answers
501 errors/feature_not_implemented, so a client can fall back.
Every other path under /api/v1 (email, calendars, other providers) answers 501 too.
Accounts And Hosted Auth#
| Unipile route | Direct | Notes |
|---|---|---|
GET /accounts |
Same, but | The key's workspace's Lempile accounts only. status_counts always has STOPPED: 0. |
GET /accounts/{account_id} |
Same, but | Statuses OK, CONNECTING, CREDENTIALS, ERROR. premiumId, premiumContractId are null; organizations, groups are []. |
DELETE /accounts/{account_id} |
Same, but | Stops serving the account; never signs it out of LinkedIn. provider_session_revoke=true: 501. |
GET /accounts/{account_id}/sync |
Same, but | Answers {"object": "AccountResync", "status": "SYNC_DONE" | "SYNC_ERROR"}, or 401 when signed out. Also POST /accounts/{account_id}/resync. |
POST /hosted/accounts/link |
Same, but | LinkedIn only (providers as a string or a list; none needed to reconnect). A new account joins the key's workspace. 24 hours at most. Options disabled_features, disabled_options, proxy, sync_limit, scopes, single_use ignored. |
POST /accounts (native authentication) |
501 | Accounts connect through hosted auth only. |
POST /accounts/{account_id} (reconnect) |
501 | Use a hosted auth link with type: "reconnect". |
POST /accounts/checkpoint, POST /accounts/checkpoint/resend |
501 | Checkpoints are handled in Lempile's sign-in page. |
POST /accounts/{account_id}/restart, PATCH /accounts/{account_id} |
501 |
Webhooks#
| Unipile route | Direct | Notes |
|---|---|---|
POST /webhooks |
Same, but | Sources messaging, users, account_status only. The webhook is the key's workspace's. |
GET /webhooks |
Same, but | The key's workspace's webhooks; header values masked. |
DELETE /webhooks/{webhook_id} |
Same | |
messaging events |
Same, but | message_received, message_read, message_reaction, message_edited and message_deleted in real time (LinkedIn's own live connection), with polling as the backstop. message_delivered is accepted and never sent. |
users events |
Same, but | new_relation within about a minute when LinkedIn's live connection hints at a new one (the relations are read at once), else within 30 to 60 minutes (polling). Unipile's: up to 8 hours. |
account_status events |
Same, but | OK, CREDENTIALS, ERROR, CONNECTING, CREATION_SUCCESS, RECONNECTED, SYNC_SUCCESS, DELETED. Never CREATION_FAIL, STOPPED, PERMISSIONS. |
Users#
| Unipile route | Direct | Notes |
|---|---|---|
GET /users/me |
Same | organizations: [], recruiter and sales_navigator null. |
GET /users/{identifier} |
Same, but | Three LinkedIn calls (top card, second card, contact info), as Unipile's fields. Someone from the account's recent conversations, by provider id: names, headline, picture, link and degree only, with no call. linkedin_sections all supported; skills carry no endorsements; recruiting_activity is []. linkedin_api (Recruiter, Sales Navigator): 501. |
GET /users/relations |
Same, but | filter: 501. |
GET /users/invite/sent |
Same | |
POST /users/invite |
Same | Checks the relationship first (already_connected, already_invited_recently, cannot_invite_attendee). |
DELETE /users/invite/sent/{invitation_id} |
Same, but | The invitation must be among the account's latest 100 sent. |
GET /users/{identifier}/posts |
Same | Also companies with is_company=true. |
GET /users?provider_url= |
Same, but | Answers the UserProfile itself. |
GET /users/invite/received |
Same | |
POST /users/invite/received/{invitation_id} |
Same, but | The invitation must be among the account's latest 100 received. decline is LinkedIn's Ignore. |
PATCH /users/me |
501 | |
GET /users/{identifier}/comments, GET /users/{identifier}/reactions |
Same, but | From the member's profile activity. A reaction's value is read from LinkedIn's header ("… celebrates this"). |
GET /users/followers |
Same, but | The account's own followers; another member's user_id: an empty list (as Unipile); a company's: 501. |
GET /users/following |
Same | Unipile answers 501 for LinkedIn; so does Direct. |
Messaging#
| Unipile route | Direct | Notes |
|---|---|---|
GET /chats |
Same, but | account_id required. Inbox and archive, not spam. account_type other than LINKEDIN: 400. |
GET /chats/{chat_id} |
Same, but | account_id required. LinkedIn's thread ids, URL-safe. |
GET /chats/{chat_id}/messages |
Same, but | account_id required. Other people's reactions to a message aren't read; seen is always 0. |
GET /chats/{chat_id}/attendees |
Same, but | account_id required. |
GET /chat_attendees |
Same, but | Everyone the account has a chat with; also takes chat_id. |
GET /messages/{message_id} |
Same, but | account_id required. |
POST /chats |
Same, but | One attendee. InMail with linkedin[inmail]=true, sent as LinkedIn's Premium InMail (premiumInMail); no credit: 422 errors/insufficient_credits (not yet confirmed with a real InMail send). Voice notes (60 s at most, never as an InMail). Groups, linkedin[api] other than classic, topic, applicant_id, invitation_id, group_id: 501. |
POST /chats/{chat_id}/messages |
Same, but | account_id required. Files 20 MB each. voice_message: any audio, turned into LinkedIn's AAC .m4a, 60 s at most, sent alone (with text or files: 501). quote_id: 501. |
PATCH /chats/{chat_id} |
Same, but | setReadStatus, setMuteStatus. WhatsApp's and Telegram's actions: 422 errors/not_supported_by_provider. |
DELETE /chats/{chat_id} |
Same | |
GET /chats/{chat_id}/sync |
501 | |
GET /messages |
501 | |
GET /messages/{message_id}/attachments/{attachment_id} |
501 | Use the attachment's url. |
DELETE /messages/{message_id} |
Same, but | account_id required. The account's own messages, within 60 minutes of sending them. |
POST /messages/{message_id}/reaction, DELETE /messages/{message_id}/reaction |
Same, but | account_id required (body or query). |
PATCH /messages/{message_id} |
Same, but | account_id required. The account's own messages, within 60 minutes (checked first). |
POST /messages/{message_id}/forward |
501 | WhatsApp only on Unipile. |
GET /chat_attendees/{attendee_id} and its picture, chats, messages, sync |
501 |
Posts, Comments And Reactions#
| Unipile route | Direct | Notes |
|---|---|---|
GET /posts/{post_id} |
Same | |
POST /posts |
Same, but | Text, mentions, link, page, up to 20 images or one video; repost (plain, as a page, or with words, no files). include_job_posting, targeted_audience: 501. |
DELETE /posts/{post_id} |
Same | 204, empty. |
GET /posts/{post_id}/comments |
Same | Replies with comment_id. |
POST /posts/{post_id}/comments |
Same | Replies, mentions, link, page, one image. |
GET /posts/{post_id}/reactions |
Same | Also a comment's, with comment_id. |
POST /posts/reaction |
Same | Also on a comment, and as a page. |
DELETE /posts/{post_id}/comments/{comment_id} |
Direct only | Unipile has no such route. |
DELETE /posts/reaction |
Direct only | Unipile has no such route. |
LinkedIn Specific#
| Unipile route | Direct | Notes |
|---|---|---|
POST /linkedin/search |
Same, but | Classic people (every filter), posts (every filter), jobs (benefits, commitments, minimum_salary: 501) and companies (keywords only); by body, url or cursor. Sales Navigator, Recruiter: 403 errors/feature_not_subscribed. |
GET /linkedin/search/parameters |
Same, but | LOCATION, REGION, PEOPLE, CONNECTIONS, COMPANY, SCHOOL, INDUSTRY, JOB_TITLE, SKILL. Other classic types: 501. Sales Navigator and Recruiter types: 403. |
GET /linkedin/company/{identifier} |
Same, but | messaging.is_enabled always false; viewer_permissions all of an admin's or none; no insights, crunchbase_funding, localized_*. |
GET /linkedin/inmail_balance |
501 | |
POST /linkedin (raw data) |
Same, but | Reads only: GET of https://www.linkedin.com/voyager/api/…. Other methods and actions: 501. |
Recruiter hiring projects, contracts, Recruiter sessions, POST /linkedin/user/{user_id} |
403 | errors/feature_not_subscribed: Sales Navigator and Recruiter only. |
| Job postings and applicants, endorsements, target audience | 501 |
Direct's Own#
| Route | |
|---|---|
?dry_run=true on every write |
The exact LinkedIn call, not sent. |
Idempotency-Key on every write |
Never writes twice; 7 days. |
GET /api/v1/openapi.json, GET /docs |
This API's OpenAPI document and reference page, public. |
Was this page helpful?