Skip to content

402 responses model the wrong body — /render, /av/remux, /av/demux all $ref Error, which prod does not return #31

Description

@yakimoto

Found while speccing the MoQ surface (#24). Two pre-existing defects, neither caused by that work.

1. Every existing 402 in openapi.yaml models the wrong body

/render, /av/remux and /av/demux all $ref the Error schema for their 402 response. Production does not return the Error envelope on a 402. Observed shape:

{
  "error": "payment required",
  "error_detail": { ...the normalized WAVE error... },
  "x402Version": 1,
  "accepts": [ ... ],
  "next_action": { ... }
}

error is a plain string, and the normalized WAVE error is nested under error_detail, alongside the x402 fields. So a generated SDK client that deserializes a 402 into Error will fail or silently produce garbage on the single most common failure a new developer hits — the paywall.

PR #30 adds correct X402PaymentRequired + X402Accepts schemas and a reusable PaymentRequired response. It deliberately did not rewrite the three existing endpoints — that is this issue. They should adopt the new response.

2. 401 is effectively unreachable on the MoQ routes

The code implies an unauthenticated or bad-key caller gets 401 AUTH_REQUIRED. Production returns 402 for both no-key and a syntactically-valid-but-unrecognized bearer — the x402 challenge is offered ahead of key rejection.

Worth a deliberate decision rather than leaving it as emergent behaviour: is offering payment before rejecting an unknown key the intent? It is defensible (it lets an anonymous caller pay their way in without ever holding a key, which is the x402 thesis) but it means a developer with a typo'd key sees "payment required" instead of "bad key" — a confusing first-run experience and a support-ticket generator.

Related, same ordering: a malformed ns/track never reaches its 400, because the 402 gate fires first. MOQ_JOIN_BAD_RESOURCE is only observable by an already-authorized caller. The spec documents this; worth confirming it is intended.

Done when

The three existing 402s reference the correct schema, a generated client round-trips a real 402 body without error, and the 401-vs-402 ordering is either changed or explicitly documented as intended.

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageOn the board but missing Type/Area/Priority

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions