> ## Documentation Index
> Fetch the complete documentation index at: https://developers.mypilotindex.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Publishing

> Post on the feed or publish a story for a pilot who allowed it, and post on your organization page.

The Partner API can publish in two ways. With a grant that holds `feed.write` or `stories.write`, you publish as the pilot who allowed it. With the partner scope `org.posts`, you publish on the organization page MyPilotIndex bound to you.

Every publication is plain text. You cannot attach media, post in a hangar, or post anonymously.

## Post as a pilot

```bash theme={null}
curl -X POST https://{api-host}/v1/partner/grants/{grant_id}/feed-posts \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "client_ref": "logbook-entry-20261107-01",
    "content": "Landed in Lisbon after my first Atlantic crossing as captain.",
    "visibility": "connections"
  }'
```

```json theme={null}
{ "post_id": "c41e7a02-9d5b-4f18-8a36-7e2b10d4f9aa", "replayed": false }
```

`visibility` is `public` or `connections`. It defaults to `connections`, the narrower of the two.

## Publish a story as a pilot

A story is `standard` or `flight`. A flight story needs `origin` and `destination`, two different airport codes.

```bash theme={null}
curl -X POST https://{api-host}/v1/partner/grants/{grant_id}/stories \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "client_ref": "flight-20261107-kteb-lfpb",
    "subject": "flight",
    "caption": "On the way to Paris.",
    "origin": "KTEB",
    "destination": "LFPB"
  }'
```

```json theme={null}
{ "story_id": "8d2f1b60-4c7e-4a19-b3f5-2e6a90c7d1e4", "replayed": false }
```

A pilot holds at most five active stories. Past that the answer is `409 conflict` with reason `story_cap`.

## Post on your organization page

MyPilotIndex binds your partner to an organization and to a publisher, a member who holds that organization's posting permission. Without a binding, or once the publisher loses that permission, the answer is `403 forbidden` with reason `partner_not_bound`.

```bash theme={null}
curl -X POST https://{api-host}/v1/partner/org-posts \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "client_ref": "open-day-2026-11",
    "content": "Open day at our Boca Raton campus this Saturday."
  }'
```

Organization posts are public.

## Retrying safely

Every create takes a `client_ref` of 1 to 64 letters, digits, dots, underscores, colons or hyphens. It is yours to choose, and it is unique for your partner per kind of publication.

* A new `client_ref` publishes and answers `201`.
* The same `client_ref` with the same body publishes nothing and answers `200` with the stored id and `replayed: true`. Use this after a lost answer.
* The same `client_ref` with another body, or on another grant, answers `409 conflict` with reason `client_ref_reused`.

Bodies are compared after normalizing, so surrounding spaces do not make two publications.

## Limits

These sit on top of the [daily allowance](https://developers.mypilotindex.com/rate-limits.md) and count what was published in the last 24 hours, removed or not:

| Publication | Allowance |
| - | - |
| Posts as a pilot | 3 per grant |
| Stories as a pilot | 5 per grant |
| Organization posts | 10 per partner |

Past them the answer is `429 rate_limited` with reason `publication_throttled` and `Retry-After`.

## What the text may not carry

* **Mentions.** A mention notifies people, so `@handle` and `@all` are refused with `422 unprocessable` and reason `mentions_not_allowed`. An e-mail address is not a mention.
* **A personal e-mail address.** It is refused with `400 invalid_request` and reason `personal_contact`. A company address is fine.

## Removing what you published

```bash theme={null}
curl -X DELETE https://{api-host}/v1/partner/grants/{grant_id}/feed-posts/{post_id} \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

A removal answers `204`. Stories and organization posts work the same way, at `/stories/{story_id}` and `/v1/partner/org-posts/{post_id}`.

You can remove only what you created. Anything else answers `404 not_found`, exactly like a row that does not exist. The pilot can remove anything on their own profile at any time, and your later removal then answers `404`.

## When a pilot cannot publish

A grant that is revoked answers `404 not_found`, and so does a pilot whose account is suspended or is being deleted. Revoking a grant does not remove what you already published: it stays on the pilot's profile until the pilot removes it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.