API

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

  1. Use a brand account

    Sign in as a brand, or sign up as one. Tokens exist for brand accounts only.

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

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

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

MethodPathAccessWhat it does
GET/offersNo tokenBrowse public offers
GET/offers/{id}No tokenGet one public offer
GET/categoriesNo tokenList categories
GET/my/offersRead tokenList your API offers
POST/my/offersRead and write tokenCreate an offer (it waits for review)
GET/my/offers/{id}Read tokenGet one of your API offers
PATCH/my/offers/{id}Read and write tokenChange an offer in review
POST/my/offers/{id}/imagesRead and write tokenAdd an image to an offer in review
POST/my/offers/{id}/images/upload-urlRead and write tokenGet a URL to upload an image to
GET/openapi.yamlNo tokenThis definition, as YAML
GET/openapi.jsonNo tokenThis 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.

CodeHTTPMeaning
INVALID_TOKEN401No valid token. Send Authorization: Bearer vrl_…; brands create tokens in Settings › API tokens.
INSUFFICIENT_SCOPE403The token can only read.
NOT_FOUND404No such offer, or not one this token may see.
TERMS_VERSION_CHANGED409The Cooperation Terms changed since the token was created. Accept the new terms for the token in Settings › API tokens.
PAYLOAD_TOO_LARGE413The body is larger than 64 KB.
IMAGE_INVALID422The uploaded file is not a JPEG, PNG or WebP image of at most 5 MB. It was removed.
IMAGE_LIMIT422The offer already has 6 photos.
IMAGE_UNAVAILABLE422A linked image could not be used: not allowed, unreachable, too large, or not an image.
INVALID_TRANSITION422The offer is no longer in review, so it cannot be changed through the API.
VALIDATION_ERROR422A field is missing or invalid; details names each one. (400 for a body that is not a JSON object.)
RATE_LIMITED429Too many requests. Wait for Retry-After seconds.
REVIEW_QUEUE_FULL429The brand has 20 offers in review, or created 50 through the API in the last 24 hours.
API_DISABLED503The 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:

  1. Open Configure and choose Create new action.
  2. Choose Import from URL and enter https://www.vereel.com/api/v1/public/openapi.yaml. The operations appear in the list.
  3. Under Authentication choose API Key, set Auth Type to Bearer, and paste a read and write token.
  4. 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