{"id":2280,"date":"2022-11-08T22:50:21","date_gmt":"2022-11-08T22:50:21","guid":{"rendered":"https:\/\/serviceobjects.wpaladdin.com\/?post_type=serviceobjects&#038;p=2280"},"modified":"2025-10-08T10:34:39","modified_gmt":"2025-10-08T17:34:39","slug":"avi-rest","status":"publish","type":"page","link":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/","title":{"rendered":"AVI &#8211; REST"},"content":{"rendered":"\n<div class=\"wp-block-create-block-tabs\"><ul class=\"tab-labels\" role=\"tablist\" aria-label=\"tabbed content\"><li class=\"tab-label active\" role=\"tab\" aria-selected=\"true\" aria-controls=\"C#\" tabindex=\"0\">C#<\/li><li class=\"tab-label\" role=\"tab\" aria-selected=\"false\" aria-controls=\"Python\" tabindex=\"0\">Python<\/li><li class=\"tab-label\" role=\"tab\" aria-selected=\"false\" aria-controls=\"NodeJS\" tabindex=\"0\">NodeJS<\/li><\/ul><div class=\"tab-content\">\n<div class=\"wp-block-create-block-tab tab-panel\" role=\"tabpanel\" tabindex=\"0\">\n<p><strong>Address Validation International C# Rest Code Snippet<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace address_validation_international_dot_net.REST\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ Provides functionality to call the ServiceObjects Address Validation International (AVI) REST API's GetAddressInfo endpoint,\n    \/\/\/ retrieving validated and corrected international address information with fallback to a backup endpoint for reliability in live mode.\n    \/\/\/ &lt;\/summary>\n    public static class GetAddressInfoClient\n    {\n        \/\/ Base URL constants: production, backup, and trial\n        private const string LiveBaseUrl = \"https:\/\/sws.serviceobjects.com\/avi\/api.svc\/json\/\";\n        private const string BackupBaseUrl = \"https:\/\/swsbackup.serviceobjects.com\/avi\/api.svc\/json\/\";\n        private const string TrialBaseUrl = \"https:\/\/trial.serviceobjects.com\/avi\/api.svc\/json\/\";\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Synchronously calls the GetAddressInfo REST endpoint to retrieve validated international address information,\n        \/\/\/ attempting the primary endpoint first and falling back to the backup if the response is invalid\n        \/\/\/ (Error.TypeCode == \"3\") in live mode.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"input\">The input parameters including address lines, locality, administrative area, postal code, country, output language, and license key.&lt;\/param>\n        \/\/\/ &lt;returns>Deserialized &lt;see cref=\"AddressInfoResponse\"\/> containing validated address data or an error.&lt;\/returns>\n        public static AddressInfoResponse Invoke(GetAddressInfoInput input)\n        {\n            \/\/ Use query string parameters so missing\/optional fields don't break the URL\n            string url = BuildUrl(input, input.IsLive ? LiveBaseUrl : TrialBaseUrl);\n            AddressInfoResponse response = Helper.HttpGet&lt;AddressInfoResponse>(url, input.TimeoutSeconds);\n\n            \/\/ Fallback on error in live mode\n            if (input.IsLive &amp;&amp; !ValidResponse(response))\n            {\n                string fallbackUrl = BuildUrl(input, BackupBaseUrl);\n                AddressInfoResponse fallbackResponse = Helper.HttpGet&lt;AddressInfoResponse>(fallbackUrl, input.TimeoutSeconds);\n                return fallbackResponse;\n            }\n\n            return response;\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Asynchronously calls the GetAddressInfo REST endpoint to retrieve validated international address information,\n        \/\/\/ attempting the primary endpoint first and falling back to the backup if the response is invalid\n        \/\/\/ (Error.TypeCode == \"3\") in live mode.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"input\">The input parameters including address lines, locality, administrative area, postal code, country, output language, and license key.&lt;\/param>\n        \/\/\/ &lt;returns>Deserialized &lt;see cref=\"AddressInfoResponse\"\/> containing validated address data or an error.&lt;\/returns>\n        public static async Task&lt;AddressInfoResponse> InvokeAsync(GetAddressInfoInput input)\n        {\n            \/\/ Use query string parameters so missing\/optional fields don't break the URL\n            string url = BuildUrl(input, input.IsLive ? LiveBaseUrl : TrialBaseUrl);\n            AddressInfoResponse response = await Helper.HttpGetAsync&lt;AddressInfoResponse>(url, input.TimeoutSeconds).ConfigureAwait(false);\n\n            \/\/ Fallback on error in live mode\n            if (input.IsLive &amp;&amp; !ValidResponse(response))\n            {\n                string fallbackUrl = BuildUrl(input, BackupBaseUrl);\n                AddressInfoResponse fallbackResponse = await Helper.HttpGetAsync&lt;AddressInfoResponse>(fallbackUrl, input.TimeoutSeconds).ConfigureAwait(false);\n                return fallbackResponse;\n            }\n\n            return response;\n        }\n\n        \/\/ Build the full request URL, including URL-encoded query string\n        public static string BuildUrl(GetAddressInfoInput input, string baseUrl)\n        {\n            \/\/ Construct query string with URL-encoded parameters\n            string qs = $\"GetAddressInfo?\" +\n                        $\"Address1={Helper.UrlEncode(input.Address1)}\" +\n                        $\"&amp;Address2={Helper.UrlEncode(input.Address2)}\" +\n                        $\"&amp;Address3={Helper.UrlEncode(input.Address3)}\" +\n                        $\"&amp;Address4={Helper.UrlEncode(input.Address4)}\" +\n                        $\"&amp;Address5={Helper.UrlEncode(input.Address5)}\" +\n                        $\"&amp;Locality={Helper.UrlEncode(input.Locality)}\" +\n                        $\"&amp;AdministrativeArea={Helper.UrlEncode(input.AdministrativeArea)}\" +\n                        $\"&amp;PostalCode={Helper.UrlEncode(input.PostalCode)}\" +\n                        $\"&amp;Country={Helper.UrlEncode(input.Country)}\" +\n                        $\"&amp;OutputLanguage={Helper.UrlEncode(input.OutputLanguage)}\" +\n                        $\"&amp;LicenseKey={Helper.UrlEncode(input.LicenseKey)}\";\n            return baseUrl + qs;\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Validates the API response to determine if it is successful or requires a fallback.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"response\">The API response to validate.&lt;\/param>\n        \/\/\/ &lt;returns>True if the response is valid (no error or TypeCode != \"3\"), false otherwise.&lt;\/returns>\n        private static bool ValidResponse(AddressInfoResponse response)\n        {\n            return response?.Error == null || response.Error.TypeCode != \"3\";\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Input parameters for the GetAddressInfo API call. Represents an international address to validate and correct.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"Address1\">Address line 1 of the international address.&lt;\/param>\n        \/\/\/ &lt;param name=\"Address2\">Address line 2 of the international address. Optional.&lt;\/param>\n        \/\/\/ &lt;param name=\"Address3\">Address line 3 of the international address. Optional.&lt;\/param>\n        \/\/\/ &lt;param name=\"Address4\">Address line 4 of the international address. Optional.&lt;\/param>\n        \/\/\/ &lt;param name=\"Address5\">Address line 5 of the international address. Optional.&lt;\/param>\n        \/\/\/ &lt;param name=\"Locality\">The city, town, or municipality of the address. Required if postal code is not provided.&lt;\/param>\n        \/\/\/ &lt;param name=\"AdministrativeArea\">The state, region, or province of the address. Required if postal code is not provided.&lt;\/param>\n        \/\/\/ &lt;param name=\"PostalCode\">The postal code of the address. Required if locality and administrative area are not provided.&lt;\/param>\n        \/\/\/ &lt;param name=\"Country\">The country name or ISO 3166-1 Alpha-2\/Alpha-3 code.&lt;\/param>\n        \/\/\/ &lt;param name=\"OutputLanguage\">The language for service output (e.g., \"ENGLISH\", \"BOTH\", \"LOCAL_ROMAN\", \"LOCAL\").&lt;\/param>\n        \/\/\/ &lt;param name=\"LicenseKey\">The license key to authenticate the API request.&lt;\/param>\n        \/\/\/ &lt;param name=\"IsLive\">Indicates whether to use the live service (true) or trial service (false).&lt;\/param>\n        \/\/\/ &lt;param name=\"TimeoutSeconds\">Timeout duration for the API call, in seconds.&lt;\/param>\n        public record GetAddressInfoInput(\n            string Address1 = \"\",\n            string Address2 = \"\",\n            string Address3 = \"\",\n            string Address4 = \"\",\n            string Address5 = \"\",\n            string Locality = \"\",\n            string AdministrativeArea = \"\",\n            string PostalCode = \"\",\n            string Country = \"\",\n            string OutputLanguage = \"\",\n            string LicenseKey = \"\",\n            bool IsLive = true,\n            int TimeoutSeconds = 15\n        );\n    }\n}\n\n\n\ufeffusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace address_validation_international_dot_net.REST\n{\/\/\/ &lt;summary>\n \/\/\/ Response from the AVI API\n \/\/\/ &lt;\/summary>\n    public class AddressInfoResponse \n    {\n        public AddressInfo AddressInfo { get; set; }\n        public Error Error { get; set; }\n        public override string ToString()\n        {\n            return $\"AVI Response: \" +\n                $\"\\nAddressInfo: {AddressInfo} \" +\n                $\"\\nError: {{{Error}}}\";\n        }\n    }\n    \/\/\/ &lt;summary>\n    \/\/\/ Information on each address\n    \/\/\/ &lt;\/summary>\n    public class AddressInfo\n    {\n        public string Status { get; set; }\n        public string ResolutionLevel { get; set; }\n        public string Address1 { get; set; }\n        public string Address2 { get; set; }\n        public string Address3 { get; set; }\n        public string Address4 { get; set; }\n        public string Address5 { get; set; }\n        public string Address6 { get; set; }\n        public string Address7 { get; set; }\n        public string Address8 { get; set; }\n        public string Locality { get; set; }\n        public string AdministrativeArea { get; set; }\n        public string PostalCode { get; set; }\n        public string Country { get; set; }\n        public string CountryISO2 { get; set; }\n        public string CountryISO3 { get; set; }\n        public InformationComponent[] InformationComponents { get; set; }\n        public override string ToString()\n        {\n            return $\"\\n{{Status: {Status} \" +\n                $\"\\nResolutionLevel: {ResolutionLevel} \" +\n                $\"\\nAddress1: {Address1} \" +\n                $\"\\nAddress2: {Address2} \" +\n                $\"\\nAddress2: {Address3} \" +\n                $\"\\nAddress4: {Address4} \" +\n                $\"\\nAddress5: {Address5} \" +\n                $\"\\nAddress6: {Address6} \" +\n                $\"\\nAddress7: {Address7} \" +\n                $\"\\nAddress8: {Address8} \" +\n                $\"\\nLocality: {Locality} \" +\n                $\"\\nAdministrativeArea: {AdministrativeArea} \" +\n                $\"\\nPostalCode: {PostalCode} \" +\n                $\"\\nCountry: {Country} \" +\n                $\"\\nCountryISO2: {CountryISO2} \" +\n                $\"\\nCountryISO3: {CountryISO3} \" +\n                $\"\\nInformationComponents: {InformationComponents}}}\\n\";\n        }\n\n    }\n    public class InformationComponent\n    {\n        public string Name { get; set; }\n        public string Value { get; set; }\n        public override string ToString()\n        {\n            return $\"Name: {Name} \" +\n                $\"\\nValue: {Value}\\n\";\n        }\n    }\n\n    public class Error\n    {\n        public string Type { get; set; }\n        public string TypeCode { get; set; }\n        public string Desc { get; set; }\n        public string DescCode { get; set; }\n        public override string ToString()\n        {\n            return $\"Type: {Type} \" +\n                $\"\\nTypeCode: {TypeCode} \" +\n                $\"\\nDesc: {Desc} \" +\n                $\"\\nDescCode: {DescCode} \";\n        }\n    }\n\n}\n\n\n\ufeffusing System.Text.Json;\nusing System.Web;\n\nnamespace address_validation_international_dot_net.REST \n{\n    public class Helper\n    {\n        public static T HttpGet&lt;T>(string url, int timeoutSeconds)\n        {\n            using var httpClient = new HttpClient\n            {\n                Timeout = TimeSpan.FromSeconds(timeoutSeconds)\n            };\n            using var request = new HttpRequestMessage(HttpMethod.Get, url);\n            using HttpResponseMessage response = httpClient\n                .SendAsync(request)\n                .GetAwaiter()\n                .GetResult();\n            response.EnsureSuccessStatusCode();\n            using Stream responseStream = response.Content\n                .ReadAsStreamAsync()\n                .GetAwaiter()\n                .GetResult();\n            var options = new JsonSerializerOptions\n            {\n                PropertyNameCaseInsensitive = true\n            };\n            object? obj = JsonSerializer.Deserialize(responseStream, typeof(T), options);\n            T result = (T)obj!;\n            return result;\n        }\n\n        \/\/ Asynchronous HTTP GET and JSON deserialize\n        public static async Task&lt;T> HttpGetAsync&lt;T>(string url, int timeoutSeconds)\n        {\n            HttpClient HttpClient = new HttpClient();\n            HttpClient.Timeout = TimeSpan.FromSeconds(timeoutSeconds);\n            using var httpResponse = await HttpClient.GetAsync(url).ConfigureAwait(false);\n            httpResponse.EnsureSuccessStatusCode();\n            var stream = await httpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false);\n            return JsonSerializer.Deserialize&lt;T>(stream)!;\n        }\n\n        public static string UrlEncode(string value) => HttpUtility.UrlEncode(value ?? string.Empty);\n    }\n}<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-create-block-tab tab-panel\" role=\"tabpanel\" tabindex=\"0\">\n<p><strong>Address Validation International Python Code Snippet<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from avi_response import AddressInfoResponse, AddressInfo, InformationComponent, Error\nimport requests\n\n# Endpoint URLs for ServiceObjects Address Validation International (AVI) API\nprimary_url = \"https:\/\/sws.serviceobjects.com\/avi\/api.svc\/json\/GetAddressInfo?\"\nbackup_url = \"https:\/\/swsbackup.serviceobjects.com\/avi\/api.svc\/json\/GetAddressInfo?\"\ntrial_url = \"https:\/\/trial.serviceobjects.com\/avi\/api.svc\/json\/GetAddressInfo?\"\n\ndef get_address_info(\n    address1: str,\n    address2: str,\n    address3: str,\n    address4: str,\n    address5: str,\n    locality: str,\n    administrative_area: str,\n    postal_code: str,\n    country: str,\n    output_language: str,\n    license_key: str,\n    is_live: bool = True\n) -> AddressInfoResponse:\n    \"\"\"\n    Call ServiceObjects Address Validation International (AVI) API's GetAddressInfo endpoint\n    to retrieve validated and corrected international address information.\n\n    Parameters:\n        address1: Address line 1 of the international address.\n        address2: Address line 2 of the international address. Optional.\n        address3: Address line 3 of the international address. Optional.\n        address4: Address line 4 of the international address. Optional.\n        address5: Address line 5 of the international address. Optional.\n        locality: The city, town, or municipality of the address. Required if postal code is not provided.\n        administrative_area: The state, region, or province of the address. Required if postal code is not provided.\n        postal_code: The postal code of the address. Required if locality and administrative area are not provided.\n        country: The country name or ISO 3166-1 Alpha-2\/Alpha-3 code.\n        output_language: The language for service output (e.g., \"ENGLISH\", \"BOTH\", \"LOCAL_ROMAN\", \"LOCAL\").\n        license_key: Your ServiceObjects license key.\n        is_live: Use live or trial servers.\n\n    Returns:\n        AddressInfoResponse: Parsed JSON response with validated address details or error details.\n\n    Raises:\n        RuntimeError: If the API returns an error payload.\n        requests.RequestException: On network\/HTTP failures (trial mode).\n    \"\"\"\n    params = {\n        \"Address1\": address1,\n        \"Address2\": address2,\n        \"Address3\": address3,\n        \"Address4\": address4,\n        \"Address5\": address5,\n        \"Locality\": locality,\n        \"AdministrativeArea\": administrative_area,\n        \"PostalCode\": postal_code,\n        \"Country\": country,\n        \"OutputLanguage\": output_language,\n        \"LicenseKey\": license_key,\n    }\n    # Select the base URL: production vs trial\n    url = primary_url if is_live else trial_url\n\n    try:\n        # Attempt primary (or trial) endpoint\n        response = requests.get(url, params=params, timeout=10)\n        response.raise_for_status()\n        data = response.json()\n\n        # If API returned an error in JSON payload, trigger fallback\n        error = data.get('Error')\n        if not (error is None or error.get('TypeCode') != \"3\"):\n            if is_live:\n                # Try backup URL\n                response = requests.get(backup_url, params=params, timeout=10)\n                response.raise_for_status()\n                data = response.json()\n\n                # If still error, propagate exception\n                if 'Error' in data:\n                    raise RuntimeError(f\"AVI service error: {data['Error']}\")\n            else:\n                # Trial mode error is terminal\n                raise RuntimeError(f\"AVI trial error: {data['Error']}\")\n\n        # Convert JSON response to AddressInfoResponse for structured access\n        error = Error(**data.get(\"Error\", {})) if data.get(\"Error\") else None\n        address_info = data.get(\"AddressInfo\")\n        address_info_obj = None\n        if address_info:\n            address_info_obj = AddressInfo(\n                Status=address_info.get(\"Status\"),\n                ResolutionLevel=address_info.get(\"ResolutionLevel\"),\n                Address1=address_info.get(\"Address1\"),\n                Address2=address_info.get(\"Address2\"),\n                Address3=address_info.get(\"Address3\"),\n                Address4=address_info.get(\"Address4\"),\n                Address5=address_info.get(\"Address5\"),\n                Address6=address_info.get(\"Address6\"),\n                Address7=address_info.get(\"Address7\"),\n                Address8=address_info.get(\"Address8\"),\n                Locality=address_info.get(\"Locality\"),\n                AdministrativeArea=address_info.get(\"AdministrativeArea\"),\n                PostalCode=address_info.get(\"PostalCode\"),\n                Country=address_info.get(\"Country\"),\n                CountryISO2=address_info.get(\"CountryISO2\"),\n                CountryISO3=address_info.get(\"CountryISO3\"),\n                InformationComponents=[\n                    InformationComponent(Name=comp.get(\"Name\"), Value=comp.get(\"Value\"))\n                    for comp in address_info.get(\"InformationComponents\", [])\n                ] if \"InformationComponents\" in address_info else []\n            )\n\n        return AddressInfoResponse(\n            AddressInfo=address_info_obj,\n            Error=error\n        )\n\n    except requests.RequestException as req_exc:\n        # Network or HTTP-level error occurred\n        if is_live:\n            try:\n                # Fallback to backup URL\n                response = requests.get(backup_url, params=params, timeout=10)\n                response.raise_for_status()\n                data = response.json()\n                if \"Error\" in data:\n                    raise RuntimeError(f\"AVI backup error: {data['Error']}\") from req_exc\n\n                error = Error(**data.get(\"Error\", {})) if data.get(\"Error\") else None\n                address_info = data.get(\"AddressInfo\")\n                address_info_obj = None\n                if address_info:\n                    address_info_obj = AddressInfo(\n                        Status=address_info.get(\"Status\"),\n                        ResolutionLevel=address_info.get(\"ResolutionLevel\"),\n                        Address1=address_info.get(\"Address1\"),\n                        Address2=address_info.get(\"Address2\"),\n                        Address3=address_info.get(\"Address3\"),\n                        Address4=address_info.get(\"Address4\"),\n                        Address5=address_info.get(\"Address5\"),\n                        Address6=address_info.get(\"Address6\"),\n                        Address7=address_info.get(\"Address7\"),\n                        Address8=address_info.get(\"Address8\"),\n                        Locality=address_info.get(\"Locality\"),\n                        AdministrativeArea=address_info.get(\"AdministrativeArea\"),\n                        PostalCode=address_info.get(\"PostalCode\"),\n                        Country=address_info.get(\"Country\"),\n                        CountryISO2=address_info.get(\"CountryISO2\"),\n                        CountryISO3=address_info.get(\"CountryISO3\"),\n                        InformationComponents=[\n                            InformationComponent(Name=comp.get(\"Name\"), Value=comp.get(\"Value\"))\n                            for comp in address_info.get(\"InformationComponents\", [])\n                        ] if \"InformationComponents\" in address_info else []\n                    )\n\n                return AddressInfoResponse(\n                    AddressInfo=address_info_obj,\n                    Error=error\n                )\n            except Exception as backup_exc:\n                raise RuntimeError(\"AVI service unreachable on both endpoints\") from backup_exc\n        else:\n            raise RuntimeError(f\"AVI trial error: {str(req_exc)}\") from req_exc\n\n\n\nfrom dataclasses import dataclass\nfrom typing import Optional, List\n\n\n@dataclass\nclass GetAddressInfoInput:\n    Address1: Optional[str] = None\n    Address2: Optional[str] = None\n    Address3: Optional[str] = None\n    Address4: Optional[str] = None\n    Address5: Optional[str] = None\n    Locality: Optional[str] = None\n    AdministrativeArea: Optional[str] = None\n    PostalCode: Optional[str] = None\n    Country: Optional[str] = None\n    OutputLanguage: str = \"ENGLISH\"\n    LicenseKey: Optional[str] = None\n    IsLive: bool = True\n    TimeoutSeconds: int = 15\n\n    def __str__(self) -> str:\n        return (f\"GetAddressInfoInput: Address1={self.Address1}, Address2={self.Address2}, Address3={self.Address3}, \"\n                f\"Address4={self.Address4}, Address5={self.Address5}, Locality={self.Locality}, \"\n                f\"AdministrativeArea={self.AdministrativeArea}, PostalCode={self.PostalCode}, \"\n                f\"Country={self.Country}, OutputLanguage={self.OutputLanguage}, LicenseKey={self.LicenseKey}, \"\n                f\"IsLive={self.IsLive}, TimeoutSeconds={self.TimeoutSeconds}\")\n\n\n@dataclass\nclass InformationComponent:\n    Name: Optional[str] = None\n    Value: Optional[str] = None\n\n    def __str__(self) -> str:\n        return f\"InformationComponent: Name={self.Name}, Value={self.Value}\"\n\n\n@dataclass\nclass Error:\n    Type: Optional[str] = None\n    TypeCode: Optional[str] = None\n    Desc: Optional[str] = None\n    DescCode: Optional[str] = None\n\n    def __str__(self) -> str:\n        return f\"Error: Type={self.Type}, TypeCode={self.TypeCode}, Desc={self.Desc}, DescCode={self.DescCode}\"\n\n\n@dataclass\nclass AddressInfo:\n    Status: Optional[str] = None\n    ResolutionLevel: Optional[str] = None\n    Address1: Optional[str] = None\n    Address2: Optional[str] = None\n    Address3: Optional[str] = None\n    Address4: Optional[str] = None\n    Address5: Optional[str] = None\n    Address6: Optional[str] = None\n    Address7: Optional[str] = None\n    Address8: Optional[str] = None\n    Locality: Optional[str] = None\n    AdministrativeArea: Optional[str] = None\n    PostalCode: Optional[str] = None\n    Country: Optional[str] = None\n    CountryISO2: Optional[str] = None\n    CountryISO3: Optional[str] = None\n    InformationComponents: Optional[List['InformationComponent']] = None\n\n    def __post_init__(self):\n        if self.InformationComponents is None:\n            self.InformationComponents = []\n\n    def __str__(self) -> str:\n        components_string = ', '.join(str(component) for component in self.InformationComponents) if self.InformationComponents else 'None'\n        return (f\"AddressInfo: Status={self.Status}, ResolutionLevel={self.ResolutionLevel}, \"\n                f\"Address1={self.Address1}, Address2={self.Address2}, Address3={self.Address3}, \"\n                f\"Address4={self.Address4}, Address5={self.Address5}, Address6={self.Address6}, \"\n                f\"Address7={self.Address7}, Address8={self.Address8}, Locality={self.Locality}, \"\n                f\"AdministrativeArea={self.AdministrativeArea}, PostalCode={self.PostalCode}, \"\n                f\"Country={self.Country}, CountryISO2={self.CountryISO2}, CountryISO3={self.CountryISO3}, \"\n                f\"InformationComponents=[{components_string}]\")\n\n\n@dataclass\nclass AddressInfoResponse:\n    AddressInfo: Optional['AddressInfo'] = None\n    Error: Optional['Error'] = None\n\n    def __str__(self) -> str:\n        address_info_string = str(self.AddressInfo) if self.AddressInfo else 'None'\n        error_string = str(self.Error) if self.Error else 'None'\n        return (f\"AddressInfoResponse: AddressInfo={address_info_string}, \"\n                f\"Error={error_string}]\")<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-create-block-tab tab-panel\" role=\"tabpanel\" tabindex=\"0\">\n<p><strong>Address Validation International NodeJS REST Code Snippet<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import axios from 'axios';\nimport querystring from 'querystring';\nimport { AddressInfoResponse } from '.\/avi_response.js';\n\n\/**\n * @constant\n * @type {string}\n * @description The base URL for the live ServiceObjects Address Validation International (AVI) API service.\n *\/\nconst LiveBaseUrl = 'https:\/\/sws.serviceobjects.com\/avi\/api.svc\/json\/';\n\n\/**\n * @constant\n * @type {string}\n * @description The base URL for the backup ServiceObjects Address Validation International (AVI) API service.\n *\/\nconst BackupBaseUrl = 'https:\/\/swsbackup.serviceobjects.com\/avi\/api.svc\/json\/';\n\n\/**\n * @constant\n * @type {string}\n * @description The base URL for the trial ServiceObjects Address Validation International (AVI) API service.\n *\/\nconst TrialBaseUrl = 'https:\/\/trial.serviceobjects.com\/avi\/api.svc\/json\/';\n\n\/**\n * &lt;summary>\n * Checks if a response from the API is valid by verifying that it either has no Error object\n * or the Error.TypeCode is not equal to '3'.\n * &lt;\/summary>\n * &lt;param name=\"response\" type=\"Object\">The API response object to validate.&lt;\/param>\n * &lt;returns type=\"boolean\">True if the response is valid, false otherwise.&lt;\/returns>\n *\/\nconst isValid = (response) => !response?.Error || response.Error.TypeCode !== '3';\n\n\/**\n * &lt;summary>\n * Constructs a full URL for the GetAddressInfo API endpoint by combining the base URL\n * with query parameters derived from the input parameters.\n * &lt;\/summary>\n * &lt;param name=\"params\" type=\"Object\">An object containing all the input parameters.&lt;\/param>\n * &lt;param name=\"baseUrl\" type=\"string\">The base URL for the API service (live, backup, or trial).&lt;\/param>\n * &lt;returns type=\"string\">The constructed URL with query parameters.&lt;\/returns>\n *\/\nconst buildUrl = (params, baseUrl) =>\n    `${baseUrl}GetAddressInfo?${querystring.stringify(params)}`;\n\n\/**\n * &lt;summary>\n * Performs an HTTP GET request to the specified URL with a given timeout.\n * &lt;\/summary>\n * &lt;param name=\"url\" type=\"string\">The URL to send the GET request to.&lt;\/param>\n * &lt;param name=\"timeoutSeconds\" type=\"number\">The timeout duration in seconds for the request.&lt;\/param>\n * &lt;returns type=\"Promise&lt;AddressInfoResponse>\">A promise that resolves to an AddressInfoResponse object containing the API response data.&lt;\/returns>\n * &lt;exception cref=\"Error\">Thrown if the HTTP request fails, with a message detailing the error.&lt;\/exception>\n *\/\nconst httpGet = async (url, timeoutSeconds) => {\n    try {\n        const response = await axios.get(url, { timeout: timeoutSeconds * 1000 });\n        return new AddressInfoResponse(response.data);\n    } catch (error) {\n        throw new Error(`HTTP request failed: ${error.message}`);\n    }\n};\n\n\/**\n * &lt;summary>\n * Provides functionality to call the ServiceObjects Address Validation International (AVI) API's GetAddressInfo endpoint,\n * retrieving validated and corrected international address information with fallback to a backup endpoint for reliability in live mode.\n * &lt;\/summary>\n *\/\nconst GetAddressInfoClient = {\n    \/**\n     * &lt;summary>\n     * Asynchronously invokes the GetAddressInfo API endpoint, attempting the primary endpoint\n     * first and falling back to the backup if the response is invalid (Error.TypeCode == '3') in live mode.\n     * &lt;\/summary>\n     * @param {string} Address1 - Address line 1 of the international address.\n     * @param {string} Address2 - Address line 2 of the international address. Optional.\n     * @param {string} Address3 - Address line 3 of the international address. Optional.\n     * @param {string} Address4 - Address line 4 of the international address. Optional.\n     * @param {string} Address5 - Address line 5 of the international address. Optional.\n     * @param {string} Locality - The city, town, or municipality of the address. Required if postal code is not provided.\n     * @param {string} AdministrativeArea - The state, region, or province of the address. Required if postal code is not provided.\n     * @param {string} PostalCode - The postal code of the address. Required if locality and administrative area are not provided.\n     * @param {string} Country - The country name or ISO 3166-1 Alpha-2\/Alpha-3 code.\n     * @param {string} OutputLanguage - The language for service output (e.g., \"ENGLISH\", \"BOTH\", \"LOCAL_ROMAN\", \"LOCAL\").\n     * @param {string} LicenseKey - Your license key to use the service.\n     * @param {boolean} isLive - Value to determine whether to use the live or trial servers.\n     * @param {number} timeoutSeconds - Timeout, in seconds, for the call to the service.\n     * @returns {Promise&lt;AddressInfoResponse>} - A promise that resolves to an AddressInfoResponse object.\n     *\/\n    async invokeAsync(Address1, Address2, Address3, Address4, Address5, Locality, AdministrativeArea, PostalCode, Country, OutputLanguage, LicenseKey, isLive = true, timeoutSeconds = 15) {\n        const params = {\n            Address1,\n            Address2,\n            Address3,\n            Address4,\n            Address5,\n            Locality,\n            AdministrativeArea,\n            PostalCode,\n            Country,\n            OutputLanguage,\n            LicenseKey\n        };\n\n        const url = buildUrl(params, isLive ? LiveBaseUrl : TrialBaseUrl);\n        let response = await httpGet(url, timeoutSeconds);\n\n        if (isLive &amp;&amp; !isValid(response)) {\n            const fallbackUrl = buildUrl(params, BackupBaseUrl);\n            const fallbackResponse = await httpGet(fallbackUrl, timeoutSeconds);\n            return fallbackResponse;\n        }\n        return response;\n    },\n\n    \/**\n     * &lt;summary>\n     * Synchronously invokes the GetAddressInfo API endpoint by wrapping the async call\n     * and awaiting its result immediately.\n     * &lt;\/summary>\n     * @param {string} Address1 - Address line 1 of the international address.\n     * @param {string} Address2 - Address line 2 of the international address. Optional.\n     * @param {string} Address3 - Address line 3 of the international address. Optional.\n     * @param {string} Address4 - Address line 4 of the international address. Optional.\n     * @param {string} Address5 - Address line 5 of the international address. Optional.\n     * @param {string} Locality - The city, town, or municipality of the address. Required if postal code is not provided.\n     * @param {string} AdministrativeArea - The state, region, or province of the address. Required if postal code is not provided.\n     * @param {string} PostalCode - The postal code of the address. Required if locality and administrative area are not provided.\n     * @param {string} Country - The country name or ISO 3166-1 Alpha-2\/Alpha-3 code.\n     * @param {string} OutputLanguage - The language for service output (e.g., \"ENGLISH\", \"BOTH\", \"LOCAL_ROMAN\", \"LOCAL\").\n     * @param {string} LicenseKey - Your license key to use the service.\n     * @param {boolean} isLive - Value to determine whether to use the live or trial servers.\n     * @param {number} timeoutSeconds - Timeout, in seconds, for the call to the service.\n     * @returns {AddressInfoResponse} - An AddressInfoResponse object with validated address details or an error.\n     *\/\n    invoke(Address1, Address2, Address3, Address4, Address5, Locality, AdministrativeArea, PostalCode, Country, OutputLanguage, LicenseKey, isLive = true, timeoutSeconds = 15) {\n        return (async () => await this.invokeAsync(\n            Address1, Address2, Address3, Address4, Address5, Locality, AdministrativeArea, PostalCode, Country, OutputLanguage, LicenseKey, isLive, timeoutSeconds\n        ))();\n    }\n};\n\nexport { GetAddressInfoClient, AddressInfoResponse };\n\n\n\/**\n * Input parameters for the GetAddressInfo API call.\n *\/\nexport class GetAddressInfoInput {\n    constructor(data = {}) {\n        this.Address1 = data.Address1;\n        this.Address2 = data.Address2;\n        this.Address3 = data.Address3;\n        this.Address4 = data.Address4;\n        this.Address5 = data.Address5;\n        this.Locality = data.Locality;\n        this.AdministrativeArea = data.AdministrativeArea;\n        this.PostalCode = data.PostalCode;\n        this.Country = data.Country;\n        this.OutputLanguage = data.OutputLanguage || 'ENGLISH';\n        this.LicenseKey = data.LicenseKey;\n        this.IsLive = data.IsLive !== undefined ? data.IsLive : true;\n        this.TimeoutSeconds = data.TimeoutSeconds !== undefined ? data.TimeoutSeconds : 15;\n    }\n\n    toString() {\n        return `GetAddressInfoInput: Address1 = ${this.Address1}, Address2 = ${this.Address2}, Address3 = ${this.Address3}, Address4 = ${this.Address4}, Address5 = ${this.Address5}, Locality = ${this.Locality}, AdministrativeArea = ${this.AdministrativeArea}, PostalCode = ${this.PostalCode}, Country = ${this.Country}, OutputLanguage = ${this.OutputLanguage}, LicenseKey = ${this.LicenseKey}, IsLive = ${this.IsLive}, TimeoutSeconds = ${this.TimeoutSeconds}`;\n    }\n}\n\n\/**\n * Information Component for API responses.\n *\/\nexport class InformationComponent {\n    constructor(data = {}) {\n        this.Name = data.Name;\n        this.Value = data.Value;\n    }\n\n    toString() {\n        return `Name = ${this.Name}, Value = ${this.Value}`;\n    }\n}\n\n\/**\n * Error object for API responses.\n *\/\nexport class Error {\n    constructor(data = {}) {\n        this.Type = data.Type;\n        this.TypeCode = data.TypeCode;\n        this.Desc = data.Desc;\n        this.DescCode = data.DescCode;\n    }\n\n    toString() {\n        return `Error: Type = ${this.Type}, TypeCode = ${this.TypeCode}, Desc = ${this.Desc}, DescCode = ${this.DescCode}`;\n    }\n}\n\n\/**\n * Address information for a validated international address.\n *\/\nexport class AddressInfo {\n    constructor(data = {}) {\n        this.Status = data.Status;\n        this.ResolutionLevel = data.ResolutionLevel;\n        this.Address1 = data.Address1;\n        this.Address2 = data.Address2;\n        this.Address3 = data.Address3;\n        this.Address4 = data.Address4;\n        this.Address5 = data.Address5;\n        this.Address6 = data.Address6;\n        this.Address7 = data.Address7;\n        this.Address8 = data.Address8;\n        this.Locality = data.Locality;\n        this.AdministrativeArea = data.AdministrativeArea;\n        this.PostalCode = data.PostalCode;\n        this.Country = data.Country;\n        this.CountryISO2 = data.CountryISO2;\n        this.CountryISO3 = data.CountryISO3;\n        this.InformationComponents = (data.InformationComponents || []).map(component => new InformationComponent(component));\n    }\n\n    toString() {\n        const componentsString = this.InformationComponents.length\n            ? this.InformationComponents.map(component => component.toString()).join(', ')\n            : 'null';\n        return `AddressInfo: Status = ${this.Status}, ResolutionLevel = ${this.ResolutionLevel}, Address1 = ${this.Address1}, Address2 = ${this.Address2}, Address3 = ${this.Address3}, Address4 = ${this.Address4}, Address5 = ${this.Address5}, Address6 = ${this.Address6}, Address7 = ${this.Address7}, Address8 = ${this.Address8}, Locality = ${this.Locality}, AdministrativeArea = ${this.AdministrativeArea}, PostalCode = ${this.PostalCode}, Country = ${this.Country}, CountryISO2 = ${this.CountryISO2}, CountryISO3 = ${this.CountryISO3}, InformationComponents = [${componentsString}]`;\n    }\n}\n\n\/**\n * Response from GetAddressInfo API, containing validated address information.\n *\/\nexport class AddressInfoResponse {\n    constructor(data = {}) {\n        this.AddressInfo = data.AddressInfo ? new AddressInfo(data.AddressInfo) : null;\n        this.Error = data.Error ? new Error(data.Error) : null;\n    }\n\n    toString() {\n        return `AddressInfoResponse: AddressInfo = ${this.AddressInfo ? this.AddressInfo.toString() : 'null'}, Error = ${this.Error ? this.Error.toString() : 'null'}]`;\n    }\n}\n\nexport default AddressInfoResponse;<\/pre>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":2257,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2280","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>AVI - REST<\/title>\n<meta name=\"description\" content=\"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary&gt; \/\/\/\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AVI - REST\" \/>\n<meta property=\"og:description\" content=\"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary&gt; \/\/\/\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Objects | Contact, Phone, Email Verification | Data Quality Services\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-08T17:34:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/\",\"url\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/\",\"name\":\"AVI - REST\",\"isPartOf\":{\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#website\"},\"datePublished\":\"2022-11-08T22:50:21+00:00\",\"dateModified\":\"2025-10-08T17:34:39+00:00\",\"description\":\"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary> \/\/\/\",\"breadcrumb\":{\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.serviceobjects.com\/docs\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DOTS Address Validation &#8211; International\",\"item\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"AVI &#8211; Code Snippets and Sample Code\",\"item\":\"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"AVI &#8211; REST\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#website\",\"url\":\"https:\/\/www.serviceobjects.com\/docs\/\",\"name\":\"Service Objects | Contact, Phone, Email Verification | Data Quality Services\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.serviceobjects.com\/docs\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#organization\",\"name\":\"Service Objects | Contact, Phone, Email Verification | Data Quality Services\",\"url\":\"https:\/\/www.serviceobjects.com\/docs\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.serviceobjects.com\/docs\/wp-content\/uploads\/2022\/08\/SO-logo-2560px-transparent.png\",\"contentUrl\":\"https:\/\/www.serviceobjects.com\/docs\/wp-content\/uploads\/2022\/08\/SO-logo-2560px-transparent.png\",\"width\":2560,\"height\":1440,\"caption\":\"Service Objects | Contact, Phone, Email Verification | Data Quality Services\"},\"image\":{\"@id\":\"https:\/\/www.serviceobjects.com\/docs\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AVI - REST","description":"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary> \/\/\/","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/","og_locale":"en_US","og_type":"article","og_title":"AVI - REST","og_description":"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary> \/\/\/","og_url":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/","og_site_name":"Service Objects | Contact, Phone, Email Verification | Data Quality Services","article_modified_time":"2025-10-08T17:34:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/","url":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/","name":"AVI - REST","isPartOf":{"@id":"https:\/\/www.serviceobjects.com\/docs\/#website"},"datePublished":"2022-11-08T22:50:21+00:00","dateModified":"2025-10-08T17:34:39+00:00","description":"C#PythonNodeJS Address Validation International C# Rest Code Snippet namespace address_validation_international_dot_net.REST { \/\/\/ &lt;summary> \/\/\/","breadcrumb":{"@id":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/avi-rest\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.serviceobjects.com\/docs\/"},{"@type":"ListItem","position":2,"name":"DOTS Address Validation &#8211; International","item":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/"},{"@type":"ListItem","position":3,"name":"AVI &#8211; Code Snippets and Sample Code","item":"https:\/\/www.serviceobjects.com\/docs\/dots-address-validation-international\/avi-code-snippets-and-sample-code\/"},{"@type":"ListItem","position":4,"name":"AVI &#8211; REST"}]},{"@type":"WebSite","@id":"https:\/\/www.serviceobjects.com\/docs\/#website","url":"https:\/\/www.serviceobjects.com\/docs\/","name":"Service Objects | Contact, Phone, Email Verification | Data Quality Services","description":"","publisher":{"@id":"https:\/\/www.serviceobjects.com\/docs\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.serviceobjects.com\/docs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.serviceobjects.com\/docs\/#organization","name":"Service Objects | Contact, Phone, Email Verification | Data Quality Services","url":"https:\/\/www.serviceobjects.com\/docs\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.serviceobjects.com\/docs\/#\/schema\/logo\/image\/","url":"https:\/\/www.serviceobjects.com\/docs\/wp-content\/uploads\/2022\/08\/SO-logo-2560px-transparent.png","contentUrl":"https:\/\/www.serviceobjects.com\/docs\/wp-content\/uploads\/2022\/08\/SO-logo-2560px-transparent.png","width":2560,"height":1440,"caption":"Service Objects | Contact, Phone, Email Verification | Data Quality Services"},"image":{"@id":"https:\/\/www.serviceobjects.com\/docs\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/pages\/2280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/comments?post=2280"}],"version-history":[{"count":6,"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/pages\/2280\/revisions"}],"predecessor-version":[{"id":12373,"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/pages\/2280\/revisions\/12373"}],"up":[{"embeddable":true,"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/pages\/2257"}],"wp:attachment":[{"href":"https:\/\/www.serviceobjects.com\/docs\/wp-json\/wp\/v2\/media?parent=2280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}