Skip to content
Docs

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?