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.
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.
GET /api/coach: Coach: your results, your goal and your next movePOST /api/coach/goal: Coach: set your goal and weekly cadencePOST /api/coach/hook: Coach: score a post's first line for each networkPOST /api/coach/share: Coach: a public image of your week in numbers
Coach: your results, your goal and your next move
/api/coachWhat 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
| Field | Type | Description |
|---|---|---|
tz | query, string | IANA timezone for the week, the day and the streak (default UTC) |
brand_id | query, string | only this brand's posts and networks |
Responses
| Status | Means |
|---|---|
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 "https://postwire.io/api/coach?tz=America%2FLima" \
-H "Authorization: Bearer $POSTWIRE_API_KEY"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());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
/api/coach/goalgoal: 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)
| Field | Type | Description |
|---|---|---|
goal required | string | One of: grow_audience, get_clients, sell_product, personal_brand. |
cadence | integer | One of: 3, 5, 7, 10. |
Responses
| Status | Means |
|---|---|
200 | { ok, goal: { goal, cadence, label, set_at } } |
400 | unknown goal (the list is returned) |
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
}'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());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
/api/coach/hookRules 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)
| Field | Type | Description |
|---|---|---|
text | string | |
platforms | array of string | |
drafts | object | each network's own text, when it differs |
Responses
| Status | Means |
|---|---|
200 | { overall, networks: [{ platform, score, grade, hook_type, first_line_len, fold, checks, fixes, tip? }] } |
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"
]
}'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());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
/api/coach/shareReturns 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)
| Field | Type | Description |
|---|---|---|
tz | string | |
name | string | optional name on the card (40 characters) |
Responses
| Status | Means |
|---|---|
200 | { ok, image_url, caption, numbers, note } |
curl -X POST "https://postwire.io/api/coach/share" \
-H "Authorization: Bearer $POSTWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tz": "America/Lima"
}'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());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())