values() {
+ return ENUM_SUPPORT.values();
+ }
+
+ public static LookupFeatureType from(String value) {
+ return ENUM_SUPPORT.from(value);
+ }
+
+ public static String valueOf(LookupFeatureType e) {
+ return ENUM_SUPPORT.valueOf(e);
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java
new file mode 100644
index 000000000..94d358a3b
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequest.java
@@ -0,0 +1,89 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.List;
+
+/** NumberLookupRequest */
+@JsonDeserialize(builder = NumberLookupRequestImpl.Builder.class)
+public interface NumberLookupRequest {
+
+ /**
+ * MSISDN in E.164 format to query.
+ *
+ * Field is required
+ *
+ * @return number
+ */
+ String getNumber();
+
+ /**
+ * Contains requested features. Fallback to LineType if not provided.
+ *
+ * @return features
+ */
+ List getFeatures();
+
+ /**
+ * Required when RND feature is requested.
+ *
+ * @return rndFeatureOptions
+ */
+ RndFeatureOptions getRndFeatureOptions();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new NumberLookupRequestImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param number see getter
+ * @return Current builder
+ * @see #getNumber
+ */
+ Builder setNumber(String number);
+
+ /**
+ * see getter
+ *
+ * @param features see getter
+ * @return Current builder
+ * @see #getFeatures
+ */
+ Builder setFeatures(List features);
+
+ /**
+ * see getter
+ *
+ * @param rndFeatureOptions see getter
+ * @return Current builder
+ * @see #getRndFeatureOptions
+ */
+ Builder setRndFeatureOptions(RndFeatureOptions rndFeatureOptions);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ NumberLookupRequest build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java
new file mode 100644
index 000000000..53a6f397b
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestImpl.java
@@ -0,0 +1,148 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import java.util.List;
+import java.util.Objects;
+
+@JsonPropertyOrder({
+ NumberLookupRequestImpl.JSON_PROPERTY_NUMBER,
+ NumberLookupRequestImpl.JSON_PROPERTY_FEATURES,
+ NumberLookupRequestImpl.JSON_PROPERTY_RND_FEATURE_OPTIONS
+})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class NumberLookupRequestImpl implements NumberLookupRequest {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_NUMBER = "number";
+
+ private OptionalValue number;
+
+ public static final String JSON_PROPERTY_FEATURES = "features";
+
+ private OptionalValue> features;
+
+ public static final String JSON_PROPERTY_RND_FEATURE_OPTIONS = "rndFeatureOptions";
+
+ private OptionalValue rndFeatureOptions;
+
+ public NumberLookupRequestImpl() {}
+
+ protected NumberLookupRequestImpl(
+ OptionalValue number,
+ OptionalValue> features,
+ OptionalValue rndFeatureOptions) {
+ this.number = number;
+ this.features = features;
+ this.rndFeatureOptions = rndFeatureOptions;
+ }
+
+ @JsonIgnore
+ public String getNumber() {
+ return number.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_NUMBER)
+ @JsonInclude(value = JsonInclude.Include.ALWAYS)
+ public OptionalValue number() {
+ return number;
+ }
+
+ @JsonIgnore
+ public List getFeatures() {
+ return features.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_FEATURES)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue> features() {
+ return features;
+ }
+
+ @JsonIgnore
+ public RndFeatureOptions getRndFeatureOptions() {
+ return rndFeatureOptions.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_RND_FEATURE_OPTIONS)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue rndFeatureOptions() {
+ return rndFeatureOptions;
+ }
+
+ /** Return true if this NumberLookupRequest object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ NumberLookupRequestImpl numberLookupRequest = (NumberLookupRequestImpl) o;
+ return Objects.equals(this.number, numberLookupRequest.number)
+ && Objects.equals(this.features, numberLookupRequest.features)
+ && Objects.equals(this.rndFeatureOptions, numberLookupRequest.rndFeatureOptions);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(number, features, rndFeatureOptions);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class NumberLookupRequestImpl {\n");
+ sb.append(" number: ").append(toIndentedString(number)).append("\n");
+ sb.append(" features: ").append(toIndentedString(features)).append("\n");
+ sb.append(" rndFeatureOptions: ").append(toIndentedString(rndFeatureOptions)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements NumberLookupRequest.Builder {
+ OptionalValue number = OptionalValue.empty();
+ OptionalValue> features = OptionalValue.empty();
+ OptionalValue rndFeatureOptions = OptionalValue.empty();
+
+ @JsonProperty(value = JSON_PROPERTY_NUMBER, required = true)
+ public Builder setNumber(String number) {
+ this.number = OptionalValue.of(number);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_FEATURES)
+ public Builder setFeatures(List features) {
+ this.features = OptionalValue.of(features);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_RND_FEATURE_OPTIONS)
+ public Builder setRndFeatureOptions(RndFeatureOptions rndFeatureOptions) {
+ this.rndFeatureOptions = OptionalValue.of(rndFeatureOptions);
+ return this;
+ }
+
+ public NumberLookupRequest build() {
+ return new NumberLookupRequestImpl(number, features, rndFeatureOptions);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java
new file mode 100644
index 000000000..0c120d1ec
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptions.java
@@ -0,0 +1,55 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.time.LocalDate;
+
+/** RndFeatureOptions */
+@JsonDeserialize(builder = RndFeatureOptionsImpl.Builder.class)
+public interface RndFeatureOptions {
+
+ /**
+ * Last contact date in YYYY-MM-DD format.
+ *
+ * @return contactDate
+ */
+ LocalDate getContactDate();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new RndFeatureOptionsImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param contactDate see getter
+ * @return Current builder
+ * @see #getContactDate
+ */
+ Builder setContactDate(LocalDate contactDate);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ RndFeatureOptions build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java
new file mode 100644
index 000000000..e4c1856b8
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsImpl.java
@@ -0,0 +1,91 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import java.time.LocalDate;
+import java.util.Objects;
+
+@JsonPropertyOrder({RndFeatureOptionsImpl.JSON_PROPERTY_CONTACT_DATE})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class RndFeatureOptionsImpl implements RndFeatureOptions {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_CONTACT_DATE = "contactDate";
+
+ private OptionalValue contactDate;
+
+ public RndFeatureOptionsImpl() {}
+
+ protected RndFeatureOptionsImpl(OptionalValue contactDate) {
+ this.contactDate = contactDate;
+ }
+
+ @JsonIgnore
+ public LocalDate getContactDate() {
+ return contactDate.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_CONTACT_DATE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue contactDate() {
+ return contactDate;
+ }
+
+ /** Return true if this RndFeatureOptions object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RndFeatureOptionsImpl rndFeatureOptions = (RndFeatureOptionsImpl) o;
+ return Objects.equals(this.contactDate, rndFeatureOptions.contactDate);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(contactDate);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class RndFeatureOptionsImpl {\n");
+ sb.append(" contactDate: ").append(toIndentedString(contactDate)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements RndFeatureOptions.Builder {
+ OptionalValue contactDate = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_CONTACT_DATE)
+ public Builder setContactDate(LocalDate contactDate) {
+ this.contactDate = OptionalValue.of(contactDate);
+ return this;
+ }
+
+ public RndFeatureOptions build() {
+ return new RndFeatureOptionsImpl(contactDate);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java
new file mode 100644
index 000000000..183787d36
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Line.java
@@ -0,0 +1,156 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import java.time.Instant;
+
+/** Line */
+@JsonDeserialize(builder = LineImpl.Builder.class)
+public interface Line {
+
+ /**
+ * Name of the carrier.
+ *
+ * @return carrier
+ */
+ String getCarrier();
+
+ /**
+ * Number type e.g. wireless, mobile, fixed.
+ *
+ * @return type
+ */
+ LineType getType();
+
+ /**
+ * A numeric code (MCC) that uniquely identifies a country within the international
+ * telecommunications network.
+ *
+ * @return mobileCountryCode
+ */
+ String getMobileCountryCode();
+
+ /**
+ * A distinct identifier assigned to a mobile network operator within a specific country, used in
+ * combination with MCC.
+ *
+ * @return mobileNetworkCode
+ */
+ String getMobileNetworkCode();
+
+ /**
+ * Indicates if a phone number has been transferred from its original network to a different
+ * provider.
+ *
+ * @return ported
+ */
+ Boolean getPorted();
+
+ /**
+ * Specifies the date, in ISO 8601 format, when a phone number was transferred from its original
+ * network to a new provider.
+ *
+ * @return portingDate
+ */
+ Instant getPortingDate();
+
+ /**
+ * Get error
+ *
+ * @return error
+ */
+ LookupError getError();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new LineImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param carrier see getter
+ * @return Current builder
+ * @see #getCarrier
+ */
+ Builder setCarrier(String carrier);
+
+ /**
+ * see getter
+ *
+ * @param type see getter
+ * @return Current builder
+ * @see #getType
+ */
+ Builder setType(LineType type);
+
+ /**
+ * see getter
+ *
+ * @param mobileCountryCode see getter
+ * @return Current builder
+ * @see #getMobileCountryCode
+ */
+ Builder setMobileCountryCode(String mobileCountryCode);
+
+ /**
+ * see getter
+ *
+ * @param mobileNetworkCode see getter
+ * @return Current builder
+ * @see #getMobileNetworkCode
+ */
+ Builder setMobileNetworkCode(String mobileNetworkCode);
+
+ /**
+ * see getter
+ *
+ * @param ported see getter
+ * @return Current builder
+ * @see #getPorted
+ */
+ Builder setPorted(Boolean ported);
+
+ /**
+ * see getter
+ *
+ * @param portingDate see getter
+ * @return Current builder
+ * @see #getPortingDate
+ */
+ Builder setPortingDate(Instant portingDate);
+
+ /**
+ * see getter
+ *
+ * @param error see getter
+ * @return Current builder
+ * @see #getError
+ */
+ Builder setError(LookupError error);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ Line build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java
new file mode 100644
index 000000000..0cf94544b
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineImpl.java
@@ -0,0 +1,259 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import java.time.Instant;
+import java.util.Objects;
+
+@JsonPropertyOrder({
+ LineImpl.JSON_PROPERTY_CARRIER,
+ LineImpl.JSON_PROPERTY_TYPE,
+ LineImpl.JSON_PROPERTY_MOBILE_COUNTRY_CODE,
+ LineImpl.JSON_PROPERTY_MOBILE_NETWORK_CODE,
+ LineImpl.JSON_PROPERTY_PORTED,
+ LineImpl.JSON_PROPERTY_PORTING_DATE,
+ LineImpl.JSON_PROPERTY_ERROR
+})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class LineImpl implements Line {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_CARRIER = "carrier";
+
+ private OptionalValue carrier;
+
+ public static final String JSON_PROPERTY_TYPE = "type";
+
+ private OptionalValue type;
+
+ public static final String JSON_PROPERTY_MOBILE_COUNTRY_CODE = "mobileCountryCode";
+
+ private OptionalValue mobileCountryCode;
+
+ public static final String JSON_PROPERTY_MOBILE_NETWORK_CODE = "mobileNetworkCode";
+
+ private OptionalValue mobileNetworkCode;
+
+ public static final String JSON_PROPERTY_PORTED = "ported";
+
+ private OptionalValue ported;
+
+ public static final String JSON_PROPERTY_PORTING_DATE = "portingDate";
+
+ private OptionalValue portingDate;
+
+ public static final String JSON_PROPERTY_ERROR = "error";
+
+ private OptionalValue error;
+
+ public LineImpl() {}
+
+ protected LineImpl(
+ OptionalValue carrier,
+ OptionalValue type,
+ OptionalValue mobileCountryCode,
+ OptionalValue mobileNetworkCode,
+ OptionalValue ported,
+ OptionalValue portingDate,
+ OptionalValue error) {
+ this.carrier = carrier;
+ this.type = type;
+ this.mobileCountryCode = mobileCountryCode;
+ this.mobileNetworkCode = mobileNetworkCode;
+ this.ported = ported;
+ this.portingDate = portingDate;
+ this.error = error;
+ }
+
+ @JsonIgnore
+ public String getCarrier() {
+ return carrier.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_CARRIER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue carrier() {
+ return carrier;
+ }
+
+ @JsonIgnore
+ public LineType getType() {
+ return type.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_TYPE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue type() {
+ return type;
+ }
+
+ @JsonIgnore
+ public String getMobileCountryCode() {
+ return mobileCountryCode.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_MOBILE_COUNTRY_CODE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue mobileCountryCode() {
+ return mobileCountryCode;
+ }
+
+ @JsonIgnore
+ public String getMobileNetworkCode() {
+ return mobileNetworkCode.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_MOBILE_NETWORK_CODE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue mobileNetworkCode() {
+ return mobileNetworkCode;
+ }
+
+ @JsonIgnore
+ public Boolean getPorted() {
+ return ported.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_PORTED)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue ported() {
+ return ported;
+ }
+
+ @JsonIgnore
+ public Instant getPortingDate() {
+ return portingDate.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_PORTING_DATE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue portingDate() {
+ return portingDate;
+ }
+
+ @JsonIgnore
+ public LookupError getError() {
+ return error.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue error() {
+ return error;
+ }
+
+ /** Return true if this LineResponse object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LineImpl lineResponse = (LineImpl) o;
+ return Objects.equals(this.carrier, lineResponse.carrier)
+ && Objects.equals(this.type, lineResponse.type)
+ && Objects.equals(this.mobileCountryCode, lineResponse.mobileCountryCode)
+ && Objects.equals(this.mobileNetworkCode, lineResponse.mobileNetworkCode)
+ && Objects.equals(this.ported, lineResponse.ported)
+ && Objects.equals(this.portingDate, lineResponse.portingDate)
+ && Objects.equals(this.error, lineResponse.error);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ carrier, type, mobileCountryCode, mobileNetworkCode, ported, portingDate, error);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class LineImpl {\n");
+ sb.append(" carrier: ").append(toIndentedString(carrier)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" mobileCountryCode: ").append(toIndentedString(mobileCountryCode)).append("\n");
+ sb.append(" mobileNetworkCode: ").append(toIndentedString(mobileNetworkCode)).append("\n");
+ sb.append(" ported: ").append(toIndentedString(ported)).append("\n");
+ sb.append(" portingDate: ").append(toIndentedString(portingDate)).append("\n");
+ sb.append(" error: ").append(toIndentedString(error)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements Line.Builder {
+ OptionalValue carrier = OptionalValue.empty();
+ OptionalValue type = OptionalValue.empty();
+ OptionalValue mobileCountryCode = OptionalValue.empty();
+ OptionalValue mobileNetworkCode = OptionalValue.empty();
+ OptionalValue ported = OptionalValue.empty();
+ OptionalValue portingDate = OptionalValue.empty();
+ OptionalValue error = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_CARRIER)
+ public Builder setCarrier(String carrier) {
+ this.carrier = OptionalValue.of(carrier);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_TYPE)
+ public Builder setType(LineType type) {
+ this.type = OptionalValue.of(type);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_MOBILE_COUNTRY_CODE)
+ public Builder setMobileCountryCode(String mobileCountryCode) {
+ this.mobileCountryCode = OptionalValue.of(mobileCountryCode);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_MOBILE_NETWORK_CODE)
+ public Builder setMobileNetworkCode(String mobileNetworkCode) {
+ this.mobileNetworkCode = OptionalValue.of(mobileNetworkCode);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_PORTED)
+ public Builder setPorted(Boolean ported) {
+ this.ported = OptionalValue.of(ported);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_PORTING_DATE)
+ public Builder setPortingDate(Instant portingDate) {
+ this.portingDate = OptionalValue.of(portingDate);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ public Builder setError(LookupError error) {
+ this.error = OptionalValue.of(error);
+ return this;
+ }
+
+ public Line build() {
+ return new LineImpl(
+ carrier, type, mobileCountryCode, mobileNetworkCode, ported, portingDate, error);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java
new file mode 100644
index 000000000..7dc2cc9f4
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/LineType.java
@@ -0,0 +1,50 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.sinch.sdk.core.utils.EnumDynamic;
+import com.sinch.sdk.core.utils.EnumSupportDynamic;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/** Represents the type of a phone line. */
+public class LineType extends EnumDynamic {
+
+ /** A landline phone number. */
+ public static final LineType LANDLINE = new LineType("Landline");
+
+ /** A mobile network phone number. */
+ public static final LineType MOBILE = new LineType("Mobile");
+
+ /** A Voice over IP phone number. */
+ public static final LineType VO_IP = new LineType("VoIP");
+
+ /** A specialty type of number, such as a satellite phone or fax line. */
+ public static final LineType SPECIAL = new LineType("Special");
+
+ /** A freephone type phone number. */
+ public static final LineType FREEPHONE = new LineType("Freephone");
+
+ /** Another type. */
+ public static final LineType OTHER = new LineType("Other");
+
+ private static final EnumSupportDynamic ENUM_SUPPORT =
+ new EnumSupportDynamic<>(
+ LineType.class,
+ LineType::new,
+ Arrays.asList(LANDLINE, MOBILE, VO_IP, SPECIAL, FREEPHONE, OTHER));
+
+ private LineType(String value) {
+ super(value);
+ }
+
+ public static Stream values() {
+ return ENUM_SUPPORT.values();
+ }
+
+ public static LineType from(String value) {
+ return ENUM_SUPPORT.from(value);
+ }
+
+ public static String valueOf(LineType e) {
+ return ENUM_SUPPORT.valueOf(e);
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java
new file mode 100644
index 000000000..cf692ca44
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponse.java
@@ -0,0 +1,150 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+/** NumberLookupResponse */
+@JsonDeserialize(builder = NumberLookupResponseImpl.Builder.class)
+public interface NumberLookupResponse {
+
+ /**
+ * An object containing information about the line type of the number.
+ *
+ * @return line
+ */
+ Line getLine();
+
+ /**
+ * An object containing information about the SimSwap verification performed on the number.
+ *
+ * @return simSwap
+ */
+ SimSwap getSimSwap();
+
+ /**
+ * An object containing information about the VoIP detection performed on the number.
+ *
+ * @return voIPDetection
+ */
+ VoIPDetection getVoIPDetection();
+
+ /**
+ * An object containing information whether number is disconnected.
+ *
+ * @return rnd
+ */
+ Rnd getRnd();
+
+ /**
+ * ISO 3166-1 alpha-2 two-letter country identifier
+ *
+ * @return countryCode
+ */
+ String getCountryCode();
+
+ /**
+ * The identifier for a trace.
+ *
+ * @return traceId
+ */
+ String getTraceId();
+
+ /**
+ * Requested MSISDN in E.164 format.
+ *
+ * @return number
+ */
+ String getNumber();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new NumberLookupResponseImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param line see getter
+ * @return Current builder
+ * @see #getLine
+ */
+ Builder setLine(Line line);
+
+ /**
+ * see getter
+ *
+ * @param simSwap see getter
+ * @return Current builder
+ * @see #getSimSwap
+ */
+ Builder setSimSwap(SimSwap simSwap);
+
+ /**
+ * see getter
+ *
+ * @param voIPDetection see getter
+ * @return Current builder
+ * @see #getVoIPDetection
+ */
+ Builder setVoIPDetection(VoIPDetection voIPDetection);
+
+ /**
+ * see getter
+ *
+ * @param rnd see getter
+ * @return Current builder
+ * @see #getRnd
+ */
+ Builder setRnd(Rnd rnd);
+
+ /**
+ * see getter
+ *
+ * @param countryCode see getter
+ * @return Current builder
+ * @see #getCountryCode
+ */
+ Builder setCountryCode(String countryCode);
+
+ /**
+ * see getter
+ *
+ * @param traceId see getter
+ * @return Current builder
+ * @see #getTraceId
+ */
+ Builder setTraceId(String traceId);
+
+ /**
+ * see getter
+ *
+ * @param number see getter
+ * @return Current builder
+ * @see #getNumber
+ */
+ Builder setNumber(String number);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ NumberLookupResponse build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java
new file mode 100644
index 000000000..a7168f17e
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseImpl.java
@@ -0,0 +1,256 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import java.util.Objects;
+
+@JsonPropertyOrder({
+ NumberLookupResponseImpl.JSON_PROPERTY_LINE,
+ NumberLookupResponseImpl.JSON_PROPERTY_SIM_SWAP,
+ NumberLookupResponseImpl.JSON_PROPERTY_VO_I_P_DETECTION,
+ NumberLookupResponseImpl.JSON_PROPERTY_RND,
+ NumberLookupResponseImpl.JSON_PROPERTY_COUNTRY_CODE,
+ NumberLookupResponseImpl.JSON_PROPERTY_TRACE_ID,
+ NumberLookupResponseImpl.JSON_PROPERTY_NUMBER
+})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class NumberLookupResponseImpl implements NumberLookupResponse {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_LINE = "line";
+
+ private OptionalValue line;
+
+ public static final String JSON_PROPERTY_SIM_SWAP = "simSwap";
+
+ private OptionalValue simSwap;
+
+ public static final String JSON_PROPERTY_VO_I_P_DETECTION = "voIPDetection";
+
+ private OptionalValue voIPDetection;
+
+ public static final String JSON_PROPERTY_RND = "rnd";
+
+ private OptionalValue rnd;
+
+ public static final String JSON_PROPERTY_COUNTRY_CODE = "countryCode";
+
+ private OptionalValue countryCode;
+
+ public static final String JSON_PROPERTY_TRACE_ID = "traceId";
+
+ private OptionalValue traceId;
+
+ public static final String JSON_PROPERTY_NUMBER = "number";
+
+ private OptionalValue number;
+
+ public NumberLookupResponseImpl() {}
+
+ protected NumberLookupResponseImpl(
+ OptionalValue line,
+ OptionalValue simSwap,
+ OptionalValue voIPDetection,
+ OptionalValue rnd,
+ OptionalValue countryCode,
+ OptionalValue traceId,
+ OptionalValue number) {
+ this.line = line;
+ this.simSwap = simSwap;
+ this.voIPDetection = voIPDetection;
+ this.rnd = rnd;
+ this.countryCode = countryCode;
+ this.traceId = traceId;
+ this.number = number;
+ }
+
+ @JsonIgnore
+ public Line getLine() {
+ return line.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_LINE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue line() {
+ return line;
+ }
+
+ @JsonIgnore
+ public SimSwap getSimSwap() {
+ return simSwap.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_SIM_SWAP)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue simSwap() {
+ return simSwap;
+ }
+
+ @JsonIgnore
+ public VoIPDetection getVoIPDetection() {
+ return voIPDetection.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_VO_I_P_DETECTION)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue voIPDetection() {
+ return voIPDetection;
+ }
+
+ @JsonIgnore
+ public Rnd getRnd() {
+ return rnd.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_RND)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue rnd() {
+ return rnd;
+ }
+
+ @JsonIgnore
+ public String getCountryCode() {
+ return countryCode.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_COUNTRY_CODE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue countryCode() {
+ return countryCode;
+ }
+
+ @JsonIgnore
+ public String getTraceId() {
+ return traceId.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_TRACE_ID)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue traceId() {
+ return traceId;
+ }
+
+ @JsonIgnore
+ public String getNumber() {
+ return number.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_NUMBER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue number() {
+ return number;
+ }
+
+ /** Return true if this NumberLookupResponse object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ NumberLookupResponseImpl numberLookupResponse = (NumberLookupResponseImpl) o;
+ return Objects.equals(this.line, numberLookupResponse.line)
+ && Objects.equals(this.simSwap, numberLookupResponse.simSwap)
+ && Objects.equals(this.voIPDetection, numberLookupResponse.voIPDetection)
+ && Objects.equals(this.rnd, numberLookupResponse.rnd)
+ && Objects.equals(this.countryCode, numberLookupResponse.countryCode)
+ && Objects.equals(this.traceId, numberLookupResponse.traceId)
+ && Objects.equals(this.number, numberLookupResponse.number);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(line, simSwap, voIPDetection, rnd, countryCode, traceId, number);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class NumberLookupResponseImpl {\n");
+ sb.append(" line: ").append(toIndentedString(line)).append("\n");
+ sb.append(" simSwap: ").append(toIndentedString(simSwap)).append("\n");
+ sb.append(" voIPDetection: ").append(toIndentedString(voIPDetection)).append("\n");
+ sb.append(" rnd: ").append(toIndentedString(rnd)).append("\n");
+ sb.append(" countryCode: ").append(toIndentedString(countryCode)).append("\n");
+ sb.append(" traceId: ").append(toIndentedString(traceId)).append("\n");
+ sb.append(" number: ").append(toIndentedString(number)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements NumberLookupResponse.Builder {
+ OptionalValue line = OptionalValue.empty();
+ OptionalValue simSwap = OptionalValue.empty();
+ OptionalValue voIPDetection = OptionalValue.empty();
+ OptionalValue rnd = OptionalValue.empty();
+ OptionalValue countryCode = OptionalValue.empty();
+ OptionalValue traceId = OptionalValue.empty();
+ OptionalValue number = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_LINE)
+ public Builder setLine(Line line) {
+ this.line = OptionalValue.of(line);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_SIM_SWAP)
+ public Builder setSimSwap(SimSwap simSwap) {
+ this.simSwap = OptionalValue.of(simSwap);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_VO_I_P_DETECTION)
+ public Builder setVoIPDetection(VoIPDetection voIPDetection) {
+ this.voIPDetection = OptionalValue.of(voIPDetection);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_RND)
+ public Builder setRnd(Rnd rnd) {
+ this.rnd = OptionalValue.of(rnd);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_COUNTRY_CODE)
+ public Builder setCountryCode(String countryCode) {
+ this.countryCode = OptionalValue.of(countryCode);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_TRACE_ID)
+ public Builder setTraceId(String traceId) {
+ this.traceId = OptionalValue.of(traceId);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_NUMBER)
+ public Builder setNumber(String number) {
+ this.number = OptionalValue.of(number);
+ return this;
+ }
+
+ public NumberLookupResponse build() {
+ return new NumberLookupResponseImpl(
+ line, simSwap, voIPDetection, rnd, countryCode, traceId, number);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java
new file mode 100644
index 000000000..28dfb1be8
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/Rnd.java
@@ -0,0 +1,71 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+
+/** Rnd */
+@JsonDeserialize(builder = RndImpl.Builder.class)
+public interface Rnd {
+
+ /**
+ * Provides information whether the number was disconnected after provided last contact date.
+ *
+ * @return disconnected
+ */
+ Boolean getDisconnected();
+
+ /**
+ * Get error
+ *
+ * @return error
+ */
+ LookupError getError();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new RndImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param disconnected see getter
+ * @return Current builder
+ * @see #getDisconnected
+ */
+ Builder setDisconnected(Boolean disconnected);
+
+ /**
+ * see getter
+ *
+ * @param error see getter
+ * @return Current builder
+ * @see #getError
+ */
+ Builder setError(LookupError error);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ Rnd build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java
new file mode 100644
index 000000000..5b8d83a71
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/RndImpl.java
@@ -0,0 +1,116 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import java.util.Objects;
+
+@JsonPropertyOrder({RndImpl.JSON_PROPERTY_DISCONNECTED, RndImpl.JSON_PROPERTY_ERROR})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class RndImpl implements Rnd {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_DISCONNECTED = "disconnected";
+
+ private OptionalValue disconnected;
+
+ public static final String JSON_PROPERTY_ERROR = "error";
+
+ private OptionalValue error;
+
+ public RndImpl() {}
+
+ protected RndImpl(OptionalValue disconnected, OptionalValue error) {
+ this.disconnected = disconnected;
+ this.error = error;
+ }
+
+ @JsonIgnore
+ public Boolean getDisconnected() {
+ return disconnected.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_DISCONNECTED)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue disconnected() {
+ return disconnected;
+ }
+
+ @JsonIgnore
+ public LookupError getError() {
+ return error.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue error() {
+ return error;
+ }
+
+ /** Return true if this RndResponse object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RndImpl rndResponse = (RndImpl) o;
+ return Objects.equals(this.disconnected, rndResponse.disconnected)
+ && Objects.equals(this.error, rndResponse.error);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(disconnected, error);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class RndImpl {\n");
+ sb.append(" disconnected: ").append(toIndentedString(disconnected)).append("\n");
+ sb.append(" error: ").append(toIndentedString(error)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements Rnd.Builder {
+ OptionalValue disconnected = OptionalValue.empty();
+ OptionalValue error = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_DISCONNECTED)
+ public Builder setDisconnected(Boolean disconnected) {
+ this.disconnected = OptionalValue.of(disconnected);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ public Builder setError(LookupError error) {
+ this.error = OptionalValue.of(error);
+ return this;
+ }
+
+ public Rnd build() {
+ return new RndImpl(disconnected, error);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java
new file mode 100644
index 000000000..ad7872612
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwap.java
@@ -0,0 +1,87 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+
+/** SimSwap */
+@JsonDeserialize(builder = SimSwapImpl.Builder.class)
+public interface SimSwap {
+
+ /**
+ * Indicates whether SIM was changed.
+ *
+ * @return swapped
+ */
+ Boolean getSwapped();
+
+ /**
+ * Threshold for sim swap check.
+ *
+ * @return swapPeriod
+ */
+ SwapPeriodType getSwapPeriod();
+
+ /**
+ * Get error
+ *
+ * @return error
+ */
+ LookupError getError();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new SimSwapImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param swapped see getter
+ * @return Current builder
+ * @see #getSwapped
+ */
+ Builder setSwapped(Boolean swapped);
+
+ /**
+ * see getter
+ *
+ * @param swapPeriod see getter
+ * @return Current builder
+ * @see #getSwapPeriod
+ */
+ Builder setSwapPeriod(SwapPeriodType swapPeriod);
+
+ /**
+ * see getter
+ *
+ * @param error see getter
+ * @return Current builder
+ * @see #getError
+ */
+ Builder setError(LookupError error);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ SimSwap build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java
new file mode 100644
index 000000000..e0ab9aab4
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapImpl.java
@@ -0,0 +1,148 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import java.util.Objects;
+
+@JsonPropertyOrder({
+ SimSwapImpl.JSON_PROPERTY_SWAPPED,
+ SimSwapImpl.JSON_PROPERTY_SWAP_PERIOD,
+ SimSwapImpl.JSON_PROPERTY_ERROR
+})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class SimSwapImpl implements SimSwap {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_SWAPPED = "swapped";
+
+ private OptionalValue swapped;
+
+ public static final String JSON_PROPERTY_SWAP_PERIOD = "swapPeriod";
+
+ private OptionalValue swapPeriod;
+
+ public static final String JSON_PROPERTY_ERROR = "error";
+
+ private OptionalValue error;
+
+ public SimSwapImpl() {}
+
+ protected SimSwapImpl(
+ OptionalValue swapped,
+ OptionalValue swapPeriod,
+ OptionalValue error) {
+ this.swapped = swapped;
+ this.swapPeriod = swapPeriod;
+ this.error = error;
+ }
+
+ @JsonIgnore
+ public Boolean getSwapped() {
+ return swapped.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_SWAPPED)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue swapped() {
+ return swapped;
+ }
+
+ @JsonIgnore
+ public SwapPeriodType getSwapPeriod() {
+ return swapPeriod.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_SWAP_PERIOD)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue swapPeriod() {
+ return swapPeriod;
+ }
+
+ @JsonIgnore
+ public LookupError getError() {
+ return error.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue error() {
+ return error;
+ }
+
+ /** Return true if this SimSwapResponse object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ SimSwapImpl simSwapResponse = (SimSwapImpl) o;
+ return Objects.equals(this.swapped, simSwapResponse.swapped)
+ && Objects.equals(this.swapPeriod, simSwapResponse.swapPeriod)
+ && Objects.equals(this.error, simSwapResponse.error);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(swapped, swapPeriod, error);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class SimSwapImpl {\n");
+ sb.append(" swapped: ").append(toIndentedString(swapped)).append("\n");
+ sb.append(" swapPeriod: ").append(toIndentedString(swapPeriod)).append("\n");
+ sb.append(" error: ").append(toIndentedString(error)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements SimSwap.Builder {
+ OptionalValue swapped = OptionalValue.empty();
+ OptionalValue swapPeriod = OptionalValue.empty();
+ OptionalValue error = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_SWAPPED)
+ public Builder setSwapped(Boolean swapped) {
+ this.swapped = OptionalValue.of(swapped);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_SWAP_PERIOD)
+ public Builder setSwapPeriod(SwapPeriodType swapPeriod) {
+ this.swapPeriod = OptionalValue.of(swapPeriod);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ public Builder setError(LookupError error) {
+ this.error = OptionalValue.of(error);
+ return this;
+ }
+
+ public SimSwap build() {
+ return new SimSwapImpl(swapped, swapPeriod, error);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java
new file mode 100644
index 000000000..c5a1de7b2
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/SwapPeriodType.java
@@ -0,0 +1,63 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.sinch.sdk.core.utils.EnumDynamic;
+import com.sinch.sdk.core.utils.EnumSupportDynamic;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/** */
+public class SwapPeriodType extends EnumDynamic {
+
+ /** Undefined */
+ public static final SwapPeriodType UNDEFINED = new SwapPeriodType("Undefined");
+
+ /** 4 Hours */
+ public static final SwapPeriodType SP4_H = new SwapPeriodType("SP4H");
+
+ /** 12 Hours */
+ public static final SwapPeriodType SP12_H = new SwapPeriodType("SP12H");
+
+ /** 24 Hours */
+ public static final SwapPeriodType SP24_H = new SwapPeriodType("SP24H");
+
+ /** 48 Hours */
+ public static final SwapPeriodType SP48_H = new SwapPeriodType("SP48H");
+
+ /** 5 Days */
+ public static final SwapPeriodType SP5_D = new SwapPeriodType("SP5D");
+
+ /** 7 Days */
+ public static final SwapPeriodType SP7_D = new SwapPeriodType("SP7D");
+
+ /** 14 Days */
+ public static final SwapPeriodType SP14_D = new SwapPeriodType("SP14D");
+
+ /** 30 Days */
+ public static final SwapPeriodType SP30_D = new SwapPeriodType("SP30D");
+
+ /** Maximum */
+ public static final SwapPeriodType SPMAX = new SwapPeriodType("SPMAX");
+
+ private static final EnumSupportDynamic ENUM_SUPPORT =
+ new EnumSupportDynamic<>(
+ SwapPeriodType.class,
+ SwapPeriodType::new,
+ Arrays.asList(
+ UNDEFINED, SP4_H, SP12_H, SP24_H, SP48_H, SP5_D, SP7_D, SP14_D, SP30_D, SPMAX));
+
+ private SwapPeriodType(String value) {
+ super(value);
+ }
+
+ public static Stream values() {
+ return ENUM_SUPPORT.values();
+ }
+
+ public static SwapPeriodType from(String value) {
+ return ENUM_SUPPORT.from(value);
+ }
+
+ public static String valueOf(SwapPeriodType e) {
+ return ENUM_SUPPORT.valueOf(e);
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java
new file mode 100644
index 000000000..f5814dc5c
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetection.java
@@ -0,0 +1,71 @@
+/*
+ * Number Lookup Api v2
+ *
+ * OpenAPI document version: 0.1.0
+ * Contact: support@sinch.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * Do not edit the class manually.
+ */
+
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+
+/** VoIPDetection */
+@JsonDeserialize(builder = VoIPDetectionImpl.Builder.class)
+public interface VoIPDetection {
+
+ /**
+ * Probability of number being VoIP based on the AI analysis.
+ *
+ * @return probability
+ */
+ VoIPProbabilityType getProbability();
+
+ /**
+ * Get error
+ *
+ * @return error
+ */
+ LookupError getError();
+
+ /**
+ * Getting builder
+ *
+ * @return New Builder instance
+ */
+ static Builder builder() {
+ return new VoIPDetectionImpl.Builder();
+ }
+
+ /** Dedicated Builder */
+ interface Builder {
+
+ /**
+ * see getter
+ *
+ * @param probability see getter
+ * @return Current builder
+ * @see #getProbability
+ */
+ Builder setProbability(VoIPProbabilityType probability);
+
+ /**
+ * see getter
+ *
+ * @param error see getter
+ * @return Current builder
+ * @see #getError
+ */
+ Builder setError(LookupError error);
+
+ /**
+ * Create instance
+ *
+ * @return The instance build with current builder values
+ */
+ VoIPDetection build();
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java
new file mode 100644
index 000000000..e6ebe85d9
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionImpl.java
@@ -0,0 +1,120 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.sinch.sdk.core.models.OptionalValue;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import java.util.Objects;
+
+@JsonPropertyOrder({
+ VoIPDetectionImpl.JSON_PROPERTY_PROBABILITY,
+ VoIPDetectionImpl.JSON_PROPERTY_ERROR
+})
+@JsonFilter("uninitializedFilter")
+@JsonInclude(value = JsonInclude.Include.CUSTOM)
+public class VoIPDetectionImpl implements VoIPDetection {
+ private static final long serialVersionUID = 1L;
+
+ public static final String JSON_PROPERTY_PROBABILITY = "probability";
+
+ private OptionalValue probability;
+
+ public static final String JSON_PROPERTY_ERROR = "error";
+
+ private OptionalValue error;
+
+ public VoIPDetectionImpl() {}
+
+ protected VoIPDetectionImpl(
+ OptionalValue probability, OptionalValue error) {
+ this.probability = probability;
+ this.error = error;
+ }
+
+ @JsonIgnore
+ public VoIPProbabilityType getProbability() {
+ return probability.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_PROBABILITY)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue probability() {
+ return probability;
+ }
+
+ @JsonIgnore
+ public LookupError getError() {
+ return error.orElse(null);
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public OptionalValue error() {
+ return error;
+ }
+
+ /** Return true if this VoIPDetectionResponse object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ VoIPDetectionImpl voIPDetectionResponse = (VoIPDetectionImpl) o;
+ return Objects.equals(this.probability, voIPDetectionResponse.probability)
+ && Objects.equals(this.error, voIPDetectionResponse.error);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(probability, error);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class VoIPDetectionImpl {\n");
+ sb.append(" probability: ").append(toIndentedString(probability)).append("\n");
+ sb.append(" error: ").append(toIndentedString(error)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ @JsonPOJOBuilder(withPrefix = "set")
+ static class Builder implements VoIPDetection.Builder {
+ OptionalValue probability = OptionalValue.empty();
+ OptionalValue error = OptionalValue.empty();
+
+ @JsonProperty(JSON_PROPERTY_PROBABILITY)
+ public Builder setProbability(VoIPProbabilityType probability) {
+ this.probability = OptionalValue.of(probability);
+ return this;
+ }
+
+ @JsonProperty(JSON_PROPERTY_ERROR)
+ public Builder setError(LookupError error) {
+ this.error = OptionalValue.of(error);
+ return this;
+ }
+
+ public VoIPDetection build() {
+ return new VoIPDetectionImpl(probability, error);
+ }
+ }
+}
diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java
new file mode 100644
index 000000000..d6e81a332
--- /dev/null
+++ b/openapi-contracts/src/main/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPProbabilityType.java
@@ -0,0 +1,44 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.sinch.sdk.core.utils.EnumDynamic;
+import com.sinch.sdk.core.utils.EnumSupportDynamic;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/** */
+public class VoIPProbabilityType extends EnumDynamic {
+
+ /** Undefined */
+ public static final VoIPProbabilityType UNKNOWN = new VoIPProbabilityType("Unknown");
+
+ /** Low */
+ public static final VoIPProbabilityType LOW = new VoIPProbabilityType("Low");
+
+ /** Likely */
+ public static final VoIPProbabilityType LIKELY = new VoIPProbabilityType("Likely");
+
+ /** High */
+ public static final VoIPProbabilityType HIGH = new VoIPProbabilityType("High");
+
+ private static final EnumSupportDynamic ENUM_SUPPORT =
+ new EnumSupportDynamic<>(
+ VoIPProbabilityType.class,
+ VoIPProbabilityType::new,
+ Arrays.asList(UNKNOWN, LOW, LIKELY, HIGH));
+
+ private VoIPProbabilityType(String value) {
+ super(value);
+ }
+
+ public static Stream values() {
+ return ENUM_SUPPORT.values();
+ }
+
+ public static VoIPProbabilityType from(String value) {
+ return ENUM_SUPPORT.from(value);
+ }
+
+ public static String valueOf(VoIPProbabilityType e) {
+ return ENUM_SUPPORT.valueOf(e);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java
new file mode 100644
index 000000000..faf6e7261
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/LookupErrorDtoTest.java
@@ -0,0 +1,42 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.errors;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import org.junit.jupiter.api.Test;
+
+@TestWithResources
+public class LookupErrorDtoTest extends BaseTest {
+
+ public static LookupError lookupErrorDto =
+ LookupError.builder()
+ .setStatus(100)
+ .setTitle("Feature Disabled")
+ .setDetail("VoIPDetection feature is currently disabled.")
+ .setType("validation_error")
+ .build();
+
+ public static LookupError lookupErrorEmptyDto = LookupError.builder().build();
+
+ @GivenTextResource("/domains/numberlookup/v2/errors/LookupErrorDto.json")
+ String jsonLookupErrorDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json")
+ String jsonLookupErrorEmptyDto;
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ LookupError deserialized = objectMapper.readValue(jsonLookupErrorDto, LookupError.class);
+
+ TestHelpers.recursiveEquals(deserialized, lookupErrorDto);
+ }
+
+ @Test
+ void deserializeEmptyDto() throws JsonProcessingException {
+ LookupError deserialized = objectMapper.readValue(jsonLookupErrorEmptyDto, LookupError.class);
+
+ TestHelpers.recursiveEquals(deserialized, lookupErrorEmptyDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java
new file mode 100644
index 000000000..d94af3def
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/errors/ProblemDetailsDtoTest.java
@@ -0,0 +1,31 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.errors;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import org.junit.jupiter.api.Test;
+
+@TestWithResources
+public class ProblemDetailsDtoTest extends BaseTest {
+
+ public static ProblemDetails problemDetailsDto =
+ ProblemDetails.builder()
+ .setType("https://developers.sinch.com/docs/lookup/api/errors/validation")
+ .setTitle("Validation error")
+ .setStatus(400)
+ .setTraceId("84c1fd4063c38d9f3900d06e56542d48")
+ .build();
+
+ @GivenTextResource("/domains/numberlookup/v2/errors/ProblemDetailsDto.json")
+ String jsonProblemDetailsDto;
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ ProblemDetails deserialized =
+ objectMapper.readValue(jsonProblemDetailsDto, ProblemDetails.class);
+
+ TestHelpers.recursiveEquals(deserialized, problemDetailsDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java
new file mode 100644
index 000000000..8d20f0465
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/NumberLookupRequestDtoTest.java
@@ -0,0 +1,120 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import java.time.LocalDate;
+import java.util.Arrays;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class NumberLookupRequestDtoTest extends BaseTest {
+
+ public static NumberLookupRequest numberLookupRequestMinimalDto =
+ NumberLookupRequest.builder().setNumber("+15551234567").build();
+
+ public static NumberLookupRequest numberLookupRequestWithFeaturesDto =
+ NumberLookupRequest.builder()
+ .setNumber("+15552345678")
+ .setFeatures(
+ Arrays.asList(
+ LookupFeatureType.LINE_TYPE,
+ LookupFeatureType.SIM_SWAP,
+ LookupFeatureType.VO_IP_DETECTION))
+ .build();
+
+ public static NumberLookupRequest numberLookupRequestWithRndOptionsDto =
+ NumberLookupRequest.builder()
+ .setNumber("+15553456789")
+ .setFeatures(Arrays.asList(LookupFeatureType.RND))
+ .setRndFeatureOptions(
+ RndFeatureOptions.builder().setContactDate(LocalDate.parse("2025-01-01")).build())
+ .build();
+
+ public static NumberLookupRequest numberLookupRequestAllFeaturesDto =
+ NumberLookupRequest.builder()
+ .setNumber("+15554567890")
+ .setFeatures(
+ Arrays.asList(
+ LookupFeatureType.LINE_TYPE,
+ LookupFeatureType.SIM_SWAP,
+ LookupFeatureType.VO_IP_DETECTION,
+ LookupFeatureType.RND))
+ .build();
+
+ @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json")
+ String jsonNumberLookupRequestMinimalDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json")
+ String jsonNumberLookupRequestWithFeaturesDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json")
+ String jsonNumberLookupRequestWithRndOptionsDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json")
+ String jsonNumberLookupRequestAllFeaturesDto;
+
+ @Test
+ void serializeMinimalDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(numberLookupRequestMinimalDto);
+
+ JSONAssert.assertEquals(jsonNumberLookupRequestMinimalDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeMinimalDto() throws JsonProcessingException {
+ NumberLookupRequest deserialized =
+ objectMapper.readValue(jsonNumberLookupRequestMinimalDto, NumberLookupRequest.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupRequestMinimalDto);
+ }
+
+ @Test
+ void serializeWithFeaturesDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(numberLookupRequestWithFeaturesDto);
+
+ JSONAssert.assertEquals(jsonNumberLookupRequestWithFeaturesDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeWithFeaturesDto() throws JsonProcessingException {
+ NumberLookupRequest deserialized =
+ objectMapper.readValue(jsonNumberLookupRequestWithFeaturesDto, NumberLookupRequest.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupRequestWithFeaturesDto);
+ }
+
+ @Test
+ void serializeWithRndOptionsDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(numberLookupRequestWithRndOptionsDto);
+
+ JSONAssert.assertEquals(jsonNumberLookupRequestWithRndOptionsDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeWithRndOptionsDto() throws JsonProcessingException {
+ NumberLookupRequest deserialized =
+ objectMapper.readValue(jsonNumberLookupRequestWithRndOptionsDto, NumberLookupRequest.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupRequestWithRndOptionsDto);
+ }
+
+ @Test
+ void serializeAllFeaturesDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(numberLookupRequestAllFeaturesDto);
+
+ JSONAssert.assertEquals(jsonNumberLookupRequestAllFeaturesDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeAllFeaturesDto() throws JsonProcessingException {
+ NumberLookupRequest deserialized =
+ objectMapper.readValue(jsonNumberLookupRequestAllFeaturesDto, NumberLookupRequest.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupRequestAllFeaturesDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java
new file mode 100644
index 000000000..305d7d031
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/request/RndFeatureOptionsDtoTest.java
@@ -0,0 +1,36 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.request;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import java.time.LocalDate;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class RndFeatureOptionsDtoTest extends BaseTest {
+
+ public static RndFeatureOptions rndFeatureOptionsDto =
+ RndFeatureOptions.builder().setContactDate(LocalDate.parse("2025-01-15")).build();
+
+ @GivenTextResource("/domains/numberlookup/v2/request/RndFeatureOptionsDto.json")
+ String jsonRndFeatureOptionsDto;
+
+ @Test
+ void serializeDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(rndFeatureOptionsDto);
+
+ JSONAssert.assertEquals(jsonRndFeatureOptionsDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ RndFeatureOptions deserialized =
+ objectMapper.readValue(jsonRndFeatureOptionsDto, RndFeatureOptions.class);
+
+ TestHelpers.recursiveEquals(deserialized, rndFeatureOptionsDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java
new file mode 100644
index 000000000..b16e73c01
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/LineResponseDtoTest.java
@@ -0,0 +1,54 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import java.time.Instant;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class LineResponseDtoTest extends BaseTest {
+
+ public static Line lineResponseDto =
+ Line.builder()
+ .setCarrier("T-Mobile USA")
+ .setType(LineType.MOBILE)
+ .setMobileCountryCode("310")
+ .setMobileNetworkCode("260")
+ .setPorted(true)
+ .setPortingDate(Instant.parse("2024-06-15T14:30:00Z"))
+ .build();
+
+ public static Line lineResponseEmptyDto = Line.builder().build();
+
+ @GivenTextResource("/domains/numberlookup/v2/response/LineResponseDto.json")
+ String jsonLineResponseDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/response/LineResponseEmptyDto.json")
+ String jsonLineResponseEmptyDto;
+
+ @Test
+ void serializeDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(lineResponseDto);
+
+ JSONAssert.assertEquals(jsonLineResponseDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ Line deserialized = objectMapper.readValue(jsonLineResponseDto, Line.class);
+
+ TestHelpers.recursiveEquals(deserialized, lineResponseDto);
+ }
+
+ @Test
+ void deserializeEmptyDto() throws JsonProcessingException {
+ Line deserialized = objectMapper.readValue(jsonLineResponseEmptyDto, Line.class);
+
+ TestHelpers.recursiveEquals(deserialized, lineResponseEmptyDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java
new file mode 100644
index 000000000..1aa55dbc4
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/NumberLookupResponseDtoTest.java
@@ -0,0 +1,63 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import java.time.Instant;
+import org.junit.jupiter.api.Test;
+
+@TestWithResources
+public class NumberLookupResponseDtoTest extends BaseTest {
+
+ public static NumberLookupResponse numberLookupResponseMinimalDto =
+ NumberLookupResponse.builder()
+ .setNumber("+15551234567")
+ .setCountryCode("US")
+ .setTraceId("test-trace-id")
+ .build();
+
+ public static NumberLookupResponse numberLookupResponseFullDto =
+ NumberLookupResponse.builder()
+ .setLine(
+ Line.builder()
+ .setCarrier("T-Mobile USA")
+ .setType(LineType.MOBILE)
+ .setMobileCountryCode("310")
+ .setMobileNetworkCode("260")
+ .setPorted(true)
+ .setPortingDate(Instant.parse("2024-08-20T10:15:30Z"))
+ .build())
+ .setSimSwap(
+ SimSwap.builder().setSwapped(true).setSwapPeriod(SwapPeriodType.SP24_H).build())
+ .setVoIPDetection(
+ VoIPDetection.builder().setProbability(VoIPProbabilityType.HIGH).build())
+ .setRnd(Rnd.builder().setDisconnected(true).build())
+ .setCountryCode("US")
+ .setTraceId("84c1fd4063c38d9f3900d06e56542d48")
+ .setNumber("+15557890123")
+ .build();
+
+ @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json")
+ String jsonNumberLookupResponseMinimalDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json")
+ String jsonNumberLookupResponseFullDto;
+
+ @Test
+ void deserializeMinimalDto() throws JsonProcessingException {
+ NumberLookupResponse deserialized =
+ objectMapper.readValue(jsonNumberLookupResponseMinimalDto, NumberLookupResponse.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupResponseMinimalDto);
+ }
+
+ @Test
+ void deserializeFullDto() throws JsonProcessingException {
+ NumberLookupResponse deserialized =
+ objectMapper.readValue(jsonNumberLookupResponseFullDto, NumberLookupResponse.class);
+
+ TestHelpers.recursiveEquals(deserialized, numberLookupResponseFullDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java
new file mode 100644
index 000000000..36f25d8e4
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/RndResponseDtoTest.java
@@ -0,0 +1,45 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class RndResponseDtoTest extends BaseTest {
+
+ public static Rnd rndResponseDto = Rnd.builder().setDisconnected(true).build();
+
+ public static Rnd rndResponseEmptyDto = Rnd.builder().build();
+
+ @GivenTextResource("/domains/numberlookup/v2/response/RndResponseDto.json")
+ String jsonRndResponseDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/response/RndResponseEmptyDto.json")
+ String jsonRndResponseEmptyDto;
+
+ @Test
+ void serializeDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(rndResponseDto);
+
+ JSONAssert.assertEquals(jsonRndResponseDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ Rnd deserialized = objectMapper.readValue(jsonRndResponseDto, Rnd.class);
+
+ TestHelpers.recursiveEquals(deserialized, rndResponseDto);
+ }
+
+ @Test
+ void deserializeEmptyDto() throws JsonProcessingException {
+ Rnd deserialized = objectMapper.readValue(jsonRndResponseEmptyDto, Rnd.class);
+
+ TestHelpers.recursiveEquals(deserialized, rndResponseEmptyDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java
new file mode 100644
index 000000000..ff7a6d510
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/SimSwapResponseDtoTest.java
@@ -0,0 +1,62 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import com.sinch.sdk.domains.numberlookup.models.v2.errors.LookupError;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class SimSwapResponseDtoTest extends BaseTest {
+
+ public static SimSwap simSwapResponseDto =
+ SimSwap.builder().setSwapped(true).setSwapPeriod(SwapPeriodType.SP24_H).build();
+
+ public static SimSwap simSwapResponseWithErrorDto =
+ SimSwap.builder()
+ .setError(
+ LookupError.builder()
+ .setStatus(100)
+ .setTitle("Feature Disabled")
+ .setDetail("SimSwap feature is currently disabled.")
+ .build())
+ .build();
+
+ @GivenTextResource("/domains/numberlookup/v2/response/SimSwapResponseDto.json")
+ String jsonSimSwapDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json")
+ String jsonSimSwapWithErrorDto;
+
+ @Test
+ void serializeDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(simSwapResponseDto);
+
+ JSONAssert.assertEquals(jsonSimSwapDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ SimSwap deserialized = objectMapper.readValue(jsonSimSwapDto, SimSwap.class);
+
+ TestHelpers.recursiveEquals(deserialized, simSwapResponseDto);
+ }
+
+ @Test
+ void serializeWithErrorDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(simSwapResponseWithErrorDto);
+
+ JSONAssert.assertEquals(jsonSimSwapWithErrorDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeWithErrorDto() throws JsonProcessingException {
+ SimSwap deserialized = objectMapper.readValue(jsonSimSwapWithErrorDto, SimSwap.class);
+
+ TestHelpers.recursiveEquals(deserialized, simSwapResponseWithErrorDto);
+ }
+}
diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java
new file mode 100644
index 000000000..d7e86ef47
--- /dev/null
+++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/numberlookup/models/v2/response/VoIPDetectionResponseDtoTest.java
@@ -0,0 +1,47 @@
+package com.sinch.sdk.domains.numberlookup.models.v2.response;
+
+import com.adelean.inject.resources.junit.jupiter.GivenTextResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sinch.sdk.BaseTest;
+import com.sinch.sdk.core.TestHelpers;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+@TestWithResources
+public class VoIPDetectionResponseDtoTest extends BaseTest {
+
+ public static VoIPDetection voIPDetectionResponseDto =
+ VoIPDetection.builder().setProbability(VoIPProbabilityType.HIGH).build();
+
+ public static VoIPDetection voIPDetectionResponseEmptyDto = VoIPDetection.builder().build();
+
+ @GivenTextResource("/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json")
+ String jsonVoIPDetectionDto;
+
+ @GivenTextResource("/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json")
+ String jsonVoIPDetectionEmptyDto;
+
+ @Test
+ void serializeDto() throws JsonProcessingException, JSONException {
+ String serializedString = objectMapper.writeValueAsString(voIPDetectionResponseDto);
+
+ JSONAssert.assertEquals(jsonVoIPDetectionDto, serializedString, true);
+ }
+
+ @Test
+ void deserializeDto() throws JsonProcessingException {
+ VoIPDetection deserialized = objectMapper.readValue(jsonVoIPDetectionDto, VoIPDetection.class);
+
+ TestHelpers.recursiveEquals(deserialized, voIPDetectionResponseDto);
+ }
+
+ @Test
+ void deserializeEmptyDto() throws JsonProcessingException {
+ VoIPDetection deserialized =
+ objectMapper.readValue(jsonVoIPDetectionEmptyDto, VoIPDetection.class);
+
+ TestHelpers.recursiveEquals(deserialized, voIPDetectionResponseEmptyDto);
+ }
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json
new file mode 100644
index 000000000..86220e9d1
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorDto.json
@@ -0,0 +1,6 @@
+{
+ "status": 100,
+ "title": "Feature Disabled",
+ "detail": "VoIPDetection feature is currently disabled.",
+ "type": "validation_error"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/LookupErrorEmptyDto.json
@@ -0,0 +1 @@
+{}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json
new file mode 100644
index 000000000..1e1590f3c
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/errors/ProblemDetailsDto.json
@@ -0,0 +1,6 @@
+{
+ "type": "https://developers.sinch.com/docs/lookup/api/errors/validation",
+ "title": "Validation error",
+ "status": 400,
+ "traceId": "84c1fd4063c38d9f3900d06e56542d48"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json
new file mode 100644
index 000000000..84b20c39e
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestAllFeaturesDto.json
@@ -0,0 +1,9 @@
+{
+ "number": "+15554567890",
+ "features": [
+ "LineType",
+ "SimSwap",
+ "VoIPDetection",
+ "RND"
+ ]
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json
new file mode 100644
index 000000000..b190f89ba
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestMinimalDto.json
@@ -0,0 +1,3 @@
+{
+ "number": "+15551234567"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json
new file mode 100644
index 000000000..33bad4262
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithFeaturesDto.json
@@ -0,0 +1,8 @@
+{
+ "number": "+15552345678",
+ "features": [
+ "LineType",
+ "SimSwap",
+ "VoIPDetection"
+ ]
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json
new file mode 100644
index 000000000..7ef54e3e4
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/NumberLookupRequestWithRndOptionsDto.json
@@ -0,0 +1,9 @@
+{
+ "number": "+15553456789",
+ "features": [
+ "RND"
+ ],
+ "rndFeatureOptions": {
+ "contactDate": "2025-01-01"
+ }
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json
new file mode 100644
index 000000000..45a365f9c
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/request/RndFeatureOptionsDto.json
@@ -0,0 +1,3 @@
+{
+ "contactDate": "2025-01-15"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json
new file mode 100644
index 000000000..cc7ff9007
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseDto.json
@@ -0,0 +1,8 @@
+{
+ "carrier": "T-Mobile USA",
+ "type": "Mobile",
+ "mobileCountryCode": "310",
+ "mobileNetworkCode": "260",
+ "ported": true,
+ "portingDate": "2024-06-15T14:30:00Z"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/LineResponseEmptyDto.json
@@ -0,0 +1 @@
+{}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json
new file mode 100644
index 000000000..b43781206
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseFullDto.json
@@ -0,0 +1,23 @@
+{
+ "line": {
+ "carrier": "T-Mobile USA",
+ "type": "Mobile",
+ "mobileCountryCode": "310",
+ "mobileNetworkCode": "260",
+ "ported": true,
+ "portingDate": "2024-08-20T10:15:30Z"
+ },
+ "simSwap": {
+ "swapped": true,
+ "swapPeriod": "SP24H"
+ },
+ "voIPDetection": {
+ "probability": "High"
+ },
+ "rnd": {
+ "disconnected": true
+ },
+ "countryCode": "US",
+ "traceId": "84c1fd4063c38d9f3900d06e56542d48",
+ "number": "+15557890123"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json
new file mode 100644
index 000000000..d6334b7e9
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/NumberLookupResponseMinimalDto.json
@@ -0,0 +1,5 @@
+{
+ "countryCode": "US",
+ "traceId": "test-trace-id",
+ "number": "+15551234567"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json
new file mode 100644
index 000000000..29102b577
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseDto.json
@@ -0,0 +1,3 @@
+{
+ "disconnected": true
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/RndResponseEmptyDto.json
@@ -0,0 +1 @@
+{}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json
new file mode 100644
index 000000000..9815704d5
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseDto.json
@@ -0,0 +1,4 @@
+{
+ "swapped": true,
+ "swapPeriod": "SP24H"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json
new file mode 100644
index 000000000..4ef301ba4
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/SimSwapResponseWithErrorDto.json
@@ -0,0 +1,7 @@
+{
+ "error": {
+ "status": 100,
+ "title": "Feature Disabled",
+ "detail": "SimSwap feature is currently disabled."
+ }
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json
new file mode 100644
index 000000000..792988b4c
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseDto.json
@@ -0,0 +1,3 @@
+{
+ "probability": "High"
+}
diff --git a/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/openapi-contracts/src/test/resources/domains/numberlookup/v2/response/VoIPDetectionResponseEmptyDto.json
@@ -0,0 +1 @@
+{}
diff --git a/pom.xml b/pom.xml
index 656cd3dda..021a0bf4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -262,6 +262,9 @@
openapi-contracts/src/test/resources
+
+ sinch-sdk-mockserver
+
@@ -297,6 +300,7 @@
com.sinch.sdk.e2e.domains.sms.v1.SmsIT
com.sinch.sdk.e2e.domains.voice.v1.VoiceIT
com.sinch.sdk.e2e.domains.verification.v1.VerificationIT
+ com.sinch.sdk.e2e.domains.numberlookup.v2.NumberLookupIT