update-contract
dci update-contract <customerID> <contractID> [body]
Creates a new version of the contract. The contract type is immutable and cannot be changed by an update.
customerID— Identifier of the resource.contractID— Identifier of the resource.
Pass the request body as name: value arguments or pipe JSON on stdin — see Command structure.
update-contract alters a financial contract, so the CLI classifies it as destructive: it
refuses to run without --yes (or an interactive confirmation) and exits with code 30
otherwise. Each call creates a whole new version, so name, renewalPolicy, and
startDate are required every time; the contract type cannot change.
Examples
# Preview the new version locally without sending it.
dci update-contract <customer-id> <contract-id> --dry-run < contract.json
# Create the new version, confirmed for scripts.
dci update-contract <customer-id> <contract-id> --yes < contract.json
# contract.json
{"name": "Acme AWS resale FY27", "renewalPolicy": "fixed",
"startDate": "2026-10-01T00:00:00Z", "endDate": "2027-09-30T00:00:00Z",
"invoicesEmail": "[email protected]", "contractUpdatesEmail": "[email protected]"}
# A small inline change; the response's `version` is the new version number.
dci update-contract <customer-id> <contract-id> name: "Acme AWS resale FY27 (amended)", renewalPolicy: fixed, startDate: "2026-10-01T00:00:00Z" --yes --output json
Request
Content-Type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
startDate | string (date-time) | yes | |
endDate | string (date-time) | ||
renewalPolicy | string | yes | One of: "auto", "manual", "fixed". |
doitInvoicingEnabled | boolean | Whether DoiT generates invoices for this contract. Disabling suppresses invoice generation from that point forward while billing calculations and pipeline outputs continue. Omitting the field leaves invoicing enabled. Default: true. | |
invoicesEmail | string (email) | Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise. | |
contractUpdatesEmail | string (email) | Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise. | |
billingProfile | object | The billing profile (name, country, state, city, address, zip). Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise. | |
managementAccounts | array of string | ||
billingRules | array of object | ||
priceBooks | array of object | ||
customLineItems | array of object |
Raw JSON schema
{
"type": "object",
"description": "Contract create/update payload. Full field-level validation is applied server-side.",
"required": [
"name",
"startDate",
"renewalPolicy"
],
"properties": {
"name": {
"type": "string"
},
"startDate": {
"type": "string",
"format": "date-time"
},
"endDate": {
"type": "string",
"format": "date-time",
"nullable": true
},
"renewalPolicy": {
"type": "string",
"enum": [
"auto",
"manual",
"fixed"
]
},
"doitInvoicingEnabled": {
"type": "boolean",
"default": true,
"description": "Whether DoiT generates invoices for this contract. Disabling suppresses invoice generation from that point forward while billing calculations and pipeline outputs continue. Omitting the field leaves invoicing enabled."
},
"invoicesEmail": {
"type": "string",
"format": "email",
"description": "Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise."
},
"contractUpdatesEmail": {
"type": "string",
"format": "email",
"description": "Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise."
},
"billingProfile": {
"type": "object",
"description": "The billing profile (name, country, state, city, address, zip). Required for an end-customer contract with doitInvoicingEnabled set to true; optional otherwise."
},
"managementAccounts": {
"type": "array",
"items": {
"type": "string"
}
},
"billingRules": {
"type": "array",
"items": {
"type": "object"
}
},
"priceBooks": {
"type": "array",
"items": {
"type": "object"
}
},
"customLineItems": {
"type": "array",
"items": {
"type": "object"
}
}
}
}
Output
OK - New contract version created.
By default dci renders the result as a table. Use --output json to get the full structure described below — see Output formats.
| Field | Type | Description |
|---|---|---|
contractId | string | |
version | integer | |
status | string | |
message | string | |
timestamp | string (date-time) |
Raw JSON schema
{
"type": "object",
"description": "The result of creating a contract or contract version.",
"properties": {
"contractId": {
"type": "string"
},
"version": {
"type": "integer"
},
"status": {
"type": "string"
},
"message": {
"type": "string"
},
"timestamp": {
"type": "string",
"format": "date-time"
}
}
}
Errors
On failure, dci prints a single error message — with a hint when one is available — and exits with a typed code your scripts can branch on. See Errors and exit codes for the full contract.
HTTP status to exit code mapping
| HTTP status | Exit code | Error code | Meaning |
|---|---|---|---|
| 400 | 30 | VALIDATION_ERROR | The arguments or request body were rejected. Review the command's flags and payload. |
| 401 | 10 | AUTHENTICATION_FAILED | Not signed in, or the API token is invalid. Run dci login or check DCI_API_KEY. |
| 403 | 11 | PERMISSION_DENIED | The DoiT user or the active customer context does not have access. |
| 404 | 20 | RESOURCE_NOT_FOUND | The requested resource does not exist. Check the identifier argument. |
Related
- get-contract — Retrieve a contract
- list-contracts — List contracts
- create-contract — Create contract
- activate-contract — Activate contract
- cancel-contract — Cancel contract
- API reference: POST /customers/{customerID}/contracts/{contractID}
Aliases: updatecontract