Change History
Change History is an Audit Log feature that tracks creations, deletions, and updates of platform resources.
Change History provides a historical view into your Project’s resource changes. Changes made against resources are stored along with the time of change, source of the change, and, if provided, the user who made the change. These eventually consistent changes can then be retrieved via the Change History API or via the Merchant Center.
The Audit Log tracks and stores resource changes made after 15 March 2021. The tracked changes are represented as Records containing a list of Changes that happened together. Changes have varying data representations depending on the type of change. These are documented in the change types documentation.
The default limits are:
- tracks changes originating from within the Merchant Center only. (See the information box below.)
- maximum of 100 000 Records stored.
- maximum of 1 year retention of Records.
Extension of these limits is possible by contacting Support via the Support Portal. Such extension might be subject to a separate fee.
The API response data is based on the changes tracked and stored by Audit Log. The default Audit Log setting is to only track Merchant Center originated changes, and therefore any response data targeted at a source other than Merchant Center is an empty set.
Hosts
The Change History API has different hosts from the HTTP API. The Change History API is hosted at the following URLs:
| Region | API URL |
|---|---|
| Europe (Google Cloud, Belgium) | https://history.europe-west1.gcp.commercetools.com/ |
| North America (Google Cloud, Iowa) | https://history.us-central1.gcp.commercetools.com/ |
| Australia (Google Cloud, Sydney) | https://history.australia-southeast1.gcp.commercetools.com/ |
If documentation refers to https://history.{region}.commercetools.com, the {region} placeholder has to be replaced with the actual value.
The Change History API is available only in the Google Cloud Regions.
Representations
RecordPagedQueryResponse
Response to a query request for Record.
limitInt | Maximum number of results requested in the query request. |
countInt | Actual number of results returned. |
totalInt | Total number of results matching the query. This number is an estimation and not strongly consistent. |
offsetInt | The number of elements skipped, not a page number. Supplied by the client or the server default. |
resultsArray of Record |
{"limit" : 20,"offset" : 0,"count" : 1,"total" : 0,"results" : [ {"version" : 2,"previousVersion" : 1,"type" : "ResourceUpdated","modifiedAt" : "2020-03-22T23:00:00.000Z","modifiedBy" : {"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""},"resource" : {"id" : "some_entity_id_123","typeId" : "product"},"label" : {"value" : "some_label","type" : "StringLabel"},"previousLabel" : {"value" : "some_label","type" : "StringLabel"},"withoutChanges" : false,"changes" : [ {"change" : "setKey","previousValue" : "Key 1","nextValue" : "Key 2","type" : "SetKeyChange"} ]} ]}
Record
The default maximum number of Records that can be stored is 100 000. The default maximum retention period of Records is 1 year.
A Record captures the differences in a resource between one version and the next. (Recall that the version number is not always incremented by one; see Optimistic Concurrency Control.)
versionInt | Version of the resource after the change. |
previousVersionInt | Version of the resource before the change. |
typeString | Type of the change (creation, update or deletion). Can be"ResourceUpdated", "ResourceCreated", or "ResourceDeleted" |
modifiedBy | Information about the user or the API client who performed the change. |
modifiedAtString | Date and time when the change was made. |
labelLabel | Information that describes the resource after the change. |
previousLabelLabel | Information that describes the resource before the change. |
changesArray of Change | Shows the differences in the resource between |
resourceReference | Reference to the changed resource. |
withoutChangesBoolean |
|
{"version" : 2,"previousVersion" : 1,"type" : "ResourceUpdated","modifiedAt" : "2020-03-22T23:00:00.000Z","modifiedBy" : {"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""},"resource" : {"id" : "some_entity_id_123","typeId" : "product"},"label" : {"value" : "some_label","type" : "StringLabel"},"previousLabel" : {"value" : "some_label","type" : "StringLabel"},"withoutChanges" : false,"changes" : [ {"change" : "setKey","previousValue" : "Key 1","nextValue" : "Key 2","type" : "SetKeyChange"} ]}
ModifiedBy
Information about the user or the API client who performed the change. This is a variant of LastModifiedBy.
idString | ID of the Merchant Center user who made the change. Present only if the change was made in the Merchant Center. |
typeString | Indicates whether the change was made by a user or the API client with or without an External user ID. Can be"user", or "external-user" |
customerReference | Reference to the Customer who made the change. Present only if the change was made using a token from the Password Flow. |
anonymousIdString | Present only if the change was made using a token from an Anonymous Session. |
clientIdString | ID of the API Client that made the change. Present only if the change was made using an API Client. |
isPlatformClientBoolean |
|
{"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""}
ChangeHistoryResourceType
Represents the supported resource types. The value must be one of the following:
cart-discount(CartDiscount)category(Category)channel(Channel)customer(Customer)customer-group(CustomerGroup)discount-code(DiscountCode)inventory-entry(InventoryEntry)key-value-document(CustomObject)order(Order)payment(Payment)product(Product)product-discount(ProductDiscount)product-type(ProductType)review(Review)shopping-list(ShoppingList)state(State)store(Store)tax-category(TaxCategory)type(Type)zone(Zone)
Label
Labels provide human readable descriptive information specific to the change.
CustomerLabel
typeString | "CustomerLabel" |
firstNameString | |
lastNameString | |
customerNumberString |
CustomObjectLabel
keyString | |
typeString | "CustomObjectLabel" |
containerString |
LocalizedLabel
typeString | "LocalizedLabel" |
valueLocalizedString |
OrderLabel
typeString | "OrderLabel" |
customerEmailString | |
orderNumberString |
PaymentLabel
keyString | |
typeString | "PaymentLabel" |
amountPlannedMoney |
ProductLabel
typeString | "ProductLabel" |
slugLocalizedString | |
nameLocalizedString |
ReviewLabel
keyString | |
typeString | "ReviewLabel" |
titleString |
StringLabel
typeString | "StringLabel" |
valueString |
DateStringFilter
This type consists of one enum value:
now
PlatformInitiatedChange
excludeAllchangeLineItemNamechangeReviewRatingStatisticssetApplicationVersionsetIsValidsetVariantAvailability
Query Records
Query Records
The view_audit_log:{projectKey} scope is always required in addition to the respective scopes for the resource type to query for.
view_audit_log:{projectKey}, view_cart_discounts:{projectKey}, view_categories:{projectKey}, view_customers:{projectKey}, view_customer_groups:{projectKey}, view_discount_codes:{projectKey}, view_key_value_documents:{projectKey}, view_orders:{projectKey}, view_orders:{projectKey}:{storeKey}, view_payments:{projectKey}, view_products:{projectKey}, view_shopping_lists:{projectKey}, view_states:{projectKey}, view_stores:{projectKey}, view_tax_categories:{projectKey}, view_types:{projectKey}regionString | The Region in which the project is hosted. |
projectKeyString |
|
expandBoolean | If |
limitInt | Maximum number of results to return. |
offsetInt | Number of results to skip. |
resourceTypeChangeHistoryResourceType | Can be used to filter for Records of specified resource types. By default, the API returns the Records of all supported resource types. The parameter can be passed multiple times. |
date.fromNumber | datetime | DateStringFilter | Can be DateTime, non-negative integer, or |
date.toNumber | datetime | DateStringFilter | See |
userIdString | ID of the Merchant Center user who made the change. Can be used to query changes made by a Merchant Center user. |
typeString | Can be |
clientIdString | ID of the API Client that made the change. |
resourceIdString | ID of the changed resource. |
sourceString | Name of the source with which changes were made. Can be |
changesString | Restrict the types of Changes returned by passing the value of the The parameter can be passed multiple times. |
customerIdString | ID of the Customer who made the change using a token from the Password Flow. |
excludePlatformInitiatedChanges | Exclude platform initiated Changes by passing the values of the
The parameter can be passed multiple times. |
curl -X GET https://history.{region}.commercetools.com/{projectKey} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"limit" : 20,"offset" : 0,"count" : 1,"total" : 0,"results" : [ {"version" : 2,"previousVersion" : 1,"type" : "ResourceUpdated","modifiedAt" : "2020-03-22T23:00:00.000Z","modifiedBy" : {"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""},"resource" : {"id" : "some_entity_id_123","typeId" : "product"},"label" : {"value" : "some_label","type" : "StringLabel"},"previousLabel" : {"value" : "some_label","type" : "StringLabel"},"withoutChanges" : false,"changes" : [ {"change" : "setKey","previousValue" : "Key 1","nextValue" : "Key 2","type" : "SetKeyChange"} ]} ]}
Query Records for specific resource type
The view_audit_log:{projectKey} scope is always required in addition to the respective scopes for the resource type to query for.
view_audit_log:{projectKey}, view_cart_discounts:{projectKey}, view_categories:{projectKey}, view_customers:{projectKey}, view_customer_groups:{projectKey}, view_discount_codes:{projectKey}, view_key_value_documents:{projectKey}, view_orders:{projectKey}, view_orders:{projectKey}:{storeKey}, view_payments:{projectKey}, view_products:{projectKey}, view_shopping_lists:{projectKey}, view_states:{projectKey}, view_stores:{projectKey}, view_tax_categories:{projectKey}, view_types:{projectKey}regionString | The Region in which the project is hosted. |
projectKeyString |
|
resourceTypeChangeHistoryResourceType | Resource type for which a query is made. |
expandBoolean | If |
limitInt | Maximum number of results to return. |
offsetInt | Number of results to skip. |
date.fromNumber | datetime | DateStringFilter | Can be DateTime, non-negative integer, or |
date.toNumber | datetime | DateStringFilter | See |
userIdString | ID of the Merchant Center user who made the change. Can be used to query changes made by a Merchant Center user. |
typeString | Can be |
clientIdString | ID of the API Client that made the change. |
resourceIdString | ID of the changed resource. |
sourceString | Name of the source with which changes were made. Can be |
changesString | Restrict the types of Changes returned by passing the value of the The parameter can be passed multiple times. |
customerIdString | ID of the Customer who made the change using a token from the Password Flow. |
excludePlatformInitiatedChanges | Exclude platform initiated Changes by passing the values of the
The parameter can be passed multiple times. |
curl -X GET https://history.{region}.commercetools.com/{projectKey}/{resourceType} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"limit" : 20,"offset" : 0,"count" : 1,"total" : 0,"results" : [ {"version" : 2,"previousVersion" : 1,"type" : "ResourceUpdated","modifiedAt" : "2020-03-22T23:00:00.000Z","modifiedBy" : {"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""},"resource" : {"id" : "some_entity_id_123","typeId" : "product"},"label" : {"value" : "some_label","type" : "StringLabel"},"previousLabel" : {"value" : "some_label","type" : "StringLabel"},"withoutChanges" : false,"changes" : [ {"change" : "setKey","previousValue" : "Key 1","nextValue" : "Key 2","type" : "SetKeyChange"} ]} ]}
Query Records by resource ID
The view_audit_log:{projectKey} scope is always required in addition to the respective scopes for the resource type to query for.
view_audit_log:{projectKey}, view_cart_discounts:{projectKey}, view_orders:{projectKey}, view_orders:{projectKey}:{storeKey}, view_categories:{projectKey}, view_products:{projectKey}, view_customers:{projectKey}, view_customer_groups:{projectKey}, view_discount_codes:{projectKey}, view_key_value_documents:{projectKey}, view_payments:{projectKey}, view_shopping_lists:{projectKey}, view_states:{projectKey}, view_stores:{projectKey}, view_tax_categories:{projectKey}, view_types:{projectKey}regionString | The Region in which the project is hosted. |
projectKeyString |
|
resourceTypeChangeHistoryResourceType | Resource type for which a query is made. |
idString | ID of the commercetools resource for which a query is made. |
expandBoolean | If |
limitInt | The maximum number of results to return. |
offsetInt | The number of results to skip. |
date.fromNumber | datetime | DateStringFilter | Can be DateTime, non-negative integer, or |
date.toNumber | datetime | DateStringFilter | See |
userIdString | ID of the Merchant Center user who made the change. Can be used to query changes made by a Merchant Center user. |
typeString | Can be |
clientIdString | ID of the API Client that made the change. |
sourceString | Name of the source with which changes were made. Can be |
changesString | Restrict the types of Changes returned by passing the value of the The parameter can be passed multiple times. |
customerIdString | ID of the Customer who made the change using a token from the Password Flow. |
excludePlatformInitiatedChanges | Exclude platform initiated Changes by passing the values of the
The parameter can be passed multiple times. |
curl -X GET https://history.{region}.commercetools.com/{projectKey}/{resourceType}/{id} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"limit" : 20,"offset" : 0,"count" : 1,"total" : 0,"results" : [ {"version" : 2,"previousVersion" : 1,"type" : "ResourceUpdated","modifiedAt" : "2020-03-22T23:00:00.000Z","modifiedBy" : {"isPlatformClient" : true,"id" : "example_user_123","type" : "user","customer" : {"id" : "test1","typeId" : "customer"},"anonymousId" : "","clientId" : ""},"resource" : {"id" : "some_entity_id_123","typeId" : "product"},"label" : {"value" : "some_label","type" : "StringLabel"},"previousLabel" : {"value" : "some_label","type" : "StringLabel"},"withoutChanges" : false,"changes" : [ {"change" : "setKey","previousValue" : "Key 1","nextValue" : "Key 2","type" : "SetKeyChange"} ]} ]}
Query Records via GraphQL
GraphQL endpoint
You can access the GraphQL endpoint with following URL:
https://history.{region}.commercetools.com/{projectKey}/graphql
The endpoint accepts HTTP POST requests with following fields in a JSON body:
query- String - GraphQL query as a stringvariables- Object - Optional - containing JSON object that defines variables for your queryoperationName- String - Optional - the name of the operation, in case you defined several of them in the query
Find below an example for a query for changes on Products to be executed as cURL command:
$ curl -X POST https://history.{region}.commercetools.com/{projectKey}/graphql \-H "Content-Type:application/json" \-H "Authorization:Bearer ..." \-d '{"query": "query (resourceTypes: Product) {results {type changes {previousValue nextValue change} }}" }'
Application of OAuth 2.0 scopes
You always need to grant the view_audit_log:{projectKey} scope to the query, plus (depending on the resource type you query for), the respective scopes additionally:
view_cart_discounts:{projectKey}view_categories:{projectKey}view_customers:{projectKey}view_customer_groups:{projectKey}view_discount_codes:{projectKey}view_key_value_documents:{projectKey}view_orders:{projectKey}view_orders:{projectKey}:{storeKey}view_payments:{projectKey}view_products:{projectKey}view_shopping_lists:{projectKey}view_states:{projectKey}view_stores:{projectKey}view_tax_categories:{projectKey}view_types:{projectKey}
Interactive GraphQL console
To query for the records via GraphQL you can use an interactive GraphiQL environment that is available on following URL:
https://history.{region}.commercetools.com/{projectKey}/graphiql
To be able to use it, you need to provide a valid OAuth token for an API Client that has the above mentioned scopes.
{"authorization": "Bearer XXXXXXX"}
This console lets you explore the docs for the supported GraphQL queries and to introspect the GraphQL schema.