Mobile feed
The mobile feed holds the posts a user forwarded to Brandsearch from the Instagram or Facebook app: reels, photos and videos, as they appear in the Mobile feed tab of Swipe Files. These endpoints let a tool do by code what the user does by hand in that tab: read their posts, keep folders, file a post in a folder, and take a post out of the feed.
Listing, reading and removing posts work on any Brandsearch plan. Folders (listing, reading, creating, renaming and deleting them) and filing a post in a folder or taking it out need an active paid plan, as in the app: on a trial or a cancelled plan, those endpoints answer 403 plan_required. A teammate uses their team owner's plan. The API key must also be linked to a Brandsearch user (see Swipe).
You choose the folders. Brandsearch files nothing by itself: your automation (Zapier, Make, n8n, your own code) or your AI assistant reads the new posts and decides where each one goes.
Instagram and Facebook. Posts and folders belong to one platform, given by platform. A post goes only in a folder of its own platform. Facebook is in early access in the app: until it opens to everyone, only accounts with that access see Facebook posts and folders. Other accounts get Instagram only, and asking for Facebook by name is a 403 feature_not_available.
Watch for new posts
To act on every post a user forwards, ask for the posts received since the last one you handled, every few minutes:
- List the feed once (
GET /v1/swipe/mobile-feed/posts) and keep thereceived_atof the newest post. - On each run, ask for
GET /v1/swipe/mobile-feed/posts?received_after=<that received_at>. Only newer posts come back, newest first. - Handle them, then keep the newest
received_atfor the next run.
Reading the feed is free: it does not count against your quota, so checking every few minutes costs nothing. Rate limits still apply.
received_at is when Brandsearch first received the post. If another user forwarded the same post before, it keeps that earlier date, so received_after will not see it arrive. This concerns under 2% of posts.
Pricing and limits
- Reads are free: listing and reading posts and folders do not count against your quota (
X-Quota-Charged: false). - Writes count as 1 request and cost 0 credits.
- Creating, renaming and deleting a folder each have their own limit of 1 request per second and 5 per minute per key, separate from the other Swipe folders' limits.
- Filing a post, taking it out of a folder, and taking it out of the feed share a separate limit of 2 requests per second and 60 per minute per key, enough to sort a backlog one post at a time.
The post record
- Name
id- Type
- string
- Description
The post's identifier. Every endpoint below takes it.
- Name
platform- Type
- string
- Description
instagramorfacebook.
- Name
type- Type
- string
- Description
reel, orpostfor a photo or a video that is not a reel.
- Name
media_format- Type
- string
- Description
videoorimage.nullwhen we could not tell.
- Name
received_at- Type
- string
- Description
When Brandsearch received the post (ISO 8601, UTC, to the millisecond). Pass it back as
received_afterto get only newer posts.
- Name
posted_at- Type
- string
- Description
When the post was published on Instagram or Facebook (ISO 8601, UTC).
nullwhen unknown.
- Name
caption- Type
- string
- Description
The post's caption.
nullwhen it has none.
- Name
hashtags- Type
- string[]
- Description
The hashtags in the caption,
#included.
- Name
media_url- Type
- string
- Description
The video or image. When we keep a copy, this is our copy, and it expires 3 days after the response like every media URL in the API. Otherwise it is the address Instagram or Facebook serves the media from: during the first few minutes after the post arrives, until our copy is ready, and for most Facebook posts.
nullwhen we hold no media for the post.
- Name
permalink- Type
- string
- Description
The post on Instagram or Facebook.
nullwhen unknown.
- Name
duration_seconds- Type
- number
- Description
Length of a video, in seconds.
- Name
like_count- Type
- integer
- Description
Likes. On Facebook, the reactions when Facebook gives no like count.
nullwhen unknown, including when the author hid them.
- Name
comment_count- Type
- integer
- Description
Comments.
- Name
view_count- Type
- integer
- Description
Views, or plays when Instagram shows no view count; plays on Facebook.
nullwhen unknown.
- Name
share_count- Type
- integer
- Description
Shares. Facebook only; always
nullon Instagram.
- Name
author- Type
- object
- Description
The account that published the post:
id,username,name,is_verified,follower_count,profile_pic_url. On Facebook,username,is_verifiedandfollower_countarenull.nullwhen unknown.
- Name
folder_ids- Type
- string[]
- Description
The user's folders holding the post.
- Name
dashboard_url- Type
- string
- Description
The post's page in the Brandsearch app.
Post filters
- Name
platform- Type
- string
- Description
instagramorfacebook. Omit for both (Facebook only with early access).
- Name
type- Type
- string
- Description
reelorpost.
- Name
media_format- Type
- string
- Description
videoorimage.
- Name
folder_id- Type
- string
- Description
Only the posts filed in this folder. Another user's folder, or one that does not exist, is a
404 swipe_folder_not_found.
- Name
q- Type
- string
- Description
Words from the caption or title, a hashtag, or the name of the account the post came from. The last word may be the start of a word. Max 200 characters.
- Name
received_from- Type
- string
- Description
Posts received on or after this date.
YYYY-MM-DDmeans the start of that day in UTC; an ISO 8601 timestamp or unix seconds is an exact moment.
- Name
received_to- Type
- string
- Description
Posts received on or before this date.
YYYY-MM-DDincludes that whole day in UTC.
- Name
received_after- Type
- string
- Description
Posts received strictly after this moment. Pass the
received_atof the newest post you have handled.
- Name
sort_by- Type
- string
- Description
received_at(default),posted_at,like_count,comment_countorview_count. A post without the figure comes last.
- Name
sort_order- Type
- string
- Description
desc(default) orasc.
platform, type, media_format, sort_by and sort_order are case-insensitive. Any other value is a 400 invalid_parameter naming the parameter, with details.allowed listing the accepted values; a date we cannot read is a 400 invalid_parameter too. Results are paginated with page and page_size (up to 100).
List posts
The user's feed, newest received first, filtered with the post filters. Free.
Request
curl -G https://api.brandsearch.co/v1/swipe/mobile-feed/posts \
-H "X-API-Key: bsk_your_api_key" \
-d type=reel \
-d received_after=2026-10-11T08:00:00.000Z
200 OK
{
"data": [
{
"id": "reel_18189285490405380",
"platform": "instagram",
"type": "reel",
"media_format": "video",
"received_at": "2026-10-11T13:58:10.930Z",
"posted_at": "2026-10-09T11:07:33.000Z",
"caption": "3 steps to glass skin #skincare",
"hashtags": ["#skincare"],
"media_url": "https://cdn.brandsearch.co/mobile-feed/18189285490405380.mp4",
"permalink": "https://www.instagram.com/reel/DPq1aBcDeFg/",
"duration_seconds": 21.5,
"like_count": 1200,
"comment_count": 40,
"view_count": 56000,
"share_count": null,
"author": {
"id": "999",
"username": "glowbrand",
"name": "Glow Brand",
"is_verified": true,
"follower_count": 81000,
"profile_pic_url": "https://cdn.brandsearch.co/instagram/pp_999.jpg"
},
"folder_ids": ["cmv8lulla7yn3n9769tujw1cv"],
"dashboard_url": "https://app.brandsearch.co/swipe-files/mobile-feed/reel_18189285490405380"
}
],
"pagination": { "page": 1, "page_size": 20, "total": 1, "total_pages": 1 }
}
Get a post
One post of the user's feed, as in the list. Free. A post that is not in the user's feed is a 404 mobile_feed_post_not_found, whether or not it exists.
Path parameters
- Name
post_id- Type
- string
- Description
The post's
id.
Request
curl https://api.brandsearch.co/v1/swipe/mobile-feed/posts/reel_18189285490405380 \
-H "X-API-Key: bsk_your_api_key"
Remove a post from the feed
Take a post out of the user's feed, like Remove from feed in the app. It no longer shows in the feed or in the user's folders. Only this user's feed changes: anyone else who forwarded the same post keeps it. Forwarding it again brings it back.
A post that is not in the feed is a 404 mobile_feed_post_not_found.
Path parameters
- Name
post_id- Type
- string
- Description
The post's
id.
Request
curl -X DELETE \
https://api.brandsearch.co/v1/swipe/mobile-feed/posts/reel_18189285490405380 \
-H "X-API-Key: bsk_your_api_key"
200 OK
{
"id": "reel_18189285490405380",
"removed": true
}
The folder record
Mobile feed folders are the user's own: they are not shared, and every folder below belongs to the API key's user. Folders, and filing posts in them, need an active paid plan.
- Name
id- Type
- string
- Description
The folder's identifier.
- Name
name- Type
- string
- Description
Its name, 1-50 characters.
- Name
platform- Type
- string
- Description
instagramorfacebook: the platform of the posts it holds.
- Name
item_count- Type
- integer
- Description
How many posts of the user's feed it holds.
- Name
created_at- Type
- string
- Description
When it was created (ISO 8601).
- Name
updated_at- Type
- string
- Description
When it was last renamed (ISO 8601).
List folders
The user's folders, newest first, paginated. Free. To list a folder's posts, use List posts with folder_id.
Query parameters
- Name
platform- Type
- string
- Description
instagramorfacebook. Omit for both.
Request
curl https://api.brandsearch.co/v1/swipe/mobile-feed/folders \
-H "X-API-Key: bsk_your_api_key"
200 OK
{
"data": [
{
"id": "cmv8lulla7yn3n9769tujw1cv",
"name": "Skincare hooks",
"platform": "instagram",
"item_count": 12,
"created_at": "2026-10-11T14:02:00+00:00",
"updated_at": "2026-10-11T14:02:00+00:00"
}
],
"pagination": { "page": 1, "page_size": 20, "total": 1, "total_pages": 1 }
}
Create a folder
Create a folder for the user's Instagram (default) or Facebook posts. Returns the folder, 201 Created.
A name the user already gave a folder of that platform is a 409 swipe_folder_name_taken. Each plan allows a number of folders per platform (100 by default); past it, 429 swipe_folder_quota_exceeded. An unknown body field is a 400 validation_error.
Body parameters
- Name
name- Type
- string
- Description
The folder's name, 1-50 characters.
- Name
platform- Type
- string
- Description
instagram(default) orfacebook.
Request
curl -X POST https://api.brandsearch.co/v1/swipe/mobile-feed/folders \
-H "X-API-Key: bsk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Skincare hooks"}'
201 Created
{
"id": "cmv8lulla7yn3n9769tujw1cv",
"name": "Skincare hooks",
"platform": "instagram",
"item_count": 0,
"created_at": "2026-10-11T14:02:00+00:00",
"updated_at": "2026-10-11T14:02:00+00:00"
}
Get, rename or delete a folder
GET /v1/swipe/mobile-feed/folders/{folder_id}returns the folder. Free.PATCHon the same path renames it. Body:{ "name": "..." }, 1-50 characters. A name already used on that platform is a409 swipe_folder_name_taken.DELETEon the same path deletes it and returns{ "id": "...", "deleted": true }. Its posts stay in the feed.
Another user's folder, or one that does not exist, is a 404 swipe_folder_not_found.
Request
curl -X PATCH \
https://api.brandsearch.co/v1/swipe/mobile-feed/folders/cmv8lulla7yn3n9769tujw1cv \
-H "X-API-Key: bsk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "Skincare hooks, best"}'
File a post in a folder
Put a post of the user's feed in one of their folders. The post stays in its other folders. Answers 201 with already_in_folder: true if it was already there, so filing twice is harmless.
The post must be from the folder's platform: an Instagram post in a Facebook folder, or the reverse, is a 400 invalid_parameter on post_id. A post that is not in the user's feed is a 404 mobile_feed_post_not_found.
If the same post changes at the same moment (another user filing it, for example), your change is applied on top, never lost. In the rare case it keeps clashing, the answer is 409 mobile_feed_write_conflict: send the request again.
Path parameters
- Name
folder_id- Type
- string
- Description
The folder's
id.
Body parameters
- Name
post_id- Type
- string
- Description
The post's
id.
Request
curl -X POST \
https://api.brandsearch.co/v1/swipe/mobile-feed/folders/cmv8lulla7yn3n9769tujw1cv/items \
-H "X-API-Key: bsk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"post_id": "reel_18189285490405380"}'
201 Created
{
"folder_id": "cmv8lulla7yn3n9769tujw1cv",
"post_id": "reel_18189285490405380",
"already_in_folder": false
}
Take a post out of a folder
Take a post out of one of the user's folders. It stays in the feed and in its other folders. A post that was not in the folder still answers 200, with already_removed: true. A post that is not in the user's feed is a 404 mobile_feed_post_not_found.
Path parameters
- Name
folder_id- Type
- string
- Description
The folder's
id.
- Name
post_id- Type
- string
- Description
The post's
id.
Request
curl -X DELETE \
https://api.brandsearch.co/v1/swipe/mobile-feed/folders/cmv8lulla7yn3n9769tujw1cv/items/reel_18189285490405380 \
-H "X-API-Key: bsk_your_api_key"
200 OK
{
"folder_id": "cmv8lulla7yn3n9769tujw1cv",
"post_id": "reel_18189285490405380",
"removed": true,
"already_removed": false
}
From your AI assistant
The MCP server gives the same access to an AI assistant: get_mobile_feed lists the posts with the same filters, remove_from_mobile_feed takes one out of the feed, and the folder tools (except get_folder_ads and get_folder_brands) take folder_type="mobile_feed". A user can ask, for example, to sort their latest reels into folders by theme.
Errors
403 plan_required: a folder endpoint, or filing a post in a folder or taking it out, on a trial, a cancelled plan or no paid plan. Listing, reading and removing posts work on any plan.403 swipe_not_provisioned,409 account_link_broken: the API key is not linked to a Brandsearch user, or is linked to one that no longer exists (see Errors).403 feature_not_available: Facebook asked for by an account without early access.404 mobile_feed_post_not_found: the post is not in the user's feed.404 swipe_folder_not_found: the folder does not exist or is not the user's.409 swipe_folder_name_taken: when creating or renaming a folder.429 swipe_folder_quota_exceeded: when creating one past the plan's folder cap.409 mobile_feed_write_conflict: a post kept changing while it was being saved. Send the request again.400 invalid_parameteror400 validation_errorfor a bad value, with the parameter named.
See Errors for the full list.