Activity Messenger Help Center

Forms and respondent exports

See API introduction for authentication, request conventions, pagination, rate limits, and errors.

Form lists and tags use optional pagination. Respondent exports always use simple pagination, described below.

Forms in Activity Messenger allow you to capture information from your users. Forms can be waivers, surveys, payment forms or anything else you may need. Read the help page Forms, surveys and waivers to find out more.

A form list item contains these attributes:

{
  "id": 12345,
  "name": "COVID-19 Daily Screening",
  "type": "form",
  "subtype": null,
  "url": "https://activitymessenger.com/p/ABC1234",
  "short_url": "https://am.lol/p/ABC1234",
  "tags": []
}

You can filter GET /api/v1/organization/{organization}/forms with these query parameters:

  • type or types[]: filter by one or more form types.
  • name: match form names that contain the provided text.
  • tags[]: return forms that have all of the listed tags.

GET /api/v1/organization/{organization}/forms

Retrieve all forms in the organization. You may filter by passing a list of tags[] in the query string. Any form matching the passed tags will be returned.

GET /api/v1/organization/{organization}/form_tags

Retrieve all tags defined and used on forms.

GET /api/v1/organization/{organization}/forms/{form}

Retrieves a single form. A form contains a list of questions. Add include=definition to return the normalized API definition, and locale=en or locale=fr to localize the returned labels and payment text. For example:

{
    "id": 6460,
    "name": "Newsletter",
    "type": "subscribers",
    "subtype": null,
    "url": "https://activitymessenger.com/p/ABC1234",
    "short_url": "https://am.lol/q/ABC1234",
    "tags": [],
    "questions": [
        {
            "type": "account_owner",
            "slug": "account_owner",
            "label": "Subscribe to our newsletter",
            "required": true,
            "options": {
                "name": "required",
                "name_label": "First and last name",
                "email": "required",
                "mobile": "optional"
            }
        },
        {
            "type": "custom",
            "slug": "custom",
            "label": "What are your interests?",
            "required": false,
            "options": {
                "values": [
                    "Sports activities and training",
                    "Day camps",
                    "Quidditch",
                    "Potions",
                    "Gym"
                ]
            }
        }
    ]
}

include=definition

When include=definition is present, the response also includes a definition object with:

  • version: current API schema version.
  • source_locale: the form’s source locale.
  • locale: the requested locale, defaulting to the source locale.
  • available_locales: the locales available for the form.
  • timezone: the organization timezone.
  • currency: the organization currency, if configured.
  • updated_at: the form updated timestamp.
  • form_updated_at: the underlying form record updated timestamp.
  • description: the form header text.
  • registration: submission status details, including closed, manually_closed, start_at, end_at, and message.
  • payment: payment configuration details.
  • blocks: public question blocks in display order.
  • legacy: true when the form still uses the legacy schema.

payment.configured_methods can include online, interac, aft, debit, offline, gift_card, and other, depending on the form setup. The payment object also describes deposits, instalments, AFT instalments, fees, and tax IDs.

POST /api/v1/organization/{organization}/forms/{form}/submit

Submits a respondent programmatically to a form with a JSON payload. Follow the question schema returned by GET forms/{form}. Each question should use the slug. For example:

{
    "account_owner": {
        "first_name": "Harry",
        "last_name": "Potter",
        "email": "harry@hogwartsrec.com"
    },
    "custom": [
        "Quidditch",
        "Potions"
    ]
}

Currently we only support submitting to subscribers type forms. Emails that you submit through the API will get removed from the marketing and non-marketing unsubscribes list if they happened to be there. This ensures you will be able to send any type of email to them. Activity Messenger will not create duplicates. Instead, it will merge respondents looking at the email address.

When you pass a person and attribute name is required, you may pass either name or the pair first_name and last_name. Activity Messenger will build the complementary attributes on the fly.

GET /api/v1/organization/{organization}/forms/{form}/respondents

Exports form respondents as JSON. Results are always ordered by newest submission first. The exported rows use the same column and answer formatting as the existing Export to Excel feature, but are returned as paginated JSON instead of an Excel file. The first field in every row is id, the respondent recipient ID. Use id as the stable key when syncing respondents.

This endpoint uses simple pagination for speed. It does not calculate or return total, last_page, or last_page_url. Continue fetching pages until next_page_url is null.

Query parameters

  • page: Page number to fetch. Defaults to 1.
  • per_page: Rows per page. Defaults to 50, maximum 250.
  • from, to: Optional submission date range filter. Use YYYY-MM-DD, for example 2026-05-01. from is inclusive. to is inclusive for the whole day.
  • col[], opt[]: Optional export column and column-option filters. Use the parameters endpoint below to fetch possible values.
  • split_checkbox_questions=true: Returns one field per checkbox option.
  • type: Optional respondent filter such as duplicates, exclude_cancelled, include_cancelled, or abandoned.
  • am_class_id, membership_id, event_id: Optional filters for related class, membership, or event respondents.
  • package_ids[], with_booking: Optional payment form booking/package filters.

Response notes

  • data contains the paginated respondent rows.
  • columns contains the ordered column metadata as key and label.
  • next_page_url is the URL to fetch the next page. It is null on the last page.
  • total, last_page, and last_page_url are intentionally omitted.
GET /api/v1/organization/1234/forms/5678/respondents?per_page=2&from=2026-05-01&to=2026-05-31
{
  "current_page": 1,
  "data": [
    {
      "id": 9912,
      "filled_at": "2026-05-29T14:25:00.000000Z",
      "name": "Hermione Granger",
      "first_name": "Hermione",
      "last_name": "Granger",
      "client_id": 4501,
      "email": "hermione@example.com",
      "Favourite activity": "Potions"
    },
    {
      "id": 9911,
      "filled_at": "2026-05-28T19:10:00.000000Z",
      "name": "Harry Potter",
      "first_name": "Harry",
      "last_name": "Potter",
      "client_id": 4500,
      "email": "harry@example.com",
      "Favourite activity": "Quidditch"
    }
  ],
  "first_page_url": "https://activitymessenger.com/api/v1/organization/1234/forms/5678/respondents?page=1",
  "from": 1,
  "next_page_url": "https://activitymessenger.com/api/v1/organization/1234/forms/5678/respondents?page=2",
  "path": "https://activitymessenger.com/api/v1/organization/1234/forms/5678/respondents",
  "per_page": 2,
  "prev_page_url": null,
  "to": 2,
  "columns": [
    {"key": "id", "label": "id"},
    {"key": "filled_at", "label": "filled_at"},
    {"key": "name", "label": "name"},
    {"key": "first_name", "label": "first_name"},
    {"key": "last_name", "label": "last_name"},
    {"key": "client_id", "label": "client_id"},
    {"key": "email", "label": "email"},
    {"key": "Favourite activity", "label": "Favourite activity"}
  ]
}

GET /api/v1/organization/{organization}/forms/{form}/respondents/parameters

Returns possible values for some query parameters accepted by the respondents export endpoint. Use this endpoint to discover export columns, optional sub-columns, and focused filters for a given form.

Returned parameter values

  • col: Values you may pass as col[]. Each item contains the question value, label, question type, and possible opt_values.
  • opt_values: Values you may pass in the matching opt[] entry for that col[]. Pass them as a JSON array string, for example opt[]=["name","email","client_id"].
  • package_ids: Values you may pass as package_ids[].
  • am_class_id: Values you may pass as am_class_id.
  • membership_id: Values you may pass as membership_id.
GET /api/v1/organization/1234/forms/5678/respondents/parameters
{
  "col": [
    {
      "value": 1001,
      "label": "Account owner",
      "type": "account_owner",
      "opt_values": [
        {"value": "name", "label": "Name"},
        {"value": "email", "label": "Email"},
        {"value": "mobile", "label": "Mobile"},
        {"value": "client_id", "label": "Client ID"}
      ]
    },
    {
      "value": 1002,
      "label": "Participant",
      "type": "person",
      "opt_values": [
        {"value": "name", "label": "Name"},
        {"value": "date_of_birth", "label": "Date of birth"},
        {"value": "allergies", "label": "Allergies"}
      ]
    },
    {
      "value": 1003,
      "label": "Favourite activity",
      "type": "input",
      "opt_values": []
    }
  ],
  "package_ids": [
    {"value": 201, "label": "Summer camp"},
    {"value": 202, "label": "Drop-in class"}
  ],
  "am_class_id": [
    {"value": 301, "label": "Beginner class"},
    {"value": 302, "label": "Advanced class"}
  ],
  "membership_id": [
    {"value": 401, "label": "Family membership"}
  ]
}