Details about how to obtain access tokens using OAuth 2.0

Fetch positions, balances and other account related details.

Place equity and complex option trades including advanced orders.

Fetch quotes, chains and historical data via REST and streaming APIs.

Stream market data and account events in real-time.

Create and update custom watchlists.

Examples, response types, property details and explanations.

Get an account’s cost basis

  • Available in Paper Trading
  • Available in Production
  • Available to Advisors
  • Supported

Get cost basis information for a specific user account. This includes information for all closed positions. Cost basis information is updated through a nightly batch reconciliation process with our clearing firm.



Header Required Values/Example Default
Accept Optional application/xml, application/json application/xml
Authorization Required Bearer {token}


Parameter Type Param Type Required Values/Example Default
account_id Path String Required VA000000
Account number
page Query String Optional 3 1
Used for paginated results. Page to start results.
limit Query String Optional 100
Number of results to return per page.
sortBy Query String Optional closeDate closeDate
Field to sort the results. One of: openDate,closeDate
sort Query String Optional desc desc
Sort direction. One of: asc,desc
start Query String Optional yyyy-mm-dd Account opening date
Start date
end Query String Optional yyyy-mm-dd End of current day
End date
symbol Query String Optional SPY
Filter by security symbol

Code Example

If you're developing using a paper trading account, change the hostname to https://sandbox.tradier.com
curl -X GET "https://api.tradier.com/v1/accounts/{account_id}/gainloss?page=3&limit=100&sortBy=closeDate&sort=desc&start=yyyy-mm-dd&end=yyyy-mm-dd&symbol=SPY" \
     -H 'Authorization: Bearer <TOKEN>' \
     -H 'Accept: application/json'
// Version 1.8.0_31    
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class MainClass {
  public static void main(String[] args) throws IOException {
    final HttpUriRequest request = RequestBuilder
        .addHeader("Authorization", "Bearer <TOKEN>")
        .addHeader("Accept", "application/json")
        .addParameter("account_id", "VA000000")
        .addParameter("page", "3")
        .addParameter("limit", "100")
        .addParameter("sortBy", "closeDate")
        .addParameter("sort", "desc")
        .addParameter("start", "yyyy-mm-dd")
        .addParameter("end", "yyyy-mm-dd")
        .addParameter("symbol", "SPY")

    final HttpResponse response = HttpClientBuilder.create().build().execute(request);
    final String jsonString = EntityUtils.toString(response.getEntity());
    final JsonNode json = new ObjectMapper().readTree(jsonString);
# Version 2.5.0p0    
require 'uri'
require 'net/http'

url = URI("https://api.tradier.com/v1/accounts/{account_id}/gainloss?page=3&limit=100&sortBy=closeDate&sort=desc&start=yyyy-mm-dd&end=yyyy-mm-dd&symbol=SPY")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <TOKEN>'
request["Accept"] = 'application/json'

response = http.request(request)
puts response.code
puts response.read_body
// Version go1.12      
package main

import (

func main() {
    apiUrl := "https://api.tradier.com/v1/accounts/{account_id}/gainloss?page=3&limit=100&sortBy=closeDate&sort=desc&start=yyyy-mm-dd&end=yyyy-mm-dd&symbol=SPY"

    u, _ := url.ParseRequestURI(apiUrl)
    urlStr := u.String()

    client := &http.Client{}
    r, _ := http.NewRequest("GET", urlStr, nil)
    r.Header.Add("Authorization", "Bearer <TOKEN>")
    r.Header.Add("Accept", "application/json")

    resp, _ := client.Do(r)
    responseData, err := ioutil.ReadAll(resp.Body)

    if err != nil {

// Version    
using System;
using System.Net;  
using System.IO;
using System.Text;

public class MainClass {
  public static void Main (string[] args) {
    var request = (HttpWebRequest)WebRequest.Create("https://api.tradier.com/v1/accounts/{account_id}/gainloss?page=3&limit=100&sortBy=closeDate&sort=desc&start=yyyy-mm-dd&end=yyyy-mm-dd&symbol=SPY");
    request.Method = "GET";
    request.Headers["Authorization"] = "Bearer <TOKEN>";
    request.Accept = "application/json";

    var response = (HttpWebResponse)request.GetResponse();

    Console.WriteLine (response.StatusCode);
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    Console.WriteLine (responseString);
// Version 10.15.2    
const request = require('request');

    method: 'get',
    url: 'https://api.tradier.com/v1/accounts/{account_id}/gainloss',
    qs: {
       'page': '3',
       'limit': '100',
       'sortBy': 'closeDate',
       'sort': 'desc',
       'start': 'yyyy-mm-dd',
       'end': 'yyyy-mm-dd',
       'symbol': 'SPY'
    headers: {
      'Authorization': 'Bearer <TOKEN>',
      'Accept': 'application/json'
  }, (error, response, body) => {
# Version 3.6.1    
import requests

response = requests.get('https://api.tradier.com/v1/accounts/{account_id}/gainloss',
    params={'page': '3', 'limit': '100', 'sortBy': 'closeDate', 'sort': 'desc', 'start': 'yyyy-mm-dd', 'end': 'yyyy-mm-dd', 'symbol': 'SPY'},
    headers={'Authorization': 'Bearer <TOKEN>', 'Accept': 'application/json'}
json_response = response.json()
// Version 7.2.17-0ubuntu0.18.04.1
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.tradier.com/v1/accounts/{account_id}/gainloss?page=3&limit=100&sortBy=closeDate&sort=desc&start=yyyy-mm-dd&end=yyyy-mm-dd&symbol=SPY');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

$headers = array();
$headers[] = 'Authorization: Bearer <TOKEN>';
$headers[] = 'Accept: application/json';

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
curl_close ($ch);
echo $http_code;
echo $result;


Response Definition

  "gainloss": {
    "closed_position": [
        "close_date": "2018-10-31T00:00:00.000Z",
        "cost": 12.7,
        "gain_loss": -2.64,
        "gain_loss_percent": -20.7874,
        "open_date": "2018-06-19T00:00:00.000Z",
        "proceeds": 10.06,
        "quantity": 1.0,
        "symbol": "GE",
        "term": 134
        "close_date": "2018-09-21T00:00:00.000Z",
        "cost": 3.05,
        "gain_loss": -3.05,
        "gain_loss_percent": -100.0,
        "open_date": "2018-09-18T00:00:00.000Z",
        "proceeds": 0.0,
        "quantity": 1.0,
        "symbol": "SNAP180921P00008500",
        "term": 3
        "close_date": "2018-09-19T00:00:00.000Z",
        "cost": 913.95,
        "gain_loss": 6.05,
        "gain_loss_percent": 0.662,
        "open_date": "2018-09-18T00:00:00.000Z",
        "proceeds": 920.0,
        "quantity": 100.0,
        "symbol": "SNAP",
        "term": 1
        "close_date": "2018-06-25T00:00:00.000Z",
        "cost": 25.05,
        "gain_loss": -25.05,
        "gain_loss_percent": -100.0,
        "open_date": "2018-06-22T00:00:00.000Z",
        "proceeds": 0.0,
        "quantity": 1.0,
        "symbol": "SPY180625C00276000",
        "term": 3