Back to API Overview

Complete API Reference

All 156 endpoints across 25 sections

Authentication

User authentication and session management

1 endpoint
POST/api/auth/signup
Public

Sign Up

Register a new user account

Rate Limited: 5 requests per 15 minutes per IP address

Request Body

NameTypeRequiredDescription
emailstringRequiredUser email address
passwordstringRequiredPassword (minimum 8 characters)
namestringOptionalUser display name
termsAcceptedbooleanRequiredMust be true to accept terms
privacyAcceptedbooleanRequiredMust be true to accept privacy policy
marketingConsentbooleanOptionalOpt-in to marketing emails

Example Request

curl -X POST "https://api.scrappy.gg/api/auth/signup" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "your-password",
"termsAccepted": true,
"privacyAccepted": true
}'

Responses

201User created successfully
{
"success": true,
"data": {
"user": {
"id": "abc123",
"email": "user@example.com"
}
}
}
400Invalid input
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid email format"
}
}
429Rate limit exceeded
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many attempts"
}
}

Users

User profile and account management

2 endpoints
GET/api/users
Auth Required

Get Current User

Get the authenticated user's profile and statistics

Example Request

curl -X GET "https://api.scrappy.gg/api/users" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200User profile returned
{
"success": true,
"data": {
"user": {
"id": "abc123",
"email": "user@example.com",
"name": "John Doe",
"createdAt": "2024-01-01T00:00:00Z"
},
"stats": {
"sources": 10,
"jobs": 25,
"leads": 500
}
}
}
401Not authenticated
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required"
}
}
PATCH/api/users/password
Auth Required

Change Password

Update the authenticated user's password

Request Body

NameTypeRequiredDescription
currentPasswordstringRequiredCurrent password for verification
newPasswordstringRequiredNew password (minimum 8 characters)

Example Request

curl -X PATCH "https://api.scrappy.gg/api/users/password" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"currentPassword": "your-password",
"newPassword": "your-password"
}'

Responses

200Password updated
{
"success": true
}
400Invalid password
{
"success": false,
"error": {
"code": "INVALID_PASSWORD",
"message": "Current password is incorrect"
}
}

Data Export

GDPR subject access requests - export your data

3 endpoints
POST/api/users/export
Auth Required

Request Data Export

Request an export of all your data (JSON or CSV format)

Rate Limited: 3 requests per 1 week per user

Request Body

NameTypeRequiredDescription
formatstringOptionalExport formatOptions: JSON, CSVDefault: JSON

Example Request

curl -X POST "https://api.scrappy.gg/api/users/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Export request created
{
"success": true,
"data": {
"requestId": "abc123",
"status": "PENDING",
"downloadExpiry": "2024-01-08T00:00:00Z"
}
}
429Rate limit exceeded
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Maximum 3 exports per week"
}
}
GET/api/users/export/status
Auth Required

Get Export Status

Check the status of all export requests

Example Request

curl -X GET "https://api.scrappy.gg/api/users/export/status" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Export status returned
{
"success": true,
"data": {
"exports": [
{
"requestId": "abc123",
"status": "COMPLETED",
"format": "JSON",
"createdAt": "2024-01-01T00:00:00Z",
"downloadExpiry": "2024-01-08T00:00:00Z"
}
]
}
}
GET/api/users/export/download
Auth Required

Download Export

Download a completed data export (7-day download window)

Query Parameters

NameTypeRequiredDescription
requestIdstringRequiredThe export request ID

Example Request

curl -X GET ?requestId=abc123"https://api.scrappy.gg/api/users/export/download" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200File download
{
"note": "Returns file attachment"
}
404Export not found or expired
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Export not found or expired"
}
}

Account Deletion

GDPR right to erasure - delete your account

4 endpoints
POST/api/users/deletion
Auth Required

Request Account Deletion

Request deletion of your account. A confirmation email will be sent.

Rate Limited: 1 requests per 1 day per user

Example Request

curl -X POST "https://api.scrappy.gg/api/users/deletion" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Deletion requested
{
"success": true,
"data": {
"expiresAt": "2024-01-02T00:00:00Z"
}
}
429Rate limit exceeded
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "One deletion request per day"
}
}
POST/api/users/deletion/confirm
Auth Required

Confirm Account Deletion

Confirm account deletion using the token from email. Starts 30-day grace period.

Request Body

NameTypeRequiredDescription
tokenstringRequiredConfirmation token from email (24-hour expiry)

Example Request

curl -X POST "https://api.scrappy.gg/api/users/deletion/confirm" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"token": "string"
}'

Responses

200Deletion confirmed
{
"success": true,
"data": {
"scheduledAt": "2024-01-31T00:00:00Z",
"gracePeriodDays": 30
}
}
400Invalid or expired token
{
"success": false,
"error": {
"code": "INVALID_TOKEN",
"message": "Token is invalid or expired"
}
}
POST/api/users/deletion/cancel
Auth Required

Cancel Account Deletion

Cancel a pending account deletion during the grace period

Example Request

curl -X POST "https://api.scrappy.gg/api/users/deletion/cancel" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Deletion cancelled
{
"success": true,
"message": "Account deletion cancelled"
}
400No pending deletion
{
"success": false,
"error": {
"code": "NO_PENDING_DELETION",
"message": "No deletion request to cancel"
}
}
GET/api/users/deletion/status
Auth Required

Get Deletion Status

Check the status of any pending account deletion

Example Request

curl -X GET "https://api.scrappy.gg/api/users/deletion/status" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Deletion status returned
{
"success": true,
"data": {
"status": "scheduled",
"scheduledAt": "2024-01-31T00:00:00Z",
"gracePeriodDays": 30
}
}

Projects

Organize sources and leads into projects

5 endpoints
GET/api/projects
Auth Required

List Projects

Get all projects for the authenticated user

Example Request

curl -X GET "https://api.scrappy.gg/api/projects" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Projects returned
{
"success": true,
"data": {
"projects": [
{
"id": "abc123",
"name": "My Project",
"description": "Project description",
"color": "#3b82f6",
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
}
POST/api/projects
Auth Required

Create Project

Create a new project

Request Body

NameTypeRequiredDescription
namestringRequiredProject name
descriptionstringOptionalProject description
colorstringOptionalHex color code (e.g., #3b82f6)

Example Request

curl -X POST "https://api.scrappy.gg/api/projects" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name"
}'

Responses

201Project created
{
"success": true,
"data": {
"project": {
"id": "abc123",
"name": "My Project"
}
}
}
GET/api/projects/[id]
Auth Required

Get Project

Get a specific project by ID

Path Parameters

NameTypeRequiredDescription
idstringRequiredProject ID

Example Request

curl -X GET "https://api.scrappy.gg/api/projects/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Project returned
{
"success": true,
"data": {
"project": {
"id": "abc123",
"name": "My Project"
}
}
}
404Project not found
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Project not found"
}
}
PATCH/api/projects/[id]
Auth Required

Update Project

Update a project's details

Path Parameters

NameTypeRequiredDescription
idstringRequiredProject ID

Request Body

NameTypeRequiredDescription
namestringOptionalProject name
descriptionstringOptionalProject description
colorstringOptionalHex color code

Example Request

curl -X PATCH "https://api.scrappy.gg/api/projects/abc123" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Project updated
{
"success": true,
"data": {
"project": {
"id": "abc123",
"name": "Updated Project"
}
}
}
403Not authorized
{
"success": false,
"error": {
"code": "FORBIDDEN",
"message": "Not authorized to update this project"
}
}
DELETE/api/projects/[id]
Auth Required

Delete Project

Delete a project and all associated data

Path Parameters

NameTypeRequiredDescription
idstringRequiredProject ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/projects/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Project deleted
{
"success": true
}
403Not authorized
{
"success": false,
"error": {
"code": "FORBIDDEN",
"message": "Not authorized to delete this project"
}
}

Sources

Manage data sources for lead scraping

10 endpoints
GET/api/sources
Auth Required

List Sources

Get all sources with optional filtering

Query Parameters

NameTypeRequiredDescription
statusstringOptionalFilter by statusOptions: DRAFT, ACTIVE, ARCHIVED
projectIdstringOptionalFilter by project ID

Example Request

curl -X GET "https://api.scrappy.gg/api/sources" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Sources returned
{
"success": true,
"data": {
"sources": [
{
"id": "abc123",
"name": "Example Source",
"url": "https://example.com",
"scrapeType": "STATIC",
"status": "ACTIVE"
}
]
}
}
POST/api/sources
Auth Required

Create Source

Create a new source for lead scraping

Request Body

NameTypeRequiredDescription
namestringRequiredSource name
urlstringRequiredURL to scrape
scrapeTypestringRequiredType of scrapingOptions: STATIC, DYNAMIC, API
selectorsobjectRequiredCSS/XPath selectors for data extraction
descriptionstringOptionalSource description
scheduleTypestringOptionalScraping scheduleOptions: MANUAL, HOURLY, DAILY, WEEKLY

Example Request

curl -X POST "https://api.scrappy.gg/api/sources" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"url": "https://example.com",
"scrapeType": "string",
"selectors": {}
}'

Responses

201Source created
{
"success": true,
"data": {
"source": {
"id": "abc123",
"name": "Example Source",
"status": "DRAFT"
}
}
}
GET/api/sources/[id]
Auth Required

Get Source

Get a specific source by ID

Path Parameters

NameTypeRequiredDescription
idstringRequiredSource ID

Example Request

curl -X GET "https://api.scrappy.gg/api/sources/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Source returned
{
"success": true,
"data": {
"source": {
"id": "abc123",
"name": "Example Source"
}
}
}
PATCH/api/sources/[id]
Auth Required

Update Source

Update a source's configuration

Path Parameters

NameTypeRequiredDescription
idstringRequiredSource ID

Request Body

NameTypeRequiredDescription
namestringOptionalSource name
urlstringOptionalURL to scrape
selectorsobjectOptionalCSS/XPath selectors

Example Request

curl -X PATCH "https://api.scrappy.gg/api/sources/abc123" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Source updated
{
"success": true,
"data": {
"source": {
"id": "abc123",
"name": "Updated Source"
}
}
}
DELETE/api/sources/[id]
Auth Required

Delete Source

Delete a source

Path Parameters

NameTypeRequiredDescription
idstringRequiredSource ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/sources/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Source deleted
{
"success": true
}
POST/api/sources/[id]/activate
Auth Required

Activate Source

Activate a draft source to enable scraping

Path Parameters

NameTypeRequiredDescription
idstringRequiredSource ID

Example Request

curl -X POST "https://api.scrappy.gg/api/sources/abc123/activate" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Source activated
{
"success": true,
"data": {
"source": {
"id": "abc123",
"status": "ACTIVE"
}
}
}
400Already active
{
"success": false,
"error": {
"code": "ALREADY_ACTIVE",
"message": "Source is already active"
}
}
POST/api/sources/discover
Auth Required

Discover Sources (AI)

Use AI to discover relevant sources based on a search query

Request Body

NameTypeRequiredDescription
querystringRequiredSearch query (minimum 3 characters)
countnumberOptionalNumber of sources to discover (1-10)Default: 5

Example Request

curl -X POST "https://api.scrappy.gg/api/sources/discover" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "search term"
}'

Responses

200Sources discovered
{
"success": true,
"data": {
"sources": [
{
"name": "Example Directory",
"url": "https://example.com/directory",
"category": "Business Directory",
"estimatedLeads": 500,
"scrapeType": "STATIC",
"description": "A directory of local businesses",
"reasoning": "This directory contains relevant business listings"
}
]
}
}
POST/api/sources/generate
Auth Required

Generate Sources (AI)

Use AI to generate source suggestions based on a project description

Request Body

NameTypeRequiredDescription
projectDescriptionstringRequiredProject description (minimum 10 characters)
targetAudiencestringOptionalTarget audience for the leads
industrystringOptionalIndustry to focus on
locationstringOptionalGeographic location
countnumberOptionalNumber of sources to generate (1-5)Default: 3
autoSavebooleanOptionalAutomatically save generated sources to the projectDefault: false

Example Request

curl -X POST "https://api.scrappy.gg/api/sources/generate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectDescription": "string"
}'

Responses

200Sources generated
{
"success": true,
"data": {
"sources": [
{
"name": "Industry Directory",
"url": "https://example.com/directory",
"description": "Relevant directory for target industry",
"scrapeType": "STATIC",
"reasoning": "Matches project requirements"
}
]
}
}
400Invalid input
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Project description must be at least 10 characters"
}
}
POST/api/sources/batch
Auth Required

Batch Create Sources

Create multiple sources at once from AI suggestions or manual input

Request Body

NameTypeRequiredDescription
sourcesarrayRequiredArray of source objects to create (1 or more)
sources[].namestringRequiredSource name
sources[].urlstringRequiredURL to scrape
sources[].descriptionstringOptionalSource description
sources[].scrapeTypestringOptionalType of scrapingOptions: STATIC, DYNAMIC, APIDefault: DYNAMIC
sources[].selectorsobjectOptionalCSS/XPath selectors for data extraction
sources[].reasoningstringOptionalAI reasoning for why this source was suggested

Example Request

curl -X POST "https://api.scrappy.gg/api/sources/batch" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sources": [],
"sources[].name": "Example Name",
"sources[].url": "https://example.com"
}'

Responses

201Sources created
{
"success": true,
"data": {
"sources": [
{
"id": "abc123",
"name": "Example Source",
"status": "DRAFT"
}
],
"count": 1
}
}
400Invalid input
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "At least one source is required"
}
}
POST/api/sources/analyze
Auth Required

Analyze Source

Analyze project requirements from a URL or PDF file

Request Body

NameTypeRequiredDescription
filefileOptionalPDF file to analyze (mutually exclusive with url)
urlstringOptionalURL to analyze (mutually exclusive with file)

Example Request

curl -X POST "https://api.scrappy.gg/api/sources/analyze" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: multipart/form-data"

Responses

200Analysis results
{
"success": true,
"data": {
"requirements": {
"targetAudience": "Small businesses",
"industry": "Technology",
"location": "United States",
"suggestedSources": []
}
}
}
400Invalid input
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Either file or url is required"
}
}

Jobs

Scraping job management and monitoring

5 endpoints
GET/api/jobs
Auth Required

List Jobs

Get all scraping jobs

Example Request

curl -X GET "https://api.scrappy.gg/api/jobs" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Jobs returned
{
"success": true,
"data": {
"jobs": [
{
"id": "abc123",
"name": "Scrape Job",
"status": "COMPLETED",
"progress": 100,
"leadsFound": 150,
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
}
POST/api/jobs
Auth Required

Create Job

Create and enqueue a new scraping job

Request Body

NameTypeRequiredDescription
namestringRequiredJob name
sourceIdstringRequiredSource ID to scrape

Example Request

curl -X POST "https://api.scrappy.gg/api/jobs" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"sourceId": "abc123"
}'

Responses

201Job created
{
"success": true,
"data": {
"job": {
"id": "abc123",
"name": "Scrape Job",
"status": "PENDING"
}
}
}
GET/api/jobs/[id]
Auth Required

Get Job

Get job details and progress

Path Parameters

NameTypeRequiredDescription
idstringRequiredJob ID

Example Request

curl -X GET "https://api.scrappy.gg/api/jobs/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Job returned
{
"success": true,
"data": {
"job": {
"id": "abc123",
"status": "RUNNING",
"progress": 45,
"leadsFound": 67
}
}
}
DELETE/api/jobs/[id]
Auth Required

Cancel/Delete Job

Cancel a running job or delete a completed job

Path Parameters

NameTypeRequiredDescription
idstringRequiredJob ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/jobs/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Job cancelled/deleted
{
"success": true
}
POST/api/jobs/[id]/retry
Auth Required

Retry Job

Retry a failed job

Path Parameters

NameTypeRequiredDescription
idstringRequiredJob ID

Example Request

curl -X POST "https://api.scrappy.gg/api/jobs/abc123/retry" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Job retry started
{
"success": true,
"message": "Job retry started"
}
400Job cannot be retried
{
"success": false,
"error": {
"code": "INVALID_STATUS",
"message": "Only failed jobs can be retried"
}
}

Leads

Lead management and email validation

9 endpoints
GET/api/leads
Auth Required

List Leads

Get all leads with optional filtering

Query Parameters

NameTypeRequiredDescription
statusstringOptionalFilter by status
companystringOptionalFilter by company name
jobIdstringOptionalFilter by job ID

Example Request

curl -X GET "https://api.scrappy.gg/api/leads" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Leads returned
{
"success": true,
"data": {
"leads": [
{
"id": "abc123",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"company": "Example Inc",
"status": "VALID"
}
]
}
}
POST/api/leads
Auth Required

Create Lead

Create a lead manually

Request Body

NameTypeRequiredDescription
sourceUrlstringRequiredSource URL where lead was found
firstNamestringOptionalFirst name
lastNamestringOptionalLast name
emailstringOptionalEmail address
phonestringOptionalPhone number
companystringOptionalCompany name
jobTitlestringOptionalJob title

Example Request

curl -X POST "https://api.scrappy.gg/api/leads" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sourceUrl": "https://example.com"
}'

Responses

201Lead created
{
"success": true,
"data": {
"lead": {
"id": "abc123",
"firstName": "John",
"lastName": "Doe"
}
}
}
GET/api/leads/[id]
Auth Required

Get Lead

Get lead details with job and source info

Path Parameters

NameTypeRequiredDescription
idstringRequiredLead ID

Example Request

curl -X GET "https://api.scrappy.gg/api/leads/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Lead returned
{
"success": true,
"data": {
"lead": {
"id": "abc123",
"email": "john@example.com"
}
}
}
PATCH/api/leads/[id]
Auth Required

Update Lead

Update a lead's information

Path Parameters

NameTypeRequiredDescription
idstringRequiredLead ID

Request Body

NameTypeRequiredDescription
firstNamestringOptionalFirst name
lastNamestringOptionalLast name
emailstringOptionalEmail address
statusstringOptionalLead status
tagsarrayOptionalTags for categorization
notesstringOptionalNotes about the lead

Example Request

curl -X PATCH "https://api.scrappy.gg/api/leads/abc123" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Lead updated
{
"success": true,
"data": {
"lead": {
"id": "abc123"
}
}
}
DELETE/api/leads/[id]
Auth Required

Delete Lead

Delete a lead

Path Parameters

NameTypeRequiredDescription
idstringRequiredLead ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/leads/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Lead deleted
{
"success": true
}
POST/api/leads/[id]/validate-email
Auth Required

Validate Lead Email

Trigger email validation for a specific lead

Path Parameters

NameTypeRequiredDescription
idstringRequiredLead ID

Example Request

curl -X POST "https://api.scrappy.gg/api/leads/abc123/validate-email" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Validation result
{
"success": true,
"data": {
"status": "VALID",
"tier": "TIER_1",
"errors": [],
"flags": []
}
}
400No email on lead
{
"success": false,
"error": {
"code": "NO_EMAIL",
"message": "Lead has no email to validate"
}
}
POST/api/leads/bulk
Auth Required

Bulk Delete Leads

Delete multiple leads at once (max 1000)

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredArray of lead IDs to delete (1-1000)

Example Request

curl -X POST "https://api.scrappy.gg/api/leads/bulk" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": []
}'

Responses

200Bulk delete result
{
"success": true,
"data": {
"deleted": 50,
"failed": 0,
"errors": []
}
}
PATCH/api/leads/bulk
Auth Required

Bulk Update Leads

Update multiple leads at once

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredArray of lead IDs to update
updatesobjectRequiredUpdates to apply (status, tags add/remove)

Example Request

curl -X PATCH "https://api.scrappy.gg/api/leads/bulk" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": [],
"updates": {}
}'

Responses

200Bulk update result
{
"success": true,
"data": {
"updated": 50,
"failed": 0
}
}
POST/api/leads/validate-bulk
Auth Required

Bulk Validate Emails

Queue email validation for multiple leads (max 1000)

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredArray of lead IDs to validate (1-1000)

Example Request

curl -X POST "https://api.scrappy.gg/api/leads/validate-bulk" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": []
}'

Responses

200Validation queued
{
"success": true,
"data": {
"totalRequested": 100,
"totalQueued": 95,
"skipped": [
{
"id": "abc",
"reason": "No email"
}
]
}
}

Profile Types & Profiles

Custom entity schemas for structured data extraction, plus management of extracted profiles

11 endpoints
GET/api/profile-types
Auth Required

List Profile Types

Get all profile type schemas defined by the user.

Example Request

curl -X GET "https://api.scrappy.gg/api/profile-types" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Profile types returned
{
"success": true,
"data": {
"profileTypes": [
{
"id": "pt_123",
"name": "Private Lender",
"slug": "private-lender",
"fields": [],
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
}
POST/api/profile-types
Auth Required

Create Profile Type

Define a new custom entity schema for structured data extraction.

Request Body

NameTypeRequiredDescription
namestringRequiredProfile type name
slugstringRequiredURL-safe identifier
descriptionstringOptionalSchema description
fieldsarrayRequiredJSON Schema field definitions

Example Request

curl -X POST "https://api.scrappy.gg/api/profile-types" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"slug": "string",
"fields": []
}'

Responses

201Profile type created
{
"success": true,
"data": {
"id": "pt_123",
"name": "Private Lender"
}
}
GET/api/profile-types/{id}
Auth Required

Get Profile Type

Get a profile type by ID.

Path Parameters

NameTypeRequiredDescription
idstringRequiredProfile type ID

Example Request

curl -X GET "https://api.scrappy.gg/api/profile-types/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Profile type returned
{
"success": true,
"data": {}
}
PATCH/api/profile-types/{id}
Auth Required

Update Profile Type

Update a profile type's fields or metadata.

Path Parameters

NameTypeRequiredDescription
idstringRequiredProfile type ID

Request Body

NameTypeRequiredDescription
namestringOptionalProfile type name
fieldsarrayOptionalUpdated field definitions

Example Request

curl -X PATCH "https://api.scrappy.gg/api/profile-types/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Profile type updated
{
"success": true,
"data": {}
}
DELETE/api/profile-types/{id}
Auth Required

Delete Profile Type

Delete a profile type schema.

Path Parameters

NameTypeRequiredDescription
idstringRequiredProfile type ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/profile-types/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Deleted
{
"success": true
}
GET/api/profile-types/templates
Auth Required

List Built-in Templates

Get built-in profile type templates (e.g. Private Lender, Restaurant, SaaS Company).

Example Request

curl -X GET "https://api.scrappy.gg/api/profile-types/templates" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Templates returned
{
"success": true,
"data": {
"templates": [
{
"slug": "private-lender",
"name": "Private Lender",
"description": "Real estate lender schema"
},
{
"slug": "restaurant",
"name": "Restaurant",
"description": "Food & beverage schema"
}
]
}
}
GET/api/profiles
Auth Required

List Profiles

Get extracted profiles with optional filtering.

Query Parameters

NameTypeRequiredDescription
profileTypeIdstringOptionalFilter by profile type
statusstringOptionalFilter by statusOptions: NEW, VERIFIED, OUTDATED, ARCHIVED
pagenumberOptionalPage number
limitnumberOptionalItems per page (max: 100)

Example Request

curl -X GET "https://api.scrappy.gg/api/profiles" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Profiles returned
{
"success": true,
"data": {
"profiles": [
{
"id": "prof_123",
"profileTypeId": "pt_123",
"data": {},
"status": "NEW"
}
],
"total": 5
}
}
GET/api/profiles/{id}
Auth Required

Get Profile

Get a single profile by ID.

Path Parameters

NameTypeRequiredDescription
idstringRequiredProfile ID

Example Request

curl -X GET "https://api.scrappy.gg/api/profiles/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Profile returned
{
"success": true,
"data": {}
}
PATCH/api/profiles/{id}
Auth Required

Update Profile

Update profile data or status.

Path Parameters

NameTypeRequiredDescription
idstringRequiredProfile ID

Request Body

NameTypeRequiredDescription
dataobjectOptionalProfile field data
statusstringOptionalProfile statusOptions: NEW, VERIFIED, OUTDATED, ARCHIVED

Example Request

curl -X PATCH "https://api.scrappy.gg/api/profiles/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Profile updated
{
"success": true,
"data": {}
}
GET/api/profiles/export
Auth Required

Export Profiles

Export profiles as CSV. Optionally filter by matching rule (includes matchScore + aiReasoning columns).

Query Parameters

NameTypeRequiredDescription
profileTypeIdstringOptionalFilter by profile type
ruleIdstringOptionalExport profiles matching a specific matching rule

Example Request

curl -X GET "https://api.scrappy.gg/api/profiles/export" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200CSV file returned
{
"Content-Type": "text/csv"
}
GET/api/profiles/stats
Auth Required

Profile Stats

Get aggregate statistics across all profiles.

Example Request

curl -X GET "https://api.scrappy.gg/api/profiles/stats" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Stats returned
{
"success": true,
"data": {
"total": 150,
"byStatus": {
"NEW": 80,
"VERIFIED": 50,
"OUTDATED": 15,
"ARCHIVED": 5
},
"byProfileType": [
{
"profileTypeId": "pt_123",
"count": 90
}
]
}
}

Matching Engine

Rules-based and AI-powered filtering and scoring of profiles — FILTER, SCORED, and AI match types

8 endpoints
GET/api/matching/rules
Auth Required

List Matching Rules

Get all matching rules for the current user.

Query Parameters

NameTypeRequiredDescription
profileTypeIdstringOptionalFilter by profile type

Example Request

curl -X GET "https://api.scrappy.gg/api/matching/rules" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Rules returned
{
"success": true,
"data": {
"rules": [
{
"id": "rule_123",
"name": "High-value Leads",
"type": "SCORED",
"profileTypeId": "pt_123"
}
]
}
}
POST/api/matching/rules
Auth Required

Create Matching Rule

Create a new matching rule. Three types are supported: FILTER (boolean pass/fail), SCORED (weighted 0–100 score), and AI (LLM-powered evaluation using aiPrompt).

Request Body

NameTypeRequiredDescription
namestringRequiredRule name
typestringRequiredMatch typeOptions: FILTER, SCORED, AI
profileTypeIdstringRequiredProfile type this rule applies to
criteriaobjectOptionalMatching criteria (field conditions and weights). Can be empty {} for AI type.
aiPromptstringOptionalLLM prompt template for AI type rules. Use {{profile}} and {{profileType}} placeholders.
minimumScorenumberOptionalMinimum score threshold for SCORED type (0–100)

Example Request

curl -X POST "https://api.scrappy.gg/api/matching/rules" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"type": "string",
"profileTypeId": "abc123"
}'

Responses

201Rule created
{
"success": true,
"data": {
"id": "rule_123",
"name": "High-value Leads"
}
}
GET/api/matching/rules/{id}
Auth Required

Get Matching Rule

Get a matching rule by ID.

Path Parameters

NameTypeRequiredDescription
idstringRequiredRule ID

Example Request

curl -X GET "https://api.scrappy.gg/api/matching/rules/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Rule returned
{
"success": true,
"data": {}
}
PATCH/api/matching/rules/{id}
Auth Required

Update Matching Rule

Update a matching rule's criteria or metadata.

Path Parameters

NameTypeRequiredDescription
idstringRequiredRule ID

Request Body

NameTypeRequiredDescription
namestringOptionalRule name
criteriaobjectOptionalUpdated criteria
aiPromptstringOptionalUpdated AI prompt

Example Request

curl -X PATCH "https://api.scrappy.gg/api/matching/rules/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Rule updated
{
"success": true,
"data": {}
}
DELETE/api/matching/rules/{id}
Auth Required

Delete Matching Rule

Delete a matching rule.

Path Parameters

NameTypeRequiredDescription
idstringRequiredRule ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/matching/rules/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Rule deleted
{
"success": true
}
POST/api/matching/preview
Auth Required

Preview Matching

Test a matching rule against sample profiles before saving.

Request Body

NameTypeRequiredDescription
ruleIdstringOptionalExisting rule to preview
typestringOptionalRule type for inline previewOptions: FILTER, SCORED, AI
criteriaobjectOptionalInline criteria to test
aiPromptstringOptionalInline AI prompt to test
profileTypeIdstringOptionalProfile type to test against
sampleSizenumberOptionalNumber of sample profiles (default: 10)

Example Request

curl -X POST "https://api.scrappy.gg/api/matching/preview" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Preview results
{
"success": true,
"data": {
"matched": 7,
"notMatched": 3,
"results": [
{
"profileId": "prof_123",
"matched": true,
"score": 87,
"reasoning": "Revenue > $1M"
}
]
}
}
POST/api/matching/execute
Auth Required

Execute Matching Rule

Run a matching rule against all profiles and store results.

Request Body

NameTypeRequiredDescription
ruleIdstringRequiredRule ID to execute

Example Request

curl -X POST "https://api.scrappy.gg/api/matching/execute" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ruleId": "abc123"
}'

Responses

200Execution results
{
"success": true,
"data": {
"matched": 42,
"notMatched": 18,
"executionTimeMs": 1250
}
}
GET/api/matching/results
Auth Required

List Matching Results

Get stored matching results for a rule.

Query Parameters

NameTypeRequiredDescription
ruleIdstringRequiredRule ID
matchedbooleanOptionalFilter matched/unmatched
pagenumberOptionalPage number
limitnumberOptionalItems per page

Example Request

curl -X GET ?ruleId=abc123"https://api.scrappy.gg/api/matching/results" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Results returned
{
"success": true,
"data": {
"results": [
{
"profileId": "prof_123",
"matched": true,
"score": 87,
"matchedAt": "2024-01-15"
}
],
"total": 42
}
}

Accounts

Aggregated company/account view derived from lead data

4 endpoints
GET/api/accounts
Auth Required

List Accounts

Returns companies aggregated from lead data with enriched metadata. Accounts are computed dynamically — not stored as a separate entity.

Query Parameters

NameTypeRequiredDescription
searchstringOptionalSearch by company name or domain
projectIdstringOptionalFilter by project ID
pagenumberOptionalPage number (default: 1)
limitnumberOptionalItems per page (default: 20, max: 100)

Example Request

curl -X GET "https://api.scrappy.gg/api/accounts" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Accounts returned
{
"success": true,
"data": {
"accounts": [
{
"id": "acme.com",
"companyDomain": "acme.com",
"companyName": "Acme Corp",
"leadCount": 12,
"latestLeadAt": "2024-01-15T10:30:00Z",
"emailsFound": 10,
"linkedinUrl": "https://linkedin.com/company/acme"
}
],
"total": 42,
"page": 1,
"limit": 20
}
}
GET/api/accounts/{accountId}
Auth Required

Get Account

Get a single account with all associated leads.

Path Parameters

NameTypeRequiredDescription
accountIdstringRequiredCompany domain used as account identifier

Example Request

curl -X GET "https://api.scrappy.gg/api/accounts/{accountId}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Account returned
{
"success": true,
"data": {
"id": "acme.com",
"companyDomain": "acme.com",
"companyName": "Acme Corp",
"leadCount": 12,
"leads": []
}
}
PATCH/api/accounts/{accountId}
Auth Required

Update Account

Update account metadata (e.g. notes, tags).

Path Parameters

NameTypeRequiredDescription
accountIdstringRequiredCompany domain used as account identifier

Request Body

NameTypeRequiredDescription
notesstringOptionalNotes about this account

Example Request

curl -X PATCH "https://api.scrappy.gg/api/accounts/{accountId}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Account updated
{
"success": true,
"data": {
"id": "acme.com"
}
}
GET/api/accounts/{accountId}/commonalities
Auth Required

Analyze LinkedIn Commonalities

Use AI (Perplexity) to analyze shared traits among leads at this account. Requires PERPLEXITY_API_KEY.

Path Parameters

NameTypeRequiredDescription
accountIdstringRequiredCompany domain

Example Request

curl -X GET "https://api.scrappy.gg/api/accounts/{accountId}/commonalities" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Commonalities analysis
{
"success": true,
"data": {
"commonalities": [
"Alumni of MIT",
"Previously worked at Google",
"Focus on B2B SaaS"
],
"analyzedProfiles": 8
}
}
503PERPLEXITY_API_KEY not configured
{
"success": false,
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "AI service not configured"
}
}

Deal Campaigns

AI-powered deal flow management — discover sources, rank accounts, and generate matching rules

8 endpoints
GET/api/campaigns
Auth Required

List Campaigns

Get all deal campaigns for the current user.

Query Parameters

NameTypeRequiredDescription
statusstringOptionalFilter by statusOptions: ACTIVE, PAUSED, COMPLETED, ARCHIVED
projectIdstringOptionalFilter by project ID

Example Request

curl -X GET "https://api.scrappy.gg/api/campaigns" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Campaigns returned
{
"success": true,
"data": {
"campaigns": [
{
"id": "camp_123",
"name": "Q1 Outreach",
"status": "ACTIVE"
}
]
}
}
POST/api/campaigns
Auth Required

Create Campaign

Create a new deal campaign.

Rate Limited: 5 requests per 1h per user

Request Body

NameTypeRequiredDescription
namestringRequiredCampaign name
descriptionstringOptionalCampaign description
targetIndustrystringOptionalTarget industry vertical
targetGeographystringOptionalTarget geography (e.g. 'US', 'New York')
targetCompanySizestringOptionalTarget company size (e.g. '50-200 employees')
dealParamsobjectOptionalCustom deal parameters (loan size, revenue threshold, etc.)
projectIdstringOptionalAssociate with a project

Example Request

curl -X POST "https://api.scrappy.gg/api/campaigns" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name"
}'

Responses

201Campaign created
{
"success": true,
"data": {
"id": "camp_123",
"name": "Q1 Outreach",
"status": "ACTIVE"
}
}
GET/api/campaigns/{id}
Auth Required

Get Campaign

Get a single campaign by ID.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Example Request

curl -X GET "https://api.scrappy.gg/api/campaigns/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Campaign returned
{
"success": true,
"data": {
"id": "camp_123"
}
}
PATCH/api/campaigns/{id}
Auth Required

Update Campaign

Update campaign fields.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Request Body

NameTypeRequiredDescription
namestringOptionalCampaign name
statusstringOptionalCampaign statusOptions: ACTIVE, PAUSED, COMPLETED, ARCHIVED

Example Request

curl -X PATCH "https://api.scrappy.gg/api/campaigns/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Campaign updated
{
"success": true,
"data": {
"id": "camp_123"
}
}
DELETE/api/campaigns/{id}
Auth Required

Delete Campaign

Permanently delete a campaign.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/campaigns/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Campaign deleted
{
"success": true
}
POST/api/campaigns/{id}/discover-sources
Auth Required

Discover Sources for Campaign

Use AI to find relevant data sources based on the campaign's target parameters. Requires PERPLEXITY_API_KEY.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Example Request

curl -X POST "https://api.scrappy.gg/api/campaigns/{id}/discover-sources" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Sources suggested
{
"success": true,
"data": {
"sources": [
{
"name": "NYC Construction Directory",
"url": "https://example.com",
"reasoning": "High density of target companies"
}
]
}
}
POST/api/campaigns/{id}/suggest-matching
Auth Required

Suggest Matching Rules

Generate AI-suggested matching rules based on campaign deal parameters.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Example Request

curl -X POST "https://api.scrappy.gg/api/campaigns/{id}/suggest-matching" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Matching rules suggested
{
"success": true,
"data": {
"rules": [
{
"type": "FILTER",
"field": "jobTitle",
"operator": "contains",
"value": "CFO"
}
]
}
}
GET/api/campaigns/{id}/ranked-accounts
Auth Required

Ranked Accounts

Get accounts ranked by fit score for this campaign.

Path Parameters

NameTypeRequiredDescription
idstringRequiredCampaign ID

Example Request

curl -X GET "https://api.scrappy.gg/api/campaigns/{id}/ranked-accounts" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Ranked accounts returned
{
"success": true,
"data": {
"accounts": [
{
"companyDomain": "acme.com",
"companyName": "Acme Corp",
"score": 92,
"leadCount": 8
}
]
}
}

AI Chat Agent

Conversational AI assistant (Claude) that can query and manage leads, sources, and jobs via natural language

5 endpoints
GET/api/chat/conversations
Auth Required

List Conversations

Get all chat conversations for the current user.

Example Request

curl -X GET "https://api.scrappy.gg/api/chat/conversations" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Conversations returned
{
"success": true,
"data": {
"conversations": [
{
"id": "conv_123",
"title": "Lead search for NYC dentists",
"messageCount": 6,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:05:00Z"
}
]
}
}
POST/api/chat/conversations
Auth Required

Create Conversation

Start a new chat conversation.

Rate Limited: 50 requests per 1h per user

Request Body

NameTypeRequiredDescription
titlestringOptionalConversation title (auto-generated if omitted)

Example Request

curl -X POST "https://api.scrappy.gg/api/chat/conversations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

201Conversation created
{
"success": true,
"data": {
"id": "conv_123",
"title": "New Conversation",
"messages": []
}
}
GET/api/chat/conversations/{id}
Auth Required

Get Conversation

Get a conversation with its full message history.

Path Parameters

NameTypeRequiredDescription
idstringRequiredConversation ID

Example Request

curl -X GET "https://api.scrappy.gg/api/chat/conversations/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Conversation returned
{
"success": true,
"data": {
"id": "conv_123",
"title": "Lead search",
"messages": [
{
"role": "user",
"content": "Find leads in healthcare",
"createdAt": "..."
},
{
"role": "assistant",
"content": "I found 24 leads...",
"createdAt": "..."
}
]
}
}
DELETE/api/chat/conversations/{id}
Auth Required

Delete Conversation

Delete a conversation and all its messages.

Path Parameters

NameTypeRequiredDescription
idstringRequiredConversation ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/chat/conversations/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Conversation deleted
{
"success": true
}
POST/api/chat/conversations/{id}/messages
Auth Required

Send Message (Streaming)

Send a message to the AI agent and receive a streaming SSE response. The agent has 9 built-in tools: search leads, get lead, update lead, search sources, get source, search jobs, get job, create job, and get stats. Requires ANTHROPIC_API_KEY.

Rate Limited: 50 requests per 1h per user

Path Parameters

NameTypeRequiredDescription
idstringRequiredConversation ID

Request Body

NameTypeRequiredDescription
messagestringRequiredUser message to send to the agent

Example Request

curl -X POST "https://api.scrappy.gg/api/chat/conversations/{id}/messages" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "string"
}'

Responses

200Server-Sent Events stream. Event types: text (delta), tool_start, tool_call (with input), tool_result, done, error.
{
"event: text": {
"delta": "I found "
},
"event: tool_start": {
"tool": "search_leads"
},
"event: tool_call": {
"tool": "search_leads",
"input": {
"query": "healthcare"
}
},
"event: tool_result": {
"tool": "search_leads",
"result": {
"count": 24
}
},
"event: done": {}
}
503ANTHROPIC_API_KEY not configured
{
"success": false,
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "AI chat not configured"
}
}

Email Verification

Email bounce tracking and spam trap detection

3 endpoints
POST/api/email-verification/bounce
Auth Required

Record Bounce

Record an email bounce event

Request Body

NameTypeRequiredDescription
emailstringRequiredEmail address that bounced
bounceTypestringRequiredType of bounceOptions: HARD, SOFT, SPAM
bounceReasonstringOptionalDetailed bounce reason
smtpCodestringOptionalSMTP error code

Example Request

curl -X POST "https://api.scrappy.gg/api/email-verification/bounce" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"bounceType": "string"
}'

Responses

200Bounce recorded
{
"success": true
}
POST/api/email-verification/spam-trap
Auth Required

Mark as Spam Trap

Mark an email as a known spam trap

Request Body

NameTypeRequiredDescription
emailstringRequiredEmail address
confidencenumberOptionalConfidence level 0-100Default: 100
trapTypestringOptionalType of spam trap
sourcestringOptionalSource of identification

Example Request

curl -X POST "https://api.scrappy.gg/api/email-verification/spam-trap" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com"
}'

Responses

200Spam trap marked
{
"success": true
}
GET/api/email-verification/stats
Auth Required

Get Verification Stats

Get email verification and bounce statistics

Query Parameters

NameTypeRequiredDescription
bouncesbooleanOptionalInclude recent bounces
bounceLimitnumberOptionalNumber of recent bouncesDefault: 100

Example Request

curl -X GET "https://api.scrappy.gg/api/email-verification/stats" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Stats returned
{
"success": true,
"data": {
"verificationStats": {
"total": 1000,
"valid": 850,
"invalid": 100,
"unknown": 50
},
"bounceStats": {
"hard": 50,
"soft": 30,
"spam": 20
},
"recentBounces": []
}
}

LinkedIn Integration

LinkedIn scraping, lead enrichment, profile validation, and commonalities analysis

7 endpoints
GET/api/linkedin/credentials
Auth Required

List LinkedIn Credentials

Get stored LinkedIn credentials with computed status (ACTIVE, RATE_LIMITED, SOFT_BANNED, INVALID), daily limit, and requests remaining.

Example Request

curl -X GET "https://api.scrappy.gg/api/linkedin/credentials" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Credentials returned
{
"success": true,
"data": {
"credentials": [
{
"id": "cred_123",
"email": "linkedin@example.com",
"status": "ACTIVE",
"dailyLimit": 80,
"requestsRemaining": 45
}
]
}
}
POST/api/linkedin/credentials
Auth Required

Add LinkedIn Credentials

Store LinkedIn account credentials for scraping.

Request Body

NameTypeRequiredDescription
emailstringRequiredLinkedIn account email
passwordstringRequiredLinkedIn account password (encrypted at rest)

Example Request

curl -X POST "https://api.scrappy.gg/api/linkedin/credentials" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "your-password"
}'

Responses

201Credentials added
{
"success": true,
"data": {
"id": "cred_123",
"email": "linkedin@example.com"
}
}
POST/api/linkedin/validate
Auth Required

Validate LinkedIn Profile

Validate that a LinkedIn profile URL is reachable and extract basic metadata.

Request Body

NameTypeRequiredDescription
profileUrlstringRequiredLinkedIn profile URL to validate

Example Request

curl -X POST "https://api.scrappy.gg/api/linkedin/validate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileUrl": "https://example.com"
}'

Responses

200Validation result
{
"success": true,
"data": {
"valid": true,
"name": "John Doe",
"headline": "CEO at Acme Corp"
}
}
POST/api/linkedin/enrich
Auth Required

Enrich Lead from LinkedIn

Enrich a lead's data by scraping their LinkedIn profile.

Request Body

NameTypeRequiredDescription
leadIdstringRequiredLead ID to enrich
profileUrlstringOptionalLinkedIn profile URL (uses lead.linkedin if omitted)

Example Request

curl -X POST "https://api.scrappy.gg/api/linkedin/enrich" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadId": "abc123"
}'

Responses

200Lead enriched
{
"success": true,
"data": {
"leadId": "lead_123",
"enriched": {
"jobTitle": "VP of Sales",
"company": "Acme Corp",
"location": "New York"
}
}
}
GET/api/linkedin/jobs
Auth Required

List LinkedIn Jobs

Get all LinkedIn scraping jobs.

Example Request

curl -X GET "https://api.scrappy.gg/api/linkedin/jobs" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Jobs returned
{
"success": true,
"data": {
"jobs": [
{
"id": "ljob_123",
"status": "COMPLETED",
"profilesScraped": 150
}
]
}
}
GET/api/linkedin/jobs/{id}
Auth Required

Get LinkedIn Job

Get a LinkedIn scraping job by ID.

Path Parameters

NameTypeRequiredDescription
idstringRequiredJob ID

Example Request

curl -X GET "https://api.scrappy.gg/api/linkedin/jobs/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Job returned
{
"success": true,
"data": {}
}
POST/api/linkedin/commonalities
Auth Required

Batch Commonalities Analysis

Analyze common traits across a batch of LinkedIn profiles using AI. Useful for identifying shared backgrounds, schools, companies, or interests. Requires PERPLEXITY_API_KEY.

Rate Limited: 10 requests per 1h per user

Request Body

NameTypeRequiredDescription
profileUrlsarrayRequiredArray of LinkedIn profile URLs to analyze
contextstringOptionalAdditional context for the analysis

Example Request

curl -X POST "https://api.scrappy.gg/api/linkedin/commonalities" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": []
}'

Responses

200Commonalities analysis
{
"success": true,
"data": {
"commonalities": [
"All attended Ivy League universities",
"Previously worked in investment banking",
"Active in real estate investing communities"
],
"analyzedProfiles": 12,
"confidence": 0.85
}
}
503PERPLEXITY_API_KEY not configured
{
"success": false,
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "AI service not configured"
}
}

Warmup Domains

Email domain warming system — 5-week progressive warmup for improved deliverability

7 endpoints
GET/api/warmup-domains
Auth Required

List Warmup Domains

Get all warmup domains for the current user.

Example Request

curl -X GET "https://api.scrappy.gg/api/warmup-domains" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Warmup domains returned
{
"success": true,
"data": {
"warmupDomains": [
{
"id": "wd_123",
"domain": "outreach.acme.com",
"status": "WARMING",
"currentDailyVolume": 25,
"targetDailyVolume": 100,
"weekNumber": 2,
"openRate": 0.42,
"bounceRate": 0.02
}
]
}
}
POST/api/warmup-domains
Auth Required

Create Warmup Domain

Register a new domain for warmup. The domain must have valid SPF and DKIM before warmup can start.

Request Body

NameTypeRequiredDescription
domainstringRequiredDomain to warm up (e.g. outreach.acme.com)
targetDailyVolumenumberOptionalTarget daily email volume after warmup (default: 100)

Example Request

curl -X POST "https://api.scrappy.gg/api/warmup-domains" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "string"
}'

Responses

201Warmup domain created
{
"success": true,
"data": {
"id": "wd_123",
"domain": "outreach.acme.com",
"status": "PENDING_DNS",
"spfValid": false,
"dkimValid": false
}
}
GET/api/warmup-domains/{id}
Auth Required

Get Warmup Domain

Get a warmup domain by ID with full metrics.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWarmup domain ID

Example Request

curl -X GET "https://api.scrappy.gg/api/warmup-domains/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Warmup domain returned
{
"success": true,
"data": {
"id": "wd_123",
"domain": "outreach.acme.com",
"status": "WARMING",
"spfValid": true,
"dkimValid": true,
"dmarcValid": true,
"currentDailyVolume": 25,
"openRate": 0.42,
"replyRate": 0.08,
"bounceRate": 0.02,
"spamRate": 0.001
}
}
PATCH/api/warmup-domains/{id}
Auth Required

Update Warmup Domain

Update warmup domain settings (e.g. pause/resume).

Path Parameters

NameTypeRequiredDescription
idstringRequiredWarmup domain ID

Request Body

NameTypeRequiredDescription
statusstringOptionalOverride statusOptions: PAUSED, WARMING
targetDailyVolumenumberOptionalUpdated target daily volume

Example Request

curl -X PATCH "https://api.scrappy.gg/api/warmup-domains/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Domain updated
{
"success": true,
"data": {}
}
DELETE/api/warmup-domains/{id}
Auth Required

Delete Warmup Domain

Remove a warmup domain.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWarmup domain ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/warmup-domains/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Domain deleted
{
"success": true
}
POST/api/warmup-domains/{id}/start
Auth Required

Start Warmup

Begin the 5-week progressive warmup schedule. Requires valid SPF and DKIM records. Warmup progresses: 5→10→25→50→100 emails/day. Auto-pauses if bounce rate >10% or spam rate >0.5%.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWarmup domain ID

Example Request

curl -X POST "https://api.scrappy.gg/api/warmup-domains/{id}/start" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Warmup started
{
"success": true,
"data": {
"status": "WARMING",
"startedAt": "2024-01-15T10:00:00Z",
"estimatedCompletionWeeks": 5
}
}
400DNS not configured
{
"success": false,
"error": {
"code": "DNS_NOT_CONFIGURED",
"message": "SPF and DKIM records are required before warmup can start"
}
}
POST/api/warmup-domains/{id}/metrics
Auth Required

Update Warmup Metrics

Update sending metrics (open rate, reply rate, bounce rate, spam rate). Used to feed real delivery data back into the warmup monitor.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWarmup domain ID

Request Body

NameTypeRequiredDescription
openRatenumberOptionalOpen rate (0–1)
replyRatenumberOptionalReply rate (0–1)
bounceRatenumberOptionalBounce rate (0–1). >0.10 triggers auto-pause.
spamRatenumberOptionalSpam rate (0–1). >0.005 triggers auto-pause.
emailsSentnumberOptionalEmails sent today

Example Request

curl -X POST "https://api.scrappy.gg/api/warmup-domains/{id}/metrics" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Metrics updated
{
"success": true,
"data": {
"status": "WARMING",
"bounceRateAlert": false,
"spamRateAlert": false
}
}

AngelSend Integration

Cold email outreach platform integration — export leads, send emails, AI personalization, and domain warmup

16 endpoints
GET/api/angelsend/status
Auth Required

Connection Status

Check if AngelSend is connected and return account info.

Example Request

curl -X GET "https://api.scrappy.gg/api/angelsend/status" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Status returned
{
"success": true,
"data": {
"connected": true,
"email": "user@example.com",
"plan": "pro"
}
}
GET/api/angelsend/credits
Auth Required

Get AngelSend Credits

Get the current AngelSend credit balance.

Example Request

curl -X GET "https://api.scrappy.gg/api/angelsend/credits" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Credits returned
{
"success": true,
"data": {
"credits": 5000,
"used": 1200
}
}
POST/api/angelsend/leads/export
Auth Required

Export Leads to AngelSend

Export selected leads to an AngelSend project for outreach.

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredArray of lead IDs to export
projectNamestringOptionalAngelSend project to export into

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/leads/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": []
}'

Responses

200Leads exported
{
"success": true,
"data": {
"exported": 45,
"failed": 2
}
}
POST/api/angelsend/send-email
Auth Required

Send Single Email

Send an individual email via AngelSend.

Request Body

NameTypeRequiredDescription
tostringRequiredRecipient email address
subjectstringRequiredEmail subject
bodystringRequiredEmail body (HTML or plain text)
leadIdstringOptionalAssociated lead ID

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/send-email" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "string",
"subject": "string",
"body": "string"
}'

Responses

200Email sent
{
"success": true,
"data": {
"messageId": "msg_123"
}
}
POST/api/angelsend/send-emails
Auth Required

Send Bulk Emails

Send emails to multiple leads in one request.

Request Body

NameTypeRequiredDescription
emailsarrayRequiredArray of { to, subject, body, leadId } objects

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/send-emails" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"emails": []
}'

Responses

200Bulk send results
{
"success": true,
"data": {
"sent": 48,
"failed": 2
}
}
POST/api/angelsend/generate-emails
Auth Required

Generate Email Copy

Use AI to generate personalized email copy for leads.

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredLead IDs to generate emails for
templatestringOptionalEmail template or campaign context
tonestringOptionalEmail toneOptions: professional, casual, friendly

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/generate-emails" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": []
}'

Responses

200Generated emails
{
"success": true,
"data": {
"emails": [
{
"leadId": "lead_123",
"subject": "Quick question about Acme",
"body": "Hi John, ..."
}
]
}
}
POST/api/angelsend/personalize
Auth Required

Personalize Email

AI-personalize an existing email template for a specific lead.

Request Body

NameTypeRequiredDescription
leadIdstringRequiredLead ID
templatestringRequiredBase email template

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/personalize" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadId": "abc123",
"template": "string"
}'

Responses

200Personalized email
{
"success": true,
"data": {
"subject": "...",
"body": "..."
}
}
POST/api/angelsend/verify-emails
Auth Required

Verify Emails via AngelSend

Trigger email verification for leads through AngelSend.

Request Body

NameTypeRequiredDescription
leadIdsarrayRequiredLead IDs to verify

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/verify-emails" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadIds": []
}'

Responses

200Verification queued
{
"success": true
}
POST/api/angelsend/ai/analyze-intent
Auth Required

Analyze Reply Intent

Use AI to analyze the intent of a reply email (interested, not interested, objection, etc.).

Request Body

NameTypeRequiredDescription
emailBodystringRequiredReply email body to analyze
leadIdstringOptionalAssociated lead ID

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/ai/analyze-intent" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"emailBody": "user@example.com"
}'

Responses

200Intent analysis
{
"success": true,
"data": {
"intent": "INTERESTED",
"confidence": 0.92,
"summary": "Lead expressed interest and asked for a call",
"suggestedAction": "Schedule a call"
}
}
POST/api/angelsend/ai/auto-reply
Auth Required

Generate Auto-Reply

Generate an AI-powered reply to an inbound email.

Request Body

NameTypeRequiredDescription
originalEmailstringRequiredThe original outbound email
replyEmailstringRequiredThe inbound reply to respond to
leadIdstringOptionalAssociated lead ID

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/ai/auto-reply" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"originalEmail": "user@example.com",
"replyEmail": "user@example.com"
}'

Responses

200Generated reply
{
"success": true,
"data": {
"subject": "Re: ...",
"body": "Thanks for getting back to me..."
}
}
POST/api/angelsend/ai/follow-ups
Auth Required

Generate Follow-up Sequence

Generate a multi-step follow-up email sequence for a campaign.

Request Body

NameTypeRequiredDescription
leadIdstringRequiredLead ID
initialEmailstringRequiredThe initial outbound email
stepsnumberOptionalNumber of follow-up steps (default: 3)

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/ai/follow-ups" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"leadId": "abc123",
"initialEmail": "user@example.com"
}'

Responses

200Follow-up sequence
{
"success": true,
"data": {
"followUps": [
{
"dayOffset": 3,
"subject": "Following up",
"body": "Just checking in..."
},
{
"dayOffset": 7,
"subject": "Last try",
"body": "One more thought..."
}
]
}
}
POST/api/angelsend/import/apollo
Auth Required

Import from Apollo

Import leads from an Apollo.io CSV export into Scrappy.

Request Body

NameTypeRequiredDescription
filefileRequiredApollo CSV export file
projectIdstringOptionalTarget project ID

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/import/apollo" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: multipart/form-data" \
-d '{
"file": ""
}'

Responses

200Import results
{
"success": true,
"data": {
"imported": 200,
"duplicates": 15,
"errors": 2
}
}
POST/api/angelsend/import/hunter
Auth Required

Import from Hunter

Import leads from a Hunter.io CSV export into Scrappy.

Request Body

NameTypeRequiredDescription
filefileRequiredHunter CSV export file
projectIdstringOptionalTarget project ID

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/import/hunter" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: multipart/form-data" \
-d '{
"file": ""
}'

Responses

200Import results
{
"success": true,
"data": {
"imported": 100,
"duplicates": 5,
"errors": 0
}
}
POST/api/angelsend/warmup
Auth Required

Schedule Warmup

Schedule domain warmup sending via AngelSend.

Request Body

NameTypeRequiredDescription
domainstringRequiredDomain to warm up
dailyVolumenumberOptionalTarget daily send volume

Example Request

curl -X POST "https://api.scrappy.gg/api/angelsend/warmup" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "string"
}'

Responses

200Warmup scheduled
{
"success": true
}
GET/api/user/integrations/angelsend
Auth Required

Get User AngelSend Config

Get the current user's AngelSend API key configuration.

Example Request

curl -X GET "https://api.scrappy.gg/api/user/integrations/angelsend" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Config returned
{
"success": true,
"data": {
"hasApiKey": true,
"isUsingGlobal": false
}
}
PATCH/api/user/integrations/angelsend
Auth Required

Update User AngelSend Config

Set a per-user AngelSend API key (overrides the global environment variable).

Request Body

NameTypeRequiredDescription
apiKeystringOptionalAngelSend API key (null to remove)

Example Request

curl -X PATCH "https://api.scrappy.gg/api/user/integrations/angelsend" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Config updated
{
"success": true
}

Credits

Credit balance and purchasing

3 endpoints
GET/api/credits/balance
Auth Required

Get Credit Balance

Get the current user's credit balance

Example Request

curl -X GET "https://api.scrappy.gg/api/credits/balance" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Balance returned
{
"success": true,
"data": {
"balance": 500,
"configured": true,
"costs": {
"scrape": 1,
"emailValidation": 0.5,
"aiDiscovery": 5
}
}
}
GET/api/credits/pricing
Auth Required

Get Pricing Tiers

Get available credit pricing tiers for purchase

Example Request

curl -X GET "https://api.scrappy.gg/api/credits/pricing" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Pricing returned
{
"success": true,
"data": {
"tiers": [
{
"id": "starter",
"credits": 100,
"price": 9.99
},
{
"id": "pro",
"credits": 500,
"price": 39.99
}
],
"configured": true
}
}
POST/api/credits/checkout
Auth Required

Create Checkout Session

Create a checkout session to purchase credits

Request Body

NameTypeRequiredDescription
pricingTierIdstringRequiredID of the pricing tier to purchase

Example Request

curl -X POST "https://api.scrappy.gg/api/credits/checkout" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricingTierId": "abc123"
}'

Responses

200Checkout created
{
"success": true,
"data": {
"url": "https://checkout.stripe.com/..."
}
}
503Credits not configured
{
"success": false,
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "Credits system not configured"
}
}

Markdown Exports

Export websites to markdown format

7 endpoints
GET/api/markdown-exports
Auth Required

List Exports

Get all markdown exports

Example Request

curl -X GET "https://api.scrappy.gg/api/markdown-exports" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Exports returned
{
"success": true,
"data": {
"exports": [
{
"id": "abc123",
"name": "Example Site",
"url": "https://example.com",
"status": "COMPLETED",
"pageCount": 25
}
]
}
}
POST/api/markdown-exports
Auth Required

Create Export

Create a new markdown export job

Request Body

NameTypeRequiredDescription
namestringRequiredExport name
urlstringRequiredURL to export
exportTypestringOptionalExport typeOptions: SINGLE_PAGE, FULL_SITEDefault: SINGLE_PAGE
maxPagesnumberOptionalMaximum pages to export (1-1000)Default: 100
followExternalbooleanOptionalFollow external links
useSitemapbooleanOptionalUse sitemap.xml for discovery

Example Request

curl -X POST "https://api.scrappy.gg/api/markdown-exports" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"url": "https://example.com"
}'

Responses

201Export created
{
"success": true,
"data": {
"export": {
"id": "abc123",
"status": "PENDING"
}
}
}
GET/api/markdown-exports/[id]
Auth Required

Get Export

Get export details

Path Parameters

NameTypeRequiredDescription
idstringRequiredExport ID

Example Request

curl -X GET "https://api.scrappy.gg/api/markdown-exports/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Export returned
{
"success": true,
"data": {
"export": {
"id": "abc123",
"status": "COMPLETED"
}
}
}
DELETE/api/markdown-exports/[id]
Auth Required

Delete Export

Delete an export

Path Parameters

NameTypeRequiredDescription
idstringRequiredExport ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/markdown-exports/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Export deleted
{
"success": true
}
GET/api/markdown-exports/[id]/pages
Auth Required

Get Export Pages

Get all pages from an export with their markdown content

Path Parameters

NameTypeRequiredDescription
idstringRequiredExport ID

Example Request

curl -X GET "https://api.scrappy.gg/api/markdown-exports/abc123/pages" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Pages returned
{
"success": true,
"data": {
"pages": [
{
"id": "page123",
"url": "https://example.com/page",
"title": "Page Title",
"markdown": "# Page Content..."
}
]
}
}
GET/api/markdown-exports/[id]/download
Auth Required

Download Export

Download export as ZIP or single markdown file

Path Parameters

NameTypeRequiredDescription
idstringRequiredExport ID

Query Parameters

NameTypeRequiredDescription
formatstringOptionalDownload formatOptions: zip, singleDefault: zip

Example Request

curl -X GET "https://api.scrappy.gg/api/markdown-exports/abc123/download" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200File download
{
"note": "Returns file attachment"
}
404No content
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Export has no content"
}
}
POST/api/markdown-exports/[id]/retry
Auth Required

Retry Export

Retry a failed export

Path Parameters

NameTypeRequiredDescription
idstringRequiredExport ID

Example Request

curl -X POST "https://api.scrappy.gg/api/markdown-exports/abc123/retry" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Export retry started
{
"success": true,
"message": "Export retry started"
}

Analytics

Pipeline overview, source performance, capacity planning, and credit burn rate metrics

4 endpoints
GET/api/analytics/pipeline-overview
Auth Required

Pipeline Overview

Get high-level pipeline metrics: lead counts by status, conversion rates, email validation rates, and recent activity.

Query Parameters

NameTypeRequiredDescription
projectIdstringOptionalFilter by project ID
daysnumberOptionalLookback window in days (default: 30)

Example Request

curl -X GET "https://api.scrappy.gg/api/analytics/pipeline-overview" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Pipeline overview returned
{
"success": true,
"data": {
"totalLeads": 1250,
"leadsByStatus": {
"NEW": 420,
"CONTACTED": 380,
"QUALIFIED": 210,
"UNQUALIFIED": 180,
"ARCHIVED": 60
},
"emailValidationRate": 0.84,
"newLeadsLast7Days": 145,
"conversionRate": 0.168
}
}
GET/api/analytics/sources
Auth Required

Source Analytics

Get performance metrics for each source: lead yield, success rate, and average run time.

Query Parameters

NameTypeRequiredDescription
projectIdstringOptionalFilter by project ID
daysnumberOptionalLookback window in days (default: 30)

Example Request

curl -X GET "https://api.scrappy.gg/api/analytics/sources" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Source analytics returned
{
"success": true,
"data": {
"sources": [
{
"sourceId": "src_123",
"sourceName": "NYC Dentist Directory",
"totalJobs": 12,
"successRate": 0.92,
"totalLeads": 340,
"avgLeadsPerJob": 28,
"avgRunTimeMs": 45000,
"lastRunAt": "2024-01-15T08:00:00Z"
}
]
}
}
GET/api/analytics/capacity
Auth Required

Capacity Planning

Get capacity metrics including active sources, scheduled jobs, job queue depth, and estimated throughput.

Example Request

curl -X GET "https://api.scrappy.gg/api/analytics/capacity" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Capacity data returned
{
"success": true,
"data": {
"activeSources": 24,
"scheduledJobsNext24h": 8,
"queueDepth": 3,
"estimatedLeadsPerDay": 450,
"workerUtilization": 0.35
}
}
GET/api/analytics/credit-burn-rate
Auth Required

Credit Burn Rate

Get credit usage trends and burn rate projection.

Query Parameters

NameTypeRequiredDescription
daysnumberOptionalLookback window in days (default: 30)

Example Request

curl -X GET "https://api.scrappy.gg/api/analytics/credit-burn-rate" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Credit burn rate returned
{
"success": true,
"data": {
"currentBalance": 8500,
"dailyBurnRate": 125,
"projectedDaysRemaining": 68,
"burnByCategory": {
"emailValidation": 80,
"aiFeatures": 30,
"scraping": 15
},
"usageTrend": [
{
"date": "2024-01-14",
"credits": 120
},
{
"date": "2024-01-15",
"credits": 135
}
]
}
}

Admin

Admin-only endpoints for platform management

3 endpoints
GET/api/admin/users
Admin Only

List All Users

Get all users with their statistics (admin only)

Example Request

curl -X GET "https://api.scrappy.gg/api/admin/users" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Users returned
{
"success": true,
"data": {
"users": [
{
"id": "abc123",
"email": "user@example.com",
"stats": {
"projects": 5,
"sources": 20,
"leads": 500,
"jobs": 50
}
}
],
"summary": {
"total": 100,
"active": 85,
"newThisWeek": 10
}
}
}
403Not admin
{
"success": false,
"error": {
"code": "FORBIDDEN",
"message": "Admin access required"
}
}
GET/api/admin/metrics/summary
Admin Only

Get Metrics Summary

Get aggregated platform metrics (admin only). Note: Response does not use standard wrapper format.

Example Request

curl -X GET "https://api.scrappy.gg/api/admin/metrics/summary" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Metrics returned
{
"database": {
"users": 100,
"projects": 500,
"sources": 1000,
"leads": 50000,
"jobs": 2000
},
"queues": {
"waiting": {
"scraping": 5,
"emailValidation": 10
},
"active": {
"scraping": 2,
"emailValidation": 5
},
"failed": {
"scraping": 0,
"emailValidation": 1
}
},
"timestamp": "2024-01-01T00:00:00Z"
}
GET/api/admin/metrics/prometheus
Admin Only

Prometheus Query

Proxy Prometheus queries (admin only)

Query Parameters

NameTypeRequiredDescription
querystringRequiredPrometheus query string
typestringOptionalQuery typeOptions: instant, rangeDefault: instant
startstringOptionalStart time for range queries (ISO 8601)
endstringOptionalEnd time for range queries (ISO 8601)
stepstringOptionalQuery resolution stepDefault: 15s

Example Request

curl -X GET ?query=search term"https://api.scrappy.gg/api/admin/metrics/prometheus" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Prometheus query results
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"__name__": "up"
},
"value": [
1704067200,
"1"
]
}
]
}
}
400Missing query
{
"error": "Query parameter is required"
}

Webhooks

Manage outbound webhooks for event notifications and receive inbound webhooks from external services

8 endpoints
GET/api/user/webhooks
Auth Required

List Webhooks

Get all configured outbound webhooks for the current user.

Example Request

curl -X GET "https://api.scrappy.gg/api/user/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Webhooks returned
{
"success": true,
"data": {
"webhooks": [
{
"id": "wh_123",
"url": "https://your-app.com/webhook",
"events": [
"lead.created",
"lead.updated"
],
"enabled": true,
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
}
POST/api/user/webhooks
Auth Required

Create Webhook

Register an outbound webhook endpoint. Events are signed with HMAC-SHA256 via the X-Scrappy-Signature header.

Request Body

NameTypeRequiredDescription
urlstringRequiredHTTPS endpoint to receive events
eventsarrayRequiredEvent types to subscribe to (e.g. lead.created, lead.updated, job.completed, email.validated)
secretstringOptionalSecret for HMAC signature verification (auto-generated if omitted)
enabledbooleanOptionalEnable the webhook on creation (default: true)

Example Request

curl -X POST "https://api.scrappy.gg/api/user/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"events": []
}'

Responses

201Webhook created
{
"success": true,
"data": {
"id": "wh_123",
"url": "https://your-app.com/webhook",
"secret": "whsec_abc123...",
"events": [
"lead.created"
]
}
}
GET/api/user/webhooks/{id}
Auth Required

Get Webhook

Get a webhook by ID including recent delivery history.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWebhook ID

Example Request

curl -X GET "https://api.scrappy.gg/api/user/webhooks/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Webhook returned
{
"success": true,
"data": {
"id": "wh_123",
"url": "https://your-app.com/webhook",
"events": [
"lead.created"
],
"enabled": true,
"deliveries": [
{
"id": "del_456",
"event": "lead.created",
"status": "SUCCESS",
"responseCode": 200,
"deliveredAt": "2024-01-15T10:30:00Z"
}
]
}
}
PATCH/api/user/webhooks/{id}
Auth Required

Update Webhook

Update a webhook's URL, events, or enabled status.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWebhook ID

Request Body

NameTypeRequiredDescription
urlstringOptionalUpdated endpoint URL
eventsarrayOptionalUpdated event list
enabledbooleanOptionalEnable or disable

Example Request

curl -X PATCH "https://api.scrappy.gg/api/user/webhooks/{id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Webhook updated
{
"success": true,
"data": {}
}
DELETE/api/user/webhooks/{id}
Auth Required

Delete Webhook

Delete a webhook endpoint.

Path Parameters

NameTypeRequiredDescription
idstringRequiredWebhook ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/user/webhooks/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Webhook deleted
{
"success": true
}
POST/api/user/webhooks/{id}/deliveries/{deliveryId}/retry
Auth Required

Retry Webhook Delivery

Manually retry a failed webhook delivery. Auto-retry uses 3 attempts with exponential backoff (5s / 25s / 125s).

Path Parameters

NameTypeRequiredDescription
idstringRequiredWebhook ID
deliveryIdstringRequiredDelivery ID to retry

Example Request

curl -X POST "https://api.scrappy.gg/api/user/webhooks/{id}/deliveries/{deliveryId}/retry" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Delivery retry queued
{
"success": true,
"data": {
"retryJobId": "job_789"
}
}
POST/api/webhooks/cred
Public

Cred.diy Webhook (Inbound)

Inbound webhook from cred.diy credits system. Verified via HMAC-SHA256 signature. Handles credit top-ups and subscription events.

Request Body

NameTypeRequiredDescription
x-cred-signatureheaderRequiredHMAC-SHA256 signature for verification
x-cred-eventheaderRequiredEvent type (e.g. credit.purchased, subscription.updated)

Example Request

curl -X POST "https://api.scrappy.gg/api/webhooks/cred" \
-H "Content-Type: application/json" \
-d '{
"x-cred-signature": "",
"x-cred-event": ""
}'

Responses

200Webhook received and processed
{
"received": true
}
401Invalid signature
{
"error": "Invalid signature"
}
POST/api/webhooks/resend
Public

Resend Email Webhook (Inbound)

Inbound webhook from Resend for transactional email delivery events (bounces, complaints, etc.).

Request Body

NameTypeRequiredDescription
svix-signatureheaderRequiredSvix signature for verification
typestringRequiredEvent type (e.g. email.bounced, email.complained)

Example Request

curl -X POST "https://api.scrappy.gg/api/webhooks/resend" \
-H "Content-Type: application/json" \
-d '{
"svix-signature": "",
"type": "string"
}'

Responses

200Webhook received
{
"received": true
}

Enterprise

Organizations, API keys, source templates, proxy profiles, suppression lists, and data destinations

19 endpoints
GET/api/organizations
Auth Required

List Organizations

Get all organizations the current user belongs to.

Example Request

curl -X GET "https://api.scrappy.gg/api/organizations" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Organizations returned
{
"success": true,
"data": {
"organizations": [
{
"id": "org_123",
"name": "Acme Corp",
"role": "OWNER",
"memberCount": 8
}
]
}
}
POST/api/organizations
Auth Required

Create Organization

Create a new organization.

Request Body

NameTypeRequiredDescription
namestringRequiredOrganization name
domainstringOptionalCompany domain (for SSO)

Example Request

curl -X POST "https://api.scrappy.gg/api/organizations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name"
}'

Responses

201Organization created
{
"success": true,
"data": {
"id": "org_123",
"name": "Acme Corp"
}
}
GET/api/organizations/{id}
Auth Required

Get Organization

Get organization details.

Path Parameters

NameTypeRequiredDescription
idstringRequiredOrganization ID

Example Request

curl -X GET "https://api.scrappy.gg/api/organizations/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Organization returned
{
"success": true,
"data": {}
}
GET/api/organizations/{id}/members
Auth Required

List Members

Get all members of an organization.

Path Parameters

NameTypeRequiredDescription
idstringRequiredOrganization ID

Example Request

curl -X GET "https://api.scrappy.gg/api/organizations/{id}/members" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Members returned
{
"success": true,
"data": {
"members": [
{
"userId": "u_123",
"email": "admin@acme.com",
"role": "OWNER",
"joinedAt": "2024-01-01"
}
]
}
}
GET/api/organizations/{id}/sso
Auth Required

SSO Configuration

Get SSO/SAML configuration for the organization.

Path Parameters

NameTypeRequiredDescription
idstringRequiredOrganization ID

Example Request

curl -X GET "https://api.scrappy.gg/api/organizations/{id}/sso" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200SSO config returned
{
"success": true,
"data": {
"provider": "OKTA",
"enabled": true,
"domain": "acme.com"
}
}
GET/api/organizations/{id}/ip-allowlist
Auth Required

IP Allowlist

Get or manage IP allowlist for organization access control.

Path Parameters

NameTypeRequiredDescription
idstringRequiredOrganization ID

Example Request

curl -X GET "https://api.scrappy.gg/api/organizations/{id}/ip-allowlist" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Allowlist returned
{
"success": true,
"data": {
"allowlist": [
"192.168.1.0/24",
"10.0.0.0/8"
],
"enabled": true
}
}
GET/api/api-keys
Auth Required

List API Keys

Get all API keys for programmatic access.

Example Request

curl -X GET "https://api.scrappy.gg/api/api-keys" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200API keys returned
{
"success": true,
"data": {
"apiKeys": [
{
"id": "key_123",
"name": "Production Key",
"prefix": "sk_prod_****",
"createdAt": "2024-01-01"
}
]
}
}
POST/api/api-keys
Auth Required

Create API Key

Generate a new API key. The full key is returned only once.

Request Body

NameTypeRequiredDescription
namestringRequiredKey name/description
scopesarrayOptionalPermission scopes (e.g. ['leads:read', 'sources:write'])
expiresAtstringOptionalISO 8601 expiration date

Example Request

curl -X POST "https://api.scrappy.gg/api/api-keys" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name"
}'

Responses

201API key created — full key shown once
{
"success": true,
"data": {
"id": "key_123",
"name": "Production Key",
"key": "sk_prod_abc123...",
"prefix": "sk_prod_****"
}
}
DELETE/api/api-keys/{id}
Auth Required

Delete API Key

Revoke an API key.

Path Parameters

NameTypeRequiredDescription
idstringRequiredAPI key ID

Example Request

curl -X DELETE "https://api.scrappy.gg/api/api-keys/{id}" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Key revoked
{
"success": true
}
GET/api/source-templates
Auth Required

List Source Templates

Get reusable source configuration templates.

Example Request

curl -X GET "https://api.scrappy.gg/api/source-templates" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Templates returned
{
"success": true,
"data": {
"templates": [
{
"id": "tmpl_123",
"name": "LinkedIn Directory Scraper",
"category": "Social",
"usageCount": 42
}
]
}
}
GET/api/source-templates/marketplace
Auth Required

Template Marketplace

Browse publicly shared source templates from other users.

Example Request

curl -X GET "https://api.scrappy.gg/api/source-templates/marketplace" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Marketplace templates
{
"success": true,
"data": {
"templates": []
}
}
POST/api/source-templates
Auth Required

Create Source Template

Create a reusable source configuration template.

Request Body

NameTypeRequiredDescription
namestringRequiredTemplate name
descriptionstringOptionalTemplate description
configobjectRequiredSource configuration to templatize
isPublicbooleanOptionalShare on marketplace

Example Request

curl -X POST "https://api.scrappy.gg/api/source-templates" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"config": {}
}'

Responses

201Template created
{
"success": true,
"data": {
"id": "tmpl_123"
}
}
GET/api/proxy-profiles
Auth Required

List Proxy Profiles

Get configured proxy profiles for scraping.

Example Request

curl -X GET "https://api.scrappy.gg/api/proxy-profiles" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Proxy profiles returned
{
"success": true,
"data": {
"proxies": [
{
"id": "proxy_123",
"name": "US Residential",
"type": "RESIDENTIAL",
"country": "US",
"successRate": 0.94
}
]
}
}
POST/api/proxy-profiles
Auth Required

Create Proxy Profile

Add a proxy profile for use in scraping jobs.

Request Body

NameTypeRequiredDescription
namestringRequiredProfile name
typestringRequiredProxy typeOptions: RESIDENTIAL, DATACENTER, MOBILE
hoststringRequiredProxy host
portnumberRequiredProxy port
usernamestringOptionalProxy username
passwordstringOptionalProxy password (encrypted at rest)
countrystringOptionalCountry code (e.g. 'US')

Example Request

curl -X POST "https://api.scrappy.gg/api/proxy-profiles" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"type": "string",
"host": "string",
"port": 1
}'

Responses

201Proxy profile created
{
"success": true,
"data": {
"id": "proxy_123"
}
}
GET/api/suppression-list
Auth Required

List Suppression Lists

Get email suppression lists for compliance.

Example Request

curl -X GET "https://api.scrappy.gg/api/suppression-list" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Suppression lists returned
{
"success": true,
"data": {
"lists": [
{
"id": "sl_123",
"name": "Global Unsubscribes",
"entryCount": 1250
}
]
}
}
GET/api/suppression-list/{id}/entries
Auth Required

List Suppression Entries

Get entries in a suppression list.

Path Parameters

NameTypeRequiredDescription
idstringRequiredSuppression list ID

Example Request

curl -X GET "https://api.scrappy.gg/api/suppression-list/{id}/entries" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Entries returned
{
"success": true,
"data": {
"entries": [
{
"email": "unsubscribed@example.com",
"addedAt": "2024-01-15"
}
]
}
}
GET/api/data-destinations
Auth Required

List Data Destinations

Get configured data sync destinations (webhooks, databases, CRMs).

Example Request

curl -X GET "https://api.scrappy.gg/api/data-destinations" \
-H "Authorization: Bearer YOUR_API_KEY"

Responses

200Destinations returned
{
"success": true,
"data": {
"destinations": [
{
"id": "dest_123",
"name": "HubSpot CRM",
"type": "WEBHOOK",
"enabled": true
}
]
}
}
POST/api/data-destinations
Auth Required

Create Data Destination

Configure a new data sync destination.

Request Body

NameTypeRequiredDescription
namestringRequiredDestination name
typestringRequiredDestination typeOptions: WEBHOOK, DATABASE, CRM
configobjectRequiredDestination-specific configuration
enabledbooleanOptionalEnable sync on creation (default: true)

Example Request

curl -X POST "https://api.scrappy.gg/api/data-destinations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Name",
"type": "string",
"config": {}
}'

Responses

201Destination created
{
"success": true,
"data": {
"id": "dest_123"
}
}
POST/api/data-destinations/{id}/sync
Auth Required

Trigger Sync

Manually trigger a data sync to a destination.

Path Parameters

NameTypeRequiredDescription
idstringRequiredDestination ID

Request Body

NameTypeRequiredDescription
leadIdsarrayOptionalSpecific lead IDs to sync (syncs all if omitted)

Example Request

curl -X POST "https://api.scrappy.gg/api/data-destinations/{id}/sync" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Responses

200Sync triggered
{
"success": true,
"data": {
"synced": 150,
"failed": 2
}
}

Infrastructure

Health checks and monitoring endpoints

1 endpoint
GET/api/health
Public

Health Check

Check the health status of all services

Example Request

curl -X GET "https://api.scrappy.gg/api/health"

Responses

200Health status
{
"status": "healthy",
"services": {
"database": {
"status": "healthy",
"latency": 5
},
"redis": {
"status": "healthy",
"latency": 2
}
}
}

Need help? Check out our User Guides or contact support.