# Writing Contests Scraper — Prizes, Entry Fees & Deadlines (`tactful_anvil/reedsy-writing-contests-scraper`) Actor

Scrape ~480 writing contests from the web's largest public directory: top prize parsed to USD, entry fee, free-entry flag, prize-to-fee ratio, deadline + days left and a 0-100 value score. Find cash contests with $0 entry. HTTP-only, no login. Runs great on a weekly schedule.

- **URL**: https://apify.com/tactful\_anvil/reedsy-writing-contests-scraper.md
- **Developed by:** [Mr Zack](https://apify.com/tactful_anvil) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 contest 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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Writing Contests Scraper — Prizes, Entry Fees & Deadlines

Scrapes the largest public writing-contest directory on the web (Reedsy's, ~480 contests) into one clean dataset: **top prize parsed to USD (currency-aware), entry fee, free-entry flag, prize-to-fee ratio, deadline + days left and a 0-100 value score** for every contest. HTTP-only — no login, no browser, no proxies.

### Who this is for

- **Writers chasing prize money** — the directory carries dozens of contests that pay cash with a **$0 entry fee** (5 open at the time of writing, more cycling in weekly). The `isFreeEntry` flag plus `valueScore` sort puts them at the top of every run.
- **Newsletter and community operators** (writing groups, MFA programs, Discord servers) who republish curated "contests closing this month" lists — `daysLeft` and `urgency` are your editorial calendar.
- **Author-services and writing-tool builders** who want a contests feed inside their product without maintaining a parser.
- **AI agents / MCP pipelines** — typed output schema, stable field names, one run returns the whole board.

### Why the derived fields matter

The directory publishes prizes in whatever currency the organizer uses ($, £, €, AU$…) and mixes cash prizes with trophies and publication offers. This actor:

- parses cash prizes to **`topPrizeUsd`** with documented static FX rates (USD/GBP/EUR/CAD/AUD/NZD) — non-cash prizes are `null`, **never a fake 0**;
- computes **`prizeToFeeRatio`** — a $5,000 prize behind a $40 fee is a different bet than $1,000 behind $0;
- flags **`isFreeEntry`** (cash without paying to play) and **`urgency`** (`ending-now` < 7 days);
- scores every contest 0-100 (**`valueScore`**: prize 45, log-scaled + fee 25, free entry max + time window 20 + prize depth 10). Unknown values score neutral, never bonus. Expired = 0.

By default expired listings are dropped (the source keeps an archive; ~57 contests are open at any time). Set `includeExpired: true` to track annual contests that reopen.

### Output fields

| Field | Description |
|---|---|
| `name`, `url`, `organizer` | Contest, direct link to the organizer's entry page, who runs it |
| `genres` | Parsed list (Fiction, Poetry, Essay, …) |
| `topPrizeRaw` / `topPrizeUsd` / `prizeCurrency` / `prizeKind` | Prize as published + parsed USD (null for non-cash) |
| `additionalPrizes` | What 2nd place and shortlists get |
| `entryFeeRaw` / `entryFeeUsd` / `isFreeEntry` | Fee as published, parsed, and the $0 flag |
| `prizeToFeeRatio` | topPrizeUsd ÷ entryFeeUsd (fee > 0 only) |
| `deadlineRaw` / `deadlineDate` / `daysLeft` / `isExpired` / `urgency` | Deadline in both forms + countdown |
| `valueScore` | 0-100 money-per-effort score (formula above) |

### Input

All optional: `genre` (e.g. `poetry`, `short-story` — 25 collections), `freeEntryOnly`, `cashPrizeOnly`, `minTopPrizeUsd`, `maxEntryFeeUsd`, `includeExpired`, `sortBy` (`valueScore` | `topPrize` | `deadline` | `lowestFee`), `maxItems`.

### How to schedule this actor (recommended)

Contests open and close weekly — the value is in seeing new free-entry contests before everyone else. In Apify Console:

1. Open **Schedules** → **Create new** → cron `0 7 * * 1` (every Monday morning).
2. Add this actor with e.g. `{ "freeEntryOnly": true, "sortBy": "deadline" }`.
3. Add an integration (email, Slack, Google Sheets) on the schedule to deliver new rows.

A weekly run of the whole board costs about **$0.04** at this actor's pricing — less than a coffee per year for never missing a free $1,000 contest.

### Fair use & data source

Public directory pages, fetched politely (throttled, ~14 requests/run, no login-walled content). Prize/fee/deadline facts are not copyrightable; descriptions are short excerpts linked back to source. If you operate the directory and have concerns, open an issue.

### Was this Actor useful?

If it saved you time, please **leave a review** — it genuinely helps other writers find it. Found a bug or a mis-parsed contest? Open an **Issue** and I'll fix it fast (this actor is actively maintained).

#### More money-board actors by the same developer

- [Class Action Settlements Scraper](https://apify.com/tactful_anvil/classaction-settlements-scraper) — no-proof cash claims with deadlines
- [Whop Content Rewards Scraper](https://apify.com/tactful_anvil/whop-content-rewards-scraper) — clipping campaigns that actually pay
- [Superteam Earn Scraper](https://apify.com/tactful_anvil/superteam-earn-scraper) — crypto bounties with EV per entry

# Actor input Schema

## `genre` (type: `string`):

Optional genre collection slug to scrape instead of the full directory. One of: children-s, christian, crime, essay, fantasy, fiction, flash-fiction, horror, humor, lgbtq, memoir, mystery, non-fiction, novel, novella, poetry, romance, science-fiction, science-writing, script-writing, short-story, suspense, thriller, travel, young-adult.

## `freeEntryOnly` (type: `boolean`):

Only contests with a $0 entry fee — cash prizes you can chase without paying to play.

## `cashPrizeOnly` (type: `boolean`):

Only contests whose top prize parses to a cash amount (drops trophy/publication-only listings).

## `minTopPrizeUsd` (type: `integer`):

Keep only contests whose parsed top prize is at least this many USD.

## `maxEntryFeeUsd` (type: `integer`):

Keep only contests whose entry fee is known and at most this many USD.

## `includeExpired` (type: `boolean`):

Also return past-deadline listings (the directory is an archive; useful for tracking annual contests that reopen).

## `sortBy` (type: `string`):

Row order: valueScore (default, best money-per-effort first), topPrize (biggest prize first), deadline (soonest deadline first), lowestFee (cheapest entry first).

## `maxItems` (type: `integer`):

Maximum number of contest rows to push (caps your per-result cost).

## Actor input object example

```json
{
  "freeEntryOnly": false,
  "cashPrizeOnly": false,
  "includeExpired": false,
  "sortBy": "valueScore",
  "maxItems": 1000
}
```

# Actor output Schema

## `contests` (type: `string`):

One row per writing contest: top prize (raw + currency-aware USD), entry fee, free-entry flag, prize-to-fee ratio, genres, deadline + days left and a 0-100 value score.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("tactful_anvil/reedsy-writing-contests-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("tactful_anvil/reedsy-writing-contests-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call tactful_anvil/reedsy-writing-contests-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tactful_anvil/reedsy-writing-contests-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4GOCRR2z0Qtgdg8Fo/builds/EDl85yoBgVuXCLwvD/openapi.json
