SOURCE_ID: track_linkedin_posts NAME: Track LinkedIn Posts CATEGORY: Signals Monitor public LinkedIn posts that match a keyword — optionally narrowed by author job title and content type. Creates an ongoing source that re-checks for new matching posts on a schedule until a stop date. Imported post rows become available to your Floqer workflows for prospecting, competitive intelligence, and trend tracking. INDEX: 1. Endpoints 2. Search model 3. Lifecycle (ongoing only) 4. Body shape (preview + create) 5. Field catalogue 6. Dynamic options 7. How to configure end-to-end 8. Key notes 9. Where it fits 10. When to use ================================================================================ 1. ENDPOINTS ================================================================================ Source identifier (used in every endpoint path): `track_linkedin_posts`. POST /api/v1/sources/track_linkedin_posts/preview Scope: sources:read Returns a sample page of matching LinkedIn posts for the given body, without creating anything. Use this to validate keyword / filter combinations and inspect row shape before committing. Does not consume Floqer credits. POST /api/v1/sources/track_linkedin_posts Scope: sources:write Creates an ongoing source, runs an immediate first fetch, and schedules recurring checks. Returns `source_instance_id` (the new source's UUID). Each fetch consumes Floqer credits. GET /api/v1/sources//data Scope: sources:read Paginated rows imported into the created source. `` is the UUID returned by Create. Query: `page_no` (default 1), `page_size` (default 20, max 200). Source-agnostic; see concepts.txt §10. POST /api/v1/sources//sync Scope: sources:write Connects the created source to a workflow and (by default) backfills it with the source's current rows. `` here is the UUID returned by Create. Body: { workflow_id, field_mapping, push_existing?, run? } — `field_mapping` keys are `input.` references on the target workflow, values are the source fields to pull. This step is source-agnostic; see concepts.txt §10 for the full shape. No connection is required. There is no dynamic-options endpoint for this source today (see §6). ================================================================================ 2. SEARCH MODEL ================================================================================ Every preview/create call searches public LinkedIn posts. Core behaviour: - Keyword match: `keyword` is required. Searched against post text / commentary on LinkedIn. - Time window: each search covers the most recent posts (the last 24 hours), newest first. Preview returns this window directly. - Author title filter: optional `current_title` narrows results to posts whose author matches one or more job-title strings (e.g. "CEO", "Founder", "VP Sales"). Omit to include all authors. - Content type filter: optional `content_type` narrows to posts containing a specific media type. Omit to include all content types. There is no import-mode switch — you always pass the payload fields in §5. ================================================================================ 3. LIFECYCLE (ONGOING ONLY) ================================================================================ Track LinkedIn Posts is always an ongoing source — there is no one-time / static mode. expiration_date (create only) Required on create. Date string (YYYY-MM-DD or any ISO-like value). The source stops scheduling new checks after this date. Accepted but ignored on preview. frequency (create only) Optional. Interval in days between scheduled checks. Defaults to 1 (daily) when omitted. Common values: 1 (daily), 7 (weekly), 30 (monthly). Accepted but ignored on preview. On create the source runs an immediate first fetch and then re-checks on the `frequency` schedule until `expiration_date`. Each scheduled run imports only posts newer than the last run, so the same post is never imported twice. Discovered posts are appended to the source and pushed to any connected workflows automatically. ================================================================================ 4. BODY SHAPE (PREVIEW + CREATE) ================================================================================ Field names are snake_case. Unknown top-level keys are rejected with 400 — the body is strict. Preview accepts: keyword required: non-empty string current_title optional: string OR array of non-empty strings content_type optional: see §5 for allowed values expiration_date accepted but ignored on preview (create-only) frequency accepted but ignored on preview (create-only) Create accepts: keyword required: non-empty string current_title optional: string OR array of non-empty strings content_type optional: see §5 for allowed values expiration_date required: valid date string frequency optional: positive number (days); defaults to 1 name required: display name for the new source Example preview body: { "keyword": "hiring", "current_title": ["CEO", "Founder"], "content_type": "IMAGE" } Example create body: { "name": "AI Posts from CEOs", "keyword": "AI", "current_title": ["CEO"], "content_type": "IMAGE", "expiration_date": "2026-06-26", "frequency": 7 } Preview response envelope: { "status": 200, "data": { "data": [ { "name": "Jane Doe", "headline": "CEO at Acme Corp", "profile_url": "https://www.linkedin.com/in/janedoe", "image_url": "https://...", "actor_type": "Person", "followers_count": null, "text": "Excited to share our latest AI launch...", "url": "https://www.linkedin.com/posts/...", "posted_on": "2026-05-26T14:32:10.000Z", "likes_count": 42, "comments_count": 7, "reposts_count": null, "article_title": null, "article_url": null, "document_title": null, "document_url": null, "hyperlinks": ["https://..."], "uid": "urn:li:activity:..." } ], "metadata": { "total_results": 128 } } } Rows are plain key/value objects. Preview returns the first page of matching posts. `metadata.total_results` is the total match count for the search window (best-effort). Create response envelope: { "status": 201, "data": { "source_instance_id": "", "name": "AI Posts from CEOs", "created_at": "2026-05-27T12:00:00.000Z" } } The initial fetch runs asynchronously — the create call returns as soon as the source is created and the first fetch is queued, not when posts have finished arriving. ================================================================================ 5. FIELD CATALOGUE ================================================================================ keyword (string) — required The keyword or phrase to search for in LinkedIn post text. Example: "hiring", "AI", "fundraising", "Series A" current_title (string | string[]) — optional Only include posts from authors whose current job title matches. Accepts a single title string or an array of non-empty title strings. Examples: "Founder" ["CEO", "Founder", "VP Sales"] content_type (string) — optional Restrict to posts containing a specific media type. Allowed values: VIDEO IMAGE JOB LIVE_VIDEO DOCUMENT COLLABORATIVE_ARTICLE Omit to search all content types. Other values are rejected on preview/create with 400. expiration_date (string) — required on create only Stop monitoring after this date. Pass as YYYY-MM-DD or any ISO-like date string. Accepted but ignored on preview. Example: "2026-06-26" frequency (number) — optional, create only Days between scheduled checks. Must be a positive number; defaults to 1 (daily) when omitted. Accepted but ignored on preview. Examples: 1, 3, 7, 30 name (string) — required on create only Human-readable display name for the source. Example: "AI Posts from CEOs" Imported row fields (read-only — returned by preview and stored on create): name Author display name (person or company) headline Author job title (person) or empty for companies profile_url LinkedIn profile / company page URL image_url Author profile photo URL actor_type "Person" or "Company" followers_count Follower count (companies only; null for persons) text Full post text / commentary url Direct link to the post on LinkedIn posted_on ISO timestamp when the post was published likes_count Number of reactions comments_count Number of comments reposts_count Repost count when available (else null) article_title Attached article title, if any article_url Attached article URL, if any document_title Attached document title, if any document_url Attached document URL, if any hyperlinks Array of image / media URLs found in the post uid LinkedIn activity URN (unique per post) ================================================================================ 6. DYNAMIC OPTIONS ================================================================================ None. All payload fields are free-form strings / arrays — there are no predefined option lists to resolve via `POST /api/v1/sources/track_linkedin_posts/options/`. ================================================================================ 7. HOW TO CONFIGURE END-TO-END ================================================================================ Typical flow for an AI agent building a Track LinkedIn Posts source: Step 1 — Preview before committing POST /api/v1/sources/track_linkedin_posts/preview Body: { "keyword": "AI", "current_title": ["CEO"], "content_type": "IMAGE" } Check the returned `data[]` row shape and `metadata.total_results`. Iterate the body until you're happy — preview never creates anything and does not consume credits. Step 2 — Create the source POST /api/v1/sources/track_linkedin_posts Body: + `"name"`, `"expiration_date"`, and optionally `"frequency"`: { "name": "AI Posts from CEOs", "keyword": "AI", "current_title": ["CEO"], "content_type": "IMAGE", "expiration_date": "2026-06-26", "frequency": 7 } Response: { "status": 201, "data": { "source_instance_id": "", ... }} Step 2b — (Optional) Poll imported posts after create GET /api/v1/sources//data?page_no=1&page_size=20 ( = UUID from Step 2) Row keys match Preview. `total_count` grows as the first fetch and later scheduled runs import new posts. Step 3 — Sync the source into a workflow (so new posts flow downstream) POST /api/v1/sources//sync ( = UUID from Step 2 ) First build `field_mapping` (two lookups): a. GET /api/v1/workflows → pick the destination workflow_id. b. GET /api/v1/workflows//sheets//inputs → each input has a `reference` like `{{input.text}}`. c. Map each workflow input (reference WITHOUT braces) to a source field — common mappings: `input.text`, `input.name`, `input.profile_url`, `input.headline`, `input.url`. Body: { "workflow_id": "", "field_mapping": { "input.text": "text", "input.name": "name", "input.profile_url": "profile_url", "input.headline": "headline", "input.url": "url" }, "push_existing": true, "run": "all" } See concepts.txt §10 for the full sync semantics (source-agnostic). The source keeps checking on the `frequency` schedule until `expiration_date`. New posts discovered on each run are appended to the source and pushed to connected workflows automatically. ================================================================================ 8. KEY NOTES ================================================================================ - No connection is required. Unlike CRM sources, there is no 424 "connect first" gate. - Preview returns the most recent matching posts (last 24 hours). It does not create anything and does not consume credits — credits are consumed per fetch only after create. - Scheduled runs import only posts newer than the previous run, so the same post is never imported twice. - `current_title` accepts either a string or an array of strings. - `frequency` defaults to 1 (daily) when omitted on create. - `content_type: JOB` is accepted even though the Floqer UI dropdown does not expose it today. - `metadata.total_results` on preview reflects the total match count for the search window; it can exceed the number of rows returned (preview returns one page). - If credit consumption fails during a scheduled run, the source may be paused. Top up credits and resume the source to continue. - Company authors: `actor_type` is "Company", `headline` is empty, and `followers_count` carries the company's follower count. ================================================================================ 9. WHERE IT FITS ================================================================================ LINKEDIN POSTS Public LinkedIn posts. Keyword, author-title, and content-type filters are applied at search time. THIS SOURCE Creates an ongoing source that re-queries on a schedule until `expiration_date`, storing new matching posts and pushing them to connected workflows. WORKFLOWS Each new post row carries author profile fields plus post content and engagement metrics — wire the source into a workflow to enrich the author, score the lead, or trigger outreach when a keyword fires. ================================================================================ 10. WHEN TO USE ================================================================================ - Monitor hiring signals: `keyword: "hiring"` + `current_title: ["CEO", "Founder"]` to catch leadership hiring posts. - Track competitor / market activity: keyword around a product category or competitor name, optionally filtered to `content_type: "VIDEO"`. - Fundraising / growth signals: `keyword: "fundraising"` or `"Series A"` with investor-relevant title filters. - Ongoing thought-leadership tracking: `keyword: "AI"` with weekly `frequency: 7` and a 90-day `expiration_date`. When you instead want to enrich a single known person by LinkedIn URL, use workflow action templates such as `enrich_person_linkedin_profile` inside a workflow — see the action catalog in llms-full.txt. ================================================================================ This file is maintained manually. Last updated: 2026-05-27. Full interactive reference: https://floqer.com/docs/reference