# Get Fulfillments
> Source: /api-reference/members/wallet/get-fulfillments
> Get all claimed offers, perks, and grants
> Endpoint: GET /members/me/wallet/fulfillments

## Overview [#overview]

Returns all claimed offers, perks, and grants for the authenticated member. This includes items that have been redeemed using points, along with their verification codes and status.

Fulfillments represent the "claimed items" in a member's wallet - things they've spent points on.

## Authentication [#authentication]

Requires a valid Clerk JWT token in the Authorization header.

## Query Parameters [#query-parameters]

<ParamField query="status" type="string">
  Filter by fulfillment status group
  
  Available values:
  - `"active"` - claimed, pending_approval, modified, approved
  - `"completed"` - fulfilled
  - `"cancelled"` - rejected, cancelled, expired
</ParamField>

<ParamField query="sourceType" type="string">
  Filter by source type
  
  Available values: `"offer"`, `"perk"`, `"grant"`
</ParamField>

<ParamField query="propertyId" type="number">
  Filter by property ID for property-specific redemptions
</ParamField>

<ParamField query="limit" type="number">
  Maximum number of fulfillments to return (default: 20, max: 100)
</ParamField>

<ParamField query="offset" type="number">
  Number of fulfillments to skip for pagination (default: 0)
</ParamField>

<RequestExample>

```bash cURL
curl -X GET "http://localhost:3000/v1/members/me/wallet/fulfillments?status=active&limit=10" \
  -H "Authorization: Bearer YOUR_CLERK_JWT"
```

```typescript TypeScript
const response = await fetch('http://localhost:3000/v1/members/me/wallet/fulfillments?status=active&limit=10', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_CLERK_JWT'
  }
});

const fulfillments = await response.json();
```

</RequestExample>

## Response [#response]

<ResponseField name="items" type="array" required>
  List of fulfillments
  
  <Expandable title="array items">
    <ResponseField name="id" type="string" required>
      Fulfillment ID (UUID)
    </ResponseField>
    
    <ResponseField name="sourceType" type="string" required>
      Source type: "offer", "perk", or "grant"
    </ResponseField>
    
    <ResponseField name="name" type="string" required>
      Name of the claimed item
    </ResponseField>
    
    <ResponseField name="shortDescription" type="string">
      Brief description of the item
    </ResponseField>
    
    <ResponseField name="catalogType" type="string">
      Catalog type: "offer" or "perk"
    </ResponseField>
    
    <ResponseField name="redemptionType" type="string">
      How this item is redeemed: "instant", "manual", "property_specific"
    </ResponseField>
    
    <ResponseField name="propertyName" type="string">
      Property name for property-specific redemptions
    </ResponseField>
    
    <ResponseField name="reservationId" type="string">
      External reservation ID if tied to a specific booking
    </ResponseField>
    
    <ResponseField name="status" type="string" required>
      Current fulfillment status
    </ResponseField>
    
    <ResponseField name="approvalStatus" type="string">
      Approval status for items requiring approval
    </ResponseField>
    
    <ResponseField name="pointsCharged" type="number">
      Points spent to claim this item
    </ResponseField>
    
    <ResponseField name="claimedAt" type="string" required>
      ISO 8601 timestamp when item was claimed
    </ResponseField>
    
    <ResponseField name="fulfilledAt" type="string">
      ISO 8601 timestamp when item was fulfilled
    </ResponseField>
    
    <ResponseField name="expiresAt" type="string">
      ISO 8601 timestamp when item expires
    </ResponseField>
    
    <ResponseField name="responseDeadline" type="string">
      ISO 8601 timestamp for response deadline (for items requiring approval)
    </ResponseField>
    
    <ResponseField name="verificationCode" type="string">
      Code to verify redemption with property/vendor
    </ResponseField>
    
    <ResponseField name="activationCode" type="string">
      Code to activate the redemption
    </ResponseField>
    
    <ResponseField name="qrCodeUrl" type="string">
      URL to QR code for mobile redemption
    </ResponseField>
    
    <ResponseField name="media" type="object">
      Media assets for the item
      
      <Expandable title="properties">
        <ResponseField name="heroImageUrl" type="string">
          Hero image URL
        </ResponseField>
        
        <ResponseField name="cardImageUrl" type="string">
          Card/thumbnail image URL
        </ResponseField>
      </Expandable>
    </ResponseField>
    
    <ResponseField name="howToRedeem" type="string">
      Instructions on how to redeem this item
    </ResponseField>
    
    <ResponseField name="metadata" type="object">
      Additional metadata specific to the fulfillment type
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="total" type="number" required>
  Total number of fulfillments matching filters
</ResponseField>

<ResponseField name="statusCounts" type="object" required>
  Count of fulfillments by status group
  
  <Expandable title="properties">
    <ResponseField name="active" type="number" required>
      Number of active fulfillments
    </ResponseField>
    
    <ResponseField name="completed" type="number" required>
      Number of completed fulfillments
    </ResponseField>
    
    <ResponseField name="cancelled" type="number" required>
      Number of cancelled fulfillments
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="offset" type="number" required>
  Current pagination offset
</ResponseField>

<ResponseField name="limit" type="number" required>
  Current pagination limit
</ResponseField>

<ResponseExample>

```json 200 Response
{
  "items": [
    {
      "id": "fulfill_550e8400-e29b-41d4-a716-446655440000",
      "sourceType": "offer",
      "name": "Suite Upgrade",
      "shortDescription": "Complimentary upgrade to next available suite",
      "catalogType": "offer",
      "redemptionType": "property_specific",
      "propertyName": "Luxury Resort & Spa",
      "reservationId": "ABC123",
      "status": "approved",
      "approvalStatus": "approved",
      "pointsCharged": 1500,
      "claimedAt": "2024-04-10T09:15:00Z",
      "fulfilledAt": null,
      "expiresAt": "2024-04-20T23:59:59Z",
      "responseDeadline": "2024-04-15T12:00:00Z",
      "verificationCode": "SUITE-2024-789",
      "activationCode": null,
      "qrCodeUrl": "https://cdn.journey.com/qr/fulfill_550e8400.png",
      "media": {
        "heroImageUrl": "https://cdn.journey.com/offers/suite-upgrade-hero.jpg",
        "cardImageUrl": "https://cdn.journey.com/offers/suite-upgrade-card.jpg"
      },
      "howToRedeem": "Present verification code at check-in or call the property directly.",
      "metadata": {
        "currentRoomType": "Standard King",
        "requestedRoomType": "Junior Suite",
        "confirmedRoomType": "Executive Suite"
      }
    },
    {
      "id": "fulfill_550e8400-e29b-41d4-a716-446655440001",
      "sourceType": "perk",
      "name": "Free Breakfast",
      "shortDescription": "Complimentary breakfast for two at resort restaurant",
      "catalogType": "perk",
      "redemptionType": "instant",
      "propertyName": "Downtown Hotel",
      "reservationId": "XYZ789",
      "status": "fulfilled",
      "approvalStatus": null,
      "pointsCharged": 500,
      "claimedAt": "2024-04-01T14:30:00Z",
      "fulfilledAt": "2024-04-05T08:00:00Z",
      "expiresAt": null,
      "responseDeadline": null,
      "verificationCode": "BREAKFAST-456",
      "activationCode": null,
      "qrCodeUrl": null,
      "media": {
        "heroImageUrl": "https://cdn.journey.com/perks/breakfast-hero.jpg",
        "cardImageUrl": "https://cdn.journey.com/perks/breakfast-card.jpg"
      },
      "howToRedeem": "Show verification code to restaurant host.",
      "metadata": null
    }
  ],
  "total": 8,
  "statusCounts": {
    "active": 3,
    "completed": 4,
    "cancelled": 1
  },
  "offset": 0,
  "limit": 10
}
```

</ResponseExample>

## Status Groups [#status-groups]

### Active [#active]
- **claimed**: Item has been claimed but not yet processed
- **pending_approval**: Waiting for property/vendor approval
- **modified**: Property has modified the request
- **approved**: Approved and ready for use

### Completed [#completed]  
- **fulfilled**: Item has been successfully redeemed/used

### Cancelled [#cancelled]
- **rejected**: Property/vendor rejected the redemption
- **cancelled**: Member or admin cancelled
- **expired**: Item expired before use

## Source Types [#source-types]

### Offer [#offer]
- **Source**: Loyalty catalog offers
- **Points**: Usually costs points to claim
- **Examples**: Suite upgrades, spa credits, dining vouchers

### Perk [#perk]
- **Source**: Tier-based entitlements  
- **Points**: Usually free based on membership tier
- **Examples**: Free breakfast, late checkout, WiFi

### Grant [#grant]
- **Source**: Special grants/vouchers
- **Points**: May be free or discounted
- **Examples**: Promotional vouchers, comp stays

## Redemption Types [#redemption-types]

### instant [#instant]
- **Behavior**: Immediately active upon claiming
- **Usage**: Can be used right away
- **Examples**: Digital vouchers, account credits

### manual [#manual]
- **Behavior**: Requires manual processing/approval
- **Usage**: Must wait for approval before use
- **Examples**: Custom requests, special arrangements

### property_specific [#property_specific]
- **Behavior**: Must be used at a specific property
- **Usage**: Tied to a reservation at that property
- **Examples**: Room upgrades, property dining credits

## Verification Codes [#verification-codes]

Active fulfillments include verification codes for redemption:
- **verificationCode**: Primary code for property/vendor
- **activationCode**: Secondary code if needed
- **qrCodeUrl**: QR code for mobile scanning

## Related Endpoints [#related-endpoints]

- [Get Fulfillment](/api-reference/members/wallet/get-fulfillment) - Get single fulfillment details
- [Cancel Fulfillment](/api-reference/members/wallet/cancel-fulfillment) - Cancel active fulfillment
- [Get Balance](/api-reference/members/wallet/get-balance) - Check available points
