Endpoints
/v1/audit-fees
https://secfeedapi.com/v1/audit-feesAudit, audit-related, tax and other fees by year.
| Parameter | Type | Description | Example |
|---|---|---|---|
ticker | string | Company ticker. Use either ticker or cik. | NVDA |
cik | string | Company CIK, or a ticker. | 789019 |
accessionNo | string | A specific DEF 14A accession number instead of the latest one. | 0001045810-26-000036 |
- Row labels are returned exactly as the company wrote them (Audit Fees, Audit-Related Fees, Total, TOTAL and so on), so normalize them before comparing companies.
- When the table's header gives fiscal years, each row maps year to amount. When it does not, the amounts come back as a list in the table's column order (usually most recent first).
- unit is millions only when the table says so. Many tables state amounts in thousands in a footnote, which is not detected; check the size of the numbers.
Request examples
Every response below is real output from the API, trimmed to the first records.
NVIDIA's fees by fiscal year
Each label maps fiscal year to dollars.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=NVDA"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/audit-fees",
params={'ticker': 'NVDA'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 1045810,
"accessionNo": "0001045810-26-000036",
"fees": {
"Audit Fees": {
"2026": 10166400.0,
"2025": 8067106.0
},
"Audit Related Fees": {
"2026": 1716820.0,
"2025": 724806.0
},
"Tax Fees": {
"2026": 1076103.0,
"2025": 856439.0
},
"All Other Fees": {
"2026": 401999.0,
"2025": 354000.0
},
"Total Fees": {
"2026": 13361322.0,
"2025": 10002351.0
}
},
"unit": null
}Microsoft's fees
Note the label Total instead of Total Fees: labels follow the filing.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=MSFT"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/audit-fees",
params={'ticker': 'MSFT'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 789019,
"accessionNo": "0001193125-25-245150",
"fees": {
"Audit Fees": {
"2025": 53880000.0,
"2024": 56280000.0
},
"Audit-Related Fees": {
"2025": 19470000.0,
"2024": 18643000.0
},
"Tax Fees": {
"2025": 5105000.0,
"2024": 6334000.0
},
"All Other Fees": {
"2025": 10000.0,
"2024": 10000.0
},
"Total": {
"2025": 78465000.0,
"2024": 81267000.0
}
},
"unit": null
}A table without year headers
Amounts are plain lists in column order, and here they are in thousands even though unit is null.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=KO"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/audit-fees",
params={'ticker': 'KO'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 21344,
"accessionNo": "0001104659-26-028215",
"fees": {
"Audit Fees": [
30587.0,
32104.0
],
"Audit-Related Fees": [
4834.0,
5078.0
],
"Tax Fees": [
6760.0,
8224.0
],
"All Other Fees": [
85.0,
162.0
],
"TOTAL": [
42266.0,
45568.0
]
},
"unit": null
}Response fields
| Field | Type | Meaning |
|---|---|---|
cik | integer | Company CIK. |
accessionNo | string | Accession number of the DEF 14A the table came from. |
fees | object | One key per fee row, using the label as filed. |
fees.<label> | object or array | Either {fiscal year: amount} or a list of amounts in column order. |
unit | string or null | millions when the table states it; otherwise null (amounts as printed). |
Fee categories defined by SEC rules
| Category | Covers |
|---|---|
| Audit fees | The annual audit, quarterly reviews and statutory audits |
| Audit-related fees | Assurance work tied to the audit, such as benefit plan audits and due diligence |
| Tax fees | Tax compliance, advice and planning |
| All other fees | Any other services from the principal accountant |
How to
How do I compare audit fees across companies?
Call once per ticker, normalize the labels (lowercase, drop punctuation and the word fees), and check the size of the amounts for thousands.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=MSFT"
How do I get the total paid to the auditor?
Use the row labelled Total, Total Fees or TOTAL, or add the category rows yourself.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=NVDA"
How do I get fees from an earlier proxy?
Find older DEF 14A accession numbers with /v1/filings and pass accessionNo.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/filings?query=ticker:MSFT%2520AND%2520formType:%2522DEF%252014A%2522&size=5"
Why are the amounts a list instead of years?
The table's header row did not contain recognizable years. The list follows the column order, which is usually the most recent year first; confirm against the proxy.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=KO"
How do I find out who the auditor is?
Use /v1/auditor for the firm name, location and PCAOB ID.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/auditor?ticker=NVDA"
How do I measure non-audit work?
Add the tax fees and all other fees rows and divide by the total.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?ticker=NVDA"
Can I pass a CIK?
Yes, use cik. It also accepts a ticker.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/audit-fees?cik=1045810"
Why do some companies return a 400?
The company has no DEF 14A or its fee table has an unusual layout. Read the section with full-text search instead.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/full-text-search?query=%2522audit-related%2520fees%2522&formTypes=DEF%252014A"
Errors
- 400 "unknown ticker X" for an unknown ticker (also when neither ticker nor cik is given).
- 400 "no audit fee table found" when no table matches.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.