> ## Documentation Index
> Fetch the complete documentation index at: https://moengage.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# List Offerings

> Fetch all offerings in the workspace. Returns a summary of each offering — ID, name,
status, tags, and creation metadata.


#### Rate Limit

The rate limit is 150 requests per minute, 500 requests per hour, and 1000 requests per day per consumer.


## OpenAPI

````yaml /api/offerings/offerings.yaml get /v5/offers
openapi: 3.0.0
info:
  title: Offer Decisioning Public API - v5
  version: 5.0.0
  description: >
    The Offerings API lets you create, update, and list offerings for Offer
    Decisioning, and

    list the personalization templates available for offering content. For
    lifecycle, rate limits,

    idempotency, and error details, see the [Offerings
    Overview](/api/offerings/offerings-overview).
servers:
  - url: https://api-{dc}.moengage.com
    variables:
      dc:
        default: '01'
        description: >
          MoEngage data center identifier. Replace with your assigned DC number.
          Full example: https://api-01.moengage.com
security: []
paths:
  /v5/offers:
    get:
      tags:
        - Public Offerings
      summary: List Offerings
      description: >
        Fetch all offerings in the workspace. Returns a summary of each offering
        — ID, name,

        status, tags, and creation metadata.
      operationId: listPublicOfferings
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
          description: >
            Look up a single offering by its exact prefixed ID (e.g.
            offer_6a4f69ee490f66322f968b87). Use this when you already know the
            offering ID and want to confirm it exists before updating it.
        - name: name_contains
          in: query
          required: false
          schema:
            type: string
            maxLength: 100
          description: >
            Find offerings whose name contains specific text (case-insensitive).
            For example, pass "summer" to find all summer-related offerings.
        - name: status_in
          in: query
          required: false
          schema:
            type: string
          description: >
            Filter by lifecycle status. Valid values: active, scheduled,
            expired, archived, draft. Example: status_in=active,scheduled
        - name: tags
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          style: form
          explode: true
          description: >
            Filter to offerings that have ALL of the specified tags. Repeat the
            parameter for multiple tags: tags=summer-sale&tags=vip-users.
        - name: created_date_gte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: |
            List offerings created on or after this date. Format: YYYY-MM-DD.
        - name: created_date_lte
          in: query
          required: false
          schema:
            type: string
            format: date
          description: |
            List offerings created on or before this date. Format: YYYY-MM-DD.
        - name: created_by
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          style: form
          explode: true
          description: >
            Filter offerings created by specific team members. Pass one or more
            email addresses. Example:
            created_by=john.doe@example.com,marketing-team@example.com
        - name: fields
          in: query
          required: false
          schema:
            type: string
          description: >
            Request only the fields you need. Example: fields=id,name,status
            returns only those three fields per item.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >
            Pagination cursor returned as `next_cursor` in the previous
            response. Omit on the first request. When `next_cursor` is `null` in
            the response, you have reached the last page.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            default: 20
            minimum: 1
            maximum: 100
          description: Items per page. Default 20, max 100.
        - name: X-MOE-Request-Id
          in: header
          required: false
          schema:
            type: string
            format: uuid
          description: >
            Client-supplied trace ID (UUID v4). Echoed back in the
            `X-MOE-Request-Id` response header.
      responses:
        '200':
          description: Paginated list of offerings.
          headers:
            X-MOE-Request-Id:
              schema:
                type: string
              description: Trace ID echoed from the gateway.
            X-RateLimit-Limit:
              schema:
                type: integer
                example: 150
              description: Maximum requests allowed in the current window.
            X-RateLimit-Remaining:
              schema:
                type: integer
              description: >-
                Requests remaining in the current window before rate limiting
                applies.
            X-RateLimit-Reset:
              schema:
                type: integer
              description: UTC epoch second when the current rate-limit window resets.
          content:
            application/json:
              schema:
                type: object
                required:
                  - response_id
                  - type
                  - data
                  - pagination
                properties:
                  response_id:
                    type: string
                    description: >
                      Format: `resp_<X-MOE-Request-Id>` header value
                      (auto-generated UUID if the `X-MOE-Request-Id` header was
                      not part of the request body).
                  type:
                    type: string
                    enum:
                      - offer
                  data:
                    type: array
                    description: List of offering summaries matching the applied filters.
                    items:
                      $ref: '#/components/schemas/OfferingListItem'
                  pagination:
                    $ref: '#/components/schemas/CursorPagination'
              example:
                response_id: resp_d31d6d61-6f3b-40dc-a459-548f385a60cb
                type: offer
                data:
                  - id: offer_6a4f69ee490f66322f968b87
                    name: Summer_Sale_Promo_2026
                    status: active
                    tags:
                      - tag_<object-id>
                    created_at: '2026-06-23T12:29:41.225270281Z'
                    created_by: marketing-team@example.com
                  - id: offer_6a4f69ee490f66322f968b87
                    name: Homepage_Banner_AB_Test
                    status: scheduled
                    created_at: '2026-06-23T12:29:41.225270281Z'
                    created_by: growth-team@example.com
                pagination:
                  next_cursor: b2ZmZXJzOjZhM2E3YzM0NTE4NjdkNGRjZmIxNzQ5Mw==
                  limit: 20
                  has_more: true
                  total_count: 42
        '400':
          description: >
            Invalid query parameter. Possible error codes in
            `error.details[].code`:

            - `OUT_OF_RANGE` — `limit` > 100, or `name_contains` > 100 chars.

            - `INVALID_CURSOR` — `cursor` is present but malformed (not valid
            base64, or corrupted segment/id).

            - `INVALID_ENUM_VALUE` — unrecognised value in `status_in`.

            - `INVALID_FIELDS_PARAM` — unrecognised field name in `fields`.

            - `INVALID_TYPE` — `created_date_gte` or `created_date_lte` not in
            YYYY-MM-DD format.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_FAILED
                  message: One or more query parameters are invalid.
                  doc_url: >-
                    https://www.moengage.com/docs/api/offerings/offerings-overview
                  details:
                    - code: INVALID_ENUM_VALUE
                      target: status_in
                      message: >-
                        'invalid_status' is not a valid status. Allowed values:
                        active, scheduled, expired, archived, draft.
                      doc_url: >-
                        https://www.moengage.com/docs/api/offerings/offerings-overview
                response_id: resp_<trace-id>
        '401':
          $ref: '#/components/responses/GatewayAuthError'
        '403':
          $ref: '#/components/responses/GatewayAuthError'
        '429':
          description: >
            The rate limit for this endpoint has been exceeded. Retry after the
            window

            indicated in the `Retry-After` response header (in seconds).
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      security:
        - basicAuth: []
components:
  schemas:
    OfferingListItem:
      description: >
        Summary representation of an offering returned in GET /v5/offers list
        responses. Only these six fields are returned. Use the `fields` query
        parameter to request a sparse subset of them (e.g.
        `fields=id,name,status`).
      type: object
      properties:
        id:
          type: string
          description: >
            Stable prefixed offering identifier assigned by the server at
            creation. Format: the literal prefix "offer_" followed by the hex
            MongoDB ObjectId. Use this value as the {offer_id} path parameter in
            PATCH /v5/offers/{offer_id}.
          example: offer_6a4f69ee490f66322f968b87
        name:
          type: string
          description: Unique display name of the offering within the workspace.
          example: Summer_Sale_Promo_2026
        status:
          type: string
          description: >
            Current lifecycle status of the offering (always lowercase).
            "active" — offering is live and eligible to be returned by Decision
            Policies. "scheduled" — start_datetime is in the future; not yet
            live. "expired" — expiry_datetime has passed; no longer served.
            "archived" — manually archived; excluded from decisioning. "draft" —
            incomplete; not yet published.
          enum:
            - active
            - scheduled
            - expired
            - archived
            - draft
          example: active
        tags:
          type: array
          description: >
            Prefixed tag IDs attached to this offering (format: "tag_" + raw tag
            ObjectId). Example: "tag_<object-id>". When passing tag IDs in
            POST/PATCH requests, both the prefixed format ("tag_<id>") and the
            raw format ("<id>") are accepted. Tags are used for offer grouping
            and Decision Policy selection.
          items:
            type: string
          example:
            - tag_<object-id>
        created_at:
          type: string
          format: date-time
          description: ISO 8601 UTC timestamp when the offering was first created.
          example: '2026-01-15T09:00:00Z'
        created_by:
          type: string
          description: Email address of the user who created this offering.
          example: marketing-team@example.com
      example:
        id: offer_6a4f69ee490f66322f968b87
        name: Summer_Sale_Promo_2026
        status: active
        tags:
          - summer-sale
          - returning-users
        created_at: '2026-01-15T09:00:00Z'
        created_by: marketing-team@example.com
    CursorPagination:
      description: Pagination metadata included in list responses.
      type: object
      required:
        - limit
        - has_more
        - total_count
      properties:
        next_cursor:
          type: string
          nullable: true
          description: >
            Opaque cursor pointing to the start of the next page. Pass this
            value as the cursor query parameter on the next request. null when
            there are no more pages.
          example: <base64-encoded-cursor>
        limit:
          type: integer
          description: >-
            Number of items returned per page, matching the limit query
            parameter.
          example: 20
        has_more:
          type: boolean
          description: >
            Whether additional pages exist. When true, pass next_cursor on the
            next request. When false, the current page is the last page.
          example: false
        total_count:
          type: integer
          format: int64
          description: >
            Total number of items matching the applied filters — offerings and
            drafts for the offers list, templates for the templates list.
          example: 42
    ErrorResponse:
      type: object
      required:
        - response_id
      properties:
        error:
          type: object
          required:
            - code
            - message
            - doc_url
          properties:
            code:
              type: string
              description: Machine-readable ALL_CAPS_SNAKE_CASE error code.
              example: VALIDATION_FAILED
            message:
              type: string
              description: >-
                Human-readable explanation. Specific enough for AI agents to act
                on.
            target:
              type: string
              description: >-
                The field or resource that caused the error (e.g.
                "scheduling.expiry_datetime").
            details:
              type: array
              description: >
                Per-field error entries for VALIDATION_FAILED responses. All
                field violations are collected and returned in a single response
                — never truncated.
              items:
                type: object
                properties:
                  code:
                    type: string
                    description: Field-level error code.
                  target:
                    type: string
                    description: Dot-notation path to the failing field.
                  message:
                    type: string
                    description: Human-readable description of the field-level violation.
            doc_url:
              type: string
              description: Link to documentation for this error code.
              example: https://www.moengage.com/docs/api/offerings/offerings-overview
        response_id:
          type: string
          description: >
            Trace identifier — same format as success responses ("resp_" +
            X-MOE-Request-Id). Always present even on error responses for log
            correlation.
  responses:
    GatewayAuthError:
      description: >
        Authentication or authorisation failure from the API gateway layer.

        This response is generated by the gateway before the request reaches the
        service.

        The body is JSON-formatted but API gateway sends it with `Content-Type:
        text/plain`.

        Two gateway error codes are possible:

        - `ER001` — credentials missing or invalid (401).

        - `ER007` — credentials valid but insufficient scope for this route
        (403).
      content:
        text/plain:
          schema:
            type: string
            example: >-
              {"code":"ER001","target":"Authentication Invalid","message":"Auth
              validation failed."}
    ServiceUnavailable:
      description: >
        Gateway temporarily unable to route the request. Returned when the

        upstream service is unreachable or the HTTP request cannot be proxied
        (e.g. malformed

        headers with control characters). Treat as a transient error and retry
        with exponential back-off.
      content:
        text/html:
          schema:
            type: string
            example: >-
              <html><body><h1>503 Service Temporarily
              Unavailable</h1></body></html>
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >
        Authentication is done via Basic Auth. This requires a base64-encoded
        string of your credentials in the format 'username:password'.


        - **Username**: Use your MoEngage Workspace ID (also known as the App
        ID). Find it in the dashboard at **Settings** > **Account** > **APIs** >
        **Workspace ID (earlier app id)**.

        - **Password**: On your MoEngage workspace, navigate to **Settings** >
        **Account** > **API keys**. Use the Key listed within the
        **Personalize** tile.


        For more information on authentication and getting your credentials,
        refer to [Getting  your
        credentials](https://www.moengage.com/docs/api/introduction#getting-your-credentials).

        Send the value in the `Authorization` header as `Basic` followed by
        Base64-encoding of `appkey:apisecret` (workspace ID and API key).

````