# Update an offer fulfillment

> For the complete machine-readable documentation index, see [llms.txt](https://apidocs.chargebee.com/llms.txt).


This API is used to update the status of offer fulfillment for the processing types `url_redirect`, `webhook` and `email` as Chargebee cannot automatically fulfill these offers.  
If `status = failed`, you must include a `failure_reason` to explain why the fulfillment did not succeed. The system logs a `fulfilled` event when `status = completed` or a `failed` event when `status = failed`.  
**Note**: If the offer fulfillment is not marked as completed or failed within 7 days, Chargebee will mark the offer fulfillment as failed with the error code as `external_fulfillment_failed`.

## Sample Request

#### cURL

```bash
curl  https://{site}.grow.chargebee.com/api/v2/offer_fulfillments/9ad57ad8-c22c-451b-b9de-780e7e7d987f \
     -u {site_api_key}:\
     --header 'Content-Type: application/json;charset=UTF-8' \
     --data '{
     "offer-fulfillment-id": "9ad57ad8-c22c-451b-b9de-780e7e7d987f",
     "offer_fulfillment_id": "9ad57ad8-c22c-451b-b9de-780e7e7d987f",
     "status": "completed"
}'
```

#### .NET

```dotnet
using ChargeBee.Api;
using ChargeBee.Models;

ApiConfig.Configure("{site}","{site_api_key}");
EntityResult result = OfferFulfillment.OfferFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f")
		.Status(OfferFulfillment.StatusEnum.Completed)
		.Request();

OfferFulfillment offerFulfillment = result.OfferFulfillment;
```

#### Go

```go
package main
import (
    "fmt"
    "github.com/chargebee/chargebee-go/v3"
    offerfulfillmentAction "github.com/chargebee/chargebee-go/v3/actions/offerfulfillment"
    "github.com/chargebee/chargebee-go/v3/models/offerfulfillment"
    offerFulfillmentEnum "github.com/chargebee/chargebee-go/v3/models/offerfulfillment/enum"
)
func main() {
    chargebee.Configure("{site_api_key}","{site}");
    res,err := offerfulfillmentAction.OfferFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f", &offerfulfillment.OfferFulfillmentsUpdateRequestParams{
        Status : offerFulfillmentEnum.StatusCompleted,
    }).Request()
    if err != nil {
        fmt.Println(err)
    } else {
        OfferFulfillment := res.OfferFulfillment
    }
}
```

#### Go

```go
package main

import (
  "fmt"
  "github.com/chargebee/chargebee-go/v4"
)

func main() {
  config := &chargebee.ClientConfig{
    SiteName: "{site}",
    ApiKey: "{site_api_key}",
  }    
  client := chargebee.NewClient(config)
  req := &chargebee.OfferFulfillmentOfferFulfillmentsUpdateRequest{
    Status : chargebee.OfferFulfillmentStatusCompleted,
}
  res, err := client.OfferFulfillment.OfferFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f", req)
      if err != nil {
        fmt.Println(err)
    } else {
        OfferFulfillment := res.OfferFulfillment
    }
}
```

#### Java

```java
import com.chargebee.*;
import com.chargebee.ListResult;
import com.chargebee.models.*;
import com.chargebee.models.enums.*;
import java.io.IOException;

public class Sample {

    public static void main(String args[]) throws IOException, Exception {
        Environment.configure("{site}", "{site_api_key}");
        Result result = OfferFulfillment.offerFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f")
            .status(OfferFulfillment.Status.COMPLETED)
            .request();

        OfferFulfillment offerFulfillment = result.offerFulfillment();
    }
}
```

#### Java

```java
import com.chargebee.v4.client.ChargebeeClient;
import com.chargebee.v4.models.offerFulfillment.OfferFulfillment;
import com.chargebee.v4.models.offerFulfillment.params.OfferFulfillmentsUpdateParams;
import com.chargebee.v4.models.offerFulfillment.responses.OfferFulfillmentsUpdateResponse;

public class OfferFulfillmentsUpdate {

    public static void main(String[] args) {
        ChargebeeClient client = ChargebeeClient.builder()
            .apiKey("{site_api_key}")
            .siteName("{site}")
            .build();

        OfferFulfillmentsUpdateParams params = OfferFulfillmentsUpdateParams.builder()
            .status(OfferFulfillmentsUpdateParams.Status.COMPLETED)
            .build();

        OfferFulfillmentsUpdateResponse response = client
            .offerFulfillments()
            .offerFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f", params);

        OfferFulfillment offerFulfillment = response.getOfferFulfillment();
    }
}
```

#### Node.js

```node
import Chargebee from "chargebee";

const chargebee = new Chargebee({
    site: "{site}",
    apiKey: "{site_api_key}",
});

try {
    const result = await chargebee.offerFulfillment.offerFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f", {
        status: "completed"
    });

    console.log(result);
    const offerFulfillment = result.offer_fulfillment;
} catch (err) {
    console.log(err);
}
```

#### PHP

```php
<?php

require __DIR__ . '/vendor/autoload.php';

use Chargebee\ChargebeeClient;

$chargebee = new ChargebeeClient(options: [
    "site" => "{site}",
    "apiKey" => "{site_api_key}",
]);
$result = $chargebee->offerFulfillment()->offerFulfillmentsUpdate("9ad57ad8-c22c-451b-b9de-780e7e7d987f", [
    "status" => "completed"
]);
$offerFulfillment = $result->offer_fulfillment;
```

#### Python

```python
import chargebee
from chargebee import Chargebee

cb_client = Chargebee(api_key="{site_api_key}", site="{site}")
response = cb_client.OfferFulfillment.offer_fulfillments_update("9ad57ad8-c22c-451b-b9de-780e7e7d987f",
    cb_client.OfferFulfillment.OfferFulfillmentsUpdateParams(
        status=chargebee.OfferFulfillment.Status.COMPLETED
    )
)
offer_fulfillment = response.offer_fulfillment
```

#### Ruby

```ruby
require 'chargebee'

ChargeBee.configure(:site => "{site}",
  :api_key => "{site_api_key}")

result = ChargeBee::OfferFulfillment.offer_fulfillments_update("9ad57ad8-c22c-451b-b9de-780e7e7d987f",{
  :status => "COMPLETED"
})

offer_fulfillment = result.offer_fulfillment
```

## Sample Response

```json
{
  "offer_fulfillment": {
    "personalized_offer_id": "a52ge40b",
    "option_id": "b3b4741d",
    "processing_type": "url_redirect",
    "status": "completed",
    "redirect_url": "https://mysecurecheckoutflow.com/a52ge40b"
  }
}
```

## URL Format

**POST** https://[site].grow.chargebee.com/api/v2/offer_fulfillments/{offer-fulfillment-id}

## Input Parameters

- `id` (required, string, max chars=50)
  ID of the fulfillment that is being updated.

- `status` (required, enumerated string)
  Final state of the fulfillment.
  Possible enum values:
    - `completed`
      Pass this if the fulfillment is completed.
    - `failed`
      Pass this if the fulfillment is failed.

- `failure_reason` (optional, string, max chars=100)
  Explanation for failure; required when `status` = `failed` .

## Returns

- `offer_fulfillment` (Offer fulfillment object)
  Represents the fulfillment created for the offer.
