IonWarp logoIonWarp
Get started
IonWarp Docs
Collections

Plans

Proposed work, scored and approved before anything is written.

Base path /api/v1/plans on https://ionwarp.com. Authenticate with Authorization: Bearer $DASH_API_KEY and name the project with the Project-ID header. Writes are validated in declared mode; an operation this resource does not declare answers 405 operation_not_supported.

List plans

GET /api/v1/plans

curl "https://ionwarp.com/api/v1/plans?status=discovered" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_acme"
Which plans are still waiting on my approval?
data_query {
  "collection": "plans",
  "where": {
    "status": "discovered"
  }
}

Returns a paginated list of plan objects, newest first.

{
  "object": "list",
  "data": [
    {
      "object": "plan",
      "id": "obj_123",
      "approval_status": "pending",
      "repo_write_status": "not_requested",
      "repo_artifact_path": "repo artifact path",
      "target_outcome": "One retry ladder serves every webhook path.",
      "summary": "Three near-identical retry ladders diverged; collapse them into the shared helper.",
      "created_at": "2026-07-25T12:00:00.000Z",
      "updated_at": "2026-07-25T12:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Parameters

ParameterTypeKindDescription
statusstringfilterWhere the plan is in its life: found, proposed, reviewed, approved, being worked, finished, or replaced by a newer plan. One of discovered, proposed, reviewed, approved, active, completed, superseded.
approval_statusstringfilterWhether a human has signed off on the plan yet. Nothing is written to your repository while this is pending. One of pending, approved, rejected.
source_kindstringfilterWhere the plan came from: repo (a plan document already in the repository), ionwarp (proposed by a review), or task. One of repo, ionwarp, task.
repo_write_modestringfilterHow the plan is allowed to reach your repository. Only draft_pr exists — IonWarp never pushes to a branch directly. One of draft_pr.
repo_write_statusstringfilterHow far the repository write got: never asked for, requested, a draft PR was opened, or it failed. One of not_requested, draft_pr_requested, draft_pr_opened, failed.
qstringsearchFree-text search across title, summary.
sortstringsortOne of created_at, updated_at, simplicity_score; prefix with - to reverse.
limitnumberpageRows to return, 1–100. Defaults to 20.
cursorstringpagenext_cursor from the previous page.

Retrieve a plan

GET /api/v1/plans/learning-tests-run-under-bun

curl "https://ionwarp.com/api/v1/plans/learning-tests-run-under-bun" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_acme"
Walk me through plan {id} and what it would change
data_get {
  "collection": "plans",
  "object_id": "learning-tests-run-under-bun"
}

Returns the plan object.

{
  "object": "plan",
  "id": "obj_123",
  "approval_status": "pending",
  "repo_write_status": "not_requested",
  "repo_artifact_path": "repo artifact path",
  "target_outcome": "One retry ladder serves every webhook path.",
  "summary": "Three near-identical retry ladders diverged; collapse them into the shared helper.",
  "created_at": "2026-07-25T12:00:00.000Z",
  "updated_at": "2026-07-25T12:00:00.000Z"
}

Parameters

ParameterTypeKindDescription
idstringpathThe plan's id or slug.

Append an event to a plan

POST /api/v1/plans/{id}/events

curl -X POST "https://ionwarp.com/api/v1/plans/learning-tests-run-under-bun/events" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_acme" \
  -H "Content-Type: application/json" \
  -d '{"event":"Noted by the operator","context":{"source":"api"}}'
Add a note to the plan {id}
data_event {
  "collection": "plans",
  "object_id": "learning-tests-run-under-bun",
  "event": "Noted by the operator"
}

Returns the appended event object.

{
  "object": "event",
  "id": "evt_123",
  "event": "Noted by the operator"
}

Parameters

FieldTypeRequiredDescription
eventstringyesThe human-readable timeline entry.
contextobjectnoProvenance — source, integration, worker_run_id, …

What comes back (read-only)

Every plan carries the envelope below. The fields under it are computed or stamped by the platform — they are returned, never sent.

FieldTypeDescription
objectstringAlways plan.
idstringStable object id. Also accepted in place of slug on any path.
slugstringURL-safe name, unique within the collection.
created_atstringISO-8601 timestamp of the first write.
updated_atstringISO-8601 timestamp of the most recent write. The cursor sorts on this.
titlestringName of the plan.
source_kindstringWhere the plan came from: repo (a plan document already in the repository), ionwarp (proposed by a review), or task.
source_labelstringHuman-readable origin of the plan — "Repository", "IonWarp Review", or the reviewer's own label. Falls back to source_kind when unset.
statusstringWhere the plan is in its life: found, proposed, reviewed, approved, being worked, finished, or replaced by a newer plan.
approval_statusstringWhether a human has signed off on the plan yet. Nothing is written to your repository while this is pending.
requires_approvalbooleanWhether this plan needs an explicit approval before it may write anything.
repo_write_modestringHow the plan is allowed to reach your repository. Only draft_pr exists — IonWarp never pushes to a branch directly.
repo_write_statusstringHow far the repository write got: never asked for, requested, a draft PR was opened, or it failed.
repo_artifact_pathstringPath of the plan document in the repository (e.g. docs/plans/2026-07-14-liveness.md). This exact path is how a review is dispatched against the plan.
repo_artifact_urlstringLink to repo_artifact_path on GitHub, once the file exists there. An IonWarp-authored plan has no repo file until its draft PR opens.
target_outcomestringWhat the repository should be true of once this plan is done.
summarystringShort markdown summary of the plan.
simplicity_scorenumberSimplicity score the proposing review attached to this plan. The scale is the reviewer's, not the platform's.
legacy_review_scorenumberLegacy-risk score the proposing review attached to this plan. The scale is the reviewer's, not the platform's.
security_scorenumberSecurity score the proposing review attached to this plan. The scale is the reviewer's, not the platform's.
review_task_idstringTask id of the review that proposed this plan. Absent means the plan is not linked to a review yet.
evidence_anchorsstringComma-separated references the reviewer cited as its basis, each \<kind>:\<id> (e.g. review:rev_1,learning:lrn_1). A proposal must carry at least two.
linked_review_idsstringComma-separated ids of the reviews this plan was proposed from. Empty when the proposal cited none.
linked_learning_idsstringComma-separated ids of the learnings rows this plan drew on. Empty when the proposal cited none.
linked_scorecard_idsstringComma-separated slugs of the scorecards this plan is meant to improve (e.g. ai-readiness). Empty when the proposal cited none.
related_fix_countnumberHow many separate fixes the reviewer grouped into this plan. A proposal must cover at least two.
plan_bodystringThe plan document itself, as markdown.

Errors

Failures use { error: { type, code, message, param } }. The full code table is generated at Error Codes.

On this page

IonWarp logoIonWarp

Ready to build? Connect an agent and go — no credit card needed to start.

Get startedSee our plans