SOURCE_ID: find_linkedin_posts NAME: Find LinkedIn Posts CATEGORY: Static Search public LinkedIn posts by keyword once and import the matches as a list — optionally narrowed by content type and posting window, sorted by relevance or recency. Creates a one-time source: it imports up to `max_count` posts and then stops. Imported post rows become available to your Floqer workflows for prospecting, research, and outreach. For an ongoing feed that keeps importing new matching posts on a schedule, use `track_linkedin_posts` instead (see §9). 1. ENDPOINTS Source identifier (used in every endpoint path): `find_linkedin_posts`. POST /api/v1/sources/find_linkedin_posts/preview Scope: sources:read Returns one page of matching LinkedIn posts (up to 50) for the given body, without creating anything. Use this to validate the keyword and filters and inspect row shape before committing. Does not consume Floqer credits. POST /api/v1/sources/find_linkedin_posts Scope: sources:write Creates a one-time source and starts the import. Returns `source_instance_id` (the new source's UUID). The import consumes Floqer credits per page fetched (see §8). 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 rows. 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. Source-agnostic; see concepts.txt §10 for the full shape. No connection is required. There is no dynamic-options endpoint for this source (see §6). 2. SEARCH MODEL Every preview/create call runs one keyword search over public LinkedIn posts. - Keyword match: `keyword` is required — a single keyword or phrase, matched against post text. Comma-separated lists are rejected with 400; create one source per keyword instead. - Time window: optional `date_posted` limits results to posts from the past 24 hours, week, or month. Omit to search all time. - Content type filter: optional `content_type` narrows to posts containing a specific media type. Omit to include all content types. - Order: `sort` is `RELEVANCE` (default) or `DATE_POSTED` (newest first). With `max_count`, the order decides which posts make the cut. 3. LIFECYCLE (ONE-TIME ONLY) Find LinkedIn Posts is always a one-time source — there is no ongoing / scheduled mode, no `expiration_date`, and no `frequency`. On create the source pages through matching posts (50 per page) until it has imported `max_count` unique posts or the search runs out of results, then stops. Each post is imported once. Imported posts are pushed to any workflows connected to the source. To keep collecting new posts over time, use `track_linkedin_posts`. 4. BODY SHAPE (PREVIEW + CREATE) Field names are snake_case. Unknown top-level keys are rejected with 400 — the body is strict. `name` and `max_count` are create-only and rejected on preview. Preview accepts: keyword required: single keyword or phrase (no commas) content_type optional: see §5 date_posted optional: see §5 sort optional: see §5; defaults to RELEVANCE Create accepts: keyword required: single keyword or phrase (no commas) content_type optional: see §5 date_posted optional: see §5 sort optional: see §5; defaults to RELEVANCE max_count optional: integer 1–1000; defaults to 100 name required: display name for the new source Example preview body: { "keyword": "hiring", "content_type": "IMAGE", "date_posted": "PAST_WEEK", "sort": "DATE_POSTED" } Example create body: { "name": "Hiring posts — past week", "keyword": "hiring", "date_posted": "PAST_WEEK", "sort": "DATE_POSTED", "max_count": 300 } Preview response envelope: { "status": 200, "data": { "data": [ { "name": "Jane Doe", "headline": "VP Sales at Acme Corp", "profile_url": "https://www.linkedin.com/in/janedoe", "image_url": "https://...", "actor_type": "Person", "followers_count": null, "text": "We're hiring across our sales team...", "url": "https://www.linkedin.com/posts/...", "posted_on": "2026-10-20T09:15:00.000Z", "likes_count": 42, "comments_count": 8, "reposts_count": null, "article_title": null, "article_url": null, "document_title": null, "document_url": null, "hyperlinks": [], "uid": "urn:li:activity:..." } ], "metadata": { "total_results": 1240 } } } `metadata.total_results` is the total match count for the search (best-effort); it can exceed the rows returned, since preview returns one page. Create response envelope: { "status": 201, "data": { "source_instance_id": "", "name": "Hiring posts — past week", "created_at": "2026-10-27T12:00:00.000Z" } } The import runs asynchronously — the create call returns as soon as the source is created and the import is queued, not when posts have finished arriving. 5. FIELD CATALOGUE keyword (string) — required One keyword or phrase to search for in LinkedIn post text. Commas are rejected. Examples: "hiring", "Series A", "product launch" 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. date_posted (string) — optional Only include posts published within this window. Allowed values: PAST_24_HOURS PAST_WEEK PAST_MONTH Omit to search all time. sort (string) — optional RELEVANCE (default) or DATE_POSTED (newest first). max_count (integer) — optional, create only Maximum number of posts to import, 1–1000. Defaults to 100. name (string) — required on create only Human-readable display name for the source. 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 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 Always null for this source 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 / video URLs found in the post uid LinkedIn activity URN (unique per post) 6. DYNAMIC OPTIONS None. Every field is a free-form string, a fixed enum listed in §5, or a number. 7. HOW TO CONFIGURE END-TO-END Step 1 — Preview before committing POST /api/v1/sources/find_linkedin_posts/preview Body: { "keyword": "hiring", "date_posted": "PAST_WEEK" } Check the returned `data[]` rows and `metadata.total_results`. Iterate until the results look right — preview creates nothing and consumes no credits. Step 2 — Create the source POST /api/v1/sources/find_linkedin_posts Body: + `"name"` and optionally `"max_count"`: { "name": "Hiring posts — past week", "keyword": "hiring", "date_posted": "PAST_WEEK", "max_count": 300 } Response: { "status": 201, "data": { "source_instance_id": "", ... }} Step 2b — (Optional) Poll imported posts GET /api/v1/sources//data?page_no=1&page_size=20 Row keys match Preview. `total_count` grows while the import runs. Step 3 — Sync the source into a workflow POST /api/v1/sources//sync Build `field_mapping` from the destination workflow's inputs (GET /api/v1/workflows//sheets//inputs) — 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.url": "url" }, "push_existing": true, "run": "all" } See concepts.txt §10 for the full sync semantics. 8. KEY NOTES - No connection is required — there is no 424 "connect first" gate. - Credits: 1 Floqer credit per page of up to 50 posts fetched during the import. A page that returns no posts is refunded. Preview is free. - Create does not pre-check your balance. If credits run out mid-import, the import stops with the posts imported so far. Top up and create a new source to continue. - One keyword per source. For several keywords, create one source each. - `max_count` caps unique posts imported; the import also stops when the search has no more results, so a source can finish with fewer rows. - `content_type: JOB` is accepted even though the Floqer UI dropdown does not expose it. - Company authors: `actor_type` is "Company", `headline` is empty, and `followers_count` carries the company's follower count. 9. WHICH LINKEDIN POSTS SOURCE TO USE find_linkedin_posts (this source) One-time. Searches all time (or a `date_posted` window), sorted by relevance or recency, imports up to `max_count` posts, then stops. Pick it for a snapshot list: research, a one-off campaign, backfilling historical posts. track_linkedin_posts Ongoing. Checks the last 24 hours on a schedule (`frequency`) until `expiration_date`, importing only new posts each run. Supports an author job-title filter (`current_title`). Pick it to react to new posts as they appear. Shared fields mean the same thing in both: `keyword`, `content_type`, `name`. Row fields are identical, so the same workflow mapping works for either source. 10. WHEN TO USE - Build a list of people who posted about a topic recently: `keyword: "hiring"`, `date_posted: "PAST_MONTH"`, `sort: "DATE_POSTED"`. - Research a market or competitor: keyword on a product category or competitor name, `sort: "RELEVANCE"`. - Collect content examples: `content_type: "VIDEO"` or `"DOCUMENT"` for a topic keyword. When you instead want to monitor new posts matching a keyword over time, use `track_linkedin_posts`. To list the people who reacted to a company's posts, use `find_linkedin_post_reactors`. Last updated: 2026-10-27. Reference: https://floqer.com/docs/reference