/// <summary>
        /// This operation creates an end-of-day manifest that combines all trackable shipments into a single form that is scanned by the carrier
        /// as an acceptance of all the shipments.
        ///
        /// Things to Consider:
        ///     * All shipments with the ADD_TO_MANIFEST option set to true are eligible for inclusion in the manifest.
        ///     * A shipment is eligible for inclusion both on and before its shipment date.
        ///     * If an eligible shipment is not included in a manifest request within 24 hours of the specified shipment date, it is automatically
        ///     manifested.
        ///     * Up to 5000 shipments can be included in a single manifest request.
        ///     * Shipments, once manifested, cannot be re-manifested.
        ///     * When creating the manifest, the MANIFEST_TYPE parameter parameter is not required. It can be either left out or set to NORMAL.
        ///     * You can add shipments to the manifest by specifying Shipper ID, tracking numbers, or both:
        ///         - If you specify Shipper ID, the form will include all eligible shipments created with that Shipper ID. To specify Shipper ID,
        ///         add the SHIPPER_ID parameter to the parameters array.
        ///         - If you specify tracking numbers, the form will include all eligible shipments with those tracking numbers.Specify tracking
        ///         numbers in the parcelTrackingNumbers array.
        ///     * If you specify both Shipper ID and tracking numbers, ensure the tracking numbers belong to the Shipper ID.
        ///     * You can filter further by specifying an inductionPostalCode. When specified, the inductionPostalCode value in the manifest
        ///     request must match the rates.inductionPostalCode value of the shipment.If a shipment has no rates.inductionPostalCode, the
        ///     value in the manifest request must match the shipment’s fromAddress.postalCode.
        ///     * If a manifest request contains shipments with different inductionPostalCode values, then a multi-page manifest is created, with one inductionPostalCode value per page. The pages are accessed via a single PDF.
        ///     * Manifest documents retrieved through URLs are available for 24 hours after creation.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="request"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        public async static Task <ShippingApiResponse <T> > CreateManifest <T>(T request, ISession session = null) where T : IManifest, new()
        {
            var manifestRequest = new JsonManifest <T>(request);

            return(await WebMethod.Post <T, JsonManifest <T> >("/shippingservices/v1/manifests", manifestRequest, session));
        }
 /// <summary>
 /// This operation retries a Create Manifest request that was submitted but received no response. You can use this operation only if the request received
 /// no response at all. If the request returned an error, you must instead create a new manifest.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="request"></param>
 /// <param name="session"></param>
 /// <returns></returns>
 public async static Task <ShippingApiResponse <T> > RetryManifest <T>(RetryManifestRequest request, ISession session = null) where T : IManifest, new()
 {
     return(await WebMethod.Post <T, RetryManifestRequest>("/shippingservices/v1/manifests", request, session));
 }
        /// <summary>
        /// Address validation verifies and cleanses postal addresses within the United
        /// States to help ensure packages are rated accurately and shipments arrive at
        /// their final destinations on time.This API call sends an address to be
        /// verified.The response returns a valid address.
        /// </summary>
        /// <returns>The address.</returns>
        /// <param name="request">Request.</param>
        /// <param name="session">Session.</param>
        /// <typeparam name="T">The 1st type parameter.</typeparam>
        public async static Task <ShippingApiResponse <T> > VerifyAddress <T>(T request, ISession session = null) where T : IAddress, new()
        {
            var verifyRequest = new JsonAddress <T>(request);

            return(await WebMethod.Post <T, JsonAddress <T> >("/shippingservices/v1/addresses/verify", verifyRequest, session));
        }