# 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.

Source: https://postwire.io/docs/coach/ · Base URL: https://postwire.io · OpenAPI: https://postwire.io/openapi.json

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`](#get-api-coach): Coach: your results, your goal and your next move
- [`POST /api/coach/goal`](#post-api-coach-goal): Coach: set your goal and weekly cadence
- [`POST /api/coach/hook`](#post-api-coach-hook): Coach: score a post's first line for each network
- [`POST /api/coach/share`](#post-api-coach-share): Coach: a public image of your week in numbers

## 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**

| 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 } |

```bash
curl "https://postwire.io/api/coach?tz=America%2FLima" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY"
```

```js
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)**

| 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) |

```bash
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
}'
```

```js
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)**

| 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? }] } |

```bash
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"
  ]
}'
```

```js
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)**

| Field | Type | Description |
|---|---|---|
| `tz` | string |  |
| `name` | string | optional name on the card (40 characters) |

**Responses**

| Status | Means |
|---|---|
| `200` | { ok, image_url, caption, numbers, note } |

```bash
curl -X POST "https://postwire.io/api/coach/share" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "tz": "America/Lima"
}'
```

```js
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())
```
