Skip to content

Advance a test clock

The test_clocks.advance operation: POST /api/v1/test_clocks/{id}/advance in the REST API and the test_clocks_advance tool in the MCP server.

POST/api/v1/test_clocks/{id}/advance

Moves a test clock forward to frozenTime. The clock's status becomes advancing at once; in the background, every step due on its customers' subscriptions up to that time runs in time order, each at its own time: trial notices and trial ends, invoice.upcoming, renewal drafts an hour before each period end, renewals (invoices finalized, charged or sent), scheduled changes and price migrations, cancellations at the period end, pause resumptions, the 23-hour expiry of unpaid subscriptions, and collection: dunning retries and their final action, send_invoice reminders and overdue, and card-expiry reminders. Then the clock is ready at the new time (test_clock.ready).

Read the clock with test_clocks.get until it is ready. Off-session charges complete through the processor afterwards, as they do in real time, and their outcome is recorded at the clock's time. If a step fails, the clock stops at the last step that ran with status: internal_failure and advance.error; fix the cause and advance again.

An advance moves the clock at most 732 days; advance several times to go further. Emits test_clock.advancing.

At a glance

  • REST: POST /api/v1/test_clocks/{id}/advance
  • MCP tool: test_clocks_advance
  • Operation ID: test_clocks.advance
  • Scope: Brand
  • Permission: subscriptions:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test mode only
  • Authentication: API key with the subscriptions:write scope
  • Since: M5

Request

Path parameters

FieldTypeDescription
idclk_… ID

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
frozenTimedate-timeYesThe time to move the clock to: after its current time, at most 732 days ahead.

Response

202 Accepted with a JSON object:

FieldTypeDescription
idclk_… ID
object"test_clock"
livemodefalse
brandIdbrd_… ID
namestring
frozenTimedate-timeThe clock's time: its customers' subscriptions bill as if it were now.
statusone of ready, advancing, internal_failureready, advancing (an advance runs: wait for ready) or internal_failure (the last advance stopped on an error, see advance.error; advance again).
advanceobject or nullThe latest advance.
versioninteger
createdAtdate-time
updatedAtdate-time

Examples

Advance a month

HTTP
POST /api/v1/test_clocks/clk_01jacq4m3xf0v8w9zq2y7k5n6h/advance
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "frozenTime": "2026-11-21T09:00:00.000Z"
}

Response (202):

JSON
{
  "id": "clk_01jacq4m3xf0v8w9zq2y7k5n6h",
  "object": "test_clock",
  "livemode": false,
  "brandId": "brd_01jacq4m3xf0v8w9zq2y7k5n6b",
  "name": "Monthly renewal",
  "frozenTime": "2026-10-20T09:00:00.000Z",
  "status": "advancing",
  "advance": {
    "from": "2026-10-20T09:00:00.000Z",
    "to": "2026-11-21T09:00:00.000Z",
    "requestedAt": "2026-10-20T09:00:00.000Z",
    "completedAt": null,
    "steps": 0,
    "error": null
  },
  "version": 2,
  "createdAt": "2026-10-20T09:00:00.000Z",
  "updatedAt": "2026-10-20T09:00:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400frozenTime isn't a valid instant.Fix the fields listed in details.issues and send the request again.
test_clock_advance_invalid400The time isn't after the clock's time, or is more than 732 days ahead (details.reason).Advance to a time after the clock's frozenTime, at most two years ahead per advance (advance several times to go further).
test_clock_advancing409The clock is advancing: wait until its status is ready.Wait until the clock's status is ready (read it with test_clocks.get), then try again. An advance processes every due renewal, trial end and cancellation of the clock's subscriptions first.
resource_not_found404No test clock with this ID exists for the brand in test mode.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
mode_not_supported400The request is in live mode: test clocks exist in test mode only.Use the mode the operation supports (details.supported_mode): test-only operations such as test clocks need test-mode credentials.
permission_denied403The credentials can't manage this brand's subscriptions (subscriptions:write).Ask an organization owner or admin for a role or scope that allows this action.
version_conflict409The clock changed at the same time; read it and retry.Fetch the object again and retry the change.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, scope_required, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.