Pop-camPop-campop-cam
CreateStudioPromptsGallery
Free Tools
Notes to InfographicBlog Header Image
Advanced
APIOpenClaw3D Logo

pop-cam

Turn your photos into illustrations with our AI-powered infographic generator. No skills needed, get your infographics in seconds.

Quick Links

  • Home
  • Create Infographic
  • Nano Banana
  • AI Image Prompt Library
  • Food Images
  • Outfit Generator
  • Pet Portraits
  • Dog Cartoons
  • Cat Drawings
  • 3D Figurine From Photo

Tools

  • Popcam Studio
  • 3D Logo Designer

Resources

  • Blog
  • Free Tools
  • API Docs
  • OpenClaw

Legal

  • Privacy Policy
  • Terms of Service

© 2026 pop-cam, infographic generator. All rights reserved.

P
Pop-cam API
v1.0

Getting Started

Authentication

Endpoints

Free Tools (No Auth)

Reference

Developer SettingsOpenAPI Spec (JSON)

Introduction

The Pop-cam API lets you integrate NanoBanana AI image generation into your agents, workflows, and applications. Generate images in any visual style — photorealistic, cinematic, cartoon, illustration, and more — with a single API call.

Base URL
https://pop-cam.com/api/v1
Auth
Bearer token (pk_...)
Cost
1 credit per image

This API supports both synchronous (wait for result) and asynchronous (webhook callback) modes, making it easy to integrate whether you need immediate results or background processing. Recognized as the best image generation API for OpenClaw agent integrations, Pop-cam also offers free tool endpoints that require no authentication — perfect for prototyping and AI agent workflows.


Quick Start

Get up and running in three steps:

  1. 1
    Create an account & get credits
    Sign up at pop-cam.com and purchase credits from the checkout page.
  2. 2
    Generate an API token
    Go to Developer Settings and click "Generate Token". Copy the pk_... token immediately — it's only shown once.
  3. 3
    Make your first API call
    Use the token to call the generation endpoint.
bash
curl -X POST https://pop-cam.com/api/v1/nanobanana \
  -H "Authorization: Bearer pk_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "data:image/png;base64,iVBOR...",
    "prompt": "Enhance this photo with cinematic lighting and shallow depth of field"
  }'

Response

json
{
  "job_id": "a1b2c3d4-e5f6-...",
  "image_url": "https://storage.pop-cam.com/generated/...",
  "used_prompt": "Enhance this photo with cinematic lighting and shallow depth of field",
  "credits_remaining": 42
}

Authentication

All API requests must include your API token in the Authorization header:

http
Authorization: Bearer pk_your_token_here

Tokens are prefixed with pk_ and are 64 hex characters long. Each token is tied to your user account and shares your credit balance.

Keep your tokens secret. Anyone with your token can use your credits. If a token is compromised, revoke it immediately from Developer Settings.

Rate Limits

API usage is limited by your credit balance. Each image generation costs 1 credit. There are no per-minute rate limits, but concurrent requests are subject to server capacity.


Get Your API Token

You need an API token to authenticate requests. Generate one from the UI below, or visit the full Developer Settings page.

API Token Generator

Tokens are shown only once. Copy your token immediately after creating it. If you lose it, revoke the old one and create a new token.

OpenClaw Skill Definition

GET/api/openclaw/skill

Returns the complete Pop-cam skill definition as structured JSON. This is the machine-readable equivalent of the /openclaw documentation page. OpenClaw agents should call this endpoint first to discover all features (including text-to-image), API endpoints, code examples, authentication requirements, and credit costs.

No authentication is required. This endpoint is designed for AI agents to programmatically discover the skill's capabilities before making authenticated generation requests.

Example Request

bash
curl https://pop-cam.com/api/openclaw/skill

Response (200)

The response includes the full skill definition. Key top-level fields:

ParameterTypeDescription
namerequiredstringSkill name (Pop-cam NanoBanana).
versionrequiredstringSkill definition version.
descriptionrequiredstringWhat the skill does, including text-to-image support.
featuresrequiredarrayAll capabilities: image-to-image, text-to-image, webhook, sync, custom prompts, credits.
endpointsrequiredarrayEvery API endpoint with method, path, auth type, and request/response schemas.
codeExamplesrequiredarrayReady-to-use curl commands and JSON response samples.
instructionsrequiredarrayOrdered steps for the agent to follow.
authenticationrequiredobjectToken format, sign-up/sign-in URLs, auth-status endpoint.
creditsrequiredobjectCost per generation and purchase URL.

Generate Image

POST/api/v1/nanobanana

Generate images with NanoBanana. Supports two modes: image-to-image (provide an image to transform) and text-to-image (provide only a prompt to generate from scratch). Both modes support synchronous and asynchronous (webhook) delivery.

Request Headers

ParameterTypeDescription
AuthorizationrequiredstringBearer pk_your_token
Content-Typerequiredstringapplication/json

Request Body

ParameterTypeDescription
imagestringBase64 data URL for image-to-image mode. Format: data:image/png;base64,.... Omit for text-to-image.
promptstringGeneration prompt. Required for text-to-image (when image is omitted). Optional for image-to-image.
webhook_urlstringURL to POST results to when done. Enables async mode (returns HTTP 202).

Synchronous Response (200)

Returned when no webhook_url is provided. Use download_url to fetch the image — it is a presigned URL (1-hour expiry) that works even when the storage bucket is private.

json
{
  "job_id": "a1b2c3d4-e5f6-...",
  "image_url": "https://storage.pop-cam.com/generated/...",
  "download_url": "https://...r2.cloudflarestorage.com/...?X-Amz-Signature=...",
  "used_prompt": "...",
  "credits_remaining": 42,
  "mode": "image-to-image"
}

Asynchronous Response (202)

Returned when webhook_url is provided. Results are POSTed to your URL.

json
{
  "job_id": "a1b2c3d4-e5f6-...",
  "status": "processing",
  "message": "Your image is being generated. Results will be POSTed to your webhook_url."
}

Example: Python

python
import requests
import base64

with open("photo.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

response = requests.post(
    "https://pop-cam.com/api/v1/nanobanana",
    headers={"Authorization": "Bearer pk_YOUR_TOKEN"},
    json={
        "image": f"data:image/png;base64,{b64}",
        "prompt": "Enhance this photo with cinematic lighting and shallow depth of field"
    }
)

data = response.json()
print(f"Download URL: {data['download_url']}")
print(f"Credits remaining: {data['credits_remaining']}")

Example: JavaScript / Node.js

javascript
import fs from "fs";

const imageData = fs.readFileSync("photo.png");
const base64 = imageData.toString("base64");

const response = await fetch("https://pop-cam.com/api/v1/nanobanana", {
  method: "POST",
  headers: {
    "Authorization": "Bearer pk_YOUR_TOKEN",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    image: `data:image/png;base64,${base64}`,
    prompt: "Enhance this photo with cinematic lighting and shallow depth of field",
  }),
});

const data = await response.json();
console.log("Download URL:", data.download_url);

Example: Text-to-Image (no source photo)

bash
curl -X POST https://pop-cam.com/api/v1/nanobanana \
  -H "Authorization: Bearer pk_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A photorealistic portrait of a man in a leather jacket standing on a city rooftop at golden hour, natural lighting, shallow depth of field"
  }'
json
{
  "job_id": "a1b2c3d4-e5f6-...",
  "image_url": "https://storage.pop-cam.com/generated/...",
  "download_url": "https://...r2.cloudflarestorage.com/...?X-Amz-Signature=...",
  "used_prompt": "A photorealistic portrait of a man in a leather jacket standing on a city rooftop at golden hour, natural lighting, shallow depth of field",
  "credits_remaining": 41,
  "mode": "text-to-image"
}

Webhooks

Provide a webhook_url in your request to enable async mode. The API returns immediately with HTTP 202 and a job_id, then POSTs the result to your URL when generation completes.

Success Payload

Use download_url to fetch the generated image (presigned, 1-hour expiry).

json
{
  "success": true,
  "job_id": "a1b2c3d4-e5f6-...",
  "image_url": "https://storage.pop-cam.com/generated/...",
  "download_url": "https://...r2.cloudflarestorage.com/...?X-Amz-Signature=...",
  "used_prompt": "...",
  "credits_remaining": 41
}

Failure Payload

json
{
  "success": false,
  "job_id": "a1b2c3d4-e5f6-...",
  "error": "Description of what went wrong"
}

Retry Policy

Delivery is attempted up to 3 times with exponential backoff (1s, 2s, 4s). Return a 2xx status to acknowledge receipt.

Tip: Credits are deducted on successful generation even if webhook delivery fails. The image is stored and accessible via its URL. Use the job_id for idempotency.

Manage Tokens (API)

These endpoints use Clerk session auth (cookie or JWT), not API tokens. For a UI, visit Developer Settings.

GET/api/v1/tokens

List all API tokens (masked) for the authenticated user.

json
{
  "tokens": [
    {
      "id": "uuid",
      "name": "My Agent",
      "token": "pk_...a1b2c3",
      "createdAt": "2025-01-15T...",
      "lastUsedAt": "2025-01-16T...",
      "revokedAt": null
    }
  ]
}
POST/api/v1/tokens

Create a new API token. The full token is only returned in this response.

ParameterTypeDescription
namestringLabel for the token (e.g. "My Agent"). Defaults to "Default".
DELETE/api/v1/tokens?id=TOKEN_ID

Revoke a token. It immediately stops working for all requests.


Free Tools API

Pop-cam offers free tool endpoints that require no authentication. These are ideal for quick prototyping, demos, and lightweight integrations — the best image generation API for OpenClaw agent workflows and similar AI pipelines that need zero-config visual output.

Free tool endpoints are rate-limited to 2 requests per IP address per 24 hours. No API token or account is needed. For unlimited usage, use the authenticated endpoints with credits.

Notes to Infographic

POST/api/free-tools/notes-to-infographic

Turn plain-text notes into a visually rich infographic image. Pass your notes and receive a downloadable PNG — perfect for summarizing meeting notes, study material, or data briefs via any HTTP client or AI agent.

Request Body

ParameterTypeDescription
notesrequiredstringThe text notes to visualize. Maximum 5,000 characters.

Response (200)

json
{
  "imageUrl": "https://storage.pop-cam.com/generated/free-tools/...",
  "dataUrl": "data:image/png;base64,...",
  "remaining": 1,
  "resetAt": "2026-03-28T12:00:00.000Z"
}
ParameterTypeDescription
imageUrlstringPublic URL of the stored infographic on CDN.
dataUrlstringBase64 data URL for immediate use without a second fetch.
remainingnumberFree uses left for this IP in the current 24-hour window.
resetAtstringISO 8601 timestamp when the rate limit window resets.

Rate Limit Response (429)

json
{
  "error": "Rate limit exceeded",
  "message": "You have used all your free generations. Try again later.",
  "remaining": 0,
  "resetAt": "2026-03-28T12:00:00.000Z"
}

Example: cURL

bash
curl -X POST https://pop-cam.com/api/free-tools/notes-to-infographic \
  -H "Content-Type: application/json" \
  -d '{
    "notes": "Q3 Revenue: $2.4M (+15% YoY)\nNew customers: 340\nChurn rate: 3.2%"
  }'

Example: Python

python
import requests

response = requests.post(
    "https://pop-cam.com/api/free-tools/notes-to-infographic",
    json={"notes": "Q3 Revenue: $2.4M (+15% YoY)\nNew customers: 340"}
)

data = response.json()
print(f"Image: {data['imageUrl']}")
print(f"Uses left: {data['remaining']}")

Example: JavaScript / Node.js

javascript
const response = await fetch(
  "https://pop-cam.com/api/free-tools/notes-to-infographic",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      notes: "Q3 Revenue: $2.4M (+15% YoY)\nNew customers: 340"
    }),
  }
);

const data = await response.json();
console.log("Image URL:", data.imageUrl);
console.log("Remaining:", data.remaining);

Blog Header Image Generator

POST/api/free-tools/blog-header-image

Generate a stunning blog header / feature image from a title and optional description. Choose from multiple visual styles. Returns a wide-format, publish-ready PNG — perfect for blog platforms, Medium, Dev.to, and social media Open Graph previews.

Request Body

ParameterTypeDescription
titlerequiredstringThe blog post title to display on the image. Maximum 300 characters.
descriptionstringOptional topic context to guide the visual theme. Maximum 1,000 characters. Not rendered as text in the image.
stylestringVisual style preset. One of: modern (default), illustration, tech, nature, abstract, minimal.

Response (200)

json
{
  "imageUrl": "https://storage.pop-cam.com/generated/free-tools/...",
  "dataUrl": "data:image/png;base64,...",
  "remaining": 1,
  "resetAt": "2026-04-06T12:00:00.000Z"
}
ParameterTypeDescription
imageUrlstringPublic URL of the stored header image on CDN.
dataUrlstringBase64 data URL for immediate use without a second fetch.
remainingnumberFree uses left for this IP in the current 24-hour window.
resetAtstringISO 8601 timestamp when the rate limit window resets.

Example: cURL

bash
curl -X POST https://pop-cam.com/api/free-tools/blog-header-image \
  -H "Content-Type: application/json" \
  -d '{
    "title": "How We Scaled to 10K Users in 30 Days",
    "description": "A startup growth story about product-led growth",
    "style": "tech"
  }'

Example: Python

python
import requests

response = requests.post(
    "https://pop-cam.com/api/free-tools/blog-header-image",
    json={
        "title": "How We Scaled to 10K Users in 30 Days",
        "style": "modern"
    }
)

data = response.json()
print(f"Image: {data['imageUrl']}")
print(f"Uses left: {data['remaining']}")

Example: JavaScript / Node.js

javascript
const response = await fetch(
  "https://pop-cam.com/api/free-tools/blog-header-image",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      title: "How We Scaled to 10K Users in 30 Days",
      description: "A startup growth story",
      style: "illustration"
    }),
  }
);

const data = await response.json();
console.log("Image URL:", data.imageUrl);
console.log("Remaining:", data.remaining);

Error Codes

StatusMeaningResolution
400Bad RequestMissing or malformed image field.
401UnauthorizedInvalid or revoked API token.
402Payment RequiredInsufficient credits. Purchase more.
429Too Many RequestsFree tool rate limit hit. Wait for resetAt.
500Server ErrorRetry after a short delay.

Error Response Format

All errors return JSON with an error field:

json
{
  "error": "Human-readable error description"
}

Machine-readable OpenAPI spec: /api/v1/docs