Skip to main content
PUT
/
v2
/
offers
/
{id}
{
  "id": "664f1a2b3c4d5e6f7a8b9c0d",
  "slug": "ofr_summer-promo-v2_a1b2c3",
  "name": "Summer Promo v2",
    "tracking_url": "https://track.example.com/click?offer_id=123",
    "external_platform": "tune",
    "external_id": "4521",
    "advertiser_id": "adv_882",
    "payout": 3.00,
    "payout_type": "cpa",
    "filter_bots": true,
    "status": "active",
    "metadata": {
      "vertical": "health",
      "geo": "US,CA",
      "notes": "Updated payout for Q1"
    },
    "created_at": "2025-11-01T14:30:00",
    "updated_at": "2026-01-10T16:45:00"
}
Updates an existing offer on your account. Only the fields included in the request body are modified — omitted fields remain unchanged. The metadata field is merged with existing metadata rather than replaced, allowing you to add or update individual keys without losing others.

Path Parameters

id
string
required
The unique identifier of the offer to update.

Body Parameters

name
string
Display name for the offer. Maximum 255 characters.
tracking_url
string
The tracking/click URL for this offer. Must be a valid URL.
external_platform
string
External affiliate platform integration. Accepted values: tune, everflow, or null.
external_id
string
The offer ID on the external platform.
advertiser_id
string
Advertiser ID associated with the offer.
payout
float
Payout amount for the offer.
payout_type
string
Payout model. Accepted values: cpa (cost per action) or cpc (cost per click).
filter_bots
boolean
Whether to enable bot click filtering for this offer.
status
string
Status of the offer. Accepted values: active, paused, or archived. Setting status to archived is equivalent to a soft delete.
metadata
object
Custom key-value pairs. Merged with existing metadata — new keys are added, existing keys are overwritten, and keys not included in the request are preserved.

Response Fields

The response is the full updated offer object (flat, not wrapped). See List Offers for the complete field reference.

Examples

cURL
curl -X PUT "https://app.tracklysms.com/api/v2/offers/664f1a2b3c4d5e6f7a8b9c0d" \
  -H "X-Api-Key: trk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summer Promo v2",
    "payout": 3.00,
    "metadata": {
      "geo": "US,CA",
      "notes": "Updated payout for Q1"
    }
  }'
Python
import requests

offer_id = "664f1a2b3c4d5e6f7a8b9c0d"

response = requests.put(
    f"https://app.tracklysms.com/api/v2/offers/{offer_id}",
    headers={
        "X-Api-Key": "trk_your_api_key_here",
        "Content-Type": "application/json"
    },
    json={
        "name": "Summer Promo v2",
        "payout": 3.00,
        "metadata": {
            "geo": "US,CA",
            "notes": "Updated payout for Q1"
        }
    }
)

data = response.json()
print(data["offer"]["name"], data["offer"]["payout"])
Node.js
const offerId = "664f1a2b3c4d5e6f7a8b9c0d";

const response = await fetch(
  `https://app.tracklysms.com/api/v2/offers/${offerId}`,
  {
    method: "PUT",
    headers: {
      "X-Api-Key": "trk_your_api_key_here",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      name: "Summer Promo v2",
      payout: 3.00,
      metadata: {
        geo: "US,CA",
        notes: "Updated payout for Q1"
      }
    })
  }
);

const data = await response.json();
console.log(data.offer.name, data.offer.payout);
{
  "id": "664f1a2b3c4d5e6f7a8b9c0d",
  "slug": "ofr_summer-promo-v2_a1b2c3",
  "name": "Summer Promo v2",
    "tracking_url": "https://track.example.com/click?offer_id=123",
    "external_platform": "tune",
    "external_id": "4521",
    "advertiser_id": "adv_882",
    "payout": 3.00,
    "payout_type": "cpa",
    "filter_bots": true,
    "status": "active",
    "metadata": {
      "vertical": "health",
      "geo": "US,CA",
      "notes": "Updated payout for Q1"
    },
    "created_at": "2025-11-01T14:30:00",
    "updated_at": "2026-01-10T16:45:00"
}

Error Codes

HTTP StatusError CodeDescription
400name_too_longThe name exceeds 255 characters.
400invalid_external_platformThe external_platform value is not tune, everflow, or null.
400invalid_payout_typeThe payout_type value is not cpa or cpc.
400invalid_statusThe status value is not active, paused, or archived.
401unauthorizedAPI key is missing or invalid.
404not_foundNo offer exists with the specified ID.
500server_errorAn unexpected error occurred on the server.

Next Steps

Offers Overview

Manage offers and payouts

Record Revenue

Track revenue for this offer