{"openapi":"3.1.0","info":{"title":"ExpiWell Public Data API","version":"1.0.0","description":"Read-only access to your own study data. Authenticate by exchanging a Developer Hub credential at POST /v1/token for a short-lived bearer token.","contact":{"name":"ExpiWell","email":"help@expiwell.com"}},"servers":[{"url":"/","description":"This deployment"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Token from POST /v1/token"}}},"paths":{"/v1/token":{"post":{"summary":"Exchange a credential for a short-lived access token","description":"The credential travels in the body, never a query string, so it cannot reach an access log. Tokens last 10-60 minutes depending on the credential.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["api_key"],"properties":{"api_key":{"type":"string"}}}}}},"responses":{"200":{"description":"A bearer token and the scopes it carries"},"400":{"description":"api_key missing"},"403":{"description":"Credential not accepted"}}}},"/v1/projects":{"get":{"summary":"List your studies","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of studies"}}}},"/v1/projects/{id}":{"get":{"summary":"One study","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The study"},"404":{"description":"Not found"}}}},"/v1/projects/{id}/participants":{"get":{"summary":"Participant identifiers for a study","description":"Identifiers only, by design — the read:participants scope grants IDs, not profiles.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"A page of participant ids"},"404":{"description":"Not found"}}}},"/v1/projects/{id}/responses":{"get":{"summary":"Responses for a study","security":[{"bearerAuth":[]}],"parameters":[{"name":"include_partial","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"A page of responses"},"404":{"description":"Not found"}}}},"/v1/responses/{id}":{"get":{"summary":"One response with its answers","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The response"},"404":{"description":"Not found"}}}},"/health":{"get":{"summary":"Liveness","responses":{"200":{"description":"ok"}}}}},"x-scopes":["read:projects","read:participants","read:responses","read:media"]}