Docs / Job Data API / Endpoints / Retrieve a job
Retrieve a job
Returns one posting by id. It reads stored data and does not crawl on demand, so a posting whose page the crawler has not fetched has a null description here too — this endpoint is for fetching a known id, not for filling in a sparse row.
Parameters
| Parameter | Type | Description |
|---|---|---|
id required |
string | The posting id from a list response. Ids are stable while a posting exists, but a posting is removed when the source removes it — take ids from a list response rather than from here. |
Request
curl https://api.softon.dev/v1/jobs/glorri:unibank-region-filiallari-uzre-konullu-seki-79999900 \
-H "Authorization: Bearer $SOFTON_KEY"
req, _ := http.NewRequestWithContext(ctx, "GET", "https://api.softon.dev/v1/jobs/glorri:unibank-region-filiallari-uzre-konullu-seki-79999900", nil) req.Header.Set("Authorization", "Bearer "+os.Getenv("SOFTON_KEY")) res, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer res.Body.Close() var page struct { Data Job `json:"data"` Meta struct{ Next *string `json:"next"` } `json:"meta"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { log.Fatal(err) }
import json, os, urllib.parse, urllib.request url = "https://api.softon.dev/v1/jobs/glorri:unibank-region-filiallari-uzre-konullu-seki-79999900" req = urllib.request.Request(url, headers={ "Authorization": "Bearer " + os.environ["SOFTON_KEY"], }) page = json.load(urllib.request.urlopen(req)) # page["data"] is the object; page["error"] is None on success
const url = new URL("https://api.softon.dev/v1/jobs/glorri:unibank-region-filiallari-uzre-konullu-seki-79999900"); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.SOFTON_KEY}` }, }); if (!res.ok) throw new Error(`${res.status} ${await res.text()}`); const { data, meta } = await res.json();
Response
The envelope is identical on every softon.dev API: data, meta, error. Only the shape inside data changes per dataset — see the response envelope.
{
"data": {
"id": "glorri:unibank-region-filiallari-uzre-konullu-seki-79999900",
"source": "glorri",
"title": "Region filialları üzrə könüllü (Şəki)",
"company": { "name": "Unibank Kommersiya Bankı", "slug": "unibank" },
"location": "Şəki, Azərbaycan",
"remote": false,
"employment_type": "Volunteer",
"job_function": "Customer relations",
"career_level": null,
"posted_at": "2026-08-04T19:18:51.735Z",
"description": "- Filiala müraciət edən müştərilərin qarşılanması və ilkin məlumatlandırılması;\n- Müştərilərin ehtiyaclarının müəyyənləşdirilməsi…",
"requirements": "- Ali təhsil və ya universitet tələbəsi;\n- Müştərilərlə işləmək və komanda mühitində fəaliyyət göstərmək bacarığı;…",
"facts": {
"Apply Before": "September 3, 2026",
"Category": "Sales and Customer Services",
"Job Posted On": "August 4, 2026",
"Job Type": "Volunteer"
},
"ingested_at": "2026-08-04T23:55:43.722474Z"
},
"meta": { "request_id": "req_9Fv3" },
"error": null
}
Fields of data
| Field | Type | Description |
|---|---|---|
id |
string | Stable identifier, "<source>:<source id>". Pass it to /v1/jobs/{id}. |
source |
string | Which scraper produced this posting. |
title |
string | Posting title as published. |
company |
object · nullable | The hiring company: name and slug. null when the source omits it. |
location |
string · nullable | Free-text location as published. |
remote |
boolean · nullable | Whether the posting is remote-eligible. |
employment_type |
string · nullable | Full-time, Part-time, Contract, as the source labels it. |
job_function |
string · nullable | The source's own function taxonomy, not normalised across sources. |
career_level |
string · nullable | The source's own seniority label. Not normalised, so it is not called "seniority". |
posted_at |
timestamp · nullable | When the posting first appeared, RFC 3339. |
url |
string · nullable | Canonical page on the source site. |
description |
string · nullable | Full posting body. Present when the crawler has fetched the posting's own page, null otherwise — on collections and on /v1/jobs/{id} alike, since neither fetches on demand. |
requirements |
string · nullable | Requirements section when the source separates it, subject to the same condition as description. |
facts |
object · nullable | The source's own labelled metadata, e.g. "Apply Before". Label set differs per source. |
ingested_at |
timestamp | When this version was stored. |
Try it
Send the request to see a response.