Skip to main content
Reports are async. POST /v1/analyze returns immediately with 202 Accepted and a report_id. The actual analysis runs in the background and typically completes in 60–120 seconds. Here’s the full state diagram:

States

The API returns lowercase status strings ("completed", "failed"). The internal database uses uppercase (COMPLETED, FAILED) — you’ll only see the lowercase form.

What you get back when it’s done

A completed report includes:
The exact sub-score keys depend on the analysis mode. The details object carries the per-topic narrative (summary + detail bullets per topic, plus regulatory extras for buildability). The considerations array lists actionable follow-ups. estimated_costs gives cost ranges per development category.

What you get back when it fails

Common failure reasons:
  • Address could not be geocoded (typo, ambiguous, or outside the US)
  • Upstream data source (NREL, FEMA, USGS) timed out or returned an error
  • AI analysis exceeded retry budget
Failed reports don’t refund automatically — but if you encounter repeated failures on a valid address, contact support with the report_id and we’ll credit the report.

Webhook vs. polling

Two ways to find out when a report is done: Configure a webhook_url on your customer (dashboard) or per-request. AcreLens POSTs the full completed report to your endpoint, signed with HMAC-SHA256. You don’t poll. You don’t burn rate-limit headroom. See the webhooks guide.

Polling

Hit the poll_url returned in the initial response. While the report is authorized or processing, you’ll get back the basic envelope. Once it flips to completed or failed, you’ll get the full body. If you must poll, wait 30 seconds before the first poll and back off exponentially after that. Hammering the endpoint will hit 429 rate_limit_exceeded.

Format

The API returns structured JSON only — no baked-in PDF, CSV, or other deliverables. Render in your own UI, generate a branded PDF on your end, ask an AI to summarize it, push to Notion, drop in Slack — bring your own format. JSON is the deliverable.

Idempotency and retries

Use an Idempotency-Key header on every POST /v1/analyze to make retries safe. Same key + same body returns the original report_id without creating a new report or charging again. See the idempotency guide.