---
title: "Send a follow-up instruction to a mission"
method: POST
path: "/missions/{issueId}/instructions"
tags: ["missions"]
---

# Send a follow-up instruction to a mission

`POST /missions/{issueId}/instructions`

## Request

- Base URL: `https://api.letsship.ai/v1`
- URL: `https://api.letsship.ai/v1/missions/{issueId}/instructions`
- Auth: none declared

The API equivalent of commenting on the tracker issue, for callers with no tracker identity to post under. An instruction sent this way reaches the agents exactly as a comment would, and carries the same priority over the automated guards that would otherwise hold a stuck mission. A `follow_up` additionally puts the builder back on the mission's open pull request, overriding the review and QA verdicts already recorded: without that, re-triggering a mission whose pull request is already approved correctly concludes there is nothing to do. Returns a receipt naming what was recorded and what it will cause, so a caller never has to guess whether delivery succeeded.

## Path parameters

- `issueId` string, required

## Headers

- `idempotency-key` string: Retrying a request with the same key charges it once and starts (or delivers) it once. Use a new key for new work.

## Request body

- SendMissionInstructionRequest
  - `body` string, required: What the agents should do. Travels verbatim into the builder's prompt.
  - `kind` 'follow_up' | 'note': `follow_up` asks for a change and dispatches the builder against the mission's open PR, overriding cached review/QA verdicts. `note` records context for whatever runs next and dispatches nothing. Stated explicitly rather than inferred, so the outcome never depends on how the platform reads intent.

## Response `200`

Instruction recorded. `dispatch` says what it will cause.

- MissionInstructionReceipt
  - `instructionId` string, required: Id this instruction was recorded under. Deduplicates a retried request.
  - `issueId` string, required
  - `recorded` true, required: The instruction is durably in the mission's inbox. Always true on a 200.
  - `missionActivity` string, nullable, required: The mission's activity at the moment the instruction landed.
  - `dispatch` MissionInstructionDispatch, required
    - `willDispatch` boolean, required
    - `role` string, nullable, required
    - `reason` 'follow_up_forced' | 'note_recorded' | 'pr_settled' | 'no_pr', required
    - `remedy` string: Present only when nothing was dispatched and the caller has a next step.

## Other responses

- `402`: The org has no credits for this (code credits_exhausted)
- `403`: Insufficient role or scope
- `404`: Not found
- `409`: The mission is at its credit limit (code mission_ceiling_reached); approve continuing first
- `429`: The org reached its daily mission limit (code daily_limit_reached)

---

[API](https://skmtc.dev/letsship/apis/ship-api.md) · [All operations](https://skmtc.dev/letsship/apis/ship-api/llms.txt) · [OpenAPI document](https://skmtc.dev/letsship/apis/ship-api/revisions/e6eac1bcadd4?raw)
