{
  "version": "2.0",
  "service": "<p>Contains all data plane API operations and data types for the Amazon SageMaker Feature Store. Use this API to put, delete, and retrieve (get) features from a feature store.</p> <p>Use the following operations to configure your <code>OnlineStore</code> and <code>OfflineStore</code> features, and to create and manage feature groups:</p> <ul> <li> <p> <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateFeatureGroup.html\">CreateFeatureGroup</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeleteFeatureGroup.html\">DeleteFeatureGroup</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeFeatureGroup.html\">DescribeFeatureGroup</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListFeatureGroups.html\">ListFeatureGroups</a> </p> </li> </ul>",
  "operations": {
    "BatchGetRecord": "<p>Retrieves a batch of <code>Records</code> from a <code>FeatureGroup</code>.</p>",
    "BatchWriteRecord": "<p>Writes a batch of <code>Records</code> to one or more <code>FeatureGroup</code>s. Use this API for bulk ingestion of records into the <code>OnlineStore</code> and <code>OfflineStore</code>.</p> <p>You can set the ingested records to expire at a given time to live (TTL) duration after the record's event time by specifying the <code>TtlDuration</code> parameter. A request level <code>TtlDuration</code> applies to all entries that do not specify their own <code>TtlDuration</code>.</p>",
    "DeleteRecord": "<p>Deletes a <code>Record</code> from a <code>FeatureGroup</code> in the <code>OnlineStore</code>. Feature Store supports both <code>SoftDelete</code> and <code>HardDelete</code>. For <code>SoftDelete</code> (default), feature columns are set to <code>null</code> and the record is no longer retrievable by <code>GetRecord</code> or <code>BatchGetRecord</code>. For <code>HardDelete</code>, the complete <code>Record</code> is removed from the <code>OnlineStore</code>. In both cases, Feature Store appends the deleted record marker to the <code>OfflineStore</code>. The deleted record marker is a record with the same <code>RecordIdentifer</code> as the original, but with <code>is_deleted</code> value set to <code>True</code>, <code>EventTime</code> set to the delete input <code>EventTime</code>, and other feature values set to <code>null</code>.</p> <p>Note that the <code>EventTime</code> specified in <code>DeleteRecord</code> should be set later than the <code>EventTime</code> of the existing record in the <code>OnlineStore</code> for that <code>RecordIdentifer</code>. If it is not, the deletion does not occur:</p> <ul> <li> <p>For <code>SoftDelete</code>, the existing (not deleted) record remains in the <code>OnlineStore</code>, though the delete record marker is still written to the <code>OfflineStore</code>.</p> </li> <li> <p> <code>HardDelete</code> returns <code>EventTime</code>: <code>400 ValidationException</code> to indicate that the delete operation failed. No delete record marker is written to the <code>OfflineStore</code>.</p> </li> </ul> <p>When a record is deleted from the <code>OnlineStore</code>, the deleted record marker is appended to the <code>OfflineStore</code>. If you have the Iceberg table format enabled for your <code>OfflineStore</code>, you can remove all history of a record from the <code>OfflineStore</code> using Amazon Athena or Apache Spark. For information on how to hard delete a record from the <code>OfflineStore</code> with the Iceberg table format enabled, see <a href=\"https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store-delete-records.html#feature-store-delete-records-offline-store\">Delete records from the offline store</a>.</p>",
    "GetRecord": "<p>Use for <code>OnlineStore</code> serving from a <code>FeatureStore</code>. Only the latest records stored in the <code>OnlineStore</code> can be retrieved. If no Record with <code>RecordIdentifierValue</code> is found, then an empty result is returned. </p>",
    "ListRecords": "<p>Lists the <code>RecordIdentifier</code> values of all records stored in a <code>FeatureGroup</code>'s <code>OnlineStore</code>. This enables you to discover which records exist without retrieving the full record data.</p>",
    "PutRecord": "<p>The <code>PutRecord</code> API is used to ingest a list of <code>Records</code> into your feature group. </p> <p>If a new record’s <code>EventTime</code> is greater, the new record is written to both the <code>OnlineStore</code> and <code>OfflineStore</code>. Otherwise, the record is a historic record and it is written only to the <code>OfflineStore</code>. </p> <p>You can specify the ingestion to be applied to the <code>OnlineStore</code>, <code>OfflineStore</code>, or both by using the <code>TargetStores</code> request parameter. </p> <p>You can set the ingested record to expire at a given time to live (TTL) duration after the record’s event time, <code>ExpiresAt</code> = <code>EventTime</code> + <code>TtlDuration</code>, by specifying the <code>TtlDuration</code> parameter. A record level <code>TtlDuration</code> is set when specifying the <code>TtlDuration</code> parameter using the <code>PutRecord</code> API call. If the input <code>TtlDuration</code> is <code>null</code> or unspecified, <code>TtlDuration</code> is set to the default feature group level <code>TtlDuration</code>. A record level <code>TtlDuration</code> supersedes the group level <code>TtlDuration</code>.</p>",
    "UpdateRecord": "<p>Updates one or more feature values for an existing record in the specified feature group. Features that you do not include in the request remain unchanged. You can update up to 100 features per call.</p> <important> <p>This operation is available only for feature groups that use the <code>Standard_V2</code> or <code>InMemory</code> online store type.</p> </important> <p>The record must already exist. If the record does not exist or has been soft-deleted, the operation returns a <code>ResourceNotFound</code> error. To create a record, use <code>PutRecord</code>.</p> <p>If you provide an <code>EventTime</code> that is older than the record's current <code>EventTime</code>, the service rejects the update with a <code>ConflictException</code>. If the <code>EventTime</code> is equal to or newer than the current value, the service applies the update. If you omit <code>EventTime</code>, the service keeps the record's existing <code>EventTime</code> and applies the update.</p> <p>If you specify a <code>TtlDuration</code>, you must also provide an <code>EventTime</code> in the request. Otherwise, the operation returns a <code>ValidationError</code>.</p>"
  },
  "shapes": {
    "AccessForbidden": {
      "base": "<p>You do not have permission to perform an action.</p>",
      "refs": {}
    },
    "BatchGetRecordError": {
      "base": "<p>The error that has occurred when attempting to retrieve a batch of Records.</p>",
      "refs": {
        "BatchGetRecordErrors$member": null
      }
    },
    "BatchGetRecordErrors": {
      "base": null,
      "refs": {
        "BatchGetRecordResponse$Errors": "<p>A list of errors that have occurred when retrieving a batch of Records.</p>"
      }
    },
    "BatchGetRecordIdentifier": {
      "base": "<p>The identifier that identifies the batch of Records you are retrieving in a batch.</p>",
      "refs": {
        "BatchGetRecordIdentifiers$member": null,
        "UnprocessedIdentifiers$member": null
      }
    },
    "BatchGetRecordIdentifiers": {
      "base": null,
      "refs": {
        "BatchGetRecordRequest$Identifiers": "<p>A list containing the name or Amazon Resource Name (ARN) of the <code>FeatureGroup</code>, the list of names of <code>Feature</code>s to be retrieved, and the corresponding <code>RecordIdentifier</code> values as strings.</p>"
      }
    },
    "BatchGetRecordRequest": {
      "base": null,
      "refs": {}
    },
    "BatchGetRecordResponse": {
      "base": null,
      "refs": {}
    },
    "BatchGetRecordResultDetail": {
      "base": "<p>The output of records that have been retrieved in a batch.</p>",
      "refs": {
        "BatchGetRecordResultDetails$member": null
      }
    },
    "BatchGetRecordResultDetails": {
      "base": null,
      "refs": {
        "BatchGetRecordResponse$Records": "<p>A list of Records you requested to be retrieved in batch.</p>"
      }
    },
    "BatchWriteRecordEntries": {
      "base": null,
      "refs": {
        "BatchWriteRecordRequest$Entries": "<p>A list of records to write. Each entry specifies the <code>FeatureGroup</code>, the record data, and optionally target stores and a TTL duration.</p>"
      }
    },
    "BatchWriteRecordEntry": {
      "base": "<p>An entry to write as part of a <code>BatchWriteRecord</code> request.</p>",
      "refs": {
        "BatchWriteRecordEntries$member": null,
        "BatchWriteRecordError$Entry": "<p>The entry that failed to be written.</p>",
        "UnprocessedBatchWriteRecordEntries$member": null
      }
    },
    "BatchWriteRecordError": {
      "base": "<p>The error that has occurred when attempting to write a record in a batch.</p>",
      "refs": {
        "BatchWriteRecordErrors$member": null
      }
    },
    "BatchWriteRecordErrors": {
      "base": null,
      "refs": {
        "BatchWriteRecordResponse$Errors": "<p>A list of errors that occurred when writing records in the batch.</p>"
      }
    },
    "BatchWriteRecordRequest": {
      "base": null,
      "refs": {}
    },
    "BatchWriteRecordResponse": {
      "base": null,
      "refs": {}
    },
    "Boolean": {
      "base": null,
      "refs": {
        "ListRecordsRequest$IncludeSoftDeletedRecords": "<p>If set to <code>true</code>, the result includes records that have been soft deleted.</p>"
      }
    },
    "ConflictException": {
      "base": "<p>The service rejected the update because the provided <code>EventTime</code> is older than the record's current <code>EventTime</code>. To persist the update, retrieve the record's latest <code>EventTime</code> and resubmit the request with an <code>EventTime</code> that is equal to or newer than the current value.</p>",
      "refs": {}
    },
    "DeleteRecordRequest": {
      "base": null,
      "refs": {}
    },
    "DeletionMode": {
      "base": null,
      "refs": {
        "DeleteRecordRequest$DeletionMode": "<p>The name of the deletion mode for deleting the record. By default, the deletion mode is set to <code>SoftDelete</code>.</p>"
      }
    },
    "ExpirationTimeResponse": {
      "base": null,
      "refs": {
        "BatchGetRecordRequest$ExpirationTimeResponse": "<p>Parameter to request <code>ExpiresAt</code> in response. If <code>Enabled</code>, <code>BatchGetRecord</code> will return the value of <code>ExpiresAt</code>, if it is not null. If <code>Disabled</code> and null, <code>BatchGetRecord</code> will return null.</p>",
        "GetRecordRequest$ExpirationTimeResponse": "<p>Parameter to request <code>ExpiresAt</code> in response. If <code>Enabled</code>, <code>GetRecord</code> will return the value of <code>ExpiresAt</code>, if it is not null. If <code>Disabled</code> and null, <code>GetRecord</code> will return null.</p>"
      }
    },
    "ExpiresAt": {
      "base": null,
      "refs": {
        "BatchGetRecordResultDetail$ExpiresAt": "<p>The <code>ExpiresAt</code> ISO string of the requested record.</p>",
        "GetRecordResponse$ExpiresAt": "<p>The <code>ExpiresAt</code> ISO string of the requested record.</p>"
      }
    },
    "FeatureGroupNameOrArn": {
      "base": null,
      "refs": {
        "BatchGetRecordIdentifier$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the <code>FeatureGroup</code> containing the records you are retrieving in a batch.</p>",
        "BatchWriteRecordEntry$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the <code>FeatureGroup</code> to write the record to.</p>",
        "DeleteRecordRequest$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the feature group to delete the record from. </p>",
        "GetRecordRequest$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the feature group from which you want to retrieve a record.</p>",
        "ListRecordsRequest$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the feature group to list records from.</p>",
        "PutRecordRequest$FeatureGroupName": "<p>The name or Amazon Resource Name (ARN) of the feature group that you want to insert the record into.</p>",
        "UpdateRecordRequest$FeatureGroupName": "<p>The identifier for the feature group that contains the record to update. You can specify one of the following:</p> <ul> <li> <p>The feature group name.</p> </li> <li> <p>The feature group Amazon Resource Name (ARN).</p> </li> </ul>"
      }
    },
    "FeatureName": {
      "base": null,
      "refs": {
        "FeatureNames$member": null,
        "FeatureValue$FeatureName": "<p>The name of a feature that a feature value corresponds to.</p>"
      }
    },
    "FeatureNames": {
      "base": null,
      "refs": {
        "BatchGetRecordIdentifier$FeatureNames": "<p>List of names of Features to be retrieved. If not specified, the latest value for all the Features are returned.</p>",
        "GetRecordRequest$FeatureNames": "<p>List of names of Features to be retrieved. If not specified, the latest value for all the Features are returned.</p>"
      }
    },
    "FeatureValue": {
      "base": "<p>The value associated with a feature.</p>",
      "refs": {
        "Record$member": null
      }
    },
    "GetRecordRequest": {
      "base": null,
      "refs": {}
    },
    "GetRecordResponse": {
      "base": null,
      "refs": {}
    },
    "InternalFailure": {
      "base": "<p>An internal failure occurred. Try your request again. If the problem persists, contact Amazon Web Services customer support.</p>",
      "refs": {}
    },
    "ListRecordsMaxResults": {
      "base": null,
      "refs": {
        "ListRecordsRequest$MaxResults": "<p>The maximum number of record identifiers to return in a single page of results. For the <code>InMemory</code> tier, this value is a hint and not a strict requirement. The response may contain more or fewer results than the specified <code>MaxResults</code>.</p>"
      }
    },
    "ListRecordsNextToken": {
      "base": null,
      "refs": {
        "ListRecordsRequest$NextToken": "<p>A token to resume pagination of <code>ListRecords</code> results.</p>",
        "ListRecordsResponse$NextToken": "<p>A token to resume pagination if the response includes more record identifiers than <code>MaxResults</code>.</p>"
      }
    },
    "ListRecordsRequest": {
      "base": null,
      "refs": {}
    },
    "ListRecordsResponse": {
      "base": null,
      "refs": {}
    },
    "Message": {
      "base": null,
      "refs": {
        "AccessForbidden$Message": null,
        "BatchGetRecordError$ErrorMessage": "<p>The error message of an error that has occurred when attempting to retrieve a record in the batch.</p>",
        "BatchWriteRecordError$ErrorMessage": "<p>The error message for the failed record write.</p>",
        "ConflictException$Message": null,
        "InternalFailure$Message": null,
        "ResourceNotFound$Message": null,
        "ServiceUnavailable$Message": null,
        "ValidationError$Message": null
      }
    },
    "PutRecordRequest": {
      "base": null,
      "refs": {}
    },
    "Record": {
      "base": null,
      "refs": {
        "BatchGetRecordResultDetail$Record": "<p>The <code>Record</code> retrieved.</p>",
        "BatchWriteRecordEntry$Record": "<p>List of FeatureValues to be inserted. This will be a full over-write.</p>",
        "GetRecordResponse$Record": "<p>The record you requested. A list of <code>FeatureValues</code>.</p>",
        "PutRecordRequest$Record": "<p>List of FeatureValues to be inserted. This will be a full over-write. If you only want to update few of the feature values, do the following:</p> <ul> <li> <p>Use <code>GetRecord</code> to retrieve the latest record.</p> </li> <li> <p>Update the record returned from <code>GetRecord</code>. </p> </li> <li> <p>Use <code>PutRecord</code> to update feature values.</p> </li> </ul>",
        "UpdateRecordRequest$Features": "<p>The feature values to write to the record.</p>"
      }
    },
    "RecordIdentifierList": {
      "base": null,
      "refs": {
        "ListRecordsResponse$RecordIdentifiers": "<p>A list of record identifier values for the records stored in the <code>OnlineStore</code>.</p>"
      }
    },
    "RecordIdentifiers": {
      "base": null,
      "refs": {
        "BatchGetRecordIdentifier$RecordIdentifiersValueAsString": "<p>The value for a list of record identifiers in string format.</p>"
      }
    },
    "ResourceNotFound": {
      "base": "<p>A resource that is required to perform an action was not found.</p>",
      "refs": {}
    },
    "ServiceUnavailable": {
      "base": "<p>The service is currently unavailable.</p>",
      "refs": {}
    },
    "TargetStore": {
      "base": null,
      "refs": {
        "TargetStores$member": null
      }
    },
    "TargetStores": {
      "base": null,
      "refs": {
        "BatchWriteRecordEntry$TargetStores": "<p>A list of stores to which you're adding the record. By default, Feature Store adds the record to all of the stores that you're using for the <code>FeatureGroup</code>.</p>",
        "DeleteRecordRequest$TargetStores": "<p>A list of stores from which you're deleting the record. By default, Feature Store deletes the record from all of the stores that you're using for the <code>FeatureGroup</code>.</p>",
        "PutRecordRequest$TargetStores": "<p>A list of stores to which you're adding the record. By default, Feature Store adds the record to all of the stores that you're using for the <code>FeatureGroup</code>.</p>",
        "UpdateRecordRequest$TargetStores": "<p>The target stores for the record update. By default, Amazon SageMaker Feature Store updates the record in all stores associated with the <code>FeatureGroup</code>.</p>"
      }
    },
    "TtlDuration": {
      "base": "<p>Time to live duration, where the record is hard deleted after the expiration time is reached; <code>ExpiresAt</code> = <code>EventTime</code> + <code>TtlDuration</code>. For information on HardDelete, see the <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html\">DeleteRecord</a> API in the Amazon SageMaker API Reference guide.</p>",
      "refs": {
        "BatchWriteRecordEntry$TtlDuration": "<p>Time to live duration for this entry, where the record is hard deleted after the expiration time is reached; <code>ExpiresAt</code> = <code>EventTime</code> + <code>TtlDuration</code>. This overrides the request level <code>TtlDuration</code>.</p>",
        "BatchWriteRecordRequest$TtlDuration": "<p>Time to live duration applied to all entries in the batch that do not specify their own <code>TtlDuration</code>; <code>ExpiresAt</code> = <code>EventTime</code> + <code>TtlDuration</code>. For information on HardDelete, see the <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html\">DeleteRecord</a> API in the Amazon SageMaker API Reference guide.</p>",
        "PutRecordRequest$TtlDuration": "<p>Time to live duration, where the record is hard deleted after the expiration time is reached; <code>ExpiresAt</code> = <code>EventTime</code> + <code>TtlDuration</code>. For information on HardDelete, see the <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html\">DeleteRecord</a> API in the Amazon SageMaker API Reference guide.</p>",
        "UpdateRecordRequest$TtlDuration": "<p>The time-to-live (TTL) duration for the record. Amazon SageMaker Feature Store deletes the record when <code>EventTime</code> + <code>TtlDuration</code> elapses. If you omit this parameter, the record's existing TTL setting remains unchanged. For information about <code>HardDelete</code>, see the <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html\">DeleteRecord</a> operation in the Amazon SageMaker API Reference.</p>"
      }
    },
    "TtlDurationUnit": {
      "base": null,
      "refs": {
        "TtlDuration$Unit": "<p> <code>TtlDuration</code> time unit.</p>"
      }
    },
    "TtlDurationValue": {
      "base": null,
      "refs": {
        "TtlDuration$Value": "<p> <code>TtlDuration</code> time value.</p>"
      }
    },
    "UnprocessedBatchWriteRecordEntries": {
      "base": null,
      "refs": {
        "BatchWriteRecordResponse$UnprocessedEntries": "<p>A list of entries that were not processed. These entries can be retried.</p>"
      }
    },
    "UnprocessedIdentifiers": {
      "base": null,
      "refs": {
        "BatchGetRecordResponse$UnprocessedIdentifiers": "<p>A unprocessed list of <code>FeatureGroup</code> names, with their corresponding <code>RecordIdentifier</code> value, and Feature name.</p>"
      }
    },
    "UpdateRecordRequest": {
      "base": null,
      "refs": {}
    },
    "ValidationError": {
      "base": "<p>There was an error validating your request.</p>",
      "refs": {}
    },
    "ValueAsString": {
      "base": null,
      "refs": {
        "BatchGetRecordError$FeatureGroupName": "<p>The name of the feature group that the record belongs to.</p>",
        "BatchGetRecordError$RecordIdentifierValueAsString": "<p>The value for the <code>RecordIdentifier</code> in string format of a Record from a <code>FeatureGroup</code> that is causing an error when attempting to be retrieved.</p>",
        "BatchGetRecordError$ErrorCode": "<p>The error code of an error that has occurred when attempting to retrieve a batch of Records. For more information on errors, see <a href=\"https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_GetRecord.html#API_feature_store_GetRecord_Errors\">Errors</a>.</p>",
        "BatchGetRecordResultDetail$FeatureGroupName": "<p>The <code>FeatureGroupName</code> containing Records you retrieved in a batch.</p>",
        "BatchGetRecordResultDetail$RecordIdentifierValueAsString": "<p>The value of the record identifier in string format.</p>",
        "BatchWriteRecordError$ErrorCode": "<p>The error code for the failed record write.</p>",
        "DeleteRecordRequest$RecordIdentifierValueAsString": "<p>The value for the <code>RecordIdentifier</code> that uniquely identifies the record, in string format. </p>",
        "DeleteRecordRequest$EventTime": "<p>Timestamp indicating when the deletion event occurred. <code>EventTime</code> can be used to query data at a certain point in time.</p>",
        "FeatureValue$ValueAsString": "<p>The value in string format associated with a feature. Used when your <code>CollectionType</code> is <code>None</code>. Note that features types can be <code>String</code>, <code>Integral</code>, or <code>Fractional</code>. This value represents all three types as a string.</p>",
        "GetRecordRequest$RecordIdentifierValueAsString": "<p>The value that corresponds to <code>RecordIdentifier</code> type and uniquely identifies the record in the <code>FeatureGroup</code>. </p>",
        "RecordIdentifierList$member": null,
        "RecordIdentifiers$member": null,
        "UpdateRecordRequest$RecordIdentifierValueAsString": "<p>The value that uniquely identifies the record in the feature group. This must match the value defined by the feature group's record identifier feature.</p>",
        "ValueAsStringList$member": null
      }
    },
    "ValueAsStringList": {
      "base": null,
      "refs": {
        "FeatureValue$ValueAsStringList": "<p>The list of values in string format associated with a feature. Used when your <code>CollectionType</code> is a <code>List</code>, <code>Set</code>, or <code>Vector</code>. Note that features types can be <code>String</code>, <code>Integral</code>, or <code>Fractional</code>. These values represents all three types as a string.</p>"
      }
    }
  }
}
