generated: '2026-08-14'
method: searched
source: https://developer.waystar.com/documents/integration-basics/
provider: Waystar
providerId: waystar
description: >-
Cross-cutting request/response semantics for the Waystar API surface, read from
the Waystar developer portal. Waystar is not a single REST API - it is a set of
product APIs built in different eras on different styles (form-POST + HMAC
signature, CAQH CORE SOAP, and a newer JSON/REST layer), all of them wrapping
X12 EDI transactions. The conventions below are what an integrator actually has
to hold in their head; they differ per surface and this file records those
differences rather than flattening them.
authentication:
style: per-surface - see authentication/waystar-authentication.yml
summary: >-
HMAC-SHA1 body signature (classic Developer Suite), HMAC-SHA256 Authorization
header (Estimation), UserID/Password form fields (Eligibility REST), HTTP
Basic (Credential Management, Prior Authorization), WS-Security UsernameToken
(SOAP claims/claim status), X.509 client cert (Eligibility SOAP), SAML 2.0
(portal SSO).
ref: authentication/waystar-authentication.yml
idempotency:
supported: true
mechanism: signature-and-content-deduplication
scope: Patient Estimation API (estimationapi.zirmed.com/1.0)
window: 30 seconds
rule: >-
"Duplicate POSTs within a 30 second window will be ignored (identical HMAC
signature and content)." Because the HMAC signature is computed over the
method, lowercased URI, UTC Date, CustID and Base64 body, an identical retry
inside the window is collapsed by Waystar rather than creating a second
estimate. This is content-addressed idempotency - there is no client-supplied
Idempotency-Key header.
replay_protection:
mechanism: timestamp-window
window: '+/- 30 seconds from current UTC'
rule: >-
"POST requests must have a UTC DateTime stamp +/- 30 seconds from current
UTC time to be valid." The Date header (RFC 1123) is part of the signed
representation, so a replayed request outside the window fails signature
validation.
also_applies_to: >-
The classic Developer Suite calls carry a TS parameter (UTC timestamp,
MM/DD/CCYY HH:MI:SS PM) that is folded into the HMAC signature and is
REQUIRED on the newer URIs - the same replay-protection role.
caveats: >-
Idempotency is NOT uniform. The ZPay transaction endpoints, the eligibility
gateway and the claim intake endpoints publish no deduplication window; a
retried claim submission or card debit is a NEW transaction. Treat only the
Estimation POST as safely retryable, and use ZPay's Transaction/Status call
before any payment retry.
header: null
source: https://developer.waystar.com/documents/patient-access/patient-estimation/
async_pattern:
style: post-then-poll
description: >-
Waystar's two newest REST surfaces both use submit-then-poll rather than a
synchronous response, because the real work happens at the payer.
flows:
- api: Patient Estimation
submit: POST /estimate -> returns the Estimate ID
poll: GET /estimate/{estimateid}
completion_field: EligibilityStatus
completion_values: [Active Coverage, Inactive Coverage, Pending, Error]
secondary_field: EstimateStatus
secondary_values: [Complete, Incomplete]
typical_latency: 10-16 seconds
- api: Prior Authorization
submit: POST /1.0/Rest/Request/Submit -> acknowledgement, no interim 278 payload
poll: GET /1.0/Rest/Request/Status
completion_note: >-
Status "Waiting Response" means still processing. "Not Found" can be a FINAL
status - Waystar could not locate the authorization - and requires a fresh
278x215 submission to re-check later, not a longer poll.
- api: Eligibility (REST gateway)
style: synchronous
note: >-
GatewayAsync.ashx is named async but returns the payer response on the same
request; the asynchrony is internal.
pagination:
supported: false
note: >-
No cursor or offset pagination is documented on any Waystar surface. Bulk
retrieval is done through SFTP file download directories, not paged API
reads. Claim history returns the full matched set for the supplied CustID and
query parameters.
versioning:
scheme: uri-path
note: >-
Versions appear as a path segment near the host root - /1.0/ on eligibility,
estimation, ZPay, prior authorization and credential management;
claimsapi.zirmed.com carries both /1.0/ and a /2.0/v1/ path
(/2.0/v1/History/GetClaimHistory). A Version=1.0 query parameter is also used
on the legacy ServiceHandler surface. There is no version header and no
date-based version train.
current:
eligibility: '1.0'
estimation: '1.0'
zpay: '1.0'
prior_authorization: '1.0'
credential_management: '1.0'
claim_history: 2.0/v1
legacy_service_handler: '1.0'
content_negotiation:
request_formats: [X12 EDI, Waystar SF1 simplified format, JSON, XML, CSV, HL7 v2.3 ADT, SOAP]
response_formats: [HTML, TEXT, X12 271, JSON, FullJSON, X12definedXML, XML, PDF stream, CSV]
mechanism: >-
Format is selected by request PARAMETER, not by an Accept header. The
eligibility gateway takes DataFormat (X12 | SF1) for the inbound payload and
ResponseType (HTML | TEXT | 271 | JSON | FullJSON | X12definedXML) for the
outbound. HTML is the default response type.
guidance: >-
Waystar explicitly warns that the HTML and TEXT responses are cosmetic and
subject to change without notice - "if you need to extract data from a
Waystar response, we recommend you use the 271 Response for that purpose."
Machine consumers should request 271, FullJSON or X12definedXML. This is the
single most important convention on the eligibility surface.
error_envelope:
uniform: false
shapes:
- surface: Eligibility REST gateway
shape: >-
Errors default to HTML format even when X12 was requested. Waystar advises
verifying the presence of the X12 envelope structure as the first step on
receipt. "Failed at Payer", payer timeouts and "Failed at Waystar" return
X12 carrying the detail.
- surface: Claim status 276/277 SOAP
shape: Named error scenario + human-readable error message inside the 277/SOAP response.
- surface: ZPay
shape: '; EPIC variant returns e_status / e_message key-value pairs.'
- surface: Estimation
shape: StatusMessage on the response for EligibilityStatus=Error; an .. element when EstimateStatus=Incomplete.
- surface: Credential Management
shape: Prose success/error strings; 500 on an uncaught validation failure.
rfc9457: false
ref: errors/waystar-problem-types.yml
identifiers:
primary: CustID
description: >-
Hierarchical Waystar customer identifier - one per client and one per
facility/site, groupable under the client. Every signed call carries it, the
HMAC key is bound to it, and a token created under one CustID cannot be used
under another.
others:
- name: PayerID
note: Waystar Payer ID from the Payer ID List; SELF is reserved for self-pay. Self00 is the convention for Coverage Detection tracking.
- name: zirmedclaimid / zirmedinstanceid
note: Claim and claim-instance identifiers surfaced in claim history and PDF linkback URLs.
- name: Token
note: GUID payment token scoped to a single CustID; can expire.
- name: EstimateID
note: Returned by POST /estimate and used to poll and to fetch the PDF summary.
- name: InquiryId
note: Eligibility inquiry identifier returned in the JSON envelope.
rate_limit_signaling:
headers: none-published
note: >-
Waystar publishes no RateLimit-* or Retry-After headers and no numeric
per-second caps. The one hard published cap is a request-size limit -
ImmediateClaims rejects any submission of more than 50 claims. See
rate-limits/waystar-rate-limits.yml.
ref: rate-limits/waystar-rate-limits.yml
tracing:
request_id_header: none
note: >-
No request-id header is documented. Correlation is done with domain
identifiers instead - TransID and RequestID on the signed calls, TracingNumber
(the batch id) returned by ImmediateClaims, InquiryId on eligibility, and the
X12 TRN segment inside the EDI payloads themselves.
file_services:
transport: SFTP
host: sshftp.waystar.com
directories: [upload, download]
convention: >-
Routing is by FILE EXTENSION, not by directory or metadata - the extension IS
the API. .CLP professional claims, .CLI institutional claims, .CLD dental,
.ELG eligibility, .EST estimation, .COV coverage detection, .PS print
services, .PLB EOB image / BAI upload, .835 remittance, .276 batch claim
status, .PAT patient center, .HL7 patient center ADT, .POP Waystar program
management. A period must not appear in the filename before the extension.
response_naming: '[CustID].[FileCreateDate CCYYMMDD].[FileCreateTime 24HHMMSSNNN].CL[P/I].277.txt'
schedule: >-
277U response files are written to the download directory at midnight Eastern
on each day the account had claim activity; Waystar recommends polling the
download directory at the start of the work day.
lockout: 5 consecutive failed connection attempts blacklists the source IP.
standards_alignment:
caqh_core: >-
The eligibility MIME endpoint implements CAQH CORE Phase II Connectivity Rule
envelope standard A; the SOAP endpoints implement envelope standard B
(CORERule2.2.0). The claim status SOAP endpoint uses
COREEnvelopeRealTimeRequest / COREEnvelopeRealTimeResponse with PayloadType
X12_276_Request_005010X212 and X12_277_Response_005010X212.
x12: 005010 HIPAA transaction sets - 270/271, 276/277, 278 (x215 and x217), 837P/I/D, 835
ref: conformance/waystar-conformance.yml
cross_references:
errors: errors/waystar-problem-types.yml
lifecycle: lifecycle/waystar-lifecycle.yml
authentication: authentication/waystar-authentication.yml
rate_limits: rate-limits/waystar-rate-limits.yml
sandbox: sandbox/waystar-sandbox.yml
data_model: data-model/waystar-data-model.yml
maintainers:
- FN: Kin Lane
email: kin@apievangelist.com