Send up to 1,000 Acrematic property IDs and get back a scored assessment and an estimated value range for each one.
Each analysis combines parcel, valuation and sales records with terrain, road access, flood and census data and satellite and Street View imagery, then has an AI model score the property.
| Production base URL | https://ai.acrematic.com |
| Staging (test) base URL | https://ai-staging.acrematic.com |
| Format | JSON over HTTPS |
| Authentication | API key, sent as a Bearer token; staging and production use separate keys |
| Model | Asynchronous: start a job, then poll for results or receive a callback |
A job takes from a few seconds to several minutes, depending on how many properties it holds and how many are already analysed.
Build and test against staging, https://ai-staging.acrematic.com, with your staging key. It has the same endpoints, responses and limits as production, and its usage is not billed. Switch the base URL and key to production when you go live.
Every request needs your API key in the Authorization header. Acrematic issues one key per customer per environment; contact your Acrematic representative to get one.
Authorization: Bearer YOUR_API_KEY
401 Unauthorized.POST/properties/deep_research
Starts a job and returns its job_id immediately, with status 202 Accepted.
| Field | Type | Required | Description |
|---|---|---|---|
property_ids | array of strings | Yes | Acrematic property IDs to analyse, 1 to 1,000. Duplicates are removed. |
callback_url | string | No | An https:// URL we POST to when the job finishes. See Completion callbacks. |
curl -X POST https://ai.acrematic.com/properties/deep_research \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"property_ids": ["177624185", "24432507"],
"callback_url": "https://example.com/hooks/acrematic"
}'
{
"success": true,
"job_id": "8f14e45f-ceea-467a-9a3c-2c1b4b3c6d01",
"status": "started",
"total_items": 2,
"message": "Deep research job started. Poll /properties/deep_research/jobs/8f14e45f-ceea-467a-9a3c-2c1b4b3c6d01 for status."
}
Keep the job_id: you need it to fetch results.
GET/properties/deep_research/jobs/{job_id}
Returns the job's progress and every result finished so far. Results appear as each property completes, so you can read partial results while the job runs.
curl https://ai.acrematic.com/properties/deep_research/jobs/8f14e45f-ceea-467a-9a3c-2c1b4b3c6d01 \
-H "Authorization: Bearer YOUR_API_KEY"
status | Meaning |
|---|---|
started | Accepted, not yet running |
processing | Running; results holds the properties finished so far |
completed | Finished; every property has a result or an error |
failed | The job stopped unexpectedly; finished results are still returned |
| Field | Description |
|---|---|
total_items | Properties in the job, after duplicates are removed |
processed_items | Properties analysed successfully |
failed_items | Properties that could not be analysed |
progress_pct | Percent of properties finished, successful or not |
results | Object keyed by property ID; each value is that property's analysis |
errors | Object keyed by property ID with the reason, for example "Property not found"; null when there are none |
created_at, started_at, completed_at | Timestamps (UTC) |
Nine attributes, each with a score from 1 to 10 (10 is best), a short summary and a detail explanation: slope, access, infrastructure, location, flood, environmental, view, neighborhood, comparable_value.
Alongside them: overall_assessment (text), estimated_value_range (low, high, basis), comp_summary, buildability, utilities (electricity, water, sewer, road_access), images used in the analysis, and metadata.
{
"success": true,
"job_id": "8f14e45f-ceea-467a-9a3c-2c1b4b3c6d01",
"status": "completed",
"total_items": 2,
"processed_items": 2,
"failed_items": 0,
"progress_pct": 100.0,
"results": {
"177624185": {
"slope": {"score": 7, "short": "Gentle slope", "detail": "..."},
"access": {"score": 8, "short": "Paved road access", "detail": "..."},
"flood": {"score": 9, "short": "Minimal flood risk", "detail": "..."},
"overall_assessment": "Good development potential...",
"estimated_value_range": {"low": 85000, "high": 125000, "basis": "Based on 12 comparable sales"},
"utilities": {"electricity": true, "water": false, "sewer": false, "road_access": true}
}
},
"errors": null,
"created_at": "2026-10-26T15:02:11Z",
"started_at": "2026-10-26T15:02:11Z",
"completed_at": "2026-10-26T15:03:40Z"
}
The example is shortened; real results include all nine attributes and every field listed above.
Polling: check every 10 to 30 seconds and stop once status is completed or failed. Or skip polling and use a callback.
If you pass a callback_url, we POST to it once when the job finishes, whether it completed or failed, so you don't need to poll.
{
"job_id": "8f14e45f-ceea-467a-9a3c-2c1b4b3c6d01",
"event_name": "job_finished",
"status": "completed",
"total_items": 2,
"processed_items": 2,
"failed_items": 0
}
The callback is a notification only. Fetch the results with the GET request above.
https:// and point to a public internet address.2xx quickly and do your processing afterwards.Errors return a JSON body with a machine-readable code:
{
"success": false,
"error": {"code": "RATE_LIMITED", "message": "Daily limit of 5000 properties reached ...", "details": {}}
}
| HTTP | code | Cause | What to do |
|---|---|---|---|
| 400 | INVALID_REQUEST | Body is not JSON, property_ids is missing or empty, or callback_url is not a public https:// URL | Fix the request |
| 400 | TOO_MANY_PROPERTIES | More than 1,000 property IDs in one job | Split into several jobs |
| 401 | UNAUTHORIZED | Missing or invalid API key | Check the Authorization header |
| 404 | NOT_FOUND | Unknown job_id, or a job started with a different API key | Use the job_id your key created |
| 429 | RATE_LIMITED | Your daily property limit is used up; details shows the limit and usage | Wait, or ask us to raise the limit |
| 500 | INTERNAL_ERROR | Unexpected error on our side; includes a requestId | Retry later; send us the requestId if it persists |
A property that can't be analysed doesn't fail the job: it appears under errors with its reason, and the rest of the job continues.
Usage is metered per property analysed successfully, per production API key. Properties listed under errors are not counted, and staging usage is not billed. Pricing is set out in your agreement with Acrematic.