> For the complete documentation index, see [llms.txt](https://resources.atriptech.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://resources.atriptech.com/api-document/support-and-reference/troubleshooting-and-support/errors-handing/309-vs-409.md).

# 309 vs 409

{% hint style="info" %}
💬 **Need help?** If you're stuck, ask Eva in the Help Center for instant diagnostics.

<a href="https://www.atriptech.com/" class="button primary" data-icon="comments">Ask Eva</a>
{% endhint %}

Use this page when ancillary selection fails because the current `productCode` may be stale or mapped to the wrong segment.

### Short answer

`309` means the ancillary `productCode` is invalid or stale.

`409` means the baggage `productCode` does not match the target flight segment.

Both are ancillary mapping problems.

Neither should be retried unchanged.

### FAQ

#### What does `309` usually mean?

It means the selected ancillary is no longer valid in the current booking context.

Use the latest ancillary response and rebuild the request.

#### What does `409` usually mean?

It means the baggage product is mapped to the wrong segment.

Check segment-level baggage mapping again.

#### Does a new `sessionId` or `OfferId` affect ancillary codes?

Yes.

A new booking context can make old ancillary codes stale.

### Core difference

#### `309` — ancillary not found

**What it usually means**

The selected ancillary code is invalid for the current booking context.

**Typical reasons**

* old `productCode` reused after a new verify
* old `productCode` reused after a new offer lookup
* itinerary or passenger mix changed
* ancillary data was cached too long

**Next action**

Refresh ancillaries from the current context.

Then use only the returned `productCode` values.

#### `409` — baggage code does not match the segment

**What it usually means**

The baggage `productCode` does not belong to the target flight segment in the order request.

**Typical reasons**

* segment mapping is off
* connected-flight baggage was assigned inconsistently
* baggage code from one segment was used on another

**Next action**

Recheck segment mapping.

Then rebuild baggage selection for the correct segment structure.

### Quick decision rule

Use this rule in production:

* `309` — refresh ancillary context
* `409` — fix baggage-to-segment mapping

### What to check first

When these errors appear, check:

* latest `sessionId` or `OfferId`
* latest baggage or seat response
* segment structure in the booking request
* whether connected segments use a consistent baggage choice per direction

### Common mistakes

#### Reusing ancillaries after a new verify

Do not do this.

A new `sessionId` can invalidate the old ancillary context.

#### Reusing baggage codes across different segments

Do not do this.

A valid baggage code for one segment may be invalid for another.

#### Treating `409` like a generic stale-code error

Do not do this.

It is usually a segment-mapping problem.

### Best practice

Keep ancillary lookup close to `order.do`.

If the booking context changed, rerun ancillary lookup before building the order.

### Related pages

* [Baggage and seat productCode freshness](/api-document/product-guides/booking/optional-ancillaries/baggage-and-seat-productcode-freshness.md)
* [Seats](/api-document/product-guides/booking/optional-ancillaries/seats-and-baggage.md)
* [Baggage](/api-document/product-guides/booking/optional-ancillaries/baggage.md)
* [Create Order](/api-document/product-guides/booking/booking-step-guides/create-order.md)
* [Error Codes](/api-document/support-and-reference/troubleshooting-and-support/errors-handing.md)
* [Verify, Order & Ticketing Errors](/api-document/support-and-reference/troubleshooting-and-support/errors-handing/verify-order-and-ticketing-errors.md)
