# Product Directory Submitter (`prodmarkllc/product-directory-submitter`) Actor

Automatically submit your startup or product to multiple directories using an AI Agent. Stop manually filling out the same forms on ProductHunt, AlternativeTo, SideProjectors, etc.  Fill all the required fields and you can submit your product to ANY URL.  See ReadMe for full instructions.

- **URL**: https://apify.com/prodmarkllc/product-directory-submitter.md
- **Developed by:** [Mark Rieck](https://apify.com/prodmarkllc) (community)
- **Categories:** Agents, Automation, Other
- **Stats:** 9 total users, 0 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Product Directory Submitter (Vision/Camoufox)

Automatically submit your startup or product to a directory using an AI Agent. Works with Product Hunt, BetaList, Indie Hackers, and any other submission site.

**This actor uses an AI Agent** to navigate the directory site, click and fill forms, sign up for an account, and submit your product - just like a human would. A video recording of what the agent does will be saved to storage (unless turned off). You have complete visibility into what happened during the submission process.

### How much will it cost to run?

#### Pricing

Product Directory Submitter uses **Gemini by default** at **$0.03 per AI agent turn**.

- **Average cost**: ~$0.90 per site (~30 turns)
- **Maximum cost**: Configurable via `maxAgentTurnsPerSite` (default 80 turns = $2.40 max per site)

*Claude is available as an alternative AI provider at $0.05 per turn via the `aiProvider` input field.*

The agent keeps trying until successful submission, or the turn limit is reached. If a site fails, you will be given a message from the agent what went wrong.

### IMPORTANT: Some sites REQUIRE Google OAuth for login

Some sites require Google Sign-in - to run automations on those sites you need to upload a browser session with your Google session credentials.

### Browser Session Setup

A browser session allows the agent to:
- Use **"Sign in with Google"** for faster signups on supported sites
- **Auto-verify emails** by accessing your Gmail
- Post to platforms where you have existing accounts (Reddit, Twitter, etc.)

#### How to Create a Browser Session

Use the [browser-session-capture](https://github.com/mrieck/browser-session-capture) tool:

```bash
git clone https://github.com/mrieck/browser-session-capture.git && cd browser-session-capture && python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt && python capture_browser_session.py
````

This opens a browser where you:

1. Log into Google (for OAuth and Gmail verification)
2. Optionally you can log into other platforms and the agent will be logged in when run
3. Press enter in terminal when done

The tool saves `browser_session.json` which you upload to the actor's `browserSession` input field.

**Note**: Sessions expire after 2-4 weeks. Re-capture when needed.

#### Is My Browser Session Secure?

Yes. Your session data is protected by multiple layers of security:

1. **Apify is SOC 2 Type II compliant** - Independent security audits verify data handling practices
2. **Temporary signed URLs** - When you upload via the file input, your session goes to Apify's Key-Value Store and the actor receives a pre-signed URL (not the raw file). This URL is only accessible during the actor run.
3. **Responsible code handling**:
   - Session content is never logged (only "session loaded" confirmation messages)
   - Session is never persisted to output datasets or storage
   - Each browser context is isolated (Camoufox)
   - Contexts are properly closed after each site
4. **Data encrypted at rest** - Apify stores all data on AWS with encryption

**Recommendation**: Use a dedicated Google account for automation rather than your primary account. Sessions expire after 2-4 weeks, limiting any exposure window.

### How to use Product Directory Submitter?

#### Step 1: Prepare your product assets

Before running, gather:

- Your product URL
- Square logo (240x240px or 400x400px PNG)
- Primary screenshot (1270x760px)
- OG/social image (1200x630px)
- Product name, tagline, and descriptions

#### Step 2: Configure inputs

Enter your product details in the actor input form:

- Required fields: URL, email, logo, screenshot, OG image
- Optional: Additional screenshots, descriptions, social links

#### Step 3: Set up browser session (optional but recommended)

For OAuth signups ("Sign in with Google") and auto email verification, upload a browser session file. See [Browser Session Setup](#browser-session-setup) below.

#### Step 4: Run the actor

Click "Start" and monitor progress. The actor will:

1. Navigate to the target directory site
2. Sign up or log in
3. Fill out the submission form
4. Upload your images
5. Submit your product

#### Step 5: Handle failures

Check results for any failed sites. Common issues:

- Email verification required before you can submit (enable `autoVerifyEmail` or verify manually and run again)
- CAPTCHA encountered (I've seen the Agent successfully complete CAPTCHA but it may run into one that it fails on)
- Form changes on the site

Re-run the actor to retry failed sites automatically.

### Input Parameters

#### Required

| Field | Type | Description |
|:------|:-----|:------------|
| `productUrl` | String | Your product/website URL |
| `email` | String | Email for account signups (you'll receive verification emails here) |
| `logoSquare` | String | URL to square logo image (240x240px or 400x400px, PNG recommended) |
| `screenshot1` | String | URL to primary product screenshot (1270x760px recommended) |
| `ogImage` | String | URL to Open Graph / social preview image (1200x630px) |
| `targetSite` | String | The directory URL to submit to (e.g., 'https://producthunt.com') |

#### Optional - Product Info

| Field | Type | Description |
|:------|:-----|:------------|
| `productName` | String | Name of your product |
| `tagline` | String | Short tagline (aim for 60 characters) |
| `shortDesc` | String | Brief description (aim for 200 characters) |
| `longDesc` | String | Detailed description (500+ characters) |
| `productTags` | Array | Tags/categories (e.g., "AI", "SaaS", "Productivity") |
| `socialLinks` | Object | Social links: `{"twitter": "...", "github": "..."}` |
| `userInfo` | Object | Your personal info for sites that ask about YOU (not the product) |

#### Optional - Images

| Field | Type | Description |
|:------|:-----|:------------|
| `screenshot2` | String | Additional screenshot URL (1270x760px) |
| `screenshot3` | String | Additional screenshot URL (1270x760px) |
| `logoCircular` | String | Circular/round logo for avatar displays (400x400px) |

#### Optional - Advanced

| Field | Type | Default | Description |
|:------|:-----|:--------|:------------|
| `password` | String | - | Password for new account signups (encrypted) |
| `customPrompt` | String | - | Additional instructions for the AI agent specific to this site |
| `hasAccount` | Boolean | `false` | If true, agent will try to log in instead of signing up |
| `browserSession` | File | - | Browser session JSON for OAuth and platform logins |
| `autoVerifyEmail` | Boolean | `false` | Auto-verify emails via Gmail (requires Google account in browserSession) |
| `maxAgentTurnsPerSite` | Integer | `80` | Max AI turns before giving up (each turn = $0.03 with Gemini) |
| `browserWaitMinutes` | Integer | `0` | Keep browser open after completion for debugging |
| `recordVideo` | Boolean | `true` | Record browser session videos (saved to KV store) |

### Input Examples

#### Basic (Required Fields Only)

```json
{
  "productUrl": "https://myproduct.com",
  "email": "hello@myproduct.com",
  "logoSquare": "https://myproduct.com/logo-400x400.png",
  "screenshot1": "https://myproduct.com/screenshot-1270x760.png",
  "ogImage": "https://myproduct.com/og-1200x630.png",
  "targetSite": "https://www.producthunt.com"
}
```

#### Full Example

```json
{
  "productUrl": "https://myproduct.com",
  "email": "hello@myproduct.com",
  "password": "SecurePassword123!",
  "productName": "MyProduct",
  "tagline": "The best way to do X",
  "shortDesc": "MyProduct helps teams accomplish X faster with AI-powered automation.",
  "longDesc": "MyProduct is a comprehensive solution for teams looking to streamline their workflow...",
  "productTags": ["AI", "SaaS", "Productivity", "Developer Tools"],
  "logoSquare": "https://myproduct.com/logo-400x400.png",
  "screenshot1": "https://myproduct.com/screenshot1.png",
  "screenshot2": "https://myproduct.com/screenshot2.png",
  "ogImage": "https://myproduct.com/og-image.png",
  "targetSite": "https://www.producthunt.com",
  "socialLinks": {
    "twitter": "https://twitter.com/myproduct",
    "github": "https://github.com/myproduct"
  },
  "autoVerifyEmail": true,
  "maxAgentTurnsPerSite": 60
}
```

#### Custom Site with Instructions

```json
{
  "productUrl": "https://myproduct.com",
  "email": "hello@myproduct.com",
  "logoSquare": "https://myproduct.com/logo.png",
  "screenshot1": "https://myproduct.com/screenshot.png",
  "ogImage": "https://myproduct.com/og.png",
  "targetSite": "https://reddit.com/r/startups",
  "customPrompt": "Post as a text post with title and description. Flair as 'Show /r/startups'."
}
```

### API Usage Examples

#### Using cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/prodmarkllc~product-directory-submitter/runs" -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_APIFY_TOKEN" -d '{"productUrl": "https://myproduct.com", "email": "hello@myproduct.com", "logoSquare": "https://myproduct.com/logo.png", "screenshot1": "https://myproduct.com/screenshot.png", "ogImage": "https://myproduct.com/og.png", "targetSite": "https://www.producthunt.com"}'
```

#### Using JavaScript/Node.js (Apify Client)

```javascript
import { ApifyClient } from 'apify-client';

const apifyClient = new ApifyClient({
    token: 'YOUR_APIFY_TOKEN',
});

const run = await apifyClient
    .actor('prodmarkllc~product-directory-submitter')
    .call({
        productUrl: 'https://myproduct.com',
        email: 'hello@myproduct.com',
        logoSquare: 'https://myproduct.com/logo.png',
        screenshot1: 'https://myproduct.com/screenshot.png',
        ogImage: 'https://myproduct.com/og.png',
        targetSite: 'https://www.producthunt.com'
    });

console.log('Run started:', run);

const { items } = await apifyClient
    .dataset(run.defaultDatasetId)
    .listItems();

console.log('Results:', items);
```

#### Using Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')

run = client.actor('prodmarkllc~product-directory-submitter').call(
    run_input={
        'productUrl': 'https://myproduct.com',
        'email': 'hello@myproduct.com',
        'logoSquare': 'https://myproduct.com/logo.png',
        'screenshot1': 'https://myproduct.com/screenshot.png',
        'ogImage': 'https://myproduct.com/og.png',
        'targetSite': 'https://www.producthunt.com'
    }
)

dataset_items = client.dataset(run['defaultDatasetId']).list_items().items

print('Results:', dataset_items)
```

#### Get Run Status

```bash
curl "https://api.apify.com/v2/actor-runs/RUN_ID" -H "Authorization: Bearer YOUR_APIFY_TOKEN"
```

#### Get Results

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items" -H "Authorization: Bearer YOUR_APIFY_TOKEN"
```

### Results

The actor saves results to the Apify dataset. Each site submission creates a record:

```json
{
  "site_url": "https://www.producthunt.com",
  "status": "SUBMITTED",
  "turns_used": 28,
  "timestamp": "2025-01-15T10:30:00.000Z"
}
```

#### Status Values

| Status | Description |
|:-------|:------------|
| `SUBMITTED` | Successfully submitted to the directory |
| `FAILED` | Submission failed (check `failure_reason`) |

#### Video Recordings

If `recordVideo` is enabled, browser session videos are saved to the Key-Value Store as WebM files. Useful for debugging failed submissions.

### Supported Sites

The actor works with any product directory or submission site. Common sites include:

- **Product Hunt** - producthunt.com
- **BetaList** - betalist.com
- **Indie Hackers** - indiehackers.com/products
- **TinyStartups** - tinystartups.com
- **10words** - 10words.io
- And many more...

Use any URL as `targetSite` - the agent will navigate the site and attempt to submit your product.

### Support

Need help or found a bug? Report issues on Apify.

Are you non-technical and having trouble using this actor?  Visit my website: https://directorylaunchhub.com

I made a dashboard to use this actor for product submissions.  You can save money using this actor/API directly, but if you want a more
user-friendly interface feel free to use my website.
----------------------------------------------------

*AI-powered browser automation for startup directory submissions.*

# Actor input Schema

## `autoVerifyEmail` (type: `boolean`):

If true, agent will go to mail.google.com to verify signup emails (requires Google account in browserSession). If false, sites needing verification are marked FAILED.

## `productUrl` (type: `string`):

The URL of your product/website to submit

## `productName` (type: `string`):

Name of your product

## `tagline` (type: `string`):

Short tagline for your product (aim for 60 characters)

## `shortDesc` (type: `string`):

Brief description of your product (aim for 200 characters)

## `longDesc` (type: `string`):

Detailed description of your product (500+ characters, used by sites that need more detail)

## `productTags` (type: `array`):

Tags/categories for your product (e.g., AI, SaaS, Productivity, Developer Tools). Helps the agent fill out category and type fields on directories.

## `email` (type: `string`):

Email address for account signups (you'll receive verification emails here)

## `password` (type: `string`):

Password for new account signups (encrypted, stored securely)

## `logoSquare` (type: `string`):

URL to square logo image (240x240px or 400x400px, PNG recommended)

## `screenshot1` (type: `string`):

URL to primary product screenshot (1270x760px recommended)

## `ogImage` (type: `string`):

URL to Open Graph / social preview image (1200x630px)

## `screenshot2` (type: `string`):

URL to additional screenshot (optional, 1270x760px)

## `screenshot3` (type: `string`):

URL to additional screenshot (optional, 1270x760px)

## `logoCircular` (type: `string`):

URL to circular/round logo for avatar displays (optional, 400x400px)

## `socialLinks` (type: `object`):

Social media links (twitter, github, linkedin, etc.)

## `userInfo` (type: `object`):

Your personal/business info for sites that ask about YOU (not the product). Most sites don't need this.

## `targetSite` (type: `string`):

The directory URL to submit to (e.g., 'https://producthunt.com' or 'https://reddit.com/r/startups'). The agent will sign up if needed and submit your product.

## `customPrompt` (type: `string`):

Additional instructions for the AI agent specific to this site (e.g., 'Post as a text post, flair as Show')

## `hasAccount` (type: `boolean`):

If true, the agent will try to log in instead of signing up. Use the email/password fields for credentials.

## `browserSession` (type: `string`):

Upload your browser session JSON containing any credentials needed for posting. If a Google account is included, the agent will use 'Sign in with Google' for signups. For custom sites (e.g., a subreddit), include that platform's credentials in your session. Generate using apify-session-helpers tool.

## `browserWaitMinutes` (type: `integer`):

Keep browser open for this many minutes after completion (0 = close immediately)

## `aiProvider` (type: `string`):

AI provider to use for browser automation: 'gemini' (default) or 'claude'

## `aiProviderFallback` (type: `boolean`):

If true, automatically switch to the other AI provider (Gemini↔Claude) when quota limits (429 errors) are hit.

## `recordVideo` (type: `boolean`):

Record video of each site's browser session for debugging. Videos are saved to the KV store as MP4 files (~5-50MB per site at 720p).

## `maxAgentTurnsPerSite` (type: `integer`):

Maximum AI agent turns per site before giving up. Each turn costs $0.03 (Gemini) or $0.05 (Claude). Average successful submission takes ~30 turns.

## Actor input object example

```json
{
  "autoVerifyEmail": false,
  "productUrl": "https://aislopcanvas.com",
  "productName": "AI Slop Canvas",
  "tagline": "Chain AI image and video models together visually",
  "shortDesc": "Visual AI workflow editor for image and video generation. Right-click any web image, send to canvas, and chain AI models together. Privacy-first, runs in your browser with your own Fal.ai API key.",
  "email": "support@aislopcanvas.com",
  "logoSquare": "https://aislopcanvas.s3.us-east-1.amazonaws.com/icon_squareclean_400x400.png",
  "screenshot1": "https://aislopcanvas.s3.us-east-1.amazonaws.com/promo_image1.png",
  "ogImage": "https://aislopcanvas.s3.us-east-1.amazonaws.com/slop_canvas_ogimage_1200x630.jpeg",
  "socialLinks": {
    "twitter": "https://twitter.com/aislopcanvas",
    "github": ""
  },
  "userInfo": {
    "name": "",
    "businessName": "",
    "about": ""
  },
  "targetSite": "https://directorylaunchhub.com/submit-product",
  "hasAccount": false,
  "browserWaitMinutes": 0,
  "aiProvider": "gemini",
  "aiProviderFallback": true,
  "recordVideo": true,
  "maxAgentTurnsPerSite": 80
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "productUrl": "https://aislopcanvas.com",
    "productName": "AI Slop Canvas",
    "tagline": "Chain AI image and video models together visually",
    "shortDesc": "Visual AI workflow editor for image and video generation. Right-click any web image, send to canvas, and chain AI models together. Privacy-first, runs in your browser with your own Fal.ai API key.",
    "email": "support@aislopcanvas.com",
    "logoSquare": "https://aislopcanvas.s3.us-east-1.amazonaws.com/icon_squareclean_400x400.png",
    "screenshot1": "https://aislopcanvas.s3.us-east-1.amazonaws.com/promo_image1.png",
    "ogImage": "https://aislopcanvas.s3.us-east-1.amazonaws.com/slop_canvas_ogimage_1200x630.jpeg",
    "socialLinks": {
        "twitter": "https://twitter.com/aislopcanvas",
        "github": ""
    },
    "userInfo": {
        "name": "",
        "businessName": "",
        "about": ""
    },
    "targetSite": "https://directorylaunchhub.com/submit-product"
};

// Run the Actor and wait for it to finish
const run = await client.actor("prodmarkllc/product-directory-submitter").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "productUrl": "https://aislopcanvas.com",
    "productName": "AI Slop Canvas",
    "tagline": "Chain AI image and video models together visually",
    "shortDesc": "Visual AI workflow editor for image and video generation. Right-click any web image, send to canvas, and chain AI models together. Privacy-first, runs in your browser with your own Fal.ai API key.",
    "email": "support@aislopcanvas.com",
    "logoSquare": "https://aislopcanvas.s3.us-east-1.amazonaws.com/icon_squareclean_400x400.png",
    "screenshot1": "https://aislopcanvas.s3.us-east-1.amazonaws.com/promo_image1.png",
    "ogImage": "https://aislopcanvas.s3.us-east-1.amazonaws.com/slop_canvas_ogimage_1200x630.jpeg",
    "socialLinks": {
        "twitter": "https://twitter.com/aislopcanvas",
        "github": "",
    },
    "userInfo": {
        "name": "",
        "businessName": "",
        "about": "",
    },
    "targetSite": "https://directorylaunchhub.com/submit-product",
}

# Run the Actor and wait for it to finish
run = client.actor("prodmarkllc/product-directory-submitter").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "productUrl": "https://aislopcanvas.com",
  "productName": "AI Slop Canvas",
  "tagline": "Chain AI image and video models together visually",
  "shortDesc": "Visual AI workflow editor for image and video generation. Right-click any web image, send to canvas, and chain AI models together. Privacy-first, runs in your browser with your own Fal.ai API key.",
  "email": "support@aislopcanvas.com",
  "logoSquare": "https://aislopcanvas.s3.us-east-1.amazonaws.com/icon_squareclean_400x400.png",
  "screenshot1": "https://aislopcanvas.s3.us-east-1.amazonaws.com/promo_image1.png",
  "ogImage": "https://aislopcanvas.s3.us-east-1.amazonaws.com/slop_canvas_ogimage_1200x630.jpeg",
  "socialLinks": {
    "twitter": "https://twitter.com/aislopcanvas",
    "github": ""
  },
  "userInfo": {
    "name": "",
    "businessName": "",
    "about": ""
  },
  "targetSite": "https://directorylaunchhub.com/submit-product"
}' |
apify call prodmarkllc/product-directory-submitter --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=prodmarkllc/product-directory-submitter",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Directory Submitter",
        "description": "Automatically submit your startup or product to multiple directories using an AI Agent. Stop manually filling out the same forms on ProductHunt, AlternativeTo, SideProjectors, etc.  Fill all the required fields and you can submit your product to ANY URL.  See ReadMe for full instructions.",
        "version": "0.2",
        "x-build-id": "Av3E7Xye4oO7pi1Ep"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/prodmarkllc~product-directory-submitter/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-prodmarkllc-product-directory-submitter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/prodmarkllc~product-directory-submitter/runs": {
            "post": {
                "operationId": "runs-sync-prodmarkllc-product-directory-submitter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/prodmarkllc~product-directory-submitter/run-sync": {
            "post": {
                "operationId": "run-sync-prodmarkllc-product-directory-submitter",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "productUrl",
                    "email",
                    "logoSquare",
                    "screenshot1",
                    "ogImage",
                    "targetSite"
                ],
                "properties": {
                    "autoVerifyEmail": {
                        "title": "Auto-Verify Email",
                        "type": "boolean",
                        "description": "If true, agent will go to mail.google.com to verify signup emails (requires Google account in browserSession). If false, sites needing verification are marked FAILED.",
                        "default": false
                    },
                    "productUrl": {
                        "title": "Product URL",
                        "type": "string",
                        "description": "The URL of your product/website to submit"
                    },
                    "productName": {
                        "title": "Product Name",
                        "type": "string",
                        "description": "Name of your product"
                    },
                    "tagline": {
                        "title": "Tagline",
                        "type": "string",
                        "description": "Short tagline for your product (aim for 60 characters)"
                    },
                    "shortDesc": {
                        "title": "Short Description",
                        "type": "string",
                        "description": "Brief description of your product (aim for 200 characters)"
                    },
                    "longDesc": {
                        "title": "Long Description",
                        "type": "string",
                        "description": "Detailed description of your product (500+ characters, used by sites that need more detail)"
                    },
                    "productTags": {
                        "title": "Product Tags",
                        "type": "array",
                        "description": "Tags/categories for your product (e.g., AI, SaaS, Productivity, Developer Tools). Helps the agent fill out category and type fields on directories.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "email": {
                        "title": "Email",
                        "type": "string",
                        "description": "Email address for account signups (you'll receive verification emails here)"
                    },
                    "password": {
                        "title": "Password",
                        "type": "string",
                        "description": "Password for new account signups (encrypted, stored securely)"
                    },
                    "logoSquare": {
                        "title": "Square Logo",
                        "type": "string",
                        "description": "URL to square logo image (240x240px or 400x400px, PNG recommended)"
                    },
                    "screenshot1": {
                        "title": "Screenshot 1",
                        "type": "string",
                        "description": "URL to primary product screenshot (1270x760px recommended)"
                    },
                    "ogImage": {
                        "title": "OG Image",
                        "type": "string",
                        "description": "URL to Open Graph / social preview image (1200x630px)"
                    },
                    "screenshot2": {
                        "title": "Screenshot 2",
                        "type": "string",
                        "description": "URL to additional screenshot (optional, 1270x760px)"
                    },
                    "screenshot3": {
                        "title": "Screenshot 3",
                        "type": "string",
                        "description": "URL to additional screenshot (optional, 1270x760px)"
                    },
                    "logoCircular": {
                        "title": "Circular Logo",
                        "type": "string",
                        "description": "URL to circular/round logo for avatar displays (optional, 400x400px)"
                    },
                    "socialLinks": {
                        "title": "Social Links",
                        "type": "object",
                        "description": "Social media links (twitter, github, linkedin, etc.)"
                    },
                    "userInfo": {
                        "title": "User Info (Optional)",
                        "type": "object",
                        "description": "Your personal/business info for sites that ask about YOU (not the product). Most sites don't need this."
                    },
                    "targetSite": {
                        "title": "Target Site",
                        "type": "string",
                        "description": "The directory URL to submit to (e.g., 'https://producthunt.com' or 'https://reddit.com/r/startups'). The agent will sign up if needed and submit your product."
                    },
                    "customPrompt": {
                        "title": "Custom Prompt",
                        "type": "string",
                        "description": "Additional instructions for the AI agent specific to this site (e.g., 'Post as a text post, flair as Show')"
                    },
                    "hasAccount": {
                        "title": "Has Existing Account",
                        "type": "boolean",
                        "description": "If true, the agent will try to log in instead of signing up. Use the email/password fields for credentials.",
                        "default": false
                    },
                    "browserSession": {
                        "title": "Browser Session (Optional)",
                        "type": "string",
                        "description": "Upload your browser session JSON containing any credentials needed for posting. If a Google account is included, the agent will use 'Sign in with Google' for signups. For custom sites (e.g., a subreddit), include that platform's credentials in your session. Generate using apify-session-helpers tool."
                    },
                    "browserWaitMinutes": {
                        "title": "Browser Wait (Minutes)",
                        "minimum": 0,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Keep browser open for this many minutes after completion (0 = close immediately)",
                        "default": 0
                    },
                    "aiProvider": {
                        "title": "AI Provider",
                        "enum": [
                            "gemini",
                            "claude"
                        ],
                        "type": "string",
                        "description": "AI provider to use for browser automation: 'gemini' (default) or 'claude'",
                        "default": "gemini"
                    },
                    "aiProviderFallback": {
                        "title": "AI Provider Fallback",
                        "type": "boolean",
                        "description": "If true, automatically switch to the other AI provider (Gemini↔Claude) when quota limits (429 errors) are hit.",
                        "default": true
                    },
                    "recordVideo": {
                        "title": "Record Browser Video",
                        "type": "boolean",
                        "description": "Record video of each site's browser session for debugging. Videos are saved to the KV store as MP4 files (~5-50MB per site at 720p).",
                        "default": true
                    },
                    "maxAgentTurnsPerSite": {
                        "title": "Max Agent Turns Per Site",
                        "minimum": 20,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum AI agent turns per site before giving up. Each turn costs $0.03 (Gemini) or $0.05 (Claude). Average successful submission takes ~30 turns.",
                        "default": 80
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
