LateLate API
Core

Connect


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:

  1. Call this endpoint with your API key and redirect_url (optional)
  2. Redirect your user to the returned authUrl
  3. 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
  4. 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:

  1. 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
  2. Redirect your user to the returned authUrl
  3. After OAuth, the user is redirected directly to your redirect_url with:
    • profileId – your Late profile ID
    • tempToken – temporary Facebook access token
    • userProfile – URL‑encoded JSON user profile
    • connect_token – short‑lived connect token (for API auth)
    • platform=facebook
    • step=select_page
  4. Use tempToken, userProfile, and the X-Connect-Token header with:
    • GET /v1/connect/facebook/select-page to fetch pages
    • POST /v1/connect/facebook/select-page to save the selected page
  5. In this mode, users never see Late's hosted page selector – only your UI.

LinkedIn:

  1. Call this endpoint with &headless=true, e.g. GET /v1/connect/linkedin?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
  2. Redirect your user to the returned authUrl
  3. After OAuth, the user is redirected directly to your redirect_url with:
    • profileId – your Late profile ID
    • pendingDataToken – token to fetch OAuth data via API (see step 4)
    • connect_token – short-lived connect token (for API auth)
    • platform=linkedin
    • step=select_organization
  4. Call GET /v1/connect/pending-data?token=PENDING_DATA_TOKEN to fetch the OAuth data:
    • tempToken – temporary LinkedIn access token
    • userProfile – JSON object with id, username, displayName, profilePicture
    • organizations – JSON array with id, urn, name, vanityName for each org
    • refreshToken / expiresIn – token metadata This endpoint is one-time use and data expires after 10 minutes.
  5. Optional: To fetch full organization details (logos, website, industry, description), call GET /v1/connect/linkedin/organizations?tempToken=X&orgIds=id1,id2,...
  6. Call POST /v1/connect/linkedin/select-organization with the X-Connect-Token header to save the selection.
  7. In this mode, users never see Late's hosted organization selector – only your UI.
  8. Note: If the user has no organization admin access, step=select_organization will NOT be present, and the account will be connected directly as a personal account.

Pinterest:

  1. Call this endpoint with &headless=true, e.g. GET /v1/connect/pinterest?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
  2. Redirect your user to the returned authUrl
  3. After OAuth, the user is redirected directly to your redirect_url with:
    • profileId – your Late profile ID
    • tempToken – temporary Pinterest access token
    • userProfile – URL‑encoded JSON user profile
    • connect_token – short‑lived connect token (for API auth)
    • platform=pinterest
    • step=select_board
  4. Use tempToken, userProfile, and the X-Connect-Token header with:
    • GET /v1/connect/pinterest/select-board to fetch boards
    • POST /v1/connect/pinterest/select-board to save the selected board
  5. In this mode, users never see Late's hosted board selector – only your UI.

Google Business Profile:

  1. Call this endpoint with &headless=true, e.g. GET /v1/connect/googlebusiness?profileId=PROFILE_ID&redirect_url=https://yourapp.com/callback&headless=true
  2. Redirect your user to the returned authUrl
  3. After OAuth, the user is redirected directly to your redirect_url with:
    • profileId – your Late profile ID
    • tempToken – temporary Google access token
    • userProfile – URL‑encoded JSON user profile (includes refresh token info)
    • connect_token – short‑lived connect token (for API auth)
    • platform=googlebusiness
    • step=select_location
  4. Use tempToken, userProfile, and the X-Connect-Token header with:
    • GET /v1/connect/googlebusiness/locations to fetch business locations
    • POST /v1/connect/googlebusiness/select-location to save the selected location
  5. In this mode, users never see Late's hosted location selector – only your UI.
GET
/v1/connect/{platform}
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

platformstring

Social media platform to connect

Value in"facebook" | "instagram" | "linkedin" | "twitter" | "tiktok" | "youtube" | "threads" | "reddit" | "pinterest" | "bluesky" | "googlebusiness" | "telegram" | "snapchat"

Query Parameters

profileIdstring

Your Late profile ID (get from /v1/profiles)

redirect_url?string

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_organization Use GET /v1/connect/pending-data?token=TOKEN to 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 contains id, 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

Formaturi

Response 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"
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty

Complete OAuth token exchange manually (for server-side flows)

POST
/v1/connect/{platform}
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

platformstring
codestring
statestring
profileIdstring

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"  }'
Empty
Empty
{
  "error": "Unauthorized"
}
Empty
Empty

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).

GET
/v1/connect/facebook/select-page
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

profileIdstring

Profile ID from your connection flow

tempTokenstring

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"
      ]
    }
  ]
}
Empty
{
  "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.

POST
/v1/connect/facebook/select-page
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

profileIdstring

Profile ID from your connection flow

pageIdstring

The Facebook Page ID selected by the user

tempTokenstring

Temporary Facebook access token from OAuth

userProfile?

Decoded user profile object from the OAuth callback

redirect_url?string

Optional custom redirect URL to return to after selection

Formaturi

Response 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"
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty
Empty

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).

GET
/v1/connect/googlebusiness/locations
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

profileIdstring

Profile ID from your connection flow

tempTokenstring

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"
    }
  ]
}
Empty
{
  "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.

POST
/v1/connect/googlebusiness/select-location
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

profileIdstring

Profile ID from your connection flow

locationIdstring

The Google Business location ID selected by the user

tempTokenstring

Temporary Google access token from OAuth

userProfile?

Decoded user profile object from the OAuth callback. Important: This contains the refresh token needed for token refresh. Always include this field.

redirect_url?string

Optional custom redirect URL to return to after selection

Formaturi

Response 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"
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty
Empty

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
GET
/v1/connect/pending-data
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

tokenstring

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.

GET
/v1/connect/linkedin/organizations
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

tempTokenstring

The temporary LinkedIn access token from the OAuth redirect

orgIdsstring

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"
}
Empty

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.

POST
/v1/connect/linkedin/select-organization
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

profileIdstring
tempTokenstring
userProfileobject
accountTypestring
Value in"personal" | "organization"
selectedOrganization?object
redirect_url?string
Formaturi

Response 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"
  }
}

Empty
{
  "error": "Unauthorized"
}
Empty

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.

GET
/v1/connect/pinterest/select-board
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

profileIdstring

Your Late profile ID

tempTokenstring

Temporary Pinterest access token from the OAuth callback redirect

Header Parameters

X-Connect-Tokenstring

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"
    }
  ]
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty

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.

POST
/v1/connect/pinterest/select-board
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

profileIdstring

Your Late profile ID

boardIdstring

The Pinterest Board ID selected by the user

boardName?string

The board name (for display purposes)

tempTokenstring

Temporary Pinterest access token from OAuth

userProfile?object

User profile data from OAuth redirect

refreshToken?string

Pinterest refresh token (if available)

expiresIn?integer

Token expiration time in seconds

redirect_url?string

Custom redirect URL after connection completes

Formaturi

Response 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"
}

Empty

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.

GET
/v1/connect/snapchat/select-profile
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

profileIdstring

Your Late profile ID

tempTokenstring

Temporary Snapchat access token from the OAuth callback redirect

Header Parameters

X-Connect-Tokenstring

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
    }
  ]
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty

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 token
  • userProfile - URL-encoded JSON with user info
  • publicProfiles - URL-encoded JSON array of available public profiles
  • connect_token - Short-lived token for API authentication
  • platform=snapchat
  • step=select_public_profile

Parse publicProfiles to build your custom selector UI, then call this endpoint with the selected profile.

POST
/v1/connect/snapchat/select-profile
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Header Parameters

X-Connect-Token?string

Short-lived connect token from the OAuth redirect (for API users)

profileIdstring

Your Late profile ID

selectedPublicProfile

The selected Snapchat Public Profile

tempTokenstring

Temporary Snapchat access token from OAuth

userProfileobject

User profile data from OAuth redirect

refreshToken?string

Snapchat refresh token (if available)

expiresIn?integer

Token expiration time in seconds

redirect_url?string

Custom redirect URL after connection completes

Formaturi

Response 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"
}

Empty

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.

POST
/v1/connect/bluesky/credentials
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

identifierstring

Your Bluesky handle (e.g. user.bsky.social) or email address

appPasswordstring

App password generated from Bluesky Settings > App Passwords

statestring

Required state parameter formatted as {userId}-{profileId}.

  • userId: Your Late user ID (get from GET /v1/userscurrentUserId)
  • profileId: The profile ID to connect the account to (get from GET /v1/profiles)
redirectUri?string

Optional URL to redirect to after successful connection

Formaturi

Response 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"
}
Empty
{
  "error": "Unauthorized"
}
Empty

Generate Telegram access code

Generate a unique access code for connecting a Telegram channel or group.

Connection Flow:

  1. Call this endpoint to get an access code (valid for 15 minutes)
  2. Add the bot (@LateScheduleBot or your configured bot) as an administrator in your Telegram channel/group
  3. Open a private chat with the bot
  4. Send: {CODE} @yourchannel (e.g., LATE-ABC123 @mychannel)
  5. 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.

GET
/v1/connect/telegram
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

profileIdstring

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"
  ]
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty
Empty

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.

POST
/v1/connect/telegram
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

chatIdstring

The Telegram chat ID. Can be:

  • Numeric ID (e.g., "-1001234567890")
  • Username with @ prefix (e.g., "@mychannel")
profileIdstring

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"
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty
Empty
Empty

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 connection
  • connected: Connection successful - channel/group is now linked
  • expired: Code has expired, generate a new one
PATCH
/v1/connect/telegram
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Query Parameters

codestring

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"
}
Empty
Empty

List available Facebook pages for a connected account

Returns all Facebook pages the connected account has access to, including the currently selected page.

GET
/v1/accounts/{accountId}/facebook-page
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring

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"
}
Empty

Update selected Facebook page for a connected account

PUT
/v1/accounts/{accountId}/facebook-page
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring
selectedPageIdstring

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"
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty

Get available LinkedIn organizations for a connected account

GET
/v1/accounts/{accountId}/linkedin-organizations
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring

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"
}
Empty

Switch LinkedIn account type (personal/organization)

PUT
/v1/accounts/{accountId}/linkedin-organization
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring
accountTypestring
Value in"personal" | "organization"
selectedOrganization?object

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
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty

List Pinterest boards for a connected account

GET
/v1/accounts/{accountId}/pinterest-boards
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring

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"
    }
  ]
}
Empty
{
  "error": "Unauthorized"
}
Empty

Set default Pinterest board on the connection

PUT
/v1/accounts/{accountId}/pinterest-boards
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring
defaultBoardIdstring
defaultBoardName?string

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
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty

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.

GET
/v1/accounts/{accountId}/gmb-locations
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring

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"
}
Empty

Update selected Google Business Profile location for a connected account

PUT
/v1/accounts/{accountId}/gmb-locations
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring
selectedLocationIdstring

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"
  }
}
Empty
{
  "error": "Unauthorized"
}
Empty

List Reddit subreddits for a connected account

GET
/v1/accounts/{accountId}/reddit-subreddits
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring

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"
}
Empty
{
  "error": "Unauthorized"
}
Empty

Set default subreddit on the connection

PUT
/v1/accounts/{accountId}/reddit-subreddits
AuthorizationBearer <token>

API key authentication - use your Late API key as a Bearer token

In: header

Path Parameters

accountIdstring
defaultSubredditstring

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
}
Empty
{
  "error": "Unauthorized"
}
Empty