API Management
Create and manage API keys for programmatic access to your account
API Documentation
Authentication Header
Include your API key in every request using the X-API-Key header:
X-API-Key: your_api_key_here
Endpoints
Standard Endpoints
/jobs/add
Creates a new job/campaign with specified details. Requires multipart/form-data content type. Set approve_once_full to true to automatically approve all submissions and pay workers once the job reaches its total availabilities.
Request
Content-Type: multipart/form-data title: string (required) description: string (required) pay_rate: decimal (required) total_availabilities: integer (required) proof_required_description: string (required) category: string (required) sub_category: string (optional) campaign_image: file (optional) countries: array (optional. Omit to include all countries) approve_once_full: boolean (optional, default: false. When true, all submissions are automatically approved and workers paid once the job reaches its total availabilities)
Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job": {
"public_id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Test Job",
"status": "Active",
"pay_rate": "5.00",
"total_availabilities": 10
},
"deduction_details": {
"total_cost": "50.00",
"commission": "5.00",
"total_deducted": "55.00",
"new_balance": "945.00"
}
}Error Responses
- 400 — Invalid data or insufficient balance
- 401 — Invalid or missing API key
- 403 — Job rejected by legitimacy check
Code Example
import requests
# Create a job without image
job_data = {
"title": "Complete a Survey",
"description": "Fill out our 5-minute customer satisfaction survey",
"pay_rate": "2.50",
"total_availabilities": "100",
"proof_required_description": "Submit a screenshot of the completion page",
"category": "Survey",
"sub_category": (None, "Customer Feedback"),
"countries": (None, '["US", "CA", "GB"]'), # Omit to include all countries
}
response = requests.post(
"https://api.rapidworkers.io/jobs/add",
headers={"X-API-Key": "your_api_key_here"},
files=job_data
)
job = response.json()
print(f"Job created: {job['job']['public_id']}")/account/get_balance
Retrieves your current account balance.
Request
Content-Type: application/json
{} // Empty bodyResponse
// 200 OK
{
"balance": "1000.00"
}Error Responses
- 401 — Invalid or missing API key
- 404 — User not found
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/account/get_balance",
headers={"X-API-Key": "your_api_key_here"}
)
print(f"Balance: {response.json()['balance']}")/api/campaigns/{campaign_id}/submissions/{submission_id}/approve/
Approves a worker's submission for your campaign.
Path Parameters
campaign_id (UUID) submission_id (integer)
Request
Content-Type: application/json
{
"notes": "Great work!" // Optional
}Response
// 200 OK
{
"success": true,
"message": "Submission approved successfully",
"submission": {
"id": 123,
"user": "worker_username",
"status": "Approved",
"amount_paid": "5.00"
}
}Error Responses
- 400 — Submission already processed or insufficient funds
- 403 — You don't own this campaign
- 404 — Submission not found
Code Example
import requests
campaign_id = "your_campaign_public_id"
submission_id = 456
response = requests.post(
f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/{submission_id}/approve/",
headers={"X-API-Key": "your_api_key_here"},
json={"notes": "Great work!"}
)
print(f"Submission approved: {response.json()}")/api/campaigns/{campaign_id}/submissions/{submission_id}/reject/
Rejects a worker's submission with a reason.
Path Parameters
campaign_id (UUID) submission_id (integer)
Request
Content-Type: application/json
{
"notes": "Does not meet requirements" // Required
}Response
// 200 OK
{
"success": true,
"message": "Submission rejected",
"submission": {
"id": 123,
"user": "worker_username",
"status": "Rejected",
"notes": "Does not meet requirements"
}
}Error Responses
- 400 — Missing rejection reason
- 403 — You don't own this campaign
- 404 — Submission not found
Code Example
import requests
campaign_id = "your_campaign_public_id"
submission_id = 456
response = requests.post(
f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/{submission_id}/reject/",
headers={"X-API-Key": "your_api_key_here"},
json={"notes": "Screenshot does not show completion page"}
)
print(f"Submission rejected: {response.json()}")/api/campaigns/{campaign_id}/submissions/bulk_action/
Approve all pending submissions for a campaign at once.
Path Parameters
campaign_id (UUID)
Request
Content-Type: application/json
{
"notes": "Bulk action notes" // Optional
}Response
// 200 OK
{
"success": true,
"message": "All submissions approved successfully.",
"submissions": [
{ "id": 123, "status": "Approved", "user": "worker1" },
{ "id": 124, "status": "Approved", "user": "worker2" }
]
}Error Responses
- 403 — You don't own this campaign
- 404 — No pending submissions found
Code Example
import requests
campaign_id = "your_campaign_public_id"
# Bulk approve all pending
response = requests.post(
f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/bulk_action/",
headers={"X-API-Key": "your_api_key_here"},
json={"notes": "All submissions verified"}
)
print(f"Bulk action result: {response.json()}")/api/campaigns/
Retrieves all campaigns owned by the authenticated user, with optional status filtering.
Request
Query Parameters (optional):
status: string ("Active", "Pending", "Completed", "Canceled")
language: string (default: "en")Response
// 200 OK
[
{
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobTitle": "Complete a Survey",
"jobCategory": "Survey",
"jobPay": "2.50",
"jobLocation": "In",
"jobCreatedAt": "2025-01-15T10:30:00Z",
"jobStatus": "Active",
"jobInstancesCompleted": 45,
"jobTotalAvailabilities": 100,
"jobSuccessRate": "40%",
"description": "Fill out our customer satisfaction survey",
"canceled": false,
"remainingAvailabilities": 55,
"pendingSubmissions": 12,
"approvedSubmissions": 40,
"rejectedSubmissions": 5
}
]
Error Responses
- 401 — Invalid or missing API key
Code Example
import requests
# List all campaigns
response = requests.get(
"https://api.rapidworkers.io/api/campaigns/",
headers={"X-API-Key": "your_api_key_here"}
)
campaigns = response.json()
for campaign in campaigns["results"]:
print(f"{campaign['jobTitle']} - {campaign['jobStatus']}")
# Filter by status
response = requests.get(
"https://api.rapidworkers.io/api/campaigns/?status=Active",
headers={"X-API-Key": "your_api_key_here"}
)/api/campaigns/detail/{campaign_id}/
Retrieves detailed information about a specific campaign including submission counts and remaining availability.
Path Parameters
campaign_id (UUID)
Request
Query Parameters (optional): language: string (default: "en")
Response
// 200 OK
{
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobTitle": "Complete a Survey",
"jobCategory": "Survey",
"jobPay": "2.50",
"jobLocation": "In",
"jobCreatedAt": "2025-01-15T10:30:00Z",
"jobStatus": "Active",
"jobInstancesCompleted": 45,
"jobTotalAvailabilities": 100,
"jobSuccessRate": "40%",
"description": "Fill out our customer satisfaction survey",
"canceled": false,
"remainingAvailabilities": 55,
"pendingSubmissions": 12,
"approvedSubmissions": 40,
"rejectedSubmissions": 5
}Error Responses
- 401 — Invalid or missing API key
- 403 — You don't own this campaign
- 404 — Campaign not found
Code Example
import requests
campaign_id = "123e4567-e89b-12d3-a456-426614174000"
response = requests.get(
f"https://api.rapidworkers.io/api/campaigns/detail/{campaign_id}/",
headers={"X-API-Key": "your_api_key_here"}
)
campaign = response.json()
print(f"Remaining slots: {campaign['remaining_availabilities']}")
print(f"Pending: {campaign['pending_submissions']}")/api/campaigns/{campaign_id}/submissions/
Retrieves all submissions for a specific campaign with worker metadata, optional status filtering, and pagination.
Path Parameters
campaign_id (UUID)
Request
Query Parameters (optional):
status: string ("Pending", "Approved", "Rejected")
search: string (search by worker name)
page: integer (default: 1)
rowsPerPage: integer (default: 1000)
language: string (default: "en")Response
// 200 OK
{
"count": 45,
"next": null,
"previous": null,
"results": {
"submissions": [
{
"submissionId": 123,
"userId": "abc-def-123",
"userName": "WorkerName",
"userAvatar": "https://...",
"campaignId": "123e4567-e89b-12d3-a456-426614174000",
"campaignTitle": "Complete a Survey",
"status": "Pending",
"country_name": "United States",
"submittedAt": "2025-01-16T14:30:00Z",
"proof_text": "Completed the survey as requested",
"images": [
{
"id": "img_1",
"url": "https://...",
"thumbnailUrl": "https://..."
}
],
"notes": null,
"workerAccountAgeDays": 120,
"workerApprovalRate": "85%",
"workerTotalCompleted": 47
}
],
"pagination": {
"totalCount": 45,
"pageCount": 1,
"currentPage": 1,
"rowsPerPage": 1000
}
}
}Error Responses
- 401 — Invalid or missing API key
- 403 — You don't own this campaign
- 404 — Campaign not found
Code Example
import requests
campaign_id = "123e4567-e89b-12d3-a456-426614174000"
# List all submissions
response = requests.get(
f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/",
headers={"X-API-Key": "your_api_key_here"}
)
data = response.json()
for sub in data["results"]["submissions"]:
print(f"#{sub['submissionId']} - {sub['status']} - Age: {sub['worker_account_age_days']}d")
# Filter pending only
response = requests.get(
f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/?status=Pending",
headers={"X-API-Key": "your_api_key_here"}
)/api/workers/block/
Blocks a worker from submitting proofs to any of your campaigns. Blocked workers will not see your campaigns in their job list.
Request
Content-Type: application/json
{
"worker_id": 12345 // Worker public ID
}Response
// 201 Created
{
"success": true,
"message": "Worker blocked successfully",
"worker_id": 12345
}Error Responses
- 400 — Missing worker_id, self-block attempt, or worker already blocked
- 401 — Invalid or missing API key
- 404 — Worker not found
Code Example
import requests
worker_id = 12345
response = requests.post(
"https://api.rapidworkers.io/api/workers/block/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={"worker_id": worker_id}
)
print(f"Worker blocked: {response.json()}")/api/workers/unblock/
Unblocks a previously blocked worker, allowing them to see and submit proofs to your campaigns again.
Request
Content-Type: application/json
{
"worker_id": 12345
}Response
// 200 OK
{
"success": true,
"message": "Worker unblocked successfully",
"worker_id": 12345
}Error Responses
- 400 — Missing worker_id or worker is not blocked
- 401 — Invalid or missing API key
- 404 — Worker not found
Code Example
import requests
worker_id = 12345
response = requests.post(
"https://api.rapidworkers.io/api/workers/unblock/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={"worker_id": worker_id}
)
print(f"Worker unblocked: {response.json()}")/api/workers/blocked/
Retrieves the list of all workers you have blocked.
Request
No request body required.
Response
// 200 OK
[
{
"worker_id": 12345,
"worker_name": "WorkerName",
"blocked_at": "2025-01-15T10:30:00Z"
}
]Error Responses
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.get(
"https://api.rapidworkers.io/api/workers/blocked/",
headers={"X-API-Key": "your_api_key_here"}
)
blocked = response.json()
for worker in blocked:
print(f"Blocked: {worker['worker_name']} (ID: {worker['worker_id']})")Prefilled Job Endpoints
Simplified endpoints for common social media engagement tasks. Only requires a link and quantity. All prefilled jobs have automatic approval enabled: submissions are automatically approved and workers paid once the job reaches its total availabilities.
/api/jobs/facebook-likes/
Create a simplified job for getting Facebook post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://facebook.com/post/123", // Required
"quantity": 50, // Required (minimum: 6)
"countries": ["US", "GB"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "2.50"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/facebook-likes/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://facebook.com/post/123",
"quantity": 50 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/facebook-shares/
Create a simplified job for getting Facebook post shares. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://facebook.com/post/123", // Required
"quantity": 25, // Required (minimum: 6)
"countries": ["US", "CA"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "1.25"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/facebook-shares/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://facebook.com/post/123",
"quantity": 25 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/instagram-likes/
Create a simplified job for getting Instagram post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://instagram.com/ABC123", // Required
"quantity": 100, // Required (minimum: 6)
"countries": ["US", "GB"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "5.00"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/instagram-likes/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://instagram.com/ABC123",
"quantity": 100 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/instagram-followers/
Create a simplified job for gaining Instagram followers. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://instagram.com/username", // Required
"quantity": 50, // Required (minimum: 6)
"countries": ["US", "CA"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "2.50"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/instagram-followers/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://instagram.com/username",
"quantity": 50 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/twitter-likes/
Create a simplified job for getting Twitter/X post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://twitter.com/user/status/123", // Required
"quantity": 75, // Required (minimum: 6)
"countries": ["US", "GB"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "3.75"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/twitter-likes/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://twitter.com/user/status/123",
"quantity": 75 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/twitter-followers/
Create a simplified job for gaining Twitter/X followers. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://twitter.com/username", // Required
"quantity": 50, // Required (minimum: 6)
"countries": ["US", "CA"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "2.50"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/twitter-followers/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://twitter.com/username",
"quantity": 50 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/twitter-retweets/
Create a simplified job for getting Twitter/X retweets. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://twitter.com/user/status/123", // Required
"quantity": 30, // Required (minimum: 6)
"countries": ["US", "GB"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "1.50"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/twitter-retweets/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://twitter.com/user/status/123",
"quantity": 30 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/trustpilot-reviews/
Create a simplified job for getting Trustpilot reviews. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://trustpilot.com/review/example.com", // Required
"quantity": 20, // Required (minimum: 6)
"countries": ["US", "CA"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "1.00"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/trustpilot-reviews/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://trustpilot.com/review/example.com",
"quantity": 20 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/9gag-upvotes/
Create a simplified job for getting 9GAG upvotes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://9gag.com/gag/abc123", // Required
"quantity": 50, // Required (minimum: 6)
"countries": ["US", "GB"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "2.50"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/9gag-upvotes/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://9gag.com/gag/abc123",
"quantity": 50 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")/api/jobs/youtube-likes/
Create a simplified job for getting YouTube video likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.
Request
Content-Type: application/json
{
"link": "https://youtube.com/watch?v=abc123", // Required
"quantity": 100, // Required (minimum: 6)
"countries": ["US", "CA"], // Omit to include all countries
"language": "en" // Optional
}Response
// 201 Created
{
"success": true,
"message": "Job created successfully",
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"total_cost": "5.00"
}Error Responses
- 400 — Invalid data, insufficient balance, or quantity below minimum (6)
- 401 — Invalid or missing API key
Code Example
import requests
response = requests.post(
"https://api.rapidworkers.io/api/jobs/youtube-likes/",
headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
json={
"link": "https://youtube.com/watch?v=abc123",
"quantity": 100 # Minimum: 6
}
)
job = response.json()
print(f"Job created: {job['job_id']}")Error Handling
All API errors follow a consistent format:
{
"error": "Error message describing what went wrong"
}- 200 Request succeeded
- 201 Resource created successfully
- 400 Invalid request data
- 401 Missing or invalid API key
- 403 Insufficient permissions
- 404 Resource not found
- 429 Rate limit exceeded (1,000/hour)
- 500 Server-side error