---
title: "Admin Qa Publisher E2E"
method: POST
path: "/v1/admin/qa/publisher-e2e"
---

# Admin Qa Publisher E2E

`POST /v1/admin/qa/publisher-e2e`

## Request

- Base URL: `https://api.storyflo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.storyflo.com/v1/admin/qa/publisher-e2e`
- Auth: none declared

Fire the publisher end-to-end QA suite synchronously.

Returns the structured report (~30-60s wall-clock for a real run).
Also writes the report to ``AdminAuditLog`` so the operator can
diff QA runs over time without re-firing the suite.

See ``app/qa/publisher_e2e.py`` for the canonical pipeline. Env
vars consumed:

  * ``STORYFLO_QA_BASE_URL`` — target API base; default
    ``http://localhost:8000``. Set this on Fly to the public URL
    so the suite exercises the real edge surface (CORS preflight,
    TLS, etc.).
  * ``QA_TEST_WALLET_ADDRESS`` — base-sepolia receive address
    recorded against the test publisher's payout_wallet_address.
  * ``X402_TEST_PAYMENT_HEADER`` — pre-signed testnet payment
    header for the tip stage. When unset, the tip stage skips
    with an explicit reason instead of failing.

## Headers

- `x-storyflo-email-token` string, nullable

## Request body

- QAPublisherE2ERequest: Body for ``POST /v1/admin/qa/publisher-e2e``. Both fields default to the operator's most-common case: a real end-to-end run with cleanup so the database stays tidy. Pass ``cleanup=False`` to inspect the synthetic publisher row after the suite — handy when a stage failed and you want to poke at the persisted state in the admin UI.
  - `use_testnet` boolean
  - `cleanup` boolean

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/storyflo/apis/storyflo-inference-router.md) · [All operations](https://skmtc.dev/storyflo/apis/storyflo-inference-router/llms.txt) · [OpenAPI document](https://skmtc.dev/storyflo/apis/storyflo-inference-router/revisions/c3a1a735ac7a?raw)
