API REFERENCE
Everything you need to scrape, generate, and search — from any language or tool.
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": "..." }
https://pixels.osaystudio.com
Start a scraping job. Choose Sniper mode (current page only, fast) or Crawl mode (follows links, deeper).
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | The page to scrape |
| sniper_mode | bool | No | true = current page only (default). false = follow links |
| max_files | int | No | Max assets to download (default 100) |
| min_size_kb | int | No | Skip files smaller than this (filters icons/thumbnails) |
| keyword_filter | string | No | Only grab URLs containing this word |
| download_videos | bool | No | Include .mp4, .mov, etc. |
| download_docs | bool | No | Include .pdf, .zip, etc. |
| ai_labeling | bool | No | Use Vision AI to rename files intelligently |
| crawl_depth | int 0–2 | No | How deep to follow links (only when sniper_mode=false) |
| force | bool | No | Bypass 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"
}
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"
}
]
}
}
queued → processing → completed or failed.
Poll every 2–5 seconds. Most jobs finish in under 30 seconds.
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.
| Field | Type | Required | Description |
|---|---|---|---|
| prompt | string | Yes | What to generate — be descriptive |
| style | string | No | professional, cinematic, minimalist, cyberpunk (default: professional) |
| orientation | string | No | landscape, portrait, square (default: landscape) |
| count | int 1–4 | No | Number of variations (default: 2) |
| gemini_key | string | No | Bring 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,..."
}
]
}
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.
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}'
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"
}'
Search across Unsplash, Pexels, Pixabay, and the Ocean library simultaneously. Also supports reverse image search — upload an image and we'll find visually similar ones.
| Field | Type | Required | Description |
|---|---|---|---|
| query | string | * | Text search term. Required unless using image_data. |
| image_data | string | * | Base64-encoded image for reverse search. AI extracts keywords automatically. |
| limit | int | No | Max results (default 20) |
| orientation | string | No | all, landscape, portrait, square |
curl -X POST https://pixels.osaystudio.com/api/images/search \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "mountain sunset",
"limit": 10,
"orientation": "landscape"
}'
Response
{
"success": true,
"data": {
"query": "mountain sunset",
"total_found": 40,
"images": [
{
"url": "https://images.unsplash.com/...",
"title": "Golden Hour Peak",
"width": 1920,
"height": 1080,
"source_type": "unsplash",
"quality_score": 95
}
]
}
}
Get direct deep-links to external search engines for a query. Useful for building search UIs.
curl "https://pixels.osaystudio.com/api/search-links?query=mountain+sunset" \
-H "X-API-Key: YOUR_API_KEY"
Run OCR on an image. Uses Google Vision AI with automatic fallback to OCR.space. Accepts base64 JSON or a multipart file upload.
| Field | Type | Required | Description |
|---|---|---|---|
| image_data | string | * | Base64-encoded image (JSON body). Use this or image_file. |
| image_file | file | * | Image file upload (multipart/form-data). Use this or image_data. |
curl -X POST https://pixels.osaystudio.com/api/ocr \
-H "X-API-Key: YOUR_API_KEY" \
-F "image_file=@/path/to/image.jpg"
Response
{
"success": true,
"text": "Invoice #1042\nTotal: $250.00\nDue: 2026-05-01",
"labels": ["Document", "Receipt", "Text"],
"confidence": 0.98,
"engine": "google_vision" // or "ocr_space"
}
Pass any blog post or webpage URL and get back its featured image instantly.
Uses the Sniper pipeline — fetches the page once and scores every image candidate.
Priority: og:image → twitter:image → link[rel=image_src] → JSON-LD → large <img> tags.
| Param | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Full URL of the blog post or webpage |
| all | bool / 0|1 | No | Return all candidates ranked by score (default: false) |
| min_score | int | No | Filter out candidates below this score (0–100). Useful to skip low-confidence results. |
100 = OG/Twitter meta tag ·
95 = link[rel=image_src] ·
90 = JSON-LD / Next.js data ·
50–85 = <img> tag (boosted for hero/featured classes or large width) ·
35 = regex fallback
curl "https://pixels.osaystudio.com/api/featured-image?url=https://yourblog.com/my-post" \
-H "X-API-Key: YOUR_API_KEY"
Response (default)
{
"success": true,
"url": "https://cdn.yourblog.com/posts/my-post-hero.jpg",
"score": 100,
"source": "og_meta",
"page": "https://yourblog.com/my-post"
}
Response (all=true)
{
"success": true,
"url": "https://cdn.yourblog.com/posts/my-post-hero.jpg",
"score": 100,
"source": "og_meta",
"page": "https://yourblog.com/my-post",
"all": [
{ "url": "https://cdn.yourblog.com/posts/my-post-hero.jpg", "score": 100, "source": "og_meta" },
{ "url": "https://cdn.yourblog.com/posts/inline-1.jpg", "score": 75, "source": "img_tag" },
{ "url": "https://cdn.yourblog.com/posts/inline-2.webp", "score": 50, "source": "img_tag" }
]
}
| Source value | Meaning |
|---|---|
| og_meta | og:image or og:image:secure_url meta tag |
| twitter_meta | twitter:image meta tag |
| link_image_src | <link rel="image_src"> |
| next_data | Image URL found inside __NEXT_DATA__ JSON (Next.js) |
| json_ld | Image URL found in application/ld+json structured data |
| srcset | Largest URL from an <img srcset> attribute |
| img_tag | Standard <img src> (score boosted for hero/featured/large) |
| regex | Raw regex sweep — lowest confidence fallback |
List all assets in your media library, paginated.
| Param | Type | Description |
|---|---|---|
| limit | int | Max results (default 50, max 200) |
| offset | int | Pagination offset |
curl "https://pixels.osaystudio.com/api/media/list?limit=20&offset=0" \
-H "X-API-Key: YOUR_API_KEY"
Search your media library by tag, group, folder, type, color, or text.
| Param | Type | Description |
|---|---|---|
| q | string | Full-text search |
| tag | string | Filter by tag |
| group | string | Filter by group name |
| folder_id | int | Filter by folder |
| type | string | image, video, document |
| color | string | Dominant color hex (e.g. #3b82f6) |
| limit | int | Max results (default 50) |
| offset | int | Pagination offset |
curl "https://pixels.osaystudio.com/api/media/search?tag=nature&type=image&limit=10" \
-H "X-API-Key: YOUR_API_KEY"
Upload an image or file. Optionally auto-tag with Vision AI.
| Field | Type | Required | Description |
|---|---|---|---|
| file | file | Yes | Multipart file upload |
| name | string | No | Display name (defaults to filename) |
| group | string | No | Group/album name |
| tags | JSON array | No | Initial tags e.g. ["nature","sky"] |
| auto_tag | bool | No | Use 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"] }Build a Cloudinary transformation URL for an asset (resize, format convert, quality).
| Field | Type | Description |
|---|---|---|
| width | int | Target width in px (default 1200) |
| quality | string | auto or 1–100 (default auto) |
| format | string | webp, 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"}'
Perform an action on multiple media items at once.
| Field | Type | Required | Description |
|---|---|---|---|
| ids | array | Yes | Array of media IDs |
| action | string | Yes | trash · restore · purge · move · tag · list |
| folder_id | int | No | Target folder (for move) |
| tags | array | No | Tags 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"]}'
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
| Method | Route | Description |
|---|---|---|
| GET | /api/media/list | List all assets (paginated) |
| GET | /api/media/search | Search by tag, group, color, text |
| GET | /api/media/{id} | Get single asset |
| POST | /api/media/upload | Upload file |
| PATCH | /api/media/{id} | Update metadata |
| DELETE | /api/media/{id} | Soft-delete (trash) |
| PATCH | /api/media/{id}/tags | Add / remove / replace tags |
| POST | /api/media/{id}/optimize | Build Cloudinary transform URL |
| POST | /api/media/{id}/restore | Restore from trash |
| DELETE | /api/media/{id}/purge | Permanently delete |
| POST | /api/media/bulk | Bulk trash / tag / move / purge |
| GET/POST | /api/media/folders | List or create folders |
| PATCH/DELETE | /api/media/folders/{id} | Rename or delete folder |
| GET/POST | /api/media/collections | List or create collections |
| GET | /api/media/collections/{id} | Get collection + items |
| POST | /api/media/collections/{id}/items | Add items to collection |
| POST | /api/media/collections/{id}/share | Generate share link |
| DELETE | /api/media/collections/{id} | Delete collection |
| GET/POST | /api/media/stock/lists | List or create stock lists |
| GET/DELETE | /api/media/stock/lists/{id} | Get or delete stock list |
| POST | /api/media/stock/lists/{id}/items | Add items to stock list |
| POST | /api/media/stock/lists/{id}/save | Bulk-download stock items to library |
| DELETE | /api/media/stock/items/{id} | Remove item from stock list |
| POST | /api/media/mirror | Register mirror URL for image object |
| GET | /api/media/credits | Credit ledger & totals |
| GET | /api/media/trash | List trashed items |
Search the public community image library. Useful for AI agents and public integrations.
| Param | Type | Description |
|---|---|---|
| tag | string | Filter by tag |
| verified | 0|1 | Only return AI-verified images |
| limit | int | Max results (default 20, max 100) |
| offset | int | Pagination offset |
curl "https://pixels.osaystudio.com/api/community/search?tag=sunset&verified=1&limit=10"
Upload an image to the community library. Earns 2 Pixcoins per accepted upload.
| Field | Type | Required | Description |
|---|---|---|---|
| file | file | * | Multipart image upload |
| image_url | string | * | Public image URL (alternative to file upload) |
| name | string | No | Display name |
| tags | JSON array | No | Initial tags |
| source_provider | string | No | Where 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
}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 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
| Method | Route | Description |
|---|---|---|
| GET | /api/community/search | Public image search (no auth) |
| GET | /api/community/leaderboard | Top contributors |
| POST | /api/community/contribute | Upload image → earn Pixcoins |
| POST | /api/community/{id}/tag | Tag image → earn Pixcoins |
| GET | /api/community/my | Your contributions & balance |
| GET | /api/community/{id} | Single item detail |
| GET/POST | /api/community/{id}/claim | Ownership claim (removal or royalty) |
| POST | /api/community/lists/{id}/share | Share a stock list |
| POST | /api/community/lists/join/{token} | Join a shared list |
| GET | /api/community/lists/{id}/members | List members |
| POST/DELETE | /api/community/subjects/{slug}/follow | Follow / unfollow subject |
| GET | /api/community/following | Your followed subjects |
| GET | /api/community/portfolio/{code} | Public contributor profile |
| GET | /api/community/portfolio | Your private portfolio stats |
| GET | /api/community/challenge | Active fact-checking challenge |
| POST | /api/community/challenge/vote/{id} | Vote in challenge (2× rewards) |
Browse or search the image wiki. Returns subjects with verified media counts.
| Param | Type | Description |
|---|---|---|
| q | string | Text search |
| category | string | Filter by category |
| verified | 0|1 | Only verified subjects |
| sort | string | recent, popular |
| limit / offset | int | Pagination |
curl "https://pixels.osaystudio.com/api/wiki/subjects?category=wildlife&verified=1&limit=10"
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"
Agent-optimized query. Returns filtered, high-confidence verified images for a subject. Costs 1 API credit.
| Param | Type | Description |
|---|---|---|
| type | string | Photo type filter (e.g. portrait, landscape) |
| min_confidence | float | Minimum AI confidence (0.0–1.0) |
| limit | int | Max 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"
Create a new wiki subject. Earns 10 Pixcoins once admin-reviewed.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Subject name |
| category | string | Yes | Category (e.g. wildlife, architecture) |
| description | string | No | Short description |
| featured_image_url | string | No | Hero 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."}'
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 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 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 }Convert Pixcoins into BotForge AI credits. Requires a connected BotForge account.
| Field | Type | Required | Description |
|---|---|---|---|
| pixcoins | float | Yes | Amount 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 }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 a bounty requesting specific photos. Budget is escrowed upfront and paid to the first valid claimant.
| Field | Type | Required | Description |
|---|---|---|---|
| subject_slug | string | No | Existing wiki subject slug |
| subject_name | string | No | Free-text subject if no slug |
| reward_per_photo | float | Yes | Pixcoins paid per accepted photo |
| photos_needed | int | Yes | How many photos you need |
| description | string | No | What you're looking for |
| expires_days | int | No | Days 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"
}'
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 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
}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"
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"
Schedule a scrape job to run automatically on a daily, weekly, or monthly cadence.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Page to scrape |
| name | string | Yes | Schedule label |
| schedule | string | No | daily · weekly · monthly (default: weekly) |
| hour | int | No | UTC hour to run (default: 8) |
| day_of_week | int 0–6 | No | 0=Mon … 6=Sun (weekly only) |
| max_files | int | No | Max assets per run |
| sniper_mode | bool | No | Single-page mode (default true) |
| ai_labeling | bool | No | Auto-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" }Register a webhook URL to receive a POST payload whenever a job completes. Payloads are HMAC-signed if you provide a secret.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | HTTPS endpoint to POST to |
| secret | string | No | HMAC-SHA256 signing secret |
| events | array | No | Event 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"
}'
X-Ocean-Signature header against HMAC-SHA256(secret, body).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"}'
Push media items directly to a WordPress site via the REST API.
| Field | Type | Required | Description |
|---|---|---|---|
| wp_url | string | Yes | WordPress site URL |
| wp_user | string | Yes | WordPress username |
| wp_password | string | Yes | Application password |
| media_ids | array | Yes | Media 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
| Method | Route | Description |
|---|---|---|
| GET | /api/automation/schedules | List recurring schedules |
| POST | /api/automation/schedules | Create schedule |
| DELETE | /api/automation/schedules/{id} | Delete schedule |
| POST | /api/automation/schedules/{id}/toggle | Enable / disable |
| GET | /api/automation/webhooks | List webhooks |
| POST | /api/automation/webhooks | Register webhook |
| DELETE | /api/automation/webhooks/{id} | Delete webhook |
| POST | /api/automation/webhooks/test | Test webhook delivery |
| POST | /api/automation/export/wordpress | Push to WordPress |
| POST | /api/automation/export/shopify | Push to Shopify |
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.
| Field | Type | Required | Description |
|---|---|---|---|
| label | string | No | Friendly name for this key |
| credit_limit | int | No | Max requests this key can make (default 50) |
| scopes | string | No | Comma-separated: scrape, generate, search, media |
| expires_days | int | No | Days 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"
}sk_. Use them exactly like your master key — pass in X-API-Key. Revoke anytime with POST /api/platform/sub-keys/{key}/revoke.List all your sub-keys with usage stats.
curl "https://pixels.osaystudio.com/api/platform/sub-keys" \
-H "X-API-Key: YOUR_API_KEY"
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"
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.
| Field | Type | Required | Description |
|---|---|---|---|
| file | CSV file | * | Multipart CSV upload (one URL per line/cell) |
| urls | array | * | 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" }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.
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
| Action | Reward | Endpoint | Notes |
|---|---|---|---|
| Community upload | 2.0 ₱ | POST /api/community/contribute | Awarded immediately |
| Tagging | 0.5 ₱ | POST /api/community/{id}/tag | Base rate |
| AI-verified tag bonus | +0.25 ₱ | Same as above | When Vision AI confirms tags |
| Wiki photo upload | 5.0 ₱ | POST /api/wiki/subjects/{slug}/contribute | After 3 community confirmations |
| Wiki subject creation | 10.0 ₱ | POST /api/wiki/subjects | After admin review |
| Wiki metadata vote | 0.5 ₱ | POST /api/wiki/metadata/{id}/vote | Rate-limited per item |
| Bulk mirror match | 0.5 ₱ | POST /api/platform/bulk-mirror | Per verified URL match |
| Bounty claim | Variable | POST /api/economy/bounties/{id}/claim | Set by bounty poster |
| Referral commission | 10% of referee earnings | GET /api/economy/referral | Passive, ongoing |
| Challenge event | 2× multiplier | POST /api/community/challenge/vote/{id} | During active challenges only |
| Royalty (per use) | 0.1–10 ₱ | POST /api/community/{id}/claim | Requires approved royalty claim |
pixcoin_multiplier flag applies a global multiplier to all rewards.
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.
| Field | Type | Required | Description |
|---|---|---|---|
| steps | array | Yes | Ordered list of step objects |
| steps[].name | string | Yes | Unique name — used to reference this step's output |
| steps[].action | string | Yes | scrape · search · generate · ocr · analyze · replace · filter |
| steps[].params | object | Action parameters. Values can be $step.field references. | |
| stop_on_error | boolean | Abort 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": [...] }
}
}
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"
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
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"
Overlay a watermark image on top of a source image. Supports custom position and opacity. Returns the URL of the watermarked result.
| Field | Type | Required | Description |
|---|---|---|---|
| image | string | Yes | URL of the source image |
| watermark | string | Yes | URL of the watermark image (PNG with transparency recommended) |
| position | string | No | Placement: center | top-left | top-right | bottom-left | bottom-right (default: center) |
| opacity | int 0–100 | No | Watermark 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
}
The ReplaceFlow pipeline is built for news aggregators. Give it any article URL (e.g. a blog that watermarks their images) and it will:
- Scrape the article and extract the headline and watermarked featured image.
- Submit the watermarked image to Google Reverse Image Search (via SerpApi) to find the original clean version across the web.
- Fall back to a keyword search using the headline if reverse search yields nothing.
- Compute a pHash similarity score between the watermarked image and each candidate —
phash_match: truemeans it's the same photo.
| Field | Type | Required | Description |
|---|---|---|---|
| article_url | string | Yes | URL of the article containing the watermarked image |
| max_results | int | No | Max clean alternatives to return (default 4, max 10) |
| phash | bool | No | Compute 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
}
]
}
SERPAPI_API_KEY in your environment. Without it, the endpoint falls back to stock image search using the headline.
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"}'
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 Status | Meaning | Common cause |
|---|---|---|
| 400 | Bad Request | Missing required field (e.g. url) |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | Account inactive or suspended |
| 429 | Too Many Requests | Daily or burst rate limit exceeded |
| 500 | Server Error | Something went wrong on our end — try again |