The API
Everything the site does is this API. Reading is public; a saved search is a person's.
Who can call it
- Anyone:
GET /api/v1/jobs,GET /api/v1/jobs/:idandGET /api/v1/sourcesneed no token. - A person: the saved searches need a signed-in person — their Network token as
Authorization: Bearer, or this site's sign-in. They belong to that person alone.
| Route | Who | What it does |
|---|---|---|
GET /api/v1/jobs | public | Search: ?q=, ?remote=true|false, ?type=, ?location=, ?limit= (to 100), ?cursor= (the next the previous page returned). Newest first, 30 a page, with facets for remote and job type. |
GET /api/v1/jobs/:id | public | One listing: the board's fields, the excerpt, the source, and <code>url</code> — the original listing to apply on. |
GET /api/v1/sources | public | The boards, each one's terms as applied, its listing count and when it was last read. |
GET /api/v1/saved-searches | person | Your saved searches, each with <code>new_count</code> — listings that appeared since you last looked. |
POST /api/v1/saved-searches | person | Save one: { q?, remote?, type?, location? }. At least one filter. 201 with the saved search. |
DELETE /api/v1/saved-searches/:id | person | Forget one. 204. |
Search, then read one
curl -s 'https://openvibe.work/api/v1/jobs?q=engineer&remote=true'
# → { "jobs": [ { "id": "job_…", "title": "…", "company": "…", "url": "https://…", "source": "remotive", "source_name": "Remotive", "posted_at": "…", "excerpt": "…" } ], "next": null, "facets": { … } }The terms we apply
Each source is read under its own terms, which are stated on /sources and in GET /api/v1/sources: the source is named, the original listing is linked, and only a short excerpt is stored. If you build on this API, carry the attribution and the link back with the listing.
Limits
Search is limited per caller (per person, per app, else per address); past it the API answers 429 rate_limited with Retry-After. Errors are RFC 9457 application/problem+json with a stable code.