The Whalewisdom API
The Whalewisdom API lets you interact with our 13F database in a variety of ways. Although most of the functionality provided through the API is already available by utilizing the website, the API is provided to help streamline and automate data retrieval.
In order to use the API you must have an account registered with Whalewisdom.com. Once registered you will need to login and go to your user profile to create new API access keys. These will be used to authenticate your API calls.
Each API call starts with an endpoint of
https://whalewisdom.com/shell/command
What follows the endpoint depends on a number of factors including how you are to be authenticated, what command you want to execute and how you want the results formatted. The following documentation provides details into using the API.
Access to resources
You must have an account in order to access the API. Access is further restricted into two types: subscribers and non-subscribers. Subscribers have full access to all quarterly 13F data. Non-subscribers have access to the last 8 quarters worth of data not including the current quarter.
Authenticating your API Call
When you send a request to the Whalewisdom API, you must have your credentials verified to authenticate yourself to the system. There are 3 separate ways to authenticate your API call. Which one you use really depends on how you are making the call and personal preference.
- If you are doing the API calls through a browser then the easiest way is by simply logging into the site with your account login/password and letting the browser maintain your session using a session cookie.
-
The preferred option for desktop and other non-browser applications
is to include a digital signature with each request.
Every API user has the ability to create access keys for signing each request. Two access keys are used: a shared access key and a secret access key.
- shared access key -
- identifies you as the party responsible for service requests. You include it in each API request so it is not a secret.
- Secret Access Key -
- used to create a digital signature with each request. Your secret access key is secret and is not actually included in any request. You should not share it with anyone.
Each request you make must be digitally signed as follows:
https://whalewisdom.com/shell/command?args=[args]&api_shared_key=[api_shared_key]&api_sig=[api_sig]×tamp=[timestamp][args] is the JSON formatted object that contains the actual command and other par They are discussed in detail under "Making an API call".
[timestamp] a date-time value that marks the day and time the request was sent. Requests expire after a certain length of time to prevent malicious users from capturing requests and resubmitting them at a later time. This parameter is only used when authenticated via digital signatures.
For example: 2011-06-01T13:00:01Z
[api_shared_key] is the API Shared Access Key that has been assigned to your account. You can see your shared access key by going to your user profile.
[api_sig] is a signature of the args parameter created using your secret access key. The api_sig is constructed using the HMAC-SHA1 algorithm. You take the HMAC-SHA1 digest of the [args] parameter and then encode the results in base64. The process is similar to how OAuth signs requests except with our API we are using the args and timestamp query parameters (before they are URL encoded). When creating the signature, combine the args and timestamp with an ASCII newline ("\n") character. For Ruby the process would look like this:
require 'digest/sha1' t=Time.now digest = OpenSSL::Digest::Digest.new( 'sha1' ) hmac = OpenSSL::HMAC.digest( digest, secret_access_key, args+"\n"+t.utc.strftime('%Y-%m-%dT%H:%M:%SZ') ) sig=Base64.encode64( hmac ).chomp.gsub(/\n/, '') - A third option is to use basic HTTP authentication. Your login/password are sent in the header of each HTTP request. This is simple to use and widely supported, but considered insecure.
Making an API call
Each API call is an HTTP GET or POST request. The GET request is constructed as follows:
https://whalewisdom.com/shell/command[.output_type]?args=[args]&api_shared_key=[api_shared_key]&api_sig=[api_sig]
Required parameters:
- [args] - The args parameter contains the actual command to execute. It is a JSON object with the command to run and any additional parameters. View the detailed instructions for each available command and to see how the args parameter is constructed. If using a GET Request, be sure to properly URL encode the args parameter as it will likely contain spaces, quotes, and other disallowed URL characters. Use the Online Interactive Shell to experiment with the available commands and see how the args parameter is constructed.
- [.output_type] - By default command results are output in HTML format.
If the command you are running supports outputting
results in another format such as JSON or CSV then you would specify that here
by adding a .json or .csv to the URL. For example:
https://whalewisdom.com/shell/command.json?args=%7B%22command%22:%22stock_lookup%22,%20%22name%22:%22apple%20comp%22%7Dwould perform a stock lookup of "Apple" and return the results in JSON - [api_shared_key] - Used when authenticating via digital signatures. See details under the "authenticating your API call" section above
- [api_sig] - Used when authenticating via digital signatures. See details under the "authenticating your API call" section above
There is an Online Interactive Shell that lets you execute API command and see what the correct API call format will be. Get more details here
some important concepts
- Many commands will require you to enter the id for the quarter (time period) you wish to query against. The quarter id can be found by running the "quarters" command. Type "quarters" in the Shell and you will get a list of all quarters in the system as well as which ones you have access to. For example quarter id 1 is for 3/31/2001 while quarter id 40 is for 12/31/2010.
- Use the "filer_lookup" command to find a 13F filer's id in the system. Provide a partial name or CIK of the filer you want to find and if the filer is in our system it will return the id to you.
- Use the "stock_lookup" command to find a stock's id in our system. Provide a ticker symbol or partial name and the stock_lookup command will return a list of matching stocks along with their ids.
Available API Calls
- quarters
- stock_lookup
- filer_lookup
- stock_comparison
- holdings_comparison
- backtester
- backtester_status
- backtester_saved
- backtester_load
- backtester_delete
- guru
- guru_saved
- combined_holdings_comparison
- filing_data_feed
- condensed_data_feed
- export
{"command":"quarters"}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22quarters%22%7D
| key | value | type | required | |
|---|---|---|---|---|
| name | NAME | string | either name or symbol is required | a partial or complete name to search for |
| symbol | SYMBOL | string | either name or symbol is required | the stock ticker symbol to search for |
{"command":"stock_lookup", "name":"Apple Comp"}
{"command":"stock_lookup", "symbol":"aapl"}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22stock_lookup%22,%20%22name%22:%22apple%20comp%22%7D
| key | value | type | required | |
|---|---|---|---|---|
| name | NAME | string | at least one param is required | a partial or complete name to search for |
| cik | CIK | string | at least one param is required | the filer Central Index Key(CIK) to search for |
| id | ID | number | at least one param is required | the database ID of the filer |
| city | ID | string | at least one param is required | the city provided by the filer |
| state | ID | string | at least one param is required | the state the filer resides in |
| state_incorporation | ID | string | at least one param is required | the state the filer is incorporated in |
| business_phone | ID | string | at least one param is required | business phone provided by filer |
| irs_number | ID | string | at least one param is required | IRS number provided by filer |
| offset | ID | string | offset to return if bringing back over 1,000 records |
{"command":"filer_lookup", "name":"berkshire"}
{"command":"filer_lookup", "cik":"0001067983"}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22filer_lookup%22,%20%22name%22:%22berkshire%22%7D
| key | value | type | required | |
|---|---|---|---|---|
| stockid | STOCK ID - the id of the stock | numeric | required | |
| q1id | QUARTER 1 ID - the id of one of the 13F filing quarters to compare | numeric | required | |
| q2id | QUARTER 2 ID - the id of the other 13F filing quarter to compare | numeric | required | |
| order | ORDER BY | string | optional | filer_name, q1_shares, q2_shares, or percent_change |
| dir | DIRECTION | string | optional | ASC or DESC |
{"command":"stock_comparison","stockid":3598,"q1id":39,"q2id":40}
(This will do a stock comparison of E*Trade for the 9/30/2010 and 12/31/2010 quarters)
{"command":"stock_comparison","stockid":3598,"q1id":39,"q2id":40,"order":"q2_shares","dir":"DESC"}
(This will do a stock comparison of E*Trade for the 9/30/2010 and 12/31/2010 quarters ordering by q2 shares in descending order)
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22stock_comparison%22,%22stockid%22:3598,%22q1id%22:39,%22q2id%22:40%7D
| key | value | type | required | |
|---|---|---|---|---|
| filerid | FILER ID | numeric | required | the id of the filer |
| q1id | QUARTER 1 ID | numeric | required | the id of one of the 13F filing quarters to compare |
| q2id | QUARTER 2 ID | numeric | required | the id of the other 13F filing quarter to compare |
| order | ORDER BY | string | optional | column to sort by - stock, q2_market_value, q1_percent_of_portfolio, q2_percent_of_portfolio, q2_shares, q1_shares, q1_market_value, percent_change, or absolute_change |
| dir | DIRECTION | string | optional | ASC or DESC |
| filter | FILTER | array of strings | optional | An array with possible values of SHARES, CALL, PUT, or PRN. if set to one or more of these values then the results will be restricted to those types of assets |
| stockid | DIRECTION | numeric | optional | this will restrict results to the stock id you provide |
{"command":"holdings_comparison","filerid":163,"q1id":39,"q2id":40}
(This will do a 13F holdings comparison of Appaloosa for the
9/30/2010 and 12/31/2010 quarters and display the results on screen)
{"command":"holdings_comparison","filerid":163,"q1id":39,"q2id":40,"order":"q2_shares","dir":"DESC"}
(This will do a holdings comparison of Appaloosa for the
9/30/2010 and 12/31/2010 quarters ordering by q2 shares in descending order)
{"command":"holdings_comparison","filerid":163,"q1id":39,"q2id":40,"order":"q2_shares","filter":["CALL","PUT"]}
(This will do a holdings comparison of Appaloosa for the
9/30/2010 and 12/31/2010 quarters and only return any CALL or PUT holdings)
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22holdings_comparison%22,%22filerid%22:163,%22q1id%22:39,%22q2id%22:40%7D
| key | value | type | required | |
|---|---|---|---|---|
| filers | [FILER IDS] | array of numbers | required | An array of filer ids to include |
| q1id | QUARTER 1 ID | numeric | required | the id of the quarter to start backtesting from |
| q2id | QUARTER 2 ID | numeric | optional | the id of the quarter to end backtesting on. Defaults to the latest quarter if none given |
| balancing | BALANCE TYPE ID | numeric | optional | Defaults to choice 1. Enter 1,2, or 3. Choose how stocks are rebalanced, options are
|
| weighting | WEIGHT TYPE ID | numeric | optional | Defaults to choice 1. Enter 1 or 2. Choose how funds are
allocated among stocks each rebalancing, options are
|
| size | SIZE | numeric | optional | Defaults to 10. The number of holdings to use. You may enter 3, 5, 10, or 20 |
| starting_amount | AMOUNT | numeric | optional | Defaults to $1,000,000. The starting dollar amount of the portfolio |
| email_to | "EMAIL ADDRESS" | string | optional | Defaults to the email address associated with your account. Backtesters are queued in the system and emailed to the address you provide once completed |
| save | SAVE NAME | string | optional | Save the report criteria to the database for future retrieval. |
{"command":"backtester","filers":[2182,349],"q1id":36}
(This will queue a backtester with Paulson & Co
and Berkshire Hathaway starting at the 12/31/2009 quarter.)
{"command":"backtester","filers":[2182,349],"q1id":36,"q2id":40,"size":5,"balancing":2,"weighting":2,"starting_amount":10000,"email_to":"contact@whalewisdom.com"}
(This will queue a backtester with Paulson & Co
and Berkshire Hathaway starting at the 12/31/2009 quarter and ending on 12/31/2010 with the number of holdings
set to 5, stock balancing set to "most frequently held stocks by dollar value",
weighting set to "Balance portfolio by equally weighing stocks", the starting amount set to $10,000,
and the email address to send the report to set to contact@whalewisdom.com )
{"command":"backtester","filers":[2182,349],"q1id":36,"q2id":40,"save":"My Saved Report"}
(This will queue a backtester with Paulson & Co
and Berkshire Hathaway starting at the 12/31/2009 quarter. The report will be saved as "My Saved Report" for future retrieval)
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22backtester%22,%22filers%22:%5B2182,349%5D,%22q1id%22:36%7D
| key | value | type | required | |
|---|---|---|---|---|
| queue_id | QUEUE ID | numeric | your queued report id |
{"command":"backtester_status", "queue_id":5}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22backtester_status%22,%20%22queue_id%22:5%7D
{"command":"backtester_saved"}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22backtester_saved%22%7D
| key | value | type | required | |
|---|---|---|---|---|
| id | ID | numeric | required | the id of the Backtester to load |
{"command":"backtester_load","id":5}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22backtester_load%22,%20%22id%22:117%7D
| key | value | type | required | |
|---|---|---|---|---|
| id | ID | numeric | required | the id of the Backtester to load |
{"command":"backtester_delete","id":5}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22backtester_delete%22,%20%22id%22:11%7D%20
| key | value | type | required | |
|---|---|---|---|---|
| filers | [FILER IDS] | array of numbers | required | An array of filer ids to include |
| quarter_id | QUARTER ID | numeric | required | the id of the quarter to look at |
| holdings_percent | PERCENT | numeric | required | holdings percentage threshold |
| stocks | [STOCKS] | array of numbers | optional | array of stocks to restrict search to |
| order | ORDER BY | string | optional | column to sort by - stock or percent |
| dir | DIRECTION | string | optional | ASC or DESC |
| save | SAVE NAME | string | optional | Save the report criteria to the database for future retrieval. |
{"command":"guru","filers":[2182,349],"quarter_id":36}
(This will run the guru's report with Paulson & Co
and Berkshire Hathaway for the 12/31/2009 quarter.)
{"command":"guru","filers":[2182,349],"quarter_id":36,"stocks":[195,3573],"sort":"holdings_percent","dir":"DESC","save":"My Saved Report"}
(This will run the guru's report with Paulson & Co and Berkshire Hathaway for the 12/31/2009 quarter and restricted to Apple and Amazon. The report will be order by the percent column in descending order The report will be saved as "My Saved Report" for future retrieval)
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22guru%22,%22filers%22:%5B2182,349%5D,%22quarter_id%22:36%7D
| key | value | type | required | |
|---|---|---|---|---|
| save_action | "ACTION" | string | required | "load", "delete", or "list" saved reports |
| id | ID | numeric | optional | Required for the "load" and "delete" save_actions. The id of the saved report |
{"command":"guru_saved","save_action":"load", "id":5}
(loads the saved guru report with an id of 5)
{"command":"guru_saved","save_action":"delete", "id":5}
(delete the saved guru report with an id of 5)
{"command":"guru_saved","save_action":"list"}
(lists all of your saved Guru Reports)
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22guru_saved%22,%22save_action%22:%22load%22,%20%22id%22:5%7D
| key | value | type | required | |
|---|---|---|---|---|
| filers | [FILER IDS] | array of numbers | required | array of filer ids |
| q1id | QUARTER 1 ID | numeric | required | the id of one of the 13F filing quarters to combine |
| q2id | QUARTER 2 ID | numeric | required | the id of the last quarter to combine |
| order | "ORDER BY" | string | optional | column to sort by - stock, q2_market_value, q1_percent_of_portfolio, q2_percent_of_portfolio, q2_shares, q1_shares, q1_market_value, percent_change, or absolute_change |
| dir | "DIRECTION" | string | optional | ASC or DESC |
| filter | [FILTER] | array of strings | optional | An array with possible values of SHARES, CALL, PUT, or PRN. if set to one or more of these values then the results will be restricted to those types of assets |
| stocks | [STOCK IDS] | array of numbers | required | array of stock ids to restrict results to |
| stockid | STOCK ID | numeric | optional | this will restrict results to the specific stock id you provide |
| save | "SAVE NAME" | string | optional | Save the report criteria to the database for future retrieval. |
| save_action | "ACTION" | string | optional | "load","delete", or "list" save reports |
| saveid | SAVE ID | numeric | optional | used with the load or delete save_action. The id of the saved report |
{"command":"combined_holdings_comparison","filers":[2182,349],"q1id":38,"q2id":40}
(This will combine the holdings of Paulson & Co
and Berkshire Hathaway for the
6/30/2010, 9/30/2010 and 12/31/2010 quarters and only return any CALL or PUT holdings)
{"command":"combined_holdings_comparison","filers":[2182,349],"q1id":38,"q2id":40,"filter":["CALL","PUT"]}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22:%22combined_holdings_comparison%22,%22filers%22:%5B2182,349%5D,%22q1id%22:38,%22q2id%22:40%7D
| key | value | type | required | |
|---|---|---|---|---|
| ts | Timestamp | string | optional | Allows you to override the last date and time to download changed data from. The timestamp format is %Y-%m-%dT%H:%M:%SZ. For example 2011-07-27T15:58:39Z |
| last_filing_id | Last Filing ID | number | optional | Will bring back all 13F filings whose id is greater than last_filing_id |
| last_stock_id | Last Stock ID | number | optional | Will bring back all stocks whose ID is greater than last_stock_id |
| last_filer_id | Last Filer ID | number | optional | Will bring back all filers whose ID is greater than last_filer_id |
{"command":"filing_data_feed"}
This outputs everything from the filings table that has been received or reprocessed
since your last request. Output will be limited to 500 filings at a time so additional
calls may need to be made. Once a call returns 0 filings then you know you are up-to-date.
{"command":"filing_data_feed", "ts":"2011-07-27T15:58:39Z","last_filing_id":"134500"}
This outputs everything that has been received or reprocessed
since 7/27/2011 11:58:39 EST. Output will be limited to 500 filings at a time so additional
calls using the "last_filing_id" parameter may need to be made.
https://whalewisdom.com/shell/command.json?args=%7B%22command%22%3A%22filing_data_feed%22%7D%20×tamp=2011-7-29T1%3A21%3A41Z
| key | value | type | required | |
|---|---|---|---|---|
| ts | Timestamp | string | optional | Allows you to override the last date and time to download changed data from. The timestamp format is %Y-%m-%dT%H:%M:%SZ. For example 2011-07-27T15:58:39Z |
| quarter_id | Quarter ID | number | optional | Will bring back all holdings for the specified quarter. Must be used in conjunction with a filer_id |
| last_stock_id | Last Stock ID | number | optional | Will bring back all stocks whose ID is greater than last_stock_id |
| last_filer_id | Last Filer ID | number | optional | Will bring back all filers whose ID is greater than last_filer_id |
| filer_id | Specific Filer ID | number | optional | Will bring back a specific filer's data. Must be used in conjunction with a quarter_id |
{"command":"condensed_data_feed"}
This outputs everything from the filings table that has been received or reprocessed
since your last request. Output will be limited to 10000 holdings at a time so additional
calls may need to be made. Once a call returns 0 filings then you know you are up-to-date.
{"command":"condensed_data_feed", "ts":"2011-07-27T15:58:39Z"}
This outputs everything that has been received or reprocessed
since 7/27/2011 11:58:39 EST. Output will be limited to 100 filings at a time
https://whalewisdom.com/shell/command.html?args=%7B%22command%22%3A%22condensed_data_feed%22%7D%20×tamp=2011-11-16T19%3A1%3A49Z
| key | value | type | required | |
|---|---|---|---|---|
| filer_id | FILER ID | numeric | required | id of filer to export |
| quarters | [QUARTER_ID's] | array of numbers | required | array of quarter ids to export |
| output | OUTPUT ID | numeric | required | either 1 or 2. 1 to output all 13f holdings into a single CSV file. 2 to output all 13f holdings into separate CSV files per quarter |
| columns | [COLUMN ID's] | array of numbers | required | Columns to include in export -
|
| "EMAIL" | string | required | email address to send export to |
{"command":"export","quarters":[40,41,42],"columns":[1,2,3,4,5,6,7,8],"filer_id":349,"output":1,"email":"testemail@test.com"}
https://whalewisdom.com/shell/command.html?args=%7B%22command%22%3A%22export%22%2C%22quarters%22%3A%5B40%2C41%2C42%5D%2C%22columns%22%3A%5B16%2C17%2C18%5D%2C%22filer_id%22%3A349%2C%22output%22%3A1%2C%22email%22%3A%22testemail%40test.com%22%7D