API & embed
Two ways to show your open workalong roles on your own site: a key-gated JSON API if you render listings server-side, and a drop-in embed widget if you’d rather paste two lines of HTML. Both return only published jobs and link candidates to your hosted job pages.
Authentication
The JSON API uses a bearer key. Owners and admins can generate one under Settings → API in the app — each organization has a single key, shown once at creation. Keys look like wa_ followed by 32 hex characters.
Rotating the key invalidates the old one immediately — there is no grace period, so update anything using it right away. The embed widget needs no key at all.
List your published jobs
curl -H "Authorization: Bearer wa_…" \ https://app.workalong.io/api/public/v1/jobs
Returns the published jobs of the key’s organization, newest first:
{
"jobs": [
{
"id": "0b7e6c1a-…",
"title": "Senior Backend Engineer",
"slug": "senior-backend-engineer-x3k2",
"url": "https://app.workalong.io/c/acme-gmbh/senior-backend-engineer-x3k2",
"publishedAt": "2026-07-01T00:00:00Z",
"location": "Berlin / remote",
"compRange": "€90–110k"
}
]
}Fields
| Field | Notes |
|---|---|
url | The canonical hosted job page — the page candidates chat on. |
location | Omitted when the job has no location set. |
compRange | Only present when comp sharing is switched on for the job. What you keep private stays private. |
publishedAt | ISO 8601 timestamp. |
Errors, limits, caching
401— missing or invalid key.429— rate limited (60 requests per minute per key); theRetry-Afterheader says when to try again.- Responses are cacheable for 60 seconds (
Cache-Control: private, max-age=60) — poll accordingly.
Embed widget
A small web component that renders your open roles as a styled list, each linking to its hosted job page. No API key, no build step, a few KB:
<script src="https://app.workalong.io/embed.js" async></script> <workalong-jobs org="your-org-slug"></workalong-jobs>
Your org slug is shown in Settings → API (it’s the same slug as in your job page URLs). Under the hood the widget calls a public, CORS-open endpoint — GET /api/public/v1/orgs/<org-slug>/jobs — which returns the same payload as the keyed API and is rate limited per visitor IP.
Attributes
| Attribute | Notes |
|---|---|
org | Required. Your organization slug. |
target | _self (default) or _blank to open job pages in a new tab. |
limit | Optional. Show at most this many jobs. |
Styling
The widget renders in a shadow root, so your page styles won’t leak in by accident — but it’s built to be restyled. CSS custom properties cross the boundary:
| Property | Controls |
|---|---|
--wa-accent | Job title color and hover border. |
--wa-font | Font family. |
--wa-text | Base text color. |
--wa-muted | Borders and the loading skeleton. |
--wa-radius | Corner radius. |
--wa-gap | Space between list items. |
For full control, every node exposes a part — list, item, link, title, location, comp, empty — targetable with ::part():
workalong-jobs {
--wa-accent: #16a34a;
--wa-font: "Inter", sans-serif;
--wa-radius: 8px;
}
workalong-jobs::part(title) {
text-transform: uppercase;
}Behavior
- Shows a subtle loading skeleton while fetching.
- Shows “No open positions” (stylable via
::part(empty)) when nothing is published. - On any error it renders nothing — it will never break your page.
Questions?
Email hello@workalong.io and a real person will get back to you.