Add campaigns to Vereel from your own tools
A REST API for brands. Browse public offers, send new ones from your scripts, agency tools or an AI assistant, and follow each one through review. Everything you send is checked by Vereel before it goes live.
What it does
Anyone can browse Vereel's public offers through the API: the same details a visitor sees on the site, without money amounts, with no account and no token.
A brand can also send offers. You create a token in your settings, send an offer with it, and Vereel reviews it. Once approved, the offer goes live like any other. Until then it is not public, and you can still change it and add photos.
The API does not publish offers, delete them, kick campaigns off or handle payments. Those stay in the app.
Quick start
Use a brand account
Sign in as a brand, or sign up as one. Tokens exist for brand accounts only.
Create a token
Open Settings › API tokens, name the token, choose read and write, and accept the Cooperation Terms for the offers it will send. Copy the token straight away: it is shown once.
Send an offer
Run the request below with your token. Take a category id from GET /categories. The offer is created with the status in_review.
Wait for review
Vereel approves the offer, or returns it to your drafts with a reason, and tells you either way. Meanwhile you can change it and add photos.
Create an offer (replace YOUR_TOKEN, the category id and the image URL with your own):
curl -X POST https://www.vereel.com/api/v1/public/my/offers \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Spring skincare launch",
"description": "Unbox our new vitamin C serum and show how it fits into your morning routine. One Reel and two Stories.",
"offerType": "PRODUCT",
"platforms": [
"instagram",
"tiktok"
],
"categoryIds": [
"00000000-0000-0000-0000-000000000001"
],
"isPayment": true,
"isBarter": false,
"productIncluded": true,
"productServiceValue": 150,
"additionalPayment": 800,
"currency": "PLN",
"includedDescription": "One 30 ml bottle of the serum, shipped before you start.",
"deliverables": {
"reels": 1,
"stories": 2
},
"requiresGoodsShipping": true,
"applyByDays": 21,
"followerMinimum": 5000,
"audience": {
"genders": [
"WOMEN"
],
"ageGroups": [
"18-24",
"25-34"
]
},
"imageUrls": [
"https://cdn.example.com/serum.jpg"
]
}'A successful call answers 201 with the offer's id and the status in_review. When no image was given, missing contains photo: add one before the offer can be approved.
Authentication
Browsing needs no token. Everything under /my/ needs a brand token, sent as Authorization: Bearer vrl_… . A token is read-only or read and write, and expires after 30, 90 or 365 days, as you choose. Vereel stores only a hash, so it can never show a token again. You can revoke one in Settings at any time, and Vereel emails you whenever one is created.
- Keep tokens on a server or in an agent's settings, never in a web page. The token routes refuse requests from other websites on purpose.
- A token acts for your brand only, and only on offers created through the API.
- Creating a token accepts the Cooperation Terms for the offers it will send. When the terms change, accept them again in Settings › API tokens: until then the token can read but not create offers.
Operations
Every operation, listed from the same definition that produces the OpenAPI file. Paths are relative to https://www.vereel.com/api/v1/public.
| Method | Path | Access | What it does |
|---|---|---|---|
GET | /offers | No token | Browse public offers |
GET | /offers/{id} | No token | Get one public offer |
GET | /categories | No token | List categories |
GET | /my/offers | Read token | List your API offers |
POST | /my/offers | Read and write token | Create an offer (it waits for review) |
GET | /my/offers/{id} | Read token | Get one of your API offers |
PATCH | /my/offers/{id} | Read and write token | Change an offer in review |
POST | /my/offers/{id}/images | Read and write token | Add an image to an offer in review |
POST | /my/offers/{id}/images/upload-url | Read and write token | Get a URL to upload an image to |
GET | /openapi.yaml | No token | This definition, as YAML |
GET | /openapi.json | No token | This definition, as JSON |
Images
An offer needs at least one photo before it can be approved. While it is in review there are two ways to add one:
- Send a link. Pass imageUrls when you create the offer, or POST {"url": …} to an offer's images. Vereel downloads the image itself: https only, from a public address, up to 5 MB.
- Or upload the file. Ask for an upload URL, PUT the file to it, then attach the returned path within 15 minutes.
- JPEG, PNG or WebP only, judged by the file's content and not its name. An offer holds up to 6 photos; the first is the cover.
Limits
- A request body is at most 64 KB.
- Without a token: 60 requests a minute per address.
- With a token: 120 requests a minute, and at most 30 changes and 20 image downloads in 10 minutes.
- Per brand: at most 10 live tokens, 20 offers in review and 50 new API offers a day.
Over a limit the API answers 429 (RATE_LIMITED or REVIEW_QUEUE_FULL), with a Retry-After header where waiting helps.
Errors
Every error has the same shape, {"error": {"code", "message", "details"}}, and details names each invalid field.
| Code | HTTP | Meaning |
|---|---|---|
INVALID_TOKEN | 401 | No valid token. Send Authorization: Bearer vrl_…; brands create tokens in Settings › API tokens. |
INSUFFICIENT_SCOPE | 403 | The token can only read. |
NOT_FOUND | 404 | No such offer, or not one this token may see. |
TERMS_VERSION_CHANGED | 409 | The Cooperation Terms changed since the token was created. Accept the new terms for the token in Settings › API tokens. |
PAYLOAD_TOO_LARGE | 413 | The body is larger than 64 KB. |
IMAGE_INVALID | 422 | The uploaded file is not a JPEG, PNG or WebP image of at most 5 MB. It was removed. |
IMAGE_LIMIT | 422 | The offer already has 6 photos. |
IMAGE_UNAVAILABLE | 422 | A linked image could not be used: not allowed, unreachable, too large, or not an image. |
INVALID_TRANSITION | 422 | The offer is no longer in review, so it cannot be changed through the API. |
VALIDATION_ERROR | 422 | A field is missing or invalid; details names each one. (400 for a body that is not a JSON object.) |
RATE_LIMITED | 429 | Too many requests. Wait for Retry-After seconds. |
REVIEW_QUEUE_FULL | 429 | The brand has 20 offers in review, or created 50 through the API in the last 24 hours. |
API_DISABLED | 503 | The public API is switched off at the moment. |
Use it from a ChatGPT custom GPT
A custom GPT can add offers for you from a brief you paste into the chat. In ChatGPT's GPT editor:
- Open Configure and choose Create new action.
- Choose Import from URL and enter https://www.vereel.com/api/v1/public/openapi.yaml. The operations appear in the list.
- Under Authentication choose API Key, set Auth Type to Bearer, and paste a read and write token.
- In the instructions, tell the GPT to ask for anything that is missing, to look up category ids with listCategories, and to pass photo links in imageUrls.
The token is kept in the GPT's settings, so keep the GPT private: anyone who can use it can send offers for your brand. Everything it sends still waits for review, and a GPT can only pass an image as a link.
Definition files
The OpenAPI 3.1 definition is public. Use it to generate a client or to connect a tool. It stays available even when the API is switched off.
Questions, or something you need that the API does not do yet? Contact us