Get scan status
Status of one scan started by Start a social scan. Poll this
until status is completed, failed, or cancelled, then read the results from
List social discussions.
GET /brands/{brand_id}/social/scans/{scan_id}Authorization
| Header | Type | Required |
|---|---|---|
Authorization | Bearer asky_sk_… | required |
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
brand_id | uuid | required | From List brands |
scan_id | uuid | required | From Start a social scan |
Request
cURL
curl --request GET \
--url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/social/scans/7c9e1f3a-4b2d-4e6f-8a1c-9d3e5b7f2a10' \
--header 'Authorization: Bearer <api-key>'Response
200
{
"data": {
"job_id": "7c9e1f3a-4b2d-4e6f-8a1c-9d3e5b7f2a10",
"status": "completed",
"current_step": "done",
"channel": "reddit",
"result_count": 10,
"credit_cost": 20,
"is_free_scan": false,
"opportunities_processed": 34,
"opportunities_classified": 10,
"drafts_generated": 0,
"error_message": null,
"started_at": "2026-08-27T09:12:04.000Z",
"completed_at": "2026-08-27T09:14:41.000Z",
"created_at": "2026-08-27T09:12:00.000Z"
},
"request_id": "req_4e8c1a3f7b2d46f0ba9c"
}Response fields
| Field | Type | Description |
|---|---|---|
data.job_id | uuid | required |
data.status | string | required. pending, running, completed, failed, or cancelled |
data.current_step | string | null | Internal pipeline step name, mainly useful for support |
data.channel | string | null | reddit or linkedin |
data.result_count | integer | null | The count requested when the scan was started |
data.credit_cost | integer | null | 0 when the scan was free |
data.is_free_scan | boolean | null | |
data.opportunities_processed | integer | required. Threads or posts examined so far |
data.opportunities_classified | integer | required. Of those, how many were kept as real opportunities |
data.drafts_generated | integer | required. Always 0 for a scan started through this endpoint — drafting is a separate step |
data.error_message | string | null | Set when status is failed |
data.started_at | timestamptz | null | |
data.completed_at | timestamptz | null | |
data.created_at | timestamptz | required |
request_id | string | required. Also returned as the x-request-id header. Quote it when contacting support |
Errors
| Status | Code | When |
|---|---|---|
| 401 | invalid_token | The key is missing, malformed, or does not exist |
| 401 | token_expired | The key passed its expiry date |
| 401 | token_revoked | The key was revoked |
| 404 | not_found | The brand does not exist, the scan does not exist, or this key is not allowed to reach either. All three are deliberately indistinguishable |
| 429 | rate_limited | Over 300 requests per minute. See the Retry-After header |
Notes
There is no list endpoint for past scans yet — only lookup by the job_id a start call
returned. Keep it if you want to check back on it.
opportunities_processed and opportunities_classified update while the scan runs, not only
at the end. A scan that never finds anything relevant can legitimately complete with both at 0.
Last updated on