Consents
Third-party consent, creator tagging, and consent-response workflows.
This area covers:
- classic consent document uploads
- email-based consent requests
- in-app creator tag requests
- creator search for tagging
- accept / decline flows
- verification gating before response
POST /api/consents/store-or-send
Create or send one consent request mode for a product.
- Auth required: Yes
- Roles: Product owner
- Content type:
multipart/form-data
Request fields
| Field | Type | Required | Notes |
|---|---|---|---|
product_id | integer | Yes | Product owner must own the product. |
date | string | Yes | Consent date. |
email | string | No | Used for email mode. |
tagged_creator_id | integer | No | Single creator tag target. |
tagged_creator_ids[] | integer[] | No | Multiple creator tag targets. |
files[] | file[] | No | Manual document mode. Files must be pdf, jpg, jpeg, or png, max 10 MB each. |
Exactly one mode is required
Current validation requires exactly one of the following modes:
- tag one or more Fangate creators
- send by email
- upload at least three documents
If multiple modes are mixed, validation fails.
Current behavior by mode
Tag creators
- uses
tagged_creator_idortagged_creator_ids[] - seller cannot tag themselves
- pending duplicate tag on the same product is blocked
- accepted duplicate tag on the same product is blocked
- if the same seller and tagged user already have any previously accepted tag on another product, a new tag for the current product is auto-created as
accepted - otherwise a new tag starts as
pending
Email mode
- if the email belongs to an existing Fangate user, backend creates creator tags instead of relying on legacy external consent email flow
- if the email does not belong to a registered user and no files are uploaded, backend uses the legacy email request flow
Manual document mode
- requires at least three uploaded files
Queued consent processing
If the product has no media yet, backend can queue consent processing instead of failing immediately.
Queued response:
{
"success": true,
"errors_message": null,
"data": "Consent processing has been queued and will be completed when media files are available"
}Standard success response example
{
"success": true,
"errors_message": null,
"data": []
}Validation error example
{
"success": false,
"errors_message": "Choose exactly one: tag a Fangate creator, request consent by email, or upload three documents.",
"data": null
}GET /api/creators/search
Search creators for the tagging flow.
- Auth required: Yes
- Roles: Authenticated creator
Query parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
q | string | No | Empty query returns suggestions from previous collaborations. |
limit | integer | No | Default 20, max 50. |
exclude_user_id | integer | No | Defaults to the authenticated user. |
Search behavior
Non-empty search checks:
- first name
- last name
- full name
- Veriff first name
- Veriff last name
- Veriff full name
- exact numeric user id when query is numeric
GET /api/products/{product}/consent-creator-tags
Return product-level creator tags from the product owner's perspective.
- Auth required: Yes
- Roles: Product owner
Success response example
{
"success": true,
"errors_message": null,
"data": [
{
"id": 10,
"status": "pending",
"product_id": 5155,
"taken_at": "2026-04-20T10:15:00+00:00",
"created_at": "2026-04-20T10:15:00+00:00",
"tagged_user": {
"id": 23,
"first_name": "Co",
"last_name": "Creator",
"email": "cocreator@example.com",
"display_name": "Co Creator"
}
}
]
}GET /api/consent-tags
Return incoming creator tag requests for the authenticated tagged creator.
- Auth required: Yes
- Roles: Tagged creator
Success response example
{
"success": true,
"errors_message": null,
"data": [
{
"id": 10,
"status": "pending",
"product_id": 5155,
"taken_at": "2026-04-20T10:15:00+00:00",
"created_at": "2026-04-20T10:15:00+00:00",
"tagger": {
"id": 7,
"first_name": "Alyssa",
"last_name": "Creator",
"email": "alyssa@example.com"
}
}
]
}PATCH /api/consent-tags/
Accept or decline an incoming creator tag request.
- Auth required: Yes
- Roles: Tagged creator only
- Content type:
application/json
Request body
{
"decision": "accept"
}Allowed values:
acceptdecline
Success response example
{
"success": true,
"errors_message": null,
"data": {
"id": 10,
"status": "accepted",
"product_id": 5155
}
}Verification-required response
If the tagged creator is not Veriff-verified, backend returns a verification-required payload instead of applying the decision:
{
"success": false,
"errors_message": "Verification is required before you can respond to this consent request.",
"data": {
"requires_verification": true,
"verification": {
"id": "96972fba-3de6-4346-9029-4fdbea684bd3",
"url": "https://alchemy.veriff.com/v/..."
}
}
}Error cases
Forbidden:
{
"success": false,
"errors_message": "Forbidden",
"data": null
}Already answered:
{
"success": false,
"errors_message": "This tag request has already been answered.",
"data": null
}Purchase enforcement
Current backend blocks purchase when:
- the product has pending consent creator tags
- the product has declined consent creator tags
- the product has no allowed media
This is evaluated inside product purchase logic, not by a dedicated public consent endpoint.