Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

UPS Rate Request

See more UPS Examples

Simple UPS Rate Example

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Http,
  Chilkat.StringBuilder,
  Chilkat.HttpResponse,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  json: TJsonObject;
  jsonToken: TJsonObject;
  resp: THttpResponse;
  sbResponseBody: TStringBuilder;
  jResp: TJsonObject;
  respStatusCode: Integer;
  Level: string;
  j: Integer;
  count_j: Integer;
  Value: string;
  ServiceCode: string;
  ServiceDescription: string;
  RateChart: string;
  BillableWeightCalculationMethod: string;
  RatingMethod: string;
  UnitOfMeasurementCode: string;
  UnitOfMeasurementDescription: string;
  Weight: string;
  CurrencyCode: string;
  MonetaryValue: string;
  BaseServiceChargeCurrencyCode: string;
  BaseServiceChargeMonetaryValue: string;
  GrossChargeCurrencyCode: string;
  GrossChargeMonetaryValue: string;
  DiscountAmountCurrencyCode: string;
  DiscountAmountMonetaryValue: string;
  DiscountPercentage: string;
  NetChargeCurrencyCode: string;
  NetChargeMonetaryValue: string;
  Density: string;
  TotalCubicFeet: string;
  ServiceOptionsChargesCurrencyCode: string;
  ServiceOptionsChargesMonetaryValue: string;
  TotalChargesCurrencyCode: string;
  TotalChargesMonetaryValue: string;
  TotalChargesWithTaxesCurrencyCode: string;
  TotalChargesWithTaxesMonetaryValue: string;
  TotalChargeCurrencyCode: string;
  TotalChargeMonetaryValue: string;
  PickupDate: string;
  DocumentsOnlyIndicator: string;
  PackageBillType: string;
  GuaranteedIndicator: string;
  Disclaimer: string;
  Date: string;
  Time: string;
  BusinessDaysInTransit: string;
  PickupTime: string;
  DayOfWeek: string;
  CustomerCenterCutoff: string;
  DelayCount: string;
  HolidayCount: string;
  RestDays: string;
  TotalTransitDays: string;
  SaturdayDelivery: string;
  SaturdayDeliveryDisclaimer: string;
  SundayDelivery: string;
  SundayDeliveryDisclaimer: string;
  AutoDutyCode: string;
  TimeInTransitDisclaimer: string;
  ScheduledDeliveryDate: string;
  RoarRatedIndicator: string;
  SubType: string;
  Quantity: string;
  TypeCode: string;
  TypeDescription: string;
  UnitOfMeasurement: string;
  Length: string;
  Width: string;
  Height: string;
  AdjustedHeightValue: string;
  AdjustedHeightUnitOfMeasurement: string;
  v_Type: string;
  TransportationChargesCurrencyCode: string;
  TransportationChargesMonetaryValue: string;
  BillingWeightWeight: string;
  SimpleRateCode: string;
  k: Integer;
  count_k: Integer;
  nullVal: Boolean;
  ModifierType: string;
  ModifierDesc: string;
  Amount: string;
  Code: string;
  Description: string;
  CustomerContext: string;
  i: Integer;
  count_i: Integer;

begin
  success := False;

  //  This example assumes the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  http := THttp.Create;

  //  Use this online tool to generate code from sample JSON:
  //  Generate Code to Create JSON

  //  The following JSON is sent in the request body.

  //  {
  //    "RateRequest": {
  //      "Request": {
  //        "TransactionReference": {
  //          "CustomerContext": "CustomerContext"
  //        }
  //      },
  //      "Shipment": {
  //        "Shipper": {
  //          "Name": "ShipperName",
  //          "ShipperNumber": "ShipperNumber",
  //          "Address": {
  //            "AddressLine": [
  //              "ShipperAddressLine",
  //              "ShipperAddressLine",
  //              "ShipperAddressLine"
  //            ],
  //            "City": "TIMONIUM",
  //            "StateProvinceCode": "MD",
  //            "PostalCode": "21093",
  //            "CountryCode": "US"
  //          }
  //        },
  //        "ShipTo": {
  //          "Name": "ShipToName",
  //          "Address": {
  //            "AddressLine": [
  //              "ShipToAddressLine",
  //              "ShipToAddressLine",
  //              "ShipToAddressLine"
  //            ],
  //            "City": "Alpharetta",
  //            "StateProvinceCode": "GA",
  //            "PostalCode": "30005",
  //            "CountryCode": "US"
  //          }
  //        },
  //        "ShipFrom": {
  //          "Name": "ShipFromName",
  //          "Address": {
  //            "AddressLine": [
  //              "ShipFromAddressLine",
  //              "ShipFromAddressLine",
  //              "ShipFromAddressLine"
  //            ],
  //            "City": "TIMONIUM",
  //            "StateProvinceCode": "MD",
  //            "PostalCode": "21093",
  //            "CountryCode": "US"
  //          }
  //        },
  //        "PaymentDetails": {
  //          "ShipmentCharge": {
  //            "Type": "01",
  //            "BillShipper": {
  //              "AccountNumber": "ShipperNumber"
  //            }
  //          }
  //        },
  //        "Service": {
  //          "Code": "03",
  //          "Description": "Ground"
  //        },
  //        "NumOfPieces": "1",
  //        "Package": {
  //          "PackagingType": {
  //            "Code": "02",
  //            "Description": "Packaging"
  //          },
  //          "Dimensions": {
  //            "UnitOfMeasurement": {
  //              "Code": "IN",
  //              "Description": "Inches"
  //            },
  //            "Length": "5",
  //            "Width": "5",
  //            "Height": "5"
  //          },
  //          "PackageWeight": {
  //            "UnitOfMeasurement": {
  //              "Code": "LBS",
  //              "Description": "Pounds"
  //            },
  //            "Weight": "1"
  //          }
  //        }
  //      }
  //    }
  //  }

  json := TJsonObject.Create;
  json.UpdateString('RateRequest.Request.TransactionReference.CustomerContext','CustomerContext');
  json.UpdateString('RateRequest.Shipment.Shipper.Name','ShipperName');
  json.UpdateString('RateRequest.Shipment.Shipper.ShipperNumber','ShipperNumber');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.AddressLine[0]','ShipperAddressLine');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.AddressLine[1]','ShipperAddressLine');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.AddressLine[2]','ShipperAddressLine');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.City','TIMONIUM');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.StateProvinceCode','MD');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.PostalCode','21093');
  json.UpdateString('RateRequest.Shipment.Shipper.Address.CountryCode','US');
  json.UpdateString('RateRequest.Shipment.ShipTo.Name','ShipToName');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.AddressLine[0]','ShipToAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.AddressLine[1]','ShipToAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.AddressLine[2]','ShipToAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.City','Alpharetta');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.StateProvinceCode','GA');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.PostalCode','30005');
  json.UpdateString('RateRequest.Shipment.ShipTo.Address.CountryCode','US');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Name','ShipFromName');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.AddressLine[0]','ShipFromAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.AddressLine[1]','ShipFromAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.AddressLine[2]','ShipFromAddressLine');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.City','TIMONIUM');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.StateProvinceCode','MD');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.PostalCode','21093');
  json.UpdateString('RateRequest.Shipment.ShipFrom.Address.CountryCode','US');
  json.UpdateString('RateRequest.Shipment.PaymentDetails.ShipmentCharge.Type','01');
  json.UpdateString('RateRequest.Shipment.PaymentDetails.ShipmentCharge.BillShipper.AccountNumber','ShipperNumber');
  json.UpdateString('RateRequest.Shipment.Service.Code','03');
  json.UpdateString('RateRequest.Shipment.Service.Description','Ground');
  json.UpdateString('RateRequest.Shipment.NumOfPieces','1');
  json.UpdateString('RateRequest.Shipment.Package.PackagingType.Code','02');
  json.UpdateString('RateRequest.Shipment.Package.PackagingType.Description','Packaging');
  json.UpdateString('RateRequest.Shipment.Package.Dimensions.UnitOfMeasurement.Code','IN');
  json.UpdateString('RateRequest.Shipment.Package.Dimensions.UnitOfMeasurement.Description','Inches');
  json.UpdateString('RateRequest.Shipment.Package.Dimensions.Length','5');
  json.UpdateString('RateRequest.Shipment.Package.Dimensions.Width','5');
  json.UpdateString('RateRequest.Shipment.Package.Dimensions.Height','5');
  json.UpdateString('RateRequest.Shipment.Package.PackageWeight.UnitOfMeasurement.Code','LBS');
  json.UpdateString('RateRequest.Shipment.Package.PackageWeight.UnitOfMeasurement.Description','Pounds');
  json.UpdateString('RateRequest.Shipment.Package.PackageWeight.Weight','1');

  //  Load the OAuth2 access token obtained via client credentials as shown 
  //  in this UPS OAuth2 Client Credentials example.

  jsonToken := TJsonObject.Create;
  success := jsonToken.LoadFile('qa_data/tokens/ups_oauth2_token.json');
  if (success <> True) then
    begin
      WriteLn('Failed to load ups_oauth2_token.json');
      Exit;
    end;

  //  The access token JSON looks something like this:

  //  {
  //    "token_type": "Bearer",
  //    "issued_at": "1686911985606",
  //    "client_id": "2498righ8wr6aihe98rt8rhowirtyw9er6twe80rtywrehrt",
  //    "access_token": "eyJraW......R2sbqrY",
  //    "expires_in": "14399",
  //    "status": "approved"
  //  }

  //  Adds the "Authorization: Bearer <YOUR_TOKEN_HERE>" header.
  http.AuthToken := jsonToken.StringOf('access_token');
  http.SetRequestHeader('Content-Type','application/json');
  http.SetRequestHeader('transId','string');
  http.SetRequestHeader('transactionSrc','testing');

  //  The "version" indicates Rate API to display the new release features in Rate API response based on Rate release.
  //  Supported values: v1, v1601, v1607, v1701, v1707, v2108, v2205.
  http.SetUrlVar('version','v1');

  //  The "requestoption" has the following valid values:
  //  Rate = The server rates (The default Request option is Rate if a Request Option is not provided). 
  //  Shop = The server validates the shipment, and returns rates for all UPS products from the ShipFrom to the ShipTo addresses. 
  //  Rate is the only valid request option for Ground Freight Pricing requests.
  http.SetUrlVar('requestoption','Rate');

  resp := THttpResponse.Create;
  success := http.HttpJson('POST','https://wwwcie.ups.com/api/rating/{$version}/{$requestoption}?additionalinfo=string',json,'application/json',resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  sbResponseBody := TStringBuilder.Create;
  resp.GetBodySb(sbResponseBody);

  jResp := TJsonObject.Create;
  jResp.LoadSb(sbResponseBody);
  jResp.EmitCompact := False;

  WriteLn('Response Body:');
  WriteLn(jResp.Emit());

  //  ----------------------------------------------------------------------------------------------------------
  //  Important: If you get the following error response, read further for the solution..
  //  
  //  {
  //    "response": {
  //      "errors": [
  //        {
  //          "code": "250002",
  //          "message": "Invalid Authentication Information."
  //        }
  //      ]
  //    }
  //  }
  //  
  //  It means you didn't add the Rating API permission to your app.
  //  To add the Rating API, login to your developer account and go to your Apps page at https://developer.ups.com/apps?loc=en_US
  //  Then edit your app and add the Rating API.
  //  ----------------------------------------------------------------------------------------------------------

  respStatusCode := resp.StatusCode;
  WriteLn('Response Status Code = ' + respStatusCode);
  if (respStatusCode >= 400) then
    begin
      WriteLn('Response Header:');
      WriteLn(resp.Header);
      WriteLn('Failed.');
      Exit;
    end;

  //  Sample JSON response:
  //  (Sample code for parsing the JSON response is shown below)

  //  {
  //    "RateResponse": {
  //      "Response": {
  //        "ResponseStatus": {
  //          "Code": "s",
  //          "Description": "string"
  //        },
  //        "Alert": [
  //          {
  //            "Code": "string",
  //            "Description": "string"
  //          }
  //        ],
  //        "AlertDetail": [
  //          {
  //            "Code": "string",
  //            "Description": "string",
  //            "ElementLevelInformation": {
  //              "Level": "s",
  //              "ElementIdentifier": [
  //                {
  //                  "Code": null,
  //                  "Value": null
  //                }
  //              ]
  //            }
  //          }
  //        ],
  //        "TransactionReference": {
  //          "CustomerContext": "string"
  //        }
  //      },
  //      "RatedShipment": [
  //        {
  //          "Disclaimer": [
  //            {
  //              "Code": "st",
  //              "Description": "string"
  //            }
  //          ],
  //          "Service": {
  //            "Code": "str",
  //            "Description": "string"
  //          },
  //          "RateChart": "s",
  //          "RatedShipmentAlert": [
  //            {
  //              "Code": "string",
  //              "Description": "string"
  //            }
  //          ],
  //          "BillableWeightCalculationMethod": "st",
  //          "RatingMethod": "st",
  //          "BillingWeight": {
  //            "UnitOfMeasurement": {
  //              "Code": "str",
  //              "Description": "string"
  //            },
  //            "Weight": "strin"
  //          },
  //          "TransportationCharges": {
  //            "CurrencyCode": "str",
  //            "MonetaryValue": "stringstringstri"
  //          },
  //          "BaseServiceCharge": {
  //            "CurrencyCode": "str",
  //            "MonetaryValue": "stringstringstri"
  //          },
  //          "ItemizedCharges": [
  //            {
  //              "Code": "str",
  //              "Description": "string",
  //              "CurrencyCode": "str",
  //              "MonetaryValue": "string",
  //              "SubType": "string"
  //            }
  //          ],
  //          "FRSShipmentData": {
  //            "TransportationCharges": {
  //              "GrossCharge": {
  //                "CurrencyCode": "str",
  //                "MonetaryValue": "string"
  //              },
  //              "DiscountAmount": {
  //                "CurrencyCode": "str",
  //                "MonetaryValue": "string"
  //              },
  //              "DiscountPercentage": "st",
  //              "NetCharge": {
  //                "CurrencyCode": "str",
  //                "MonetaryValue": "string"
  //              }
  //            },
  //            "FreightDensityRate": {
  //              "Density": "strin",
  //              "TotalCubicFeet": "string"
  //            },
  //            "HandlingUnits": [
  //              {
  //                "Quantity": "string",
  //                "Type": {
  //                  "Code": null,
  //                  "Description": null
  //                },
  //                "Dimensions": {
  //                  "UnitOfMeasurement": null,
  //                  "Length": null,
  //                  "Width": null,
  //                  "Height": null
  //                },
  //                "AdjustedHeight": {
  //                  "Value": null,
  //                  "UnitOfMeasurement": null
  //                }
  //              }
  //            ]
  //          },
  //          "ServiceOptionsCharges": {
  //            "CurrencyCode": "str",
  //            "MonetaryValue": "string"
  //          },
  //          "TaxCharges": [
  //            {
  //              "Type": "string",
  //              "MonetaryValue": "string"
  //            }
  //          ],
  //          "TotalCharges": {
  //            "CurrencyCode": "str",
  //            "MonetaryValue": "string"
  //          },
  //          "TotalChargesWithTaxes": {
  //            "CurrencyCode": "str",
  //            "MonetaryValue": "string"
  //          },
  //          "NegotiatedRateCharges": {
  //            "ItemizedCharges": [
  //              {
  //                "Code": "str",
  //                "Description": "string",
  //                "CurrencyCode": "str",
  //                "MonetaryValue": "string",
  //                "SubType": "string"
  //              }
  //            ],
  //            "TaxCharges": [
  //              {
  //                "Type": "string",
  //                "MonetaryValue": "string"
  //              }
  //            ],
  //            "TotalCharge": {
  //              "CurrencyCode": "string",
  //              "MonetaryValue": "string"
  //            },
  //            "TotalChargesWithTaxes": {
  //              "CurrencyCode": "string",
  //              "MonetaryValue": "string"
  //            }
  //          },
  //          "RatedPackage": [
  //            {
  //              "BaseServiceCharge": {
  //                "CurrencyCode": "str",
  //                "MonetaryValue": "string"
  //              },
  //              "TransportationCharges": {
  //                "CurrencyCode": "string",
  //                "MonetaryValue": "string"
  //              },
  //              "ServiceOptionsCharges": {
  //                "CurrencyCode": "string",
  //                "MonetaryValue": "string"
  //              },
  //              "TotalCharges": {
  //                "CurrencyCode": "string",
  //                "MonetaryValue": "string"
  //              },
  //              "Weight": "string",
  //              "BillingWeight": {
  //                "UnitOfMeasurement": {
  //                  "Code": null,
  //                  "Description": null
  //                },
  //                "Weight": "string"
  //              },
  //              "Accessorial": [
  //                {
  //                  "Code": null,
  //                  "Description": null
  //                }
  //              ],
  //              "ItemizedCharges": [
  //                {
  //                  "Code": null,
  //                  "Description": null,
  //                  "CurrencyCode": null,
  //                  "MonetaryValue": null,
  //                  "SubType": null
  //                }
  //              ],
  //              "NegotiatedCharges": {
  //                "ItemizedCharges": [
  //                  null
  //                ]
  //              },
  //              "SimpleRate": {
  //                "Code": "st"
  //              },
  //              "RateModifier": [
  //                {
  //                  "ModifierType": null,
  //                  "ModifierDesc": null,
  //                  "Amount": null
  //                }
  //              ]
  //            }
  //          ],
  //          "TimeInTransit": {
  //            "PickupDate": "stringst",
  //            "DocumentsOnlyIndicator": "string",
  //            "PackageBillType": "st",
  //            "ServiceSummary": {
  //              "Service": {
  //                "Description": "string"
  //              },
  //              "GuaranteedIndicator": "string",
  //              "Disclaimer": "string",
  //              "EstimatedArrival": {
  //                "Arrival": {
  //                  "Date": null,
  //                  "Time": null
  //                },
  //                "BusinessDaysInTransit": "strin",
  //                "Pickup": {
  //                  "Date": null,
  //                  "Time": null
  //                },
  //                "DayOfWeek": "string",
  //                "CustomerCenterCutoff": "string",
  //                "DelayCount": "str",
  //                "HolidayCount": "st",
  //                "RestDays": "st",
  //                "TotalTransitDays": "strin"
  //              },
  //              "SaturdayDelivery": "string",
  //              "SaturdayDeliveryDisclaimer": "string",
  //              "SundayDelivery": "string",
  //              "SundayDeliveryDisclaimer": "string"
  //            },
  //            "AutoDutyCode": "st",
  //            "Disclaimer": "string"
  //          },
  //          "ScheduledDeliveryDate": "string",
  //          "RoarRatedIndicator": "string"
  //        }
  //      ]
  //    }
  //  }

  //  Sample code for parsing the JSON response...
  //  Use the following online tool to generate parsing code from sample JSON:
  //  Generate Parsing Code from JSON

  Code := jResp.StringOf('RateResponse.Response.ResponseStatus.Code');
  Description := jResp.StringOf('RateResponse.Response.ResponseStatus.Description');
  CustomerContext := jResp.StringOf('RateResponse.Response.TransactionReference.CustomerContext');
  i := 0;
  count_i := jResp.SizeOfArray('RateResponse.Response.Alert');
  while i < count_i do
    begin
      jResp.I := i;
      Code := jResp.StringOf('RateResponse.Response.Alert[i].Code');
      Description := jResp.StringOf('RateResponse.Response.Alert[i].Description');
      i := i + 1;
    end;

  i := 0;
  count_i := jResp.SizeOfArray('RateResponse.Response.AlertDetail');
  while i < count_i do
    begin
      jResp.I := i;
      Code := jResp.StringOf('RateResponse.Response.AlertDetail[i].Code');
      Description := jResp.StringOf('RateResponse.Response.AlertDetail[i].Description');
      Level := jResp.StringOf('RateResponse.Response.AlertDetail[i].ElementLevelInformation.Level');
      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.Response.AlertDetail[i].ElementLevelInformation.ElementIdentifier');
      while j < count_j do
        begin
          jResp.J := j;
          Code := jResp.StringOf('RateResponse.Response.AlertDetail[i].ElementLevelInformation.ElementIdentifier[j].Code');
          Value := jResp.StringOf('RateResponse.Response.AlertDetail[i].ElementLevelInformation.ElementIdentifier[j].Value');
          j := j + 1;
        end;

      i := i + 1;
    end;

  i := 0;
  count_i := jResp.SizeOfArray('RateResponse.RatedShipment');
  while i < count_i do
    begin
      jResp.I := i;
      ServiceCode := jResp.StringOf('RateResponse.RatedShipment[i].Service.Code');
      ServiceDescription := jResp.StringOf('RateResponse.RatedShipment[i].Service.Description');
      RateChart := jResp.StringOf('RateResponse.RatedShipment[i].RateChart');
      BillableWeightCalculationMethod := jResp.StringOf('RateResponse.RatedShipment[i].BillableWeightCalculationMethod');
      RatingMethod := jResp.StringOf('RateResponse.RatedShipment[i].RatingMethod');
      UnitOfMeasurementCode := jResp.StringOf('RateResponse.RatedShipment[i].BillingWeight.UnitOfMeasurement.Code');
      UnitOfMeasurementDescription := jResp.StringOf('RateResponse.RatedShipment[i].BillingWeight.UnitOfMeasurement.Description');
      Weight := jResp.StringOf('RateResponse.RatedShipment[i].BillingWeight.Weight');
      CurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].TransportationCharges.CurrencyCode');
      MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].TransportationCharges.MonetaryValue');
      BaseServiceChargeCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].BaseServiceCharge.CurrencyCode');
      BaseServiceChargeMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].BaseServiceCharge.MonetaryValue');
      GrossChargeCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.GrossCharge.CurrencyCode');
      GrossChargeMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.GrossCharge.MonetaryValue');
      DiscountAmountCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.DiscountAmount.CurrencyCode');
      DiscountAmountMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.DiscountAmount.MonetaryValue');
      DiscountPercentage := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.DiscountPercentage');
      NetChargeCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.NetCharge.CurrencyCode');
      NetChargeMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.TransportationCharges.NetCharge.MonetaryValue');
      Density := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.FreightDensityRate.Density');
      TotalCubicFeet := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.FreightDensityRate.TotalCubicFeet');
      ServiceOptionsChargesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].ServiceOptionsCharges.CurrencyCode');
      ServiceOptionsChargesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].ServiceOptionsCharges.MonetaryValue');
      TotalChargesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].TotalCharges.CurrencyCode');
      TotalChargesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].TotalCharges.MonetaryValue');
      TotalChargesWithTaxesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].TotalChargesWithTaxes.CurrencyCode');
      TotalChargesWithTaxesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].TotalChargesWithTaxes.MonetaryValue');
      TotalChargeCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TotalCharge.CurrencyCode');
      TotalChargeMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TotalCharge.MonetaryValue');
      TotalChargesWithTaxesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TotalChargesWithTaxes.CurrencyCode');
      TotalChargesWithTaxesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TotalChargesWithTaxes.MonetaryValue');
      PickupDate := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.PickupDate');
      DocumentsOnlyIndicator := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.DocumentsOnlyIndicator');
      PackageBillType := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.PackageBillType');
      ServiceDescription := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.Service.Description');
      GuaranteedIndicator := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.GuaranteedIndicator');
      Disclaimer := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.Disclaimer');
      Date := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.Arrival.Date');
      Time := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.Arrival.Time');
      BusinessDaysInTransit := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.BusinessDaysInTransit');
      PickupDate := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.Pickup.Date');
      PickupTime := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.Pickup.Time');
      DayOfWeek := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.DayOfWeek');
      CustomerCenterCutoff := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.CustomerCenterCutoff');
      DelayCount := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.DelayCount');
      HolidayCount := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.HolidayCount');
      RestDays := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.RestDays');
      TotalTransitDays := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.EstimatedArrival.TotalTransitDays');
      SaturdayDelivery := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.SaturdayDelivery');
      SaturdayDeliveryDisclaimer := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.SaturdayDeliveryDisclaimer');
      SundayDelivery := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.SundayDelivery');
      SundayDeliveryDisclaimer := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.ServiceSummary.SundayDeliveryDisclaimer');
      AutoDutyCode := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.AutoDutyCode');
      TimeInTransitDisclaimer := jResp.StringOf('RateResponse.RatedShipment[i].TimeInTransit.Disclaimer');
      ScheduledDeliveryDate := jResp.StringOf('RateResponse.RatedShipment[i].ScheduledDeliveryDate');
      RoarRatedIndicator := jResp.StringOf('RateResponse.RatedShipment[i].RoarRatedIndicator');
      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].Disclaimer');
      while j < count_j do
        begin
          jResp.J := j;
          Code := jResp.StringOf('RateResponse.RatedShipment[i].Disclaimer[j].Code');
          Description := jResp.StringOf('RateResponse.RatedShipment[i].Disclaimer[j].Description');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedShipmentAlert');
      while j < count_j do
        begin
          jResp.J := j;
          Code := jResp.StringOf('RateResponse.RatedShipment[i].RatedShipmentAlert[j].Code');
          Description := jResp.StringOf('RateResponse.RatedShipment[i].RatedShipmentAlert[j].Description');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].ItemizedCharges');
      while j < count_j do
        begin
          jResp.J := j;
          Code := jResp.StringOf('RateResponse.RatedShipment[i].ItemizedCharges[j].Code');
          Description := jResp.StringOf('RateResponse.RatedShipment[i].ItemizedCharges[j].Description');
          CurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].ItemizedCharges[j].CurrencyCode');
          MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].ItemizedCharges[j].MonetaryValue');
          SubType := jResp.StringOf('RateResponse.RatedShipment[i].ItemizedCharges[j].SubType');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits');
      while j < count_j do
        begin
          jResp.J := j;
          Quantity := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Quantity');
          TypeCode := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Type.Code');
          TypeDescription := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Type.Description');
          UnitOfMeasurement := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Dimensions.UnitOfMeasurement');
          Length := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Dimensions.Length');
          Width := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Dimensions.Width');
          Height := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].Dimensions.Height');
          AdjustedHeightValue := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].AdjustedHeight.Value');
          AdjustedHeightUnitOfMeasurement := jResp.StringOf('RateResponse.RatedShipment[i].FRSShipmentData.HandlingUnits[j].AdjustedHeight.UnitOfMeasurement');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].TaxCharges');
      while j < count_j do
        begin
          jResp.J := j;
          v_Type := jResp.StringOf('RateResponse.RatedShipment[i].TaxCharges[j].Type');
          MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].TaxCharges[j].MonetaryValue');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges');
      while j < count_j do
        begin
          jResp.J := j;
          Code := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges[j].Code');
          Description := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges[j].Description');
          CurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges[j].CurrencyCode');
          MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges[j].MonetaryValue');
          SubType := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.ItemizedCharges[j].SubType');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].NegotiatedRateCharges.TaxCharges');
      while j < count_j do
        begin
          jResp.J := j;
          v_Type := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TaxCharges[j].Type');
          MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].NegotiatedRateCharges.TaxCharges[j].MonetaryValue');
          j := j + 1;
        end;

      j := 0;
      count_j := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedPackage');
      while j < count_j do
        begin
          jResp.J := j;
          BaseServiceChargeCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].BaseServiceCharge.CurrencyCode');
          BaseServiceChargeMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].BaseServiceCharge.MonetaryValue');
          TransportationChargesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].TransportationCharges.CurrencyCode');
          TransportationChargesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].TransportationCharges.MonetaryValue');
          ServiceOptionsChargesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ServiceOptionsCharges.CurrencyCode');
          ServiceOptionsChargesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ServiceOptionsCharges.MonetaryValue');
          TotalChargesCurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].TotalCharges.CurrencyCode');
          TotalChargesMonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].TotalCharges.MonetaryValue');
          Weight := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].Weight');
          UnitOfMeasurementCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].BillingWeight.UnitOfMeasurement.Code');
          UnitOfMeasurementDescription := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].BillingWeight.UnitOfMeasurement.Description');
          BillingWeightWeight := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].BillingWeight.Weight');
          SimpleRateCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].SimpleRate.Code');
          k := 0;
          count_k := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedPackage[j].Accessorial');
          while k < count_k do
            begin
              jResp.K := k;
              Code := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].Accessorial[k].Code');
              Description := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].Accessorial[k].Description');
              k := k + 1;
            end;

          k := 0;
          count_k := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges');
          while k < count_k do
            begin
              jResp.K := k;
              Code := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges[k].Code');
              Description := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges[k].Description');
              CurrencyCode := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges[k].CurrencyCode');
              MonetaryValue := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges[k].MonetaryValue');
              SubType := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].ItemizedCharges[k].SubType');
              k := k + 1;
            end;

          k := 0;
          count_k := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedPackage[j].NegotiatedCharges.ItemizedCharges');
          while k < count_k do
            begin
              jResp.K := k;
              nullVal := jResp.IsNullOf('RateResponse.RatedShipment[i].RatedPackage[j].NegotiatedCharges.ItemizedCharges[k]');
              k := k + 1;
            end;

          k := 0;
          count_k := jResp.SizeOfArray('RateResponse.RatedShipment[i].RatedPackage[j].RateModifier');
          while k < count_k do
            begin
              jResp.K := k;
              ModifierType := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].RateModifier[k].ModifierType');
              ModifierDesc := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].RateModifier[k].ModifierDesc');
              Amount := jResp.StringOf('RateResponse.RatedShipment[i].RatedPackage[j].RateModifier[k].Amount');
              k := k + 1;
            end;

          j := j + 1;
        end;

      i := i + 1;
    end;



  http.Free;
  json.Free;
  jsonToken.Free;
  resp.Free;
  sbResponseBody.Free;
  jResp.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.