---
title: "Create a one-time client portal sign-in link"
method: POST
path: "/api/v1/brands/{id}/review-links"
tags: ["Brands"]
---

# Create a one-time client portal sign-in link

`POST /api/v1/brands/{id}/review-links`

## Request

- Base URL: `https://www.poster.ly`
- URL: `https://www.poster.ly/api/v1/brands/{id}/review-links`
- Auth: HTTP bearer

Mints a single-use, five-minute link that signs an ALREADY INVITED reviewer in to this brand review page, so your own client portal can skip the emailed code.

Server side only. The key must have been granted "Create client portal sign-in links" in /dashboard/api; browser session calls are refused with `api_key_required`, and the scope can never be inherited or requested through POST /api/v1/api-keys.
The caller must be an owner or admin of the brand workspace at the time of the call, the workspace owner plan must include guest reviewers, and the reviewer must be currently invited to this brand.

Redirect the browser to `url` straight away and never store it. The reviewer sees a one-click confirmation screen naming their (masked) address and the brand. The session it opens covers only this brand and lasts 12 hours without extending. Approvals made this way are labelled in the activity history, in approval webhooks (`data.signed_in_via`), and in the client own review history.
If this call fails for any reason, fall back to the permanent review page link.

Error codes: `api_key_required` (403, session auth), `insufficient_scope` (403, key lacks review_links:write), `insufficient_role` (403, not an owner or admin of the brand workspace), `plan_required` (403, workspace owner plan has no guest reviewers), `brand_not_found` (404), `reviewer_not_found` (404), `content_plan_not_found` (404), `validation_error` (400), `rate_limited` (429), `portal_links_unavailable` (503).

## Path parameters

- `id` string, required

## Request body

- CreateReviewLinkRequest
  - `reviewer_email` string, email, required: A reviewer you have ALREADY invited to this brand. Unknown or revoked reviewers answer 404 reviewer_not_found.
  - `content_plan_id` string, uuid: Optional: open the link straight on one content plan. Must belong to this brand.

## Response `201`

Sign-in link created. The token is returned exactly once.

- CreateReviewLinkResponse
  - `url` string, required: Send the reviewer browser here immediately. Single use, and the token inside is never returned again.
  - `expires_at` string, date-time, required
  - `expires_in_seconds` integer, required
  - `single_use` true, required
  - `reviewer` object, required
    - `email` string, required
    - `display_name` string, nullable, required
  - `brand_id` string, uuid, required
  - `content_plan_id` string, uuid, nullable, required

## Other responses

- `400`: Validation error
- `401`: Invalid or missing API key
- `403`: Request is authenticated but not allowed
- `404`: Resource not found
- `429`: Too many requests
- `503`: Temporarily unavailable. Retry, or fall back to the documented alternative.

---

[API](https://skmtc.dev/poster/apis/posterly-api.md) · [All operations](https://skmtc.dev/poster/apis/posterly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/poster/apis/posterly-api/revisions/60be02a61f95?raw)
