---
title: "Render the step for a sample lead without saving or sending"
method: POST
path: "/business/campaigns/{campaignId}/steps/{stepId}/generate"
tags: ["Campaign steps"]
---

# Render the step for a sample lead without saving or sending

`POST /business/campaigns/{campaignId}/steps/{stepId}/generate`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/steps/{stepId}/generate`
- Auth: HTTP basic

Renders this step for one sample contact from the campaign's source lists - {Variable} tokens filled and spintax resolved - and returns the result WITHOUT saving it and without sending anything. Use it to check a manual step's copy, or to see what an AI step will write. `contact` names the lead the preview was rendered against. If the campaign has no contact to render against, the answer is 422 STEP_PREVIEW_UNAVAILABLE. Only the token owner may preview. Rate limit: this endpoint has a tighter cap of 20 requests/minute and 300/day, applied inside the shared campaigns bucket of 30 requests/minute and 1,000/day per token owner (shared by every campaign, scheduled-send, campaign-template and knowledge-hub endpoint).

Errors:
- `404` `CAMPAIGN_NOT_FOUND` — No campaign with this id exists, it belongs to another account (including a campaign delegated to you or shared by your team's visibility settings), or it has been deleted.
- `404` `SEQUENCE_STEP_NOT_FOUND` — No step with this id belongs to this campaign.
- `422` `STEP_PREVIEW_UNAVAILABLE` — There is nothing to render this step against: the campaign has no source list or no contact to sample, or generation produced no preview.
- `422` `VALIDATION_FAILED` — campaignId or stepId is not a 24-character hex id.
- `429` `RATE_LIMITED` — Either this endpoint's own cap (20 requests/minute, 300/day) or the shared campaigns bucket (30/minute, 1,000/day for this token owner, shared by every /business/campaigns, /business/scheduled-sends, /business/campaign-templates and /business/knowledge-hubs call) was exceeded. The RateLimit-* headers on the response describe the shared bucket, so a refusal from this endpoint's own cap can still report requests remaining and carries no Retry-After.
- `500` `UNEXPECTED_ERROR` — An unhandled failure; the detail stays in our logs and is never returned.

Requires one of the following token scopes: campaigns.

## Path parameters

- `campaignId` string, required: The campaign's id (24-character hex ObjectId), as returned by POST /business/campaigns or as the campaignId of a GET /business/campaigns row.
- `stepId` string, required: The sequence step's id, as returned by GET /business/campaigns/{campaignId}/steps (24-character hex ObjectId).

## Response `200`

Success

- object
  - `stepId` string, required: The step that was rendered.
  - `preview` object, required
    - `subject` string, nullable, required: Rendered subject; null on a step with no template yet or a channel that carries none.
    - `body` string, nullable, required: Rendered message body; null on a step with no template yet.
    - `channel` string, nullable, required
    - `type` 'manual' | 'ai_generated' | 'ai_reply' | 'null', nullable, required
    - `contact` object, required
      - `id` string, nullable, required
      - `name` string, nullable, required
      - `email` string, nullable, required
      - `jobTitle` string, nullable, required
      - `companyName` string, nullable, required

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
