**Version: 202601**

# List earn campaigns

**GET** `/openapi/2026-01/loyalty/earn-campaigns`

Return campaigns where members can earn points

## Request

**Query Parameters**

- `status` string

  Campaign status: active or inactive. Empty returns all
- `cursor` string

  Pagination cursor
- `limit` int32

  Page size. Default 50, max 200
- `member_id` string

  Filter by member ID. Empty returns all campaigns

## Responses

**200**

OK

**application/json**

**Schema | Example**

**Schema**

- `code` string

  error code
- `message` string

  error message
- `data` object

  - `items` object[]

    Campaign list

    *   Array \[

    - `campaign_id` string

      Campaign ID
    - `name` string

      Campaign name
    - `event_type` string

      Event type: become\_member, successful\_order, enter\_birthday, enter\_phone\_number, or share\_link
    - `active` boolean

      Whether the campaign is active
    - `execution_schedule` object

      Execution schedule rule (corresponds to vo.ExecutionScheduleRule); strongly typed

      - `type` string

        Schedule type: time\_range / weekly / monthly / cycle
      - `effective_started_at` string

        Effective start time, RFC3339 (empty means open-start)
      - `effective_ended_at` string

        Effective end time, RFC3339 (empty means open-end)
      - `months` string[]

        Months (effective when type=monthly), 1-12 as string
      - `days` string[]

        Days. weekly: 0-6 (Sun-Sat); monthly: 1-31; otherwise unused
      - `date` string

        Specific date string (e.g. yyyy-MM-dd)
    - `member_condition` object

      Applicable member range; strongly typed (same schema as RedemptionCampaign)

      - `type` string

        Type: scope or expression
      - `scope` object

        Scope payload when type is scope
      - `expression` object

        Expression payload when type is expression
    - `reward_points` int64

      Reward points after completion
    - `point_expire_config` object

      Points-expiry config for points granted by this campaign; null when not configured

      - `is_expired` boolean

        Whether points expire
      - `expired_method` string

        Expiry method: after\_x\_months / on\_specific\_date / ...
      - `day` int32

        Day component of the expiry rule
      - `month` int32

        Month component of the expiry rule
      - `protect_enabled` boolean

        Whether expiry protection is enabled
      - `protect_days` int32

        Protection days
      - `use_global_config` boolean

        Whether to use the store global config
    - `campaign_rule` object

      Full campaign rule passthrough (corresponds to vo.CampaignRule); untyped Struct
    - `execution_priority` int32

      Execution priority: 0 = stackable, >0 = exclusive. optional so 0 is always emitted
    - `is_cumulative` boolean

      Whether stackable (execution\_priority == 0). optional so false is always emitted
    - `created_at` string

      Created time, RFC3339 string
    *   \]
  - `next_cursor` string

    Next-page cursor
  - `has_more` boolean

    Whether more pages exist
  - `limit` int32

    Returned page size

```json
{
  "code": "string",
  "message": "string",
  "data": {
    "items": [
      {
        "campaign_id": "string",
        "name": "string",
        "event_type": "string",
        "active": true,
        "execution_schedule": {
          "type": "string",
          "effective_started_at": "string",
          "effective_ended_at": "string",
          "months": [
            "string"
          ],
          "days": [
            "string"
          ],
          "date": "string"
        },
        "member_condition": {
          "type": "string",
          "scope": {},
          "expression": {}
        },
        "reward_points": 0,
        "point_expire_config": {
          "is_expired": true,
          "expired_method": "string",
          "day": 0,
          "month": 0,
          "protect_enabled": true,
          "protect_days": 0,
          "use_global_config": true
        },
        "campaign_rule": {},
        "execution_priority": 0,
        "is_cumulative": true,
        "created_at": "string"
      }
    ],
    "next_cursor": "string",
    "has_more": true,
    "limit": 0
  }
}
```
