<?xml version="1.0"?>
<!-- WSDL for TowerData web services version 1.2 -->
<definitions name="TowerData" targetNamespace="urn:/Validate" xmlns:typens="urn:/Validate" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
  
  
  <types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="urn:/Validate">
      
      <!-- Request -->
      <xsd:element name="Validate" type="typens:ValidateType"/>

      <xsd:complexType name="ValidateType">
        <!-- elements under Validate -->
        <xsd:all>
          <xsd:element name="Parameters" minOccurs="0" maxOccurs="1" type="typens:ParametersType"/>
          <xsd:element name="Records" minOccurs="1" maxOccurs="1" type="typens:RecordsArrayType"/>
        </xsd:all>
        
        <!-- Attributes of Validate element -->
        <xsd:attribute name="login" type="typens:loginType" use="required">
          <xsd:annotation>
            <xsd:documentation>Client login</xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="password" type="typens:passwordType" use="required">
          <xsd:annotation>
            <xsd:documentation>Client password</xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="version" type="xsd:double" use="required">
          <xsd:annotation>
            <xsd:documentation>
              Version of the interface to use
            </xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="test" type="xsd:boolean" default="false">
          <xsd:annotation>
            <xsd:documentation>
              True if this is a test request
            </xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
        
      </xsd:complexType>
      
      <xsd:simpleType name="loginType">
        <xsd:restriction base="xsd:string">
          <xsd:minLength value="3"/>
        </xsd:restriction>
      </xsd:simpleType>
      
      <xsd:simpleType name="passwordType">
        <xsd:restriction base="xsd:string">
          <xsd:minLength value="6"/>
        </xsd:restriction>
      </xsd:simpleType>
      
      <xsd:complexType name="ParametersType">
        <xsd:all>
          <!-- elements under Parameters element -->
          <xsd:element name="email" minOccurs="0" maxOccurs="1" type="typens:ParamEmailType"/>
          <xsd:element name="phone" minOccurs="0" maxOccurs="1" type="typens:ParamPhoneType"/>
          <xsd:element name="timeout" minOccurs="0" maxOccurs="1" type="typens:TimeoutType"/>
        </xsd:all>
      </xsd:complexType>
      
      <xsd:complexType name="ParamEmailType">           
        <xsd:attribute name="validationLevel" type="typens:emailValidateLevelType" default="5"/>
        <xsd:attribute name="correct" type="xsd:boolean" default="false">
          <xsd:annotation>
            <xsd:documentation>
              True if email corrections are requested      
            </xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="maxCorrect" type="xsd:integer" default="10"/>
      </xsd:complexType>
      
      <xsd:complexType name="ParamPhoneType">           
        <xsd:attribute name="detailLevel" type="typens:phoneValidateLevelType" default="1"/>
      </xsd:complexType>
      
      <xsd:complexType name="RecordsArrayType">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="unbounded" name="Record" type="typens:RecordType"/>
        </xsd:sequence>
      </xsd:complexType>

      <xsd:simpleType name="TimeoutType">
        <xsd:restriction base="xsd:float">
          <xsd:minInclusive value="0.5"/>
          <xsd:maxInclusive value="300"/>
        </xsd:restriction>
      </xsd:simpleType>

      <xsd:complexType name="RecordType">

        <!-- elements under Record element -->
        <xsd:all>
          <xsd:element name="email" type="xsd:string" minOccurs="0" maxOccurs="1"/>
          <xsd:element name="phone" type="typens:RecordPhoneType" minOccurs="0" maxOccurs="1"/>
        </xsd:all>

        <!-- attribute of Record element -->
        <xsd:attribute name="rid" type="xsd:string" use="optional"/>
        
      </xsd:complexType>
      
      <xsd:complexType name="RecordPhoneType">
        <xsd:all>
          <xsd:element name="number" type="xsd:string" minOccurs="1" maxOccurs="1"/>
          <xsd:element name="extension" type="xsd:string" minOccurs="0" maxOccurs="1"/>
          
        </xsd:all>
      </xsd:complexType>
      
      <xsd:simpleType name="emailValidateLevelType">
        <xsd:restriction base="xsd:integer">
          <xsd:enumeration value="1">
            <xsd:annotation>
              <xsd:documentation>
                Check email syntax only
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="2">
            <xsd:annotation>
              <xsd:documentation>
                Check email syntax and if domain valid using the Domain Database
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="3">
            <xsd:annotation>
              <xsd:documentation>
                Check email syntax and if the domain exists in real-time
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="4">
            <xsd:annotation>
              <xsd:documentation>
                Check email syntax and if the domain receives email in real-time
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="5">
            <xsd:annotation>
              <xsd:documentation>
                Check email syntax, domain valid, and mailbox exists
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
        </xsd:restriction>
      </xsd:simpleType>

      <xsd:simpleType name="emailValidateResponseLevelType">
        <xsd:restriction base="xsd:integer">
          <xsd:enumeration value="0">
            <xsd:annotation>
              <xsd:documentation>
                Timeout occurred
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="1">
            <xsd:annotation>
              <xsd:documentation>
                Email syntax checked
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="2">
            <xsd:annotation>
              <xsd:documentation>
                Email syntax and domain checked using the Domain Database
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="3">
            <xsd:annotation>
              <xsd:documentation>
                Email syntax and domain checked in real-time
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="4">
            <xsd:annotation>
              <xsd:documentation>
                Email syntax and the domain checked to receive email in real-time
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="5">
            <xsd:annotation>
              <xsd:documentation>
                Email syntax, domain, and mailbox checked
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
        </xsd:restriction>
      </xsd:simpleType>
      
      <xsd:simpleType name="phoneValidateLevelType">
        <xsd:restriction base="xsd:integer">
          <xsd:enumeration value="1">
            <xsd:annotation>
              <xsd:documentation>
                Provide validation results
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="2">
            <xsd:annotation>
              <xsd:documentation>
                Provide validation results and time zone details
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
          <xsd:enumeration value="3">
            <xsd:annotation>
              <xsd:documentation>
                Provide validation results with time zone and location details
              </xsd:documentation>
            </xsd:annotation>
          </xsd:enumeration>
        </xsd:restriction>
      </xsd:simpleType>
      
      <!-- Reply -->
      <xsd:element name="ValidateResponse" type="typens:ValidateResponseType"/>
      
      <xsd:complexType name="ValidateResponseType">
        <xsd:all>
          <xsd:element name="Records" minOccurs="1" maxOccurs="1" type="typens:ResponseRecordsArrayType"/>
        </xsd:all>
      </xsd:complexType>
      
      <xsd:complexType name="ResponseRecordsArrayType">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="unbounded" name="Record" type="typens:ResponseRecordType"/>
        </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="ResponseRecordType">

        <xsd:all>
          <xsd:element name="email" minOccurs="0" maxOccurs="1" type="typens:ResponseEmailType"/>
          <xsd:element name="phone" minOccurs="0" maxOccurs="1" type="typens:ResponsePhoneType"/>
        </xsd:all>
        
        <!-- attribute of Record -->
        <xsd:attribute name="rid" type="xsd:string" use="required"/>
        
      </xsd:complexType>
      
      <xsd:complexType name="ResponseEmailType">

        <xsd:all>
          <xsd:element name="address" type="xsd:string" minOccurs="0"/>
          <xsd:element name="username" type="xsd:string" minOccurs="0"/>
          <xsd:element name="domain" type="xsd:string" minOccurs="0"/>
          <xsd:element name="status" type="typens:emailstatusType" minOccurs="1" maxOccurs="1"/>
          <xsd:element name="corrections" type="typens:correctionsType" minOccurs="0" maxOccurs="1"/>
        </xsd:all>

        <xsd:attribute name="validationLevel" use="required" type="typens:emailValidateResponseLevelType"/>
        <xsd:attribute name="ok" type="xsd:boolean" use="required"/>
        
      </xsd:complexType>
  
      <xsd:complexType name="emailstatusType">
        <xsd:simpleContent>
          <xsd:extension base="xsd:string">
            <xsd:attribute name="code" type="xsd:integer" use="required">
            <xsd:annotation>
              <xsd:documentation>
                  Code Values
                  5  - Validation timeout
                  10 - Syntax OK
                  20 - Syntax OK and domain valid according to the database
                  30 - Syntax OK and domain exists
                  40 - Syntax OK and domain can receive email
                  50 - Domain does not reject the mailbox
                  100 - General syntax error
                  110 - Invalid character in address
                  115 - Invalid domain syntax
                  120 - Invalid username syntax
                  125 - Invalid username syntax for that domain
                  130 - Address is too long
                  135 - Address has unbalanced parentheses, brackets, etc.
                  140 - Address does not have a username
                  145 - Address does not have a domain
                  150 - Address does not have an @ sign
                  155 - Address has more than one @ sign
                  200 - Invalid top-level-domain (TLD) in address
                  210 - Domain is an invalid IP address
                  215 - Unquoted spaces are not allowed in email addresses
                  310 - Domain does not exist
                  315 - Domain does not have a valid IP address
                  325 - Domain can not receive email
                  400 - Mailbox does not exist
                  410 - Mailbox is full and can not receive email
                  420 - Mail is not accepted for this domain
                  500 - Warning: Suspicious username
                  505 - Warning: Suspicious domain
                  510 - Warning: Suspicious email address
              </xsd:documentation>
            </xsd:annotation>
            </xsd:attribute>
          </xsd:extension>
        </xsd:simpleContent>
      </xsd:complexType>
      
      <xsd:complexType name="correctionsType">
        <xsd:all>
          <xsd:element name="address" type="typens:CorrectionsAddressType" minOccurs="0"/>
        </xsd:all>
      </xsd:complexType>
      
      <xsd:complexType name="CorrectionsAddressType">
        <xsd:simpleContent>
          <xsd:extension base="xsd:string">
            <xsd:attribute name="cid" type="xsd:integer" use="required"/>
          </xsd:extension>
        </xsd:simpleContent>
      </xsd:complexType>
    
      <xsd:complexType name="ResponsePhoneType">
        
        <xsd:all>
          <xsd:element name="number" type="xsd:string" minOccurs="1"/>
          <xsd:element name="extension" type="xsd:string" minOccurs="1"/>
          <xsd:element name="status" type="typens:phonestatusType" minOccurs="1" maxOccurs="1"/>
          <xsd:element name="messages" type="typens:phonemessagesType" minOccurs="0" maxOccurs="1"/>
          <xsd:element name="new_npa" type="xsd:string" minOccurs="1"/>
          <xsd:element name="timezone" type="xsd:string" minOccurs="0"/>
          <xsd:element name="observes_dst" type="xsd:string" minOccurs="0"/>
          <xsd:element name="country" type="xsd:string" minOccurs="0"/>
          <xsd:element name="state" type="xsd:string" minOccurs="0"/>
          <xsd:element name="latitude" type="xsd:float" minOccurs="0"/>
          <xsd:element name="longitude" type="xsd:float" minOccurs="0"/>
          <xsd:element name="county" type="xsd:string" minOccurs="0"/>
          <xsd:element name="city" type="xsd:string" minOccurs="0"/>
        </xsd:all>

        <xsd:attribute name="detailLevel" use="required" type="typens:phoneValidateLevelType"/>
        <xsd:attribute name="ok" type="xsd:boolean" use="required"/>
      </xsd:complexType>
      
      <xsd:complexType name="phonestatusType">
        <xsd:simpleContent>
          <xsd:extension base="xsd:string">
            <xsd:attribute name="code" type="xsd:integer">
            <xsd:annotation>
              <xsd:documentation>
                Code Values
                5   - Validation timeout
                10  - Valid area code and exchange
                100 - Invalid exchange for area code
                110 - Invalid area code and exchange
                120 - Too few digits
                130 - Too many digits
                140 - Extension is greater than 5 digits in length
                150 - Toll free number
                160 - 900 toll number
              </xsd:documentation>
            </xsd:annotation>
            </xsd:attribute>
          </xsd:extension>
        </xsd:simpleContent>
      </xsd:complexType>
      
      <xsd:complexType name="phonemessagesType">
        <xsd:all>
          <xsd:element name="message" type="typens:phonemessageType" minOccurs="1"/>
        </xsd:all>
      </xsd:complexType>
      
      <xsd:complexType name="phonemessageType">
        <xsd:simpleContent>
          <xsd:extension base="xsd:string">
            <xsd:attribute name="code" type="xsd:integer">
            <xsd:annotation>
              <xsd:documentation>
                Code Values
                140 - Extension is greater than 5 digits in length
                150 - Toll free number
                160 - 900 toll number
              </xsd:documentation>
            </xsd:annotation>
            </xsd:attribute>
          </xsd:extension>
        </xsd:simpleContent>
      </xsd:complexType>
      
      <!-- Fault -->
      <xsd:complexType name="Fault">
        <xsd:all>
          <xsd:element name="code" type="xsd:integer">
            <xsd:annotation>
              <xsd:documentation>
                600 - Bad request
                610 - Unauthorized
                615 - Invalid IP
                620 - Method not allowed
                700 - Internal server error
                710 - Service unavailable
                720 - Interface version not supported
                730 - Configuration file error
              </xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="description" type="xsd:string"/>
        </xsd:all>
      </xsd:complexType>
      
    </xsd:schema>
  </types>
  
  <message name="ValidateRequest">
    <part name="request" element="typens:Validate"/>
  </message>
  
  <message name="ValidateResponse">
    <part name="response" element="typens:ValidateResponse"/>
  </message>
  
  <message name="Fault">
    <part name="fault" type="typens:Fault"/>
  </message>
  
  <portType name="TowerDataPort">
    <operation name="Validate">
      <input message="typens:ValidateRequest"/>
      <output message="typens:ValidateResponse"/>
      <fault name="Fault" message="typens:Fault"/>
    </operation>
  </portType>
  
  <binding name="TowerDataBinding" type="typens:TowerDataPort">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    
    <operation name="Validate">
      <soap:operation soapAction="urn:/Validate#Validate"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
      <soap:fault name="Fault"/>
    </operation>
  </binding>
  
  <service name="TowerDataService">
    <port name="TowerDataPort" binding="typens:TowerDataBinding">
      <soap:address location="http://soap.towerdata.com/SOAP"/>
    </port>
  </service>
  
</definitions>
