Endpoints
Get Freshness Summary
Response
List Freshness Status
Query Parameters
Response
Get Asset Freshness
Response
Trigger Freshness Check
Requires
read-write or admin scope.Query Parameters
Response (async)
Response (sync with wait=true)
Gate Pattern: require_fresh()
The SDK provides a convenient gate pattern for pipelines:CLI Check Command
The CLI provides acheck command that exits with code 1 if data is stale:
Error Responses
Asset Not Found (404)
Forbidden (403)
When attempting to trigger refresh without proper scope:Common Questions
What’s the difference between the async and sync refresh calls?
Withoutwait=true, POST /freshness/{id}/refresh returns immediately with a job_id and status=pending. With wait=true, the request blocks until the check completes and returns the actual is_fresh result. Use async for fire-and-forget cron triggers and sync when a pipeline needs the answer before proceeding.
How do I gate an Airflow or dbt pipeline on freshness?
In Python, callclient.freshness.require_fresh("...") which raises StalenessError when stale, which fails the task cleanly. In shell, run armor freshness check <asset> and rely on exit code 1 for stale. The Airflow integration guide shows the full DAG pattern.
Where does the freshness threshold come from?
Each asset has athreshold_hours configured from the dashboard (Freshness tab on the asset page) or inferred from historical update cadence. The API response shows the active threshold_hours next to hours_since_update so you can display both in your own UI.
Why does freshness return status=unknown?
unknown means AnomalyArmor hasn’t yet observed enough update history to decide, typically for newly connected assets or tables that haven’t been written to since the source was connected. Trigger a refresh to get a current read, and give the asset a few update cycles for the baseline to fill in.