---
title: "Acknowledge a completed check — probe submits result (authenticated via o2syn_ token)"
method: POST
path: "/api/{org_id}/synthetics/jobs/ack"
tags: ["Synthetics"]
---

# Acknowledge a completed check — probe submits result (authenticated via o2syn_ token)

`POST /api/{org_id}/synthetics/jobs/ack`

## Request

- Base URL: `https://api.openobserve.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openobserve.ai/api/{org_id}/synthetics/jobs/ack`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/openobserve/apis/openobserve-api-http/docs/api/:org_id/synthetics/jobs/ack/post.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `org_id` string, required

## Request body

- object

## Response `200`

Success

- union
  - SyntheticsJobAckResponse
    - `alert` 'Silent' | 'Firing' | 'Recovered' | 'Flaky' | 'Degraded', required: The notification a completed run should send, resolved against the check's `alert_if_fails` / `cooldown_mins` settings and its persisted alert state.
    - `consecutive_failures` integer, required
    - `destinations` string[], required
    - `failing_environments` string[], required: Environments of this run that did not pass, worst first, by name.
    - `failing_locations` string[], required: Locations of this run's jobs that did not pass, worst first. Empty unless the run completed and something failed. Without it a notification for a six-location check could only say "the check is failing" — the reader had to open the UI to find out where.
    - `job_count` integer, required: Total number of jobs (locations) in this run — for notification context.
    - `job_id` string, required
    - `location` string, required
    - `org_id` string, required
    - `passing_locations` string[], required: Locations of this run's jobs that passed, alphabetical. Carried alongside the failing set because a recovery notification has no failing locations to name — that is what "recovered" means — so without this the message degraded to a bare count. Both sides also make a partial recovery expressible.
    - `pool` string, required
    - `run_complete` boolean, required
    - `run_id` string, required
    - `run_status` string, nullable: Aggregate run status string when run_complete = true: "passed"|"warning"|"failed"|"error". None while the run still has pending jobs.
    - `status_reason` string, nullable: Runs that had failed back to back when `alert` was resolved. 0 unless firing — a notification that says "failing" is more useful when it also says for how long. Why the run was a warning, echoed from the ack so the notification can say "the certificate is expiring" rather than a generic "degrading".
    - `synthetic_type` string, required
    - `synthetics_id` string, required
    - `synthetics_name` string, required
    - `target` string, required
    - `trigger_type` string, required
  - object
    - `results` JobAckResult[], required
      - `error` string, nullable
      - `job_id` string, required
      - `ok` boolean, required
      - `run_complete` boolean, nullable

## Other responses

- `500`: Error

---

[API](https://skmtc.dev/openobserve/apis/openobserve-api-http.md) - [All operations](https://skmtc.dev/openobserve/apis/openobserve-api-http/llms.txt) - [OpenAPI document](https://skmtc.dev/openobserve/apis/openobserve-api-http/revisions/0529b8a10252?raw)
