Independently review a contribution for the shared corpus
POST /v1/contributions/{contribution_id}/review
POST /v1/contributions/{contribution_id}/review
Designated verified web-session staff only. Acceptance requires fresh valid strict chemistry, unchanged canonical reaction identity and explicit source_verified, license_verified and quality_approved. The domain publishes the accepted observation and grants any eligible validation bonus atomically and idempotently. Ordinary owners/admins, API keys and external MCP clients cannot approve contributions.
Authorization
This operation requires a bearer credential. The description defines additional role, scope or first-party-session restrictions; an API key does not grant those permissions by itself.
Parameters
| Property | Type | Required | Details |
|---|---|---|---|
contribution_id (path) | string | yes |
Request body
| Property | Type | Required | Details |
|---|---|---|---|
decision | "accepted" ∣ "rejected" ∣ "needs_review" | yes | |
rationale | string | yes | |
idempotency_key | string | yes | |
source_verified | boolean ∣ null | no | |
license_verified | boolean ∣ null | no | |
quality_approved | boolean ∣ null | no |
Full schema: ContributionReview
{
"properties": {
"decision": {
"type": "string",
"enum": [
"accepted",
"rejected",
"needs_review"
],
"title": "Decision"
},
"rationale": {
"type": "string",
"maxLength": 2000,
"minLength": 10,
"title": "Rationale"
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"minLength": 8,
"pattern": "^[A-Za-z0-9_.:-]+$",
"title": "Idempotency Key"
},
"source_verified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Source Verified"
},
"license_verified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "License Verified"
},
"quality_approved": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Quality Approved"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"decision",
"rationale",
"idempotency_key"
],
"title": "ContributionReview"
}Responses
| HTTP | Details | Type |
|---|---|---|
| 200 | Successful Response | application/json: ReactionContribution |
| 401 | Unauthorized | application/problem+json: ProblemDetails |
| 403 | Forbidden | application/problem+json: ProblemDetails |
| 404 | Not Found | application/problem+json: ProblemDetails |
| 409 | Conflict | application/problem+json: ProblemDetails |
| 413 | Request Entity Too Large | application/problem+json: ProblemDetails |
| 422 | Unprocessable Entity | application/problem+json: ProblemDetails |
| 429 | Too Many Requests | application/problem+json: ProblemDetails |
| 502 | Bad Gateway | application/problem+json: ProblemDetails |
| 503 | Service Unavailable | application/problem+json: ProblemDetails |
Response: ReactionContribution
| Property | Type | Required | Details |
|---|---|---|---|
id | string | yes | |
observation_id | string | yes | |
reaction_smiles | string | yes | |
canonical_reaction_smiles | string ∣ null | yes | |
source | ContributionSource | yes | |
conditions | ContributionConditions ∣ null | no | |
summary | string ∣ null | no | |
state | "pending" ∣ "needs_review" ∣ "accepted" ∣ "rejected" ∣ "duplicate" | yes | |
created_at | string | yes | |
updated_at | string | yes | |
validation | ContributionValidation | yes | |
rewards | ContributionRewards | yes | |
review | ReviewedDecision ∣ null | no | |
duplicate_of | string ∣ null | no |
Full schema
{
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"observation_id": {
"type": "string",
"title": "Observation Id"
},
"reaction_smiles": {
"type": "string",
"title": "Reaction Smiles"
},
"canonical_reaction_smiles": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Canonical Reaction Smiles"
},
"source": {
"$ref": "#/components/schemas/ContributionSource"
},
"conditions": {
"anyOf": [
{
"$ref": "#/components/schemas/ContributionConditions"
},
{
"type": "null"
}
]
},
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Summary"
},
"state": {
"type": "string",
"enum": [
"pending",
"needs_review",
"accepted",
"rejected",
"duplicate"
],
"title": "State"
},
"created_at": {
"type": "string",
"title": "Created At"
},
"updated_at": {
"type": "string",
"title": "Updated At"
},
"validation": {
"$ref": "#/components/schemas/ContributionValidation"
},
"rewards": {
"$ref": "#/components/schemas/ContributionRewards"
},
"review": {
"anyOf": [
{
"$ref": "#/components/schemas/ReviewedDecision"
},
{
"type": "null"
}
]
},
"duplicate_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Duplicate Of"
}
},
"additionalProperties": true,
"type": "object",
"required": [
"id",
"observation_id",
"reaction_smiles",
"canonical_reaction_smiles",
"source",
"state",
"created_at",
"updated_at",
"validation",
"rewards"
],
"title": "ReactionContribution"
}This page is generated from OpenAPI; examples are schemas, not a fabricated successful response.