roast.ag

Developers

roast.ag developer resources

This page is the public developer portal for roast.ag.

Machine-readable entry points

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.