API Reference

Club Wallet Activity

Returns a club's payment activity: the same rows and totals shown on Club Wallet → Activity.

Overview

GET https://www.helpingwithflags.com/api/v1/club-wallet/activity
Authentication
X-API-Key header
Format
JSON, read-only
Rate limit
120 requests per minute per IP address
Sort order
Newest payment first

The API key is provided by the Helping With Flags team. Keep it on your server. Never put it in a browser, mobile app or code repository. If the key may have leaked, contact us and we will replace it.

Request
curl -G "https://www.helpingwithflags.com/api/v1/club-wallet/activity" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json" \
  --data-urlencode "club_slug=SpringfieldRotary" \
  --data-urlencode "date_type=custom" \
  --data-urlencode "payments_for=03-01-2026 / 03-31-2026" \
  --data-urlencode "per_page=50"

Parameters

Send as query parameters. Only club_slug is required; with no filters you get the current calendar year, all payment types and all statuses, 10 rows per page.

NameTypeDescription
club_slugrequiredstringThe club to read payments for, by its slug (the name in its web address, e.g. SpringfieldRotary). Letter case doesn't matter. Ask the Helping With Flags team for it.
date_typestringcalendar, custom or fiscal. Default calendar.
calendar_inputdate rangeRange for calendar. Default: Jan 1 – Dec 31 of the current year.
payments_fordate rangeRange for custom. Required when date_type=custom.
fiscal_inputdate rangeSubscription year for fiscal; the end date's year is used. Required when date_type=fiscal. Only for clubs on a yearly subscription cycle.
filter_namestringCustomer name contains this text.
filter_productintegerOnly this product. Splits payments per product line, see Calculations.
filter_accountstringhwf for the Helping With Flags account, or the ID of the club's own payment account.
card_payment
cash_payment
check_payment
echeck_payment
0 / 1Payment types to include. Card covers new and saved cards. If none are sent, all types are included; setting all that you send to 0 is an error.
payment_statusstringpaid, refund or processing. Default: all three.
pageintegerPage number, 1–1,000,000. Default 1.
per_pageintegerPayments per page, 1–100. Default 10. With filter_product one payment can return several rows, so a page may hold more rows than this.

Date ranges use MM-DD-YYYY / MM-DD-YYYY (space, slash, space), US Central time, both days included. URL-encode the value.

Response

200 OK
{
  "type": "success",
  "code": 200,
  "message": "Payment activity retrieved successfully.",
  "data": {
    "club": { "id": 123, "slug": "SpringfieldRotary", "name": "Springfield Rotary Club" },
    "gateway": "stripe",
    "filters": {
      "date_type": "custom", "date_from": "2026-03-01", "date_to": "2026-03-31", "subscription_year": null,
      "payment_types": ["CARD", "STORED_CARD", "CASH", "CHECK", "E_CHECK"],
      "payment_status": ["paid", "refund", "processing"],
      "filter_name": null, "filter_product": null, "filter_account": null
    },
    "payments": [
      {
        "payment_id": 82601,
        "payment_date": "2026-03-14T10:22:05-05:00",
        "full_name": "Jane Smith",
        "payment_type": "CARD",
        "payment_status": "paid",
        "gateway": "stripe",
        "flags": 2,
        "flag_amount": 100.00,
        "processing_fee": 3.20,
        "gateway_fee": 3.29,
        "total": 99.91
      }
    ],
    "totals": {
      "flags": 2, "flag_amount": 100.00, "processing_fee": 3.20,
      "sub_total": 103.20, "gateway_fee": 3.29, "total": 99.91
    },
    "pagination": { "current_page": 1, "per_page": 50, "total": 1, "last_page": 1 }
  }
}

Payment fields

FieldTypeDescription
payment_idintegerUnique, stable payment ID.
payment_datestringDate and time, ISO 8601 with time zone.
full_namestringCustomer name on the payment.
payment_typestringCARD, STORED CARD, CASH, CHECK or eCheck.
payment_statusstringpaid, refund or processing (eCheck clearing).
gatewaystring / nullPayment company that processed this payment: authorize.net, paypal, squareup, stripe. null when no company was involved (for example cash or check).
flagsintegerNumber of flags.
flag_amountnumberAmount for the flags.
processing_feenumberFee paid by the customer on top, if the club charges one.
gateway_feenumberFee taken by the payment company named in gateway. 0 if none.
totalnumberNet amount for the club, see Calculations.

Other fields

FieldDescription
clubThe club you asked for: id, slug and name.
gatewayThe club's current payment company: authorize.net, paypal, squareup, stripe. Older payments may have gone through a different account, so use each payment's own gateway.
filtersFilters actually applied, defaults included. subscription_year is set only for fiscal.
totalsSums across all pages, refunds subtracted, so they can be negative (for example with payment_status=refund). sub_total includes processing fees; total is the net received after fees.
paginationtotal is the number of matching payments. Request pages until current_page equals last_page.

Amounts are in US dollars, rounded to 2 decimals (sent as JSON numbers, so 50 means 50.00). Payment row amounts are always positive; refunds are identified by payment_status: "refund".

Calculations

Amounts follow the same rules as the Club Wallet Activity page, so both always match.

Paymentgateway_feetotal
Card or eCheck, paid / processingPayment company's feeflag_amount + processing_fee − gateway_fee
Cash, check, and all refunds0flag_amount

With filter_product, each payment is split into one row per matching product line (same payment_id). The amount, fees and flags are shared out by that line's part of the payment, donations excluded, and cash and check rows add the processing fee to total. Totals cover that product across all pages, except totals.flags, which counts every flag on the matching payments.

totals.gateway_fee counts card fees only, and is 0 when card payments are excluded or payment_status=refund. Unpaid "pay later" requests and payments imported from other systems are never listed.

Errors

Errors return type: "error" with code equal to the HTTP status. Validation errors also list each problem by parameter.

422
{
  "type": "error",
  "code": 422,
  "message": "The request has some problems. Please check the errors list.",
  "errors": { "payments_for": ["Use the format MM-DD-YYYY / MM-DD-YYYY with real dates, for example 03-01-2026 / 03-31-2026."] }
}
StatusMeaning
401API key missing or invalid.
403Club account is suspended.
404No club with this club_slug, or the API address is wrong.
405Wrong HTTP method. Use GET.
422Invalid or missing parameter. See errors.
429Rate limit reached. Wait the number of seconds in the Retry-After header, then retry.
500Server error. Retry later; contact us if it persists.

No matching payments is not an error: you get 200 with an empty payments list.

Questions or a new API key: contact the Helping With Flags team.