API REFERENCE

Everything you need to scrape, generate, and search — from any language or tool.

New here? Start in 60 seconds. Create a free account to get your API key, then come back — every example will auto-fill it.

Authentication

How to authenticate

Send your API key in the request header. That's it.

X-API-Key: YOUR_API_KEY

You can also pass it as a JSON body field: "api_key": "..."

Rate limits

Standard tier: 20 requests / day

Burst: 60 requests / minute

Response format

Every response is JSON. Check "success": true/false first.

{ "success": true, ... }
{ "success": false, "error": "..." }
Base URL https://pixels.osaystudio.com
POST /api/scrape Async Returns a job_id — poll for results

Start a scraping job. Choose Sniper mode (current page only, fast) or Crawl mode (follows links, deeper).

FieldTypeRequiredDescription
urlstringYesThe page to scrape
sniper_modeboolNotrue = current page only (default). false = follow links
max_filesintNoMax assets to download (default 100)
min_size_kbintNoSkip files smaller than this (filters icons/thumbnails)
keyword_filterstringNoOnly grab URLs containing this word
download_videosboolNoInclude .mp4, .mov, etc.
download_docsboolNoInclude .pdf, .zip, etc.
ai_labelingboolNoUse Vision AI to rename files intelligently
crawl_depthint 0–2NoHow deep to follow links (only when sniper_mode=false)
forceboolNoBypass cache and re-scrape
curl -X POST https://pixels.osaystudio.com/api/scrape \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/gallery",
    "sniper_mode": true,
    "max_files": 20,
    "min_size_kb": 50,
    "ai_labeling": true
  }'

Response

{
  "success": true,
  "status": "queued",
  "job_id": 1024,
  "message": "Job queued successfully",
  "poll_url": "/api/jobs/1024"
}
GET /api/jobs/{job_id} Poll until status = "completed"

Check the status of any job. Keep polling every few seconds until status is completed or failed.

curl https://pixels.osaystudio.com/api/jobs/1024 \
  -H "X-API-Key: YOUR_API_KEY"

Response (completed)

{
  "success": true,
  "status": "completed",
  "job_id": 1024,
  "assets": {
    "count": 5,
    "items": [
      {
        "id": 501,
        "filename": "sunset_beach_a1b2.jpg",
        "url": "https://example.com/img.jpg",
        "type": "image",
        "size": 1048576,
        "ai_label": "Sunset, Ocean, Horizon",
        "download_url": "https://pixels.osaystudio.com/files/1024/sunset_beach_a1b2.jpg"
      }
    ]
  }
}
Status values: queuedprocessingcompleted or failed. Poll every 2–5 seconds. Most jobs finish in under 30 seconds.
POST /api/generate Sync Images returned immediately — no polling needed

Generate images from a text prompt. Tries providers in cost order: Imagen 4 Fast → DALL-E 3 → Flux 2 Pro. Returns as soon as the first provider succeeds.

FieldTypeRequiredDescription
promptstringYesWhat to generate — be descriptive
stylestringNoprofessional, cinematic, minimalist, cyberpunk (default: professional)
orientationstringNolandscape, portrait, square (default: landscape)
countint 1–4NoNumber of variations (default: 2)
gemini_keystringNoBring your own Gemini key for higher quotas
curl -X POST https://pixels.osaystudio.com/api/generate \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Futuristic cyberpunk street food stall at night",
    "style": "cinematic",
    "orientation": "landscape",
    "count": 2
  }'

Response

{
  "success": true,
  "prompt": "Futuristic cyberpunk street food stall at night",
  "count": 2,
  "provider": "imagen4",          // which provider was used
  "images": [
    {
      "index": 0,
      "title": "Imagen 4 — Variation 1",
      "provider": "imagen4",
      "url": "data:image/png;base64,iVBORw0KGgo..."   // use directly as 
    },
    {
      "index": 1,
      "title": "Imagen 4 — Variation 2",
      "provider": "imagen4",
      "url": "data:image/png;base64,..."
    }
  ]
}
Provider fallback order: Imagen 4 Fast (free, needs GEMINI_API_KEY) → DALL-E 3 (~$0.04/image, needs OPENAI_API_KEY) → Flux 2 Pro (needs WAVESPEED_API_KEY). The first provider that succeeds is used. If none are configured, returns 503.
POST /api/replace/generate Async Queued job — use /api/generate above for most cases

Queued version of generation. Returns a job_id — poll /api/jobs/{id} for results. Useful when you need the job tracked in your dashboard or want Cloudinary/Telegram backup of the output.

curl -X POST https://pixels.osaystudio.com/api/replace/generate \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"description": "Mountain at sunset", "style": "cinematic", "count": 2}'
POST /api/replace/batch Sync

Generate images for multiple prompts in one call. Processes up to 10 descriptions in parallel.

curl -X POST https://pixels.osaystudio.com/api/replace/batch \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "descriptions": [
      "A red apple on a wooden table",
      "A blue car driving in the rain"
    ],
    "style": "photorealistic"
  }'
GET /api/media/list Sync

List all assets in your media library, paginated.

ParamTypeDescription
limitintMax results (default 50, max 200)
offsetintPagination offset
curl "https://pixels.osaystudio.com/api/media/list?limit=20&offset=0" \
  -H "X-API-Key: YOUR_API_KEY"
GET /api/media/search Sync

Search your media library by tag, group, folder, type, color, or text.

ParamTypeDescription
qstringFull-text search
tagstringFilter by tag
groupstringFilter by group name
folder_idintFilter by folder
typestringimage, video, document
colorstringDominant color hex (e.g. #3b82f6)
limitintMax results (default 50)
offsetintPagination offset
curl "https://pixels.osaystudio.com/api/media/search?tag=nature&type=image&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/media/upload Sync Upload a file to your media library

Upload an image or file. Optionally auto-tag with Vision AI.

FieldTypeRequiredDescription
filefileYesMultipart file upload
namestringNoDisplay name (defaults to filename)
groupstringNoGroup/album name
tagsJSON arrayNoInitial tags e.g. ["nature","sky"]
auto_tagboolNoUse Vision AI to auto-generate tags
curl -X POST https://pixels.osaystudio.com/api/media/upload \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@/path/to/photo.jpg" \
  -F "name=My Photo" \
  -F 'tags=["nature","landscape"]' \
  -F "auto_tag=1"

Response

{ "success": true, "media_id": 42, "url": "https://res.cloudinary.com/...", "tags": ["nature","landscape"] }
POST /api/media/{media_id}/optimize Sync

Build a Cloudinary transformation URL for an asset (resize, format convert, quality).

FieldTypeDescription
widthintTarget width in px (default 1200)
qualitystringauto or 1–100 (default auto)
formatstringwebp, jpg, png (default webp)
curl -X POST https://pixels.osaystudio.com/api/media/42/optimize \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"width": 800, "quality": "auto", "format": "webp"}'
POST /api/media/bulk Sync Batch operations on multiple assets

Perform an action on multiple media items at once.

FieldTypeRequiredDescription
idsarrayYesArray of media IDs
actionstringYestrash · restore · purge · move · tag · list
folder_idintNoTarget folder (for move)
tagsarrayNoTags to apply (for tag)
curl -X POST https://pixels.osaystudio.com/api/media/bulk \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids": [1, 2, 3], "action": "tag", "tags": ["approved"]}'
POST /api/media/collections/{col_id}/share Sync

Generate a public share link for a collection. Optionally password-protect it.

curl -X POST https://pixels.osaystudio.com/api/media/collections/5/share \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"public": true, "password": "secret123"}'

Response

{ "success": true, "share_token": "abc123xyz", "share_url": "/gallery/abc123xyz" }

All Media Endpoints

MethodRouteDescription
GET/api/media/listList all assets (paginated)
GET/api/media/searchSearch by tag, group, color, text
GET/api/media/{id}Get single asset
POST/api/media/uploadUpload file
PATCH/api/media/{id}Update metadata
DELETE/api/media/{id}Soft-delete (trash)
PATCH/api/media/{id}/tagsAdd / remove / replace tags
POST/api/media/{id}/optimizeBuild Cloudinary transform URL
POST/api/media/{id}/restoreRestore from trash
DELETE/api/media/{id}/purgePermanently delete
POST/api/media/bulkBulk trash / tag / move / purge
GET/POST/api/media/foldersList or create folders
PATCH/DELETE/api/media/folders/{id}Rename or delete folder
GET/POST/api/media/collectionsList or create collections
GET/api/media/collections/{id}Get collection + items
POST/api/media/collections/{id}/itemsAdd items to collection
POST/api/media/collections/{id}/shareGenerate share link
DELETE/api/media/collections/{id}Delete collection
GET/POST/api/media/stock/listsList or create stock lists
GET/DELETE/api/media/stock/lists/{id}Get or delete stock list
POST/api/media/stock/lists/{id}/itemsAdd items to stock list
POST/api/media/stock/lists/{id}/saveBulk-download stock items to library
DELETE/api/media/stock/items/{id}Remove item from stock list
POST/api/media/mirrorRegister mirror URL for image object
GET/api/media/creditsCredit ledger & totals
GET/api/media/trashList trashed items
GET /api/community/search Sync No auth required

Search the public community image library. Useful for AI agents and public integrations.

ParamTypeDescription
tagstringFilter by tag
verified0|1Only return AI-verified images
limitintMax results (default 20, max 100)
offsetintPagination offset
curl "https://pixels.osaystudio.com/api/community/search?tag=sunset&verified=1&limit=10"
POST /api/community/contribute Sync Earn Pixcoins for each upload

Upload an image to the community library. Earns 2 Pixcoins per accepted upload.

FieldTypeRequiredDescription
filefile*Multipart image upload
image_urlstring*Public image URL (alternative to file upload)
namestringNoDisplay name
tagsJSON arrayNoInitial tags
source_providerstringNoWhere the image came from
curl -X POST https://pixels.osaystudio.com/api/community/contribute \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@/path/to/photo.jpg" \
  -F 'tags=["nature","forest"]'

Response

{
  "success": true,
  "id": 88,
  "url": "https://res.cloudinary.com/...",
  "pixcoins_earned": 2.0,
  "balance": 14.5
}
POST /api/community/{item_id}/tag Sync Earn Pixcoins for tagging

Add or replace tags on a community image. Earns 0.5 Pixcoins per tag set, plus +0.25 bonus if AI verifies the tags match the image.

curl -X POST https://pixels.osaystudio.com/api/community/88/tag \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tags": ["forest", "trees", "green"], "action": "add"}'
GET /api/community/my Sync

Get your own contributions and current Pixcoin balance.

curl "https://pixels.osaystudio.com/api/community/my" \
  -H "X-API-Key: YOUR_API_KEY"

Response

{
  "success": true,
  "balance": 14.5,
  "contributions": [...],
  "total_contributed": 7
}

All Community Endpoints

MethodRouteDescription
GET/api/community/searchPublic image search (no auth)
GET/api/community/leaderboardTop contributors
POST/api/community/contributeUpload image → earn Pixcoins
POST/api/community/{id}/tagTag image → earn Pixcoins
GET/api/community/myYour contributions & balance
GET/api/community/{id}Single item detail
GET/POST/api/community/{id}/claimOwnership claim (removal or royalty)
POST/api/community/lists/{id}/shareShare a stock list
POST/api/community/lists/join/{token}Join a shared list
GET/api/community/lists/{id}/membersList members
POST/DELETE/api/community/subjects/{slug}/followFollow / unfollow subject
GET/api/community/followingYour followed subjects
GET/api/community/portfolio/{code}Public contributor profile
GET/api/community/portfolioYour private portfolio stats
GET/api/community/challengeActive fact-checking challenge
POST/api/community/challenge/vote/{id}Vote in challenge (2× rewards)
GET /api/wiki/subjects Sync No auth required

Browse or search the image wiki. Returns subjects with verified media counts.

ParamTypeDescription
qstringText search
categorystringFilter by category
verified0|1Only verified subjects
sortstringrecent, popular
limit / offsetintPagination
curl "https://pixels.osaystudio.com/api/wiki/subjects?category=wildlife&verified=1&limit=10"
GET /api/wiki/subjects/{slug} Sync

Get full subject detail including all verified media items.

curl "https://pixels.osaystudio.com/api/wiki/subjects/african-elephant" \
  -H "X-API-Key: YOUR_API_KEY"
GET /api/wiki/subjects/{slug}/query Sync Billed — 1 credit per call

Agent-optimized query. Returns filtered, high-confidence verified images for a subject. Costs 1 API credit.

ParamTypeDescription
typestringPhoto type filter (e.g. portrait, landscape)
min_confidencefloatMinimum AI confidence (0.0–1.0)
limitintMax results
curl "https://pixels.osaystudio.com/api/wiki/subjects/african-elephant/query?min_confidence=0.9&limit=5" \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/wiki/subjects Sync Earn 10 Pixcoins

Create a new wiki subject. Earns 10 Pixcoins once admin-reviewed.

FieldTypeRequiredDescription
namestringYesSubject name
categorystringYesCategory (e.g. wildlife, architecture)
descriptionstringNoShort description
featured_image_urlstringNoHero image URL
curl -X POST https://pixels.osaystudio.com/api/wiki/subjects \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "African Elephant", "category": "wildlife", "description": "Largest land animal."}'
POST /api/wiki/subjects/{slug}/contribute Sync Earn 5 Pixcoins

Upload a photo to a wiki subject. Earns 5 Pixcoins after 3 community confirmations.

curl -X POST https://pixels.osaystudio.com/api/wiki/subjects/african-elephant/contribute \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@elephant.jpg" \
  -F "photo_type=portrait" \
  -F "context=Adult male at Amboseli"
GET /api/wiki/verify-queue Sync Earn 0.5 Pixcoins per vote

Get pending items waiting for community verification. Vote to earn Pixcoins.

# Get items to verify
curl "https://pixels.osaystudio.com/api/wiki/verify-queue?limit=5" \
  -H "X-API-Key: YOUR_API_KEY"

# Cast your vote
curl -X POST https://pixels.osaystudio.com/api/wiki/metadata/123/vote \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"vote": "confirm"}'
GET /api/economy/bridge/rate Sync

Get the current Pixcoin → BotForge credit exchange rate.

curl "https://pixels.osaystudio.com/api/economy/bridge/rate" \
  -H "X-API-Key: YOUR_API_KEY"

Response

{ "success": true, "pixcoins_per_credit": 10.0 }
POST /api/economy/bridge/convert Sync Burn Pixcoins for AI credits

Convert Pixcoins into BotForge AI credits. Requires a connected BotForge account.

FieldTypeRequiredDescription
pixcoinsfloatYesAmount to burn (e.g. 50 → 5 credits at 10:1 rate)
curl -X POST https://pixels.osaystudio.com/api/economy/bridge/convert \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pixcoins": 50}'

Response

{ "success": true, "pixcoins_burned": 50, "credits_added": 5.0, "new_balance": 64.5 }
GET /api/economy/bounties Sync

List open photo bounties. Anyone can claim a bounty by submitting a matching community image.

curl "https://pixels.osaystudio.com/api/economy/bounties?status=open" \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/economy/bounties Sync Post a photo request with a Pixcoin reward

Post a bounty requesting specific photos. Budget is escrowed upfront and paid to the first valid claimant.

FieldTypeRequiredDescription
subject_slugstringNoExisting wiki subject slug
subject_namestringNoFree-text subject if no slug
reward_per_photofloatYesPixcoins paid per accepted photo
photos_neededintYesHow many photos you need
descriptionstringNoWhat you're looking for
expires_daysintNoDays until bounty expires (default 30)
curl -X POST https://pixels.osaystudio.com/api/economy/bounties \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject_name": "Snow leopard in the wild",
    "reward_per_photo": 15,
    "photos_needed": 3,
    "description": "High-res, natural habitat, no zoo photos"
  }'
POST /api/economy/bounties/{bounty_id}/claim Sync Earn the bounty reward instantly

Claim a bounty by linking an AI-verified community upload. Reward is paid immediately.

curl -X POST https://pixels.osaystudio.com/api/economy/bounties/7/claim \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"crowdsource_id": 88}'
GET /api/economy/referral Sync

Get your referral code and passive earnings. You earn 10% of every Pixcoin your referrals earn, forever.

curl "https://pixels.osaystudio.com/api/economy/referral" \
  -H "X-API-Key: YOUR_API_KEY"

Response

{
  "success": true,
  "referral_code": "OCEAN-XYZ",
  "referral_url": "https://pixelsocean.com/signup?ref=OCEAN-XYZ",
  "total_referrals": 4,
  "commission_earned": 8.3
}
GET /api/economy/styles Sync

List all AI generation style presets. Premium styles require unlocking with Pixcoins.

curl "https://pixels.osaystudio.com/api/economy/styles" \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/economy/styles/{slug}/unlock Sync

Unlock a premium AI generation style preset using Pixcoins.

curl -X POST https://pixels.osaystudio.com/api/economy/styles/cyberpunk/unlock \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/automation/schedules Sync Set-and-forget recurring scrapes

Schedule a scrape job to run automatically on a daily, weekly, or monthly cadence.

FieldTypeRequiredDescription
urlstringYesPage to scrape
namestringYesSchedule label
schedulestringNodaily · weekly · monthly (default: weekly)
hourintNoUTC hour to run (default: 8)
day_of_weekint 0–6No0=Mon … 6=Sun (weekly only)
max_filesintNoMax assets per run
sniper_modeboolNoSingle-page mode (default true)
ai_labelingboolNoAuto-label with Vision AI
curl -X POST https://pixels.osaystudio.com/api/automation/schedules \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/gallery",
    "name": "Daily Gallery Scrape",
    "schedule": "daily",
    "hour": 6,
    "max_files": 50,
    "sniper_mode": true
  }'

Response

{ "success": true, "schedule_id": 3, "next_run": "2026-04-10T06:00:00Z" }
POST /api/automation/webhooks Sync Get notified when jobs complete

Register a webhook URL to receive a POST payload whenever a job completes. Payloads are HMAC-signed if you provide a secret.

FieldTypeRequiredDescription
urlstringYesHTTPS endpoint to POST to
secretstringNoHMAC-SHA256 signing secret
eventsarrayNoEvent types to subscribe to (default: all)
curl -X POST https://pixels.osaystudio.com/api/automation/webhooks \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://myapp.com/hooks/ocean",
    "secret": "my-signing-secret"
  }'
Verify webhook authenticity: check the X-Ocean-Signature header against HMAC-SHA256(secret, body).
POST /api/automation/webhooks/test Sync

Send a test payload to a webhook URL to verify it's reachable before registering.

curl -X POST https://pixels.osaystudio.com/api/automation/webhooks/test \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://myapp.com/hooks/ocean"}'
POST /api/automation/export/wordpress Sync

Push media items directly to a WordPress site via the REST API.

FieldTypeRequiredDescription
wp_urlstringYesWordPress site URL
wp_userstringYesWordPress username
wp_passwordstringYesApplication password
media_idsarrayYesMedia library IDs to push
curl -X POST https://pixels.osaystudio.com/api/automation/export/wordpress \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"wp_url": "https://myblog.com", "wp_user": "admin", "wp_password": "xxxx xxxx", "media_ids": [1,2,3]}'

All Automation Endpoints

MethodRouteDescription
GET/api/automation/schedulesList recurring schedules
POST/api/automation/schedulesCreate schedule
DELETE/api/automation/schedules/{id}Delete schedule
POST/api/automation/schedules/{id}/toggleEnable / disable
GET/api/automation/webhooksList webhooks
POST/api/automation/webhooksRegister webhook
DELETE/api/automation/webhooks/{id}Delete webhook
POST/api/automation/webhooks/testTest webhook delivery
POST/api/automation/export/wordpressPush to WordPress
POST/api/automation/export/shopifyPush to Shopify
POST /api/platform/sub-keys Sync Create restricted API keys for teammates or apps

Sub-keys are scoped, credit-limited API keys that inherit your account but can't exceed the limits you set. Perfect for giving a teammate scraping access without exposing your master key.

FieldTypeRequiredDescription
labelstringNoFriendly name for this key
credit_limitintNoMax requests this key can make (default 50)
scopesstringNoComma-separated: scrape, generate, search, media
expires_daysintNoDays until key expires (omit for no expiry)
curl -X POST https://pixels.osaystudio.com/api/platform/sub-keys \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "CI Pipeline Key",
    "credit_limit": 200,
    "scopes": "scrape,search",
    "expires_days": 90
  }'

Response

{
  "success": true,
  "sub_key": "sk_abc123...",
  "label": "CI Pipeline Key",
  "credit_limit": 200,
  "scopes": "scrape,search",
  "expires_at": "2026-07-08T00:00:00Z"
}
Sub-keys start with sk_. Use them exactly like your master key — pass in X-API-Key. Revoke anytime with POST /api/platform/sub-keys/{key}/revoke.
GET /api/platform/sub-keys Sync

List all your sub-keys with usage stats.

curl "https://pixels.osaystudio.com/api/platform/sub-keys" \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/platform/sub-keys/{key}/revoke Sync

Immediately revoke a sub-key. Any in-flight requests using it will be rejected.

curl -X POST https://pixels.osaystudio.com/api/platform/sub-keys/sk_abc123.../revoke \
  -H "X-API-Key: YOUR_API_KEY"
POST /api/platform/bulk-mirror Async Earn Pixcoins for verified mirrors

Submit a CSV of image URLs for bulk mirror verification. Each URL that matches a known image object earns Pixcoins. Processing is async — poll for results.

FieldTypeRequiredDescription
fileCSV file*Multipart CSV upload (one URL per line/cell)
urlsarray*JSON array of URLs (alternative to file)
curl -X POST https://pixels.osaystudio.com/api/platform/bulk-mirror \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@urls.csv"

Response

{ "success": true, "job_id": "bm_xyz", "total_urls": 150, "status": "pending" }
GET /api/platform/bulk-mirror/{job_id} Sync

Poll a bulk mirror job for results and Pixcoin earnings.

curl "https://pixels.osaystudio.com/api/platform/bulk-mirror/bm_xyz" \
  -H "X-API-Key: YOUR_API_KEY"

Response (completed)

{
  "success": true,
  "status": "completed",
  "total_urls": 150,
  "matched": 42,
  "unmatched": 108,
  "pixcoins_earned": 21.0
}

How to Earn Pixcoins

Pixcoins are the platform's reward currency. Earn them by contributing to the community library, then spend them on AI credits or unlock premium features.

Upload Images

Contribute photos to the community library.

+2 ₱

per accepted upload via POST /api/community/contribute

Tag Images

Add descriptive tags to community images.

+0.5 ₱

per tag set. Bonus +0.25 ₱ if AI verifies your tags match the image.

Wiki Contributions

Create subjects or upload photos to the image wiki.

+5–10 ₱

5 ₱ per wiki photo upload · 10 ₱ per new subject created

Verify & Earn

Vote on pending wiki metadata in the verify queue.

+0.5 ₱

per vote via POST /api/wiki/metadata/{id}/vote

Bulk Mirror

Submit CSVs of image URLs that match known images.

+0.5 ₱

per verified match via POST /api/platform/bulk-mirror

Claim Bounties

Fulfill photo requests posted by other users.

Variable

Bounty poster sets the reward. Claim via POST /api/economy/bounties/{id}/claim

Refer Friends

Share your referral link. Earn passively forever.

10%

of every Pixcoin your referrals earn, automatically. Get your link from GET /api/economy/referral

Challenge Events

Participate in active fact-checking challenges.

2× bonus

All rewards doubled during active challenges. Check GET /api/community/challenge

Quick-Start: Earn Your First Pixcoins

Follow these steps to go from zero to earning in under 5 minutes.

All examples below use your API key. Replace YOUR_API_KEY if running manually.

Step 1 — Upload a photo (earn 2 ₱)

curl -X POST https://pixels.osaystudio.com/api/community/contribute \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@my_photo.jpg" \
  -F 'tags=["nature","landscape"]'

# Response: { "success": true, "id": 88, "pixcoins_earned": 2.0, "balance": 2.0 }

Step 2 — Tag an existing image (earn 0.5–0.75 ₱)

# Find untagged community images
curl "https://pixels.osaystudio.com/api/community/search?verified=0&limit=5" \
  -H "X-API-Key: YOUR_API_KEY"

# Tag one of them (AI will verify your tags and award bonus if correct)
curl -X POST https://pixels.osaystudio.com/api/community/88/tag \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tags": ["mountain", "snow", "winter"], "action": "add"}'

# Response: { "success": true, "pixcoins_earned": 0.75, "verified": true, "balance": 2.75 }

Step 3 — Verify wiki metadata (earn 0.5 ₱ per vote)

# Get items waiting for verification
curl "https://pixels.osaystudio.com/api/wiki/verify-queue?limit=3" \
  -H "X-API-Key: YOUR_API_KEY"

# Vote on one (confirm or reject)
curl -X POST https://pixels.osaystudio.com/api/wiki/metadata/123/vote \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"vote": "confirm"}'

Step 4 — Check your balance

curl "https://pixels.osaystudio.com/api/community/my" \
  -H "X-API-Key: YOUR_API_KEY"

# Response: { "success": true, "balance": 3.25, "total_contributed": 1, ... }

Step 5 — Convert Pixcoins to AI credits

# Check the exchange rate first
curl "https://pixels.osaystudio.com/api/economy/bridge/rate" \
  -H "X-API-Key: YOUR_API_KEY"
# { "pixcoins_per_credit": 10.0 }

# Burn 50 Pixcoins → get 5 AI credits
curl -X POST https://pixels.osaystudio.com/api/economy/bridge/convert \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pixcoins": 50}'

Reward Rate Reference

ActionRewardEndpointNotes
Community upload2.0 ₱POST /api/community/contributeAwarded immediately
Tagging0.5 ₱POST /api/community/{id}/tagBase rate
AI-verified tag bonus+0.25 ₱Same as aboveWhen Vision AI confirms tags
Wiki photo upload5.0 ₱POST /api/wiki/subjects/{slug}/contributeAfter 3 community confirmations
Wiki subject creation10.0 ₱POST /api/wiki/subjectsAfter admin review
Wiki metadata vote0.5 ₱POST /api/wiki/metadata/{id}/voteRate-limited per item
Bulk mirror match0.5 ₱POST /api/platform/bulk-mirrorPer verified URL match
Bounty claimVariablePOST /api/economy/bounties/{id}/claimSet by bounty poster
Referral commission10% of referee earningsGET /api/economy/referralPassive, ongoing
Challenge event2× multiplierPOST /api/community/challenge/vote/{id}During active challenges only
Royalty (per use)0.1–10 ₱POST /api/community/{id}/claimRequires approved royalty claim
All rates are configurable by admins and may change during promotional events. The pixcoin_multiplier flag applies a global multiplier to all rewards.
POST /api/pipeline Sync Chain any actions into one request

The Pipeline API lets you compose multiple operations into a single request. Steps run sequentially — each step can reference the output of any previous step using $step_name.field syntax. One API call can scrape a site, analyze the images with vision AI, and find replacements — all chained together.

FieldTypeRequiredDescription
stepsarrayYesOrdered list of step objects
steps[].namestringYesUnique name — used to reference this step's output
steps[].actionstringYesscrape · search · generate · ocr · analyze · replace · filter
steps[].paramsobjectAction parameters. Values can be $step.field references.
stop_on_errorbooleanAbort on first failure (default: true)

Example — Scrape → Analyze → Find Replacements

curl -X POST https://pixels.osaystudio.com/api/pipeline \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "steps": [
      {
        "name": "scrape",
        "action": "scrape",
        "params": { "url": "https://example.com", "max_files": 5, "sniper_mode": true }
      },
      {
        "name": "vision",
        "action": "analyze",
        "params": { "urls": "$scrape.urls", "max_images": 3 }
      },
      {
        "name": "replacements",
        "action": "search",
        "params": { "query": "$vision.summary", "limit": 6 }
      }
    ]
  }'

Response

{
  "success": true,
  "pipeline": {
    "steps_total": 3,
    "steps_ok": 3,
    "steps_failed": 0,
    "elapsed": 4.21,
    "steps": [
      { "name": "scrape",       "action": "scrape",   "status": "ok", "elapsed": 2.1,  "output": { "count": 5, "urls": [...] } },
      { "name": "vision",       "action": "analyze",  "status": "ok", "elapsed": 1.8,  "output": { "summary": "Mountain Sky Nature", "top_labels": [...] } },
      { "name": "replacements", "action": "search",   "status": "ok", "elapsed": 0.31, "output": { "count": 6, "images": [...] } }
    ],
    "result": { "count": 6, "images": [...] }
  }
}
GET /api/pipeline/actions Sync

Returns the full schema for all available pipeline actions — params, types, defaults, and output fields.

curl "https://pixels.osaystudio.com/api/pipeline/actions" \
  -H "X-API-Key: YOUR_API_KEY"
GET /download/{job_id}

Download all assets from a completed job as a single ZIP archive.

curl -O -J "https://pixels.osaystudio.com/download/1024"
# Saves as: job_1024.zip
GET /files/{job_id}/{filename}

Direct URL to a single file. Use the download_url field from the job response.

curl -O "https://pixels.osaystudio.com/files/1024/sunset_beach_a1b2.jpg"
GET POST /api/watermark Apply a watermark to any image

Overlay a watermark image on top of a source image. Supports custom position and opacity. Returns the URL of the watermarked result.

FieldTypeRequiredDescription
imagestringYesURL of the source image
watermarkstringYesURL of the watermark image (PNG with transparency recommended)
positionstringNoPlacement: center | top-left | top-right | bottom-left | bottom-right (default: center)
opacityint 0–100NoWatermark opacity (default: 30)
curl "https://pixels.osaystudio.com/api/watermark?image=https%3A%2F%2Fexample.com%2Fphoto.jpg&watermark=https%3A%2F%2Fexample.com%2Flogo.png&position=bottom-right&opacity=50" \
  -H "X-API-Key: YOUR_API_KEY"

Response

{
  "success":  true,
  "url":      "https://cdn.example.com/watermarked_photo.jpg",
  "position": "bottom-right",
  "opacity":  50
}
POST /api/replaceflow Sync De-watermarking via Google Reverse Image Discovery

The ReplaceFlow pipeline is built for news aggregators. Give it any article URL (e.g. a blog that watermarks their images) and it will:

  1. Scrape the article and extract the headline and watermarked featured image.
  2. Submit the watermarked image to Google Reverse Image Search (via SerpApi) to find the original clean version across the web.
  3. Fall back to a keyword search using the headline if reverse search yields nothing.
  4. Compute a pHash similarity score between the watermarked image and each candidate — phash_match: true means it's the same photo.
FieldTypeRequiredDescription
article_urlstringYesURL of the article containing the watermarked image
max_resultsintNoMax clean alternatives to return (default 4, max 10)
phashboolNoCompute perceptual hash similarity (default true). Set false for faster response.
curl -X POST https://pixels.osaystudio.com/api/replaceflow \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "article_url": "https://example-blog.com/some-news-post",
    "max_results": 4,
    "phash": true
  }'

Response

{
  "success": true,
  "headline": "Raila Odinga Meets AU Commission in Addis Ababa",
  "source_domain": "nyakundi.com",
  "watermarked_url": "https://nyakundi.com/wp-content/uploads/raila-watermarked.jpg",
  "phash_enabled": true,
  "count": 5,
  "results": [
    {
      "type": "source_lead",
      "url": "https://nyakundi.com/wp-content/uploads/raila-watermarked.jpg",
      "is_watermarked": true,
      "domain": "nyakundi.com",
      "headline": "Raila Odinga Meets AU Commission in Addis Ababa",
      "phash": "a3f2c1d4e5b60718"
    },
    {
      "type": "clean_discovery",
      "url": "https://nation.africa/resource/blob/raila-au-clean.jpg",
      "is_watermarked": false,
      "domain": "nation.africa",
      "source": "google_reverse_image",
      "quality_score": 94,
      "width": 1920,
      "height": 1080,
      "phash": "a3f2c1d4e5b60718",
      "phash_distance": 0,
      "phash_match": true
    },
    {
      "type": "clean_discovery",
      "url": "https://standardmedia.co.ke/images/raila-addis.jpg",
      "is_watermarked": false,
      "domain": "standardmedia.co.ke",
      "quality_score": 88,
      "phash_distance": 4,
      "phash_match": true
    }
  ]
}
phash_distance is the Hamming distance between the watermarked image and the candidate (0 = pixel-identical, ≤10 = same photo, >10 = different image). Requires SERPAPI_API_KEY in your environment. Without it, the endpoint falls back to stock image search using the headline.
POST /api/replaceflow/demo Sync No API key required · 5 requests/hour per IP

Try ReplaceFlow without signing up. Rate-limited to 5 requests per hour per IP. Same pipeline as the authenticated endpoint — pHash comparison included.

curl -X POST https://pixels.osaystudio.com/api/replaceflow/demo \
  -H "Content-Type: application/json" \
  -d '{"article_url": "https://example-blog.com/some-news-post"}'
Coming Soon Live Editor API

The Live Editor API will let you apply real-time image edits — watermarks, text overlays, crops, filters, and more — directly from your code, with a live preview interface.

Layer-based editing

Stack multiple watermarks, text, and shapes on a single image with full z-index control.

Live preview

See changes in real time before committing — no round-trips needed.

Text overlays

Custom fonts, colors, sizes, and rotation. Perfect for dynamic captions and branding.

Batch processing

Apply the same edit template to hundreds of images in a single API call.

Get notified when the Live Editor API launches — watch the dashboard for announcements.

Status endpoint (available now)

curl "https://pixels.osaystudio.com/api/live-editor/status" \
  -H "X-API-Key: YOUR_API_KEY"

# Response:
{
  "success":   true,
  "available": false,
  "message":   "Live Editor API is not yet available. Check back soon.",
  "features":  ["Real-time image editing", "Layer-based watermark placement", ...]
}

Error Reference

All errors follow the same shape. Check error for a human-readable message.

{ "success": false, "error": "URL required" }
HTTP StatusMeaningCommon cause
400Bad RequestMissing required field (e.g. url)
401UnauthorizedMissing or invalid API key
403ForbiddenAccount inactive or suspended
429Too Many RequestsDaily or burst rate limit exceeded
500Server ErrorSomething went wrong on our end — try again
Hit a 429? Your daily limit resets at midnight UTC. Check your usage on the dashboard.