---
updatedAt: 2026-04-23T05:40:30.000Z
---

# Retrieves user actions

Lists user actions (form submissions). Can be filtered by user_id, page_id, or both. To get custom form responses for event RSVPs, first get the event's event_page_id from GET /events/{id}, then query this endpoint with that page_id. Match to RSVPs by user_id. With group_by=referred_by_user the response becomes a referral leaderboard instead of submission rows: one row per referrer ({referred_by_user_id, count, user: {id, first_name, last_name}}), ordered by submission count descending, honoring the same filters. With group_by set to one to three form field names (comma-separated, page_id required) the response becomes totals instead of rows: one row per distinct combination of those answers ({group: {field: value}, count, sum: {field: total}}), ordered by the group values; add sum=<number field>[,<number field>] for numeric totals per group (answers that are not numbers count as 0). Fields must be answer fields on that page's form; contact and identity fields cannot be grouped.

# OpenAPI definition

```json
{
  "openapi": "3.0.1",
  "info": {
    "title": "API V1",
    "version": "v1"
  },
  "paths": {
    "/user_actions": {
      "get": {
        "summary": "Retrieves user actions",
        "tags": [
          "User Actions"
        ],
        "description": "Lists user actions (form submissions). Can be filtered by user_id, page_id, or both. To get custom form responses for event RSVPs, first get the event's event_page_id from GET /events/{id}, then query this endpoint with that page_id. Match to RSVPs by user_id. With group_by=referred_by_user the response becomes a referral leaderboard instead of submission rows: one row per referrer ({referred_by_user_id, count, user: {id, first_name, last_name}}), ordered by submission count descending, honoring the same filters. With group_by set to one to three form field names (comma-separated, page_id required) the response becomes totals instead of rows: one row per distinct combination of those answers ({group: {field: value}, count, sum: {field: total}}), ordered by the group values; add sum=<number field>[,<number field>] for numeric totals per group (answers that are not numbers count as 0). Fields must be answer fields on that page's form; contact and identity fields cannot be grouped.",
        "parameters": [
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "description": "Filter by user ID",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_id",
            "in": "query",
            "required": false,
            "description": "Filter by page ID. Required when group_by names form fields.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "group_by",
            "in": "query",
            "required": false,
            "description": "referred_by_user for a referral leaderboard, or one to three form field names (comma-separated, e.g. hub,item) for totals per distinct answer combination (see the endpoint description). Unknown fields, contact fields, or a missing page_id return 422.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sum",
            "in": "query",
            "required": false,
            "description": "Totals only (group_by=<form field>). One to three number field names (comma-separated) to total per group, returned under sum. Returns 422 without a field group_by or for a non-number field.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_user",
            "in": "query",
            "required": false,
            "description": "Set to true to include referred_by_user_id and the acting user object (same shape as GET /users) on each row. Ignored with group_by.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "include_referred_users",
            "in": "query",
            "required": false,
            "description": "Leaderboard only (group_by=referred_by_user). Integer 1-10: nests each referrer's N most recently referred distinct people as referred_users: [{user, last_action_at}].",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Set to desc to sort rows newest first (default: asc). Ignored with group_by.",
            "schema": {
              "type": "string",
              "enum": [
                "desc"
              ]
            }
          },
          {
            "name": "_limit",
            "in": "query",
            "required": false,
            "description": "Number of results to return (default: 20, max: 100)",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "_offset",
            "in": "query",
            "required": false,
            "description": "Number of results to skip (default: 0)",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "_since",
            "in": "query",
            "required": false,
            "description": "UTC timestamp in seconds since the Unix epoch to filter results created after this time (default: 0)",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "user actions retrieved"
          },
          "422": {
            "description": "unprocessable entity"
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://api.solidarity.tech/v1",
      "variables": {
        "defaultHost": {
          "default": "api.solidarity.tech/v1"
        }
      }
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  }
}
```