# Test mode

URL: https://submitator.com/docs/api/test-mode

> With a sbm_test_ key every call works as in live mode, on separate data, and nothing is submitted or spent.

With a `sbm_test_` key every call works as in live mode, on separate data, and nothing is submitted or spent. Share links are the one exception: a client page needs a live project, so creating one answers 422 `validation_failed` and reading or turning one off answers 404. Listings move on their own: `in_progress` after 1 to 5 minutes, `submitted` after 3 to 8 minutes and an outcome after 6 to 15 minutes, where 80% go `live`, 12% end `not_accepted` and 8% stay `submitted`. The outcome depends only on the listing's id, so a listing always ends the same way.

Apart from webhook deliveries, nothing leaves our servers in test mode. Image URLs are not downloaded and files are checked but not stored, feed URLs have the right shape but return 404, and autofill and Domain Ratings are simulated. Hosts on `.test` and `.example` are accepted here and rejected in live mode.

Logins are placeholders: about 45% of test listings get one, on the project's contact email or on an address at `login.test`, with a password made from the project's id and sample emails whose links point to `login.test`. Nothing signs up anywhere.

Two inputs fail on purpose: a host that starts with `nobadge.` never passes badge verification, and an image URL ending in `/fail.png` returns `image_unreachable`. Test data is deleted after 30 days without activity.

## Move a test listing forward

`POST https://api.submitator.com/v1/test_helpers/listings/{listing_id}/advance`

Moves a test listing to its next status now, or to the status you name in `to`. Events and webhooks fire as they would in live mode. Live keys get 403 `test_mode_only`.

| Parameter | In | Required | What it is |
| --- | --- | --- | --- |
| `listing_id` | path | Yes | The listing's id. |

| Body field | Type | Required | What it is |
| --- | --- | --- | --- |
| `to` | string | No | The status to move to. It must be a move the listing could make in live mode. |

Request:

```json
{
  "to": "live"
}
```

Response 200:

```json
{
  "object": "listing",
  "id": "lst_5Wq9Lm2Xr7Kt3Vb8Nz1HcD",
  "livemode": false,
  "project": "prj_4QzX1m9Lr2Vb7Nc8Tk3HwP",
  "directory": {
    "id": "dir_6Pw3Kx9Ty2Rq7Lm1Zb5VcN",
    "name": "SaaSHub",
    "domain_rating": 61,
    "logo_url": "https://feed.example.net/a/h4Sw8Lp.q2Xn"
  },
  "status": "live",
  "reason": null,
  "action": null,
  "live_url": "https://www.saashub.com/ledgerly",
  "proof_url": "https://feed.example.net/a/Ps6Wn2Kx.h8Lq4",
  "created_at": "2026-10-03T14:00:00Z",
  "submitted_at": "2026-10-05T11:00:00Z",
  "live_at": "2026-10-08T15:00:00Z"
}
```

Typical errors: [`test_mode_only`](https://submitator.com/docs/errors#test_mode_only), [`validation_failed`](https://submitator.com/docs/errors#validation_failed), [`not_found`](https://submitator.com/docs/errors#not_found).

## Set your test launches

`POST https://api.submitator.com/v1/test_helpers/account/launches`

Sets how many test launches are available, from 0 to 1,000. Set 0 to try the `no_launches_left` path. Live keys get 403 `test_mode_only`.

| Body field | Type | Required | What it is |
| --- | --- | --- | --- |
| `available` | integer | Yes | Test launches to make available, 0 to 1,000. |

Request:

```json
{
  "available": 0
}
```

Response 200:

```json
{
  "object": "account",
  "livemode": false,
  "name": "Northlight Studio",
  "state": "active",
  "launches": {
    "available": 0,
    "used": 3,
    "total": 3
  },
  "capacity": {
    "in_flight": 25,
    "limit": 100
  },
  "rate_limit": {
    "limit": 3600,
    "remaining": 3488,
    "resets_at": "2026-10-08T16:00:00Z"
  }
}
```

Typical errors: [`test_mode_only`](https://submitator.com/docs/errors#test_mode_only), [`validation_failed`](https://submitator.com/docs/errors#validation_failed).
