SkyLight Chat
API Reference

LinkedIn

Connect LinkedIn, search prospects, run invite and sequence campaigns, and manage Recruiter jobs via the API.

Requires linkedin_access on your subscription or plan. All /linkedin/* and /channels/linkedin/* routes return 403 with linkedin_upgrade_required when the feature is not enabled.

Overview

GET /api/v1/linkedin/overview

Returns connection status, inbox stats, active LinkedIn campaigns, InMail balance, and whether a Recruiter contract is detected on the account.


Connect LinkedIn

LinkedIn uses email + password authentication with optional 2FA - same flow as Instagram.

EndpointMethod
/channels/linkedin/connectPOST
/channels/linkedin/2faPOST
/channels/linkedin/2fa/resendPOST
/channels/linkedin/statusGET
/channels/linkedin/refreshPOST
/channels/linkedin/disconnectPOST

Connect example:

curl -X POST https://dashboard.skylightchat.com/api/v1/channels/linkedin/connect \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "m.alotaibi@noortech.sa",
    "password": "YOUR_PASSWORD",
    "country": "SA"
  }'

If 2FA is required, the response includes requires_2fa: true and an account_id. Submit the code to POST /channels/linkedin/2fa.

See Channels for full request/response shapes and sync_status values.


People search (sourcing)

POST /api/v1/linkedin/sourcing/search

At least one filter is required: keywords, title, industry, location, or company.

{
  "title": "مدير تسويق",
  "location": "الرياض",
  "company": "شركة سحاب الخليج",
  "limit": 25
}

Response includes items[] with provider_id, name, headline, location, company, and profile_url, plus next_cursor for pagination.


POST /api/v1/linkedin/sourcing/launch-campaign
FieldDescription
nameCampaign label
campaign_typeinvite or sequence
provider_idsProfile IDs from search results
invite_noteOptional connection note (max 200 chars)
sequence_messagesFollow-up DMs after invite is accepted (sequence only)

Example - invite + follow-up:

{
  "name": "تواصل مع مديري التسويق في الرياض",
  "campaign_type": "sequence",
  "provider_ids": ["ACoAABcD1234", "khalid-alshammari-ksa"],
  "invite_note": "مرحباً، أتابع أعمالكم في قطاع التقنية وأحب التواصل معكم.",
  "sequence_messages": [
    {
      "text": "شكراً على قبول الدعوة - هل يناسبك اتصال قصير الأسبوع القادم؟",
      "wait_days": 3
    }
  ]
}

Outreach campaigns

Manage running campaigns:

EndpointMethod
/linkedin/outreach/campaignsGET, POST
/linkedin/outreach/campaigns/{id}GET
/linkedin/outreach/campaigns/{id}/statsGET
/linkedin/outreach/campaigns/{id}/contactsGET
/linkedin/outreach/campaigns/{id}/pausePOST
/linkedin/outreach/campaigns/{id}/resumePOST
/linkedin/outreach/campaigns/{id}/cancelPOST

POST outreach campaigns accept provider_ids or a targets string (profile URLs or public identifiers, one per line).

LinkedIn invite/sequence campaigns are separate from WhatsApp/Telegram campaigns, which use messages[] and contact lists.


Send a LinkedIn DM

Use Messages with a contact whose type is linkedin:

{
  "contact_id": 418,
  "message": "مرحباً سارة، شكراً على تواصلك معنا. كيف أقدر أساعدك؟"
}

Recruiter (seat required)

Requires a LinkedIn Recruiter contract on the connected account.

EndpointMethod
/linkedin/recruiterGET - list jobs + quotas
/linkedin/recruiter/jobsPOST - create job
/linkedin/recruiter/jobs/{id}GET
/linkedin/recruiter/jobs/{id}/publishPOST
/linkedin/recruiter/jobs/{id}/closePOST
/linkedin/recruiter/jobs/{id}/sync-applicantsPOST
/linkedin/recruiter/applicants/{id}/stagePOST
/linkedin/recruiter/applicants/{id}/ai-screenPOST
/linkedin/recruiter/applicants/{id}/resumeGET - PDF download

Create job example:

{
  "title": "مطور Laravel أول (Full Stack)",
  "description": "نبحث عن مطور Laravel بخبرة 3+ سنوات للانضمام لفريق منتج منصة المحادثات في الرياض.",
  "location": "الرياض، السعودية",
  "company_name": "شركة نور التقنية",
  "employment_type": "FULL_TIME",
  "workplace_type": "HYBRID",
  "publish_now": true
}

Subscription Quotas & Limits

All LinkedIn Recruiter endpoints are subject to plan-specific quotas and limits based on your active SkyLight subscription.

Available Limits

LimitField NameDescription
Job postsmax_linkedin_jobsMaximum number of LinkedIn jobs you can publish on your subscription.
AI screeningsmax_recruiter_ai_screensMaximum number of candidate AI candidate screenings with Gemini.
Resume downloadsmax_recruiter_resume_downloadsMaximum number of candidate PDF resumes you can download.

Quota Depletion

When you create/publish a new job, perform an AI screening (/applicants/{id}/ai-screen), or download a resume (/applicants/{id}/resume), the corresponding limit count decreases by 1.

If your remaining quota is empty (0), the endpoint will return a 403 Forbidden status with an error payload:

{
  "success": false,
  "error": "insufficient_linkedin_jobs_limit",
  "message": "You have reached your subscription limit for LinkedIn Job Posts. Please upgrade your plan."
}

You can retrieve your current limits and remaining counts at any time via the API or by viewing your subscription status inside the Dashboard under My Subscription.