Update ATM Template
Change a template. config merges: send only the entries you want to change, and null removes one. Config values use the webhook syntax described in Tradovate ATM.
Elite
The Management API requires an Elite subscription. See Authentication.
Endpoint
PATCH https://app.crosstrade.io/v1/api/manage/tradovate/atm-templates/{id}
Headers
| Name | Required | Value |
|---|---|---|
| Authorization | Yes | Bearer <your API token> |
| Content-Type | Yes | application/json |
| If-Match | No | ETag from a previous read. The request fails with 412 if the template changed since then |
Path parameters
| Name | Type | Description |
|---|---|---|
id | string | The resource id |
Body parameters
Send any writable field from ATM template fields. config merges field by field; set a config field to null to remove it. The whole configuration is checked after your change is applied.
You can send back the whole object from a GET: id and created are ignored when they equal the saved values, updated is always ignored, and if nothing differs the response says changed: false.
Code examples
- Python
- cURL
import requests
resp = requests.patch(
"https://app.crosstrade.io/v1/api/manage/tradovate/atm-templates/tvatm_Qw12er34Ty56ui78",
headers={"Authorization": "Bearer YOUR_TOKEN"},
json={'config': {'targets': '24,48'}},
)
print(resp.status_code, resp.json())
curl -X PATCH "https://app.crosstrade.io/v1/api/manage/tradovate/atm-templates/tvatm_Qw12er34Ty56ui78" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"config": {"targets": "24,48"}}'
Responses
- 200
- Other errors
{
"success": true,
"changed": true,
"data": {
"id": "tvatm_Qw12er34Ty56ui78",
"name": "Scalp",
"description": "Two targets, trail the runner",
"active": true,
"config": {
"targets": "24,48",
"stops": "16,16",
"quantities": "1,1",
"trail": "false,true",
"trailTrigger": null,
"trailOffset": null,
"breakeven": null,
"breakevenOffset": null
},
"created": "2026-09-01T13:02:11Z",
"updated": "2026-10-02T14:31:07Z"
},
"changedFields": [
"config.targets"
],
"delivery": {
"status": "immediate",
"target": "signal_gate"
},
"warnings": [],
"meta": {
"requestId": "req_9f2c1a0b7d3e4f51",
"etag": "\"c2:Tm90UmVhbEV0YWcwMg\""
}
}
| Status | error | When |
|---|---|---|
| 400 | invalid_json | The body is not valid JSON |
| 400 | invalid_path | The id in the path is not valid |
| 401 | unauthorized | Missing or invalid token |
| 403 | elite_required, not_available | See Authentication |
| 404 | not_found | No such template on your login |
| 409 | concurrent_modification | Another change to your templates is in progress |
| 409 | template_name_conflict | Another template has this name |
| 412 | precondition_failed | If-Match did not match |
| 413 | body_too_large | The body is larger than 64 KB |
| 415 | unsupported_content_type | The body is not application/json |
| 422 | field_read_only | A read-only field was sent with a value different from the saved one |
| 422 | invalid_atm_config | The configuration is not valid. detail names the problem and fields lists the config.* fields involved |
| 422 | validation_failed | A field is invalid |
| 429 | rate_limited, too_many_concurrent_requests | See Rate limits |
| 503 | management_read_only, management_busy, storage_unavailable, outcome_unknown | See Errors |
When it takes effect
The next webhook signal that names the template.