---
title: "Retry Failed Platforms"
method: POST
path: "/v2/launches/{launch_id}/retry"
tags: ["v2 - Launches"]
---

# Retry Failed Platforms

`POST /v2/launches/{launch_id}/retry`

## Request

- Base URL: `https://api.jubjubapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.jubjubapp.com/v2/launches/{launch_id}/retry`
- Auth: HTTP bearer

Retry publishing to failed platforms.

Only works for launches with status 'partial_failure'.

Access: Must have PUBLISH_EXECUTE permission on the launch's workspace.

## Path parameters

- `launch_id` string, required

## Headers

- `Authorization` string
- `X-JubJub-Service-Key` string
- `X-JubJub-Agent-Key` string
- `X-JubJub-Platform-Key` string
- `Origin` string
- `Referer` string
- `X-JubJub-Trial-Token` string

## Request body

- RetryLaunchRequest: Request to retry failed platforms in a launch.
  - `platform_config_ids` string[], nullable: Specific platforms to retry. If None, retries all failed.
  - `force` boolean: If True, also retry platforms with error_code=UNKNOWN_OUTCOME. Requires explicit platform_config_ids (no force 'retry all').

## Response `200`

Successful Response

- LaunchResponse: Response for a launch.
  - `launch_id` string, required: Unique launch identifier
  - `content_id` string, required: ID of the content being published
  - `content_title` string, nullable: Title of the content
  - `content_thumbnail_url` string, nullable: Thumbnail URL of the content
  - `workspace_id` string, required: Workspace ID
  - `created_by` string, nullable: Creator's profile ID: only the caller's own (or for a platform admin)
  - `created_by_you` boolean: Whether the caller created this launch
  - `creator` PublicPerson: A person by public profile. Never an ID, never an email.
    - `member_ref` string, nullable
    - `display_name` string, required
    - `avatar_url` string, nullable
    - `handle` string, nullable
    - `is_you` boolean
    - `role` string, nullable
    - `via_team` string, nullable
  - `status` string, required: Overall status: pending, awaiting_approval, scheduled, in_progress, completed, partial_failure, failed, cancelled, handed_over (sent to the creator's own editor to post; JubJub published nothing), unknown (stored value unrecognised; never executed)
  - `platforms` PlatformLaunchResponse[], required: Status per platform
    - `platform` string, required: Platform type (youtube, instagram, etc.)
    - `config_id` string, required: PlatformConfig ID
    - `credential_name` string, nullable: Name of the credential/account used
    - `status` string, required: Status: pending, in_progress, success, failed, skipped, handed_over (given to the creator's editor on that platform, not published), sent_to_ad_library (Meta Ads: the media is in the ad account's library; promotion, not published), unknown (stored value unrecognised; never published)
    - `published_url` string, nullable: URL of published content
    - `published_id` string, nullable: ID on the platform
    - `error` string, nullable: Error message if failed
    - `error_code` string, nullable: Machine-readable reason this platform failed or was not sent: SHARE_REVOKED, MEMBER_REMOVED, ROLE_NOT_PERMITTED, CONNECTION_MISSING, NOT_PERMITTED, MEDIA_TYPE_UNSUPPORTED, UNKNOWN_OUTCOME, or an adapter's own code. docs/dashboard-contract-2026-10.md lists them.
    - `started_at` string, date-time, nullable: When publishing started
    - `completed_at` string, date-time, nullable: When publishing completed
    - `first_comment` object, nullable: Outcome of the optional first comment posted after publish: {status: posted|failed|skipped, comment_id, error, at}. Null when none was asked for. A failed comment never fails the publish.
  - `error_code` string, nullable: Why the launch as a whole is waiting or stopped: AWAITING_OWNER_APPROVAL (a shared account's owner must approve), AWAITING_WORKSPACE_APPROVAL (the workspace owner must release it), APPROVAL_REJECTED, MEMBER_REMOVED (cancelled: its launcher left the team), or the one code every failed platform shares. Null otherwise.
  - `scheduled_for` string, date-time, nullable: Scheduled publish time
  - `timezone` string, nullable: Timezone for scheduled_for
  - `platform_schedules` object, nullable: Per-platform schedule overrides keyed by config_id
  - `platform_overrides` object, nullable: Per-platform settings overrides keyed by config_id
  - `first_comment` string, nullable: General first comment for this launch (per-platform ones win)
  - `first_comment_notice` string, nullable: Where the general first comment is NOT being posted, and why, in one line (e.g. 'Instagram first comments are coming soon, so this one was not posted on Instagram.'). Null when it goes everywhere it was sent. Tell the user: the launch still publishes, only the comment stops.
  - `created_at` string, date-time, required: When launch was created
  - `updated_at` string, date-time, nullable: Last update time
  - `completed_at` string, date-time, nullable: When launch completed
  - `sent_to_ad_library_count` integer: Legs sent to a Meta ad account's media library (not published; not in successful_count)
  - `notices` string[]: Plain sentences about this request, e.g. that Meta Ads campaign settings were ignored
  - `total_platforms` integer, required: Total number of platforms
  - `successful_count` integer, required: Number of successful platforms
  - `failed_count` integer, required: Number of failed platforms
  - `approvals` LaunchApprovalSummary[]
    - `approval_id` string, required
    - `policy_source` string, required: workspace_owner | channel_ownership | meta_ads_activation
    - `status` string, required
    - `platform` string, nullable: '*' for a workspace_owner approval
    - `credential_name` string, nullable
    - `approver` PublicPerson: A person by public profile. Never an ID, never an email.
      - `member_ref` string, nullable
      - `display_name` string, required
      - `avatar_url` string, nullable
      - `handle` string, nullable
      - `is_you` boolean
      - `role` string, nullable
      - `via_team` string, nullable
    - `is_approver` boolean: Whether the caller may decide it
    - `decided_at` string, nullable
    - `resolution_note` string, nullable
  - `sent_now` boolean

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/jubjubapp/apis/jubjub-api.md) - [All operations](https://skmtc.dev/jubjubapp/apis/jubjub-api/llms.txt) - [OpenAPI document](https://skmtc.dev/jubjubapp/apis/jubjub-api/revisions/353157b296f2?raw)
