---
name: steadyfeed
description: Post to a brand's Instagram through SteadyFeed. Use when the person asks to post about something, plan or schedule Instagram content, see what's waiting for approval, approve a post, or check how posts did.
metadata: {"openclaw":{"requires":{"env":["STEADYFEED_API_KEY"]},"primaryEnv":"STEADYFEED_API_KEY"},"homepage":"https://steadyfeed.app/agents"}
---

# SteadyFeed

SteadyFeed runs one brand's Instagram. You tell it what to post about; it plans, writes and designs the posts in the brand's voice and look, checks them, and posts them at good times.

The key is in `STEADYFEED_API_KEY` (it starts with `sf_live_`). The person makes it in SteadyFeed under Settings → API and MCP. Send it only as a header, never in a chat message or a URL you show:

```
Authorization: Bearer $STEADYFEED_API_KEY
```

Base address: `https://steadyfeed.app/api/v1`. JSON in and out. Errors are `{ "error": "…" }` written for people: show them as they are.

If your agent speaks MCP, you can use the MCP server at `https://steadyfeed.app/api/mcp` with the same header instead; it has the same abilities as tools.

## Post about something

When the person says what to post about, send it as a Drop. Put their words in `text`. If they named a day or time, also send `date` (YYYY-MM-DD) and `hour` (0 to 23, the brand's time zone; see `GET /brand`).

```sh
curl -s https://steadyfeed.app/api/v1/drops \
  -H "Authorization: Bearer $STEADYFEED_API_KEY" -H "Content-Type: application/json" \
  -d '{"text":"Our Saturday open house, 10 to 2, free coffee","link":"https://example.com/open-house","image_urls":["https://example.com/photo.jpg"]}'
```

If the person wrote the caption themselves and wants it as is, send it in `text` with `"keep_words": true`: SteadyFeed makes one post with that caption and slides to match.

`link` and `image_urls` (public https addresses, up to 8) are optional. Pictures on your own computer go in `images` as base64 strings, about 3 MB in all per call. The answer has the Drop's `id`. Writing takes a minute or two: check with

```sh
curl -s https://steadyfeed.app/api/v1/drops/DROP_ID -H "Authorization: Bearer $STEADYFEED_API_KEY"
```

- `status` is `new` or `working` while it writes, `done` with its `posts`, `question` when SteadyFeed needs one answer: ask the person, then send it with `POST /drops/DROP_ID/answer` and `{"answer":"…"}`, or `failed` with an `error`.
- `auto_publish: true` means posts that pass the quality check go out on their own at their date and hour, up to the key's daily limit (2 by default; more wait for review). Otherwise they wait for the person's OK.
- Each post has `passed_check` and, when it was held, `held_because`. Tell the person plainly.

## See what's coming and what waits

```sh
curl -s "https://steadyfeed.app/api/v1/posts?status=review" -H "Authorization: Bearer $STEADYFEED_API_KEY"
```

`status` is one of idea, draft, review, ready, scheduled, posted. `from` and `to` take YYYY-MM-DD. `GET /posts/POST_ID` returns one post with its slides, caption, date, hour and Instagram results. Each post has a `url` the person can open.

## Approve or send back

Approve only a post the person asked you to approve, after showing it to them. Send the `approval_version` from the post you showed:

```sh
curl -s -X POST https://steadyfeed.app/api/v1/posts/POST_ID/approve \
  -H "Authorization: Bearer $STEADYFEED_API_KEY" -H "Content-Type: application/json" \
  -d '{"expected_version":"APPROVAL_VERSION"}'
```

If the post changed since, the answer says so: show the new version and ask again. To send a post back: `POST /posts/POST_ID/request-changes` with `{"note":"what should change"}`.

## Move, reword or stop a post

- `PATCH /posts/POST_ID` with any of `date` (YYYY-MM-DD, or null to take it off the plan), `hour`, `caption`. A new caption on an approved post may send it back for an OK; the answer shows its `status`.
- `POST /posts/POST_ID/hold` with an optional `{"note":"…"}`: an approved post goes back to review and won't go out until someone approves it.

## How it's going

`GET /results?days=7` (1 to 90): posts that went out with reach, likes, comments, saves and shares, the best post, and new Contacts with how many came from a post's link. Use it for "how did last week go?"

## Teach the brand something

When the person says something lasting (new hours, a price, an offer, something to avoid), send `POST /memory` with `{"text":"Closed on Mondays from November","kind":"fact"}`. `kind` is one of about, audience, offer, fact, belief, never, voice. Future posts use it.

## Other things

- `GET /brand`: the brand's name, Instagram, website, topics, time zone and plan.
- `POST /contacts` with `email`, `name`, `phone`, `instagram`, `note`: add someone to Contacts.
- `GET /contacts?updated_since=ISO`, `PATCH /contacts/CONTACT_ID` with `stage`, `tags`, `notes`, `follow_up_on`.

Full description: https://steadyfeed.app/openapi.json
