Manager search
Paid plansFind an institutional Form 13F filer by name and get the manager_id its holdings are keyed to.
GET /v1/managers?search=berkshire finds institutional managers that file SEC Form 13F, by a fragment of their name. Each row carries the manager_id you pass to Manager holdings and to the manager_id filter of Institutional holdings.
Search covers the filing era: managers that have filed Form 13F from 2013 onward. On every row id_regime reads filing, manager_id is the firm's SEC CIK and cik is the same number as a 10-digit string. Rows carry no money or share values.
Managers of the historical era have their own ids, 900,000,000 and above, and are not searchable by name. Every holdings row carries its manager_id, and Manager holdings accepts those ids directly. Berkshire Hathaway is 1067983 in search results and 900008350 in the historical era.
Manager search is available on Pro and higher plans. A Free key receives 402.
Parameters
searchstrRequiredCase-insensitive substring of the manager's latest filed name, for example berkshire or state street. % and _ match those characters. 2 to 100 characters; spaces at either end are removed before the length check.
limitintDefault: 1000Rows per page, up to 5,000.
cursorstrDefault: noneThe next_cursor value from the previous page, passed back unchanged.
Response
The body has data, count, next_cursor, warnings and meta at the top level:
{
"data": [ ... ],
"count": 1,
"next_cursor": null,
"warnings": ["Search covers managers that have filed Form 13F from 2013 onward. Managers that appear only in earlier quarters are not searchable by name; their holdings are served by id at /v1/managers/{manager_id}/holdings."],
"meta": { ... }
}Top-level fields
| field | type | unit | nullable | description |
|---|---|---|---|---|
data | list[object] | no | The matching managers. See the row fields below. | |
count | int | rows | no | Rows on this page. |
next_cursor | str | yes | Pass as cursor for the next page. Null on the last page. meta.next_cursor holds the same value. | |
warnings | list[str] | no | Always one fixed sentence stating that search covers the filing era. | |
meta | object | no | See the meta fields below. |
Row fields
| field | type | unit | nullable | description |
|---|---|---|---|---|
manager_id | int | no | The filer's SEC CIK, as an integer. Pass it to Manager holdings or as manager_id on Institutional holdings. | |
manager_name | str | no | The manager's latest filed name. | |
manager_type | str | yes | Null on every search result. The historical era's manager type code, a digit from 1 to 5, appears on historical holdings rows and on a historical manager's manager object. | |
country | str | yes | Null on every search result. Historical managers carry a country, such as UNITED STATES, on their manager object. | |
cik | str | no | The SEC CIK as a 10-digit, zero-padded string, for example 0001067983. | |
first_quarter | str | date | no | The first quarter end with holdings under this id. |
last_quarter | str | date | no | The latest quarter end with holdings under this id. |
id_regime | str | no | Always filing on search results. |
Meta fields
| field | type | unit | nullable | description |
|---|---|---|---|---|
id_regimes | list[str] | no | The id regimes the results come from: ["filing"]. | |
knowledge_time | str | UTC timestamp | yes | When the newest data in the response became known. See Response metadata. |
freshness | list[object] | no | One entry, institutional_filings, with dataset, through and promoted_at. | |
has_more | bool | no | true when another page follows. | |
next_cursor | str | yes | Pass as cursor for the next page. The same value as the top-level next_cursor. Null on the last page. |
Pagination
Rows are ordered by manager_name, ignoring letter case, then by manager_id. A page holds up to limit rows: 1,000 by default, 5,000 at most.
Request the whole result set in one page. A name fragment that matches more than 5,000 managers is too broad: lengthen search instead. When more rows match than limit, meta.has_more is true and next_cursor, at the top level and in meta, carries a token to pass back as cursor with the same parameters. One query can run to 50 pages on Pro, 100 on Max and 200 on Redistribution. Pagination covers cursors in general.
The Python client's managers() returns one page of up to limit rows, 1,000 by default.
Errors
| status | error code | when it happens | how to fix |
|---|---|---|---|
400 | bad_request | search is missing or shorter than 2 characters after trimming. | Pass at least 2 characters. |
400 | bad_request | search is longer than 100 characters. | Shorten it. |
400 | bad_request | limit is not a whole number from 1 to 999,999,999. | Pass a limit of 1 or more. |
400 | bad_request | cursor was not issued for this request: it is not a next_cursor value, it has been altered, or it came from another path, a changed parameter or another endpoint. | Pass next_cursor unchanged with the same path and parameters, or repeat the request without cursor. |
400 | pagination_limit_reached | The cursor asks for a page beyond your plan's cap. error reads Pagination limit reached. | Lengthen search. |
401 | unauthorized | The key is missing or invalid. | Send X-API-Key. See Authentication. |
402 | upgrade_required | The key is on the Free plan. | Upgrade to Pro. |
429 | see Rate limits | A quota is exhausted. | Wait for the window to reset. |
Real bodies:
{"error":"bad_request","code":"bad_request","status":400,"detail":"search must be at least 2 characters"}
{"error":"bad_request","code":"bad_request","status":400,"detail":"search must be 100 characters or fewer"}
{"error":"bad_request","code":"bad_request","status":400,"detail":"Invalid cursor: not a cursor this API issued, or one from an earlier paging scheme. Repeat the request without cursor to start from the first page."}
{"error":"Pagination limit reached","code":"pagination_limit_reached","status":400,"detail":"Pro tier supports up to 50 pages per query.","message":"Pro tier supports up to 50 pages per query."}{"error":"unauthorized","code":"unauthorized","status":401,"detail":"No API key was sent. Pass your key in the X-API-Key header or the ?api_key= query parameter. Get one free at https://xfinlink.com/signup","message":"No API key was sent. Pass your key in the X-API-Key header or the ?api_key= query parameter. Get one free at https://xfinlink.com/signup"}{"error":"upgrade_required","code":"upgrade_required","status":402,"detail":"Institutional holdings are available on Pro. https://xfinlink.com/pricing"}A search with no match returns 200 with an empty data array.
Plan differences
- Free:
402. Alimitorcursorvalue that is refused returns its400first. - Pro: full access, 50 pages per query.
- Max: full access, 100 pages per query.
- Redistribution: full access, 200 pages per query.
Each answered request counts as one unit against your daily quota. A refused one, such as a Free key's 402 or a 400, does not count. See Plans and limits.
The same request on Free:
curl -s -H "X-API-Key: YOUR_API_KEY" "https://api.xfinlink.com/v1/managers?search=berkshire"{"error":"upgrade_required","code":"upgrade_required","status":402,"detail":"Institutional holdings are available on Pro. https://xfinlink.com/pricing"}On Pro it returns 200 with the matching managers.
Edge cases
One firm, several filers
A firm that files through several legal entities appears once per entity, each with its own manager_id and quarter range. search=vanguard returns 12 managers. Vanguard Group Inc's series runs to 2025-12-31, and later quarters are filed by entities such as Vanguard Capital Management and Vanguard Portfolio Management:
curl -s -H "X-API-Key: YOUR_API_KEY" "https://api.xfinlink.com/v1/managers?search=vanguard&limit=1000"{
"data": [
{"manager_id": 947529, "manager_name": "VANGUARD ADVISERS INC", "manager_type": null, "country": null, "cik": "0000947529", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 1680208, "manager_name": "VANGUARD ASSET MANAGEMENT, Ltd", "manager_type": null, "country": null, "cik": "0001680208", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 2100119, "manager_name": "VANGUARD CAPITAL MANAGEMENT LLC", "manager_type": null, "country": null, "cik": "0002100119", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 1730578, "manager_name": "Vanguard Capital Wealth Advisors", "manager_type": null, "country": null, "cik": "0001730578", "first_quarter": "2017-12-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 933478, "manager_name": "VANGUARD FIDUCIARY TRUST CO", "manager_type": null, "country": null, "cik": "0000933478", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 1811242, "manager_name": "Vanguard Global Advisers, LLC", "manager_type": null, "country": null, "cik": "0001811242", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 102909, "manager_name": "VANGUARD GROUP INC", "manager_type": null, "country": null, "cik": "0000102909", "first_quarter": "2013-06-30", "last_quarter": "2025-12-31", "id_regime": "filing"},
{"manager_id": 1550100, "manager_name": "Vanguard Investments Australia, Ltd.", "manager_type": null, "country": null, "cik": "0001550100", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 217448, "manager_name": "VANGUARD MARKETING CORPORATION", "manager_type": null, "country": null, "cik": "0000217448", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 1984256, "manager_name": "Vanguard National Trust Co", "manager_type": null, "country": null, "cik": "0001984256", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 1767306, "manager_name": "Vanguard Personalized Indexing Management, LLC", "manager_type": null, "country": null, "cik": "0001767306", "first_quarter": "2022-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"},
{"manager_id": 2100121, "manager_name": "VANGUARD PORTFOLIO MANAGEMENT LLC", "manager_type": null, "country": null, "cik": "0002100121", "first_quarter": "2026-03-31", "last_quarter": "2026-06-30", "id_regime": "filing"}
],
"count": 12,
"next_cursor": null,
...
}Quarters before the historical edge
first_quarter and last_quarter span the filing-era series, which can start before archive_edge. Holdings requests answer quarters on or before archive_edge from the historical era by default. To read a filing-era manager's own filings for those quarters, pass source=filing to Manager holdings.
Historical managers
A manager that appears only in quarters before 2013 is not in search results. Read its manager_id from a historical holdings row, where manager_id_space reads archive, and pass it to Manager holdings. The manager object there carries id_regime: "historical", manager_type, country and manager_number.
Request examples
Find Berkshire Hathaway's filer id:
import xfinlink as xfl
xfl.set_api_key("YOUR_API_KEY")
df = xfl.managers("berkshire hathaway")
print(df.to_string(index=False))curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://api.xfinlink.com/v1/managers?search=berkshire%20hathaway"What is Berkshire Hathaway's institutional manager id for its 13F filings? manager_id manager_name manager_type country cik first_quarter last_quarter id_regime
1067983 Berkshire Hathaway Inc None None 0001067983 2013-06-30 2026-06-30 filing{
"data": [
{
"manager_id": 1067983,
"manager_name": "Berkshire Hathaway Inc",
"manager_type": null,
"country": null,
"cik": "0001067983",
"first_quarter": "2013-06-30",
"last_quarter": "2026-06-30",
"id_regime": "filing"
}
],
"count": 1,
"next_cursor": null,
"warnings": [
"Search covers managers that have filed Form 13F from 2013 onward. Managers that appear only in earlier quarters are not searchable by name; their holdings are served by id at /v1/managers/{manager_id}/holdings."
],
"meta": {
"id_regimes": [
"filing"
],
"knowledge_time": "2026-09-26T18:53:54Z",
"freshness": [
{
"dataset": "institutional_filings",
"through": "2026-06-30",
"promoted_at": "2026-09-25T15:35:44Z"
}
],
"has_more": false,
"next_cursor": null
}
}{"tool": "search_managers", "arguments": {"search": "berkshire hathaway"}}
{
"data": [
{
"manager_id": 1067983,
"manager_name": "Berkshire Hathaway Inc",
"manager_type": null,
"country": null,
"cik": "0001067983",
"first_quarter": "2013-06-30",
"last_quarter": "2026-06-30",
"id_regime": "filing"
}
],
"count": 1,
"next_cursor": null,
"warnings": [
"Search covers managers that have filed Form 13F from 2013 onward. Managers that appear only in earlier quarters are not searchable by name; their holdings are served by id at /v1/managers/{manager_id}/holdings."
],
"meta": {
"id_regimes": ["filing"],
"knowledge_time": "2026-09-26T18:53:54Z",
"freshness": [
{"dataset": "institutional_filings", "through": "2026-06-30", "promoted_at": "2026-09-25T15:35:44Z"}
],
"has_more": false,
"next_cursor": null
}
}Was this page helpful?
Thank you for helping improve xfinlink documentation.
- Need help? Get in touch.
- Building with an LLM? Read llms.txt.
- Using Claude or ChatGPT? Connect the MCP server.