roast.ag developer resources
This page is the public developer portal for roast.ag.
Machine-readable entry points
- llms.txt — curated guide
- Sitemap — indexable public URLs
- Docs — ingest behavior
- Markdown negotiation — request any public page with
Accept: text/markdown
Ashby ingest
Source of truth per board:
GET https://api.ashbyhq.com/posting-api/job-board/{boardName}?includeCompensation=true
There is no global Ashby index. Seed slugs live in src/data/ashby-boards.ts. Add a slug there to include a board. Sync skips or marks boards that do not return a JSON object with a jobs array.
Run a full sync (safe to re-run):
`` pnpm jobs:sync pnpm jobs:sync -- --slug linear ``
Or GET/POST /api/jobs/sync with Authorization: Bearer $CRON_SECRET (or JOBS_SYNC_SECRET).
Schema
This repo does not contain supabase/migrations. Apply scripts/sql/001_job_matching.sql on the shared Supabase project, then copy it into product-web with supabase migration new job_matching.
Tables: job_boards (company/board) and job_postings (Ashby id, title, location, workplace, employment type, department/team, compensation, description, URLs, is_listed, raw payload, first_seen_at, last_seen_at, status).
A successful fetch updates last_seen_at and keeps rows open. Postings missing from that response are marked closed (not deleted). A failed fetch does not close anything.
Embeddings
embed_text is always stored (title plus description). embedding vector(1536) is filled with openai/text-embedding-3-small through Vercel AI Gateway when AI_GATEWAY_API_KEY or OIDC is present. If that secret is missing, embeddings stay NULL. Set JOBS_EMBEDDINGS=false to skip even when a key exists. Do not insert fake vectors.
Filters
GET /api/jobs and /jobs accept title, location, workplace, company, and status=open|closed|all. These SQL filters work with or without embeddings.
Auth
Identity is shared with Product Agent. Sessions on roast.ag do not transfer from product.ag. Agents should use public pages and llms.txt.