API ReferenceQuick Reference

Quick Reference

Every FirstHandAPI endpoint in one table. All requests require Authorization: Bearer <api_key> unless noted.

Base URL: https://api.firsthandapi.com

Buyer API (/v1/)

MethodPathDescriptionScope
POST/v1/auth/signupCreate org + API key + $2.50 creditsNone
POST/v1/jobsCreate content collection job (escrows credits)jobs:write
GET/v1/jobsList jobs (cursor pagination)jobs:read
GET/v1/jobs/:idGet job detail (supports long-poll via Prefer: wait=N)jobs:read
POST/v1/jobs/:id/cancelCancel job, refund remaining creditsjobs:write
POST/v1/jobs/:id/rateRate completed job (1-5 stars)jobs:write
GET/v1/jobs/:id/filesList approved files with S3 download URLsjobs:read
GET/v1/jobs/:id/submissionsList submissions with AI scoresjobs:read
POST/v1/api_keysCreate API keykeys:manage
GET/v1/api_keysList API keyskeys:manage
POST/v1/api_keys/:id/rotateRotate key (24h overlap)keys:manage
POST/v1/api_keys/:id/revokeRevoke key immediatelykeys:manage
POST/v1/webhook_endpointsCreate webhook endpointwebhooks:write
GET/v1/webhook_endpointsList webhook endpointswebhooks:read
GET/v1/webhook_endpoints/:idGet endpoint detailwebhooks:read
PATCH/v1/webhook_endpoints/:idUpdate endpointwebhooks:write
DELETE/v1/webhook_endpoints/:idDelete endpointwebhooks:write
POST/v1/webhook_endpoints/:id/rotate_secretRotate signing secretwebhooks:write
GET/v1/webhook_eventsList webhook eventswebhooks:read
POST/v1/webhook_events/:id/replayReplay failed eventwebhooks:write
GET/v1/billing/creditsGet credit balanceusage:read
GET/v1/billing/transactionsList credit transactionsusage:read
POST/v1/billing/credits/purchasePurchase credits (Stripe)billing:write
GET/v1/organization/settingsGet org settingsAny
PATCH/v1/organization/settingsUpdate org settingsAny

Worker API (/internal/worker/)

MethodPathDescriptionAuth
GET/internal/worker/jobs/availableBrowse open jobs (priority window)Worker token
POST/internal/worker/jobs/:id/acceptAccept a jobWorker token
POST/internal/worker/jobs/:id/withdrawWithdraw from jobWorker token
POST/internal/worker/jobs/:id/flagFlag job as unreasonableWorker token
POST/internal/worker/submissions/:id/uploadUpload file (multipart)Worker token
POST/internal/worker/submissions/:id/retryRetry rejected submissionWorker token
GET/internal/worker/submissions/:idGet submission (poll for score)Worker token
GET/internal/worker/submissionsSubmission historyWorker token

Common Headers

HeaderRequiredDescription
AuthorizationYesBearer <fh_live_...> or Bearer <fh_test_...>
Idempotency-KeyOn POSTUnique key for safe retries
PreferOptionalwait=N for long-poll (max 60s) on GET /v1/jobs/:id

Webhook Event Types

EventTrigger
submission.approvedFile scored 3+ stars, approved
submission.rejectedFile scored below threshold
job.completedAll requested files collected
job.cancelledJob cancelled by buyer