Ruby Captcha Solver

Solve image CAPTCHAs in Ruby with net/http (stdlib) or Faraday. FastCaptcha returns the answer in 0.3–0.7 seconds — no custom gem needed.

Ruby Quick Start

Pure stdlib (no gems)

require 'net/http'
require 'uri'
require 'json'

API_KEY = 'YOUR_API_KEY'

def solve_captcha(image_path)
  uri = URI('https://fastcaptcha.org/api/v1/ocr/')

  Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    req = Net::HTTP::Post.new(uri)
    req['X-API-Key'] = API_KEY

    req.set_form(
      [['image', File.open(image_path)]],
      'multipart/form-data'
    )

    resp = http.request(req)
    data = JSON.parse(resp.body)

    raise "API error: #{data['error']}" unless data['success']
    data['text']
  end
end

# Usage
text = solve_captcha('captcha.png')
puts "Solved: #{text}"

Faraday gem

# Gemfile
# gem 'faraday'
# gem 'faraday-multipart'

require 'faraday'
require 'faraday/multipart'
require 'json'

API_KEY = 'YOUR_API_KEY'

conn = Faraday.new('https://fastcaptcha.org') do |f|
  f.request :multipart
  f.adapter Faraday.default_adapter
end

def solve_captcha(conn, image_path)
  resp = conn.post('/api/v1/ocr/') do |req|
    req.headers['X-API-Key'] = API_KEY
    req.body = {
      image: Faraday::FilePart.new(
        File.open(image_path), 'image/png'
      )
    }
  end

  data = JSON.parse(resp.body)
  raise "API error: #{data['error']}" unless data['success']
  data['text']
end

text = solve_captcha(conn, 'captcha.png')
puts "Solved: #{text}"

With retry & error handling

def solve_with_retry(image_path, max_retries: 4)
  max_retries.times do |attempt|
    begin
      return solve_captcha(image_path)
    rescue => e
      retriable = e.message.match?(/429|500|503/)
      raise unless retriable && attempt < max_retries - 1

      delay = [2**attempt + rand, 32].min
      puts "Retrying in #{delay.round(1)}s (attempt #{attempt + 1})"
      sleep delay
    end
  end
  raise 'Max retries exceeded'
end

# Rails / Sidekiq usage
class CaptchaSolverJob < ApplicationJob
  queue_as :default

  def perform(image_path)
    result = solve_with_retry(image_path)
    Rails.logger.info "Solved captcha: #{result}"
    result
  end
end
0.3s avg

Sub-second responses on image CAPTCHAs

💎
Rails-friendly

Works in Rails, Sinatra, Sidekiq, and plain Ruby

🆓
100 free credits

No credit card needed to start