Newsence Core Worker HTTP endpoints (frontend): GET /health POST /ingest - Ingest URL (JSON), image URL (JSON), or user-uploaded blob (multipart) POST /scrape - Sync extraction: {url} JSON or raw bytes -> NormalizedContent {markdown,text,metadata,status} POST /scrape/jobs - Async parse job (non-persisting): {url} or raw bytes -> {jobId} GET /scrape/jobs/:id - Poll parse job -> {status, result?, error?} POST /generate-image - AI image gen (OpenRouter → R2 → user_files) POST /embed - Generate embeddings POST /search - Hybrid corpus ranking (internal token) -> {results:[{id,score}]} POST /search/related - pgvector neighbours of a seed (internal token) -> {ids:[...]} POST /media/delete - Batch-delete user-file R2 objects by storage key (#162) POST /media/gc - On-demand reference-nowhere R2 orphan sweep (#162) POST /media/backfill-og-dims?cursor=:id - Measure + store OG image dims for articles missing them (re-run with nextCursor) GET /stream/:instanceId - Workflow status (SSE) Signed media: GET /media/external/{options}/{mediaUrl} - Upstream image/video passthrough with edge cache GET /media/asset/{key}?sig=&exp= - Authenticated R2 asset