{"openapi":"3.1.0","info":{"title":"Populiva researcher API","version":"1","description":"Everything a lab can do in the web app for studies and submissions, over JSON. Authenticate with a lab API token (Lab → Developer) as `Authorization: Bearer pv_...`. Scopes: `read` (all GETs), `studies` (create and run studies, review submissions, groups, messages), `money` (bonuses and invoices). Limit: 600 requests a minute per token. Participants appear only as PARTICIPANT_IDs for your lab. Amounts are US dollars as strings (\"2.50\")."},"servers":[{"url":"https://populiva.com/api/v1"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"security":[{"bearer":[]}],"paths":{"/studies":{"get":{"summary":"List your lab's studies (newest first","up to 200)":null},"post":{"summary":"Create a draft study (title, description, language, external_url, estimated_minutes, max_minutes, reward, places, screeners, ...)"}},"/studies/{id}":{"get":{"summary":"A study"},"patch":{"summary":"Update a draft study"},"put":{"summary":"Update a draft study"}},"/studies/{id}/launch":{"post":{"summary":"Launch a draft (reserves its cost from your balance)"}},"/studies/{id}/pause":{"post":{"summary":"Pause a running study"}},"/studies/{id}/resume":{"post":{"summary":"Resume a paused study"}},"/studies/{id}/close":{"post":{"summary":"Close a study (releases unused reserve)"}},"/studies/{id}/add_places":{"post":{"summary":"Add places to a running study (count)"}},"/studies/{study_id}/submissions":{"get":{"summary":"A study's submissions (optional status filter)"}},"/studies/{study_id}/provenance_reports":{"get":{"summary":"A study's provenance reports"},"post":{"summary":"Issue a new provenance report version"}},"/submissions/{id}":{"get":{"summary":"A submission"}},"/submissions/{id}/approve":{"post":{"summary":"Approve a submission awaiting review"}},"/submissions/{id}/reject":{"post":{"summary":"Reject with a reason (no_completion, failed_attention_checks, did_not_follow_instructions, low_effort, duplicate_or_fraud)"}},"/submissions/{id}/bonus":{"post":{"summary":"Bonus an approved submission (amount, up to 100.00; money scope)"}},"/groups":{"get":{"summary":"Your lab's participant groups"},"post":{"summary":"Create a group (name)"}},"/groups/{id}":{"get":{"summary":"A group and its PARTICIPANT_IDs"}},"/groups/{id}/members":{"post":{"summary":"Add participant_ids, or remove them with remove=true"}},"/messages":{"post":{"summary":"Message one participant (submission_id, body) or a study audience (study_id, audience, group_id, body)"}},"/balance":{"get":{"summary":"Your lab's available and reserved balance"}},"/invoices":{"get":{"summary":"Your lab's invoices"},"post":{"summary":"Request an invoice (amount, billing_name, billing_email, billing_address, po_number; money scope)"}}},"x-webhooks":{"description":"Lab → Developer → Webhooks. Each delivery is a POST with a JSON body {id, event, created_at, data} and a `Populiva-Signature: t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with your endpoint secret>` header. Reject deliveries whose signature doesn't match or whose t is more than 5 minutes old. Failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2 hours, and 12 hours.","events":["study.launched","study.paused","study.resumed","study.closed","submission.created","submission.reviewed"]}}