twillio_verify

A Gleam library for sending and verifying SMS codes using the Twilio Verify API.

Installation

Add twillio_verify to your gleam.toml dependencies:

[dependencies]
twillio_verify = { path = "../twillio_verify" }

Configuration

Create a TwilioConfig with your Twilio credentials:

import twillio_verify.{TwilioConfig}

let config = TwilioConfig(
  account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  auth_token: "your_auth_token",
  service_sid: "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

You can find these values in your Twilio Console:

Usage

Sending a Verification Code

import gleam/httpc
import twillio_verify.{TwilioConfig, Sms}

let config = TwilioConfig(
  account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  auth_token: "your_auth_token",
  service_sid: "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

// Build the request
let request = twillio_verify.send_verification_request(config, "+1234567890", Sms)

// Send with your HTTP client
let assert Ok(response) = httpc.send(request)

// Parse the response
case twillio_verify.send_verification_response(response) {
  Ok(verification) -> {
    io.println("Verification sent! SID: " <> verification.sid)
    io.println("Status: " <> string.inspect(verification.status))
  }
  Error(error) -> {
    io.println("Error: " <> string.inspect(error))
  }
}

Checking a Verification Code

import gleam/httpc
import twillio_verify.{TwilioConfig}

let config = TwilioConfig(
  account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  auth_token: "your_auth_token",
  service_sid: "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

// Build the request
let request = twillio_verify.check_verification_request(config, "+1234567890", "123456")

// Send with your HTTP client
let assert Ok(response) = httpc.send(request)

// Parse the response
case twillio_verify.check_verification_response(response) {
  Ok(verification) -> {
    case twillio_verify.is_approved(verification) {
      True -> io.println("Code verified successfully!")
      False -> io.println("Invalid code")
    }
  }
  Error(error) -> {
    io.println("Error: " <> string.inspect(error))
  }
}

Available Channels

import twillio_verify.{Sms, Call, Email, Whatsapp}

// Send via SMS
twillio_verify.send_verification_request(config, "+1234567890", Sms)

// Send via phone call
twillio_verify.send_verification_request(config, "+1234567890", Call)

// Send via email
twillio_verify.send_verification_request(config, "user@example.com", Email)

// Send via WhatsApp
twillio_verify.send_verification_request(config, "+1234567890", Whatsapp)

Response Types

SendVerificationResponse / CheckVerificationResponse

Both response types include:

Field Type Description
sidString Unique identifier for this verification
account_sidString Your Twilio Account SID
service_sidString The Verify Service SID
toString The phone number or email
channelString Channel used (sms, call, email, whatsapp)
statusVerificationStatus Current status (Pending, Approved, Canceled)
validBool Whether the verification is valid
amountOption(String) Amount for PSD2 verifications
payeeOption(String) Payee for PSD2 verifications
date_createdString ISO 8601 creation timestamp
date_updatedString ISO 8601 update timestamp
lookupLookup Carrier lookup information
send_code_attemptsList(SendCodeAttempt) List of send attempts
urlString API URL for this verification

Error Handling

The library returns TwilioError for failures:

case twillio_verify.send_verification_response(response) {
  Ok(verification) -> // handle success
  Error(twillio_verify.TwilioApiError(code, message, more_info)) -> {
    // Twilio API error (e.g., invalid phone number)
    io.println("Twilio error " <> int.to_string(code) <> ": " <> message)
  }
  Error(twillio_verify.UnexpectedResponseError(status, body)) -> {
    // Unexpected HTTP response
    io.println("HTTP " <> int.to_string(status) <> ": " <> body)
  }
  Error(twillio_verify.DecodeError(reason)) -> {
    // JSON decode failure
    io.println("Decode error: " <> reason)
  }
}

License

MIT