Trading Halt Windows
A trading halt window halts trading for a firm at a set time and resumes it at a later time. Windows can run once or repeat on a schedule, and can optionally liquidate the firm when the halt starts.
| Method | Path | Description |
| GET | /admin/v1/firms/{firmID}/trading-halt-windows | List the firm's halt windows. |
| GET | /admin/v1/firms/{firmID}/trading-halt-windows/{windowID} | Get one halt window. |
| POST | /admin/v1/firms/{firmID}/trading-halt-windows | Create a halt window. |
| PUT | /admin/v1/firms/{firmID}/trading-halt-windows/{windowID} | Update a halt window (including enable/disable). |
| DELETE | /admin/v1/firms/{firmID}/trading-halt-windows/{windowID} | Delete a halt window. |
| GET | /admin/v1/firms/{firmID}/trading-halt-windows/{windowID}/executions | List the halt and open actions taken for a window. |
Halt Window Fields
| Field | Description |
| description | Optional. Free text, up to 500 characters. |
| enabled | Optional. Defaults to true. A disabled window keeps its settings but does not run. |
| haltTime | Required. Local time the halt starts, e.g. 2026-10-05T15:55:00. No offset or Z. |
| openTime | Required. Local time trading resumes. Must be later than haltTime. |
| liquidateOnHalt | Optional. Defaults to false. When true, all working orders are cancelled and all positions flattened when the halt starts. |
| repeat | Optional. Days to repeat on, as the three cron day fields: day-of-month month day-of-week. Omit for a one-time window. |
| timeZone | Required. IANA time zone that haltTime, openTime and repeat are evaluated in, e.g. America/Chicago. |
| notificationUrl | Optional. Your HTTPS webhook, called after each halt and open runs. See Notifications. |
One-Time vs Repeating
- One-time (no
repeat):haltTimemust be in the future. - Repeating: only the time of day of
haltTimeandopenTimeis used; the date is the first occurrence. The halt and open must fall on the same calendar day (a repeating window cannot cross midnight).
Common repeat values:
| repeat | Runs |
* * * | Every day |
* * 1-5 | Monday to Friday |
* * 0,6 | Saturday and Sunday |
1 * * | The 1st of every month |
Create a Halt Window
POST https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows
{
"description": "Daily close flatten",
"enabled": true,
"haltTime": "2026-10-12T15:55:00",
"openTime": "2026-10-12T17:00:00",
"liquidateOnHalt": true,
"repeat": "* * 1-5",
"timeZone": "America/Chicago",
"notificationUrl": "https://hooks.example.com/t4/trading-halt"
}
Returns 201 Created with the new window:
{
"data": {
"tradingHaltTimeWindowId": "3f2b8c1e-6a4d-4e2f-9b7a-1c5d8e0f2a31",
"firmId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"description": "Daily close flatten",
"enabled": true,
"haltTime": "2026-10-12T15:55:00",
"openTime": "2026-10-12T17:00:00",
"liquidateOnHalt": true,
"repeat": "* * 1-5",
"timeZone": "America/Chicago",
"notificationUrl": "https://hooks.example.com/t4/trading-halt",
"nextExecutionTime": "2026-10-12T15:55:00-05:00"
},
"metadata": { "timestamp": "2026-10-09T14:00:00Z", "requestId": "..." }
}
nextExecutionTime is the next scheduled halt or open, in the window's time zone. During an active halt it is the pending open. It is omitted when the window is disabled or a one-time window has already run.
List and Get Halt Windows
GET https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows
GET https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows/{windowID}
The list returns an array of windows in data; get returns a single window. Both use the same format as the create response.
Update a Halt Window
PUT https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows/{windowID}
The body is the same as create and replaces the whole window, so send every field. Returns 200 OK with the updated window.
To pause a window, PUT it with “enabled”: false. To resume, PUT it with “enabled”: true.
Note:
Omitting enabled on a PUT enables the window, and omitting liquidateOnHalt turns liquidation off. Always send both to avoid confusion.
Delete a Halt Window
DELETE https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows/{windowID}
Returns 204 No Content. Any future halt and open actions are cancelled.
List Executions
Returns the halt and open actions taken for a window, newest first.
GET https://api.t4login.com/admin/v1/firms/{firmID}/trading-halt-windows/{windowID}/executions?sinceDate=2026-10-01&pageSize=100&pageNumber=1
| Parameter | Description |
| sinceDate | Optional. Only return actions scheduled on or after this date/time (UTC). |
| pageSize | Optional. 1 to 1000. Defaults to 100. |
| pageNumber | Optional. Starts at 1. Defaults to 1. |
{
"data": {
"items": [
{
"tradingHaltTimeWindowId": "3f2b8c1e-6a4d-4e2f-9b7a-1c5d8e0f2a31",
"description": "Daily close flatten",
"action": "Open",
"scheduledTimeUtc": "2026-10-08T22:00:00Z",
"completedTimeUtc": "2026-10-08T22:00:01Z",
"status": "Completed"
},
{
"tradingHaltTimeWindowId": "3f2b8c1e-6a4d-4e2f-9b7a-1c5d8e0f2a31",
"description": "Daily close flatten",
"action": "Halt",
"scheduledTimeUtc": "2026-10-08T20:55:00Z",
"completedTimeUtc": "2026-10-08T20:55:02Z",
"status": "Completed"
}
],
"totalCount": 2,
"pageSize": 100,
"pageNumber": 1,
"totalPages": 1
},
"metadata": { "timestamp": "2026-10-09T14:00:00Z", "requestId": "..." }
}
| Field | Description |
| action | Halt or Open. |
| scheduledTimeUtc | When the action was scheduled to run (UTC). |
| completedTimeUtc | When the action finished (UTC). Omitted while still executing. |
| status | Completed, Failed, Skipped (missed and too late to run), or Executing. |
| message | Error or skip reason, when there is one. |
Notifications
When notificationUrl is set, T4 sends a POST with a JSON body to it after every halt and open, whether it succeeded or not. Respond with any 2xx status. Non-2xx responses and timeouts (10 seconds) are retried up to 4 more times with increasing delays.
jobId is the tradingHaltTimeWindowId of the window that ran. taskName is Halt <firm> or Open <firm>.
Success:
{
"taskId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"jobId": "3f2b8c1e-6a4d-4e2f-9b7a-1c5d8e0f2a31",
"taskName": "Halt Acme Trading",
"executionId": "0b5d3a2e-91f4-4c8a-b6e7-2d4f8a1c9e30",
"status": "Completed",
"scheduledTimeUtc": "2026-10-12T20:55:00Z",
"startedUtc": "2026-10-12T20:55:00.120Z",
"completedUtc": "2026-10-12T20:55:01.480Z",
"durationMs": 1360,
"attempts": 1,
"httpStatus": 200
}
Failure:
{
"taskId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"jobId": "3f2b8c1e-6a4d-4e2f-9b7a-1c5d8e0f2a31",
"taskName": "Halt Acme Trading",
"executionId": "5f1c8e7a-2b3d-4e6f-9a0b-c4d5e6f7a8b9",
"status": "Failed",
"scheduledTimeUtc": "2026-10-13T20:55:00Z",
"startedUtc": "2026-10-13T20:55:00.095Z",
"completedUtc": "2026-10-13T20:55:42.310Z",
"durationMs": 42215,
"attempts": 4,
"httpStatus": 503,
"error": "Service Unavailable"
}
| Field | Description |
| jobId | The tradingHaltTimeWindowId of the window that ran. |
| status | Completed, Failed, or Skipped (missed and too late to run). |
| attempts | Number of times T4 tried the halt or open. |
| httpStatus | Status of the last attempt to change the firm's trading state. Omitted if no response was received. |
| error | Why the last attempt failed. |
| reason | Why the action was skipped, e.g. GraceExpired. |
Errors
Validation and other errors return the matching HTTP status with an errors array. Each error has a message and the target field it applies to:
{
"errors": [
{ "message": "OpenTime must be later than HaltTime.", "target": "openTime" }
],
"metadata": { "timestamp": "2026-10-09T14:00:00Z", "requestId": "..." }
}
| Status | Meaning |
| 400 | Invalid ID or request body. |
| 401 | Not authenticated or not an admin. |
| 404 | Firm or window not found. |
| 503 | The scheduler is temporarily unavailable. Retry later. |