Go Client
The Evomi Go Client provides a production-ready, typed interface to Evomi’s API with native Go idioms and full API coverage.
Installation
go get github.com/evomi/evomi-go-clientQuick Start
package main
import (
"context"
"fmt"
"log"
"github.com/evomi/evomi-go-client/evomi"
)
func main() {
client := evomi.NewClient("your-api-key", "", "")
result, err := client.Scrape(context.Background(), "https://example.com", evomi.ScrapeOptions{})
if err != nil {
log.Fatal(err)
}
fmt.Println(result["content"])
}Authentication
Set your API key via environment variable:
export EVOMI_API_KEY="your-api-key"Or pass it directly:
client := evomi.NewClient("your-api-key", "", "")Custom base URL (for testing):
client := evomi.NewClient("your-api-key", "https://custom.evomi.com", "")Scraping Operations
Scrape(ctx, url, opts)
Scrape a single URL with configurable options.
result, err := client.Scrape(ctx, "https://example.com", evomi.ScrapeOptions{
Mode: "auto",
Output: "markdown",
Device: "windows",
ProxyType: "residential",
ProxyCountry: "US",
ProxySessionID: "abc123",
WaitUntil: "domcontentloaded",
AIEnhance: true,
AIPrompt: "Extract product data",
AISource: "markdown",
JSInstructions: []map[string]any{{"click": ".load-more"}},
ExecuteJS: "window.scrollTo(0, document.body.scrollHeight)",
WaitSeconds: 2,
Screenshot: false,
PDF: false,
ExcludedTags: []string{"nav", "footer"},
ExcludedSelectors: []string{".ads"},
BlockResources: []string{"image", "stylesheet"},
AdditionalHeaders: map[string]string{"X-Custom": "value"},
CaptureHeaders: true,
NetworkCapture: []map[string]any{{"url_pattern": "/api/.*"}},
AsyncMode: false,
ConfigID: "cfg_abc123",
SchemeID: "sch_abc123",
ExtractScheme: []map[string]any{{"label": "title", "type": "content", "selector": "h1"}},
StorageID: "stor_abc123",
UseDefaultStorage: false,
})| Field | Type | Default | Description |
|---|---|---|---|
Mode |
string | "auto" |
Scraping mode: "request", "browser", "auto" |
Output |
string | "markdown" |
Output format: "html", "markdown", "screenshot", "pdf" |
Device |
string | "windows" |
Device type: "windows", "macos", "android" |
ProxyType |
string | "residential" |
Proxy type: "datacenter", "residential" |
ProxyCountry |
string | "US" |
Two-letter country code |
ProxySessionID |
string | — | Proxy session ID (6-8 chars) |
WaitUntil |
string | "domcontentloaded" |
Wait condition |
AIEnhance |
bool | false |
Enable AI extraction |
AIPrompt |
string | — | Prompt for AI extraction |
AISource |
string | — | AI source |
AIForceJSON |
bool | true |
Force AI response to JSON |
JSInstructions |
[]map[string]any |
— | JS actions |
ExecuteJS |
string | — | Raw JavaScript to execute |
WaitSeconds |
int | 0 |
Seconds to wait after page load |
Screenshot |
bool | false |
Capture screenshot |
PDF |
bool | false |
Capture PDF |
ExcludedTags |
[]string |
— | HTML tags to remove |
ExcludedSelectors |
[]string |
— | CSS selectors to remove |
BlockResources |
[]string |
— | Resource types to block |
AdditionalHeaders |
map[string]string |
— | Extra HTTP headers |
CaptureHeaders |
bool | false |
Capture response headers |
NetworkCapture |
[]map[string]any |
— | Network capture filters |
AsyncMode |
bool | false |
Return immediately with task ID |
ConfigID |
string | — | Saved config ID |
SchemeID |
string | — | Saved extraction schema ID |
ExtractScheme |
[]map[string]any |
— | Inline extraction schema |
StorageID |
string | — | Storage config ID |
UseDefaultStorage |
bool | false |
Use default storage |
Delivery |
string | "json" |
Response format: "raw" or "json" |
IncludeContent |
bool | true |
Include content in response |
Webhook |
*WebhookConfig |
— | Webhook configuration |
Crawl(ctx, domain, opts)
Crawl a website to discover and scrape multiple pages.
result, err := client.Crawl(ctx, "example.com", evomi.CrawlOptions{
MaxURLs: 100,
Depth: 2,
URLPattern: "/blog/.*",
ScraperConfig: map[string]any{"mode": "browser", "output": "markdown"},
AsyncMode: false,
})| Field | Type | Default | Description |
|---|---|---|---|
MaxURLs |
int | 100 |
Maximum URLs to crawl |
Depth |
int | 2 |
Crawl depth |
URLPattern |
string | — | Regex pattern to filter URLs |
ScraperConfig |
map[string]any |
— | Config for scraping each page |
AsyncMode |
bool | false |
Return immediately with task ID |
MapWebsite(ctx, domain, opts)
Discover URLs from a website via sitemaps, CommonCrawl, or crawling.
result, err := client.MapWebsite(ctx, "example.com", evomi.MapOptions{
Sources: []string{"sitemap", "commoncrawl"},
MaxURLs: 500,
URLPattern: "/products/.*",
CheckIfLive: false,
Depth: 1,
AsyncMode: false,
})| Field | Type | Default | Description |
|---|---|---|---|
Sources |
[]string |
["sitemap", "commoncrawl"] |
Discovery sources |
MaxURLs |
int | 500 |
Maximum URLs to discover |
URLPattern |
string | — | Regex pattern to filter URLs |
CheckIfLive |
bool | false |
Check if URLs are live |
Depth |
int | 1 |
Crawl depth if using crawl source |
AsyncMode |
bool | false |
Return immediately with task ID |
SearchDomains(ctx, query, opts)
Find domains by searching the web.
// Single query
result, err := client.SearchDomains(ctx, "e-commerce platforms", evomi.SearchOptions{
MaxURLs: 20,
Region: "us-en",
})
// Multiple queries (up to 10)
result, err := client.SearchDomains(ctx, []string{"web scraping tools", "data extraction"}, evomi.SearchOptions{
MaxURLs: 20,
})| Field | Type | Default | Description |
|---|---|---|---|
MaxURLs |
int | 20 |
Max domains per query (max: 100) |
Region |
string | "us-en" |
Region for results |
AgentRequest(ctx, message)
Send a natural language request to the AI agent.
result, err := client.AgentRequest(ctx, "Scrape example.com and extract all product prices")GetTaskStatus(ctx, taskID, taskType)
Check the status of an async task.
result, err := client.GetTaskStatus(ctx, "abc123", "scrape")
// taskType: "scrape" | "crawl" | "map" | "config_generate" | "schema"
Config Management
Save and reuse scrape configurations.
ListConfigs(ctx, opts)
configs, err := client.ListConfigs(ctx, evomi.ListConfigsOptions{
Page: 1,
PerPage: 20,
SortBy: "created_at",
SortOrder: "desc",
})CreateConfig(ctx, name, config)
config, err := client.CreateConfig(ctx, "Product Scraper", map[string]any{
"mode": "browser",
"output": "markdown",
})GetConfig(ctx, configID)
config, err := client.GetConfig(ctx, "cfg_abc123")UpdateConfig(ctx, configID, name, config)
config, err := client.UpdateConfig(ctx, "cfg_abc123", "New Name", map[string]any{
"mode": "request",
})DeleteConfig(ctx, configID)
result, err := client.DeleteConfig(ctx, "cfg_abc123")GenerateConfig(ctx, name, prompt)
Generate a scrape config from natural language using AI.
config, err := client.GenerateConfig(ctx, "Amazon Scraper",
"Scrape product title and price from Amazon product pages")Schema Management
Define reusable structured data extraction schemas.
ListSchemas(ctx, opts)
schemas, err := client.ListSchemas(ctx, evomi.ListSchemasOptions{
Page: 1,
PerPage: 20,
SortBy: "created_at",
SortOrder: "desc",
})CreateSchema(ctx, name, config, opts)
schema, err := client.CreateSchema(ctx, "Product Schema", map[string]any{
"url": "https://example.com/product",
"extract_scheme": []map[string]any{
{"label": "title", "type": "content", "selector": "h1"},
{"label": "price", "type": "content", "selector": ".price"},
},
}, evomi.CreateSchemaOptions{
Test: true,
Fix: false,
})GetSchema(ctx, schemeID)
schema, err := client.GetSchema(ctx, "sch_abc123")UpdateSchema(ctx, schemeID, name, config, opts)
schema, err := client.UpdateSchema(ctx, "sch_abc123", "Updated Schema",
map[string]any{"url": "...", "extract_scheme": [...]},
evomi.CreateSchemaOptions{Test: true})DeleteSchema(ctx, schemeID)
result, err := client.DeleteSchema(ctx, "sch_abc123")GetSchemaStatus(ctx, schemeID)
status, err := client.GetSchemaStatus(ctx, "sch_abc123")Schedule Management
Run scrape configs on a recurring schedule.
ListSchedules(ctx, opts)
schedules, err := client.ListSchedules(ctx, evomi.ListSchedulesOptions{
Page: 1,
PerPage: 20,
ActiveOnly: false,
})CreateSchedule(ctx, name, configID, intervalMinutes, opts)
schedule, err := client.CreateSchedule(ctx, "Daily Price Check", "cfg_abc123", 1440,
evomi.CreateScheduleOptions{
StartTime: "09:00",
StopOnError: true,
})GetSchedule(ctx, scheduleID)
schedule, err := client.GetSchedule(ctx, "sched_abc123")UpdateSchedule(ctx, scheduleID, opts)
schedule, err := client.UpdateSchedule(ctx, "sched_abc123", evomi.UpdateScheduleOptions{
Name: "New Name",
IntervalMinutes: 720,
})DeleteSchedule(ctx, scheduleID)
result, err := client.DeleteSchedule(ctx, "sched_abc123")ToggleSchedule(ctx, scheduleID)
result, err := client.ToggleSchedule(ctx, "sched_abc123")ListScheduleRuns(ctx, scheduleID, opts)
runs, err := client.ListScheduleRuns(ctx, "sched_abc123", evomi.ListScheduleRunsOptions{
Page: 1,
PerPage: 20,
})Storage Management
Connect cloud storage to automatically save scrape results.
ListStorageConfigs(ctx)
configs, err := client.ListStorageConfigs(ctx)CreateStorageConfig(ctx, name, storageType, config, setAsDefault)
// S3-compatible storage
storage, err := client.CreateStorageConfig(ctx, "My S3", "s3_compatible", map[string]any{
"bucket": "my-bucket",
"region": "us-east-1",
"access_key": "...",
"secret_key": "...",
}, true)
// Google Cloud Storage
storage, err := client.CreateStorageConfig(ctx, "My GCS", "gcs", map[string]any{
"bucket": "my-bucket",
"credentials_json": "...",
}, false)
// Azure Blob Storage
storage, err := client.CreateStorageConfig(ctx, "My Azure", "azure_blob", map[string]any{
"container": "my-container",
"connection_string": "...",
}, false)UpdateStorageConfig(ctx, storageID, opts)
setAsDefault := true
storage, err := client.UpdateStorageConfig(ctx, "stor_abc123", evomi.UpdateStorageOptions{
Name: "Renamed Storage",
SetAsDefault: &setAsDefault,
})DeleteStorageConfig(ctx, storageID)
result, err := client.DeleteStorageConfig(ctx, "stor_abc123")Public API
Access proxy credentials and related data.
GetPublicAPI(ctx)
Access the Evomi Public API to get proxy credentials and related data.
data, err := client.GetPublicAPI(ctx)
// Returns proxy credentials and product information
GetProxyData(ctx)
Get detailed information about your proxy products.
data, err := client.GetProxyData(ctx)
// Returns: {"products": {"rp": {...}, "sdc": {...}, "mp": {...}}, ...}
GetTargetingOptions(ctx)
Get available targeting parameters for different proxy types.
options, err := client.GetTargetingOptions(ctx)GetScraperData(ctx)
Get information about your Scraper API access.
data, err := client.GetScraperData(ctx)GetBrowserData(ctx)
Get information about your Browser API access.
data, err := client.GetBrowserData(ctx)RotateSession(ctx, sessionID, product)
Force an IP address change for an existing proxy session.
result, err := client.RotateSession(ctx, "abc12345", "rp")
// product: "rpc", "rp", "sdc", "mp"
GenerateProxies(ctx, product, opts)
Generate proxy strings with specific targeting parameters.
adblock := true
prependProtocol := true
proxies, err := client.GenerateProxies(ctx, "rp", evomi.GenerateProxiesOptions{
Countries: "US,GB,DE",
City: "New York",
Session: "sticky",
Amount: 10,
Protocol: "http",
Lifetime: 30,
Adblock: &adblock,
PrependProtocol: &prependProtocol,
})
// Returns plain text, one proxy per line
Account Info
GetAccountInfo(ctx)
info, err := client.GetAccountInfo(ctx)
fmt.Println(info["credits_remaining"])Webhooks
Webhooks allow you to receive notifications when scraping operations complete, fail, or start. Supports Discord, Slack, and custom endpoints.
WebhookConfig
import "github.com/evomi/evomi-go-client/evomi"
// Discord webhook
webhook := &evomi.WebhookConfig{
URL: "https://discord.com/api/webhooks/...",
Type: "discord",
Events: []string{"completed", "failed"},
}
// Custom webhook with HMAC signature
webhook := &evomi.WebhookConfig{
URL: "https://your-server.com/webhook",
Type: "custom",
Events: []string{"completed"},
Secret: "your-secret-key",
}| Field | Type | Default | Description |
|---|---|---|---|
URL |
string | required | Your webhook endpoint URL |
Type |
string | "custom" |
Type: "discord", "slack", or "custom" |
Events |
[]string |
["completed"] |
Events to subscribe to |
Secret |
string | — | Secret key for HMAC signature (custom only) |
Using Webhooks with Scrape
webhook := &evomi.WebhookConfig{
URL: "https://discord.com/api/webhooks/...",
Type: "discord",
Events: []string{"completed", "failed"},
}
result, err := client.Scrape(ctx, "https://example.com", evomi.ScrapeOptions{
Mode: "browser",
Webhook: webhook,
})Using Webhooks with Crawl/Map/Search
// With crawl
result, err := client.Crawl(ctx, "example.com", evomi.CrawlOptions{
MaxURLs: 100,
Webhook: webhook,
})
// With MapWebsite
result, err := client.MapWebsite(ctx, "example.com", evomi.MapOptions{
Webhook: webhook,
})
// With SearchDomains
result, err := client.SearchDomains(ctx, "e-commerce platforms", evomi.SearchOptions{
Webhook: webhook,
})Using Webhooks with Schedules
schedule, err := client.CreateSchedule(ctx, "Daily Price Check", "cfg_abc123", 1440,
evomi.CreateScheduleOptions{
StartTime: "09:00",
StopOnError: true,
Webhook: webhook,
})Proxy String Builder
Evomi provides a proxy network you can use with any HTTP client. Build proxy strings for Go’s http.Client or any other library:
Automatic Proxy Configuration
client := evomi.NewClient("your-api-key", "", "")
proxyString, err := client.BuildProxyString(ctx, evomi.ProxyTypeResidential, struct {
Country string
Session string
}{
Country: "US",
Session: "abc12345",
})
fmt.Println(proxyString)
// Output: http://user:[email protected]:1000
Manual Proxy Configuration
config := &evomi.ProxyConfig{
ProxyType: evomi.ProxyTypeResidential,
Protocol: evomi.ProxyProtocolHTTP,
Country: "US",
City: "New York",
Username: "your-username",
Password: "your-password",
}
proxyString := config.BuildProxyString()Proxy Configuration Options
| Parameter | Type | Default | Description |
|---|---|---|---|
ProxyType |
ProxyType | ProxyTypeResidential |
Type: ProxyTypeResidential, ProxyTypeDatacenter, ProxyTypeMobile |
Protocol |
ProxyProtocol | ProxyProtocolHTTP |
Protocol: ProxyProtocolHTTP, ProxyProtocolHTTPS, ProxyProtocolSOCKS5 |
Country |
string | — | Two-letter ISO country code (e.g., “US”, “DE”) |
City |
string | — | City name (spaces replaced with dots) |
Region |
string | — | State/region name |
Continent |
string | — | Continent: africa, asia, europe, north.america, oceania, south.america |
ISP |
string | — | ISP shortcode (e.g., “att”, “comcast”) |
Session |
string | — | Sticky session ID (6-10 alphanumeric chars) |
Hardsession |
string | — | Hard session ID (6-10 alphanumeric chars) |
Lifetime |
int | — | Session duration in minutes (max 120) |
Mode |
ResidentialMode | — | Residential mode: ResidentialModeSpeed, ResidentialModeQuality |
Expert Settings
| Parameter | Type | Default | Description |
|---|---|---|---|
Latency |
int | — | Max latency in ms |
Fraudscore |
int | — | Max fraud score |
Device |
string | — | Device type: “windows”, “unix”, “apple” |
Activesince |
int | — | Min connection minutes |
ASN |
string | — | ASN filter |
Zip |
string | — | Zipcode targeting |
HTTP3 |
bool | false |
Enable HTTP3/QUIC |
LocalDNS |
bool | false |
Local DNS resolution |
UDP |
bool | false |
UDP support (Enterprise only) |
Extended |
bool | false |
Extended pool (cannot combine with other expert filters) |
Proxy Endpoints & Ports
| Type | HTTP | HTTPS | SOCKS5 |
|---|---|---|---|
| Residential | rp.evomi.com:1000 |
rp.evomi.com:1001 |
rp.evomi.com:1002 |
| Datacenter | dcp.evomi.com:2000 |
dcp.evomi.com:2001 |
dcp.evomi.com:2002 |
| Mobile | mp.evomi.com:3000 |
mp.evomi.com:3001 |
mp.evomi.com:3002 |
Proxy String Format
{protocol}://{username}:{password}_{params}@{endpoint}:{port}Example: http://user:[email protected]:1000
Proxy Types
| Type | Endpoint | Use Case |
|---|---|---|
| Residential | rp.evomi.com:1000 |
Human-like browsing, anti-bot bypass |
| Datacenter | dcp.evomi.com:2000 |
Fast, high-volume requests |
| Mobile | mp.evomi.com:3000 |
Highest trust, mobile-specific targets |
Error Handling
result, err := client.Scrape(ctx, "https://example.com", evomi.ScrapeOptions{})
if err != nil {
log.Fatal(err)
}
if success, ok := result["success"].(bool); !ok || !success {
fmt.Println("API error:", result["error"])
}Credits & Pricing
All operations consume credits:
| Operation | Cost |
|---|---|
| Base request | 1 credit |
| Browser mode | 5x multiplier |
| Residential proxy | 2x multiplier |
| AI enhancement | +30 credits |
| Screenshot/PDF | +1 credit each |
Credit usage is returned in the result:
fmt.Println(result["_credits_used"])
fmt.Println(result["_credits_remaining"])Requirements
- Go 1.21+
Resources
| Resource | Link |
|---|---|
| GitHub Repository | github.com/evomi/evomi-go-client |
| Evomi Website | evomi.com |
| API Documentation | docs.evomi.com |
Benefits
- Native Go — Idiomatic Go with typed structs and comprehensive endpoint support
- Full API Coverage — All Evomi endpoints supported
- Strong Typing — Typed structs for configuration and requests