UAD 3.6 Appraisal Report Validator API
Beta. Structural checks of a UAD 3.6 URAR appraisal file against the GSE-published delivery specification and compliance rules. Product page and free test form.
Endpoint
| Paid | POST https://www.spreadrun.com/api/v1/uad-36-appraisal-validator, API key required, $1.00 per completed report |
|---|---|
| Demo | POST https://www.spreadrun.com/api/demo/uad-36-appraisal-validator, no key, 1 MB, 10 runs per day |
| Body | The UAD 3.6 URAR XML file, or the UAD 3.6 ZIP package. Any Content-Type; ZIP is detected from the content. |
Request
Send the file itself as the request body, up to 4.4 MB (HTTP 413 above that). A ZIP must hold exactly one UAD XML file (MESSAGE root); its PDF and photos are not checked. If the package is over the limit because of photos, send the XML file on its own.
| Query parameter | Default | Meaning |
|---|---|---|
asOf | today (UTC) | A date, YYYY-MM-DD. Rules UAD1258, UAD1259, UAD1505 and UAD1506 compare the effective date and the signature date with it: not in the future, not more than 367 days old. Use it to check an older report as of the date it was signed. |
Rejected with HTTP 400 and not charged: an empty body, a file that is not well-formed XML, DOCTYPE or entity declarations, a root that is not the MISMO MESSAGE element, a MISMOReferenceModelIdentifier other than 3.6, a missing or non-URAR report type (Appraisal Update and Completion Reports included), a ZIP without exactly one UAD XML file, an invalid asOf. A URAR file with problems is not an input error: it gets a completed FAIL report, and that run is charged.
Coverage
The whole file is checked; nothing is sampled. Sources: Appendix A-1: URAR Delivery Specification (UAD Delivery Spec 1.4) and Appendix H-1: URAR Compliance Rules (UAD Compliance Rules v1.5).
- Delivery specification: 810 data point and attribute locations, with their supported values, formats, required flags and repeat limits. See rule IDs.
- Compliance rules: 585 of 728 implemented (480 fatal, 105 warning). A rule is evaluated for each property and container instance it applies to, with three-valued logic: when the file leaves a condition undetermined (a value the condition needs is missing or ambiguous), the rule does not fire. The rest are listed below.
- Not checked: MISMO XSD schema validation, GSE proprietary findings, the PDF and photos in a package, and whether values are true.
Tested against the twelve GSE sample scenarios for UAD 3.6 (single-family, condominium, cooperative, manufactured home and 2- to 4-unit): every one passes with no findings when checked as of its signature date. Where this validator and the Delivery Specification differ, the Delivery Specification controls. SpreadRun is not affiliated with or endorsed by Fannie Mae or Freddie Mac.
Report
| Field | Meaning |
|---|---|
status | FAIL if any error, WARN if only warnings, otherwise PASS. A PASS is not UCDP acceptance. |
reportType, reportContentIdentifier | URAR, and the ValuationReportContentIdentifier from the file. |
mismoReferenceModelIdentifier | From the MESSAGE root, for example 3.6.0366. |
input | container (xml or zip), xmlBytes, and a note when a package was sent. |
properties | Count of valuation PROPERTY elements by @ValuationUseType. |
findings | Up to 500, errors first. Each has severity (error or warning), ruleId, path (XPath-style, with [n] where a container repeats), message, and specReference (the rule's or data point's unique ID in the appendix) when there is one. |
findingCount, findingCounts, ruleCounts, findingsTruncated | Totals, including findings beyond the 500 listed. |
coverage | complianceRulesTotal, complianceRulesEvaluated, complianceRulesNotImplemented (rule IDs), deliverySpecChecks, sampling. |
asOf | The date the clock-based rules were evaluated against. |
inputSha256 | SHA-256 of the request body. |
scope | What the verdict covers, in one sentence. |
Rule IDs
Compliance rule findings use the GSE message ID (UAD and four digits) and its message text, with Fatal rules as errors and Warning rules as warnings. Delivery specification checks use these IDs:
| Rule | Severity | Meaning |
|---|---|---|
A1-UNKNOWN | warning | An element at a location the URAR Delivery Specification does not define. Reported once per path, at the outermost unknown element. |
A1-ENUM | error | An enumerated or boolean data point, or an attribute such as @ValuationUseType, holds a value that is not in its supported list. The message lists the supported values; the value sent is never repeated. |
A1-FORMAT | error | A date, datetime, number or text value does not match the format the specification gives for it (date pattern, sign, digits before and after the decimal point, maximum length). |
A1-EMPTY | error | A data point element is present with no value. |
A1-REQUIRED | error | A data point the specification always requires (R) is missing from a container that is present. Only checked where the path has one meaning for that property type. |
A1-CARDINALITY | error | A container repeats more often under one parent than the specification allows for that property type. |
Example responses
A paid check of the synthetic URAR sample with asOf=2019-09-20, and a demo check of the sample with six deliberate errors. Both generated by running the real endpoint code. The paid example's report is shortened here to its first fields.
{
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f",
"api": "uad-36-appraisal-validator",
"mode": "paid",
"charged": true,
"priceCents": 100,
"balanceCents": 825,
"report": {
"schemaVersion": 1,
"status": "PASS",
"reportType": "URAR",
"reportContentIdentifier": "URAR Delivery Specification v1.4",
"mismoReferenceModelIdentifier": "3.6.0366",
"input": {
"container": "xml",
"xmlBytes": 143406,
"note": null
},
"properties": {
"PropertyAnalyzedNotUsed": 5,
"SalesComparable": 3,
"SubjectProperty": 1
},
"findingCount": 0,
"findingCounts": {
"error": 0,
"warning": 0
},
"ruleCounts": {},
"findings": [],
"findingsTruncated": false,
"coverage": {
"complianceRulesTotal": 728,
"complianceRulesEvaluated": 585,
"complianceRulesNotImplemented": [
"143 rule IDs"
],
"deliverySpecChecks": [
"A1-UNKNOWN",
"A1-ENUM",
"A1-FORMAT",
"A1-EMPTY",
"A1-REQUIRED",
"A1-CARDINALITY"
],
"sampling": "none: every element in the file is checked"
},
"sources": {
"a1": {
"title": "Appendix A-1: URAR Delivery Specification",
"sheet": "UAD Delivery Spec 1.4"
},
"h1": {
"title": "Appendix H-1: URAR Compliance Rules",
"sheet": "UAD Compliance Rules v1.5"
}
},
"inputSha256": "bd92ed33abad081caf83e416d495113b2aac86d77a2cb87e7b0e5721c32a0241",
"scope": "Structural checks against the GSE-published UAD 3.6 URAR delivery specification and compliance rules. A PASS does not mean UCDP acceptance, and this is not legal or compliance advice.",
"asOf": "2019-09-20"
}
}[
{
"severity": "error",
"ruleId": "A1-ENUM",
"path": "/MESSAGE/DOCUMENT_SETS/DOCUMENT_SET/DOCUMENTS/DOCUMENT/DEAL_SETS/DEAL_SET/DEALS/DEAL/SERVICES/SERVICE/VALUATION/VALUATION_RESPONSE/VALUATION_ANALYSES/VALUATION_ANALYSIS/PROPERTIES/PROPERTY[1]/PROPERTY_DETAIL/NativeAmericanLandsIndicator",
"message": "NativeAmericanLandsIndicator is not a supported UAD value. Supported: false, true.",
"specReference": "0100.0054"
},
{
"severity": "error",
"ruleId": "A1-ENUM",
"path": "/MESSAGE/DOCUMENT_SETS/DOCUMENT_SET/DOCUMENTS/DOCUMENT/DEAL_SETS/DEAL_SET/DEALS/DEAL/SERVICES/SERVICE/VALUATION/VALUATION_RESPONSE/VALUATION_ANALYSES/VALUATION_ANALYSIS/PROPERTIES/PROPERTY[1]/PROPERTY_DETAIL/OverallConditionRatingCode",
"message": "OverallConditionRatingCode is not a supported UAD value. Supported: C1, C2, C3, C4, C5, C6.",
"specReference": "1600.0006"
},
{
"severity": "error",
"ruleId": "A1-FORMAT",
"path": "/MESSAGE/DOCUMENT_SETS/DOCUMENT_SET/DOCUMENTS/DOCUMENT/DEAL_SETS/DEAL_SET/DEALS/DEAL/SERVICES/SERVICE/VALUATION/VALUATION_RESPONSE/VALUATION_ANALYSES/VALUATION_ANALYSIS/VALUATION_REPORT/VALUATION_RECONCILIATION/VALUATION_RECONCILIATION_SUMMARY/VALUATION_RECONCILIATION_SUMMARY_DETAIL/AppraisalReportEffectiveDate",
"message": "AppraisalReportEffectiveDate must be a date in YYYY-MM-DD format.",
"specReference": "1300.0012"
},
{
"severity": "error",
"ruleId": "A1-REQUIRED",
"path": "/MESSAGE/DOCUMENT_SETS/DOCUMENT_SET/DOCUMENTS/DOCUMENT/DEAL_SETS/DEAL_SET/DEALS/DEAL/SERVICES/SERVICE/VALUATION/VALUATION_RESPONSE/VALUATION_ANALYSES/VALUATION_ANALYSIS/PROPERTIES/PROPERTY[1]/ADDRESS/PostalCode",
"message": "PostalCode is required in every ADDRESS by the delivery specification.",
"specReference": "0100.0011"
}
]Compliance rules not implemented
143 rules. None of them can produce a finding. Each needs a reading the published rule text does not settle, so it is left out rather than guessed.
| Rule | Severity | Why not |
|---|---|---|
UAD1030 | Fatal | Date arithmetic, sums or nested conditions |
UAD1037 | Fatal | Wording without one unambiguous machine reading |
UAD1043 | Fatal | Wording without one unambiguous machine reading |
UAD1048 | Fatal | Date arithmetic, sums or nested conditions |
UAD1051 | Warning | Date arithmetic, sums or nested conditions |
UAD1053 | Warning | Date arithmetic, sums or nested conditions |
UAD1058 | Warning | Date arithmetic, sums or nested conditions |
UAD1062 | Fatal | Date arithmetic, sums or nested conditions |
UAD1068 | Fatal | Date arithmetic, sums or nested conditions |
UAD1070 | Fatal | Date arithmetic, sums or nested conditions |
UAD1075 | Warning | Date arithmetic, sums or nested conditions |
UAD1080 | Fatal | Date arithmetic, sums or nested conditions |
UAD1086 | Fatal | Row-by-row comparison across all comparables |
UAD1089 | Fatal | Date arithmetic, sums or nested conditions |
UAD1121 | Fatal | Date arithmetic, sums or nested conditions |
UAD1123 | Fatal | Date arithmetic, sums or nested conditions |
UAD1138 | Fatal | Date arithmetic, sums or nested conditions |
UAD1142 | Fatal | Date arithmetic, sums or nested conditions |
UAD1143 | Warning | Date arithmetic, sums or nested conditions |
UAD1149 | Fatal | Wording without one unambiguous machine reading |
UAD1150 | Fatal | Date arithmetic, sums or nested conditions |
UAD1152 | Fatal | Wording without one unambiguous machine reading |
UAD1154 | Fatal | Date arithmetic, sums or nested conditions |
UAD1164 | Fatal | Wording without one unambiguous machine reading |
UAD1177 | Fatal | Wording without one unambiguous machine reading |
UAD1179 | Warning | Wording without one unambiguous machine reading |
UAD1183 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1192 | Fatal | Date arithmetic, sums or nested conditions |
UAD1199 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1200 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1201 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1202 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1207 | Fatal | Date arithmetic, sums or nested conditions |
UAD1209 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1228 | Warning | Wording without one unambiguous machine reading |
UAD1237 | Fatal | Date arithmetic, sums or nested conditions |
UAD1239 | Warning | Wording without one unambiguous machine reading |
UAD1250 | Warning | Row-by-row comparison across all comparables |
UAD1255 | Fatal | Date arithmetic, sums or nested conditions |
UAD1256 | Fatal | Date arithmetic, sums or nested conditions |
UAD1261 | Fatal | Wording without one unambiguous machine reading |
UAD1268 | Fatal | Date arithmetic, sums or nested conditions |
UAD1272 | Warning | Wording without one unambiguous machine reading |
UAD1274 | Fatal | Wording without one unambiguous machine reading |
UAD1278 | Fatal | Wording without one unambiguous machine reading |
UAD1283 | Fatal | Wording without one unambiguous machine reading |
UAD1287 | Fatal | Date arithmetic, sums or nested conditions |
UAD1289 | Fatal | Date arithmetic, sums or nested conditions |
UAD1292 | Fatal | Date arithmetic, sums or nested conditions |
UAD1296 | Fatal | Date arithmetic, sums or nested conditions |
UAD1299 | Fatal | Date arithmetic, sums or nested conditions |
UAD1302 | Fatal | Wording without one unambiguous machine reading |
UAD1304 | Fatal | Date arithmetic, sums or nested conditions |
UAD1310 | Warning | Date arithmetic, sums or nested conditions |
UAD1313 | Fatal | Date arithmetic, sums or nested conditions |
UAD1320 | Fatal | Date arithmetic, sums or nested conditions |
UAD1323 | Fatal | Date arithmetic, sums or nested conditions |
UAD1325 | Warning | Date arithmetic, sums or nested conditions |
UAD1328 | Fatal | Date arithmetic, sums or nested conditions |
UAD1331 | Fatal | Date arithmetic, sums or nested conditions |
UAD1335 | Warning | Date arithmetic, sums or nested conditions |
UAD1339 | Fatal | Wording without one unambiguous machine reading |
UAD1344 | Fatal | Wording without one unambiguous machine reading |
UAD1352 | Fatal | Date arithmetic, sums or nested conditions |
UAD1355 | Fatal | Date arithmetic, sums or nested conditions |
UAD1357 | Warning | Date arithmetic, sums or nested conditions |
UAD1361 | Fatal | Date arithmetic, sums or nested conditions |
UAD1370 | Fatal | Date arithmetic, sums or nested conditions |
UAD1375 | Fatal | Wording without one unambiguous machine reading |
UAD1378 | Fatal | Wording without one unambiguous machine reading |
UAD1398 | Fatal | Date arithmetic, sums or nested conditions |
UAD1400 | Fatal | Date arithmetic, sums or nested conditions |
UAD1405 | Fatal | Date arithmetic, sums or nested conditions |
UAD1421 | Fatal | Date arithmetic, sums or nested conditions |
UAD1439 | Fatal | Wording without one unambiguous machine reading |
UAD1445 | Fatal | Date arithmetic, sums or nested conditions |
UAD1450 | Fatal | Date arithmetic, sums or nested conditions |
UAD1455 | Warning | Row-by-row comparison across all comparables |
UAD1461 | Fatal | Date arithmetic, sums or nested conditions |
UAD1468 | Fatal | Wording without one unambiguous machine reading |
UAD1470 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1477 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1529 | Fatal | Date arithmetic, sums or nested conditions |
UAD1533 | Warning | Wording without one unambiguous machine reading |
UAD1535 | Fatal | Wording without one unambiguous machine reading |
UAD1543 | Fatal | Date arithmetic, sums or nested conditions |
UAD1570 | Fatal | Date arithmetic, sums or nested conditions |
UAD1574 | Fatal | Date arithmetic, sums or nested conditions |
UAD1575 | Fatal | Date arithmetic, sums or nested conditions |
UAD1603 | Fatal | Date arithmetic, sums or nested conditions |
UAD1611 | Warning | Date arithmetic, sums or nested conditions |
UAD1614 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1622 | Warning | Date arithmetic, sums or nested conditions |
UAD1656 | Fatal | Wording without one unambiguous machine reading |
UAD1657 | Warning | Wording without one unambiguous machine reading |
UAD1658 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1667 | Fatal | Date arithmetic, sums or nested conditions |
UAD1680 | Fatal | Date arithmetic, sums or nested conditions |
UAD1683 | Fatal | Date arithmetic, sums or nested conditions |
UAD1685 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1686 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1687 | Fatal | Wording without one unambiguous machine reading |
UAD1689 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1690 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1691 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1692 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1693 | Fatal | Date arithmetic, sums or nested conditions |
UAD1694 | Fatal | Row-by-row comparison across all comparables |
UAD1695 | Warning | Date arithmetic, sums or nested conditions |
UAD1696 | Warning | Date arithmetic, sums or nested conditions |
UAD1698 | Fatal | Wording without one unambiguous machine reading |
UAD1699 | Fatal | Names a data point or container the delivery specification does not define at that location |
UAD1700 | Fatal | Names a data point or container the delivery specification does not define at that location |
UAD1701 | Fatal | Names a data point or container the delivery specification does not define at that location |
UAD1715 | Warning | Wording without one unambiguous machine reading |
UAD1717 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1718 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1719 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1720 | Fatal | Wording without one unambiguous machine reading |
UAD1722 | Fatal | Wording without one unambiguous machine reading |
UAD1730 | Warning | Wording without one unambiguous machine reading |
UAD1733 | Fatal | Date arithmetic, sums or nested conditions |
UAD1734 | Fatal | Date arithmetic, sums or nested conditions |
UAD1741 | Fatal | Wording without one unambiguous machine reading |
UAD1742 | Warning | Wording without one unambiguous machine reading |
UAD1743 | Warning | Wording without one unambiguous machine reading |
UAD1746 | Fatal | Date arithmetic, sums or nested conditions |
UAD1747 | Fatal | Links between parts of the report (RELATIONSHIP / xlink) |
UAD1748 | Warning | Wording without one unambiguous machine reading |
UAD1749 | Warning | Wording without one unambiguous machine reading |
UAD1758 | Warning | Wording without one unambiguous machine reading |
UAD1759 | Fatal | Wording without one unambiguous machine reading |
UAD1763 | Fatal | Wording without one unambiguous machine reading |
UAD1764 | Fatal | Wording without one unambiguous machine reading |
UAD1765 | Fatal | Wording without one unambiguous machine reading |
UAD1766 | Fatal | Wording without one unambiguous machine reading |
UAD1767 | Fatal | Wording without one unambiguous machine reading |
UAD1768 | Fatal | Wording without one unambiguous machine reading |
UAD1769 | Fatal | Date arithmetic, sums or nested conditions |
UAD1774 | Fatal | Date arithmetic, sums or nested conditions |
UAD1777 | Warning | Wording without one unambiguous machine reading |
UAD1778 | Warning | Wording without one unambiguous machine reading |
UAD1779 | Warning | Wording without one unambiguous machine reading |
Evident typos in the published rule text that were corrected so the rule can run: UAD1097 ("in in" read as "in"); UAD1099 ("IMRPOVEMENT" read as "IMPROVEMENT"); UAD1108 ("ConstructionMethod" read as "ConstructionMethodType"); UAD1110 ("ConstructionMethod" read as "ConstructionMethodType"); UAD1116 ("ConstructionMethod" read as "ConstructionMethodType"); UAD1117 ("ConstructionMethod" read as "ConstructionMethodType"); UAD1119 ("ConstructionMethod" read as "ConstructionMethodType"); UAD1120 ("ConstructionMethod" read as "ConstructionMethodType").
Errors
See the shared error table. Example input error (HTTP 400, not charged):
{
"error": {
"code": "input_error",
"message": "The root element must be MESSAGE in the MISMO residential namespace (http://www.mismo.org/residential/2009/schemas). This does not look like a MISMO appraisal file.",
"requestId": "7f3c2a1e-5b8d-4c6f-9e0a-1d2b3c4d5e6f",
"charged": false
}
}Code samples
# XML file
curl -X POST "https://www.spreadrun.com/api/v1/uad-36-appraisal-validator" \
-H "Authorization: Bearer $SPREADRUN_API_KEY" \
-H "Content-Type: application/xml" \
--data-binary @appraisal.xml
# UAD 3.6 ZIP package, date rules as of the signature date
curl -X POST "https://www.spreadrun.com/api/v1/uad-36-appraisal-validator?asOf=2026-09-15" \
-H "Authorization: Bearer $SPREADRUN_API_KEY" \
-H "Content-Type: application/zip" \
--data-binary @appraisal_package.zip