Coach (results and next move)

What happened to your posts this week, your goal and streak, the one next move, today's next best post and a first-line check.

View as MarkdownOpenAPIBase URL https://postwire.io

Everything here is computed from your own posts with fixed rules — no AI is called, so none of it uses your AI drafts. Each post is compared with your own median on the same network, the day after it goes out; a trait of a good post is called a reason only when your own posts back it. Benchmarks (best time to post before you have 8 measured posts) name their source and date. A network that does not share numbers is listed with the reason, never as a zero.

Coach: your results, your goal and your next move

GET/api/coach

What the dashboard's Home shows after you publish, from your own numbers: this week's posts against your weekly goal, the daily streak, views or interactions over 7 days against the 7 days before, follower change where the network shares it, your best post of the week compared with your own median on that network (with n) and what it had — a trait is named as a reason only when your own posts back it (3 posts each way, 1.2x or more) — milestones, the ONE next action, today's next best post (an opening and format your posts back, a ready-to-edit starter, the best time from your data or a sourced benchmark), and your winner adapted to the connected networks it has not been on. Free plans also get, only when a plan limit touched their posts, what a paid plan would have done with their numbers and its price per day. Deterministic: no AI is called. A network that does not share numbers is listed with the reason, never as a zero.

Needs an API key: Authorization: Bearer pw_live_….

Parameters

FieldTypeDescription
tzquery, stringIANA timezone for the week, the day and the streak (default UTC)
brand_idquery, stringonly this brand's posts and networks

Responses

StatusMeans
200{ goal, goal_options, cadence_options, week, streak, history, results: { last_7_days, previous_7_days, best_post, best_recent, followers, measured, published }, measurable, milestones, next_action, next_post, repost, moments, ai_drafts, plan, rules }
curl
curl "https://postwire.io/api/coach?tz=America%2FLima" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY"
Node
const res = await fetch("https://postwire.io/api/coach?tz=America%2FLima", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.POSTWIRE_API_KEY}` },
});
console.log(res.status, await res.json());
Python
import os, requests

r = requests.get(
    "https://postwire.io/api/coach?tz=America%2FLima",
    headers={"Authorization": f"Bearer {os.environ['POSTWIRE_API_KEY']}"},
)
print(r.status_code, r.json())

Coach: set your goal and weekly cadence

POST/api/coach/goal

goal: grow_audience, get_clients, sell_product or personal_brand. cadence: posts a week (3, 5, 7 or 10; one post to several networks counts once). It decides the ideas the coach suggests and the weekly target.

Needs an API key: Authorization: Bearer pw_live_….

Body (JSON)

FieldTypeDescription
goal requiredstringOne of: grow_audience, get_clients, sell_product, personal_brand.
cadenceintegerOne of: 3, 5, 7, 10.

Responses

StatusMeans
200{ ok, goal: { goal, cadence, label, set_at } }
400unknown goal (the list is returned)
curl
curl -X POST "https://postwire.io/api/coach/goal" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "goal": "get_clients",
  "cadence": 5
}'
Node
const res = await fetch("https://postwire.io/api/coach/goal", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.POSTWIRE_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "goal": "get_clients",
    "cadence": 5
  }),
});
console.log(res.status, await res.json());
Python
import os, requests

r = requests.post(
    "https://postwire.io/api/coach/goal",
    headers={"Authorization": f"Bearer {os.environ['POSTWIRE_API_KEY']}"},
    json={
        "goal": "get_clients",
        "cadence": 5,
    },
)
print(r.status_code, r.json())

Coach: score a post's first line for each network

POST/api/coach/hook

Rules only, no AI: the kind of opening (question, number, list, how-to, contrarian, story), the network's fold (how much it shows before it cuts; approximate where the network does not publish it), warm-up openers, hashtags, a link or capitals in the first line, and the network's limit. Returns a 0-100 score per network with the top fixes, plus your own opening pattern when your posts show one.

Needs an API key: Authorization: Bearer pw_live_….

Body (JSON)

FieldTypeDescription
textstring
platformsarray of string
draftsobjecteach network's own text, when it differs

Responses

StatusMeans
200{ overall, networks: [{ platform, score, grade, hook_type, first_line_len, fold, checks, fixes, tip? }] }
curl
curl -X POST "https://postwire.io/api/coach/hook" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "text": "Why do 9 of 10 sourdough loaves fail on day one?",
  "platforms": [
    "linkedin",
    "bluesky"
  ]
}'
Node
const res = await fetch("https://postwire.io/api/coach/hook", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.POSTWIRE_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "text": "Why do 9 of 10 sourdough loaves fail on day one?",
    "platforms": [
      "linkedin",
      "bluesky"
    ]
  }),
});
console.log(res.status, await res.json());
Python
import os, requests

r = requests.post(
    "https://postwire.io/api/coach/hook",
    headers={"Authorization": f"Bearer {os.environ['POSTWIRE_API_KEY']}"},
    json={
        "text": "Why do 9 of 10 sourdough loaves fail on day one?",
        "platforms": ["linkedin", "bluesky"],
    },
)
print(r.status_code, r.json())

Coach: a public image of your week in numbers

POST/api/coach/share

Returns image_url, a PNG (1080x1080) of this week's posts against your goal, the streak, views or interactions and your best post's ratio, with a small "made with PostWire" line, and a caption to post with it. The numbers travel inside the signed link: opening it reads nothing else and shows nothing else. Valid 180 days.

Needs an API key: Authorization: Bearer pw_live_….

Body (JSON)

FieldTypeDescription
tzstring
namestringoptional name on the card (40 characters)

Responses

StatusMeans
200{ ok, image_url, caption, numbers, note }
curl
curl -X POST "https://postwire.io/api/coach/share" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "tz": "America/Lima"
}'
Node
const res = await fetch("https://postwire.io/api/coach/share", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.POSTWIRE_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "tz": "America/Lima"
  }),
});
console.log(res.status, await res.json());
Python
import os, requests

r = requests.post(
    "https://postwire.io/api/coach/share",
    headers={"Authorization": f"Bearer {os.environ['POSTWIRE_API_KEY']}"},
    json={
        "tz": "America/Lima",
    },
)
print(r.status_code, r.json())