💎 Ruby Integration — Quick Start

Integrate SnapAPI into your Ruby application using plain HTTP. No gem required — just Net::HTTP or your favorite HTTP client. Works with Rails, Sinatra, and plain Ruby.

On This Page

Setup

No gem installation needed. Use Ruby's built-in Net::HTTP:

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

API_KEY = ENV['SNAPAPI_KEY']
BASE_URL = 'https://api.snapapi.pics'

Or if you prefer, add httparty or faraday to your Gemfile:

# Gemfile
gem 'faraday'
💡 Tip: Store your API key in environment variables. Use dotenv gem for local development.

Take Screenshots

Basic Screenshot

require 'net/http'
require 'json'

uri = URI('https://api.snapapi.pics/screenshot')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
request['Content-Type'] = 'application/json'
request.body = {
  url: 'https://example.com',
  format: 'png',
  width: 1280,
  height: 800
}.to_json

response = http.request(request)
File.binwrite('screenshot.png', response.body)
puts 'Screenshot saved!'

Full Page Screenshot

request.body = {
  url: 'https://example.com',
  format: 'png',
  fullPage: true,
  width: 1280
}.to_json

response = http.request(request)
File.binwrite('fullpage.png', response.body)

Screenshot with Options

request.body = {
  url: 'https://example.com',
  format: 'webp',            # png, jpeg, webp, avif
  width: 1440,
  height: 900,
  fullPage: false,
  blockAds: true,             # Block advertisements
  blockCookies: true,         # Block cookie banners
  delay: 2000,                # Wait 2s before capture
  devicePreset: 'iPhone15',   # Mobile device emulation
  css: 'body { background: white; }',
  responseType: 'url'         # Get hosted URL
}.to_json

Get Hosted URL

request.body = {
  url: 'https://example.com',
  format: 'png',
  responseType: 'url'
}.to_json

response = http.request(request)
result = JSON.parse(response.body)
puts result['url']
# => https://cdn.snapapi.pics/screenshots/abc123.png

Generate PDFs

uri = URI('https://api.snapapi.pics/pdf')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
request['Content-Type'] = 'application/json'
request.body = {
  url: 'https://example.com',
  format: 'A4',
  printBackground: true,
  margin: {
    top: '20mm',
    bottom: '20mm',
    left: '15mm',
    right: '15mm'
  }
}.to_json

response = http.request(request)
File.binwrite('page.pdf', response.body)

PDF from HTML String

request.body = {
  html: '<h1>Invoice #1234</h1><p>Total: $99.00</p>',
  format: 'A4',
  printBackground: true
}.to_json

Extract Content

uri = URI('https://api.snapapi.pics/extract')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
request['Content-Type'] = 'application/json'
request.body = {
  url: 'https://example.com/blog-post',
  format: 'markdown'
}.to_json

response = http.request(request)
content = JSON.parse(response.body)
puts content['markdown']

Record Videos

uri = URI('https://api.snapapi.pics/video')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
request['Content-Type'] = 'application/json'
request.body = {
  url: 'https://example.com',
  duration: 5,
  width: 1280,
  height: 720,
  format: 'mp4'
}.to_json

response = http.request(request)
File.binwrite('recording.mp4', response.body)

Error Handling

response = http.request(request)

case response.code.to_i
when 200
  File.binwrite('screenshot.png', response.body)
  puts 'Success!'
when 401
  puts 'Invalid API key'
when 429
  retry_after = response['Retry-After']
  puts "Rate limited. Retry after #{retry_after}s"
when 400
  error = JSON.parse(response.body)
  puts "Bad request: #{error['message']}"
else
  puts "Error #{response.code}: #{response.body}"
end
⚠️ Rate Limits: Free tier: 200 requests/month. Starter: $19/mo. Pro: $79/mo. View plans.

Rails Integration

Controller Example

# app/controllers/screenshots_controller.rb
class ScreenshotsController < ApplicationController
  def create
    uri = URI('https://api.snapapi.pics/screenshot')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

    request = Net::HTTP::Post.new(uri)
    request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
    request['Content-Type'] = 'application/json'
    request.body = {
      url: params[:url],
      format: 'png',
      width: 1280
    }.to_json

    response = http.request(request)

    send_data response.body,
      type: 'image/png',
      filename: 'screenshot.png',
      disposition: 'attachment'
  end
end

Background Job (Sidekiq)

# app/jobs/screenshot_job.rb
class ScreenshotJob < ApplicationJob
  queue_as :default

  def perform(url, output_path)
    uri = URI('https://api.snapapi.pics/screenshot')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

    request = Net::HTTP::Post.new(uri)
    request['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
    request['Content-Type'] = 'application/json'
    request.body = { url: url, format: 'png' }.to_json

    response = http.request(request)
    File.binwrite(output_path, response.body)
  end
end

# Usage
ScreenshotJob.perform_later('https://example.com', 'tmp/screenshot.png')

Using Faraday

require 'faraday'

conn = Faraday.new(url: 'https://api.snapapi.pics') do |f|
  f.headers['Authorization'] = "Bearer #{ENV['SNAPAPI_KEY']}"
  f.headers['Content-Type'] = 'application/json'
end

response = conn.post('/screenshot') do |req|
  req.body = {
    url: 'https://example.com',
    format: 'png',
    width: 1280
  }.to_json
end

File.binwrite('screenshot.png', response.body)

Next Steps