Update goal
Updates an existing goal.
Authorizations
Preferred authentication method. Pass the API key in the X-API-Key HTTP request header. The user account must have api_status enabled.
Body
128Goal status to set: 1=active, 3=inactive.
Default conversion status: 2=approved, 3=pending, 4=rejected, 5=trash.
0, 1 0, 1 640, 1 0, 1 Per-country payouts. Default goal only — for a non-default goal the key is ignored and the request still returns 200. A non-empty list fully replaces the previous set and turns the "Payout by Country" toggle on; an empty array ([]) clears all per-country payouts and turns the toggle off. Omit the key to leave the current payouts untouched — there is no separate toggle field in the body. Every row must carry amounts (see payout), so a non-empty list always leaves the toggle on. If a goal ends up with both this and payoutByTier enabled, per-country wins wherever the click's country is known; on the conversion paths that gate the country branch on a resolved country, a click whose country could not be resolved falls through to the per-tier payout instead. Enable only one of the two per goal. Row shape: [{"country": 690791, "payout": 5, "revenue": 8}]. Note the read/write asymmetry: GET returns country as an object ({"id": …, "title": …, "code": …}) and each amount as an object ({"value": 5, "mod": "fixed"}), while PUT takes a plain country ID and plain numbers — a GET response cannot be sent back as-is.
Per-affiliate-tier payouts. Default goal only — for a non-default goal the key is ignored and the request still returns 200. Any list you send fully replaces the previous set. The "Payout by Tier" toggle then follows the rows that actually carry amounts: it is turned on when at least one row has a non-zero payout or revenue, and turned off otherwise. So an empty array ([]) and a list of amount-less rows ([{"id": 1}]) both clear the per-tier payouts and disable the toggle. Omit the key to leave the current payouts untouched — there is no separate toggle field in the body. Row shape: [{"id": 1, "payout": 6, "revenue": 9}]. Two further limits are worth knowing, because neither produces an error: when a goal ends up with both this and payoutByCountry enabled, per-country takes precedence and the per-tier amounts normally go unused — except on the conversion paths that gate the country branch on a resolved country, where a click with an unresolved country falls through to the per-tier payout, making the effective payout depend on geo resolution. Enable only one of the two per goal. And per-tier payouts are additionally gated by the platform-level affiliate-tiers setting — while that setting is off, stored per-tier payouts are ignored on conversions even though this endpoint accepts and saves them. The read/write asymmetry is also wider here than for payoutByCountry, and it bites on round-trips: GET returns a tier object and {"value": …, "mod": …} amounts instead of plain IDs and numbers, and it lists every tier on the platform, filling in the goal's own payout / revenue wherever a tier has no stored row. Converting that list back into a PUT body would pin a real row to every tier at the goal's current default, after which changing the goal's own payout stops affecting any tier. payoutByCountry has no such behaviour — there GET returns only the stored rows.