# Ad Creative Production Brief Builder (`danielmichalek/creative-brief-generator`) Actor

Organize supplied campaign requirements into a production brief for up to 50 deliverables. Review goals, audiences, assets and claim approval references in JSON, Markdown and CSV. Send your requirements to prepare the designer review.

- **URL**: https://apify.com/danielmichalek/creative-brief-generator.md
- **Developed by:** [Daniel Michałek](https://apify.com/danielmichalek) (community)
- **Categories:** Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 complete creative production briefs

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Ad Creative Production Brief Builder

### Overview

Compile a production brief from supplied brand information, goals, audiences, claims, assets, reference notes and requirements. The report connects these records to up to 50 deliverables and identifies missing or ambiguous relationships. The same inputs produce the same report.

This deterministic compiler performs no AI inference, source retrieval or advertising account operation. It creates no new slogans or visual assets. Claim approval references are copied as supplied and remain unverified. Current platform rules and production specifications need review by the people responsible for the campaign.

### Input example

```json
{
  "brand": {
    "name": "Example Studio",
    "offer": "A reusable insulated bottle, described by the client for this demonstration."
  },
  "goals": [
    {
      "id": "product-use",
      "description": "Explain how the supplied bottle is used during a workday."
    }
  ],
  "audiences": [
    {
      "id": "commuters",
      "description": "Adults who asked the client for reusable bottle information."
    }
  ],
  "claims": [
    {
      "id": "capacity",
      "text": "The client states a 500 ml capacity.",
      "approvalEvidence": "client-product-sheet-v2"
    }
  ],
  "assets": [
    {
      "id": "photo",
      "description": "Client-owned bottle photograph.",
      "sourceUrl": "https://example.com/assets/bottle"
    }
  ],
  "references": [
    {
      "id": "pacing-note",
      "notes": "Use the supplied reference only to discuss pacing. Keep competitor slogans outside the new copy."
    }
  ],
  "requirements": [
    {
      "id": "ownership",
      "text": "Designer confirms permission for every supplied asset."
    },
    {
      "id": "capacity-review",
      "text": "Reviewer checks the capacity statement against the product sheet.",
      "deliverableIds": [
        "meta-image"
      ]
    }
  ],
  "deliverables": [
    {
      "id": "meta-image",
      "channel": "Meta",
      "format": "Client-specified square image. Confirm current placement requirements before production.",
      "goalIds": [
        "product-use"
      ],
      "audienceIds": [
        "commuters"
      ],
      "claimIds": [
        "capacity"
      ],
      "assetIds": [
        "photo"
      ],
      "referenceIds": [
        "pacing-note"
      ],
      "acceptanceCriteria": [
        "The reviewer can identify the bottle and find the supplied capacity statement.",
        "The designer attaches the asset permission reference."
      ]
    }
  ],
  "maxItems": 1
}
```

The demonstration describes fictional client requirements. Replace them with authorized data and assets. Total input is limited to 2 MB. There are up to 100 records per definition category and 50 deliverables. Text fields support up to 2000 UTF-16 code units. IDs use 1 to 80 ASCII letters, digits, dot, underscore or hyphen and are unique within their category. Unknown keys, invalid types and exceeded limits fail before delivery.

Each deliverable accepts goalIds, audienceIds, claimIds, assetIds, referenceIds and up to20acceptanceCriteria. Missing or empty requirements.deliverableIds makes a requirement global. Otherwise it applies to the listed deliverables. Missing goals, audiences, channel, format, criteria or linked claim approval evidence produce findings. Unassigned definitions and repeated links produce warnings. Duplicate IDs make references ambiguous. The compiler does not select a preferred conflicting record.

### Output

One dataset item contains the report. CREATIVE_BRIEF stores matching JSON, DELIVERABLES_CSV stores one row per input deliverable, and REPORT contains the readable brief and review queue. Definitions appear once and matrix links use IDs. This bounds output growth for shared long requirements.

qualityStatus is INCOMPLETE when errors were found, REVIEW_REQUIRED when only warnings were found, or CHECKS_PASSED when these structural checks found no issue. A successful Actor run means a complete audit was delivered and may contain an incomplete brief. Platform acceptance, factual correctness, legal approval, asset rights and expected performance require separate review.

URL checks use syntax and HTTP or HTTPS schemes. Embedded credentials cause an error and the URL is omitted. Exported URLs drop query strings and fragments. Original INPUT remains subject to Apify retention settings. Remove secrets and unnecessary personal data before upload. Markdown escapes markup and CSV neutralizes spreadsheet formulas.

### Existing portfolio workflow

Ad Headline and CTA Intelligence analyzes supplied copy. Landing Page Experiment Planner derives experiment prerequisites from supplied findings. This product organizes production requirements and acceptance criteria. Observations from those tools can be entered manually as reference notes. They do not become verified claims or approved requirements automatically.

### Pricing and cost

The local proposal is USD0.03 per complete creative-brief-report for up to50deliverables. Active Store pricing, cloud cost and margin require a qualified release. competitorMedianUsd remains null with an explicit unverified status. Observed competitors analyze media or whole social accounts and have different event dependencies. Direct willingness to pay for this variant remains unverified.

### Development and recovery

Use Node22 or newer and the pinned lock. Offline npm ci --ignore-scripts --omit=dev --no-audit --no-fund installs cached dependencies without package scripts. npm test runs regressions and npm start runs the real SDK. Start uses --max-old-space-size=128 --max-semi-space-size=8, including Docker. Application limits allow one report, zero content requests and a cooperative45-secondbudget. Acceptance additionally measures RSS and applies a process timeout.

PREPARED precedes report effects. COMPLETE requires one physical report and the expected named event count. Replay checks full input, report artifacts, runtime, pricing and physical dataset. Changed or uncertain effects require reconciliation. Preserve storage and use a single writer per job. A new intentional job uses fresh storage. Local acceptance and a Dockerfile do not establish cloud execution.

### Limits and fair use

Duplicate requirement IDs remain in the definitions and findings, with no resolved matrix link. Targeted requirements attach only to a unique deliverable ID. A unique global requirement applies to every input row, including rows whose deliverable IDs conflict. Such a report remains incomplete because of its duplicate IDs.

CSV numeric identifier cells receive a leading apostrophe to preserve leading zeros and long digit strings in spreadsheet applications. inputIndex remains numeric. Import identifier columns as text and use the JSON report when exact typed values are needed.

URL redaction applies to dedicated sourceUrl fields. Free-form notes, approvalEvidence, descriptions and criteria retain their supplied text. Remove secrets and unnecessary personal information from every input field before upload.

# Actor input Schema

## `brand` (type: `object`):

Supply name and offer strings using only these two keys. Strings support up to 2000 UTF-16 code units.

## `goals` (type: `array`):

Objects with id and description. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `audiences` (type: `array`):

Objects with id and description. Supply audiences you may use. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `claims` (type: `array`):

Objects with id, text and optional approvalEvidence. Approval references remain caller-provided and unverified. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `assets` (type: `array`):

Objects with id, description and optional sourceUrl. Supply assets you may use. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `references` (type: `array`):

Objects with id, notes and optional sourceUrl. Notes are supplied discussion references. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `requirements` (type: `array`):

Objects with id, text and optional deliverableIds. Missing or empty deliverableIds make a requirement global. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

## `deliverables` (type: `array`):

Objects with id, optional channel, format, goalIds, audienceIds, claimIds, assetIds, referenceIds and acceptanceCriteria. Missing production details become findings. IDs use 1..80 ASCII letters, digits, dot, underscore or hyphen. Total input limit is 2 MB and text fields support up to 2000 UTF-16 code units.

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

One report includes all supplied deliverables and requirements.

## Actor input object example

```json
{
  "brand": {
    "name": "Example Studio",
    "offer": "A reusable insulated bottle, described by the client for this demonstration."
  },
  "goals": [
    {
      "id": "product-use",
      "description": "Explain how the supplied bottle is used during a workday."
    }
  ],
  "audiences": [
    {
      "id": "commuters",
      "description": "Adults who asked the client for reusable bottle information."
    }
  ],
  "claims": [
    {
      "id": "capacity",
      "text": "The client states a 500 ml capacity.",
      "approvalEvidence": "client-product-sheet-v2"
    }
  ],
  "assets": [
    {
      "id": "photo",
      "description": "Client-owned bottle photograph.",
      "sourceUrl": "https://example.com/assets/bottle"
    }
  ],
  "references": [
    {
      "id": "pacing-note",
      "notes": "Use the supplied reference only to discuss pacing. Keep competitor slogans outside the new copy."
    }
  ],
  "requirements": [
    {
      "id": "ownership",
      "text": "Designer confirms permission for every supplied asset."
    },
    {
      "id": "capacity-review",
      "text": "Reviewer checks the capacity statement against the product sheet.",
      "deliverableIds": [
        "meta-image"
      ]
    }
  ],
  "deliverables": [
    {
      "id": "meta-image",
      "channel": "Meta",
      "format": "Client-specified square image. Confirm current placement requirements before production.",
      "goalIds": [
        "product-use"
      ],
      "audienceIds": [
        "commuters"
      ],
      "claimIds": [
        "capacity"
      ],
      "assetIds": [
        "photo"
      ],
      "referenceIds": [
        "pacing-note"
      ],
      "acceptanceCriteria": [
        "The reviewer can identify the bottle and find the supplied capacity statement.",
        "The designer attaches the asset permission reference."
      ]
    }
  ],
  "maxItems": 1
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `analysis` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (type: `string`):

No description

# 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 = {
    "brand": {
        "name": "Example Studio",
        "offer": "A reusable insulated bottle, described by the client for this demonstration."
    },
    "goals": [
        {
            "id": "product-use",
            "description": "Explain how the supplied bottle is used during a workday."
        }
    ],
    "audiences": [
        {
            "id": "commuters",
            "description": "Adults who asked the client for reusable bottle information."
        }
    ],
    "claims": [
        {
            "id": "capacity",
            "text": "The client states a 500 ml capacity.",
            "approvalEvidence": "client-product-sheet-v2"
        }
    ],
    "assets": [
        {
            "id": "photo",
            "description": "Client-owned bottle photograph.",
            "sourceUrl": "https://example.com/assets/bottle"
        }
    ],
    "references": [
        {
            "id": "pacing-note",
            "notes": "Use the supplied reference only to discuss pacing. Keep competitor slogans outside the new copy."
        }
    ],
    "requirements": [
        {
            "id": "ownership",
            "text": "Designer confirms permission for every supplied asset."
        },
        {
            "id": "capacity-review",
            "text": "Reviewer checks the capacity statement against the product sheet.",
            "deliverableIds": [
                "meta-image"
            ]
        }
    ],
    "deliverables": [
        {
            "id": "meta-image",
            "channel": "Meta",
            "format": "Client-specified square image. Confirm current placement requirements before production.",
            "goalIds": [
                "product-use"
            ],
            "audienceIds": [
                "commuters"
            ],
            "claimIds": [
                "capacity"
            ],
            "assetIds": [
                "photo"
            ],
            "referenceIds": [
                "pacing-note"
            ],
            "acceptanceCriteria": [
                "The reviewer can identify the bottle and find the supplied capacity statement.",
                "The designer attaches the asset permission reference."
            ]
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("danielmichalek/creative-brief-generator").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 = {
    "brand": {
        "name": "Example Studio",
        "offer": "A reusable insulated bottle, described by the client for this demonstration.",
    },
    "goals": [{
            "id": "product-use",
            "description": "Explain how the supplied bottle is used during a workday.",
        }],
    "audiences": [{
            "id": "commuters",
            "description": "Adults who asked the client for reusable bottle information.",
        }],
    "claims": [{
            "id": "capacity",
            "text": "The client states a 500 ml capacity.",
            "approvalEvidence": "client-product-sheet-v2",
        }],
    "assets": [{
            "id": "photo",
            "description": "Client-owned bottle photograph.",
            "sourceUrl": "https://example.com/assets/bottle",
        }],
    "references": [{
            "id": "pacing-note",
            "notes": "Use the supplied reference only to discuss pacing. Keep competitor slogans outside the new copy.",
        }],
    "requirements": [
        {
            "id": "ownership",
            "text": "Designer confirms permission for every supplied asset.",
        },
        {
            "id": "capacity-review",
            "text": "Reviewer checks the capacity statement against the product sheet.",
            "deliverableIds": ["meta-image"],
        },
    ],
    "deliverables": [{
            "id": "meta-image",
            "channel": "Meta",
            "format": "Client-specified square image. Confirm current placement requirements before production.",
            "goalIds": ["product-use"],
            "audienceIds": ["commuters"],
            "claimIds": ["capacity"],
            "assetIds": ["photo"],
            "referenceIds": ["pacing-note"],
            "acceptanceCriteria": [
                "The reviewer can identify the bottle and find the supplied capacity statement.",
                "The designer attaches the asset permission reference.",
            ],
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("danielmichalek/creative-brief-generator").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 '{
  "brand": {
    "name": "Example Studio",
    "offer": "A reusable insulated bottle, described by the client for this demonstration."
  },
  "goals": [
    {
      "id": "product-use",
      "description": "Explain how the supplied bottle is used during a workday."
    }
  ],
  "audiences": [
    {
      "id": "commuters",
      "description": "Adults who asked the client for reusable bottle information."
    }
  ],
  "claims": [
    {
      "id": "capacity",
      "text": "The client states a 500 ml capacity.",
      "approvalEvidence": "client-product-sheet-v2"
    }
  ],
  "assets": [
    {
      "id": "photo",
      "description": "Client-owned bottle photograph.",
      "sourceUrl": "https://example.com/assets/bottle"
    }
  ],
  "references": [
    {
      "id": "pacing-note",
      "notes": "Use the supplied reference only to discuss pacing. Keep competitor slogans outside the new copy."
    }
  ],
  "requirements": [
    {
      "id": "ownership",
      "text": "Designer confirms permission for every supplied asset."
    },
    {
      "id": "capacity-review",
      "text": "Reviewer checks the capacity statement against the product sheet.",
      "deliverableIds": [
        "meta-image"
      ]
    }
  ],
  "deliverables": [
    {
      "id": "meta-image",
      "channel": "Meta",
      "format": "Client-specified square image. Confirm current placement requirements before production.",
      "goalIds": [
        "product-use"
      ],
      "audienceIds": [
        "commuters"
      ],
      "claimIds": [
        "capacity"
      ],
      "assetIds": [
        "photo"
      ],
      "referenceIds": [
        "pacing-note"
      ],
      "acceptanceCriteria": [
        "The reviewer can identify the bottle and find the supplied capacity statement.",
        "The designer attaches the asset permission reference."
      ]
    }
  ]
}' |
apify call danielmichalek/creative-brief-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,danielmichalek/creative-brief-generator"
        }
    }
}
```

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/0cIAJtJW3kEfkTWoG/builds/zBdMjoW7MhPOr0GFj/openapi.json
