Connect
OAuth flows and connection management for linking social media platforms to Late
Start OAuth connection for a platform
Initiate an OAuth connection flow for any supported social media platform.
Standard Flow (Hosted UI): For Facebook connections, Late hosts the page selection UI:
- Call this endpoint with your API key and
redirect_url(optional) - Redirect your user to the returned
authUrl - After OAuth, the user is redirected to Late’s hosted page selector at
/connect/facebook/select-page?profileId=X&tempToken=Y&userProfile=Z&redirect_url=YOUR_URL&connect_token=CT - After they pick a page, Late saves the connection and finally redirects to your
redirect_url(if provided)
Headless/Whitelabel Mode (Facebook, LinkedIn, Pinterest & Google Business Profile): Build your own fully branded selection UI while Late handles OAuth:
Facebook:
- Call this endpoint with your API key and add
&headless=true, e.g.
GET /v1/connect/facebook?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true - Redirect your user to the returned
authUrl - After OAuth, the user is redirected directly to your
redirect_urlwith:profileId– your Late profile IDtempToken– temporary Facebook access tokenuserProfile– URL‑encoded JSON user profileconnect_token– short‑lived connect token (for API auth)platform=facebookstep=select_page
- Use
tempToken,userProfile, and theX-Connect-Tokenheader with:GET /v1/connect/facebook/select-pageto fetch pagesPOST /v1/connect/facebook/select-pageto save the selected page
- In this mode, users never see Late's hosted page selector – only your UI.
LinkedIn:
- Call this endpoint with
&headless=true, e.g.GET /v1/connect/linkedin?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true - Redirect your user to the returned
authUrl - After OAuth, the user is redirected directly to your
redirect_urlwith:profileId– your Late profile IDpendingDataToken– token to fetch OAuth data via API (see step 4)connect_token– short-lived connect token (for API auth)platform=linkedinstep=select_organization
- Call
GET /v1/connect/pending-data?token=PENDING_DATA_TOKENto fetch the OAuth data:tempToken– temporary LinkedIn access tokenuserProfile– JSON object withid,username,displayName,profilePictureorganizations– JSON array withid,urn,name,vanityNamefor each orgrefreshToken/expiresIn– token metadata This endpoint is one-time use and data expires after 10 minutes.
- Optional: To fetch full organization details (logos, website, industry, description), call
GET /v1/connect/linkedin/organizations?tempToken=X&orgIds=id1,id2,... - Call
POST /v1/connect/linkedin/select-organizationwith theX-Connect-Tokenheader to save the selection. - In this mode, users never see Late's hosted organization selector – only your UI.
- Note: If the user has no organization admin access,
step=select_organizationwill NOT be present, and the account will be connected directly as a personal account.
Pinterest:
- Call this endpoint with
&headless=true, e.g.GET /v1/connect/pinterest?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true - Redirect your user to the returned
authUrl - After OAuth, the user is redirected directly to your
redirect_urlwith:profileId– your Late profile IDtempToken– temporary Pinterest access tokenuserProfile– URL‑encoded JSON user profileconnect_token– short‑lived connect token (for API auth)platform=pintereststep=select_board
- Use
tempToken,userProfile, and theX-Connect-Tokenheader with:GET /v1/connect/pinterest/select-boardto fetch boardsPOST /v1/connect/pinterest/select-boardto save the selected board
- In this mode, users never see Late's hosted board selector – only your UI.
Google Business Profile:
- Call this endpoint with
&headless=true, e.g.GET /v1/connect/googlebusiness?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true - Redirect your user to the returned
authUrl - After OAuth, the user is redirected directly to your
redirect_urlwith:profileId– your Late profile IDtempToken– temporary Google access tokenuserProfile– URL‑encoded JSON user profile (includes refresh token info)connect_token– short‑lived connect token (for API auth)platform=googlebusinessstep=select_location
- Use
tempToken,userProfile, and theX-Connect-Tokenheader with:GET /v1/connect/googlebusiness/locationsto fetch business locationsPOST /v1/connect/googlebusiness/select-locationto save the selected location
- In this mode, users never see Late's hosted location selector – only your UI.
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Social media platform to connect
"facebook" | "instagram" | "linkedin" | "twitter" | "tiktok" | "youtube" | "threads" | "reddit" | "pinterest" | "bluesky" | "googlebusiness" | "telegram" | "snapchat"Query Parameters
Your Late profile ID (get from /v1/profiles)
Optional: Your custom redirect URL after connection completes.
Standard Mode: Omit headless=true to use our hosted page selection UI.
After the user selects a Facebook Page, Late redirects here with:
?connected=facebook&profileId=X&username=Y
Headless Mode (Facebook, LinkedIn, Pinterest, Google Business Profile & Snapchat):
Pass headless=true as a query parameter on this endpoint (not inside redirect_url), e.g.:
GET /v1/connect/facebook?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
GET /v1/connect/linkedin?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
GET /v1/connect/pinterest?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
GET /v1/connect/googlebusiness?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
GET /v1/connect/snapchat?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
After OAuth, the user is redirected directly to your redirect_url with OAuth data:
- Facebook:
?profileId=X&tempToken=Y&userProfile=Z&connect_token=CT&platform=facebook&step=select_page - LinkedIn:
?profileId=X&pendingDataToken=TOKEN&connect_token=CT&platform=linkedin&step=select_organizationUseGET /v1/connect/pending-data?token=TOKENto fetch tempToken, userProfile, organizations, refreshToken. - Pinterest:
?profileId=X&tempToken=Y&userProfile=Z&connect_token=CT&platform=pinterest&step=select_board - Google Business:
?profileId=X&tempToken=Y&userProfile=Z&connect_token=CT&platform=googlebusiness&step=select_location - Snapchat:
?profileId=X&tempToken=Y&userProfile=Z&publicProfiles=PROFILES&connect_token=CT&platform=snapchat&step=select_public_profile(publicProfiles containsid,display_name,username,profile_image_url,subscriber_count)
Then use the respective endpoints to build your custom UI:
- Facebook:
/v1/connect/facebook/select-page(GET to fetch, POST to save) - LinkedIn:
/v1/connect/linkedin/organizations(GET to fetch logos),/v1/connect/linkedin/select-organization(POST to save) - Pinterest:
/v1/connect/pinterest/select-board(GET to fetch, POST to save) - Google Business:
/v1/connect/googlebusiness/locations(GET) and/v1/connect/googlebusiness/select-location(POST) - Snapchat:
/v1/connect/snapchat/select-profile(POST to save selected public profile)
Example: https://yourdomain.com/integrations/callback
uriResponse Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/facebook?profileId=string"{
"authUrl": "https://www.facebook.com/v21.0/dialog/oauth?client_id=...",
"state": "user123-profile456-1234567890-https://yourdomain.com/callback"
}{
"error": "Unauthorized"
}Complete OAuth token exchange manually (for server-side flows)
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
curl -X POST "https://getlate.dev/api/v1/connect/string" \ -H "Content-Type: application/json" \ -d '{ "code": "string", "state": "string", "profileId": "string" }'{
"error": "Unauthorized"
}List Facebook Pages after OAuth (Headless Mode)
Headless Mode for Custom UI
After initiating Facebook OAuth via /v1/connect/facebook, you'll be redirected to
/connect/facebook/select-page with query params including tempToken and userProfile.
For a headless/whitelabeled flow, extract these params from the URL and call this endpoint to retrieve the list of Facebook Pages the user can manage. Then build your own UI to let users select a page.
Note: Use the X-Connect-Token header if you initiated the connection via API key
(rather than a browser session).
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
Profile ID from your connection flow
Temporary Facebook access token from the OAuth callback redirect
Response Body
application/json
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/facebook/select-page?profileId=string&tempToken=string"{
"pages": [
{
"id": "123456789",
"name": "My Brand Page",
"username": "mybrand",
"access_token": "EAAxxxxx...",
"category": "Brand",
"tasks": [
"MANAGE",
"CREATE_CONTENT"
]
}
]
}{
"error": "Unauthorized"
}{
"error": "string"
}Select a Facebook Page to complete the connection (Headless Mode)
Complete the Headless Flow
After displaying your custom UI with the list of pages from the GET endpoint, call this endpoint to finalize the connection with the user's selected page.
The userProfile should be the decoded JSON object from the userProfile query param
in the OAuth callback redirect URL.
Note: Use the X-Connect-Token header if you initiated the connection via API key.
API key authentication - use your Late API key as a Bearer token
In: header
Profile ID from your connection flow
The Facebook Page ID selected by the user
Temporary Facebook access token from OAuth
Decoded user profile object from the OAuth callback
Optional custom redirect URL to return to after selection
uriResponse Body
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/facebook/select-page" \ -H "Content-Type: application/json" \ -d '{ "profileId": "507f1f77bcf86cd799439011", "pageId": "123456789", "tempToken": "EAAxxxxx...", "userProfile": { "id": "987654321", "name": "John Doe", "profilePicture": "https://..." }, "redirect_url": "https://yourdomain.com/integrations/callback" }'{
"message": "Facebook page connected successfully",
"redirect_url": "https://yourdomain.com/integrations/callback?connected=facebook&profileId=507f1f77bcf86cd799439011&username=My+Brand+Page",
"account": {
"accountId": "64e1f0a9e2b5af0012ab34cd",
"platform": "facebook",
"username": "mybrand",
"displayName": "My Brand Page",
"profilePicture": "https://...",
"isActive": true,
"selectedPageName": "My Brand Page"
}
}{
"error": "Unauthorized"
}List Google Business Locations after OAuth (Headless Mode)
Headless Mode for Custom UI
After initiating Google Business OAuth via /v1/connect/googlebusiness?headless=true, you'll be redirected
to your redirect_url with query params including tempToken and userProfile.
For a headless/whitelabeled flow, extract these params from the URL and call this endpoint to retrieve the list of Google Business locations the user can manage. Then build your own UI to let users select a location.
Note: Use the X-Connect-Token header if you initiated the connection via API key
(rather than a browser session).
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
Profile ID from your connection flow
Temporary Google access token from the OAuth callback redirect
Response Body
application/json
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/googlebusiness/locations?profileId=string&tempToken=string"{
"locations": [
{
"id": "9281089117903930794",
"name": "My Coffee Shop",
"accountId": "accounts/113303573364907650416",
"accountName": "My Business Account",
"address": "123 Main St, City, Country",
"category": "Coffee shop"
}
]
}{
"error": "Unauthorized"
}{
"error": "string"
}Select a Google Business location to complete the connection (Headless Mode)
Complete the Headless Flow
After displaying your custom UI with the list of locations from the GET /v1/connect/googlebusiness/locations
endpoint, call this endpoint to finalize the connection with the user's selected location.
The userProfile should be the decoded JSON object from the userProfile query param
in the OAuth callback redirect URL. It contains important token information (including refresh token).
Note: Use the X-Connect-Token header if you initiated the connection via API key.
API key authentication - use your Late API key as a Bearer token
In: header
Profile ID from your connection flow
The Google Business location ID selected by the user
Temporary Google access token from OAuth
Decoded user profile object from the OAuth callback. Important: This contains the refresh token needed for token refresh. Always include this field.
Optional custom redirect URL to return to after selection
uriResponse Body
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/googlebusiness/select-location" \ -H "Content-Type: application/json" \ -d '{ "profileId": "507f1f77bcf86cd799439011", "locationId": "9281089117903930794", "tempToken": "ya29.xxxxx...", "userProfile": { "id": "113303573364907650416", "name": "John Doe", "refreshToken": "1//0gxxxxx...", "tokenExpiresIn": 3599, "scope": "https://www.googleapis.com/auth/business.manage" }, "redirect_url": "https://yourdomain.com/integrations/callback" }'{
"message": "Google Business location connected successfully",
"redirect_url": "https://yourdomain.com/integrations/callback?connected=googlebusiness&profileId=507f1f77bcf86cd799439011&username=My+Coffee+Shop",
"account": {
"accountId": "64e1f0a9e2b5af0012ab34cd",
"platform": "googlebusiness",
"username": "My Coffee Shop",
"displayName": "My Coffee Shop",
"isActive": true,
"selectedLocationName": "My Coffee Shop",
"selectedLocationId": "9281089117903930794"
}
}{
"error": "Unauthorized"
}Fetch pending OAuth selection data (Headless Mode)
Fetch Pending OAuth Data for Headless Mode
In headless mode, platforms like LinkedIn store OAuth selection data (organizations, pages, etc.) in the database instead of passing it via URL parameters. This prevents URI_TOO_LONG errors when users have many organizations/pages to select from.
After OAuth redirect, use the pendingDataToken from the URL to fetch the stored data.
Important:
- This endpoint is one-time use: data is deleted after being fetched
- Data expires automatically after 10 minutes if not fetched
- No authentication required, just the token from the redirect URL
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
The pending data token from the OAuth redirect URL (pendingDataToken parameter)
Response Body
application/json
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/pending-data?token=string"{
"platform": "linkedin",
"profileId": "abc123",
"tempToken": "AQV...",
"refreshToken": "AQW...",
"expiresIn": 5183999,
"userProfile": {
"id": "ABC123",
"username": "John Doe",
"displayName": "John Doe",
"profilePicture": "https://..."
},
"selectionType": "organizations",
"organizations": [
{
"id": "12345",
"urn": "urn:li:organization:12345",
"name": "Acme Corp",
"vanityName": "acme-corp"
},
{
"id": "67890",
"urn": "urn:li:organization:67890",
"name": "Example Inc",
"vanityName": "example-inc"
}
]
}{
"error": "string",
"details": {}
}{
"error": "string",
"details": {}
}Fetch full LinkedIn organization details (Headless Mode)
Fetch Full Organization Details for Custom UI
After LinkedIn OAuth in headless mode, the redirect URL contains organization data with only
id, urn, and name fields (additional details are excluded to prevent URL length issues with many organizations).
Use this endpoint to fetch full organization details including logos, vanity names, websites, and more if you want to display them in your custom selection UI.
Note: This endpoint requires no authentication - just the tempToken from the OAuth redirect.
Details are fetched directly from LinkedIn's API in parallel for fast response times.
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
The temporary LinkedIn access token from the OAuth redirect
Comma-separated list of organization IDs to fetch details for (max 100)
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/linkedin/organizations?tempToken=string&orgIds=12345678%2C87654321%2C11111111"{
"organizations": [
{
"id": "12345678",
"logoUrl": "https://media.licdn.com/dms/image/v2/...",
"vanityName": "acme-corp",
"website": "https://acme.com",
"industry": "Technology",
"description": "Leading provider of innovative solutions"
},
{
"id": "87654321",
"logoUrl": "https://media.licdn.com/dms/image/v2/...",
"vanityName": "example-inc",
"website": "https://example.com"
},
{
"id": "11111111"
}
]
}{
"error": "Missing tempToken parameter"
}Select LinkedIn organization or personal account after OAuth
Complete the LinkedIn Connection Flow
After OAuth, the user is redirected with organizations in the URL params (if they have org admin access).
The organizations array contains id, urn, and name fields. Use this data to build your UI,
then call this endpoint to save the selection.
Set accountType to personal to connect as the user's personal LinkedIn profile, or
organization to connect as a company page (requires selectedOrganization object).
Personal Profile: To connect a personal LinkedIn account, set accountType to "personal"
and omit the selectedOrganization field entirely. This is the simplest flow.
Headless Mode: Use the X-Connect-Token header if you initiated the connection via API key.
API key authentication - use your Late API key as a Bearer token
In: header
"personal" | "organization"uriResponse Body
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/linkedin/select-organization" \ -H "Content-Type: application/json" \ -d '{ "profileId": "64f0a1b2c3d4e5f6a7b8c9d0", "tempToken": "AQX...", "userProfile": { "id": "abc123", "username": "johndoe", "displayName": "John Doe", "profilePicture": "https://media.licdn.com/dms/image/v2/..." }, "accountType": "personal" }'{
"message": "LinkedIn account connected successfully",
"account": {
"accountId": "64e1f0a9e2b5af0012ab34cd",
"platform": "linkedin",
"username": "johndoe",
"displayName": "John Doe",
"profilePicture": "https://media.licdn.com/...",
"isActive": true,
"accountType": "personal"
}
}{
"error": "Unauthorized"
}List Pinterest Boards after OAuth (Headless Mode)
Retrieve Pinterest Boards for Selection UI
After initiating Pinterest OAuth via /v1/connect/pinterest with headless=true, you'll be redirected to
your redirect_url with query params including tempToken and userProfile.
If you want to build your own fully-branded board selector (instead of Late's hosted UI), call this
endpoint to retrieve the list of Pinterest Boards the user can post to. Then build your
UI and call POST /v1/connect/pinterest/select-board to save the selection.
Authentication: Use X-Connect-Token header with the connect_token from the redirect URL.
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
Your Late profile ID
Temporary Pinterest access token from the OAuth callback redirect
Header Parameters
Short-lived connect token from the OAuth redirect
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/pinterest/select-board?profileId=string&tempToken=string" \ -H "X-Connect-Token: string"{
"boards": [
{
"id": "123456789012345678",
"name": "Marketing Ideas",
"description": "Collection of marketing inspiration",
"privacy": "PUBLIC"
},
{
"id": "234567890123456789",
"name": "Product Photos",
"description": "Product photography",
"privacy": "PUBLIC"
}
]
}{
"error": "Unauthorized"
}Select a Pinterest Board to complete the connection (Headless Mode)
Complete the Pinterest Connection Flow
After OAuth, use this endpoint to save the selected board and complete the Pinterest account connection.
Headless Mode: Use the X-Connect-Token header if you initiated the connection via API key.
API key authentication - use your Late API key as a Bearer token
In: header
Your Late profile ID
The Pinterest Board ID selected by the user
The board name (for display purposes)
Temporary Pinterest access token from OAuth
User profile data from OAuth redirect
Pinterest refresh token (if available)
Token expiration time in seconds
Custom redirect URL after connection completes
uriResponse Body
application/json
application/json
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/pinterest/select-board" \ -H "Content-Type: application/json" \ -d '{ "profileId": "64f0a1b2c3d4e5f6a7b8c9d0", "boardId": "123456789012345678", "boardName": "Marketing Ideas", "tempToken": "pina_...", "userProfile": { "id": "user123", "username": "mybrand", "displayName": "My Brand", "profilePicture": "https://i.pinimg.com/..." }, "redirect_url": "https://yourapp.com/callback" }'{
"message": "Pinterest connected successfully with default board",
"redirect_url": "https://yourdomain.com/integrations/callback?connected=pinterest&profileId=507f1f77bcf86cd799439011&board=Marketing+Ideas",
"account": {
"accountId": "64e1f0a9e2b5af0012ab34cd",
"platform": "pinterest",
"username": "mybrand",
"displayName": "My Brand",
"profilePicture": "https://i.pinimg.com/...",
"isActive": true,
"defaultBoardName": "Marketing Ideas"
}
}{
"error": "Missing required fields"
}{
"error": "Unauthorized"
}{
"error": "Forbidden"
}List Snapchat Public Profiles after OAuth (Headless Mode)
Headless Mode for Custom UI
After initiating Snapchat OAuth via /v1/connect/snapchat?headless=true, you'll be redirected to
your redirect_url with query params including tempToken, userProfile, and publicProfiles.
If you want to build your own fully-branded profile selector (instead of Late's hosted UI), call this
endpoint to retrieve the list of Snapchat Public Profiles the user can post to. Then build your
UI and call POST /v1/connect/snapchat/select-profile to save the selection.
Authentication: Use X-Connect-Token header with the connect_token from the redirect URL.
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
Your Late profile ID
Temporary Snapchat access token from the OAuth callback redirect
Header Parameters
Short-lived connect token from the OAuth redirect
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/snapchat/select-profile?profileId=string&tempToken=string" \ -H "X-Connect-Token: string"{
"publicProfiles": [
{
"id": "abc123-def456",
"display_name": "My Brand",
"username": "mybrand",
"profile_image_url": "https://cf-st.sc-cdn.net/...",
"subscriber_count": 15000
},
{
"id": "xyz789-uvw012",
"display_name": "Side Project",
"username": "sideproject",
"profile_image_url": "https://cf-st.sc-cdn.net/...",
"subscriber_count": 5000
}
]
}{
"error": "Unauthorized"
}Select a Snapchat Public Profile to complete the connection (Headless Mode)
Complete the Snapchat Connection Flow
After OAuth, use this endpoint to save the selected Public Profile and complete the Snapchat account connection. Snapchat requires a Public Profile to publish Stories, Saved Stories, and Spotlight content.
Headless Mode: Use the X-Connect-Token header if you initiated the connection via API key.
After initiating Snapchat OAuth via /v1/connect/snapchat?headless=true, you'll be redirected to
your redirect_url with query params including:
tempToken- Temporary access tokenuserProfile- URL-encoded JSON with user infopublicProfiles- URL-encoded JSON array of available public profilesconnect_token- Short-lived token for API authenticationplatform=snapchatstep=select_public_profile
Parse publicProfiles to build your custom selector UI, then call this endpoint with the selected profile.
API key authentication - use your Late API key as a Bearer token
In: header
Header Parameters
Short-lived connect token from the OAuth redirect (for API users)
Your Late profile ID
The selected Snapchat Public Profile
Temporary Snapchat access token from OAuth
User profile data from OAuth redirect
Snapchat refresh token (if available)
Token expiration time in seconds
Custom redirect URL after connection completes
uriResponse Body
application/json
application/json
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/snapchat/select-profile" \ -H "Content-Type: application/json" \ -d '{ "profileId": "64f0a1b2c3d4e5f6a7b8c9d0", "selectedPublicProfile": { "id": "abc123-def456", "display_name": "My Brand", "username": "mybrand", "profile_image_url": "https://cf-st.sc-cdn.net/...", "subscriber_count": 15000 }, "tempToken": "eyJ...", "userProfile": { "id": "user123", "username": "mybrand", "displayName": "My Brand", "profilePicture": "https://cf-st.sc-cdn.net/..." }, "redirect_url": "https://yourapp.com/callback" }'{
"message": "Snapchat connected successfully with public profile",
"redirect_url": "https://yourdomain.com/integrations/callback?connected=snapchat&profileId=507f1f77bcf86cd799439011&publicProfile=My+Brand",
"account": {
"accountId": "64e1f0a9e2b5af0012ab34cd",
"platform": "snapchat",
"username": "mybrand",
"displayName": "My Brand",
"profilePicture": "https://cf-st.sc-cdn.net/...",
"isActive": true,
"publicProfileName": "My Brand"
}
}{
"error": "Missing required fields"
}{
"error": "Unauthorized"
}{
"error": "Forbidden"
}Connect Bluesky using app password
Connect a Bluesky account using identifier (handle or email) and an app password.
To get your userId for the state parameter, call GET /v1/users - the response includes a currentUserId field.
API key authentication - use your Late API key as a Bearer token
In: header
Your Bluesky handle (e.g. user.bsky.social) or email address
App password generated from Bluesky Settings > App Passwords
Required state parameter formatted as {userId}-{profileId}.
userId: Your Late user ID (get fromGET /v1/users→currentUserId)profileId: The profile ID to connect the account to (get fromGET /v1/profiles)
Optional URL to redirect to after successful connection
uriResponse Body
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/bluesky/credentials" \ -H "Content-Type: application/json" \ -d '{ "identifier": "yourhandle.bsky.social", "appPassword": "xxxx-xxxx-xxxx-xxxx", "state": "6507a1b2c3d4e5f6a7b8c9d0-6507a1b2c3d4e5f6a7b8c9d1", "redirectUri": "https://yourapp.com/connected" }'{
"message": "Bluesky connected successfully",
"account": {
"platform": "bluesky",
"username": "yourhandle.bsky.social",
"displayName": "Your Name",
"isActive": true
},
"redirectUrl": "https://getlate.dev/dashboard/profiles/64f0.../accounts"
}{
"error": "Unauthorized"
}Generate Telegram access code
Generate a unique access code for connecting a Telegram channel or group.
Connection Flow:
- Call this endpoint to get an access code (valid for 15 minutes)
- Add the bot (@LateScheduleBot or your configured bot) as an administrator in your Telegram channel/group
- Open a private chat with the bot
- Send:
{CODE} @yourchannel(e.g.,LATE-ABC123 @mychannel) - Poll
PATCH /v1/connect/telegram?code={CODE}to check connection status
Alternative for private channels: If your channel has no public username, forward any message from the channel to the bot along with the access code.
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
The profile ID to connect the Telegram account to
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/connect/telegram?profileId=string"{
"code": "LATE-ABC123",
"expiresAt": "2024-01-15T12:30:00.000Z",
"expiresIn": 900,
"botUsername": "LateScheduleBot",
"instructions": [
"1. Add @LateScheduleBot as an administrator in your channel/group",
"2. Open a private chat with @LateScheduleBot",
"3. Send: LATE-ABC123 @yourchannel (replace @yourchannel with your channel username)",
"4. Wait for confirmation - the connection will appear in your dashboard",
"Tip: If your channel has no public username, forward a message from it along with the code"
]
}{
"error": "Unauthorized"
}Direct Telegram connection (power users)
Connect a Telegram channel/group directly using the chat ID.
This is an alternative to the access code flow for power users who know their Telegram chat ID. The bot must already be added as an administrator in the channel/group.
API key authentication - use your Late API key as a Bearer token
In: header
The Telegram chat ID. Can be:
- Numeric ID (e.g., "-1001234567890")
- Username with @ prefix (e.g., "@mychannel")
The profile ID to connect the account to
Response Body
application/json
application/json
curl -X POST "https://getlate.dev/api/v1/connect/telegram" \ -H "Content-Type: application/json" \ -d '{ "chatId": "-1001234567890", "profileId": "6507a1b2c3d4e5f6a7b8c9d0" }'{
"message": "Telegram channel connected successfully",
"account": {
"_id": "64e1f0a9e2b5af0012ab34cd",
"platform": "telegram",
"username": "mychannel",
"displayName": "My Channel",
"isActive": true,
"chatType": "channel"
}
}{
"error": "Unauthorized"
}Check Telegram connection status
Poll this endpoint to check if a Telegram access code has been used to connect a channel/group.
Recommended polling interval: 3 seconds
Status values:
pending: Code is valid, waiting for user to complete connectionconnected: Connection successful - channel/group is now linkedexpired: Code has expired, generate a new one
API key authentication - use your Late API key as a Bearer token
In: header
Query Parameters
The access code to check status for
Response Body
application/json
application/json
curl -X PATCH "https://getlate.dev/api/v1/connect/telegram?code=LATE-ABC123"{
"status": "pending",
"expiresAt": "2024-01-15T12:30:00.000Z",
"expiresIn": 542
}{
"error": "Unauthorized"
}List available Facebook pages for a connected account
Returns all Facebook pages the connected account has access to, including the currently selected page.
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/accounts/string/facebook-page"{
"pages": [
{
"id": "123456789012345",
"name": "My Brand Page",
"username": "mybrand",
"category": "Brand",
"fan_count": 5000
},
{
"id": "234567890123456",
"name": "My Other Page",
"username": "myotherpage",
"category": "Business",
"fan_count": 1200
}
],
"selectedPageId": "123456789012345",
"cached": true
}{
"error": "Unauthorized"
}Update selected Facebook page for a connected account
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X PUT "https://getlate.dev/api/v1/accounts/string/facebook-page" \ -H "Content-Type: application/json" \ -d '{ "selectedPageId": "123456789012345" }'{
"message": "Facebook page updated successfully",
"selectedPage": {
"id": "123456789012345",
"name": "My Brand Page"
}
}{
"error": "Unauthorized"
}Get available LinkedIn organizations for a connected account
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/accounts/string/linkedin-organizations"{
"organizations": [
{
"id": "12345678",
"name": "Acme Corporation",
"vanityName": "acme-corp",
"localizedName": "Acme Corporation"
},
{
"id": "87654321",
"name": "Acme Subsidiary",
"vanityName": "acme-sub",
"localizedName": "Acme Subsidiary"
}
]
}{
"error": "Unauthorized"
}Switch LinkedIn account type (personal/organization)
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
"personal" | "organization"Response Body
application/json
application/json
curl -X PUT "https://getlate.dev/api/v1/accounts/string/linkedin-organization" \ -H "Content-Type: application/json" \ -d '{ "accountType": "organization", "selectedOrganization": { "id": "12345678", "name": "Acme Corporation", "vanityName": "acme-corp" } }'{
"message": "LinkedIn account type updated successfully",
"account": {
"_id": "64e1f0a9e2b5af0012ab34cd",
"platform": "linkedin",
"username": "acme-corp",
"displayName": "Acme Corporation",
"isActive": true
}
}{
"error": "Unauthorized"
}List Pinterest boards for a connected account
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/accounts/string/pinterest-boards"{
"boards": [
{
"id": "123456789012345678",
"name": "Marketing Ideas",
"description": "Collection of marketing inspiration",
"privacy": "PUBLIC"
},
{
"id": "234567890123456789",
"name": "Product Photos",
"description": "Product photography",
"privacy": "PUBLIC"
}
]
}{
"error": "Unauthorized"
}Set default Pinterest board on the connection
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X PUT "https://getlate.dev/api/v1/accounts/string/pinterest-boards" \ -H "Content-Type: application/json" \ -d '{ "defaultBoardId": "123456789012345678", "defaultBoardName": "Marketing Ideas" }'{
"message": "Default Pinterest board updated successfully",
"account": {
"_id": "64e1f0a9e2b5af0012ab34cd",
"platform": "pinterest",
"username": "mybrand",
"displayName": "My Brand",
"isActive": true
}
}{
"error": "Unauthorized"
}List available Google Business Profile locations for a connected account
Returns all Google Business Profile locations the connected account has access to, including the currently selected location.
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/accounts/string/gmb-locations"{
"locations": [
{
"id": "12345678901234567890",
"name": "My Business Location",
"accountId": "accounts/123456789",
"accountName": "My Business Account",
"address": "123 Main St, San Francisco, CA",
"category": "Restaurant",
"websiteUrl": "https://mybusiness.com"
}
],
"selectedLocationId": "12345678901234567890",
"cached": true
}{
"error": "Unauthorized"
}Update selected Google Business Profile location for a connected account
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X PUT "https://getlate.dev/api/v1/accounts/string/gmb-locations" \ -H "Content-Type: application/json" \ -d '{ "selectedLocationId": "12345678901234567890" }'{
"message": "Google Business location updated successfully",
"selectedLocation": {
"id": "12345678901234567890",
"name": "My Business Location"
}
}{
"error": "Unauthorized"
}List Reddit subreddits for a connected account
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://getlate.dev/api/v1/accounts/string/reddit-subreddits"{
"subreddits": [
{
"id": "2qh1i",
"name": "marketing",
"title": "Marketing",
"url": "/r/marketing/",
"over18": false
},
{
"id": "2qh3l",
"name": "socialmedia",
"title": "Social Media",
"url": "/r/socialmedia/",
"over18": false
}
],
"defaultSubreddit": "marketing"
}{
"error": "Unauthorized"
}Set default subreddit on the connection
API key authentication - use your Late API key as a Bearer token
In: header
Path Parameters
Response Body
application/json
application/json
curl -X PUT "https://getlate.dev/api/v1/accounts/string/reddit-subreddits" \ -H "Content-Type: application/json" \ -d '{ "defaultSubreddit": "marketing" }'{
"success": true
}{
"error": "Unauthorized"
}