> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Submit certification test setup

> Ask Interchange to review a separate no-spend inventory source for a provider certification test

`POST /api/v2/provider/registration/capabilities/{capabilityUid}/certification-fixture-setups`

Use this request to nominate a separate, non-production inventory Source for
review before a protected certification test can use it. Submitting a request
does not create a fixture, run a test, dispatch an evaluation, or certify an
Agent.

## Who can submit

Sign in to Interchange as a direct human Account Admin for the seller that owns
the capability, then make the request with that browser session. API keys,
service principals, simulated sessions, delegated support, and indirect account
access cannot submit it.

## Request

```bash theme={null}
curl -X POST "https://api.apostra.com/api/v2/provider/registration/capabilities/<capabilityUid>/certification-fixture-setups" \
  -H "Authorization: Bearer <direct Account Admin session token>" \
  -H "Content-Type: application/json" \
  -d '{
    "revisionUid": "<current revision UUID>",
    "endpointUid": "<attested endpoint UUID>",
    "inventorySourceId": "<separate Source ID>",
    "sourceAccountId": "<active account ID on that Source>",
    "isolationEvidence": {
      "reference": "review://provider/sandbox",
      "digest": "sha256:<64 lowercase hex characters>",
      "expiresAt": "2026-09-30T12:00:00.000Z"
    },
    "spec": {
      "isolation": {
        "kind": "DEDICATED_SANDBOX_ACCOUNT",
        "enforced": true,
        "customerAccountResolutionImpossible": true,
        "customerInventoryIsolated": true,
        "billingDisabled": true,
        "deliveryDisabled": true,
        "reportingIsolated": true
      },
      "nonDeliverableMode": "PAUSED",
      "cleanupTtlSeconds": 300,
      "products": [
        {
          "productId": "sandbox-product",
          "packageId": "sandbox-package",
          "routes": [
            {
              "kind": "CANONICAL",
              "formatKind": "image",
              "formatOptionId": "300x250",
              "params": {
                "width": 300,
                "height": 250,
                "asset_source": "buyer_uploaded",
                "buyer_asset_acceptance": "accepted"
              }
            }
          ]
        }
      ]
    },
    "idempotencyKey": "certification-setup-2026-09-30"
  }'
```

Use the exact current revision and its attested endpoint. The nominated Source
and its active account must belong to the same seller, be separate from live
customer inventory, and have current evidence that the test cannot deliver,
bill, or report against customer inventory. Never nominate a live customer
Source.

The `spec` must contain at least one supported product route. Its isolation
guarantees must all be `true`; `nonDeliverableMode` is `PAUSED` or
`FUTURE_DATED`; and `cleanupTtlSeconds` is from 60 through 86,400.

## Response and review state

A successful submission returns `200 OK` with the standard response envelope
and a durable receipt in `data`:

```json theme={null}
{
  "data": {
    "setupRequestUid": "<uuid>",
    "state": "PENDING_REVIEW",
    "isolationEvidenceExpiresAt": "2026-09-30T12:00:00.000Z",
    "createdAt": "2026-09-26T09:00:00.000Z",
    "replayed": false
  },
  "error": null
}
```

`PENDING_REVIEW` means Interchange must review the evidence and the nominated
Source. It does not mean a test has started. If review approves the request,
Interchange registers and parks that exact separate Source for protected test
preparation. Approval still does not launch validation or grant certification.
If the revision, evidence, account, or Source is no longer current or safe,
the request is rejected and you must correct the underlying setup before
submitting a new truthful request.

## Idempotency

Choose one 8 to 128 character `idempotencyKey` for one request body. Repeating
the same request with that key returns the original receipt with
`replayed: true`; it does not create another review request. Reusing the key
with different request details returns a conflict instead of changing the
original request.

## Errors

* `400 VALIDATION_ERROR` - malformed IDs, an invalid fixture specification, or
  expired isolation evidence.
* `403 ACCESS_DENIED` - the caller is not a current direct human Account Admin
  for the capability owner.
* `404 NOT_FOUND` - the capability, current revision, endpoint, Source, or
  source account is not available for this seller.
* `409 CONFLICT` - the nominated setup is stale, unsafe, already incompatible,
  or the idempotency key was used with different details.
* `503 SERVICE_UNAVAILABLE` - the guarded setup write is busy. Read the
  current state before retrying.

## Related

<CardGroup cols={2}>
  <Card title="Inventory sources overview" href="/v2/storefront/inventory-sources/overview" icon="plug">
    Source lifecycle and certification setup context
  </Card>

  <Card title="Inventory source tasks" href="/v2/storefront/inventory-sources/tasks" icon="list-check">
    All inventory-source operations
  </Card>
</CardGroup>
