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

# Read what a member can still earn today

> XP left against the member's daily cap, which actions still pay, when the day resets in your organization's zone, and today's refusals with the sentence each one shows. Fields are camelCase. With no earning controls configured, `limited` is false and the lists are empty. A member session may name only its own user id; another id answers 404.



## OpenAPI

````yaml https://api.develop.fourdos.dev/openapi/partner.json get /v1/users/{userId}/xp-earning
openapi: 3.1.0
info:
  title: 4D OS Partner API
  version: 0.1.0
  description: >-
    REST API for 4D OS partners. Authenticate with your organization API key:
    `Authorization: Bearer <key>`.


    Requests and responses are JSON with `snake_case` field names. Errors share
    one envelope: `{ "error": { "code", "status", "message", "details"? } }`.


    Mutating endpoints that declare it accept an `Idempotency-Key` header so
    retries are safe.


    Bulk-migrating members? See the [Migrating to 4D
    guide](https://docs.fourdos.dev/walkthroughs/migrate-existing-members) for
    the canonical import schema, a worked example, and the `/v1/imports`
    sequence.
servers:
  - url: https://api.develop.fourdos.dev
security:
  - partnerApiKey: []
tags:
  - name: Users
    description: Create, read, and manage users and their org membership
  - name: Imports
    description: Bulk member import jobs (staging → validate → commit)
  - name: Consents
    description: Record, list and withdraw a member's consents and agreements
  - name: Rewards
    description: A member's reward catalog, claims and reward codes
  - name: XP
    description: >-
      A member's balance, earning headroom, expiry and boosts, and what each
      event pays
  - name: Tiers
    description: Read your organization's tier ladder
  - name: Webhooks
    description: Register webhook endpoints. Deliveries are not sent yet.
  - name: Events
    description: Refetch your organization's events from the last 30 days
  - name: API keys
    description: Issue, list, and revoke server-side organization API keys
  - name: Modules
    description: >-
      Publish private modules, install visible modules, and manage their
      credentials
  - name: Ingest
    description: Receive signed native events from an installed module
  - name: Engagement
    description: Browser event tracking (publishable keys) and tracking-key management
  - name: Revenue
    description: Report sales and refunds for the club's revenue dashboards
  - name: Ad delivery
    description: Fill a club site's ad slots, for anonymous or signed-in fans
  - name: Ad entries
    description: Fans entering a sponsor's draw, reported by the club's backend
paths:
  /v1/users/{userId}/xp-earning:
    get:
      tags:
        - XP
      summary: Read what a member can still earn today
      description: >-
        XP left against the member's daily cap, which actions still pay, when
        the day resets in your organization's zone, and today's refusals with
        the sentence each one shows. Fields are camelCase. With no earning
        controls configured, `limited` is false and the lists are empty. A
        member session may name only its own user id; another id answers 404.
      operationId: getMemberXpEarning
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The member's earning status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberXpEarning'
        '401':
          description: '`UNAUTHORIZED`: no valid credential'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: '`NOT_FOUND`: a member session named another user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: '`VALIDATION_ERROR`: the user id is not a valid id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - partnerApiKey: []
        - adminSession: []
        - memberSession: []
components:
  schemas:
    MemberXpEarning:
      type: object
      properties:
        limited:
          type: boolean
          description: >-
            False when your organization has no earning controls; the rest is
            then empty.
        timezone:
          type: string
          description: IANA zone of the organization's earning day.
        resetAt:
          type: string
          format: date-time
          description: The next midnight in that zone.
        dailyXp:
          type:
            - object
            - 'null'
          description: Null when there is no member daily cap.
          properties:
            cap:
              type: string
              description: A non-negative integer as a decimal string.
            consumed:
              type: string
              description: A non-negative integer as a decimal string.
            remaining:
              type: string
              description: A non-negative integer as a decimal string.
          required:
            - cap
            - consumed
            - remaining
        actions:
          type: array
          items:
            type: object
            properties:
              triggerEventType:
                type: string
              dailyMaxAwards:
                type:
                  - integer
                  - 'null'
                description: Null for unlimited.
              dailyRemaining:
                type:
                  - integer
                  - 'null'
              lifetimeMaxAwards:
                type:
                  - integer
                  - 'null'
              lifetimeRemaining:
                type:
                  - integer
                  - 'null'
              exhausted:
                type: boolean
                description: True when either limit has nothing left.
            required:
              - triggerEventType
              - dailyMaxAwards
              - dailyRemaining
              - lifetimeMaxAwards
              - lifetimeRemaining
              - exhausted
        recentRefusals:
          type: array
          description: Today's refused awards, as the sentence the member reads.
          items:
            type: object
            properties:
              refusedAt:
                type: string
                format: date-time
              message:
                type: string
            required:
              - refusedAt
              - message
      required:
        - limited
        - timezone
        - resetAt
        - dailyXp
        - actions
        - recentRefusals
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            status:
              type: integer
            message:
              type: string
            details:
              type: object
              additionalProperties: true
          required:
            - code
            - status
            - message
      required:
        - error
  securitySchemes:
    partnerApiKey:
      type: http
      scheme: bearer
      description: >-
        Organization API key (`org_...`) sent as `Authorization: Bearer <key>`.
        Keys are scoped to one organization; every request operates within that
        tenant.
    adminSession:
      type: http
      scheme: bearer
      description: >-
        Partner admin session token sent as `Authorization: Bearer <token>`.
        Obtained by signing in (console or the email OTP endpoints) and
        completing the second factor; see the Authentication page.
    memberSession:
      type: http
      scheme: bearer
      description: >-
        A signed-in member's session token sent as `Authorization: Bearer
        <token>`. Accepted only on the operations that list it, and each of
        those says which user ids a member may name. Your backend uses the
        organization API key instead.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.