Visa Grep API
Look up any employer's H-1B, green card and E-Verify record as JSON, with the citation behind every number — free with a key.
Get an API key Read the quickstart
- Base URL
https://visagrep.com/api/v1- Format
- JSON over HTTPS
- Limits
- 1,000 requests a day and 60 a minute, per account
curl "https://visagrep.com/api/v1/companies/AMAZONCOMSERVICES" \
-H "Authorization: Bearer $VISAGREP_API_KEY"
{
"key": "AMAZONCOMSERVICES",
"name": "Amazon.com Services LLC",
"answer": "Yes — Amazon.com Services LLC sponsors H-1B visas.",
"citations": [
"employers 11317",
"employer_names",
"employer_feins"
]
}
Quickstart
Sign in and make a key
Sign in with Google on your account page and make a key. You'll see it once, so keep it in an environment variable, where these examples read it:
export VISAGREP_API_KEY="vg_..."Make your first request
Search for a company by name:
curl "https://visagrep.com/api/v1/search?q=Amazon.com+Services+LLC" \ -H "Authorization: Bearer $VISAGREP_API_KEY"Read the response
Every response is JSON.
statesays what happened andnext_stepwhat to do next. A search that found the company carries itskey: ask for the whole record with it, atGET /api/v1/companies/{key}.{ "state": "answered", "query": "Amazon.com Services LLC", "company": { "key": "AMAZONCOMSERVICES", "name": "Amazon.com Services LLC", "states": [ "WA", "VA", "MA", "NC", "NY" ], "filings": 114509, "url": "/employer/AMAZONCOMSERVICES/" }, "next_step": "Call get_company with key AMAZONCOMSERVICES for its record." }
Authentication
Every request sends your key in the Authorization header, as a bearer token:
Authorization: Bearer vg_...
- A key is
vg_and 43 letters and digits. An account can have 5 at once, and they share its limits. - You see a key once, when you make it: we can't show it to you again. What we store about it is in our Privacy Policy.
- Revoke a key on your account page and it stops working at once.
- Keep it out of URLs, which get logged, and out of code you share: read it from an environment variable, as the examples here do.
A request without a key, or with a malformed or revoked one, gets a 401.
Rate limits
Limits are per account, not per key: the API and the hosted MCP server count together, and a second key buys no more requests.
| Limit | Value |
|---|---|
| Requests per account, per UTC day | 1,000 |
| Requests per account, per minute | 60 |
| Live keys per account | 5 |
Response headers
A response to a request with a valid key says where you stand:
| Header | What it says |
|---|---|
X-RateLimit-Limit | Your account's daily limit: 1,000. |
X-RateLimit-Remaining | What's left of today's requests, after this one. |
X-RateLimit-Reset | When today's count starts again: the next midnight UTC, in epoch seconds. |
Over a limit
The API answers 429, with a Retry-After header: the seconds to wait, to the end of the minute or to midnight UTC. A refused request isn't counted. This one is real, one request past the minute's limit:
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 940
X-RateLimit-Reset: 1790812800
Retry-After: 60
{
"error": "This account is over 60 requests a minute: try again in 60 seconds."
}
Errors
An error is JSON with one field, error: a sentence that says what went wrong and what to do. The status says which kind:
| Status | Meaning | Example body |
|---|---|---|
| 400 Bad Request | The query is longer than 200 characters. | {"error": "That's longer than a company name. Type just the name, in 200 characters or fewer."} |
| 401 Unauthorized | The key is missing, isn't a Visa Grep key, or was revoked. | {"error": "This API needs a key: sign in at /account/ to make one, free, and send it as Authorization: Bearer vg_..."} |
| 404 Not Found | No company has that key, or there's no such route. | {"error": "No company has the key 'amazoncomservices'. Keys look like GOOGLE: find one with search_companies."} |
| 405 Method Not Allowed | A method other than GET or HEAD. | {"error": "GET or HEAD only."} |
| 429 Too Many Requests | Over the minute's or the day's limit. Retry-After says when to try again. | {"error": "This account is over 60 requests a minute: try again in 60 seconds."} |
| 500 Internal Server Error | Something failed on our side. Try again. | {"error": "Something went wrong. Try that again."} |
A question about someone's chances isn't an error: a search answers it with 200 and "state": "refused", and says why.
Endpoints
Three routes, all GET and read-only, under https://visagrep.com/api/v1. A company's record is cached for five minutes and a search not at all. A query is 200 characters at most, and we don't log it.
Search companies
GET /api/v1/search
Finds a company by name, with the search box's own rules: extra words are fine, a brand that files under another name is found by it, and a question about someone's chances gets a refusal, not a guess.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | Required | The company's name, as someone typed it. 200 characters at most. |
Request
curl "https://visagrep.com/api/v1/search?q=Amazon.com+Services+LLC" \
-H "Authorization: Bearer $VISAGREP_API_KEY"
import os
import requests
response = requests.get(
"https://visagrep.com/api/v1/search",
params={"q": "Amazon.com Services LLC"},
headers={"Authorization": f"Bearer {os.environ['VISAGREP_API_KEY']}"},
timeout=30,
)
print(response.json())
const url = new URL("https://visagrep.com/api/v1/search");
url.searchParams.set("q", "Amazon.com Services LLC");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.VISAGREP_API_KEY}` },
});
console.log(await response.json());
Response
{
"state": "answered",
"query": "Amazon.com Services LLC",
"company": {
"key": "AMAZONCOMSERVICES",
"name": "Amazon.com Services LLC",
"states": [
"WA",
"VA",
"MA",
"NC",
"NY"
],
"filings": 114509,
"url": "/employer/AMAZONCOMSERVICES/"
},
"next_step": "Call get_company with key AMAZONCOMSERVICES for its record."
}
state is answered, with the company; ambiguous, with candidates in order of DOL filings, which is not a ranking; no_match; refused; or nothing_to_search.
Get a company
GET /api/v1/companies/{key}
One company's whole record, as its page shows it: the answer, the Department of Labor's and USCIS's years kept apart, salaries, jobs, green cards, E-Verify and the Sponsorship score in words, with the citation behind every block.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | Required | The company's key, from a search: AMAZONCOMSERVICES here. |
since | query | integer | Optional | The first fiscal year of the year tables, 2009 to 2026. Without it they start at FY2020, and a year outside that range is ignored. |
Request
curl "https://visagrep.com/api/v1/companies/AMAZONCOMSERVICES" \
-H "Authorization: Bearer $VISAGREP_API_KEY"
import os
import requests
response = requests.get(
"https://visagrep.com/api/v1/companies/AMAZONCOMSERVICES",
headers={"Authorization": f"Bearer {os.environ['VISAGREP_API_KEY']}"},
timeout=30,
)
print(response.json())
const url = new URL("https://visagrep.com/api/v1/companies/AMAZONCOMSERVICES");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.VISAGREP_API_KEY}` },
});
console.log(await response.json());
Response
{
"key": "AMAZONCOMSERVICES",
"name": "Amazon.com Services LLC",
"url": "/employer/AMAZONCOMSERVICES/",
"answer": "Yes — Amazon.com Services LLC sponsors H-1B visas.",
"answer_detail": "The U.S. Department of Labor (DOL) certified 15,195 of its H-1B filings in FY2025 and 13,712 so far in FY2026 (through June 30, 2026).",
"citations": [
"employers 11317",
"employer_names",
"employer_feins"
]
}
Trimmed to 6 of its 20 fields, and 3 of its 20 citations.
Full response
Every field, as this server answered for AMAZONCOMSERVICES when it started.
{
"key": "AMAZONCOMSERVICES",
"name": "Amazon.com Services LLC",
"url": "/employer/AMAZONCOMSERVICES/",
"answer": "Yes — Amazon.com Services LLC sponsors H-1B visas.",
"answer_detail": "The U.S. Department of Labor (DOL) certified 15,195 of its H-1B filings in FY2025 and 13,712 so far in FY2026 (through June 30, 2026).",
"company": {
"states": [
"WA",
"VA",
"MA",
"NC",
"NY"
],
"other_names": [
"AMAZON.COM SERVICES, INC.",
"AMAZON.COM SERVICES LLC.",
"AMAZON.COM SERVICES, INC",
"Amazon.com Services, LLC",
"2201 WESTLAKE AVENUE"
],
"address": "Seattle, WA 98121",
"industry": "Retail Trade",
"naics": "454110",
"employees": 647500,
"employees_as_of": "FY2024",
"feins": [
"20-8424306",
"71-0938319",
"82-0544687",
"91-1646860"
],
"on_record": "FY2020–FY2026",
"latest_decision": "2026-06-30"
},
"score": {
"state": "scored",
"points": 10,
"out_of": 10,
"window": "FY2020–FY2025",
"rubric_version": 1,
"computed": "2026-09-15",
"rules": "/about/#score",
"approval_rate": 0.9817,
"approval_rate_text": "98.2%",
"new_petitions_decided": 14009,
"entry_level_share": 0.6852,
"entry_level_share_text": "69%",
"filings_with_wage_level": 40828,
"parts": [
{
"part": "Recent approvals",
"points": 3,
"out_of": 3,
"reads": "5,120 new H-1B petitions approved by USCIS in FY2022"
},
{
"part": "Entry-level hiring",
"points": 3,
"out_of": 3,
"reads": "69% of 40,828 H-1B filings with a wage level were entry level (I or II), FY2023–FY2025"
},
{
"part": "Files every year",
"points": 2,
"out_of": 2,
"reads": "Certified H-1B filings in 3 of the 3 years FY2023–FY2025"
},
{
"part": "Approval rate",
"points": 2,
"out_of": 2,
"reads": "98.2% of 14,009 new petitions approved, FY2020–FY2022"
}
]
},
"flags": [
{
"flag": "H-1B dependent",
"value": "No",
"meaning": "On most of its certified filings in FY2023–FY2025 that answered the question, the company said it is not H-1B dependent. A dependent employer has a large share of H-1B workers on staff and makes extra promises about recruiting and not displacing U.S. workers.",
"how": "The employer answered Yes to H1B_DEPENDENT on at least half of the certified LCAs where it answered the question, in FY2023-FY2025. false means it answered and Yes was under half; NULL means no certified case answered the question (E-3 and H-1B1 filings answer N/A). The floor is there because a single Yes among thousands of No answers is a tick in the wrong box: it would badge 979 employers that said Yes once, one of them on 1 filing of 2,760; the 473 that answered only once or twice still are. A dependent employer is not a worse employer: the answer is a statutory test on the share of H-1B workers on staff, not a finding."
},
{
"flag": "Willful violator",
"value": "No",
"meaning": "The company's answers on its filings in FY2020–FY2025 don't show a repeated yes. Employers state on each filing whether DOL has found them to be a willful violator in the five years before; this is the company's own answer, not a DOL record.",
"how": "The employer answered Yes to WILLFUL_VIOLATOR on at least two LCAs in FY2020-FY2025, certified or not, in at least two fiscal years, and in at least one of those years Yes was half or more of what it answered. The floor is there because a single Yes among thousands of No answers is a tick in the wrong box: 505 employers answer Yes exactly once and never twice, and the two employers with the most Yes answers say it on one filing in two thousand. false means the employer answered and did not meet that bar; NULL means it never answered. THIS IS THE FILER'S OWN ATTESTATION ON THE LCA, NOT A DOL FINDING. The authoritative source is the DOL published debarment list, which this project does not yet mirror - it is a follow-up catalog entry - so nothing here has been checked against it."
},
{
"flag": "Cap-exempt",
"value": "No sign",
"meaning": "Nothing in its name or industry code suggests a college or university. That doesn't make it subject to the cap: nonprofit research organizations and affiliated hospitals can be exempt too, and we can't detect them.",
"how": "INFERRED, not a determination. true when an FY2023+ LCA carries a NAICS code beginning 6112 or 6113 (junior colleges, colleges and universities) or a raw spelling of the employer's name contains the word UNIVERSITY or COLLEGE. Never false: the column is NULL when neither signal is present, because the absence of a signal is not evidence that an employer is cap-subject. Non-profit research organisations and affiliated hospitals are cap-exempt and both tests miss them. Only USCIS decides cap exemption, petition by petition."
}
],
"dol": {
"about": "Labor Condition Applications (LCAs) filed with the Department of Labor, by fiscal year. filed, denied and withdrawn count every LCA, E-3 and H-1B1 included; certified_h1b counts certified H-1B LCAs only. entry_level is how many certified H-1B LCAs stating a wage level (wage_level_stated) were level I or II.",
"years": [
{
"fy": 2020,
"filed": 12004,
"certified_h1b": 11643,
"denied": 4,
"withdrawn": 79,
"entry_level": 9405,
"wage_level_stated": 11335,
"entry_level_share_text": "83%"
},
{
"fy": 2021,
"filed": 8749,
"certified_h1b": 8434,
"denied": 13,
"withdrawn": 503,
"entry_level": 5878,
"wage_level_stated": 7653,
"entry_level_share_text": "77%"
},
{
"fy": 2022,
"filed": 16223,
"certified_h1b": 15502,
"denied": 5,
"withdrawn": 976,
"entry_level": 11576,
"wage_level_stated": 15312,
"entry_level_share_text": "76%"
},
{
"fy": 2023,
"filed": 13206,
"certified_h1b": 12862,
"denied": 3,
"withdrawn": 167,
"entry_level": 8926,
"wage_level_stated": 12719,
"entry_level_share_text": "70%"
},
{
"fy": 2024,
"filed": 14606,
"certified_h1b": 14249,
"denied": 5,
"withdrawn": 17,
"entry_level": 9192,
"wage_level_stated": 13901,
"entry_level_share_text": "66%"
},
{
"fy": 2025,
"filed": 15528,
"certified_h1b": 15195,
"denied": 3,
"withdrawn": 32,
"entry_level": 9857,
"wage_level_stated": 14208,
"entry_level_share_text": "69%"
},
{
"fy": 2026,
"in_progress": true,
"filed": 13930,
"certified_h1b": 13712,
"denied": 2,
"withdrawn": 6,
"entry_level": 7030,
"wage_level_stated": 10191,
"entry_level_share_text": "69%"
}
]
},
"uscis": {
"about": "H-1B petitions USCIS decided, by fiscal year: new petitions, and extensions or transfers, counted separately.",
"years": [
{
"fy": 2020,
"new_approved": 3783,
"new_denied": 94,
"new_approval_rate_text": "97.6%",
"extensions_approved": 7627,
"extensions_denied": 119
},
{
"fy": 2021,
"new_approved": 4850,
"new_denied": 95,
"new_approval_rate_text": "98.1%",
"extensions_approved": 8097,
"extensions_denied": 80
},
{
"fy": 2022,
"new_approved": 5120,
"new_denied": 67,
"new_approval_rate_text": "98.7%",
"extensions_approved": 13445,
"extensions_denied": 226
},
{
"fy": 2023,
"partial": true,
"new_approved": 259,
"new_denied": 14,
"new_approval_rate_text": "94.9%",
"extensions_approved": 4319,
"extensions_denied": 113
}
]
},
"green_cards": {
"about": "PERM labor certifications, the first step of most employer-sponsored green cards, filed with the Department of Labor, by fiscal year.",
"years": [
{
"fy": 2020,
"filed": 2886,
"certified": 2864,
"denied": 3,
"withdrawn": 19
},
{
"fy": 2021,
"filed": 4675,
"certified": 4639,
"denied": 2,
"withdrawn": 34
},
{
"fy": 2022,
"filed": 4921,
"certified": 4834,
"denied": 14,
"withdrawn": 73
},
{
"fy": 2023,
"filed": 4866,
"certified": 4615,
"denied": 8,
"withdrawn": 243
},
{
"fy": 2024,
"filed": 2151,
"certified": 2129,
"denied": 8,
"withdrawn": 14
},
{
"fy": 2025,
"filed": 12,
"certified": 1,
"denied": 0,
"withdrawn": 11
},
{
"fy": 2026,
"in_progress": true,
"filed": 108,
"certified": 56,
"denied": 0,
"withdrawn": 52
}
],
"detail_about": "Across all its PERM filings since FY2020, whatever the outcome. DOL's newer PERM form has no citizenship or education, so countries and education cover filings on the older one.",
"titles": [
{
"title": "Software Development Engineer II",
"filings": 9373
},
{
"title": "Software Development Engineer III",
"filings": 1240
},
{
"title": "Business Intelligence Engineer II",
"filings": 871
},
{
"title": "Applied Scientist II",
"filings": 536
},
{
"title": "Quality Assurance Engineer II",
"filings": 508
},
{
"title": "Data Engineer II",
"filings": 354
},
{
"title": "Senior Program Manager",
"filings": 319
},
{
"title": "Senior Product Manager",
"filings": 281
}
],
"countries": [
{
"country": "India",
"filings": 11639
},
{
"country": "China",
"filings": 5021
},
{
"country": "Canada",
"filings": 638
},
{
"country": "Taiwan",
"filings": 244
},
{
"country": "Mexico",
"filings": 203
},
{
"country": "Australia",
"filings": 153
},
{
"country": "South Korea",
"filings": 135
},
{
"country": "Brazil",
"filings": 88
}
],
"education": [
{
"education": "Master's",
"filings": 11315
},
{
"education": "Bachelor's",
"filings": 7870
},
{
"education": "Doctorate",
"filings": 282
},
{
"education": "No minimum",
"filings": 21
},
{
"education": "Other",
"filings": 11
}
]
},
"salaries": {
"about": "Yearly pay offered on certified full-time H-1B filings: the median, and the middle half from p25 to p75. Hourly, weekly and monthly pay is converted to a year; amounts under $15,000 or over $1,000,000 are left out.",
"years": [
{
"fy": 2020,
"filings": 11633,
"median": 140900,
"p25": 122000,
"p75": 154000
},
{
"fy": 2021,
"filings": 8429,
"median": 130000,
"p25": 103000,
"p75": 150000
},
{
"fy": 2022,
"filings": 15484,
"median": 139370,
"p25": 105000,
"p75": 160000
},
{
"fy": 2023,
"filings": 12857,
"median": 142900,
"p25": 114400,
"p75": 173300
},
{
"fy": 2024,
"filings": 14245,
"median": 152581,
"p25": 128502,
"p75": 179700
},
{
"fy": 2025,
"filings": 15173,
"median": 154400,
"p25": 130200,
"p75": 180600
},
{
"fy": 2026,
"filings": 13710,
"median": 159000,
"p25": 133100,
"p75": 182270
}
]
},
"jobs": {
"about": "Certified H-1B filings since FY2023, with the median offered salary.",
"titles": [
{
"title": "Software Development Engineer II",
"filings": 7085,
"median": 167100,
"typical_level": "II (entry)"
},
{
"title": "Software Development Engineer I",
"filings": 3886,
"median": 129000,
"typical_level": "I (entry)"
},
{
"title": "Software Dev Engineer II",
"filings": 3448,
"median": 173900,
"typical_level": "II (entry)"
},
{
"title": "Software Development Engineer III",
"filings": 2327,
"median": 202000,
"typical_level": "III"
},
{
"title": "Software Dev Engineer I",
"filings": 2006,
"median": 129000,
"typical_level": "I (entry)"
},
{
"title": "Applied Scientist II",
"filings": 1841,
"median": 175500,
"typical_level": "II (entry)"
},
{
"title": "Business Intelligence Engineer II",
"filings": 1605,
"median": 129100,
"typical_level": "II (entry)"
},
{
"title": "Manager III, Software Development",
"filings": 1581,
"median": 207690,
"typical_level": "II (entry)"
},
{
"title": "Data Engineer II",
"filings": 1170,
"median": 149800,
"typical_level": "II (entry)"
},
{
"title": "Technical Program Manager III",
"filings": 1049,
"median": 171000,
"typical_level": "II (entry)"
}
],
"locations": [
{
"place": "Seattle, WA",
"filings": 19230,
"median": 154400
},
{
"place": "Bellevue, WA",
"filings": 7973,
"median": 150000
},
{
"place": "Sunnyvale, CA",
"filings": 4131,
"median": 182000
},
{
"place": "Austin, TX",
"filings": 3901,
"median": 145000
},
{
"place": "New York, NY",
"filings": 3321,
"median": 160377
},
{
"place": "Arlington, VA",
"filings": 1789,
"median": 138798
},
{
"place": "Santa Clara, CA",
"filings": 1197,
"median": 184662
},
{
"place": "San Francisco, CA",
"filings": 1108,
"median": 179400
},
{
"place": "Dallas, TX",
"filings": 963,
"median": 139100
},
{
"place": "Nashville, TN",
"filings": 925,
"median": 114000
}
],
"occupations": [
{
"occupation": "Software Developers",
"soc": "15-1252",
"filings": 22792,
"median": 160000
},
{
"occupation": "Business Intelligence Analysts",
"soc": "15-2051",
"filings": 5925,
"median": 136000
},
{
"occupation": "Computer and Information Systems Managers",
"soc": "11-3021",
"filings": 3959,
"median": 200158
},
{
"occupation": "Information Technology Project Managers",
"soc": "15-1299",
"filings": 3099,
"median": 163363
},
{
"occupation": "Operations Research Analysts",
"soc": "15-2031",
"filings": 2894,
"median": 120230
},
{
"occupation": "Computer and Information Research Scientists",
"soc": "15-1221",
"filings": 2758,
"median": 176986
}
]
},
"wage_levels": {
"about": "Certified H-1B filings since FY2023 by wage level; I and II are entry level.",
"levels": [
{
"level": "I (entry)",
"filings": 10172,
"share_text": "20%"
},
{
"level": "II (entry)",
"filings": 24833,
"share_text": "49%"
},
{
"level": "III",
"filings": 13027,
"share_text": "26%"
},
{
"level": "IV",
"filings": 2987,
"share_text": "6%"
}
],
"not_stated": 4999
},
"filing_types": {
"about": "What its certified H-1B filings since FY2023 were for, as marked on each LCA, in worker positions: one filing can cover several.",
"types": [
{
"type": "New employment",
"meaning": "New H-1B workers joining the company",
"positions": 99386,
"share_text": "39%"
},
{
"type": "Continuation of existing employment",
"meaning": "Extensions for current H-1B workers",
"positions": 87876,
"share_text": "34%"
},
{
"type": "Change of employer",
"meaning": "Transfers in: H-1B workers moving from another employer",
"positions": 22258,
"share_text": "9%"
},
{
"type": "Change in previous employment",
"meaning": "Changes to a current H-1B worker's job",
"positions": 3216,
"share_text": "1%"
},
{
"type": "Concurrent employment",
"meaning": "A second H-1B job alongside one elsewhere",
"positions": 11,
"share_text": "<1%"
},
{
"type": "Amended petition",
"meaning": "Amendments to a petition already filed",
"positions": 42148,
"share_text": "17%"
}
],
"e3_filings": 685,
"h1b1_filings": 459
},
"everify": {
"listed": false,
"list_date": "2018-12-31",
"listings": 0,
"first_listings": [],
"why_it_matters": "Why it matters: employers must be enrolled in E-Verify to employ F-1 students on the STEM OPT extension (8 CFR 214.2(f)(10)(ii)(C)).",
"caveat": "This list is from December 31, 2018, and it's the only one USCIS has published. It shows who was enrolled on that date: a company that enrolled later isn't on it, so not being on the list tells you nothing."
},
"related": {
"count": 8,
"about": "Companies that share an Employer ID (FEIN) with this one. They file separately, and nothing in this record counts their filings.",
"companies": [
{
"key": "AMAZONWEBSERVICES",
"name": "Amazon Web Services, Inc.",
"filings": 27776
},
{
"key": "AMAZONDEVELOPMENTCENTERUS",
"name": "Amazon Development Center U.S., Inc.",
"filings": 13945
},
{
"key": "ZAPPOSCOM",
"name": "Zappos.com LLC",
"filings": 140
},
{
"key": "AMAZONDEVCENTERUS",
"name": "Amazon Dev Center U.S., Inc.",
"filings": 44
},
{
"key": "TECHCORPSOLUTIONS",
"name": "TechCorp Solutions Inc.",
"filings": 21
},
{
"key": "AMAZONSERVICES",
"name": "AMAZON SERVICES LLC",
"filings": 13
},
{
"key": "AMAZONFULFILLMENTCENTERBF14",
"name": "Amazon Fulfillment Center (BF14)",
"filings": 2
},
{
"key": "ZAPPOS",
"name": "Zappos",
"filings": 2
}
]
},
"notes": [
"Department of Labor data runs through June 30, 2026; USCIS approval data through FY2022, with FY2023 partial; the E-Verify list is from December 31, 2018.",
"These numbers come from USCIS, which decides H-1B petitions. They count different things from Department of Labor filings, so we never add the two together.",
"FY2026 is in progress: data runs through June 30, 2026.",
"FY2023 is incomplete: USCIS's last data release covers only part of that year (38,315 new approvals nationwide, against 138,381 in FY2022).",
"USCIS also has records for this company in FY2018–FY2019: 3,112 new H-1B petitions approved. Call get_company with since=2018 for those years."
],
"sources": [
"H-1B and green card filings: U.S. Department of Labor, Office of Foreign Labor Certification disclosure data, FY2020 through June 30, 2026.",
"H-1B approvals: USCIS H-1B Employer Data Hub, complete through FY2022; FY2023 is partial.",
"E-Verify: USCIS's list of E-Verify employers as of December 31, 2018.",
"USCIS approvals are matched to this company by exact name (1 USCIS name). The last four digits of the Employer ID agree."
],
"citations": [
"employers 11317",
"employer_names",
"employer_feins",
"hub_employers 11317",
"employer_scores 11317",
"rubric 1/*",
"employer_years 11317/2020..2025",
"employer_years 11317/2020..2026",
"employer_years 11317/2018..2019",
"employer_feins 11317",
"employer_salaries 11317",
"employer_titles 11317",
"employer_worksites 11317",
"employer_occupations 11317",
"employer_mix 11317",
"employer_perm_titles 11317",
"employer_perm_countries 11317",
"employer_perm_education 11317",
"employer_details 11317",
"employer_names 11317"
]
}
Response fields
Counts and dollar amounts are whole numbers. A share or a rate also comes as text, in a field ending _text, to quote as it is rather than work out again.
key,name,url- The company's key, the name it files under, and its page here.
answer,answer_detail- The sentence its page leads with, and the counts behind it.
company- Where it is, its industry and headcount, its Employer IDs (FEINs) and its years on record.
score- The Sponsorship score and its four parts, each in words, or why there isn't one.
flags- H-1B dependent, willful violator and cap-exempt: each a word, what it means and how it's worked out.
dol- Labor Condition Applications filed with the Department of Labor, by fiscal year.
uscis- H-1B petitions USCIS approved and denied, by fiscal year. Never added to dol's numbers.
green_cards- PERM filings by fiscal year, the first step of most employer green cards, with their job titles, countries and education.
salaries,jobs,wage_levels,filing_types- Pay offered by year; job titles, places and occupations; wage levels; and what the filings were for.
everify- Whether it's on USCIS's E-Verify list, and that list's date.
related- Companies that share an Employer ID with it. They file separately, and none of their filings are counted here.
notes,sources,citations- The caveats that go with the numbers, the agencies and vintages, and the stored row behind every block.
Search the rules
GET /api/v1/regulations
Full-text search over the H-1B rules Visa Grep mirrors: the regulations, the statute, the USCIS Policy Manual and agency guidance. Up to five passages, each cited to the paragraph, with its document's edition.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | Required | What to look for, in plain words. 200 characters at most. |
Request
curl "https://visagrep.com/api/v1/regulations?q=cap+exempt" \
-H "Authorization: Bearer $VISAGREP_API_KEY"
import os
import requests
response = requests.get(
"https://visagrep.com/api/v1/regulations",
params={"q": "cap exempt"},
headers={"Authorization": f"Bearer {os.environ['VISAGREP_API_KEY']}"},
timeout=30,
)
print(response.json())
const url = new URL("https://visagrep.com/api/v1/regulations");
url.searchParams.set("q", "cap exempt");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.VISAGREP_API_KEY}` },
});
console.log(await response.json());
Response
{
"query": "cap exempt",
"hits": [
{
"citation": "8 CFR 214.2(h)(8)(iii)(F)(5)",
"document": "8 CFR 214.2 Special requirements for admission, extension, and maintenance of status",
"edition": "2025-01-01",
"heading": "Special requirements for admission, extension, and maintenance of status > Temporary employees > Numerical limits > H-1B numerical limitations > Cap exemptions under sections 214(g)(5)(A) and (B) of the Act",
"snippet": "cap-exempt employment ceases, and if the alien is not the beneficiary of a new cap-exempt petition, then the alien will be subject to the cap if not previously counted within ... year period of authorized admission to which the cap-exempt employment applied. If cap-exempt employment converts to cap-subject employment subject to the numerical limitations in section",
"url": "/policy/#doc-cfr_8_214_2"
}
],
"note": "Quote the citation with the passage. Finding the rule is not legal advice."
}
Trimmed to the first of 5 passages.
Full response
All 5 passages, as this server answered when it started.
{
"query": "cap exempt",
"hits": [
{
"citation": "8 CFR 214.2(h)(8)(iii)(F)(5)",
"document": "8 CFR 214.2 Special requirements for admission, extension, and maintenance of status",
"edition": "2025-01-01",
"heading": "Special requirements for admission, extension, and maintenance of status > Temporary employees > Numerical limits > H-1B numerical limitations > Cap exemptions under sections 214(g)(5)(A) and (B) of the Act",
"snippet": "cap-exempt employment ceases, and if the alien is not the beneficiary of a new cap-exempt petition, then the alien will be subject to the cap if not previously counted within ... year period of authorized admission to which the cap-exempt employment applied. If cap-exempt employment converts to cap-subject employment subject to the numerical limitations in section",
"url": "/policy/#doc-cfr_8_214_2"
},
{
"citation": "AFM 31.3, p. 39",
"document": "USCIS Adjudicator's Field Manual Chapter 31, Petitions for Temporary Workers (H Classifications)",
"edition": "2022-03-02",
"heading": "AFM ch. 31 > 31.3 H1-B Classification and Documentary Requirements. [Section (h) added 10/6/2010; AD10-48; PM-602-0009]",
"snippet": "educational, nonprofit or governmental organizations (these types of petitioners are normally referred to as \"cap-exempt\" because an H-1B alien employed by such an entity is not subject ... USCIS has not required that an alien who is cap exempt by virtue of the above types of employment, be counted towards the limitation contained in section",
"url": "/policy/#doc-uscis_afm_ch31",
"superseded": "Older guidance: replaced by the USCIS Policy Manual, and kept because decisions and briefs still cite it."
},
{
"citation": "USCIS, H-1B Specialty Occupations - Changing Employers or Employment Terms with the Same Employer (Portability)",
"document": "USCIS, H-1B Specialty Occupations",
"edition": "Last Reviewed/Updated: 08/31/2026",
"heading": "H-1B Specialty Occupations",
"snippet": "currently employed in a cap-exempt position, you may engage in concurrent employment in a cap-subject position as long as you will continue to be employed in the cap-exempt position ... requested start date on that petition, whichever is later. As long as you continue your cap-exempt employment, were previously counted toward the cap, or otherwise remain cap exempt, you will",
"url": "/policy/#doc-uscis_h1b_overview"
},
{
"citation": "AFM 31.3, p. 40",
"document": "USCIS Adjudicator's Field Manual Chapter 31, Petitions for Temporary Workers (H Classifications)",
"edition": "2022-03-02",
"heading": "AFM ch. 31 > 31.3 H1-B Classification and Documentary Requirements. [Section (h) added 10/6/2010; AD10-48; PM-602-0009]",
"snippet": "USCIS determines that an H 1B alien beneficiary has ceased to be employed in a cap-exempt position after a new cap-subject H 1B petition has been approved ... behalf of the H 1B alien beneficiary if no cap numbers are available. (14) Cap Exemption for Employment and Services Performed in the Commonwealth of the Northern Mariana Islands (CNMI) and Guam",
"url": "/policy/#doc-uscis_afm_ch31",
"superseded": "Older guidance: replaced by the USCIS Policy Manual, and kept because decisions and briefs still cite it."
},
{
"citation": "AFM 31.3, p. 35",
"document": "USCIS Adjudicator's Field Manual Chapter 31, Petitions for Temporary Workers (H Classifications)",
"edition": "2022-03-02",
"heading": "AFM ch. 31 > 31.3 H1-B Classification and Documentary Requirements. [Section (h) added 10/6/2010; AD10-48; PM-602-0009]",
"snippet": "certain aliens who are not employed directly by a qualifying institution to be treated as cap exempt when needed to further the essential purposes of the qualifying institution. Thus, if a petitioner ... other ways, below is a non-exhaustive list of examples to assist adjudicators in determining cap exemption eligibility: Example 1: Company A, a for-profit consultant firm that would not otherwise",
"url": "/policy/#doc-uscis_afm_ch31",
"superseded": "Older guidance: replaced by the USCIS Policy Manual, and kept because decisions and briefs still cite it."
}
],
"note": "Quote the citation with the passage. Finding the rule is not legal advice."
}
Finding the rule isn't legal advice.
Use it from Claude
The same three tools as an MCP server, so Claude can look up a company and the rules and answer with the records' own numbers and citations. It reads, and changes nothing.
| Tool | What it does | Same as |
|---|---|---|
search_companies | Finds a company by name. | GET /api/v1/search |
get_company | One company's whole record. | GET /api/v1/companies/{key} |
search_regulations | Passages from the H-1B rules. | GET /api/v1/regulations |
Install the MCP extra in your copy of Visa Grep:
pip install -e ".[mcp]"
From your copy of Visa Grep:
claude mcp add visagrep -- python -m visagrep.cli mcp
Over stdio the server runs on your machine, against your own copy of the records, and doesn't need a key.
Add it to claude_desktop_config.json, then restart Claude Desktop:
{
"mcpServers": {
"visagrep": {
"command": "python",
"args": [
"-m",
"visagrep.cli",
"mcp"
]
}
}
}
If "python" there isn't the Python Visa Grep is installed in, give its full path instead: Claude Desktop doesn't start in your copy. Over stdio it doesn't need a key.
The hosted form: streamable HTTP at http://127.0.0.1:8766/mcp, which answers only a request with a key. Start it, then add it to Claude Code:
visagrep mcp --http --port 8766
claude mcp add --transport http visagrep http://127.0.0.1:8766/mcp --header "Authorization: Bearer vg_..."
Every request it answers counts toward your account's limits, with the API's.
What it won't do
- We don't rank companies: a list sorted by filing volume would be a staffing-firm leaderboard, not an answer.
- No prediction for anyone: the records are what employers filed and what the government decided, in the past.
- No blending: DOL and USCIS numbers count different things and are never added together. Each tool says so to the model that reads it.
- Not legal advice.
- No charge: it's free, within 1,000 requests a day and 60 a minute, per account.