# Publish and schedule reviewed media

> Use Console, delegated MCP, or a scoped organization service credential to move reviewed assets into connected publishing accounts and schedules.

Canonical: https://entirefeed.com/docs/publishing

Generation and publishing are separate operations. A successful media generation produces assets; publishing selects reviewed assets, connected accounts, timing, and post state through the supported Console surface.

## Use Console authority

Publishing management is available through signed-in Console, delegated Console MCP, and a narrow organization service credential for unattended server use. Console MCP remains a personal credential whose effective authority follows the current user. A publishing service credential is separate: an Owner or Admin selects its grants, its secret is displayed once, and the server intersects those grants with the workspace's current customer-type policy on every request.

Create, rotate, or revoke a service credential under **Console → Settings → Credentials → Publishing service credentials**. Store the one-time `efsvc_live_...` value in a secret manager and send it only as:

```http
Authorization: Bearer efsvc_live_...
```

Public REST API keys are not publishing credentials. Do not send `efapi_live_...` keys to Console publishing routes or MCP clients.

## Direct REST contract

The service credential may call only routes whose required capability it was explicitly granted:

| Capability                | REST operations                                                                                                                                                                                                                                                           |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `accounts:read`           | `GET /v1/console/accounts`                                                                                                                                                                                                                                                |
| `media:upload`            | `POST /v1/uploads` with multipart field `file`                                                                                                                                                                                                                            |
| `publishing:read`         | `GET /v1/console/publishing/posts`, `GET /v1/console/publishing/posts/{post_id}`, `GET /v1/console/publishing/scheduled-posts`, `GET /v1/console/publishing/cost`, `GET /v1/console/publishing/schedule-board`                                                            |
| `publishing:manage`       | `POST /v1/console/publishing/posts`, `PATCH /v1/console/publishing/posts/{post_id}`                                                                                                                                                                                       |
| `publishing:schedule`     | `POST /v1/console/publishing/posts/{post_id}/schedule`, `POST /v1/console/publishing/posts/{post_id}/publish-now`, `POST /v1/console/publishing/scheduled-posts/{scheduled_post_id}/reschedule`, `POST /v1/console/publishing/scheduled-posts/{scheduled_post_id}/cancel` |
| `publishing:credits:read` | `GET /v1/console/publishing/posting-credits`                                                                                                                                                                                                                              |

Upload local media directly before creating the draft:

```bash
curl --fail-with-body https://api.entirefeed.com/v1/uploads \
  -H "Authorization: Bearer $ENTIREFEED_PUBLISHING_CREDENTIAL" \
  -F "file=@./reviewed-video.mp4"
```

Use the returned HTTPS `url` in `media_urls`, then create or update the draft and inspect its `readiness` object before scheduling. Send a stable `Idempotency-Key` when creating a draft and whenever scheduling a managed-hardware post.

The credential cannot call generation, workflow, warmup, product management, analytics, generic billing, checkout, top-up, service-credential management, or browser upload-handoff routes. Personal MCP credentials and existing self-serve Public REST API keys remain separate and continue to use their existing surfaces.

Start with [Accounts and posts](/docs/publishing/accounts-and-posts) to select a publishable account and create or edit a draft. Use [Schedules](/docs/publishing/schedules) only after the media, account, caption, time, and timezone are explicit.

## Review before distribution

Inspect output assets and account selection before scheduling or publishing. Treat rescheduling, cancellation, retries, and failed delivery as explicit lifecycle actions rather than assuming a generation's status controls a post.
