Jobs

Jobs

The Jobs API exports large analysis datasets asynchronously. Create a job to run a portfolio view or query in the background, poll for completion, and download results as JSON within 24 hours. Use Jobs when your request covers more than 100 entities, spans large date ranges, or would exceed the 30-second synchronous timeout.

Overview

Base Route/v1/jobs
EndpointsGET /v1/jobs /v1/jobs/:id /v1/jobs/:id/download POST /v1/jobs DELETE /v1/jobs/:id
ProducesJSON
PaginationYes (default: 25 per page)
Application Permissions"API Access: Create, edit, and delete" and access to view the requested portfolio data
OAuth ScopesPORTFOLIO

Resource attributes

AttributeTypeRequiredConstraintsDescriptionExample
job_typestringYesEnum: portfolio_view_results, portfolio_query_resultsThe type of analysis to run"portfolio_view_results"
statusstringNo (read-only)Enum: see Status lifecycle belowCurrent state of the job"Completed"
percent_completenumberNo (read-only)0.0 to 1.0Progress indicator1.0
started_atstringNo (read-only)ISO 8601 UTCWhen processing began"2020-04-15T21:30:16Z"
completed_atstringNo (read-only)ISO 8601 UTCWhen processing finished"2020-04-15T21:30:17Z"
errorsarrayNo (read-only)Array of error objects with status, title, detailErrors encountered during processingSee error response examples
parametersobjectYesStructure varies by job_type; see Parameters belowThe configuration for the analysis runSee endpoint examples

Parameters

Required parameters depend on the job type.

Portfolio view job parameters

ParameterTypeRequiredConstraintsDescriptionExample
portfolio_typestringYesEnum: ENTITY, ENTITY_FUNDS, GROUP, GROUP_FUNDS, FIRM, FIRM_ACCOUNTS, FIRM_CLIENTS, FIRM_HOUSEHOLDS, FIRM_UNVERIFIED_ACCOUNTSThe scope of the portfolio to analyze"ENTITY"
portfolio_idstringYesMust be a valid entity or group ID; must be 1 when portfolio_type is FIRMThe portfolio to analyze"22"
view_idstringYesMust reference an existing saved viewThe portfolio view to render"12"
output_typestringYesEnum: JSON, CSV, TSV, XLSXThe format for downloaded results"JSON"
start_datestringYesFormat: YYYY-MM-DDStart of the analysis period"2026-01-01"
end_datestringYesFormat: YYYY-MM-DD; must be >= start_dateEnd of the analysis period"2026-06-30"

Portfolio query job parameters

ParameterTypeRequiredConstraintsDescriptionExample
portfolio_typestringYesSame enum as view jobsThe scope of the portfolio to analyze"ENTITY"
portfolio_idstringYesSame rules as view jobsThe portfolio to analyze"22"
start_datestringYesFormat: YYYY-MM-DDStart of the analysis period"2026-01-01"
end_datestringYesFormat: YYYY-MM-DD; must be >= start_dateEnd of the analysis period"2026-06-30"
columnsarrayYesArray of objects with key (string) and optional arguments (object)The attributes to compute[{"key": "value"}]
groupingsarrayYesArray of objects with key (string) and optional arguments (object); can be emptyHow to group results[{"key": "asset_class"}]
filtersarrayNoArray of filter objects; see Portfolio QueryRow-level filters[{"attribute": "asset_class", "type": "discrete", "operator": "include", "values": ["Equity"]}]
hide_previous_holdingsbooleanNoDefault: falseExclude holdings not held at end of periodfalse

Relationships

RelationshipDescriptionUse when...
creatorThe user who created the jobYou need to identify which user or API client initiated the export
{
  "relationships": {
    "creator": {
      "links": {
        "self": "/v1/jobs/2/relationships/creator",
        "related": "/v1/jobs/2/creator"
      },
      "data": {
        "type": "users",
        "id": "22"
      }
    }
  }
}

Create a portfolio view job

Creates an asynchronous job to export data from a saved portfolio view. Each job has a 4-hour timeout limit.

curl --request POST \
  --url 'https://examplefirm.addepar.com/api/v1/jobs' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Content-Type: application/vnd.api+json' \
  --header 'Accept: application/vnd.api+json' \
  --data '{
    "data": {
      "type": "jobs",
      "attributes": {
        "job_type": "portfolio_view_results",
        "parameters": {
          "view_id": "2",
          "portfolio_type": "ENTITY",
          "portfolio_id": "22",
          "output_type": "JSON",
          "start_date": "2026-01-01",
          "end_date": "2026-06-30"
        }
      }
    }
  }'
{
  "data": {
    "id": "b6c1b9da-4387-11ef-8636-dd826f8aeed1a",
    "type": "jobs",
    "attributes": {
      "job_type": "portfolio_view_results",
      "parameters": {
        "view_id": 2,
        "portfolio_type": "ENTITY",
        "portfolio_id": "22",
        "output_type": "JSON",
        "start_date": "2026-01-01",
        "end_date": "2026-06-30"
      },
      "status": "Queued",
      "percent_complete": 0.0,
      "started_at": null,
      "completed_at": null,
      "errors": []
    },
    "relationships": {
      "creator": {
        "links": {
          "self": "/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a/relationships/creator",
          "related": "/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a/creator"
        },
        "data": {
          "type": "users",
          "id": "44"
        }
      }
    },
    "links": {
      "self": "/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a"
    }
  }
}
{
  "errors": [
    {
      "status": "400",
      "title": "Bad Request",
      "detail": "Missing required parameter: view_id"
    }
  ]
}

Response codes:

  • 202 Accepted -- Job created and queued; use the id from the response to poll status
  • 400 Bad Request -- Missing or invalid parameters; check the detail field for the specific issue
  • 403 Forbidden -- Missing PORTFOLIO OAuth scope or insufficient entity visibility for the requested portfolio

Create a portfolio query job

Creates an asynchronous job to compute custom analytics over portfolio data.

curl --request POST \
  --url 'https://examplefirm.addepar.com/api/v1/jobs' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Content-Type: application/vnd.api+json' \
  --header 'Accept: application/vnd.api+json' \
  --data '{
    "data": {
      "type": "jobs",
      "attributes": {
        "job_type": "portfolio_query_results",
        "parameters": {
          "portfolio_type": "ENTITY",
          "portfolio_id": "22",
          "start_date": "2026-01-01",
          "end_date": "2026-06-30",
          "columns": [
            {"key": "value"},
            {"key": "time_weighted_return"}
          ],
          "groupings": [
            {"key": "asset_class"}
          ]
        }
      }
    }
  }'
{
  "data": {
    "id": "c7d2e0fb-5498-22fg-9747-ee937g9bffa2b",
    "type": "jobs",
    "attributes": {
      "job_type": "portfolio_query_results",
      "status": "Queued",
      "percent_complete": 0.0
    },
    "links": {
      "self": "/v1/jobs/c7d2e0fb-5498-22fg-9747-ee937g9bffa2b"
    }
  }
}

Response codes:

  • 202 Accepted -- Job created and queued
  • 400 Bad Request -- Invalid columns or groupings structure; check Attributes for valid keys
  • 403 Forbidden -- Missing PORTFOLIO scope or insufficient entity visibility

Get job status

Poll this endpoint to check whether a job has completed. Use the id returned from the create response.

curl --request GET \
  --url 'https://examplefirm.addepar.com/api/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Accept: application/vnd.api+json'
{
  "data": {
    "id": "b6c1b9da-4387-11ef-8636-dd826f8aeed1a",
    "type": "jobs",
    "attributes": {
      "job_type": "portfolio_view_results",
      "status": "Completed",
      "percent_complete": 1.0,
      "started_at": "2026-06-15T14:30:00Z",
      "completed_at": "2026-06-15T14:32:45Z",
      "errors": []
    },
    "links": {
      "self": "/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a"
    }
  }
}

Response codes:

  • 200 OK -- Job details retrieved successfully
  • 403 Forbidden -- Missing permission to view this job
  • 404 Not Found -- Job ID does not exist; verify the ID from the create response

Download results

After a job reaches Completed status, download the results. Results expire 24 hours after job creation.

curl --request GET \
  --url 'https://examplefirm.addepar.com/api/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a/download' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Accept: application/vnd.api+json'

The response body contains the job results in the format specified by output_type (JSON, CSV, TSV, or XLSX).

Response codes:

  • 200 OK -- Results downloaded successfully
  • 404 Not Found -- Results have expired (24-hour window) or job has not completed; re-create the job if expired
  • 403 Forbidden -- Missing permission to download this job's results

List all jobs

Retrieves all jobs for the authenticated user's firm.

curl --request GET \
  --url 'https://examplefirm.addepar.com/api/v1/jobs' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Accept: application/vnd.api+json'

Response codes:

  • 200 OK -- Jobs listed successfully
  • 403 Forbidden -- Missing API access permission

Cancel a job

Cancels a running or queued job. Completed jobs cannot be canceled.

curl --request DELETE \
  --url 'https://examplefirm.addepar.com/api/v1/jobs/b6c1b9da-4387-11ef-8636-dd826f8aeed1a' \
  --header 'Authorization: Basic {base64_encoded_credentials}' \
  --header 'Addepar-Firm: {firm_id}' \
  --header 'Accept: application/vnd.api+json'

Response codes:

  • 202 Accepted -- Cancellation requested; job transitions to Cancel Requested then User Cancelled
  • 403 Forbidden -- Missing permission to cancel this job
  • 404 Not Found -- Job ID does not exist

Status lifecycle

StatusMeaningAgent actionTypical duration
QueuedWaiting for server capacityPoll after 5sSeconds to minutes
Picked Up By Job RunnerAssigned to a workerPoll after 5sSeconds
In ProgressActively computingPoll after 10sMinutes to hours
In Progress - Waiting For CapacityReturned to queue due to loadPoll after 30sMinutes
CompletedResults ready for downloadProceed to /v1/jobs/:id/download(terminal)
FailedServer error; no results availableRead errors array; re-create the job if transient(terminal)
Timed OutResults expired after 24 hoursRe-create the job(terminal)
CanceledUser initiated cancellation via API or UINo action needed(terminal)
User CancelledCancellation confirmedNo action needed(terminal)
Cancel RequestedCancellation in progressWait for transition to User CancelledSeconds
RejectedQueue quota exceededReduce concurrent jobs or wait for existing jobs to complete, then retry(terminal)
Error CancelledSystem cancelled due to errorRead errors array for details(terminal)

Error recovery

FailureSymptomRecovery
Invalid job parameters400 with detail message on createCheck job_type enum value and verify all required parameters for that job type are present
Insufficient permissions403 on createVerify OAuth scope is PORTFOLIO and the API user has visibility to the requested portfolio entities
Job stuck in queueStatus unchanged for 15+ minutesCancel with DELETE, wait for User Cancelled, then re-create
Download returns 404Job completed but results expiredResults expire 24 hours after creation; re-create the job
Job rejectedStatus becomes Rejected immediatelyYou have too many concurrent jobs; wait for existing jobs to complete before creating new ones
Job fails with errorStatus becomes Failed or Error CancelledRead the errors array in the job response; fix the underlying issue and re-create

Related resources

  • Batched Jobs -- Run jobs with the Addepar-Compute-Type: BATCH header for large-scale exports (Beta)
  • Report Generation -- Generate PDF/Excel reports using the Jobs lifecycle
  • Portfolio View API -- The data source for portfolio_view_results job type
  • Portfolio Query API -- The data source for portfolio_query_results job type
  • Attributes -- Discover supported column keys for query jobs
  • Pagination -- Cursor-based pagination for the list endpoint

What’s Next

Time to try it out for yourself:

Did this page help you?