Skip to content

Ruby

No additional gems required — Ruby’s standard library includes net/http, json, and uri.

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
# Usage
result = 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'
end
app/controllers/contacts_controller.rb
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 }
end
end
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_json
end
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'
end

See Errors for all error codes and retry strategies.