Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ A Kotlin/Java client library for interacting with the [CloudContactAI](https://c
- Campaign registration and management for TCR carrier vetting
- Manage webhooks for event notifications
- Webhook signature validation for security
- Validate email addresses (valid/invalid/risky) and phone numbers (valid/invalid/landline)
- Variable substitution in messages
- Test environment support
- Comprehensive error handling
Expand Down Expand Up @@ -300,6 +301,40 @@ val singleResponse = ccai.mms.sendSingle(
)
```

#### Contact Validator

Validate email addresses and phone numbers.

> Bulk endpoints accept up to 50 contacts per request and are processed server-side in chunks.

```kotlin
import com.cloudcontactai.sdk.contactvalidator.PhoneInput

// Validate a single email
val emailResult = ccai.contactValidator.validateEmail("user@example.com")
println(emailResult.status) // "valid" | "invalid" | "risky"
println(emailResult.metadata["safe_to_send"]) // true | false

// Validate multiple emails (up to 50, processed server-side in chunks)
val bulkEmails = ccai.contactValidator.validateEmails(listOf(
"user@example.com",
"bad@invalid.xyz"
))
println(bulkEmails.summary) // ValidationSummary(total=2, valid=1, invalid=1, risky=0, landline=0)

// Validate a single phone number
val phoneResult = ccai.contactValidator.validatePhone("+15551234567", countryCode = "US")
println(phoneResult.status) // "valid" | "invalid" | "landline"
println(phoneResult.metadata["carrier_type"]) // "mobile" | "landline" | "voip"

// Validate multiple phone numbers (up to 50, processed server-side in chunks)
val bulkPhones = ccai.contactValidator.validatePhones(listOf(
PhoneInput(phone = "+15551234567"),
PhoneInput(phone = "+15559876543", countryCode = "US")
))
println(bulkPhones.summary) // ValidationSummary(total=2, valid=1, invalid=0, risky=0, landline=1)
```

#### Webhook Management

```kotlin
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>com.cloudcontactai</groupId>
<artifactId>ccai-java-sdk</artifactId>
<version>1.0.9</version>
<version>1.1.0</version>
<packaging>jar</packaging>

<name>CCAI Java SDK</name>
Expand Down
6 changes: 4 additions & 2 deletions src/main/kotlin/com/cloudcontactai/sdk/CCAIClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.cloudcontactai.sdk
import com.cloudcontactai.sdk.common.ApiClient
import com.cloudcontactai.sdk.common.CCAIConfig
import com.cloudcontactai.sdk.contact.ContactService
import com.cloudcontactai.sdk.contactvalidator.ContactValidatorService
import com.cloudcontactai.sdk.sms.SMSService
import com.cloudcontactai.sdk.email.EmailService
import com.cloudcontactai.sdk.webhook.WebhookService
Expand All @@ -12,15 +13,16 @@ import com.cloudcontactai.sdk.campaigns.CampaignService

class CCAIClient(private val config: CCAIConfig) {
private val apiClient = ApiClient(config)

val sms = SMSService(config, apiClient)
val email = EmailService(config, apiClient)
val webhook = WebhookService(config, apiClient)
val mms = MMSService(config, apiClient)
val contact = ContactService(config, apiClient)
val brands = BrandService(config, apiClient)
val campaigns = CampaignService(config, apiClient)

val contactValidator = ContactValidatorService(config, apiClient)

fun close() {
// Cleanup resources if needed
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.cloudcontactai.sdk.contactvalidator

data class EmailValidationResult(
val contactField: String,
val type: String,
val status: String,
val metadata: Map<String, Any?> = emptyMap()
)

data class PhoneValidationResult(
val contactField: String,
val type: String,
val status: String,
val metadata: Map<String, Any?> = emptyMap()
)

data class ValidationSummary(
val total: Int,
val valid: Int,
val invalid: Int,
val risky: Int,
val landline: Int = 0
)

data class BulkEmailValidationResult(
val results: List<EmailValidationResult>,
val summary: ValidationSummary
)

data class BulkPhoneValidationResult(
val results: List<PhoneValidationResult>,
val summary: ValidationSummary
)

data class PhoneInput(
val phone: String,
val countryCode: String? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.cloudcontactai.sdk.contactvalidator

import com.cloudcontactai.sdk.common.ApiClient
import com.cloudcontactai.sdk.common.CCAIConfig

class ContactValidatorService(private val config: CCAIConfig, private val apiClient: ApiClient) {

fun validateEmail(email: String): EmailValidationResult =
apiClient.request(
method = "POST",
endpoint = "/v1/contact-validator/email",
data = mapOf("email" to email),
responseClass = EmailValidationResult::class.java
)

fun validateEmails(emails: List<String>): BulkEmailValidationResult =
apiClient.request(
method = "POST",
endpoint = "/v1/contact-validator/emails",
data = mapOf("emails" to emails),
responseClass = BulkEmailValidationResult::class.java
)

fun validatePhone(phone: String, countryCode: String? = null): PhoneValidationResult =
apiClient.request(
method = "POST",
endpoint = "/v1/contact-validator/phone",
data = mapOf("phone" to phone, "countryCode" to countryCode),
responseClass = PhoneValidationResult::class.java
)

fun validatePhones(phones: List<PhoneInput>): BulkPhoneValidationResult =
apiClient.request(
method = "POST",
endpoint = "/v1/contact-validator/phones",
data = mapOf("phones" to phones),
responseClass = BulkPhoneValidationResult::class.java
)
}