Appraisal Host API
Place appraisal orders with an appraisal management company that runs on Appraisal Host, follow every order to delivery, and receive the finished report package in your own system.
Environments
| Environment | Base URL | Purpose |
|---|---|---|
| Production | https://api.appraisalhost.com/v1 | Live orders. |
| Sandbox | https://sandbox.api.appraisalhost.com/v1 | Build and test against real behavior with test data. Access is provisioned on request by our integrations team. |
Both environments speak the same contract. The only differences are listed on the Sandbox page.
Machine readable contract: /developers/spec/openapi.json
(OpenAPI 3.1). Generate a client from it, import it into your API tooling, or
read it alongside these pages.
What the API does
- Read which lender account and which appraisal management company a credential belongs to, before you use it.
- Read the products a lender may order, and the report format each one is delivered in.
- Place an order, with the loan, the property, the borrower and the contacts.
- Follow the order through its lifecycle: assignment, appointment, delivery.
- Put an order on hold, resume it, or cancel it.
- Ask for a correction or a reconsideration of value on a delivered report.
- Exchange messages with the appraisal management company, and with the appraiser where the company allows direct contact.
- Upload supporting documents, and download every delivered document through a short lived signed link.
- Receive signed webhooks for everything above, with a catch-up feed so an outage on either side loses nothing.
Who it is for
The API is built for the system that already holds the loan file: a loan origination system, a point of sale, a servicing platform, or an in house ordering tool. It is a lender side interface. It places and follows orders on behalf of a lender account at an appraisal management company. It is not an appraiser interface, and it does not expose another lender's orders.
The integration model
One address serves every appraisal management company on the platform.
Each credential we issue belongs to one lender account at one company, so the credential itself tells us where an order belongs. You store one base URL and, per lender you serve, one client id and one client secret. There is no per company address to look up, no routing header to set, and no tenant identifier to send.
Your system -> https://api.appraisalhost.com/v1 -> the lender's appraisal
(one address, one credential management company
per lender)
The appraisal management company stays in control. It decides which of its lenders may use the API, issues and revokes their credentials, and sets the endpoint we deliver events to. Nothing in the API lets one lender see another lender's work.
Getting started in five steps
- Ask our integrations team for sandbox access at
integrations@appraisalhost.com. You receive a client id and a client secret for a test lender account. - Exchange them for a token, then call
GET /accountand check that the lender it names is the lender you think the credential is for: see Authentication. - Read
GET /order-typesto learn which products the lender may order, which loan types and add-ons apply, and which report format each product is delivered in. - Place an order with
POST /orders, then follow it with webhooks or by pollingGET /orders. - When the report is delivered, read the documents on the order and download each one through its signed link.
curl -s -X POST https://sandbox.api.appraisalhost.com/v1/oauth/token \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "client_credentials",
"client_id": "cli_example_2f8c41",
"client_secret": "example_secret_do_not_use_9f4b1c77ae"
}'
{
"access_token": "aht_at_7Qk2rX9wTm4ZbN1sV6yH0pL8",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "lender"
}
curl -s https://sandbox.api.appraisalhost.com/v1/order-types \
-H 'Authorization: Bearer aht_at_7Qk2rX9wTm4ZbN1sV6yH0pL8'
Conventions at a glance
| Topic | Rule |
|---|---|
| Format | JSON in, JSON out, UTF-8. |
| Authentication | Authorization: Bearer <token> on every call except GET /ping and the token endpoint. |
| Identifiers | Opaque prefixed strings: ord_, doc_, msg_, rr_, evt_, cli_, len_, cmp_. Store them as strings and do not parse them. |
| Timestamps | ISO-8601 in UTC, for example 2026-09-17T14:32:05Z. Dates alone are YYYY-MM-DD. |
| Money | A decimal string with a separate currency code, for example "525.00" and "USD". Never a floating point number. |
| Errors | One body shape everywhere: code, message, optional details, correlation_id. |
| Lists | data array plus page, per_page, total, total_pages. The event feed uses a cursor. |
| Rate limit | 600 requests per minute per client. |
| Versioning | The version is in the path. Additive changes only within v1, and 12 months of notice before anything breaking. |
Full detail is on the Reference notes page.
What the API deliberately does not do
- It never accepts card details. Orders placed through the API are billed to
the lender account the credential belongs to, and that account has to be one
the appraisal management company invoices. An account that pays for each order
by card cannot order through the API: a create on one is refused with
403and codeaccount_not_billable. Ask the company to put the account on invoicing first. - It does not negotiate fees. The fee is readable, and a change raises an event, but the conversation happens between the lender and the appraisal management company.
- It does not expose appraiser side work or another lender's orders. What you read is what the lender reads in the portal, in the same words.
Where to go next
- Authentication: tokens, rotation, scopes, limits.
- Sandbox: how to get access and how test orders progress.
- Order lifecycle: order types, creating orders, the full status catalog, holds, corrections, and which documents arrive.
- Webhooks: the event catalog, signature verification, retries, and the catch-up feed.
- Reference notes: conventions, errors, versioning.
- Changelog and Support.