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

ProductWhat it doesGet access
Data Cleaner & ValidatorValidate emails, format phone numbers, clean CSVs and textRapidAPI
Page to Markdown & MetadataTurn any web page or HTML into clean Markdown and metadataRapidAPI
US Federal DataSEC EDGAR, Federal Register, USAspending and Grants.gov in one APIRapidAPI
MCP ToolkitAll of the above as 17 tools for AI assistants and agents that support MCP. Listed on MCPize as Kempt Horizon Data ToolkitMCPize

See all our products at phantasyx.com/apis


Get started

REST APIs on RapidAPI

  1. Open the API's RapidAPI page (links above) and sign in.
  2. Go to Pricing and subscribe to the free Basic plan.
  3. Copy your key from the API's Endpoints tab. It's the X-RapidAPI-Key value.
  4. Send these two headers with every request.
X-RapidAPI-Key: YOUR_RAPIDAPI_KEY
X-RapidAPI-Host: <the API's host, below>
APIBase URLX-RapidAPI-Host
Data Cleaner & Validatorhttps://kempt-data-cleaner-validator.p.rapidapi.comkempt-data-cleaner-validator.p.rapidapi.com
Page to Markdown & Metadatahttps://kempt-page-to-markdown-metadata.p.rapidapi.comkempt-page-to-markdown-metadata.p.rapidapi.com
US Federal Datahttps://kempt-us-federal-data.p.rapidapi.comkempt-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/json with POST bodies.
  • Many endpoints accept both GET (query string) and POST (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

  1. Open Kempt Horizon Data Toolkit on MCPize and subscribe. The Free plan includes 50 tool calls a month.
  2. 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.
  3. 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=...

ParameterTypeNotes
emailstring, requiredThe address to check
checkMxbooleanDefault 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

ParameterTypeNotes
emailsstring[], requiredUp to 100 addresses
checkMxbooleanDefault 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=...

ParameterTypeNotes
phonestring, requiredAny format
defaultCountrystringISO 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

ParameterTypeNotes
phonesstring[], requiredUp to 100 numbers
defaultCountrystringApplied 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.

OptionDefaultNotes
delimiterautoForce , ; `\
normalizeHeaderssnakesnake, camel, kebab or none
trim, dedupe, dropEmptyRowstrueTrim cells, remove duplicate rows, drop empty rows
dedupeColumnsallDeduplicate on these columns only (case-insensitive)
dropEmptyColumnsfalse
emailColumns, dateColumnsautoColumn list, or "none" to skip
phoneColumnsnoneColumns to convert to E.164
defaultCountryUSFor phone columns
dateOrderMDYMDY or DMY for ambiguous dates
outputbothjson, 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

ParameterTypeNotes
textstring, required
options.stripHtmlbooleanDefault false
options.decodeEntitiesbooleanDefault true
options.unicodestringNFC (default) or NFKC
options.removeControlCharsbooleanDefault true
options.asciiPunctuationbooleanSmart quotes and dashes to ASCII. Default false
options.removeEmoji, removeUrls, removeEmailsbooleanDefault false
options.collapseWhitespacebooleanDefault true
options.casestringlower, upper, sentence or title
options.maxLengthintegerCut 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&nbsp;&nbsp;β€œ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).

ParameterTypeNotes
urlstringPublic http(s) URL. Optional when you send html, and then used as the base for links
htmlstringRaw HTML to process instead of fetching (max 3 MB). POST only
mainContentOnlybooleanDefault true. Removes nav, headers, footers, sidebars, cookie banners and ads
maxCharsintegerDefault 100000 (range 1,000 to 500,000). Caps the Markdown or text length
includestring 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

ParameterTypeNotes
qstring, requiredCompany name or ticker fragment (2+ characters)
limitintegerDefault 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

ParameterTypeNotes
ticker or cikstringOne 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

ParameterTypeNotes
ticker or cikstringOne of the two is required
formsstringComma-separated form types, for example 10-K,10-Q,8-K
dateFrom, dateTodateYYYY-MM-DD
limitintegerDefault 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

ParameterTypeNotes
ticker or cikstringOne of the two is required
periodstringannual (default) or quarterly
metricsstringComma-separated subset of revenue, netIncome, operatingIncome, grossProfit, epsDiluted, epsBasic, totalAssets, totalLiabilities, stockholdersEquity, cash, operatingCashFlow, sharesOutstanding
limitintegerPeriods 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

ParameterTypeNotes
qstringEDGAR full-text query. Put exact phrases in quotes. You must send q, forms, or both
formsstringComma-separated form types
ticker or cikstringOptional company filter
dateFrom, dateTodateYYYY-MM-DD (coverage starts in 2001)
limitintegerDefault 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

ParameterTypeNotes
keywordsstringComma-separated search terms (matches any)
typesstringRULE, PRORULE, NOTICE, PRESDOCU
agenciesstringAgency names or slugs, for example environmental-protection-agency
lastDays or dateFrom / dateTointeger / datePublication window
significantOnly, openForCommentOnlyboolean
docketId, rinstring
cfrTitle, cfrPartinteger
orderstringnewest, oldest or relevance
limitintegerDefault 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

ParameterTypeNotes
categorystringcontracts (default), idvs, grants, loans, direct_payments or other
keywordsstring[]Each keyword must be 3+ characters
recipientsstring[]Recipient names
agenciesstring[]Awarding top-tier agency names, for example Department of Defense
naics, pscstring[]Industry and product codes (contracts)
assistanceListingsstring[]ALN/CFDA numbers (assistance)
statesstring[]Place-of-performance state codes
setAsidesstring[]Set-aside type codes
minAmount, maxAmountnumber
lastDays or dateFrom / dateTointeger / dateDefaults to the last 90 days
sortBystringlastModified or amount
page, limitintegerPage 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

ParameterTypeNotes
keywordsstring[]Matches any
statusesstring[]posted, forecasted, closed, archived. Default posted,forecasted
agenciesstring[]Agency codes, for example HHS-NIH11
fundingCategoriesstring[]Category codes, for example ED, HL, ST
eligibilitiesstring[]Eligibility codes
alnstringAssistance listing number
includeDetailsbooleanAdds award ceiling and floor, description, eligibility and contacts for the first 10 results. Default false
limitintegerDefault 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

ParameterTypeNotes
opportunityIdstring, requiredGrants.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 &ndash; 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

ToolWhat it does
page_to_markdownFetch a public page (robots.txt honored) or take raw HTML and return the main content as clean Markdown with absolute links
page_metadataTitle, description, canonical URL, Open Graph and Twitter tags, JSON-LD, favicon and feeds for a URL or HTML
page_extractMarkdown, metadata, links and headings in one call. Use include to pick parts

Clean data

ToolWhat it does
validate_emailCheck one email for syntax, MX records, disposable, role and free-provider flags, and typos, then return a verdict and score
validate_emailsValidate up to 100 email addresses at once
parse_phoneValidate a phone number and return E.164, national and international formats, country and line type
clean_csvNormalize headers, trim, dedupe, drop empty rows, fix emails, phones and dates, and infer column types
clean_textStrip HTML, decode entities, normalize Unicode, whitespace and punctuation, remove emoji, URLs or emails, change case

US government data

ToolWhat it does
sec_company_searchFind public companies by name or ticker and get their CIK
sec_company_profileGet a company's Standard Industrial Classification (SIC) industry, state of incorporation, fiscal year end, addresses, exchanges, and former names
sec_company_filingsRecent SEC filings (10-K, 10-Q, 8-K and more) with document URLs
sec_company_financialsGet revenue, net income, earnings per share (EPS), assets, cash, and more from XBRL data, annual or quarterly
sec_filing_searchFull-text search across EDGAR filings, filtered by form and date
federal_register_searchSearch federal rules, proposed rules and notices by agency, type, date or open comment period
usaspending_awardsSearch federal contract and grant awards to see who got paid, how much, and by which agency
grants_searchFind open and forecasted federal grant opportunities by keyword, agency or category
grant_detailsFull 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

PlanPriceData Cleaner & ValidatorPage to Markdown & MetadataUS Federal Data
Basic$050 req/mo, 1 req/s50 req/mo, 1 req/s50 req/mo, 1 req/s
Pro$9.99/mo10,000 req/mo5,000 req/mo5,000 req/mo
Ultra$29.99/mo50,000 req/mo25,000 req/mo25,000 req/mo
Mega$79.99/mo200,000 req/mo100,000 req/mo100,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)

PlanPriceIncluded tool calls
Free$050 / month
Pro$9.99/mo5,000 / month
Ultra$29.99/mo25,000 / month

Size limits

LimitValue
Request body2 MB
Batch email or phone100 items
CSV2 MB, 5,000 rows
Fetched page or html3 MB, 10-second timeout
Markdown or text outputmaxChars, 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.

HTTPCodeMeaning
400missing_parameterA required parameter is missing, for example email, url or html, ticker or cik, or opportunityId
400missing_input/v1/csv/clean needs csv or rows
400invalid_json / invalid_bodyThe body isn't valid JSON or isn't a JSON object
400batch_too_largeMore than 100 items in a batch
400invalid_url / blocked_urlThe URL isn't a public http(s) URL on port 80 or 443, or it points to a private or local address
400missing_htmlThere was no HTML to process
400invalid_includeUnknown include value
400invalid_dateDates must be YYYY-MM-DD
400invalid_cik / invalid_metric / invalid_category / invalid_keywordBad value for that parameter. USAspending keywords need 3+ characters
400invalid_filtersThe Federal Register or USAspending rejected the filter combination
401unauthorizedThe request didn't come through RapidAPI or MCPize with a valid key
403robots_disallowedThe site's robots.txt doesn't allow fetching that page. Send the HTML in html instead
404not_found / ticker_not_foundUnknown endpoint, unknown ticker, or record not found
405method_not_allowedWrong HTTP method for this path
413payload_too_large / too_many_rowsBody over 2 MB, or CSV over 5,000 rows
415unsupported_content_typeThe fetched URL isn't HTML
429rate_limitedToo many requests in a short time. Wait retryAfterSeconds and try again
502fetch_failed / upstream_statusThe page couldn't be fetched (timeout or network error) or returned an error status
502upstream_error / upstream_unreachableA government data source failed or didn't respond. Try again shortly
503upstream_busyA government data source is rate limiting. Try again in a few seconds
508too_many_redirectsThe page redirected too many times
500internal_errorSomething 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.