API Referencev1.1.0

Scravio API Documentation

Build high-quality email lists from public social profiles.

Validate emails, export leads, and manage credits.

Programmatically create campaigns.

Download exports from one API.

Base URLhttps://api.scravio.com/api
Get API Key

Authentication

Endpoint badges show the supported auth modes.

Automation endpoints generally accept an API key.

Send it in the X-API-Key header.

They can also accept a user access token in Authorization: Bearer <accessToken>.

API keys start with sk_live_.

Create and manage your API keys in the API Keys dashboard.

curl https://api.scravio.com/api/auth/me \
  -H "X-API-Key: sk_live_example_key"
curl https://api.scravio.com/api/auth/me \
  -H "Authorization: Bearer <accessToken>"
const res = await fetch('https://api.scravio.com/api/auth/me', {
  headers: {
    'X-API-Key': 'sk_live_example_key'
  }
});
const account = await res.json();
const res = await fetch('https://api.scravio.com/api/auth/me', {
  headers: {
    Authorization: 'Bearer <accessToken>'
  }
});
const account = await res.json();

Workspace context

  • Workspace-aware endpoints accept an optional X-Workspace-Id header.
  • Bearer/JWT requests without X-Workspace-Id use the account's current or default workspace.
  • Workspace-bound API keys are tied to one workspace. If you send X-Workspace-Id with that key, it must match the key's workspace.
  • Roles are owner, admin, member, and viewer. Endpoint cards list required permissions when a route checks one.
  • Validation-job routes and GET /credit-transactions require account-scoped API keys. Use Bearer/JWT auth when you need workspace selection on validation jobs.

Error Responses

When an API request fails, the response body contains a standard error object:

Error Response
{
  "message": "Validation failed",
  "code": "VALIDATION_ERROR",
  "errors": [
    {
      "param": "inputs.hashtag",
      "msg": "Hashtag is required for INSTAGRAM_HASHTAG campaigns",
      "location": "body"
    }
  ],
  "requestId": "req_abc123"
}
StatusMeaning
400Bad Request — invalid parameters or request body
401Unauthorized — missing or invalid credentials
403Forbidden — insufficient permissions
404Not Found — resource does not exist or does not belong to you
409Conflict — e.g. validation already running for this campaign
429Too Many Requests — rate limit exceeded
500Internal Server Error — unexpected failure, retry later

Rate Limits

Some endpoints have per-account or per-resource rate limits to ensure fair usage. When you exceed a rate limit, the API returns 429 Too Many Requests. Rate limits are noted in each endpoint's description.

EndpointLimit
POST /campaigns/{id}/stop5 requests/min per campaign
POST /campaigns/{id}/validate3 requests/min per campaign
POST /validation-jobs/text3 requests/hour
POST /list-exports5 requests/hour

API Overview

Account

Read the authenticated account and effective workspace context.

GET/auth/me
API keyBearer/JWT

Get current account

Returns a customer-safe account profile, credit balance, email masking state, notification preferences, and the effective workspace context for the request.
X-Workspace-Id supportedWorkspace-scoped API keys supported

JWT requests without X-Workspace-Id use the account default workspace. Workspace-bound API keys use their assigned workspace.

Responses

200Account and workspace context
FieldTypeDescription
id
stringAccount ID.
email
string<email>Account email.
name
stringnullableDisplay name.
shouldMaskEmail
booleanWhether lead email values are masked for this account.
emailRevealUsage
objectDashboard reveal quota summary.
used
integerReveals used.
limit
integerReveal limit.
credits
numberAvailable credit balance.
subscription
objectCurrent customer-visible subscription state.
planId
stringnullablePlan identifier.
status
stringnullableSubscription status.
concurrentCampaignLimit
integerConcurrent campaign limit.
workspace
objectEffective workspace context.
id
stringWorkspace ID.
name
stringWorkspace name.
role
stringWorkspace role.
owneradminmemberviewer
permissions
arrayWorkspace permissions granted to this account.
credits
numberWorkspace credit balance.
seatSummary
objectSeat usage summary.
used
integerSeats used.
limit
integerSeat limit.

Example

curl -X GET https://api.scravio.com/api/auth/me \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/auth/me \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/auth/me', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/auth/me', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();

Campaigns

Create campaigns, preview credit reservations, inspect leads, and start campaign validation.

POST/campaigns/reserve-preview
API keyBearer/JWT

Preview credit reservation

Returns the public credit reservation preview for a campaign request. Send the same type, inputs, targetEmails, maxCreditCap, enableEmailValidation, and enrichIgPosts values to POST /campaigns when launching. Campaign input rules: - INSTAGRAM_HASHTAG accepts inputs.hashtag or inputs.hashtags (max 20). - Instagram user follower/following campaigns accept inputs.targetUser or inputs.targetUsers. Paid workspaces support up to 20 targets; free and Project Pass workspaces support up to 2. - Instagram post liker/commenter campaigns accept inputs.mediaUrl or inputs.mediaUrls. Paid workspaces support up to 20 targets; free and Project Pass workspaces support up to 2. - INSTAGRAM_PROFILE_LIST accepts inputs.profileTargets (max 10000) and does not use targetEmails. - Keyword search types, TIKTOK_SEARCH_USERS, and YOUTUBE_CHANNEL_SEARCH accept inputs.keyword or inputs.keywords (max 20, 2-200 characters each). - YOUTUBE_CHANNEL_SEARCH accepts inputs.youtubeDiscoverySource as channel or video; default is channel. - GOOGLE_MAPS_SEARCH requires inputs.query, one country or countries value, lat, lng, and optional zoom from 1 to 21. The backend controls lang, limit, and offset. - X_FOLLOWERS, X_FOLLOWING, TIKTOK_USER_FOLLOWERS, and TIKTOK_USER_FOLLOWING use inputs.targetUser. - X_RETWEETS, X_REPLIERS, and TIKTOK_POST_COMMENTERS use inputs.mediaUrl. - Optional inputs.countries applies to Instagram, X, YouTube channel search, and keyword search. - Optional inputs.followerFilter with min and max applies to supported profile, list, post, TikTok, X, and YouTube channel campaigns. - Optional Instagram filters scrapeBusinessAccountsOnly and scrapePrivateAccounts apply to non-keyword Instagram campaigns. - targetEmails is required for new lead-target campaigns except INSTAGRAM_PROFILE_LIST. - maxCreditCap is optional and must be positive when provided. - enableDeepEmailSearch is accepted for backward compatibility; unsupported email-only types ignore it. - enrichIgPosts is Instagram-only and defaults to false.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Request Bodyrequired

application/json

FieldTypeDescription
typerequired
stringCampaign type to estimate.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
inputsrequired
objectType-specific campaign inputs.
hashtag
stringSingle hashtag for INSTAGRAM_HASHTAG campaigns. Omit the # prefix.(max 100 chars)
hashtags
arrayMultiple hashtags for INSTAGRAM_HASHTAG campaigns.(max 20 items)
targetUser
stringSingle profile handle for user-based campaigns.(max 100 chars)
targetUsers
arrayMultiple profile handles for supported Instagram user campaigns.(max 20 items)
mediaUrl
string<uri>Single public post URL for post-based campaigns.(max 2048 chars)
mediaUrls
arrayMultiple public post URLs for supported Instagram post campaigns.(max 20 items)
profileTargets
arrayProfile handles or URLs for INSTAGRAM_PROFILE_LIST campaigns.(max 10000 items)
keyword
stringSingle search keyword for keyword campaigns.(max 200 chars)
keywords
arrayMultiple search keywords.(max 20 items)
youtubeDiscoverySource
stringDiscovery source for YOUTUBE_CHANNEL_SEARCH.Default: channel
channelvideo
query
stringSearch query for GOOGLE_MAPS_SEARCH.(max 200 chars)
country
stringCountry code for GOOGLE_MAPS_SEARCH. Send exactly one country or countries value.(max 2 chars)
countries
arrayOptional country filters. For GOOGLE_MAPS_SEARCH, send exactly one value.(max 10 items)
lat
numberLatitude for GOOGLE_MAPS_SEARCH.
lng
numberLongitude for GOOGLE_MAPS_SEARCH.
zoom
integerMap zoom for GOOGLE_MAPS_SEARCH.Default: 12(121)
followerFilter
objectOptional follower range for supported campaign types.
min
integerMinimum follower count.
max
integerMaximum follower count.
scrapeBusinessAccountsOnly
booleanInstagram-only filter for business profiles.Default: false
scrapePrivateAccounts
booleanInstagram-only private-profile setting.Default: true
targetEmails
integerRequested lead goal. Required for lead-target campaigns and omitted for INSTAGRAM_PROFILE_LIST.
maxCreditCap
numberOptional positive hard cap for the campaign.
enableEmailValidation
booleanInclude campaign email validation in the preview.Default: false
enrichIgPosts
booleanInstagram-only post enrichment flag.Default: false

Responses

200Public reserve preview
FieldTypeDescription
success
booleanRequest success status.
data
objectCustomer-safe reserve preview.
type
stringCampaign type.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
targetMode
stringWhether the campaign targets leads or items.
LEAD_TARGETITEM_LIMIT
targetEmails
integernullableRequested lead goal when applicable.
creditReserved
numberCredits reserved on launch.
estimatedCredits
numberEstimated credits.
recommendedMaxCreditCap
numberRecommended cap for this request.
maxCreditCap
numberApplied cap for this request.
budgetMode
stringHow the cap was selected.
RECOMMENDED_CAPUSER_LIMITEDUSER_CUSTOM_CAP
estimatedReachableEmailsAtCap
integernullableEstimated reachable lead count under the applied cap.
warnings
arrayCustomer-facing warnings.
summary
objectBudget summary for review UI.
maxCreditSpend
numberApplied maximum credit spend.
recommendedMaxCreditSpend
numberRecommended maximum credit spend.
budgetMode
stringBudget mode label.
targetMode
stringTargeting mode label.
targetEmails
integernullableRequested lead goal when applicable.
scan
objectScan quantity summary.
count
integerScan count.
unit
stringScan unit.
findHiddenEmails
objectHidden-email search summary.
enabled
booleanWhether hidden-email search is enabled.
profilesToCheck
integerProfiles to check.
estimatedCreditCost
numberEstimated credits for this part of the preview.
publicEmailRate
objectnullablePublic email estimate range.
lower
numberLower bound.
upper
numberUpper bound.
estimatedEmails
integerEstimated emails.
estimatedReachableEmailsAtCap
integernullableEstimated reachable lead count under the cap.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X POST https://api.scravio.com/api/campaigns/reserve-preview \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
}'
curl -X POST https://api.scravio.com/api/campaigns/reserve-preview \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
}'
const res = await fetch('https://api.scravio.com/api/campaigns/reserve-preview', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
})
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/reserve-preview', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
})
});
const data = await res.json();
POST/campaigns
API keyBearer/JWT

Create campaign

Creates a new campaign and reserves credits for the configured request. Call /campaigns/reserve-preview first, then send the same top-level campaign settings to creation. Campaign input rules: - INSTAGRAM_HASHTAG accepts inputs.hashtag or inputs.hashtags (max 20). - Instagram user follower/following campaigns accept inputs.targetUser or inputs.targetUsers. Paid workspaces support up to 20 targets; free and Project Pass workspaces support up to 2. - Instagram post liker/commenter campaigns accept inputs.mediaUrl or inputs.mediaUrls. Paid workspaces support up to 20 targets; free and Project Pass workspaces support up to 2. - INSTAGRAM_PROFILE_LIST accepts inputs.profileTargets (max 10000) and does not use targetEmails. - Keyword search types, TIKTOK_SEARCH_USERS, and YOUTUBE_CHANNEL_SEARCH accept inputs.keyword or inputs.keywords (max 20, 2-200 characters each). - YOUTUBE_CHANNEL_SEARCH accepts inputs.youtubeDiscoverySource as channel or video; default is channel. - GOOGLE_MAPS_SEARCH requires inputs.query, one country or countries value, lat, lng, and optional zoom from 1 to 21. The backend controls lang, limit, and offset. - X_FOLLOWERS, X_FOLLOWING, TIKTOK_USER_FOLLOWERS, and TIKTOK_USER_FOLLOWING use inputs.targetUser. - X_RETWEETS, X_REPLIERS, and TIKTOK_POST_COMMENTERS use inputs.mediaUrl. - Optional inputs.countries applies to Instagram, X, YouTube channel search, and keyword search. - Optional inputs.followerFilter with min and max applies to supported profile, list, post, TikTok, X, and YouTube channel campaigns. - Optional Instagram filters scrapeBusinessAccountsOnly and scrapePrivateAccounts apply to non-keyword Instagram campaigns. - targetEmails is required for new lead-target campaigns except INSTAGRAM_PROFILE_LIST. - maxCreditCap is optional and must be positive when provided. - enableDeepEmailSearch is accepted for backward compatibility; unsupported email-only types ignore it. - enrichIgPosts is Instagram-only and defaults to false.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Request Bodyrequired

application/json

FieldTypeDescription
title
stringHuman-readable campaign name. Auto-generated if omitted.(max 100 chars)
typerequired
stringCampaign type.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
inputsrequired
objectType-specific campaign inputs.
hashtag
stringSingle hashtag for INSTAGRAM_HASHTAG campaigns. Omit the # prefix.(max 100 chars)
hashtags
arrayMultiple hashtags for INSTAGRAM_HASHTAG campaigns.(max 20 items)
targetUser
stringSingle profile handle for user-based campaigns.(max 100 chars)
targetUsers
arrayMultiple profile handles for supported Instagram user campaigns.(max 20 items)
mediaUrl
string<uri>Single public post URL for post-based campaigns.(max 2048 chars)
mediaUrls
arrayMultiple public post URLs for supported Instagram post campaigns.(max 20 items)
profileTargets
arrayProfile handles or URLs for INSTAGRAM_PROFILE_LIST campaigns.(max 10000 items)
keyword
stringSingle search keyword for keyword campaigns.(max 200 chars)
keywords
arrayMultiple search keywords.(max 20 items)
youtubeDiscoverySource
stringDiscovery source for YOUTUBE_CHANNEL_SEARCH.Default: channel
channelvideo
query
stringSearch query for GOOGLE_MAPS_SEARCH.(max 200 chars)
country
stringCountry code for GOOGLE_MAPS_SEARCH. Send exactly one country or countries value.(max 2 chars)
countries
arrayOptional country filters. For GOOGLE_MAPS_SEARCH, send exactly one value.(max 10 items)
lat
numberLatitude for GOOGLE_MAPS_SEARCH.
lng
numberLongitude for GOOGLE_MAPS_SEARCH.
zoom
integerMap zoom for GOOGLE_MAPS_SEARCH.Default: 12(121)
followerFilter
objectOptional follower range for supported campaign types.
min
integerMinimum follower count.
max
integerMaximum follower count.
scrapeBusinessAccountsOnly
booleanInstagram-only filter for business profiles.Default: false
scrapePrivateAccounts
booleanInstagram-only private-profile setting.Default: true
targetEmails
integerRequested lead goal. Required for lead-target campaigns and omitted for INSTAGRAM_PROFILE_LIST.
maxCreditCap
numberOptional positive hard cap. If omitted, creation uses the reserved estimate.
enableEmailValidation
booleanValidate emails during the campaign.Default: false
enableDeepEmailSearch
booleanBackward-compatible flag for supported campaign types.
enrichIgPosts
booleanInstagram-only post enrichment flag.Default: false

Responses

201Campaign created
FieldTypeDescription
campaign
objectCustomer-safe campaign summary.
id
stringCampaign ID.
title
stringCampaign title.
type
stringCampaign type.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
status
stringCurrent campaign status.
pendingscrapingscraping_completedprocessing_emailsfully_completedfailedstopped
inputs
objectSubmitted campaign inputs.
targetEmails
integernullableRequested lead goal for lead-target campaigns.
targetMode
stringCampaign targeting mode.
LEAD_TARGETITEM_LIMIT
maxCreditCap
numbernullableConfigured campaign credit cap.
progressPercentage
numberProgress from 0 to 100.
emailCount
integerEmails found so far.
profileCount
integerProfiles or items processed so far.
enableEmailValidation
booleanWhether campaign email validation is enabled.
enableDeepEmailSearch
booleanWhether supported hidden-email search is enabled.
createdAt
string<date-time>Creation timestamp.
updatedAt
string<date-time>Last update timestamp.
finishedAt
string<date-time>nullableCompletion timestamp.

Example

curl -X POST https://api.scravio.com/api/campaigns \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "June partner prospecting",
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
}'
curl -X POST https://api.scravio.com/api/campaigns \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "June partner prospecting",
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
}'
const res = await fetch('https://api.scravio.com/api/campaigns', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "title": "June partner prospecting",
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
})
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "title": "June partner prospecting",
  "type": "INSTAGRAM_HASHTAG",
  "inputs": {
    "hashtags": [
      "designsystems",
      "growthops"
    ]
  },
  "targetEmails": 500,
  "maxCreditCap": 2500,
  "enableEmailValidation": true
})
});
const data = await res.json();
GET/campaigns
API keyBearer/JWT

List campaigns

Returns a paginated list of campaigns visible to the effective account and workspace.
X-Workspace-Id supportedPermission: view_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
page
queryintegerPage number.Default: 1
perPage
queryintegerItems per page.Default: 10
status
querystringFilter by campaign status.
pendingscrapingscraping_completedprocessing_emailsfully_completedfailedstopped
type
querystringFilter by campaign type or platform shorthand.
q
querystringSearch campaign title or target input.
sortBy
querystringSort field.Default: createdAt
createdAtprogressstatus
order
querystringSort direction.Default: desc
ascdesc
from
querystringStart date filter.
to
querystringEnd date filter.

Responses

200Paginated campaign list
FieldTypeDescription
items
arrayCampaign summaries.
id
stringCampaign ID.
title
stringCampaign title.
type
stringCampaign type.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
status
stringCurrent campaign status.
pendingscrapingscraping_completedprocessing_emailsfully_completedfailedstopped
inputs
objectSubmitted campaign inputs.
targetEmails
integernullableRequested lead goal for lead-target campaigns.
targetMode
stringCampaign targeting mode.
LEAD_TARGETITEM_LIMIT
maxCreditCap
numbernullableConfigured campaign credit cap.
progressPercentage
numberProgress from 0 to 100.
emailCount
integerEmails found so far.
profileCount
integerProfiles or items processed so far.
enableEmailValidation
booleanWhether campaign email validation is enabled.
enableDeepEmailSearch
booleanWhether supported hidden-email search is enabled.
createdAt
string<date-time>Creation timestamp.
updatedAt
string<date-time>Last update timestamp.
finishedAt
string<date-time>nullableCompletion timestamp.
pagination
objectPagination details.
totalCount
integerTotal matching records.
totalPages
integerTotal pages available.
currentPage
integerCurrent page number.
perPage
integerRecords returned per page.

Example

curl -X GET https://api.scravio.com/api/campaigns?page=1&perPage=10&status=fully_completed \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/campaigns?page=1&perPage=10&status=fully_completed \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns?page=1&perPage=10&status=fully_completed', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns?page=1&perPage=10&status=fully_completed', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/campaigns/export-schemas
API keyBearer/JWT

Get export schemas

Returns static export schema details for supported campaign result formats. The response contains column keys and labels only.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Responses

200Export schemas
FieldTypeDescription
success
booleanRequest success status.
data
objectSchema response.
schemas
arrayAvailable export schemas.
key
stringSchema key.
label
stringDisplay label.
columns
arrayColumn definitions.
key
stringColumn key.
label
stringColumn label.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X GET https://api.scravio.com/api/campaigns/export-schemas \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/campaigns/export-schemas \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns/export-schemas', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/export-schemas', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/campaigns/{id}
API keyBearer/JWT

Get campaign details

Returns the customer-safe detail view for a single campaign in the effective workspace.
X-Workspace-Id supportedPermission: view_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringCampaign ID.

Responses

200Campaign detail
FieldTypeDescription
campaign
objectCustomer-safe campaign detail.
id
stringCampaign ID.
title
stringCampaign title.
type
stringCampaign type.
INSTAGRAM_HASHTAGINSTAGRAM_USER_FOLLOWERSINSTAGRAM_USER_FOLLOWINGINSTAGRAM_POST_LIKERSINSTAGRAM_POST_COMMENTERSINSTAGRAM_PROFILE_LISTINSTAGRAM_KEYWORD_SEARCHYOUTUBE_KEYWORD_SEARCHYOUTUBE_CHANNEL_SEARCHFACEBOOK_KEYWORD_SEARCHLINKEDIN_KEYWORD_SEARCHTWITTER_KEYWORD_SEARCHTIKTOK_KEYWORD_SEARCHTIKTOK_SEARCH_USERSTIKTOK_USER_FOLLOWERSTIKTOK_USER_FOLLOWINGTIKTOK_POST_COMMENTERSX_KEYWORD_SEARCHX_FOLLOWERSX_FOLLOWINGX_RETWEETSX_REPLIERSGOOGLE_MAPS_SEARCH
status
stringCurrent campaign status.
pendingscrapingscraping_completedprocessing_emailsfully_completedfailedstopped
inputs
objectSubmitted campaign inputs.
targetEmails
integernullableRequested lead goal for lead-target campaigns.
targetMode
stringCampaign targeting mode.
LEAD_TARGETITEM_LIMIT
maxCreditCap
numbernullableConfigured campaign credit cap.
progressPercentage
numberProgress from 0 to 100.
emailCount
integerEmails found so far.
profileCount
integerProfiles or items processed so far.
enableEmailValidation
booleanWhether campaign email validation is enabled.
enableDeepEmailSearch
booleanWhether supported hidden-email search is enabled.
createdAt
string<date-time>Creation timestamp.
updatedAt
string<date-time>Last update timestamp.
finishedAt
string<date-time>nullableCompletion timestamp.
postValidation
objectnullablePost-campaign validation summary when present.
status
stringValidation status.
total
integerEmails selected for validation.
validated
integerEmails processed.
valid
integerValid email count.
invalid
integerInvalid email count.
404Campaign not found.

Example

curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/campaigns/{id}/leads
API keyBearer/JWT

List campaign leads

Returns a paginated list of leads for a campaign. Responses use synthetic examples in these docs; production responses contain customer-owned lead records and may mask emails based on account state.
X-Workspace-Id supportedPermission: view_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringCampaign ID.
page
queryintegerPage number.Default: 1
perPage
queryintegerItems per page.Default: 10
hasEmail
querybooleanFilter leads with or without an email.
validationStatus
querystringFilter by validation status.
validinvalidpending
platform
querystringFilter by source platform.
sourceType
querystringFilter by lead source type.
emailSource
querystringFilter by email source.
sortBy
querystringSort field.Default: hasEmail
hasEmailfollowerCountscrapedAt
order
querystringSort direction.Default: desc
ascdesc

Responses

200Paginated lead list
FieldTypeDescription
items
arrayLead records.
id
stringLead ID.
campaignId
stringCampaign ID.
platform
stringSource platform.
instagramyoutubelinkedinfacebooktiktokxgoogle_maps
sourceType
stringLead source type.
email
string<email>nullableEmail address when available. The value may be masked for the current account.
emailMasked
booleanWhether email fields are masked in this response.
emailRevealed
booleanWhether this row has been individually revealed for the current account.
canRevealEmail
booleanWhether this row can be revealed in the dashboard.
emailSource
stringnullableHow Scravio found the email.
username
stringnullableProfile username or handle.
fullName
stringnullableProfile display name.
biography
stringnullableProfile biography.
externalUrl
stringnullableWebsite from the profile.
phoneNumber
stringnullablePhone number when present.
followerCount
integernullableFollower count.
followingCount
integernullableFollowing count.
mediaCount
integernullablePost or media count.
isPrivate
booleannullableWhether the profile is private.
isVerified
booleannullableWhether the profile is verified.
isBusiness
booleannullableWhether the profile is a business account.
country
stringnullableCountry when available.
emailValidation
objectnullableCustomer-safe validation result when validation has run.
status
stringValidation status.
isValid
booleanWhether the email is valid.
checkedAt
string<date-time>Validation timestamp.
scrapedAt
string<date-time>Lead discovery timestamp.
pagination
objectPagination details.
totalCount
integerTotal matching records.
totalPages
integerTotal pages available.
currentPage
integerCurrent page number.
perPage
integerRecords returned per page.

Example

curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/leads?hasEmail=true&page=1&perPage=20 \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/leads?hasEmail=true&page=1&perPage=20 \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/leads?hasEmail=true&page=1&perPage=20', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/leads?hasEmail=true&page=1&perPage=20', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
POST/campaigns/{id}/stop
API keyBearer/JWT

Stop a running campaign

Requests a graceful stop for a running campaign. The command is safe to call more than once.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringCampaign ID.

Request Body

application/json

FieldTypeDescription
reason
stringOptional stop reason.(max 500 chars)

Responses

200Campaign stop requested
FieldTypeDescription
campaignId
stringCampaign ID.
stopRequested
booleanWhether the stop was accepted.
status
stringUpdated campaign status.
stoppedReason
stringnullableStop reason when provided.

Example

curl -X POST https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/stop \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "Reached the weekly outreach target"
}'
curl -X POST https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/stop \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "Reached the weekly outreach target"
}'
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/stop', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "reason": "Reached the weekly outreach target"
})
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/stop', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "reason": "Reached the weekly outreach target"
})
});
const data = await res.json();
GET/campaigns/{id}/validate/preview
API keyBearer/JWT

Preview post-campaign validation

Returns a customer-safe eligibility and credit preview before starting post-campaign email validation.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringCampaign ID.

Responses

200Validation preview
FieldTypeDescription
campaignId
stringCampaign ID.
emailsToValidate
integerEmails selected for validation.
creditCost
numberCredits required.
currentBalance
numberCurrent available credits.
hasSufficientCredits
booleanWhether credits are sufficient.
canValidate
booleanWhether validation can start.

Example

curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate/preview \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate/preview \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate/preview', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate/preview', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
POST/campaigns/{id}/validate
API keyBearer/JWT

Start post-campaign validation

Starts asynchronous email validation for leads in a completed or stopped campaign. Use the preview endpoint first to confirm eligibility and credits.
X-Workspace-Id supportedPermission: create_campaignWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringCampaign ID.

Responses

202Validation started
FieldTypeDescription
campaignId
stringCampaign ID.
jobId
stringValidation job ID.
emailsToValidate
integerEmails selected for validation.
creditCost
numberCredits reserved.
status
stringValidation status.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X POST https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X POST https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/campaigns/cmp_01J7SYNTHETIC/validate', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();

Validation

Submit pasted email lists and inspect standalone validation jobs.

POST/validation-jobs/text
API keyBearer/JWT

Submit emails for validation

Creates a standalone validation job from an email array. Submit 1 to 5000 unique emails. API-key requests must use an account-scoped key.
X-Workspace-Id supportedAccount-scoped API keys only

Bearer requests may use X-Workspace-Id. API-key requests must use an account-scoped key; workspace-scoped keys are rejected.

Request Bodyrequired

application/json

FieldTypeDescription
emailsrequired
arrayEmail addresses to validate. Duplicates are removed case-insensitively.(max 5000 items)

Responses

201Validation job created
FieldTypeDescription
success
booleanRequest success status.
data
objectValidation job summary.
jobId
stringValidation job ID.
status
stringValidation job status.
pendingqueuedprocessingcompletedfailedcancelled
totalEmails
integerTotal unique emails submitted.
processedCount
integerEmails processed so far.
validCount
integerValid email count.
invalidCount
integerInvalid email count.
downloadUrl
stringnullableOpaque short-lived Scravio result URL when the job is completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X POST https://api.scravio.com/api/validation-jobs/text \
  -H "X-API-Key: sk_live_example_key" \
  -H "Content-Type: application/json" \
  -d '{
  "emails": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ]
}'
curl -X POST https://api.scravio.com/api/validation-jobs/text \
  -H "Authorization: Bearer <accessToken>" \
  -H "Content-Type: application/json" \
  -d '{
  "emails": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ]
}'
const res = await fetch('https://api.scravio.com/api/validation-jobs/text', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "emails": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ]
})
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/validation-jobs/text', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "emails": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
  ]
})
});
const data = await res.json();
GET/validation-jobs
API keyBearer/JWT

List validation jobs

Returns a sanitized paginated list of standalone validation jobs. API-key requests must use an account-scoped key.
X-Workspace-Id supportedAccount-scoped API keys only

Bearer requests may use X-Workspace-Id. API-key requests must use an account-scoped key; workspace-scoped keys are rejected.

Parameters

NameInTypeDescription
page
queryintegerPage number.Default: 1
limit
queryintegerItems per page.Default: 10
status
querystringFilter by job status.
pendingqueuedprocessingcompletedfailedcancelled
provider
querystringFilter by validation source where available.
from
querystringStart date filter.
to
querystringEnd date filter.
sortBy
querystringSort field.Default: createdAt
createdAtcompletedAt
order
querystringSort direction.Default: desc
ascdesc

Responses

200Paginated validation job list
FieldTypeDescription
success
booleanRequest success status.
data
objectValidation jobs page.
jobs
arrayValidation jobs.
jobId
stringValidation job ID.
status
stringValidation job status.
pendingqueuedprocessingcompletedfailedcancelled
totalEmails
integerTotal unique emails submitted.
processedCount
integerEmails processed so far.
validCount
integerValid email count.
invalidCount
integerInvalid email count.
downloadUrl
stringnullableOpaque short-lived Scravio result URL when the job is completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
total
integerTotal job count.
page
integerCurrent page.
pages
integerTotal pages.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X GET https://api.scravio.com/api/validation-jobs?page=1&limit=10&status=completed \
  -H "X-API-Key: sk_live_example_key"
curl -X GET https://api.scravio.com/api/validation-jobs?page=1&limit=10&status=completed \
  -H "Authorization: Bearer <accessToken>"
const res = await fetch('https://api.scravio.com/api/validation-jobs?page=1&limit=10&status=completed', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/validation-jobs?page=1&limit=10&status=completed', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>'
  }
});
const data = await res.json();
GET/validation-jobs/{id}
API keyBearer/JWT

Get validation job details

Returns sanitized detail for a standalone validation job. API-key requests must use an account-scoped key.
X-Workspace-Id supportedAccount-scoped API keys only

Bearer requests may use X-Workspace-Id. API-key requests must use an account-scoped key; workspace-scoped keys are rejected.

Parameters

NameInTypeDescription
idrequired
pathstringValidation job ID.

Responses

200Validation job detail
FieldTypeDescription
success
booleanRequest success status.
data
objectValidation job detail.
jobId
stringValidation job ID.
status
stringValidation job status.
pendingqueuedprocessingcompletedfailedcancelled
totalEmails
integerTotal unique emails submitted.
processedCount
integerEmails processed so far.
validCount
integerValid email count.
invalidCount
integerInvalid email count.
downloadUrl
stringnullableOpaque short-lived Scravio result URL when the job is completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
requestId
stringSynthetic request identifier for support correlation.
404Validation job not found.

Example

curl -X GET https://api.scravio.com/api/validation-jobs/vjob_01J7SYNTHETIC \
  -H "X-API-Key: sk_live_example_key"
curl -X GET https://api.scravio.com/api/validation-jobs/vjob_01J7SYNTHETIC \
  -H "Authorization: Bearer <accessToken>"
const res = await fetch('https://api.scravio.com/api/validation-jobs/vjob_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/validation-jobs/vjob_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>'
  }
});
const data = await res.json();

Exports

Create, list, inspect, and download campaign lead exports.

POST/list-exports
API keyBearer/JWT

Create a list export

Creates an asynchronous CSV or XLSX export from campaign leads. The webhook URL, when supplied, must be HTTPS and is treated as customer configuration.
X-Workspace-Id supportedPermission: export_resultsWorkspace-scoped API keys supported

Request Bodyrequired

application/json

FieldTypeDescription
campaignIdrequired
stringCampaign ID.
fileFormat
stringExport file format.Default: csv
csvxlsx
emailOnly
booleanInclude only leads with an email.Default: false
onlyValidEmails
booleanInclude only validated emails.Default: false
includeAIVerified
booleanInclude AI-verified email data when available.Default: false
dedupeByEmail
booleanDeduplicate exported rows by email.Default: true
dateRange
objectOptional lead discovery date range.
from
stringStart date.
to
stringEnd date.
webhookUrl
string<uri>Optional HTTPS webhook endpoint for completion notification.

Responses

201Export created
FieldTypeDescription
success
booleanRequest success status.
data
objectExport summary.
exportId
stringExport ID.
campaignId
stringCampaign ID.
status
stringExport status.
pendingprocessingcompletedfailed
progress
numberProgress from 0 to 100.
fileFormat
stringExport file format.
csvxlsx
filename
stringnullableSuggested filename when completed.
totalRecords
integernullableTotal records included when completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
requestId
stringSynthetic request identifier for support correlation.
200Existing matching export returned.

Example

curl -X POST https://api.scravio.com/api/list-exports \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "campaignId": "cmp_01J7SYNTHETIC",
  "fileFormat": "csv",
  "emailOnly": true,
  "onlyValidEmails": true,
  "dedupeByEmail": true,
  "webhookUrl": "https://hooks.example.com/scravio/export-ready"
}'
curl -X POST https://api.scravio.com/api/list-exports \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team" \
  -H "Content-Type: application/json" \
  -d '{
  "campaignId": "cmp_01J7SYNTHETIC",
  "fileFormat": "csv",
  "emailOnly": true,
  "onlyValidEmails": true,
  "dedupeByEmail": true,
  "webhookUrl": "https://hooks.example.com/scravio/export-ready"
}'
const res = await fetch('https://api.scravio.com/api/list-exports', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "campaignId": "cmp_01J7SYNTHETIC",
  "fileFormat": "csv",
  "emailOnly": true,
  "onlyValidEmails": true,
  "dedupeByEmail": true,
  "webhookUrl": "https://hooks.example.com/scravio/export-ready"
})
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/list-exports', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "campaignId": "cmp_01J7SYNTHETIC",
  "fileFormat": "csv",
  "emailOnly": true,
  "onlyValidEmails": true,
  "dedupeByEmail": true,
  "webhookUrl": "https://hooks.example.com/scravio/export-ready"
})
});
const data = await res.json();
GET/list-exports
API keyBearer/JWT

List exports

Returns a sanitized paginated list of export jobs in the effective workspace.
X-Workspace-Id supportedPermission: export_resultsWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
page
queryintegerPage number.Default: 1
perPage
queryintegerItems per page.Default: 10
campaignId
querystringFilter by campaign ID.
status
querystringFilter by export status.
pendingprocessingcompletedfailed
sortBy
querystringSort field.Default: createdAt
createdAtcompletedAtstatus
order
querystringSort direction.Default: desc
ascdesc

Responses

200Paginated export list
FieldTypeDescription
success
booleanRequest success status.
data
objectExports page.
exports
arrayExport summaries.
exportId
stringExport ID.
campaignId
stringCampaign ID.
status
stringExport status.
pendingprocessingcompletedfailed
progress
numberProgress from 0 to 100.
fileFormat
stringExport file format.
csvxlsx
filename
stringnullableSuggested filename when completed.
totalRecords
integernullableTotal records included when completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
pagination
objectPagination details.
totalCount
integerTotal matching records.
totalPages
integerTotal pages available.
currentPage
integerCurrent page number.
perPage
integerRecords returned per page.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X GET https://api.scravio.com/api/list-exports?page=1&perPage=10 \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/list-exports?page=1&perPage=10 \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/list-exports?page=1&perPage=10', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/list-exports?page=1&perPage=10', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/list-exports/{id}
API keyBearer/JWT

Get export details

Returns sanitized export details. The direct file location is not exposed in this response.
X-Workspace-Id supportedPermission: export_resultsWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringExport ID.

Responses

200Export detail
FieldTypeDescription
success
booleanRequest success status.
data
objectExport details.
exportId
stringExport ID.
campaignId
stringCampaign ID.
status
stringExport status.
pendingprocessingcompletedfailed
progress
numberProgress from 0 to 100.
fileFormat
stringExport file format.
csvxlsx
filename
stringnullableSuggested filename when completed.
totalRecords
integernullableTotal records included when completed.
createdAt
string<date-time>Creation timestamp.
completedAt
string<date-time>nullableCompletion timestamp.
requestId
stringSynthetic request identifier for support correlation.
404Export not found.

Example

curl -X GET https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/list-exports/{id}/download
API keyBearer/JWT

Get export download URL

Returns an opaque Scravio download URL for a completed export. Do not parse or persist the returned URL.
X-Workspace-Id supportedPermission: export_resultsWorkspace-scoped API keys supported

Parameters

NameInTypeDescription
idrequired
pathstringExport ID.

Responses

200Export download URL
FieldTypeDescription
success
booleanRequest success status.
data
objectOpaque download response.
downloadUrl
string<uri>Opaque Scravio download URL.
filename
stringSuggested filename.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X GET https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC/download \
  -H "X-API-Key: sk_live_example_key" \
  -H "X-Workspace-Id: ws_example_team"
curl -X GET https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC/download \
  -H "Authorization: Bearer <accessToken>" \
  -H "X-Workspace-Id: ws_example_team"
const res = await fetch('https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC/download', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/list-exports/exp_01J7SYNTHETIC/download', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>',
    'X-Workspace-Id': 'ws_example_team'
  }
});
const data = await res.json();
GET/list-exports/download/{downloadId}
PublicBearer/JWT

Follow export download redirect

Public redirect endpoint returned by the authenticated download request. Do not send X-API-Key to this route. Optional auth, when used, must be Bearer/JWT.

Parameters

NameInTypeDescription
downloadIdrequired
pathstringOpaque download ID from downloadUrl.

Responses

302Redirects to the export file.
304Not modified when cache validators match.
404Download link not found or expired.

Example

curl -L -X GET https://api.scravio.com/api/list-exports/download/dl_01J7SYNTHETIC
curl -L -X GET https://api.scravio.com/api/list-exports/download/dl_01J7SYNTHETIC \
  -H "Authorization: Bearer <accessToken>"
const res = await fetch('https://api.scravio.com/api/list-exports/download/dl_01J7SYNTHETIC', {
  method: 'GET',
  redirect: 'follow'
});
const file = await res.blob();
const res = await fetch('https://api.scravio.com/api/list-exports/download/dl_01J7SYNTHETIC', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>'
  },
  redirect: 'follow'
});
const file = await res.blob();

Credits

Read the customer-safe credit transaction ledger.

GET/credit-transactions
API keyBearer/JWT

List credit transactions

Returns a paginated ledger of customer-visible credit balance changes. API-key requests must use an account-scoped key.
Account-scopedAccount-scoped API keys only

This endpoint is account-scoped. Do not send X-Workspace-Id.

Parameters

NameInTypeDescription
page
queryintegerPage number.Default: 1
perPage
queryintegerItems per page.Default: 10
type
querystringFilter by transaction type.
campaignId
querystringFilter by campaign ID.
from
querystringStart date filter.
to
querystringEnd date filter.
sortBy
querystringSort field.Default: timestamp
timestampamount
order
querystringSort direction.Default: desc
ascdesc

Responses

200Paginated transaction list
FieldTypeDescription
transactions
arrayCredit transactions.
id
stringTransaction ID.
timestamp
string<date-time>Transaction timestamp.
balanceBefore
numberBalance before the transaction.
amount
numberSigned credit amount.
balanceAfter
numberBalance after the transaction.
type
stringTransaction type.
description
stringCustomer-visible description.
campaignId
stringnullableRelated campaign ID when applicable.
details
objectnullableWhitelisted receipt fields when applicable.
kind
stringnullableReceipt kind.
reservedCredits
numbernullableCredits reserved for a campaign.
usedCredits
numbernullableCredits used by a campaign.
returnedCredits
numbernullableUnused credits returned.
amountPaid
numbernullableAmount paid for a purchase.
method
stringnullablePayment method family.
cardcrypto
createdAt
string<date-time>Creation timestamp.
pagination
objectPagination details.
totalCount
integerTotal matching records.
totalPages
integerTotal pages available.
currentPage
integerCurrent page number.
perPage
integerRecords returned per page.
requestId
stringSynthetic request identifier for support correlation.

Example

curl -X GET https://api.scravio.com/api/credit-transactions?page=1&perPage=10&sortBy=timestamp&order=desc \
  -H "X-API-Key: sk_live_example_key"
curl -X GET https://api.scravio.com/api/credit-transactions?page=1&perPage=10&sortBy=timestamp&order=desc \
  -H "Authorization: Bearer <accessToken>"
const res = await fetch('https://api.scravio.com/api/credit-transactions?page=1&perPage=10&sortBy=timestamp&order=desc', {
  method: 'GET',
  headers: {
    'X-API-Key': 'sk_live_example_key'
  }
});
const data = await res.json();
const res = await fetch('https://api.scravio.com/api/credit-transactions?page=1&perPage=10&sortBy=timestamp&order=desc', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer <accessToken>'
  }
});
const data = await res.json();
TOC