/// <summary>
        /// Create an Address with optional verifications.
        /// </summary>
        /// <param name="address">Address to create</param>
        /// <param name="verify">Verification flags to to control verification. You can verify the delivery address or the
        /// extended zip4 value. If you use the strict versions an HttpException to be raised if unsucessful.
        /// </param>
        /// <returns>Address instance.</returns>
        public Task <Address> CreateAddress(
            Address address,
            VerificationFlags verify = VerificationFlags.None)
        {
            var request = new EasyPostRequest("addresses", Method.POST);

            request.AddBody(address.AsDictionary(), "address");

            if ((verify & VerificationFlags.Delivery) != 0)
            {
                request.AddParameter("verify[]", "delivery", ParameterType.QueryString);
            }
            if ((verify & VerificationFlags.Zip4) != 0)
            {
                request.AddParameter("verify[]", "zip4", ParameterType.QueryString);
            }
            if ((verify & VerificationFlags.DeliveryStrict) != 0)
            {
                request.AddParameter("verify_strict[]", "delivery", ParameterType.QueryString);
            }
            if ((verify & VerificationFlags.Zip4Strict) != 0)
            {
                request.AddParameter("verify_strict[]", "zip4", ParameterType.QueryString);
            }

            return(Execute <Address>(request));
        }
        /// <summary>
        /// Generate a postage label for this shipment.
        /// </summary>
        /// <param name="id">The id of the shipment to generate the label for</param>
        /// <param name="fileFormat">Format to generate the label in. Valid formats: "pdf", "zpl" and "epl2".</param>
        /// <returns>Shipment instance.</returns>
        public async Task <Shipment> GenerateLabel(
            string id,
            string fileFormat)
        {
            var request = new EasyPostRequest("shipments/{id}/label");

            request.AddUrlSegment("id", id);

            // This is a GET, but uses the request body, so use ParameterType.GetOrPost instead.
            request.AddParameter("file_format", fileFormat, ParameterType.GetOrPost);

            return(await Execute <Shipment>(request));
        }
        /// <summary>
        /// Verify an address.
        /// </summary>
        /// <returns>Address instance. Check message for verification failures.</returns>
        public async Task <Address> VerifyAddress(
            Address address,
            string carrier = null)
        {
            if (address.Id == null)
            {
                address = await CreateAddress(address);
            }

            var request = new EasyPostRequest("addresses/{id}/verify");

            request.RootElement = "address";
            request.AddUrlSegment("id", address.Id);

            if (carrier != null)
            {
                request.AddParameter("carrier", carrier, ParameterType.QueryString);
            }

            return(await Execute <Address>(request));
        }