Transaction Jobs
Transaction Jobs run transaction exports asynchronously so your integration is not blocked by long-running queries. Instead of waiting for a synchronous response that might time out on a large portfolio, you submit a job, poll for completion, and download the results when ready. Results remain available for 24 hours after job creation.
Transaction Jobs support two modes: view jobs export a saved transaction view as CSV, TSV, or XLSX; query jobs execute an ad-hoc transaction query and return JSON. Both modes accept the same portfolio scoping parameters (entity, group, or firm-wide) and date range filters.
When to use Transaction Jobs
Use Transaction Jobs instead of the synchronous Transactions or Transactions Query endpoints when:
- The portfolio contains thousands of transactions and a synchronous request risks timing out
- You need file-format output (CSV, TSV, XLSX) for downstream systems
- Your integration processes transaction data on a schedule and can tolerate async delivery
- You want to avoid consuming rate limit budget during the processing phase (polling is lightweight)
For small, targeted transaction retrieval (single entity, narrow date range), the synchronous Transactions Query endpoint is simpler and returns immediately.
Overview
| Base route | /v1/transaction_jobs |
| Produces | JSON (query jobs), CSV/TSV/XLSX (view jobs) |
| Pagination | No |
| Job timeout | 4 hours |
| Result retention | 24 hours after job creation |
| OAuth scopes | TRANSACTIONS |
Access requirements
API Access: Create, edit, and delete.
Portfolio Access: Required to view the transaction data being exported.
OAuth scope:TRANSACTIONS
Resource attributes
Every GET and POST response returns these attributes on the job resource:
| Attribute | Description |
|---|---|
job_type | String -- The kind of export. Values: TRANSACTION_VIEW_RESULTS (view job), TRANSACTION_QUERY (query job). |
started_at | String -- UTC timestamp when processing began. ISO 8601. Example: "2020-04-15T21:30:16Z" |
completed_at | String -- UTC timestamp when processing finished. ISO 8601. Example: "2020-04-15T21:30:17Z" |
percent_complete | Number -- Progress as a decimal. 1.0 = done. Example: 0.21 |
status | String -- Current state. See status reference below. |
errors | Object -- Present when the job failed. Contains status, title, and detail. |
Job statuses
| Status | Meaning |
|---|---|
Queued | Submitted, waiting to be picked up. |
Picked Up By Job Runner | Assigned to a worker, about to start. |
In Progress | Actively processing. |
In Progress - Waiting For Capacity | Returned to queue because workers are full. Will resume automatically. |
Completed | Done. Results available at the download endpoint. |
Timed Out | Exceeded the 4-hour limit, or results expired (24 hours after creation). |
Failed | Server error during processing. |
Rejected | Queue quota exceeded. Retry later. |
Error Cancelled | Cancelled due to an error. Details in the errors field. |
Cancel Requested | Cancellation submitted for an in-progress job. |
User Cancelled | Successfully cancelled by the user. |
Job parameters
| Parameter | Required for | Description |
|---|---|---|
portfolio_type | Both | Scope of the export. Values: ENTITY, GROUP, FIRM. |
portfolio_id | Both | Entity ID, group ID, or 1 (for firm-wide). Query jobs accept an array of IDs. |
start_date | Both | Beginning of the date range. YYYY-MM-DD. |
end_date | Both | End of the date range. YYYY-MM-DD. |
view_id | View jobs | ID of the saved transaction view to export. |
output_type | View jobs | File format: CSV, TSV, or XLSX. |
columns | Query jobs | Attribute keys to include as columns. Example: ["trade_date", "security", "type", "value"] |
filters | Query jobs (optional) | Filter array. See Transactions Query filter object. |
sortings | Query jobs (optional) | Sort by up to 3 columns. Default: trade date descending. Example: [{"attribute": "trade_date", "ascending": false}] |
limit | Query jobs (optional) | Max rows returned. Default: 1,048,576 for XLSX, unlimited for others. |
include_online_valuations | Query jobs (optional) | Include online snapshots. Default: false. |
include_unverified | Query jobs (optional) | Include unverified transactions. Default: false. |
include_deleted | Query jobs (optional) | Include deleted online transactions. Default: false. |
Create a transaction view job
Exports a saved transaction view as a file. The view defines the columns, filters, and sorting; you provide the portfolio scope and date range.
POST /v1/transaction_jobs
curl -X POST "https://{firm}.addepar.com/api/v1/transaction_jobs" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": {
"type": "transaction_jobs",
"attributes": {
"job_type": "transaction_view_results",
"parameters": {
"view_id": 5,
"portfolio_id": 193,
"portfolio_type": "entity",
"output_type": "xlsx",
"start_date": "2024-01-01",
"end_date": "2024-06-30"
}
}
}
}'
{
"data": {
"id": "47d7e547-7f5a-11ef-8162-dde0088e926a",
"type": "transaction_jobs",
"attributes": {
"job_type": "TRANSACTION_VIEW_RESULTS",
"percent_complete": 0.0,
"status": "Queued"
},
"relationships": {
"creator": {
"links": {
"self": "/v1/transaction_jobs/47d7e547-7f5a-11ef-8162-dde0088e926a/relationships/creator",
"related": "/v1/transaction_jobs/47d7e547-7f5a-11ef-8162-dde0088e926a/creator"
},
"data": { "type": "users", "id": "22" }
}
},
"links": {
"self": "/v1/transaction_jobs/47d7e547-7f5a-11ef-8162-dde0088e926a"
}
},
"included": []
}
Create a transaction query job
Runs an ad-hoc query against transaction data. You define columns, filters, and sorting inline rather than referencing a saved view.
POST /v1/transaction_jobs
curl -X POST "https://{firm}.addepar.com/api/v1/transaction_jobs" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": {
"type": "transaction_jobs",
"attributes": {
"job_type": "transaction_query",
"parameters": {
"columns": [
"trade_date",
"direct_owner",
"security",
"type",
"value",
"last_edit_by",
"last_edit_date"
],
"filters": [],
"sorting": [],
"portfolio_type": "entity",
"portfolio_id": [12345],
"start_date": "2024-08-03",
"end_date": "2024-09-03",
"include_online_valuations": false,
"include_unverified": false,
"include_deleted": true
}
}
}
}'
{
"data": {
"id": "204da3ed-7de0-11ef-99fa-25422e3df74b",
"type": "transaction_jobs",
"attributes": {
"job_type": "TRANSACTION_QUERY",
"percent_complete": 0.0,
"status": "Queued"
},
"relationships": {
"creator": {
"links": {
"self": "/v1/transaction_jobs/204da3ed-7de0-11ef-99fa-25422e3df74b/relationships/creator",
"related": "/v1/transaction_jobs/204da3ed-7de0-11ef-99fa-25422e3df74b/creator"
},
"data": { "type": "users", "id": "1000314556" }
}
},
"links": {
"self": "/v1/transaction_jobs/204da3ed-7de0-11ef-99fa-25422e3df74b"
}
},
"included": []
}
Response codes (both job types):
202 Accepted-- Job created and queued400 Bad Request-- Invalid JSON, missing required parameters, or bad format403 Forbidden-- Insufficient permissions or scope
Check job status
GET /v1/transaction_jobs/:id
Returns the current status and progress of a specific job. Poll this endpoint until status is Completed, Failed, or another terminal state.
curl -X GET "https://{firm}.addepar.com/api/v1/transaction_jobs/39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Accept: application/vnd.api+json"
{
"data": {
"id": "39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c",
"type": "transaction_jobs",
"attributes": {
"job_type": "TRANSACTION_QUERY",
"percent_complete": 0.21,
"status": "In Progress"
},
"relationships": {
"creator": {
"links": {
"self": "/v1/transaction_jobs/39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c/relationships/creator",
"related": "/v1/transaction_jobs/39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c/creator"
},
"data": { "type": "users", "id": "22" }
}
},
"links": {
"self": "/v1/transaction_jobs/39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c"
}
},
"included": []
}
Response codes:
200 OK-- Job found403 Forbidden-- Insufficient permissions404 Not Found-- Job does not exist or not accessible
List all jobs
GET /v1/transaction_jobs
Returns all transaction jobs visible to the authenticated user.
curl -X GET "https://{firm}.addepar.com/api/v1/transaction_jobs" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Accept: application/vnd.api+json"
The response contains an array of job resources with status, timestamps, and creator relationships.
Response codes:
200 OK-- Success403 Forbidden-- Insufficient permissions
Download results
GET /v1/transaction_jobs/:id/download
If the job is complete, returns the file content (for view jobs) or JSON results (for query jobs). If the job is still running, returns the current status payload instead.
curl -X GET "https://{firm}.addepar.com/api/v1/transaction_jobs/657c5d9b-7f5d-11ef-a01d-2900745d31ff/download" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Accept: application/vnd.api+json"
For completed view jobs, the response includes a Content-Disposition header with the filename and the binary file content.
Response codes:
200 OK-- Results returned inline303 See Other-- Follow theLocationheader to retrieve results404 Not Found-- Job does not exist410 Gone-- Results expired (24-hour retention window passed)
Cancel a job
DELETE /v1/transaction_jobs/:id
Cancels a job regardless of its current state:
| Current status | Effect |
|---|---|
Queued or Waiting For Capacity | Job will not run. Transitions to User Cancelled. |
In Progress | Cancel request submitted. Transitions to Cancel Requested, then User Cancelled. |
Completed | Results are archived immediately. Transitions to User Cancelled. |
curl -X DELETE "https://{firm}.addepar.com/api/v1/transaction_jobs/39cee0a7-7f5d-11ef-a01d-45a1a34a1c7c" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Accept: application/vnd.api+json"
204 No Content
Response codes:
204 No Content-- Cancel submitted404 Not Found-- Job does not exist or not accessible
Polling pattern
A typical integration follows this lifecycle:
- POST to create the job. Receive
202 Acceptedwith the job ID. - GET
/v1/transaction_jobs/:idevery 5-10 seconds. Checkpercent_completeandstatus. - When
statusisCompleted, GET/v1/transaction_jobs/:id/downloadto retrieve results. - If
statusisFailed,Rejected, orError Cancelled, read theerrorsfield and decide whether to retry.
Polling does not consume rate limit budget at the same rate as data-fetching endpoints, so frequent polling (every 5 seconds) is acceptable for time-sensitive integrations.
Relationship endpoints
| Endpoint | Returns |
|---|---|
GET /v1/transaction_jobs/:id/creator | Full user resource for the job creator |
GET /v1/transaction_jobs/:id/relationships/creator | Creator type and ID only |
Related
- Transactions -- Synchronous transaction CRUD (up to 500 per request)
- Transactions Query -- Synchronous filtered transaction retrieval
- Transaction Types -- Valid transaction type classifications
- Jobs -- General async job pattern (portfolio queries, reports)
- Rate Limiting -- How polling fits into your rate budget
Updated 19 days ago