Shopper Delivery Estimates

GET Returns delivery date estimates for the requested product.

GET /organizations/{organizationId}/delivery-estimates

Operation ID: getDeliveryEstimates. Security: ShopperToken (sfcc.shopper-delivery-estimates, sfcc.shopper-standard); ShopperClientContextToken (sfcc.shopper-delivery-estimates, sfcc.shopper-standard).

Returns delivery date estimates for the requested products at a destination postal code. Currently limited to one product per request. For each requested product, the platform enumerates all applicable site-level shipping methods. Estimates are returned only when the sfcc.app.shipping.estimate Commerce Apps hook is bound to a provider. If no provider is bound, the platform returns no estimates. Each entry in the response corresponds to one requested product, and contains one entry per applicable shipping method. Methods for which the provider returned an estimate carry a deliveryWindow. Methods for which the provider could not return an estimate include a nonDeliverableReason. An empty productDeliveryEstimates array means the platform has no estimates for any of the requested products, for example, no applicable shipping methods or the provider returned no results. In this case, clients should hide the delivery estimation block.

Parameters

  • organizationId (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f_ecom_' followed by a 4-character realm identifier and a 3-character instance type identifier.

    Example

    f_ecom_zzxy_prd
  • productIds (query, array of ProductId, required, style: form, explode: false) The IDs of the products for which to retrieve delivery estimates. Each product must be online and site-assigned. Currently limited to one ID per request; multi-product support is reserved for a future release.
    Minimum items: 1. Maximum items: 1.

    Example

    apple-ipod-shuffle

    Example

    [
      "apple-ipod-shuffle"
    ]
  • postalCode (query, string, required) The destination postal code for which to compute delivery estimates. Format depends on the destination country (for example, a 5-digit ZIP for US, a 6-character alphanumeric code for CA).
    Minimum length: 1. Maximum length: 20. Example: 10001.

    Example

    10001
  • countryCode (query, CountryCode, required) The destination country as an ISO 3166-1 alpha-2 country code (for example, US, CA, GB). Required for unambiguous resolution of the destination — postal codes are not globally unique.

    Example

    US
  • siteId (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.

    Example: SiteId

    RefArch
  • sfdc_usid (header, string (uuid)) A unique shopper identifier (USID) for tracking client context. Used with endpoints secured with ShopperClientContextToken. This header is required for all endpoints secured with ShopperClientContextToken.
    Example: 550e8400-e29b-41d4-a716-446655440000.
  • personalized (query, string) Controls whether personalization is applied to the response. When set to none, the server skips applying personalization to the response.
    Allowed values: none. Example: none.
  • sfdc_shopper_context (header, string) Shopper context information (for example clientIP, sourceCode, and customQualifiers) passed in from a trusted backend application.

Responses

  • 200 Success

    Media type: application/json. Schema: DeliveryEstimatesResult.

    Example: GetDeliveryEstimatesResponseExample Happy path — one product with two shipping options, both deliverable.

    {
      "productDeliveryEstimates": [
        {
          "productId": "apple-ipod-shuffle",
          "destination": {
            "postalCode": "10001",
            "countryCode": "US"
          },
          "shippingOptions": [
            {
              "shippingMethodId": "GroundShipping",
              "name": "Ground",
              "description": "Standard ground shipping",
              "carrier": "UPS",
              "price": 5.99,
              "currency": "USD",
              "deliveryWindow": {
                "startAt": "2026-04-30T14:00:00Z",
                "endAt": "2026-04-30T18:00:00Z"
              },
              "orderCutoffAt": "2026-04-27T14:00:00Z"
            },
            {
              "shippingMethodId": "TwoDayShipping",
              "name": "Two-Day",
              "description": "Expedited air shipping",
              "carrier": "UPS",
              "price": 12.99,
              "currency": "USD",
              "deliveryWindow": {
                "startAt": "2026-04-28T09:00:00Z",
                "endAt": "2026-04-28T17:00:00Z"
              },
              "orderCutoffAt": "2026-04-26T18:00:00Z"
            }
          ]
        }
      ]
    }

    Example: GetDeliveryEstimatesPartialResponseExample One shipping option is deliverable, another is not. Methods that cannot deliver for a particular reason are kept in the response with `nonDeliverableReason` populated.

    {
      "productDeliveryEstimates": [
        {
          "productId": "apple-ipod-shuffle",
          "destination": {
            "postalCode": "10001",
            "countryCode": "US"
          },
          "shippingOptions": [
            {
              "shippingMethodId": "GroundShipping",
              "name": "Ground",
              "description": "Standard ground shipping",
              "carrier": "UPS",
              "price": 5.99,
              "currency": "USD",
              "deliveryWindow": {
                "startAt": "2026-04-30T14:00:00Z",
                "endAt": "2026-04-30T18:00:00Z"
              },
              "orderCutoffAt": "2026-04-27T14:00:00Z"
            },
            {
              "shippingMethodId": "OvernightShipping",
              "name": "Overnight",
              "description": "Priority overnight shipping",
              "carrier": "UPS",
              "nonDeliverableReason": "INSUFFICIENT_INVENTORY"
            }
          ]
        }
      ]
    }

    Example: GetDeliveryEstimatesEmptyResponseExample No estimates available — for example, when the provider returned an empty result.

    {
      "productDeliveryEstimates": []
    }
  • 400 Bad Request

    Media type: application/problem+json. Schema: ErrorResponse.

    Example: GetDeliveryEstimatesBadRequestResponseExample A required parameter is missing or has an invalid value.

    {
      "title": "Bad Request",
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/validation",
      "detail": "The 'postalCode' parameter is required."
    }
  • 401 Your access token is invalid or expired and can’t be used to identify a user.

    Media type: application/problem+json. Schema: ErrorResponse.

    Example: UnauthorizedExample

    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/unauthorized",
      "title": "Unauthorized",
      "detail": "Unauthorized request"
    }
  • 404 Not Found

    Media type: application/problem+json. Schema: ErrorResponse.

    Example: GetDeliveryEstimatesProductNotFoundResponseExample The supplied `productId` does not resolve to an online, site-assigned product.

    {
      "title": "Product Not Found",
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/product-not-found",
      "detail": "No product with ID 'apple-ipod-shuffle' for site 'SiteGenesis' could be found.",
      "productId": "apple-ipod-shuffle",
      "siteId": "SiteGenesis"
    }