/transactions/{id}
Update a transaction by ID. The current and requested transaction types require their matching type-specific write scopes. Changing payment also requires transactions:mark-paid. Locks apply per line: lines whose journal entries are attached to an owner statement or fall into a books-closed month are locked while the remaining lines stay editable. Deposit updates containing only lines_update preserve unrelated line postings. Changing line account, assignment, listing, or reservation context can recompute a default or forced party. A bank-record match alone still permits deposit and expense description, line account, party, listing, reservation, and expense-markup changes. Amount, date, root bank account, line creation, and line deletion require unmatching first. Books-closed and statement locks still take precedence. After the first Ramp payment attempt, ordinary expense and payout mutations accept only description updates. A terminal expense payment may reset to unpaid. A status-only archive or unarchive additionally requires durable Ramp bill archive or verified no-bill recovery evidence. Transactions linked by a payment return allow only description and bank-record reconciliation changes. See https://docs.vrplatform.app/guides/build/transactions#decision-table. For expense attachments, pass attachmentIds to replace the attached set. Omit attachmentIds to keep current attachments. Attachments are only supported for expense transactions. A uniqueRef already used by another team transaction returns a structured user error.
Required scope: transactions:read
Authorization
apiKey API key provided in dashboard
In: header
Path Parameters
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$uuidQuery Parameters
Validate this request through the real write path, then roll back all changes. See https://docs.vrplatform.app/api/dry-run-mode.
Request Body
application/json
Root bank account; the source account for transfers
Transaction contact; required for non-opening-balance expenses
Public transaction type. Transfers are internal bank-to-bank movements; payouts represent owner or manager distributions.
"deposit" | "expense" | "transfer" | "payout"Expense attachment IDs returned as attachmentId by POST /transactions/attachments after PUT to uploadUrl succeeds. Only expense transactions support attachments. Omit to leave existing attachments unchanged on update; send an array to replace the attached set.
Expense payment and reconciliation state
Integration connection belonging to the selected team
Lines to be added (can not be combined with "lines" in the same request)
Lines to be updated (can not be combined with "lines" in the same request)
Lines to be deleted (can not be combined with "lines" in the same request)
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://api.vrplatform.app/transactions/497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Content-Type: application/json" \ -d '{}'{
"description": "string",
"status": "active",
"uniqueRef": "string",
"isOpeningBalance": true,
"type": "deposit",
"date": "string",
"lines": [
{
"uniqueRef": "string",
"description": "string",
"assignment": "accountsPayable",
"amount": -9007199254740991,
"ownerStatementId": "eccddabd-554b-48ab-a66d-28a57ff66fa9",
"matchReservationConfirmationCode": "string",
"matchReservationStripeGuestRef": "string",
"matchReservationProcessorBookingRef": "string",
"matchLineTypeClassification": "string",
"id": "string",
"issues": [
{
"code": "unassignedAccount",
"severity": "error",
"context": {
"lineType": "string"
}
}
],
"recurringTemplate": {
"id": "string"
},
"total": 0,
"listing": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"uniqueRef": "string",
"shortRef": "string"
},
"reservation": {
"id": "string",
"shortRef": "string",
"confirmationCode": "string",
"uniqueRef": "string",
"status": "booked",
"checkIn": "string",
"checkOut": "string"
},
"account": {
"id": "string",
"name": "string",
"uniqueRef": "string",
"status": "active"
},
"party": "owners",
"contact": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"firstName": "string",
"uniqueRef": "string",
"shortRef": "string",
"email": "user@example.com",
"type": "owner"
},
"matchStatus": "string",
"appliedAmount": {
"taxRate": {
"id": "string",
"name": "string",
"basisPoints": 100000
}
},
"markup": {
"amount": -9007199254740991,
"taxBehavior": "excluded",
"taxRate": {
"id": "string",
"name": "string",
"basisPoints": 100000
}
},
"lock": {
"status": "locked",
"booksClosed": {
"date": "string"
},
"ownerStatement": {
"ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"reconciled": {
"bankRecordIds": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"statementPeriod": {
"hits": [
{
"listingId": "8c73d933-f7ed-437e-9da1-caac95adc1ae",
"txnAt": "string",
"openFrom": "string"
}
]
}
}
}
],
"attachmentIds": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"recurringTemplateId": "d73afa31-bf14-4baf-aede-be5f4b4ff489",
"recreatedFromTransactionId": "000264af-6c3a-4ff1-8534-ade50aa8d7fb",
"matchBankAccountLast4": "string",
"id": "string",
"shortRef": "string",
"lock": {
"status": "locked",
"booksClosed": {
"date": "string"
},
"ownerStatement": {
"ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"reconciled": {
"bankRecordIds": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"statementPeriod": {
"hits": [
{
"listingId": "8c73d933-f7ed-437e-9da1-caac95adc1ae",
"txnAt": "string",
"openFrom": "string"
}
]
}
},
"issues": [
{
"code": "line_unassignedAccount",
"severity": "error",
"context": {}
}
],
"currency": "string",
"amount": -9007199254740991,
"recurringTemplate": {
"id": "string"
},
"attachments": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"transactionId": "75906707-8c31-479c-b354-aa805c4cefbc",
"createdAt": "2024-01-15T12:30:00.000+00:00",
"filename": "string",
"extension": "string",
"contentType": "string",
"byteSize": -9007199254740991,
"isOwnerAccessible": true
}
],
"account": {
"id": "string",
"name": "string",
"uniqueRef": "string",
"status": "active"
},
"payment": {
"bankRecordIds": [
"string"
],
"status": "unpaid",
"lock": {
"status": "locked",
"booksClosed": {
"date": "string"
},
"ownerStatement": {
"ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"reconciled": {
"bankRecordIds": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
},
"statementPeriod": {
"hits": [
{
"listingId": "8c73d933-f7ed-437e-9da1-caac95adc1ae",
"txnAt": "string",
"openFrom": "string"
}
]
}
},
"date": "string"
},
"connection": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"status": "active",
"uniqueRef": "string",
"appId": "string"
},
"contact": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"firstName": "string",
"uniqueRef": "string",
"shortRef": "string",
"email": "user@example.com",
"type": "owner"
},
"source": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"type": "string",
"status": "active",
"appId": "string",
"appIcon": "string"
},
"matchStatus": "string",
"matchedByBankRule": true,
"returnedFromTransactionId": "edd2bee8-c5f7-4ff5-ae8f-fd9c96d50204",
"returnEffectiveAt": "2024-01-15T12:30:00.000+00:00",
"returnSummary": {
"status": "none",
"returnedAmount": -9007199254740991,
"remainingReturnableAmount": -9007199254740991,
"compensationTransactionIds": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"replacementTransactionId": "a44b4466-2c16-4884-a7c2-efd209c901e2"
}
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "MISDIRECTED_REQUEST",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": {
"teamId": "a4ede8ba-7c0a-4485-8763-cbd9b282fbec",
"dataRegion": "ap",
"apiBaseUrl": "http://example.com"
}
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "LOCKED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}{
"code": "AUDIT_CURSOR_EXPIRED",
"message": "string",
"links": {
"docs": "string",
"schema": "string"
},
"issues": [
{
"message": "string",
"path": [
"string"
],
"schema": "string"
}
],
"retryable": true,
"context": null
}