PECOS Medicare Enrollment Pre-Check API Reference
Beta. Checks one provider's draft CMS-855I, 855B or 855S enrollment, revalidation or change as JSON, with one live NPPES lookup per run. Product page and free test form.
Endpoint
| Paid | POST https://www.spreadrun.com/api/v1/pecos-enrollment-precheck, API key required, $25.00 per completed pre-check |
|---|---|
| Demo | POST https://www.spreadrun.com/api/demo/pecos-enrollment-precheck, no key, 64 KB, 10 runs per day |
| Body | A JSON object, UTF-8, up to 256 KB. Text values up to 300 characters; lists up to 200 items. |
Request
enrollmentType | Required. 855I, 855B or 855S. |
applicationReason | initial (default), revalidation or change. |
asOf | Optional. YYYY-MM-DD the dates are checked against. Default: today (UTC). |
processingWindowDays | Optional. Whole number from 1 to 365, default 90. Your own planning assumption for how long the application takes; items expiring inside it are flagged. |
revalidationDueDate | For revalidations. YYYY-MM-DD, from the CMS revalidation lookup. |
provider | Required object: npi; legalName and irsLegalName (organizations, and individuals enrolling with an EIN); firstName and lastName (855I and DMEPOS sole proprietors); taxonomyCodes, a list with the primary first. |
practiceLocations | List of objects: name, street1, street2, city, state (2 letters), zip (ZIP+4 as 12345-6789), phone, isPrimary. For 855S also hoursPerWeek (posted hours open to the public) and hoursExceptionApplies. |
credentials | List of objects: type (license, certification, dea, liability_insurance, malpractice_insurance, surety_bond, accreditation), state, number, expirationDate (YYYY-MM-DD), notApplicable. |
officials | Organizations: list of objects with role, authorized or delegated. Names are not needed and not used. |
documents | List of the supporting document keys you have ready (table below). |
conditions | Object of true or false values that decide which documents and rules apply (table below). Anything left out is false. |
Start from the sample draft; the practice and NPI are invented.
Other conditions: soleProprietor (855S run by a sole proprietor: individual name, individual signs).
Supporting documents
A document is required when its condition is true, or always, or unless the named condition is true. Keys not used by the form are reported once as a warning and ignored.
CMS-855I
| Key | Document | Required when |
|---|---|---|
cp575 | IRS confirmation of the TIN and legal business name | conditions.usesEin |
irs8832 | IRS Form 8832 | llcDisregarded |
irs501c3 | IRS 501(c)(3) determination letter | nonprofit |
cms588 | CMS-588 EFT authorization | unless eftNotNeeded |
cms460 | CMS-460 participation agreement | participating |
adverseActions | Final adverse legal action documentation | hasAdverseActions |
certificationProof | Certification and proof of educational requirements | requiresCertification |
CMS-855B
| Key | Document | Required when |
|---|---|---|
licenses | Licenses, certifications and registrations required by Medicare or State law | always |
cp575 | IRS confirmation of the TIN and legal business name | unless cp575NotNeeded |
cms588 | CMS-588 EFT authorization | unless eftNotNeeded |
cms460 | CMS-460 participation agreement | participating |
adverseActions | Final adverse legal action documentation | hasAdverseActions |
ownershipChange | Bill of sale or sales agreement | ownershipChange |
orgChart | Organizational structure diagram | hasOrganizationalOwners |
idtfLiabilityInsurance | Comprehensive liability insurance policy (IDTFs) | idtf |
CMS-855S
| Key | Document | Required when |
|---|---|---|
licenses | Professional and business licenses | always |
liabilityInsurance | Certificate of comprehensive liability insurance | always |
cp575 | IRS document showing the TIN and legal business name | always |
cms588 | CMS-588 EFT authorization | unless eftNotNeeded |
applicationFee | Proof of application fee payment | unless feeNotDue |
suretyBond | Copy of the surety bond | unless suretyBondExempt |
irs501c3 | IRS 501(c)(3) determination letter | nonprofit |
adverseActions | Final adverse legal action documentation | hasAdverseActions |
contracts | Contracts for order filling, fabrication or fitting | contractedServices |
Report
| Field | Meaning |
|---|---|
status | FAIL if any error, WARN if only warnings, otherwise PASS. A clean pre-check does not guarantee that the enrollment will be approved. |
readiness | The submission-readiness checklist: one item per area (npi, names, taxonomy, addresses, credentials, documents, signatures, revalidation) with status ready, review, fail, not-checked or not-applicable. |
findings | Up to 500, errors first. Each has severity, ruleId, path (such as /practiceLocations[0]/zip), message and, for most rules, source. Findings never repeat a name, number or date from the input. |
enrollmentType, applicationReason, asOf, processingWindowDays, windowEnds | What was checked and the window used. |
registry | Whether NPPES was queried in this run. No registry data is returned. |
counts, findingCount, findingCounts, ruleCounts | Totals. |
notChecked, sources, scope, input, inputSha256 | What the report does not cover, where the rules come from, what the verdict means, and a fingerprint of the request body. |
Rule IDs
| Rule | Severity | Meaning |
|---|---|---|
PEC-NPI-MISSING | error | No NPI. |
PEC-NPI-FORMAT | error | The NPI is not 10 digits. |
PEC-NPI-CHECKDIGIT | error | The NPI fails the CMS check digit; the registry is not queried. |
PEC-NPPES-FOUND | error | The NPI is not in NPPES. |
PEC-NPPES-STATUS | error | The NPI is not active in NPPES. |
PEC-NPPES-TYPE | error or warning | Wrong NPI type for the form (individual for 855I, organization for 855B). Warning for an individual NPI on an 855S that is not a sole proprietorship. |
PEC-NPPES-NAME | error or warning | The name differs from the NPPES record (error for 855B, warning otherwise). Case and punctuation are ignored. |
PEC-NPPES-TAXONOMY | warning | A taxonomy code is not on the NPPES record. |
PEC-NPPES-TAXONOMY-PRIMARY | warning | The first code is not the primary taxonomy on the record. |
PEC-TAXONOMY-FORMAT | error | A taxonomy code is not 9 letters or digits followed by X. |
PEC-TAXONOMY-MISSING | warning | No taxonomy codes to compare. |
PEC-NAME-MISSING | error | Legal business name, or the practitioner's first and last name, missing. |
PEC-NAME-IRS-MISSING | error | No IRS name to compare with. |
PEC-NAME-IRS | error | The legal business name differs from the IRS name. |
PEC-NAME-IRS-PUNCT | warning | It differs only in punctuation or spacing. |
PEC-LOC-NONE | error or warning | No practice location (error for 855B and 855S). |
PEC-ADDR-REQUIRED | error | Street, city, state or ZIP missing. |
PEC-ADDR-POBOX | error | A P.O. box as the practice location. |
PEC-STATE | error | Not a 2-letter US state or territory code. |
PEC-ZIP-FORMAT | error | Not a 5-digit ZIP or ZIP+4. |
PEC-ZIP-PLUS4 | warning | Only 5 digits; the forms ask for ZIP+4. |
PEC-PHONE-MISSING | warning | No telephone number. |
PEC-PHONE-FORMAT | warning | Not a 10-digit US number. |
PEC-HOURS-MISSING | error | 855S: no posted hours of operation. |
PEC-HOURS-30 | warning | 855S: under 30 hours a week open to the public, with no exception set. |
PEC-CRED-TYPE | error | Unknown credential type. |
PEC-CRED-DATE | error | Expiration date not in YYYY-MM-DD form. |
PEC-CRED-EXPIRED | error | Expired on or before asOf. |
PEC-CRED-EXPIRING | warning | Expires inside the processing window. |
PEC-CRED-NO-EXPIRY | warning | No expiration date for an item that expires. |
PEC-CRED-LICENSE | warning | 855I: no state license listed. |
PEC-CRED-LIABILITY | error | 855S: no liability insurance. |
PEC-CRED-SURETY | error | 855S: no surety bond and no exemption set. |
PEC-DOC-MISSING | error | A supporting document the form asks for in your situation is not marked ready. |
PEC-DOC-UNKNOWN | warning | Document keys this form does not use. |
PEC-SIGN-ROLE | error | role is not authorized or delegated. |
PEC-SIGN-AUTHORIZED | error | No authorized official for an organization's initial enrollment or revalidation, or no authorized or delegated official for a change. |
PEC-REVAL-NO-DATE | warning | Revalidation with no due date. |
PEC-REVAL-DATE | error | Due date not in YYYY-MM-DD form. |
PEC-REVAL-PAST-DUE | error | The revalidation due date has passed. |
Source keys, as returned in every report:
cms855i | CMS-855I (05/23), Medicare enrollment application for physicians and non-physician practitioners |
cms855b | CMS-855B (12/2025), Medicare enrollment application for clinics, group practices and certain other suppliers |
cms855s | CMS-855S (12/23), Medicare enrollment application for DMEPOS suppliers |
cfr424.510 | 42 CFR 424.510(d), enrollment application content and signature requirements |
cfr424.515 | 42 CFR 424.515, revalidation every 5 years (3 years for DMEPOS suppliers) |
cfr424.540 | 42 CFR 424.540, deactivation, and no payment for services furnished while deactivated |
cfr424.57 | 42 CFR 424.57, DMEPOS supplier standards (posted hours, liability insurance, surety bond) |
npi | CMS NPI check digit (Luhn formula with the 80840 prefix) |
nppes | NPPES NPI Registry API, version 2.1 (queried live during the run) |
- CMS-855I (05/23) enrollment application for physicians and non-physician practitioners
- CMS-855B (12/2025) enrollment application for clinics, group practices and certain other suppliers
- CMS-855S (12/23) enrollment application for DMEPOS suppliers
- 42 CFR part 424, subpart P: enrollment (424.510), revalidation (424.515), rejection (424.525), deactivation (424.540)
- 42 CFR 424.57: DMEPOS supplier standards
- CMS: Medicare revalidations
- CMS: NPI check digit
- NPPES NPI Registry
Not checked
- What the Medicare Administrative Contractor reviewer sees and decides, including site visits, background checks and fingerprinting.
- Whether licenses, registrations and insurance are valid with the issuing board or carrier. Expiration dates are checked only as you entered them.
- Ownership, managing employee and final adverse action details, and PECOS screens not covered by the input.
- The CMS-855A, CMS-855R, CMS-855O and CMS-20134 forms.
- Whether the documents you marked as ready are the right ones and are complete.
The NPPES lookup
When the NPI passes the format and check digit tests, each run makes one request to the public NPPES NPI Registry API (version 2.1) with that NPI and nothing else. The answer is used to run the registry rules and then discarded: it is not stored, cached between runs or included in the response. If the registry cannot be reached, the call returns HTTP 503 with the code registry_unavailable and is not charged.
Example responses
A paid pre-check of the sample draft (report shortened), and the findings from a demo run of the sample with errors. Both generated by running the real endpoint code; because the sample NPI is invented, the registry answer in these two examples is simulated.
{
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f",
"api": "pecos-enrollment-precheck",
"mode": "paid",
"charged": true,
"priceCents": 2500,
"balanceCents": 7500,
"report": {
"schemaVersion": 1,
"status": "PASS",
"enrollmentType": "855B",
"applicationReason": "initial",
"asOf": "2026-10-05",
"processingWindowDays": 90,
"windowEnds": "2027-01-03",
"registry": {
"queried": true,
"source": "NPPES NPI Registry API, version 2.1 (queried live during the run)",
"note": "Queried live for this run only. Registry data is not stored, cached or returned."
},
"counts": {
"practiceLocations": 1,
"credentials": 1,
"documentsRequired": 3,
"documentsMissing": 0
},
"readiness": [
{
"item": "npi",
"label": "NPI is well formed and active in NPPES as the right type",
"status": "ready"
},
{
"item": "names",
"label": "Legal name matches the IRS name and the NPPES record",
"status": "ready"
},
{
"item": "taxonomy",
"label": "Taxonomy codes match the NPPES record",
"status": "ready"
},
{
"item": "addresses",
"label": "Practice locations are complete, with ZIP+4",
"status": "ready"
},
{
"item": "credentials",
"label": "Licenses, registrations and insurance stay current through the processing window",
"status": "ready"
},
{
"item": "documents",
"label": "Supporting documents for this form are ready",
"status": "ready"
},
{
"item": "signatures",
"label": "The right person is set to sign",
"status": "ready"
},
{
"item": "revalidation",
"label": "Revalidation is not past its due date",
"status": "not-applicable"
}
],
"findingCount": 0,
"findingCounts": {
"error": 0,
"warning": 0
},
"ruleCounts": {},
"findingsTruncated": false,
"scope": "A pre-submission error check of the draft you sent. A clean pre-check does not guarantee that the enrollment will be approved, it is not an enrollment filing, and it is not legal advice.",
"input": {
"format": "json",
"bytes": 907
},
"inputSha256": "7fc3172e9ff748bce5baad28ba32b74e0f6ef48f20cbccac14abf9239fc0bf14"
}
}[
{
"severity": "error",
"ruleId": "PEC-ADDR-POBOX",
"path": "/practiceLocations[0]/street1",
"message": "A practice location must be a street address, not a P.O. box.",
"source": "cms855b"
},
{
"severity": "error",
"ruleId": "PEC-CRED-EXPIRED",
"path": "/credentials[1]/expirationDate",
"message": "This item has already expired. Renew it before you submit."
},
{
"severity": "error",
"ruleId": "PEC-DOC-MISSING",
"path": "/documents/cp575",
"message": "Missing supporting document: IRS confirmation of the TIN and legal business name (for example CP-575) (Section 12 of the form).",
"source": "cms855b"
},
{
"severity": "error",
"ruleId": "PEC-NAME-IRS",
"path": "/provider/legalName",
"message": "The legal business name does not match the IRS name you gave. CMS requires the name reported to the IRS.",
"source": "cms855b"
},
{
"severity": "error",
"ruleId": "PEC-NPPES-NAME",
"path": "/provider/legalName",
"message": "The legal business name does not match the organization name on the NPPES record for this NPI. The CMS-855B asks for the same legal business name and TIN used to get the NPI.",
"source": "cms855b"
}
]Errors
See the shared error table. Rejected with HTTP 400 and not charged: a body that is not a JSON object, an enrollmentType other than 855I, 855B or 855S, a missing provider, wrong value types, an out-of-range processingWindowDays. HTTP 503 registry_unavailable: NPPES could not be reached; not charged. Example (HTTP 400):
{
"error": {
"code": "input_error",
"message": "enrollmentType must be one of 855I, 855B or 855S. Other CMS-855 forms are not supported yet.",
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f",
"charged": false
}
}Code samples
curl -X POST "https://www.spreadrun.com/api/v1/pecos-enrollment-precheck" \
-H "Authorization: Bearer $SPREADRUN_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @enrollment_draft.json