Authentication
Every request must carry a bearer token in the Authorization header. Keys are per-organization, scoped, and revokable without touching your code.
API key format
Keys are prefixed gt_sk_ for easy scanning. The secret is shown exactly once at creation time and stored only as a bcrypt hash on our servers.
Per-key scopes (read / write / admin)Last-used timestamp for auditInstant revocation — no TTL waitRate limits
Rate limits apply per API key and globally. Limits are returned in response headers so you can back off gracefully.
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset (Unix epoch)Webhook deliveries
Register an HTTPS endpoint and receive HMAC-signed events for every submission state change. Retried with exponential backoff.
submission.createdsubmission.approvedtask.completedEndpoints
Base URL: https://groundtruth.io/api/v1
/tasksCreate a new task and receive a funding link/tasksList tasks for your organization (paginated)/tasks/{id}Retrieve a single task with current status/tasks/{id}/submissionsStream approved submissions with signed media URLs/submissions/{id}Retrieve a submission and a short-lived download URL/webhook-endpointsRegister an HTTPS URL for event deliveryCreate a task
POST a task definition. The response includes a Stripe-hosted funding_url. Once funded, the task transitions to open and contributors can begin submitting.
Fetch approved submissions
Each approved submission includes a short-lived signed URL (1 hour) for the raw media file. Paginate with next_cursor to stream all results.
Errors
All errors follow a consistent structure with machine-readable codes so you can handle them programmatically without parsing messages.
validation_errorunauthorizedforbiddennot_foundconflictrate_limitedinternal_errorFull reference docs are on the way
We're publishing a full OpenAPI spec with interactive examples, SDK quickstarts for Python and TypeScript, and a webhook testing console. Sign up now to get notified.