Kempt Horizon Data Toolkit
Web pages to clean Markdown, email/phone/CSV cleaning, and live SEC EDGAR, Federal Register, USAspending and Grants.gov data. 17 read-only tools, hosted, OAuth.
Hosted MCP Server
npx add-mcp 'https://kempt-horizon-data-toolkit.mcpize.run/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
| Product | What it does | Get access |
|---|---|---|
| Data Cleaner & Validator | Validate emails, format phone numbers, clean CSVs and text | RapidAPI |
| Page to Markdown & Metadata | Turn any web page or HTML into clean Markdown and metadata | RapidAPI |
| US Federal Data | SEC EDGAR, Federal Register, USAspending and Grants.gov in one API | RapidAPI |
| MCP Toolkit | All of the above as 17 tools for AI assistants and agents that support MCP. Listed on MCPize as Kempt Horizon Data Toolkit | MCPize |
See all our products at phantasyx.com/apis
Get started
REST APIs on RapidAPI
- Open the API's RapidAPI page (links above) and sign in.
- Go to Pricing and subscribe to the free Basic plan.
- Copy your key from the API's Endpoints tab. It's the
X-RapidAPI-Keyvalue. - Send these two headers with every request.
X-RapidAPI-Key: YOUR_RAPIDAPI_KEY
X-RapidAPI-Host: <the API's host, below>
| API | Base URL | X-RapidAPI-Host |
|---|---|---|
| Data Cleaner & Validator | https://kempt-data-cleaner-validator.p.rapidapi.com | kempt-data-cleaner-validator.p.rapidapi.com |
| Page to Markdown & Metadata | https://kempt-page-to-markdown-metadata.p.rapidapi.com | kempt-page-to-markdown-metadata.p.rapidapi.com |
| US Federal Data | https://kempt-us-federal-data.p.rapidapi.com | kempt-us-federal-data.p.rapidapi.com |
Here's a first call you can copy.
curl "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/email/validate?email=jane@example.com" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com"
A few details apply to every endpoint.
- Requests and responses are JSON. Send
Content-Type: application/jsonwith POST bodies. - Many endpoints accept both
GET(query string) andPOST(JSON body) with the same parameters. - List parameters take a JSON array in a POST body, or a comma-separated string in a query string (for example
forms=10-K,10-Q). - Dates are always
YYYY-MM-DD.
MCP server on MCPize
- Open Kempt Horizon Data Toolkit on MCPize and subscribe. The Free plan includes 50 tool calls a month.
- Follow MCPize's connection instructions on that page to add the server to any AI assistant or agent that supports remote MCP servers. MCPize gives you the server URL and your personal key.
- Then ask your assistant something like "Get Apple's last two years of revenue from SEC filings" or "Turn this page into Markdown," and it picks the matching tool.
The server uses streamable HTTP, and all 17 tools are read-only. The full tool list is further down this page.
Data Cleaner & Validator
Host: kempt-data-cleaner-validator.p.rapidapi.com
This API validates email addresses (syntax, mail exchange (MX) records, disposable domains, role accounts, and typo suggestions), formats phone numbers to the international E.164 standard, cleans messy CSV tables, and normalizes text. We never connect to a recipient's mail server to test whether a mailbox exists.
Validate one email
POST /v1/email/validate, also GET /v1/email/validate?email=...
| Parameter | Type | Notes |
|---|---|---|
email | string, required | The address to check |
checkMx | boolean | Default true. Looks up MX records over DNS-over-HTTPS |
The verdict is one of valid, valid_role, risky or invalid, and the score runs from 0 to 100.
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/email/validate" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"email": "Jane.Doe@gmial.com"}'
{
"input": "Jane.Doe@gmial.com",
"normalized": "Jane.Doe@gmial.com",
"local": "Jane.Doe",
"domain": "gmial.com",
"syntaxValid": true,
"reasons": ["possible_typo"],
"disposable": false,
"roleAccount": false,
"freeProvider": false,
"suggestion": "Jane.Doe@gmail.com",
"dns": { "checked": true, "domainExists": true, "mxRecords": [], "acceptsMail": true, "fallbackToA": true },
"verdict": "risky",
"score": 60,
"smtpChecked": false
}
Validate up to 100 emails
POST /v1/email/validate-batch
| Parameter | Type | Notes |
|---|---|---|
emails | string[], required | Up to 100 addresses |
checkMx | boolean | Default true |
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/email/validate-batch" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"emails": ["a@gmail.com", "b@mailinator.com", "bad@"]}'
{
"count": 3,
"summary": { "valid": 1, "risky": 1, "invalid": 1 },
"results": [
{ "input": "a@gmail.com", "freeProvider": true, "reasons": [], "verdict": "valid", "score": 100 },
{ "input": "b@mailinator.com", "disposable": true, "reasons": ["disposable_domain"], "verdict": "risky" },
{ "input": "bad@", "syntaxValid": false, "verdict": "invalid" }
]
}
Each item in results has the same full shape as the single-email response. The items above are trimmed.
Parse a phone number
POST /v1/phone/parse, also GET /v1/phone/parse?phone=...
| Parameter | Type | Notes |
|---|---|---|
phone | string, required | Any format |
defaultCountry | string | ISO 3166-1 alpha-2 (for example US), used when the number has no +country code |
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/phone/parse" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"phone": "(415) 555-2671", "defaultCountry": "US"}'
{
"input": "(415) 555-2671",
"valid": true,
"possible": true,
"e164": "+14155552671",
"national": "(415) 555-2671",
"international": "+1 415 555 2671",
"uri": "tel:+14155552671",
"country": "US",
"countryCallingCode": "1",
"nationalNumber": "4155552671",
"extension": null,
"type": "FIXED_LINE_OR_MOBILE"
}
Parse up to 100 phone numbers
POST /v1/phone/parse-batch
| Parameter | Type | Notes |
|---|---|---|
phones | string[], required | Up to 100 numbers |
defaultCountry | string | Applied to numbers without a country code |
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/phone/parse-batch" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"phones": ["(415) 555-2671", "+44 20 7946 0958"], "defaultCountry": "US"}'
{
"count": 2,
"valid": 2,
"results": [
{ "input": "(415) 555-2671", "valid": true, "e164": "+14155552671", "country": "US", "type": "FIXED_LINE_OR_MOBILE" },
{ "input": "+44 20 7946 0958", "valid": true, "e164": "+442079460958", "national": "020 7946 0958", "country": "GB", "type": "FIXED_LINE" }
]
}
Clean a CSV or JSON table
POST /v1/csv/clean
Send csv (raw CSV or TSV text, up to 2 MB and 5,000 rows, delimiter detected automatically) or rows (an array of arrays with a header row, or an array of objects). You don't have to set any of the options below.
| Option | Default | Notes |
|---|---|---|
delimiter | auto | Force , ; `\ |
normalizeHeaders | snake | snake, camel, kebab or none |
trim, dedupe, dropEmptyRows | true | Trim cells, remove duplicate rows, drop empty rows |
dedupeColumns | all | Deduplicate on these columns only (case-insensitive) |
dropEmptyColumns | false | |
emailColumns, dateColumns | auto | Column list, or "none" to skip |
phoneColumns | none | Columns to convert to E.164 |
defaultCountry | US | For phone columns |
dateOrder | MDY | MDY or DMY for ambiguous dates |
output | both | json, csv or both |
outputDelimiter | , |
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/csv/clean" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"csv": "First Name,E-mail,Signup Date\n Jane ,JANE@Example.com,10/21/2026\nJane,jane@example.com,10/21/2026\n,,\n", "options": {"output": "json"}}'
{
"delimiter": ",",
"headers": ["first_name", "email", "signup_date"],
"report": {
"rowsIn": 3, "rowsOut": 1, "emptyRowsRemoved": 1, "duplicatesRemoved": 1,
"cellsTrimmed": 1, "emailsNormalized": 1, "invalidEmails": 0,
"phonesNormalized": 0, "invalidPhones": 0, "datesNormalized": 2,
"unparsedDates": 0, "raggedRowsFixed": 0, "columnsRemoved": []
},
"columns": [
{ "name": "first_name", "type": "string", "empty": 0, "distinct": 1 },
{ "name": "email", "type": "email", "empty": 0, "distinct": 1 },
{ "name": "signup_date", "type": "date", "empty": 0, "distinct": 1 }
],
"rows": [
{ "first_name": "Jane", "email": "jane@example.com", "signup_date": "2026-10-21" }
]
}
Clean and normalize text
POST /v1/text/clean
| Parameter | Type | Notes |
|---|---|---|
text | string, required | |
options.stripHtml | boolean | Default false |
options.decodeEntities | boolean | Default true |
options.unicode | string | NFC (default) or NFKC |
options.removeControlChars | boolean | Default true |
options.asciiPunctuation | boolean | Smart quotes and dashes to ASCII. Default false |
options.removeEmoji, removeUrls, removeEmails | boolean | Default false |
options.collapseWhitespace | boolean | Default true |
options.case | string | lower, upper, sentence or title |
options.maxLength | integer | Cut the output to this length |
curl -X POST "https://kempt-data-cleaner-validator.p.rapidapi.com/v1/text/clean" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-data-cleaner-validator.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"text": "<p>Hello βworldβ π</p>", "options": {"stripHtml": true, "asciiPunctuation": true, "removeEmoji": true}}'
{
"text": "Hello \"world\"",
"stats": { "charactersIn": 34, "charactersOut": 13, "words": 2, "lines": 1 }
}
Page to Markdown & Metadata
Host: kempt-page-to-markdown-metadata.p.rapidapi.com
This API turns a public web page into clean Markdown and structured metadata. Send a url and we fetch the page for you, or send the html you already have.
All three endpoints accept the same parameters by POST (JSON body) or GET (query string, where url is required).
| Parameter | Type | Notes |
|---|---|---|
url | string | Public http(s) URL. Optional when you send html, and then used as the base for links |
html | string | Raw HTML to process instead of fetching (max 3 MB). POST only |
mainContentOnly | boolean | Default true. Removes nav, headers, footers, sidebars, cookie banners and ads |
maxChars | integer | Default 100000 (range 1,000 to 500,000). Caps the Markdown or text length |
include | string or string[] | Any of metadata, markdown, text, links, images, headings |
When we fetch a page, we honor its robots.txt, stop after 10 seconds, and cap the download at 3 MB. We read the HTML the server sends and don't run a browser, so content that only appears after scripts run won't be included. We block private, local, and raw IP addresses. If a site's robots.txt disallows a page, you can send its HTML in html instead.
Everything in one call
POST /v1/extract, also GET /v1/extract?url=...
By default this returns metadata, markdown, links and headings.
curl -X POST "https://kempt-page-to-markdown-metadata.p.rapidapi.com/v1/extract" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-page-to-markdown-metadata.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/", "include": ["metadata", "markdown"]}'
{
"source": "url",
"finalUrl": "https://example.com/",
"httpStatus": 200,
"contentType": "text/html; charset=utf-8",
"redirects": [],
"htmlTruncated": false,
"metadata": {
"url": "https://example.com/",
"title": "Example Domain",
"language": "en",
"favicon": "https://example.com/favicon.ico",
"openGraph": {},
"twitter": {},
"jsonLd": []
},
"stats": { "htmlBytes": 577, "words": 25, "readingTimeMinutes": 1, "mainContentOnly": true },
"truncated": false,
"markdown": "This domain is for use in documentation examples without needing permission. ..."
}
HTML or URL to Markdown
POST /v1/markdown, also GET /v1/markdown?url=...
Returns the main content as Markdown with absolute links, fenced code blocks and tables. By default it returns markdown only.
curl -X POST "https://kempt-page-to-markdown-metadata.p.rapidapi.com/v1/markdown" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-page-to-markdown-metadata.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"html": "<article><h1>Hello</h1><p>World <a href=\"/x\">link</a></p></article>", "url": "https://example.com/"}'
{
"source": "html",
"stats": { "htmlBytes": 67, "words": 3, "readingTimeMinutes": 1, "mainContentOnly": true },
"truncated": false,
"markdown": "# Hello\n\nWorld [link](https://example.com/x)"
}
Link preview and SEO metadata
POST /v1/metadata, also GET /v1/metadata?url=...
This returns the title, description, canonical URL, language, Open Graph, Twitter Card, JSON-LD, favicon and icons, RSS and Atom feeds, and hreflang alternates. It only reads the page's <head>, so it skips the rest of the page.
curl "https://kempt-page-to-markdown-metadata.p.rapidapi.com/v1/metadata?url=https%3A%2F%2Fexample.com%2F" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-page-to-markdown-metadata.p.rapidapi.com"
{
"source": "url",
"finalUrl": "https://example.com/",
"httpStatus": 200,
"metadata": {
"url": "https://example.com/",
"canonicalUrl": null,
"title": "Example Domain",
"description": null,
"language": "en",
"siteName": null,
"author": null,
"publishedTime": null,
"image": null,
"favicon": "https://example.com/favicon.ico",
"icons": [],
"openGraph": {},
"twitter": {},
"jsonLdTypes": [],
"jsonLd": [],
"feeds": [],
"alternateLanguages": []
},
"stats": { "htmlBytes": 577 }
}
US Federal Data
Host: kempt-us-federal-data.p.rapidapi.com
This API brings EDGAR from the Securities and Exchange Commission (SEC), the Federal Register, USAspending.gov, and Grants.gov into one place, with consistent camelCase JSON and YYYY-MM-DD dates. The data comes only from official government APIs that need no key, it's in the public domain, and we follow the SEC's fair-access rules. We aren't affiliated with any government agency.
For company endpoints, pass either ticker (for example AAPL) or cik, the SEC's Central Index Key (for example 320193).
Search companies
GET /v1/sec/companies
| Parameter | Type | Notes |
|---|---|---|
q | string, required | Company name or ticker fragment (2+ characters) |
limit | integer | Default 10, max 50 |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/sec/companies?q=apple&limit=3" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"query": "apple",
"count": 3,
"results": [
{ "cik": "0000320193", "ticker": "AAPL", "name": "Apple Inc." },
{ "cik": "0001134982", "ticker": "AAPI", "name": "Apple iSports Group, Inc." },
{ "cik": "0001418121", "ticker": "APLE", "name": "Apple Hospitality REIT, Inc." }
]
}
Company profile
GET /v1/sec/company
| Parameter | Type | Notes |
|---|---|---|
ticker or cik | string | One of the two is required |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/sec/company?ticker=AAPL" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"cik": "0000320193",
"name": "Apple Inc.",
"tickers": ["AAPL"],
"exchanges": ["Nasdaq"],
"entityType": "operating",
"sic": "3571",
"sicDescription": "Electronic Computers",
"category": "Large accelerated filer",
"fiscalYearEnd": "0926",
"stateOfIncorporation": "CA",
"businessAddress": { "street1": "ONE APPLE PARK WAY", "city": "CUPERTINO", "state": "CA", "zip": "95014" },
"formerNames": [{ "name": "APPLE COMPUTER INC", "from": "1994-01-26", "to": "2007-01-04" }],
"latestFiling": { "form": "4", "filingDate": "2026-10-19", "accessionNumber": "0001140361-26-040127" },
"edgarUrl": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000320193",
"source": "SEC EDGAR submissions API"
}
Recent filings
GET /v1/sec/filings
| Parameter | Type | Notes |
|---|---|---|
ticker or cik | string | One of the two is required |
forms | string | Comma-separated form types, for example 10-K,10-Q,8-K |
dateFrom, dateTo | date | YYYY-MM-DD |
limit | integer | Default 20, max 200 |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/sec/filings?ticker=AAPL&forms=10-K&limit=2" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"cik": "0000320193",
"name": "Apple Inc.",
"count": 2,
"filings": [
{
"accessionNumber": "0000320193-25-000079",
"form": "10-K",
"filingDate": "2025-10-31",
"reportDate": "2025-09-27",
"items": [],
"primaryDocument": "aapl-20250927.htm",
"isXBRL": true,
"primaryDocumentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/aapl-20250927.htm",
"filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm"
}
],
"note": "Covers the most recent ~1,000 filings (EDGAR \"recent\" set)."
}
Key financials (XBRL)
GET /v1/sec/financials
| Parameter | Type | Notes |
|---|---|---|
ticker or cik | string | One of the two is required |
period | string | annual (default) or quarterly |
metrics | string | Comma-separated subset of revenue, netIncome, operatingIncome, grossProfit, epsDiluted, epsBasic, totalAssets, totalLiabilities, stockholdersEquity, cash, operatingCashFlow, sharesOutstanding |
limit | integer | Periods per metric. Default 5, max 20 |
Values come straight from the filings' eXtensible Business Reporting Language (XBRL) data and aren't adjusted. If a company doesn't use the usual XBRL tag for a metric, we use the closest one it does report.
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/sec/financials?ticker=AAPL&metrics=revenue,netIncome&limit=2" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"cik": "0000320193",
"ticker": "AAPL",
"period": "annual",
"metrics": {
"revenue": {
"concept": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",
"label": "Revenue from Contract with Customer, Excluding Assessed Tax",
"unit": "USD",
"values": [
{
"periodStart": "2024-09-29",
"periodEnd": "2025-09-27",
"value": 416161000000,
"fiscalYear": 2025,
"fiscalPeriod": "FY",
"form": "10-K",
"filed": "2025-10-31",
"accessionNumber": "0000320193-25-000079"
}
]
},
"netIncome": { "concept": "us-gaap:NetIncomeLoss", "unit": "USD", "values": [{ "periodEnd": "2025-09-27", "value": 112010000000 }] }
},
"source": "SEC XBRL companyconcept API (as reported; not adjusted)"
}
Full-text filing search
GET /v1/sec/search
| Parameter | Type | Notes |
|---|---|---|
q | string | EDGAR full-text query. Put exact phrases in quotes. You must send q, forms, or both |
forms | string | Comma-separated form types |
ticker or cik | string | Optional company filter |
dateFrom, dateTo | date | YYYY-MM-DD (coverage starts in 2001) |
limit | integer | Default 20, max 100 |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/sec/search?q=%22artificial%20intelligence%22&forms=10-K&limit=2" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"query": "\"artificial intelligence\"",
"forms": ["10-K"],
"totalDocumentHits": 10000,
"count": 2,
"filings": [
{
"accessionNumber": "0001161697-21-000289",
"form": "10-K",
"fileDate": "2021-06-01",
"periodEnding": "2021-02-28",
"cik": "0001498148",
"companyName": "Artificial Intelligence Technology Solutions Inc.",
"ticker": "AITX",
"primaryDocumentUrl": "https://www.sec.gov/Archives/edgar/data/1498148/000116169721000289/form_10-k.htm",
"matchedDocuments": [
{ "file": "form_10-k.htm", "type": "10-K", "description": "FORM 10-K ANNUAL REPORT FOR 02-28-2021", "url": "https://www.sec.gov/Archives/edgar/data/1498148/000116169721000289/form_10-k.htm" }
]
}
]
}
Federal Register documents
GET /v1/federal-register/documents
| Parameter | Type | Notes |
|---|---|---|
keywords | string | Comma-separated search terms (matches any) |
types | string | RULE, PRORULE, NOTICE, PRESDOCU |
agencies | string | Agency names or slugs, for example environmental-protection-agency |
lastDays or dateFrom / dateTo | integer / date | Publication window |
significantOnly, openForCommentOnly | boolean | |
docketId, rin | string | |
cfrTitle, cfrPart | integer | |
order | string | newest, oldest or relevance |
limit | integer | Default 20, max 100 |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/federal-register/documents?keywords=artificial%20intelligence&types=RULE&limit=2" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"total": 186,
"count": 2,
"documents": [
{
"documentNumber": "2026-20890",
"title": "Project-Level Predecisional Administrative Review Process",
"type": "Rule",
"action": "Final rule.",
"agencies": ["Agriculture Department", "Forest Service"],
"publicationDate": "2026-10-13",
"effectiveDate": "2026-11-12",
"commentsCloseDate": null,
"regulationIdNumbers": ["0596-AD69"],
"cfrReferences": [{ "title": 36, "part": "218", "chapter": null }],
"citation": "91 FR 64760",
"pdfUrl": "https://www.govinfo.gov/content/pkg/FR-2026-10-13/pdf/2026-20890.pdf",
"commentUrl": null
}
]
}
Federal awards (USAspending)
POST /v1/usaspending/awards
| Parameter | Type | Notes |
|---|---|---|
category | string | contracts (default), idvs, grants, loans, direct_payments or other |
keywords | string[] | Each keyword must be 3+ characters |
recipients | string[] | Recipient names |
agencies | string[] | Awarding top-tier agency names, for example Department of Defense |
naics, psc | string[] | Industry and product codes (contracts) |
assistanceListings | string[] | ALN/CFDA numbers (assistance) |
states | string[] | Place-of-performance state codes |
setAsides | string[] | Set-aside type codes |
minAmount, maxAmount | number | |
lastDays or dateFrom / dateTo | integer / date | Defaults to the last 90 days |
sortBy | string | lastModified or amount |
page, limit | integer | Page default 1. Limit default 20, max 100 |
curl -X POST "https://kempt-us-federal-data.p.rapidapi.com/v1/usaspending/awards" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"category": "contracts", "keywords": ["cybersecurity"], "lastDays": 30, "limit": 2}'
{
"category": "contracts",
"timePeriod": ["2026-09-22", "2026-10-22"],
"sortBy": "Last Modified Date",
"page": 1,
"hasNext": true,
"count": 2,
"awards": [
{
"awardId": "89303026CMA000146",
"category": "contract",
"awardType": "DEFINITIVE CONTRACT",
"recipientName": "AXIS MANAGEMENT GROUP, LLC",
"amount": 200000,
"startDate": "2026-09-24",
"endDate": "2027-03-31",
"awardingAgency": "Department of Energy",
"naics": { "code": "519290", "description": "WEB SEARCH PORTALS AND ALL OTHER INFORMATION SERVICES" },
"url": "https://www.usaspending.gov/award/CONT_AWD_89303026CMA000146_8900_-NONE-_-NONE-"
}
]
}
The response above is trimmed to one award. Full awards also include recipientUei, description, awardingSubAgency, fundingAgency, psc, placeOfPerformance and recipientUrl.
Search grant opportunities
POST /v1/grants/search
| Parameter | Type | Notes |
|---|---|---|
keywords | string[] | Matches any |
statuses | string[] | posted, forecasted, closed, archived. Default posted,forecasted |
agencies | string[] | Agency codes, for example HHS-NIH11 |
fundingCategories | string[] | Category codes, for example ED, HL, ST |
eligibilities | string[] | Eligibility codes |
aln | string | Assistance listing number |
includeDetails | boolean | Adds award ceiling and floor, description, eligibility and contacts for the first 10 results. Default false |
limit | integer | Default 20, max 50 |
curl -X POST "https://kempt-us-federal-data.p.rapidapi.com/v1/grants/search" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com" \
-H "Content-Type: application/json" \
-d '{"keywords": ["climate resilience"], "limit": 10}'
{
"total": 3,
"count": 3,
"grants": [
{
"opportunityId": "347414",
"opportunityNumber": "EDA-DISASTER-2023",
"title": "FY 2023 Disaster Supplemental",
"agencyCode": "DOC-EDA",
"agency": "Economic Development Administration",
"status": "posted",
"docType": "synopsis",
"postedDate": "2023-04-24",
"closeDate": null,
"alnNumbers": ["11.307"],
"url": "https://www.grants.gov/search-results-detail/347414"
}
],
"source": "Grants.gov search2 API"
}
Grant opportunity details
GET /v1/grants/opportunity
| Parameter | Type | Notes |
|---|---|---|
opportunityId | string, required | Grants.gov opportunity ID (from /v1/grants/search) |
curl "https://kempt-us-federal-data.p.rapidapi.com/v1/grants/opportunity?opportunityId=350338" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: kempt-us-federal-data.p.rapidapi.com"
{
"opportunityId": "350338",
"opportunityNumber": "2023-NIST-CHIPS-SMME-01",
"title": "CHIPS Incentives Program – Facilities for Semiconductor Materials and Manufacturing Equipment",
"agency": "DOC-NIST",
"category": "Discretionary",
"description": "The CHIPS Incentives Program aims to catalyze long-term economically sustainable growth in the domestic semiconductor industry ...",
"awardCeiling": null,
"awardFloor": null,
"costSharing": false,
"fundingInstruments": ["Cooperative Agreement"],
"fundingCategories": ["Science and Technology and other Research and Development"],
"closeDate": null,
"lastUpdated": "2025-10-16",
"moreInfoUrl": "https://applications.chips.gov/s/",
"aln": [{ "number": "11.037", "title": "CHIPS Incentives Program" }],
"documents": [
{ "name": "2023-NIST-CHIPS-SMME-01-Amendment.pdf", "url": "https://apply07.grants.gov/grantsws/rest/opportunity/att/download/349581" }
]
}
The full response also includes eligibleApplicants, eligibilityNotes, estimatedTotalFunding, expectedNumberOfAwards, responseDateNote and agencyContact.
MCP tools
Our MCP Toolkit (listed on MCPize as Kempt Horizon Data Toolkit) gives your assistant all 17 tools from one remote server. Each tool takes the same parameters as the REST endpoint it matches.
Read the web
| Tool | What it does |
|---|---|
page_to_markdown | Fetch a public page (robots.txt honored) or take raw HTML and return the main content as clean Markdown with absolute links |
page_metadata | Title, description, canonical URL, Open Graph and Twitter tags, JSON-LD, favicon and feeds for a URL or HTML |
page_extract | Markdown, metadata, links and headings in one call. Use include to pick parts |
Clean data
| Tool | What it does |
|---|---|
validate_email | Check one email for syntax, MX records, disposable, role and free-provider flags, and typos, then return a verdict and score |
validate_emails | Validate up to 100 email addresses at once |
parse_phone | Validate a phone number and return E.164, national and international formats, country and line type |
clean_csv | Normalize headers, trim, dedupe, drop empty rows, fix emails, phones and dates, and infer column types |
clean_text | Strip HTML, decode entities, normalize Unicode, whitespace and punctuation, remove emoji, URLs or emails, change case |
US government data
| Tool | What it does |
|---|---|
sec_company_search | Find public companies by name or ticker and get their CIK |
sec_company_profile | Get a company's Standard Industrial Classification (SIC) industry, state of incorporation, fiscal year end, addresses, exchanges, and former names |
sec_company_filings | Recent SEC filings (10-K, 10-Q, 8-K and more) with document URLs |
sec_company_financials | Get revenue, net income, earnings per share (EPS), assets, cash, and more from XBRL data, annual or quarterly |
sec_filing_search | Full-text search across EDGAR filings, filtered by form and date |
federal_register_search | Search federal rules, proposed rules and notices by agency, type, date or open comment period |
usaspending_awards | Search federal contract and grant awards to see who got paid, how much, and by which agency |
grants_search | Find open and forecasted federal grant opportunities by keyword, agency or category |
grant_details | Full details for one Grants.gov opportunity |
Plans and rate limits
All quotas are hard limits with no overage charges. When you reach your monthly quota, requests stop until the next cycle or until you upgrade. You can change plans at any time on RapidAPI or MCPize.
RapidAPI plans
| Plan | Price | Data Cleaner & Validator | Page to Markdown & Metadata | US Federal Data |
|---|---|---|---|---|
| Basic | $0 | 50 req/mo, 1 req/s | 50 req/mo, 1 req/s | 50 req/mo, 1 req/s |
| Pro | $9.99/mo | 10,000 req/mo | 5,000 req/mo | 5,000 req/mo |
| Ultra | $29.99/mo | 50,000 req/mo | 25,000 req/mo | 25,000 req/mo |
| Mega | $79.99/mo | 200,000 req/mo | 100,000 req/mo | 100,000 req/mo |
Batch endpoints count as one request, so up to 100 emails or phone numbers cost a single call.
MCPize plans (Kempt Horizon Data Toolkit)
| Plan | Price | Included tool calls |
|---|---|---|
| Free | $0 | 50 / month |
| Pro | $9.99/mo | 5,000 / month |
| Ultra | $29.99/mo | 25,000 / month |
Size limits
| Limit | Value |
|---|---|
| Request body | 2 MB |
| Batch email or phone | 100 items |
| CSV | 2 MB, 5,000 rows |
Fetched page or html | 3 MB, 10-second timeout |
| Markdown or text output | maxChars, 1,000 to 500,000 (default 100,000) |
Errors
Errors come back as JSON with a matching HTTP status, like this.
{ "error": { "code": "missing_parameter", "message": "\"email\" is required." } }
Some errors add extra fields, such as retryAfterSeconds on rate_limited, upstreamStatus on upstream_status, or upstreamDetail when a government source rejects a filter.
| HTTP | Code | Meaning |
|---|---|---|
| 400 | missing_parameter | A required parameter is missing, for example email, url or html, ticker or cik, or opportunityId |
| 400 | missing_input | /v1/csv/clean needs csv or rows |
| 400 | invalid_json / invalid_body | The body isn't valid JSON or isn't a JSON object |
| 400 | batch_too_large | More than 100 items in a batch |
| 400 | invalid_url / blocked_url | The URL isn't a public http(s) URL on port 80 or 443, or it points to a private or local address |
| 400 | missing_html | There was no HTML to process |
| 400 | invalid_include | Unknown include value |
| 400 | invalid_date | Dates must be YYYY-MM-DD |
| 400 | invalid_cik / invalid_metric / invalid_category / invalid_keyword | Bad value for that parameter. USAspending keywords need 3+ characters |
| 400 | invalid_filters | The Federal Register or USAspending rejected the filter combination |
| 401 | unauthorized | The request didn't come through RapidAPI or MCPize with a valid key |
| 403 | robots_disallowed | The site's robots.txt doesn't allow fetching that page. Send the HTML in html instead |
| 404 | not_found / ticker_not_found | Unknown endpoint, unknown ticker, or record not found |
| 405 | method_not_allowed | Wrong HTTP method for this path |
| 413 | payload_too_large / too_many_rows | Body over 2 MB, or CSV over 5,000 rows |
| 415 | unsupported_content_type | The fetched URL isn't HTML |
| 429 | rate_limited | Too many requests in a short time. Wait retryAfterSeconds and try again |
| 502 | fetch_failed / upstream_status | The page couldn't be fetched (timeout or network error) or returned an error status |
| 502 | upstream_error / upstream_unreachable | A government data source failed or didn't respond. Try again shortly |
| 503 | upstream_busy | A government data source is rate limiting. Try again in a few seconds |
| 508 | too_many_redirects | The page redirected too many times |
| 500 | internal_error | Something unexpected went wrong on our side. Try again, and contact us if it keeps happening |
RapidAPI and MCPize may also return their own errors, for example for a missing or invalid key or a used-up monthly quota.
In MCP clients, a failed tool call returns isError: true with a message such as missing_parameter: "q" (2+ characters) is required.
Privacy and fair use
- We don't store or log the emails, phone numbers, tables, text, or HTML you send, and no API keeps anything between requests.
- When we fetch a page for you, we check the site's robots.txt first and follow it, and we block private and local addresses.
- Federal data comes only from official public government APIs, and we follow the SEC's fair-access rules.
- Every MCP tool is read-only and never changes anything on your behalf.
Support
If you have a question, find a bug, or want a feature, contact us.