# Freelance Project Quote Calculator | ScopeQuote (`gustav-fyhn/scopequote`) Actor

Calculate a deterministic freelance project quote from income goals, capacity, scope, risk, revisions, rush, expenses, discounts, and platform fees. One run returns one structured result for API, MCP, and agent workflows.

- **URL**: https://apify.com/gustav-fyhn/scopequote.md
- **Developed by:** [Gustav Fyhn](https://apify.com/gustav-fyhn) (community)
- **Categories:** Agents, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## ScopeQuote — Freelancer Project Pricing Calculator

ScopeQuote turns income goals, realistic capacity, project scope, revisions,
contingency, rush, expenses, discounts, and platform fees into one deterministic
project-price planning estimate. It makes no network requests and returns one
result in the run's default dataset, making the interface suitable for humans,
API clients, MCP tools, and agentic Actor discovery.

Use ScopeQuote when you need a fast, repeatable quote baseline for a freelance
project. It runs as a finite Actor, requires no external credentials, and emits
one structured result that can be consumed in Console, by API clients, or by
agent workflows.

### Input and output

All input fields are optional and have visible defaults in the Actor input
schema. A run emits exactly one dataset record containing the quote, project
floor, base and effective rates, adjusted hours, price components, a floor
warning, a calculation-version label, and a clear planning-only disclaimer.

The calculator does not fetch market rates, convert currencies, provide legal,
tax, accounting, financial, or negotiation advice, or promise a commercial
outcome. The three-letter currency field is a label only.

Default input produces:

- base rate: `86.8636 USD`
- project floor: `2955.15 USD`
- quote: `3102.91 USD`
- below project floor: `false`

### Local verification

Requires Node.js 24 or later.

```powershell
npm ci
npm test
````

The calculation runner is tested with an in-memory Actor adapter, so tests do
not create an account, contact Apify, accept payment, or expose an inbound
service. `npm start` uses the Apify SDK's local storage behavior and is not
needed for the offline test suite.

For an SDK-level local smoke run, set `CRAWLEE_STORAGE_DIR` to a workspace-local
test directory and make sure `APIFY_IS_AT_HOME` is absent. In SDK 3.7.2, merely
setting `APIFY_IS_AT_HOME` to the strings `0` or `false` still selects platform
mode and can cause an unauthenticated cloud-storage request.

### Transparent pricing model

This Actor is designed for pay-per-event pricing with:

- the automatically managed `apify-actor-start` event at its documented default
  price;
- the synthetic `apify-default-dataset-item` event at the separately reviewed
  per-result price;
- no custom `Actor.charge()` call.

Each successful calculation pushes exactly one visible default-dataset item.
The synthetic dataset event therefore maps one charge to one delivered result,
while the Apify SDK/platform handles user spending limits and billing behavior.
Keep `usesStandbyMode` false and use limited permissions so the Actor can meet
the documented agentic-payment eligibility requirements.

The initial price is `$0.01` per successful quote result plus Apify's managed
Actor-start event. Each successful run creates exactly one billable result.

### Privacy and operational properties

- No credentials, secrets, wallets, trackers, external APIs, web scraping, or
  customer contact details are used.
- Task names are accepted for calculation but are not repeated in the output.
- Unknown fields and out-of-range values fail closed.
- The container runs as an unprivileged user with a pinned Node version.
- No public inbound service is opened; this is a finite Actor run.

### Authoritative references checked July 17, 2026

- Actor definition: https://docs.apify.com/actors/development/actor-definition
- Actor input schema: https://docs.apify.com/actors/development/actor-definition/input-schema/specification/v1
- Actor output schema: https://docs.apify.com/actors/development/actor-definition/output-schema
- Dataset schema: https://docs.apify.com/storage/dataset-schema
- Pay per event: https://docs.apify.com/actors/publishing/monetize/pay-per-event
- Pricing and costs: https://docs.apify.com/actors/publishing/monetize/pricing-and-costs
- Agentic x402 eligibility: https://docs.apify.com/integrations/x402
- General Terms: https://docs.apify.com/legal/general-terms-and-conditions
- Store Publishing Terms: https://docs.apify.com/legal/store-publishing-terms-and-conditions

# Actor input Schema

## `annualTarget` (type: `number`):

Desired annual owner compensation in the selected currency.

## `annualCosts` (type: `number`):

Estimated annual operating costs in the selected currency.

## `workWeeks` (type: `number`):

Weeks available for work each year.

## `billableHoursPerWeek` (type: `number`):

Realistic weekly hours that can be billed.

## `reservePct` (type: `number`):

Share reserved for tax, time off, or business resilience.

## `growthPct` (type: `number`):

Target margin above the calculated base rate.

## `tasks` (type: `array`):

One to 100 task objects. Complexity must be between 1 and 1.5.

## `revisionRounds` (type: `number`):

Number of included revision rounds.

## `revisionHoursPerRound` (type: `number`):

Expected hours for each included round.

## `scopeRiskPct` (type: `number`):

Contingency for uncertain scope.

## `deadlineRiskPct` (type: `number`):

Contingency for schedule constraints.

## `technicalRiskPct` (type: `number`):

Contingency for technical uncertainty.

## `stakeholderRiskPct` (type: `number`):

Contingency for coordination complexity.

## `rushPct` (type: `number`):

Rush premium applied after contingency.

## `directExpenses` (type: `number`):

Project-specific expenses in the selected currency.

## `discountPct` (type: `number`):

Optional discount on services before expenses and fee recovery.

## `platformFeePct` (type: `number`):

Percentage recovered so the post-fee amount meets the estimate.

## `currency` (type: `string`):

Three-letter uppercase label. This calculator does not perform exchange-rate conversion.

## Actor input object example

```json
{
  "annualTarget": 60000,
  "annualCosts": 8000,
  "workWeeks": 46,
  "billableHoursPerWeek": 24,
  "reservePct": 22,
  "growthPct": 10,
  "tasks": [
    {
      "name": "Discovery and structure",
      "hours": 4,
      "complexity": 1
    },
    {
      "name": "Design and production",
      "hours": 16,
      "complexity": 1.25
    },
    {
      "name": "Responsive QA and handoff",
      "hours": 5,
      "complexity": 1
    }
  ],
  "revisionRounds": 2,
  "revisionHoursPerRound": 2,
  "scopeRiskPct": 5,
  "deadlineRiskPct": 0,
  "technicalRiskPct": 0,
  "stakeholderRiskPct": 0,
  "rushPct": 0,
  "directExpenses": 0,
  "discountPct": 0,
  "platformFeePct": 3,
  "currency": "USD"
}
```

# Actor output Schema

## `quotes` (type: `string`):

The calculated quote and its components.

# 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("gustav-fyhn/scopequote").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("gustav-fyhn/scopequote").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 '{}' |
apify call gustav-fyhn/scopequote --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Freelance Project Quote Calculator | ScopeQuote",
        "description": "Calculate a deterministic freelance project quote from income goals, capacity, scope, risk, revisions, rush, expenses, discounts, and platform fees. One run returns one structured result for API, MCP, and agent workflows.",
        "version": "0.1",
        "x-build-id": "jEDIc9gakaaBq6i4H"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gustav-fyhn~scopequote/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gustav-fyhn-scopequote",
                "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/gustav-fyhn~scopequote/runs": {
            "post": {
                "operationId": "runs-sync-gustav-fyhn-scopequote",
                "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/gustav-fyhn~scopequote/run-sync": {
            "post": {
                "operationId": "run-sync-gustav-fyhn-scopequote",
                "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",
                "properties": {
                    "annualTarget": {
                        "title": "Annual take-home target",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Desired annual owner compensation in the selected currency.",
                        "default": 60000
                    },
                    "annualCosts": {
                        "title": "Annual business costs",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Estimated annual operating costs in the selected currency.",
                        "default": 8000
                    },
                    "workWeeks": {
                        "title": "Working weeks per year",
                        "minimum": 1,
                        "maximum": 52,
                        "type": "number",
                        "description": "Weeks available for work each year.",
                        "default": 46
                    },
                    "billableHoursPerWeek": {
                        "title": "Billable hours per week",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "number",
                        "description": "Realistic weekly hours that can be billed.",
                        "default": 24
                    },
                    "reservePct": {
                        "title": "Reserve percentage",
                        "minimum": 0,
                        "maximum": 80,
                        "type": "number",
                        "description": "Share reserved for tax, time off, or business resilience.",
                        "default": 22
                    },
                    "growthPct": {
                        "title": "Growth percentage",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "number",
                        "description": "Target margin above the calculated base rate.",
                        "default": 10
                    },
                    "tasks": {
                        "title": "Project tasks",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "One to 100 task objects. Complexity must be between 1 and 1.5.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "name": {
                                    "title": "Task name",
                                    "description": "Short scope label.",
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 120
                                },
                                "hours": {
                                    "title": "Hours",
                                    "description": "Estimated raw hours.",
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 10000
                                },
                                "complexity": {
                                    "title": "Complexity multiplier",
                                    "description": "Multiplier from 1 to 1.5.",
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 1.5
                                }
                            },
                            "required": [
                                "name",
                                "hours",
                                "complexity"
                            ]
                        },
                        "default": [
                            {
                                "name": "Discovery and structure",
                                "hours": 4,
                                "complexity": 1
                            },
                            {
                                "name": "Design and production",
                                "hours": 16,
                                "complexity": 1.25
                            },
                            {
                                "name": "Responsive QA and handoff",
                                "hours": 5,
                                "complexity": 1
                            }
                        ]
                    },
                    "revisionRounds": {
                        "title": "Included revision rounds",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "number",
                        "description": "Number of included revision rounds.",
                        "default": 2
                    },
                    "revisionHoursPerRound": {
                        "title": "Hours per revision round",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Expected hours for each included round.",
                        "default": 2
                    },
                    "scopeRiskPct": {
                        "title": "Scope risk percentage",
                        "minimum": 0,
                        "maximum": 35,
                        "type": "number",
                        "description": "Contingency for uncertain scope.",
                        "default": 5
                    },
                    "deadlineRiskPct": {
                        "title": "Deadline risk percentage",
                        "minimum": 0,
                        "maximum": 35,
                        "type": "number",
                        "description": "Contingency for schedule constraints.",
                        "default": 0
                    },
                    "technicalRiskPct": {
                        "title": "Technical risk percentage",
                        "minimum": 0,
                        "maximum": 35,
                        "type": "number",
                        "description": "Contingency for technical uncertainty.",
                        "default": 0
                    },
                    "stakeholderRiskPct": {
                        "title": "Stakeholder risk percentage",
                        "minimum": 0,
                        "maximum": 35,
                        "type": "number",
                        "description": "Contingency for coordination complexity.",
                        "default": 0
                    },
                    "rushPct": {
                        "title": "Rush percentage",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Rush premium applied after contingency.",
                        "default": 0
                    },
                    "directExpenses": {
                        "title": "Direct expenses",
                        "minimum": 0,
                        "maximum": 100000000,
                        "type": "number",
                        "description": "Project-specific expenses in the selected currency.",
                        "default": 0
                    },
                    "discountPct": {
                        "title": "Discount percentage",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "number",
                        "description": "Optional discount on services before expenses and fee recovery.",
                        "default": 0
                    },
                    "platformFeePct": {
                        "title": "Platform fee percentage",
                        "minimum": 0,
                        "maximum": 40,
                        "type": "number",
                        "description": "Percentage recovered so the post-fee amount meets the estimate.",
                        "default": 3
                    },
                    "currency": {
                        "title": "Currency label",
                        "pattern": "^[A-Z]{3}$",
                        "type": "string",
                        "description": "Three-letter uppercase label. This calculator does not perform exchange-rate conversion.",
                        "default": "USD"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
