---
title: "Update Records"
method: PUT
path: "/records"
tags: ["Sports Inventory"]
---

# Update Records

`PUT /records`

## Request

- Base URL: `https://api.opti-x.optimove.net/sports-inventory/v1`
- URL: `https://api.opti-x.optimove.net/sports-inventory/v1/records`
- Auth: API key in header `x-api-key`

Updates only the top-level fields supplied for an existing entity; omitted top-level fields remain unchanged.

- PUT does **not** create a missing row. Acceptance is asynchronous, so a PUT for an unknown key still receives 202 — ensure the entity was created first.
- **Nested objects replace rather than merge**: a supplied object field (for example `categoryNameTranslated` or `extra`) replaces the stored object entirely. Retain your authoritative object before sending an update meant to preserve existing nested keys.
- **Safe odds updates**: automatic decimal-price derivation is not guaranteed on PUT. When fractional odds change, send `numPrice`, `denPrice`, and `decPrice` together with consistent values; to mark a Selection unpriced, set all three to null. Never update only one of the fractional pair.
- **Record expiry** — the optional `X-Expires-After` header applies a relative expiry (integer seconds, minimum 60) to every record in the request. PUT without the header preserves any existing expiry; to remove an expiry, send a complete authoritative POST for the row without the header.

## Headers

- `x-api-key` string, required
- `x-brand-key` string, required
- `X-Expires-After` integer

## Request body

- union[]: Updates existing entities
  - union
    - UpdateSelection: Update an existing Selection. Only include fields you want to change. **Pricing rules:** Pricing fields are optional on updates. When provided: - denPrice and numPrice must always be provided or omitted together - Any pricing field can be set to null to unset it - You can omit all pricing fields to leave them unchanged
      - `displayOrder` integer: The order by which this Selection should be displayed relative to others. Lower values display first
      - `displayStatus` 'Displayed' | 'NotDisplayed': Whether this Selection should be displayed in results or not. Setting this to NotDisplayed will mean all children will also not be displayed
      - `eventKey` string, required: The identifier of the Event this Selection belongs to
      - `extra` object: Extra metadata about this selection passed through the system for customer use
      - `marketKey` string: The identifier of the Market this Selection belongs to
      - `outcomeMeaningMajorCode` string: The major code of the outcome
      - `selectionKey` string, required: The unique identifier of this Selection
      - `selectionName` string: The publicly displayed name of this Selection
      - `selectionNameTranslated` object: The name of this Selection translated into other languages
      - `selectionPriceType` string: The price type of the Selection
      - `selectionStatus` 'Active' | 'Inactive': Whether this Selection is Active or Inactive. Inactive Selections are ignored by Optimove Personalize
      - `decPrice` number, nullable: The decimal price of the odds presented
      - `denPrice` integer, nullable: The denominator of the odds presented
      - `numPrice` integer, nullable: The numerator of the odds presented
    - UpdateMarket
      - `categoryKey` string: The identifier of the Category this Market belongs to
      - `classKey` string: The identifier of the Class this Market belongs to
      - `displayOrder` integer: The order by which this Market should be displayed relative to others. Lower values display first
      - `displayStatus` 'Displayed' | 'NotDisplayed': Whether this Market should be displayed in results or not. Setting this to NotDisplayed will mean all children will also not be displayed
      - `eventKey` string, required: The identifier of the Event this Market belongs to
      - `extra` object: Extra metadata about this market passed through the system for customer use
      - `marketKey` string, required: The unique identifier of this Market
      - `marketName` string: The publicly displayed name of this Market
      - `marketNameTranslated` object: The name of this Market translated into other languages
      - `marketSort` string
      - `marketStatus` 'Active' | 'Inactive': Whether this Market is Active or Inactive. Inactive Markets are ignored by Optimove Personalize
      - `participants` string
      - `typeKey` string: The identifier of the Type this Market belongs to
    - UpdateEvent
      - `awayName` string: The name of the Away team for this Event
      - `categoryKey` string: The identifier of the Category this Event belongs to
      - `classKey` string: The identifier of the Class this Event belongs to
      - `classSortCode` string
      - `displayOrder` integer: The order by which this Event should be displayed relative to others. Lower values display first
      - `displayStatus` 'Displayed' | 'NotDisplayed': Whether this Event should be displayed in results or not. Setting this to NotDisplayed will mean all children will also not be displayed
      - `eventDateTime` string, date-time: The date and time of this Event
      - `eventEndDateTime` string, date-time: The end date and time of this Event. Optional. Must be in ISO 8601 UTC format (e.g. 2025-02-09T17:30:00Z or 2025-02-09T17:30:00.000+0000). Fractional seconds optional. When omitted, the effective end defaults to eventDateTime + 24h.
      - `eventKey` string, required: The unique identifier of this Event
      - `eventName` string: The publicly displayed name of this Event
      - `eventNameTranslated` object: The name of this Event translated into other languages
      - `eventSort` string
      - `eventStatus` 'Active' | 'Inactive': Whether this Event is Active or Inactive. Inactive Events are ignored by Optimove Personalize
      - `extra` object: Extra metadata about this event passed through the system for customer use
      - `homeName` string: The name of the Home team for this Event
      - `isEventFinished` boolean: Whether this Event is finished or not
      - `isEventStarted` boolean: Whether this Event is started or not
      - `typeKey` string: The identifier of the Type this Event belongs to
    - UpdateCategory
      - `categoryKey` string, required: The unique identifier of this Category
      - `categoryName` string: The publicly displayed name of this Category
      - `categoryNameTranslated` object: The name of this Category translated into other languages
      - `displayOrder` integer: The order by which this Category should be displayed relative to others. Lower values display first.
      - `displayStatus` 'Displayed' | 'NotDisplayed': The display status - propagates to all children
      - `extra` object: Extra metadata about this category passed through the system for customer use
    - UpdateClass
      - `categoryKey` string, required: The identifier of the Category this Class belongs to
      - `classKey` string, required: The unique identifier of this Class
      - `className` string: The publicly displayed name of this Class
      - `classNameTranslated` object: The name of this Class translated into other languages
      - `classStatus` 'Active' | 'Inactive': Whether this Class is Active or Inactive. Inactive Classes are ignored by Optimove Personalize
      - `displayOrder` integer: The order by which this Class should be displayed relative to others. Lower values display first
      - `displayStatus` 'Displayed' | 'NotDisplayed': Whether this Class should be displayed in results or not. Setting this to NotDisplayed will mean all children will also not be displayed
      - `extra` object: Extra metadata about this Class passed through the system for customer use
    - UpdateType
      - `categoryKey` string: The identifier of the Category this Type belongs to
      - `classKey` string: The identifier of the Class this Type belongs to
      - `displayOrder` integer: The order by which this Type should be displayed relative to others. Lower values display first
      - `displayStatus` 'Displayed' | 'NotDisplayed': Whether this Type should be displayed in results or not. Setting this to NotDisplayed will mean all children will also not be displayed
      - `extra` object: Extra metadata about this Type passed through the system for customer use
      - `typeKey` string, required: The unique identifier of this Type
      - `typeName` string: The publicly displayed name of this Type
      - `typeNameTranslated` object: The name of this Type translated into other languages

## Response `202`

Accepted request

- Response: A 202 confirms **acceptance only**: the array passed validation and was accepted for asynchronous processing. It does not confirm that entities are visible downstream, that hierarchy references resolve, that a PUT matched an existing row, or that a DELETE matched an existing row. Treat a 202 with `success: false` as retryable — do not rely on the HTTP status alone.
  - `success` boolean: Have all records been accepted successfully. If false, some or all records may not have been recorded

## Other responses

- `400`: Bad Request

---

[API](https://skmtc.dev/optimove/apis/personalize-api.md) - [All operations](https://skmtc.dev/optimove/apis/personalize-api/llms.txt) - [OpenAPI document](https://skmtc.dev/optimove/apis/personalize-api/revisions/acd0c1299e2b?raw)
