---
title: "Start an intern run without waiting for it"
method: POST
path: "/interns/{internId}/invoke"
tags: ["Interns"]
---

# Start an intern run without waiting for it

`POST /interns/{internId}/invoke`

Starts a run on one of your interns and answers `202` with the `session_id` as soon as the intern accepts it. The run keeps going on the intern after the response. Nothing about its progress comes back on this request; the intern reports through its own tools, such as Slack.

Send the same `session_id` later to continue the conversation, for example to hand the intern a decision on work it started. If that session already has a run going, the prompt is delivered into it and the status is `steered`. A `session_id` is accepted only from the caller it was issued to, on the same intern; any other, including sessions started from Slack or the chat endpoint, is refused with `404`.

Runs started here self-drive: the intern consents to its own tool approvals, and a question it asks is answered by its own fallback. A run ends when the intern finishes it or after its execution deadline (1 hour by default).

Available to interns programme members. Callers outside the programme receive `404` for every path under `/api/v1/interns`.

## Path parameters

- `internId` string, required — The intern to run.

## Request body

- InternInvokeRequest — A prompt to run on the intern without holding a connection open.
  - `input` string, required — The prompt for the run, at most 32000 characters.
  - `session_id` string — The session to run in. Send the `session_id` from an earlier `202` to continue that conversation, for example to hand the intern a decision on a case it is working. Omit it to start a new session. Only a `session_id` this endpoint issued to the same caller on the same intern is accepted; any other is refused with `404`.

## Response `202`

The intern accepted the prompt. The run continues on the intern.

- InternInvokeAcceptedResponse — The intern admitted the prompt. The run continues on the intern.
  - `session_id` string, required — The session the run belongs to. Send it back to continue the conversation.
  - `status` 'started' | 'steered', required — `started` when a new run began. `steered` when the session already had a run going and the prompt was delivered into it instead.

## Other responses

- `400` — The body is not a valid request (`bad_request`).
- `401` — No valid API key.
- `403` — The key belongs to a member who has left the organization and holds no grant.
- `404` — The caller is outside the interns programme, the intern does not exist for this key, or the `session_id` was not issued to this caller on this intern (`not_found`).
- `408` — The request exceeded the route's own deadline before the handler answered (`timeout`).
- `409` — The intern is not running or its runtime is too old to keep a run going without a connection (`intern_not_ready`), or the session already has a run that did not take the prompt (`busy`). A `busy` refusal carries `Retry-After`.
- `413` — The body exceeds 1 MiB (`payload_too_large`).
- `429` — Too many turns for the user or organization this key acts as (`rate_limited`). It carries `Retry-After`.
- `500` — The intern could not be looked up, or authenticating the key failed.
- `502` — The intern could not be reached, rejected the request, or refused the turn before it started.
- `503` — The intern cannot take another run right now (`busy`). It reports `retryable: true` and carries `Retry-After`.
- `504` — The intern did not accept the turn in time (`timeout`).

## Changes

- **2026-09-23** `8d4a7f577949` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/openrouterteam/apis/openrouter-api/changes/interns/:internId/invoke/post.md)

---

[API](https://skmtc.dev/openrouterteam/apis/openrouter-api.md) · [All operations](https://skmtc.dev/openrouterteam/apis/openrouter-api/llms.txt) · [OpenAPI document](https://skmtc.dev/openrouterteam/apis/openrouter-api/revisions/7c237298ce97?raw)
