---
title: MyFeedIn REST API reference
description: Every endpoint of the MyFeedIn REST API with its scope, parameters and errors.
url: https://myfeedin.co/documentation/api
type: docs
source: MyFeedIn
---

# MyFeedIn REST API reference

Base URL: `https://myfeedin.co/api/v1`. JSON over HTTPS. OpenAPI 3.1 spec: https://myfeedin.co/api/v1/openapi.json

## Authentication

Send an API key as a bearer token on every request. Keys are created in Settings > MCP & API, shown once, and bound to the personal account or to one workspace.

```bash
curl https://myfeedin.co/api/v1/me \
  -H "Authorization: Bearer mfi_live_..."
```

## Scopes

Each key carries the scopes ticked at creation. Campaign scopes need the Growth plan. `posts:write` is not granted by default.

| Scope | Grants |
| --- | --- |
| `posts:read` | Read your published posts and their analytics |
| `posts:write` | Write drafts and schedule posts on LinkedIn |
| `comments:read` | Read the comments you left on other people's posts |
| `feeds:read` | List feeds and the people in them |
| `feeds:write` | Create feeds and manage the people in them |
| `campaigns:read` | List campaigns and their stats |
| `campaigns:write` | Create campaigns and add profiles |
| `linkedin:read` | Search LinkedIn and read profiles and posts with your account (daily limits apply) |
| `prospects:read` | Read your prospect lists |
| `prospects:write` | Create prospect lists and save prospects |
| `agent:write` | Queue people with their own steps in agent campaigns |

## Errors and rate limits

Errors return `{ "error": "message" }`, plus `code` (and `problems`) on publishing endpoints. Keys are limited to about 120 requests per minute; over the limit the API answers 429 with `retry_after` in seconds.

| Status | Meaning |
| --- | --- |
| 400 | Missing or malformed parameters. |
| 401 | Missing, invalid or revoked key. |
| 402 | Subscription inactive. |
| 403 | Key lacks the scope or plan, or the action needs a connected LinkedIn account. |
| 404 | Resource does not exist in this key's scope. |
| 409 | The resource's state does not allow this action. |
| 422 | Validation failed; see `code` and `problems`. |
| 429 | Rate limit exceeded. |

## Personal and workspace keys

A workspace key reads the posts, comments and analytics of every member; rows then carry an `author`, and the `member` parameter (a member's name, email or id, from `/workspace/members`) narrows a request to one person. Feeds, saved people and campaigns belong to the workspace. A personal key reads one account and never returns `author`.

## Endpoints

### Account

#### GET /me

**Current key.** The calling key's user id, workspace, and granted scopes.

Requires: no scope.

### Posts

#### GET /posts

**List posts.** Published LinkedIn posts, newest first or ranked by engagement.

Requires: scope `posts:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `q` | query | string | no | Case-insensitive search across the post body. |
| `sort` | query | string | no | Default recent. One of: recent, impressions, comments, reactions. |
| `period` | query | string | no | Window. Default 90d for ranked sorts, unbounded otherwise. One of: 30d, 90d, 365d, all. |
| `since` | query | string | no | Earliest published_at, ISO 8601. |
| `until` | query | string | no | Latest published_at, ISO 8601. |
| `member` | query | string | no | Workspace keys only. A member's name, email or id (see /workspace/members). Omit to cover every member. |
| `limit` | query | integer | no | 1 to 100. Default 20. |

#### GET /posts/{id}

**Get a post.** One post with its full body and media.

Requires: scope `posts:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Post id. |
| `member` | query | string | no | Workspace keys only. A member's name, email or id (see /workspace/members). Omit to cover every member. |

### Analytics

#### GET /analytics

**Aggregate analytics.** Totals and averages over a period; workspace keys also get by_member.

Requires: scope `posts:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `period` | query | string | no | Window. Default 30d. One of: 30d, 90d, 365d, all. |
| `compare_to` | query | string | no | Also return the preceding window and the percent deltas. One of: previous. |
| `member` | query | string | no | Workspace keys only. A member's name, email or id (see /workspace/members). Omit to cover every member. |

#### GET /analytics/patterns

**Engagement patterns.** Best day, best hour and engagement by post length, from your own history.

Requires: scope `posts:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `period` | query | string | no | Window. Default 365d. One of: 30d, 90d, 365d, all. |
| `timezone` | query | string | no | IANA zone for the best day and hour. Default UTC. |
| `member` | query | string | no | Workspace keys only. A member's name, email or id (see /workspace/members). Omit to cover every member. |

### Comments

#### GET /comments

**List comments.** Comments you left on other people's posts, newest first.

Requires: scope `comments:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `q` | query | string | no | Case-insensitive search across the comment body. |
| `since` | query | string | no | Earliest comment date, ISO 8601. |
| `member` | query | string | no | Workspace keys only. A member's name, email or id (see /workspace/members). Omit to cover every member. |
| `limit` | query | integer | no | 1 to 100. Default 20. |

### People

#### GET /people

**Search saved people.** Everyone saved across your feeds, by name or headline.

Requires: scope `feeds:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `q` | query | string | yes | Name or headline keyword. |
| `limit` | query | integer | no | 1 to 100. Default 20. |

### Workspace

#### GET /workspace/members

**List workspace members.** Who the key can read, for the `member` parameter. Empty roster on a personal key.

Requires: no scope.

### Feeds

#### GET /feeds

**List feeds.**

Requires: scope `feeds:read`.

#### POST /feeds

**Create feed.**

Requires: scope `feeds:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `name` | body | string | yes | Feed name, max 120 characters. |

#### GET /feeds/{id}/people

**List people in a feed.**

Requires: scope `feeds:read`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Feed id. |
| `limit` | query | integer | no | 1 to 200. Default 100. |

#### POST /feeds/{id}/people

**Add people to a feed.** Resolves each URL through your connected LinkedIn account, then adds it to the feed.

Requires: scope `feeds:write`, Growth plan.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Feed id. |
| `linkedin_url` | body | string | no | A single LinkedIn profile URL. |
| `linkedin_urls` | body | string[] | no | Up to 25 profile URLs, instead of linkedin_url. |

#### DELETE /feeds/{id}/people/{personId}

**Remove person from feed.**

Requires: scope `feeds:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Feed id. |
| `personId` | path | string | yes | Person id, from the list endpoint. |

### Publishing

#### GET /drafts

**List calendar posts.** Posts written in MyFeedIn's Content calendar: drafts, scheduled, failed, and published ones from the last 60 days.

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `status` | query | string | no | Default all. One of: all, draft, scheduled, published, failed. |
| `since` | query | string | no | On or after this slot or publication date. |
| `until` | query | string | no | On or before this slot or publication date. |
| `limit` | query | integer | no | 1 to 200. Default 50. |

#### POST /drafts

**Create a draft.** Saves a post as a draft. Nothing reaches LinkedIn until it is scheduled.

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `text` | body | string | yes | The post, plain text. The first link becomes the preview. |
| `first_comment` | body | string | no | Comment posted under the post about 2 minutes after it goes live. |
| `scheduled_at` | body | string | no | Places the draft on a day without scheduling it. ISO 8601 with an offset (2026-10-14T08:30:00+02:00), or a local YYYY-MM-DDTHH:mm read in `timezone`. A bare date is refused. |
| `timezone` | body | string | no | IANA zone for a local scheduled_at. Defaults to the timezone saved in Settings > Publishing. |

#### GET /drafts/{id}

**Get a calendar post.**

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Post id. |

#### PATCH /drafts/{id}

**Edit a draft.** Edits a draft, scheduled or failed post. A scheduled post stays scheduled with the new version.

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Post id. |
| `text` | body | string | no | New text. |
| `first_comment` | body | string | no | New first comment; empty string or null removes it. |
| `scheduled_at` | body | string | no | Moves the draft's day. ISO 8601 with an offset (2026-10-14T08:30:00+02:00), or a local YYYY-MM-DDTHH:mm read in `timezone`. A bare date is refused. |
| `timezone` | body | string | no | IANA zone for a local scheduled_at. Defaults to the timezone saved in Settings > Publishing. |

#### POST /drafts/{id}/schedule

**Schedule a post.** MyFeedIn publishes the post on your LinkedIn account at the slot. Needs a connected LinkedIn account and a plan that allows scheduling; the error `code` says which is missing.

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Post id. |
| `scheduled_at` | body | string | yes | ISO 8601 with an offset (2026-10-14T08:30:00+02:00), or a local YYYY-MM-DDTHH:mm read in `timezone`. A bare date is refused. |
| `timezone` | body | string | no | IANA zone for a local scheduled_at. Defaults to the timezone saved in Settings > Publishing. |
| `randomize` | body | boolean | no | Spread the publish time within ±4 minutes. Default: your publishing setting. |

#### DELETE /drafts/{id}/schedule

**Unschedule a post.** Puts a scheduled post back to draft. Nothing goes out.

Requires: scope `posts:write`.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Post id. |

### Campaigns

#### GET /campaigns

**List campaigns.**

Requires: scope `campaigns:read`, Growth plan.

#### POST /campaigns

**Create campaign.** Creates a draft campaign on your connected LinkedIn account.

Requires: scope `campaigns:write`, Growth plan.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `name` | body | string | no | Default Untitled campaign. |
| `icon` | body | string | no | Default Megaphone. |

#### GET /campaigns/{id}

**Get campaign.**

Requires: scope `campaigns:read`, Growth plan.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Campaign id. |

#### POST /campaigns/{id}/profiles

**Add profiles by URL.**

Requires: scope `campaigns:write`, Growth plan.

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Campaign id. |
| `linkedin_url` | body | string | no | A single LinkedIn profile URL. |
| `linkedin_urls` | body | string[] | no | Up to 25 profile URLs, instead of linkedin_url. |

---

Canonical version: https://myfeedin.co/documentation/api
Published by MyFeedIn (https://myfeedin.co). Cite the canonical URL.
