Routines: POST /v1/code/triggers/{trigger_id}/run returns 400 'trigger_id: Extra inputs are not permitted'

Resolved 💬 1 comment Opened May 2, 2026 by vijayPrajapatii Closed Jun 2, 2026

Summary

The manual-run endpoint for scheduled remote agents (routines) is rejecting all requests with HTTP 400. The Run now button in the routines UI hits this endpoint and is therefore unusable. Recurring schedules still fire normally.

Repro

  1. Create a routine via the /schedule skill (or the UI). Confirm it appears in list and get.
  2. Try to trigger it manually:
POST /v1/code/triggers/{trigger_id}/run

Both with an empty body and with {}:

HTTP 400
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "trigger_id: Extra inputs are not permitted"
  }
}

The error message implies that trigger_id, which is part of the URL path, is also being routed into the request body schema, which then rejects it as an unknown field.

Verified

  • GET /v1/code/triggers (action: list) — works
  • GET /v1/code/triggers/{trigger_id} (action: get) — works
  • POST /v1/code/triggers/{trigger_id}/run (action: run) — fails with the error above
  • Same failure regardless of whether the body is omitted or {}
  • Reproduces in two independent calls (different request_id values)
  • The Run now button in the web UI at https://claude.ai/code/routines/{trigger_id} produces the same failure mode for end users

Request IDs (for server-side log lookup)

  • req_011Cadf3UQQtqnoYLZiutD5V
  • req_011Cadf467jtkDViGK3VMnoa

Both fired against the same routine, ~seconds apart, on 2026-05-02 around 11:24 UTC.

Workaround

Creating a one-shot routine with run_once_at set ~2 minutes in the future bypasses the broken /run endpoint by using the scheduler itself to fire the job. This works but is awkward for routine users who expect the Run now button to function.

Likely fix

It looks like the endpoint's request-body Pydantic model is being given the URL path parameters as inputs and is configured to forbid unknown fields. Either drop the path param from the body model or set model_config = ConfigDict(extra='ignore') on that schema.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗