Ruby
Installation
Section titled “Installation”No additional gems required — Ruby’s standard library includes net/http, json, and uri.
Basic Example
Section titled “Basic Example”require 'net/http'require 'json'require 'uri'
def verify_submission(form_data) uri = URI('https://api.formsentry.ai/v1/verify')
response = Net::HTTP.post( uri, { apiKey: ENV['FORMSENTRY_API_KEY'], formId: ENV['FORMSENTRY_FORM_ID'], payload: form_data }.to_json, 'Content-Type' => 'application/json' )
JSON.parse(response.body)end
# Usageresult = verify_submission({ name: 'John Doe', email: 'john@example.com', message: 'I would like to learn more about your services.'})
if result['status'] == 'spam' puts "Spam detected: #{result['reasoning']}"else puts 'Legitimate submission'endRails Integration
Section titled “Rails Integration”class ContactsController < ApplicationController skip_before_action :verify_authenticity_token
def create unless contact_params[:name].present? && contact_params[:email].present? return render json: { error: 'Missing required fields' }, status: 400 end
result = verify_submission(contact_params.to_h)
if result['status'] == 'spam' # Silently accept to avoid tipping off spammers render json: { success: true } return end
# TODO: Process the legitimate submission ContactMailer.new_submission(contact_params).deliver_later render json: { success: true } end
private
def contact_params params.permit(:name, :email, :message) end
def verify_submission(form_data) uri = URI('https://api.formsentry.ai/v1/verify')
http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.open_timeout = 5 http.read_timeout = 5
request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' request.body = { apiKey: ENV['FORMSENTRY_API_KEY'], formId: ENV['FORMSENTRY_FORM_ID'], payload: form_data }.to_json
response = http.request(request) JSON.parse(response.body) rescue StandardError => e # Fail open — if FormSentry is unreachable, allow the submission Rails.logger.error("FormSentry error: #{e.message}") { 'status' => 'legitimate', 'confidence' => 0.0 } endendSinatra Integration
Section titled “Sinatra Integration”require 'sinatra'require 'net/http'require 'json'require 'uri'
post '/contact' do content_type :json
begin form_data = JSON.parse(request.body.read) rescue JSON::ParserError halt 400, { error: 'Invalid JSON' }.to_json end
result = begin uri = URI('https://api.formsentry.ai/v1/verify')
http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.open_timeout = 5 http.read_timeout = 5
req = Net::HTTP::Post.new(uri) req['Content-Type'] = 'application/json' req.body = { apiKey: ENV['FORMSENTRY_API_KEY'], formId: ENV['FORMSENTRY_FORM_ID'], payload: form_data }.to_json
response = http.request(req) JSON.parse(response.body) rescue StandardError => e # Fail open — if FormSentry is unreachable, allow the submission logger.error("FormSentry error: #{e.message}") { 'status' => 'legitimate', 'confidence' => 0.0 } end
if result['status'] == 'spam' return { success: true }.to_json end
# TODO: Process the legitimate submission { success: true }.to_jsonendError Handling
Section titled “Error Handling”require 'net/http'require 'json'require 'uri'
def verify_with_retry(payload, max_retries: 3) max_retries.times do |attempt| uri = URI('https://api.formsentry.ai/v1/verify')
http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.open_timeout = 5 http.read_timeout = 5
request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' request.body = { apiKey: ENV['FORMSENTRY_API_KEY'], formId: ENV['FORMSENTRY_FORM_ID'], payload: payload }.to_json
response = http.request(request)
return JSON.parse(response.body) if response.code == '200'
if %w[429 500 502 503].include?(response.code) sleep [2**attempt, 5].min next end
raise "FormSentry error: #{response.code}" end
raise 'Max retries exceeded'endSee Errors for all error codes and retry strategies.