Developers
API reference
Version v1Base URL https://magpiefeed.com/api/v1
Read your brands, channels, feeds and posts, queue a post, ask a feed to poll now and push items into a feed, from your own scripts and tools. The API is part of Pro and Agency.
1Authentication
Every request carries a personal API token in the Authorization header.
Create one on the API tokens page. The whole token is shown once, when
you create it: we keep only a hash of it, so copy it then. You can revoke a token at any time, and an
expired or revoked token stops working at once.
curl https://magpiefeed.com/api/v1/me/ \
-H "Authorization: Bearer mf_AbC123dEf456_your-secret"
The API accepts only tokens. Browser cookies are ignored, so a signed-in browser tab cannot be used to
call it. A token can be pinned to one Brand; it then sees only that Brand's data. The API is checked
against your plan on every request: if the plan changes to one without the API, the token gets
403 plan_required until the plan includes it again.
Treat a token like a password. Keep it in a secret store, never in page source or a public repository. If one leaks, revoke it and create another.
The same tokens also work on the older Studio endpoints under /api/v1/studio/
(exports and marking a post posted or skipped).
2Scopes
| Scope | Allows |
|---|---|
read | Every GET request. |
write | Also POST: queue a post, ask a feed to poll, push an item. Includes read. |
3Rate limits
Each token may make 60/min requests. Over that, the answer is
429 rate_limited with a Retry-After header in seconds. A feed can be asked to
poll at most once every two minutes, and one account can ask for at most ten polls in ten minutes (a 429 carries Retry-After).
4Errors
Errors are JSON with a stable code and a sentence you can show to a person:
{"error": {"code": "invalid_request",
"message": "Some fields are missing or invalid.",
"fields": {"caption": ["A caption is required."]}}}
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_request, invalid_json | The body or a query parameter is wrong; see fields. |
| 401 | not_authenticated, invalid_token, token_revoked, token_expired | No token, or one that does not work. |
| 403 | plan_required, insufficient_scope | The plan has no API, or the token is read-only. |
| 404 | not_found | No such object in your account. Another account's ids are always 404. |
| 409 | feed_paused | The feed is paused in the app. |
| 429 | rate_limited, poll_too_soon | Slow down; see Retry-After. |
5Lists and pagination
List endpoints answer {"data": [...], "pagination": {...}}. Pass limit
(default 50, at most 200) and offset; when has_more is true, ask again with
offset=next_offset. Times are ISO 8601 in UTC.
6Me
/me/
readYour account, plan, the token making the call (prefix, scopes, Brand, expiry; never the secret) and its rate limit.
7Brands and channels
/brands/
readThe Brands this token can see.
/channels/
readConnected Channels, optionally ?brand=. Platform, name, health and whether it can publish.
Credentials are never returned.
curl "https://magpiefeed.com/api/v1/channels/?brand=12" -H "Authorization: Bearer $MF_TOKEN"
8Posts
/posts/
readNewest first. Filters: status (one or a comma list of queued,
rendering, ready, publishing, published,
published_manual, failed, skipped), brand,
channel, and since (changed at or after this time, for syncing).
awaiting_approval tells you whether the post is still waiting for a yes.
curl "https://magpiefeed.com/api/v1/posts/?status=ready&since=2026-10-01T00:00:00Z" \
-H "Authorization: Bearer $MF_TOKEN"
/posts/{id}/
readOne post.
/posts/
writeQueue a post for a Brand. It lands in your Queue like any other post.
| Field | Required | Notes |
|---|---|---|
brand | yes | Brand id. |
caption | yes | Up to 5000 characters. Kept as written. |
channel | no | A Channel of that Brand. Without one the post is a Studio Mode post you share by hand. |
media_url | no | A public PNG, JPEG, WebP, GIF or MP4 of at most 15 MB. We fetch and store it; the post is rendering until then, and failed with the reason if it cannot be fetched. Without it, the post is drawn from your Brand's template. |
link | no | http(s) URL used where the caption says {LINK}. |
scheduled_for | no | ISO 8601. Defaults to now. |
automation | no | An Automation of that Brand whose Approval mode the post follows. Without one the post waits for your approval. |
curl -X POST https://magpiefeed.com/api/v1/posts/ \
-H "Authorization: Bearer $MF_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: spring-sale-2026-10-01" \
-d '{"brand": 12, "channel": 34,
"caption": "Spring sale starts today. {LINK}",
"link": "https://example.com/sale",
"media_url": "https://example.com/img/sale.png",
"scheduled_for": "2026-10-01T09:00:00Z"}'
Send an Idempotency-Key header to make retries safe: the same key within 24 hours returns
the post the first request made instead of queueing a second one.
9Feeds
/feeds/
readYour Feeds, optionally ?brand=: kind, type, status, item count and poll times.
A feed's own access header is never returned, and credentials in its URL are masked.
/feeds/{id}/poll/
writeAsk for a poll now instead of waiting for the next scheduled one. Answers 202; the poll runs
in the background.
curl -X POST https://magpiefeed.com/api/v1/feeds/56/poll/ -H "Authorization: Bearer $MF_TOKEN"
10Push items into a feed
/items/
writeSend a new product or article the moment it exists, instead of waiting for a poll. A new
guid becomes an Item and a new item event, which your Automations react to exactly as
they do to a polled one. The same guid again returns the existing Item with 200
and changes nothing, so retries are safe.
| Field | Required | Notes |
|---|---|---|
feed | yes | Feed id. |
guid | yes | Your stable id for the item, up to 255 characters. |
title | yes | Plain text; HTML is stripped. |
url, image_url, video_url | no | http(s) URLs. |
description, category, brand_name, gtin | no | Text. |
price, sale_price, currency, availability | no | Products only. "12,99" and 19.9 both work; availability like in stock. |
curl -X POST https://magpiefeed.com/api/v1/items/ \
-H "Authorization: Bearer $MF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"feed": 56, "guid": "sku-1042", "title": "Linen shirt",
"url": "https://example.com/p/1042",
"image_url": "https://example.com/img/1042.jpg",
"price": "49.00", "currency": "EUR", "availability": "in stock"}'
An item you push into a feed that is also polled is treated like any other item of that feed: if the feed's own document never lists it, later polls count it as gone. Push into a feed whose document you control, or keep a feed just for pushed items.
11Versioning
Everything here is /api/v1/. Within v1 we only add: new endpoints, new optional fields and
new fields in answers. Anything that would break a working integration goes into a v2, announced here first.