Skip to main content

List Contributions

Get a list of all contributions with filtering and pagination.
cURL
curl "https://tally.genlayer.com/api/v1/contributions/?user_address=0x1234...&category=builder&ordering=-contribution_date&limit=20"

Query Parameters

user_address
string
Filter by user’s Ethereum address
category
string
Filter by category: builder, validator, or steward
contribution_type
integer
Filter by contribution type ID
mission
integer
Filter by mission ID
ordering
string
default:"-contribution_date"
Order by field: contribution_date, -contribution_date, points, -points, frozen_global_points, -frozen_global_points
limit
integer
default:"10"
Number of results to return (max 100)
group_consecutive
boolean
default:"false"
Group consecutive contributions of the same type (for feed views)

Response

{
  "count": 150,
  "next": "https://tally.genlayer.com/api/v1/contributions/?page=2",
  "previous": null,
  "results": [
    {
      "id": 1,
      "user": 42,
      "user_details": {
        "id": 42,
        "name": "Alice Builder",
        "address": "0x1234...",
        "profile_image_url": "https://..."
      },
      "contribution_type": 5,
      "contribution_type_name": "Smart Contract Deploy",
      "contribution_type_details": {
        "id": 5,
        "name": "Smart Contract Deploy",
        "slug": "smart-contract-deploy",
        "description": "Deploy an intelligent contract",
        "category": "builder",
        "min_points": 50,
        "max_points": 200,
        "current_multiplier": 1.5
      },
      "points": 100,
      "frozen_global_points": 150,
      "multiplier_at_creation": "1.50",
      "contribution_date": "2024-01-20T10:00:00Z",
      "notes": "First smart contract deployment",
      "evidence_items": [
        {
          "id": 1,
          "description": "Contract address on testnet",
          "url": "https://explorer.genlayer.com/tx/0xabc...",
          "created_at": "2024-01-20T10:05:00Z"
        }
      ],
      "highlight": null,
      "mission": null,
      "created_at": "2024-01-20T10:00:00Z",
      "updated_at": "2024-01-20T10:00:00Z"
    }
  ]
}

Get Single Contribution

Retrieve details for a specific contribution.
cURL
curl https://tally.genlayer.com/api/v1/contributions/1/

Response

Returns a single contribution object with the same schema as list endpoint.

Submit New Contribution

Users can submit contributions for review by stewards.
Authentication Required - You must be authenticated to submit contributions.
curl -X POST https://tally.genlayer.com/api/v1/submissions/ \
  -H "Content-Type: application/json" \
  --cookie "sessionid=your_session" \
  -d '{
    "contribution_type": 5,
    "contribution_date": "2024-01-20T10:00:00Z",
    "notes": "Deployed my first smart contract",
    "recaptcha": "03AGdBq...",
    "mission": 3
  }'

Request Body

contribution_type
integer
required
Contribution type ID (must be is_submittable: true)
contribution_date
string
required
ISO 8601 date when contribution was made
notes
string
Description or additional context
recaptcha
string
required
Google reCAPTCHA v2 token (required for new submissions only)
mission
integer
Mission ID if contribution is for a specific mission

Validation Rules

Builder contributions require completing the Builder Welcome journey first.Validator contributions require being on the validator waitlist or being a validator.
If mission is provided:
  • Mission must be active (within start/end dates)
  • contribution_type is automatically set to mission’s type
  • Cannot override contribution type
  • Required only for new submissions
  • Not required when editing existing submissions
  • Use test keys in development (see .env.example)

Response

id
integer
Submission ID
state
string
Submission state: pending, accepted, rejected, or more_info_needed
state_display
string
Human-readable state
can_edit
boolean
Whether submission can be edited (true if pending or more_info_needed)
{
  "id": 100,
  "user": 42,
  "user_details": { /* user object */ },
  "contribution_type": 5,
  "contribution_type_details": { /* type object */ },
  "contribution_date": "2024-01-20T10:00:00Z",
  "notes": "Deployed my first smart contract",
  "state": "pending",
  "state_display": "Pending Review",
  "staff_reply": "",
  "reviewed_by": null,
  "reviewed_at": null,
  "evidence_items": [],
  "can_edit": true,
  "proposed_points": null,
  "converted_contribution": null,
  "contribution": null,
  "mission": {
    "id": 3,
    "name": "Deploy Your First Contract"
  },
  "created_at": "2024-01-20T10:00:00Z",
  "updated_at": "2024-01-20T10:00:00Z",
  "last_edited_at": null
}

Errors

{
  "error": "You must complete the Builder Welcome journey before submitting builder contributions."
}
{
  "error": "This mission has ended."
}
{
  "recaptcha": [
    "reCAPTCHA verification is required for new submissions."
  ]
}

Get My Submissions

Get all submissions for the authenticated user.
cURL
curl "https://tally.genlayer.com/api/v1/submissions/my/?state=pending" \
  --cookie "sessionid=your_session"

Query Parameters

state
string
Filter by state: pending, accepted, rejected, more_info_needed

Response

Returns paginated list of submission objects.

Update Submission

Update a pending or more_info_needed submission.
Submissions can only be edited when can_edit: true (state is pending or more_info_needed).
cURL
curl -X PATCH https://tally.genlayer.com/api/v1/submissions/100/ \
  -H "Content-Type: application/json" \
  --cookie "sessionid=your_session" \
  -d '{
    "notes": "Updated description with more details"
  }'

Request Body

Same fields as submission creation, but all are optional. Include only fields you want to update.
reCAPTCHA is not required for updates, only for new submissions.

Response

Returns the updated submission object with state reset to pending and last_edited_at updated.

Cancel Submission

Cancel a pending or more_info_needed submission.
cURL
curl -X DELETE https://tally.genlayer.com/api/v1/submissions/100/ \
  --cookie "sessionid=your_session"

Response

{
  "message": "Submission cancelled successfully"
}
This is a soft delete. The submission is marked as rejected with “Cancelled by user” note.

Add Evidence to Submission

Add evidence items (URLs, descriptions) to a submission.
File uploads are not supported. Evidence must be URLs or text descriptions only.
cURL
curl -X POST https://tally.genlayer.com/api/v1/submissions/100/add-evidence/ \
  -H "Content-Type: application/json" \
  --cookie "sessionid=your_session" \
  -d '{
    "url": "https://explorer.genlayer.com/tx/0xabc...",
    "description": "Transaction hash for deployment"
  }'

Request Body

url
string
Evidence URL (optional)
description
string
Evidence description (optional)
At least one of url or description must be provided.

Response

{
  "id": 1,
  "description": "Transaction hash for deployment",
  "url": "https://explorer.genlayer.com/tx/0xabc...",
  "created_at": "2024-01-20T10:05:00Z"
}

Get Contribution Highlights

Get featured contribution highlights across all types.
cURL
curl "https://tally.genlayer.com/api/v1/contributions/highlights/?limit=10&category=builder"

Query Parameters

limit
integer
default:"10"
Number of highlights to return
category
string
Filter by category: builder, validator, steward, or global
waitlist_only
boolean
default:"false"
Show only highlights from validator waitlist users

Response

[
  {
    "id": 1,
    "title": "First Smart Contract Deploy",
    "description": "Alice deployed her first intelligent contract on GenLayer testnet",
    "contribution": 1,
    "user_name": "Alice Builder",
    "user_address": "0x1234...",
    "user_profile_image_url": "https://...",
    "user_validator": false,
    "user_builder": true,
    "contribution_type_name": "Smart Contract Deploy",
    "contribution_type_slug": "smart-contract-deploy",
    "contribution_type_category": "builder",
    "contribution_points": 150,
    "contribution_date": "2024-01-20T10:00:00Z",
    "mission_name": null,
    "mission_id": null,
    "created_at": "2024-01-20T10:30:00Z"
  }
]

List Contribution Types

Get all available contribution types.
cURL
curl "https://tally.genlayer.com/api/v1/contribution-types/?category=builder&is_submittable=true"

Query Parameters

category
string
Filter by category: builder, validator, or steward
is_submittable
boolean
Filter by whether users can submit this type

Response

[
  {
    "id": 5,
    "name": "Smart Contract Deploy",
    "slug": "smart-contract-deploy",
    "description": "Deploy an intelligent contract on GenLayer testnet",
    "category": "builder",
    "min_points": 50,
    "max_points": 200,
    "current_multiplier": 1.5,
    "is_submittable": true,
    "examples": [
      "First contract deployment",
      "DeFi protocol contract",
      "NFT marketplace contract"
    ],
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-15T10:00:00Z"
  }
]

Get Contribution Type Statistics

Get aggregated statistics for contribution types.
cURL
curl "https://tally.genlayer.com/api/v1/contribution-types/statistics/?category=builder"

Response

[
  {
    "id": 5,
    "name": "Smart Contract Deploy",
    "description": "Deploy an intelligent contract",
    "min_points": 50,
    "max_points": 200,
    "count": 150,
    "participants_count": 45,
    "last_earned": "2024-03-01T15:00:00Z",
    "total_points_given": 22500,
    "current_multiplier": 1.5,
    "is_submittable": true
  }
]

Get Top Contributors by Type

Get the top 10 contributors for a specific contribution type.
cURL
curl https://tally.genlayer.com/api/v1/contribution-types/5/top_contributors/

Response

[
  {
    "id": 42,
    "name": "Alice Builder",
    "address": "0x1234...",
    "profile_image_url": "https://...",
    "total_points": 1500,
    "contribution_count": 15
  }
]

Get Recent Contributions by Type

Get the last 10 contributions for a specific contribution type.
cURL
curl https://tally.genlayer.com/api/v1/contribution-types/5/recent_contributions/

Response

Returns an array of contribution objects (lightweight serializer).

Get Contribution Type Highlights

Get active highlights for a specific contribution type.
cURL
curl "https://tally.genlayer.com/api/v1/contribution-types/5/highlights/?limit=5"

Response

Returns an array of highlight objects.

Status Codes

CodeMeaningExample
200SuccessContribution retrieved
201CreatedSubmission created
400Bad RequestInvalid contribution_type or missing recaptcha
403ForbiddenCategory restriction not met
404Not FoundContribution type doesn’t exist

Best Practices

  1. Always validate contribution types before submission
  2. Check category requirements (builder/validator status)
  3. Include evidence via URLs or descriptions (no file uploads)
  4. Use missions to associate contributions with campaigns
  5. Handle reCAPTCHA properly (required for new submissions only)
  6. Monitor submission state and respond to more_info_needed

Build docs developers (and LLMs) love