# Confirm Fulfillment Redeemed
> Source: /api-reference/members/loyalty/confirm-fulfillment
> Member confirms a claimed fulfillment as successfully redeemed
> Endpoint: POST /members/me/loyalty/offers/fulfillments/{fulfillmentId}/confirm

## Overview [#overview]

Allows a member to self-confirm that they have successfully redeemed a claimed fulfillment. This moves the status from "claimed" to "fulfilled" and is used for direct redemption types where the member can verify their own redemption.

Valid for "direct", "externalCode", and "static" redemption types only.

## Authentication [#authentication]

Requires a valid Clerk JWT token in the Authorization header.

## Path Parameters [#path-parameters]

<ParamField path="fulfillmentId" type="string" required>
  Fulfillment UUID to confirm as redeemed
</ParamField>

## Request Body [#request-body]

<ParamField body="confirmed" type="boolean">
  Confirmation that the fulfillment was successfully used (typically true)
</ParamField>

<RequestExample>

```bash cURL
curl -X POST "http://localhost:3000/v1/members/me/loyalty/offers/fulfillments/fulfill_550e8400-e29b-41d4-a716-446655440000/confirm" \
  -H "Authorization: Bearer YOUR_CLERK_JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "confirmed": true
  }'
```

```typescript TypeScript
const fulfillmentId = "fulfill_550e8400-e29b-41d4-a716-446655440000";
const response = await fetch(`http://localhost:3000/v1/members/me/loyalty/offers/fulfillments/${fulfillmentId}/confirm`, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_CLERK_JWT',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    confirmed: true
  })
});

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

</RequestExample>

## Response [#response]

<ResponseField name="success" type="boolean" required>
  Whether the confirmation was successful
</ResponseField>

<ResponseField name="status" type="string" required>
  New status of the fulfillment (typically "fulfilled")
</ResponseField>

<ResponseField name="fulfilledAt" type="string">
  ISO 8601 timestamp when fulfillment was marked as fulfilled
</ResponseField>

<ResponseExample>

```json 200 Response - Success
{
  "success": true,
  "status": "fulfilled",
  "fulfilledAt": "2024-04-15T16:45:00Z"
}
```

```json 200 Response - Already Fulfilled
{
  "success": true,
  "status": "fulfilled", 
  "fulfilledAt": "2024-04-15T15:30:00Z"
}
```

```json 400 Response - Cannot Confirm
{
  "statusCode": 400,
  "message": "Cannot self-confirm fulfillments of type propertySpecific"
}
```

```json 400 Response - Invalid Status
{
  "statusCode": 400,
  "message": "Cannot confirm fulfillment in rejected status"
}
```

```json 404 Response - Not Found
{
  "statusCode": 404,
  "message": "Fulfillment fulfill_550e8400-e29b-41d4-a716-446655440000 not found"
}
```

```json 403 Response - Not Owner
{
  "statusCode": 403,
  "message": "Fulfillment does not belong to this member"
}
```

</ResponseExample>

## Confirmation Process [#confirmation-process]

### Validation [#validation]
1. **Ownership**: Verifies fulfillment belongs to authenticated member
2. **Redemption Type**: Only allows self-confirmation for eligible types
3. **Status Check**: Ensures fulfillment is in a confirmable state

### Status Updates [#status-updates]
1. **Fulfillment Status**: Updates from "claimed"/"approved" to "fulfilled"
2. **Timestamp**: Records when confirmation occurred
3. **Ledger Update**: Finalizes any point transactions if applicable

### Eligible Redemption Types [#eligible-redemption-types]
- **direct**: Instant activation (e.g., account credits)
- **externalCode**: Member redeems externally (e.g., third-party vouchers)
- **static**: Fixed redemptions that don't require property verification

## Valid Confirmation Statuses [#valid-confirmation-statuses]

### claimed [#claimed]
- **Meaning**: Recently claimed, ready for redemption
- **Action**: Member confirms they used/redeemed the item
- **Result**: Moves to "fulfilled"

### approved [#approved]
- **Meaning**: Approved by property, ready for use
- **Action**: Member confirms they used the approved item
- **Result**: Moves to "fulfilled"

## Non-Confirmable Redemption Types [#non-confirmable-redemption-types]

### propertySpecific [#propertyspecific]
- **Reason**: Requires property verification
- **Alternative**: Property marks as fulfilled when member redeems

### journeyInternal [#journeyinternal]
- **Reason**: System-managed redemptions
- **Alternative**: Automated fulfillment process

## Non-Confirmable Statuses [#non-confirmable-statuses]

### fulfilled [#fulfilled]
- **Reason**: Already completed
- **Response**: Returns current fulfilled timestamp

### rejected [#rejected]
- **Reason**: Property/system rejected the request
- **Response**: Error - cannot confirm rejected items

### cancelled [#cancelled]
- **Reason**: Cancelled by member or admin
- **Response**: Error - cannot confirm cancelled items

### expired [#expired]
- **Reason**: Past expiration date
- **Response**: Error - cannot confirm expired items

## Use Cases [#use-cases]

### Digital Vouchers [#digital-vouchers]
- Member receives external code
- Member redeems code with third party
- Member confirms successful redemption

### Account Credits [#account-credits]
- Credit applied to member account instantly
- Member confirms they received the credit
- Finalizes the transaction

### Direct Benefits [#direct-benefits]
- Benefit applied immediately (e.g., tier status)
- Member confirms they received the benefit
- Completes the fulfillment cycle

## Related Endpoints [#related-endpoints]

- [Get Fulfillment](/api-reference/members/wallet/get-fulfillment) - Check fulfillment details before confirming
- [Get Fulfillments](/api-reference/members/wallet/get-fulfillments) - List all fulfillments
- [Claim Offer](/api-reference/members/loyalty/claim-offer) - Create fulfillments to confirm
