Every change to the public API that affects an integration, newest first, dated by the day it reached production. Entries marked breaking would make an integration written against the earlier contract misbehave. Deprecated fields keep working until a removal is listed here. For the current contract, see the API reference and the developer guide.
A 504 now means the outcome is unknown and the same request should be resent; partner rejections come back as a 400 with the partner's text; transactions carry a status and failed ones are listed.
POST /transactionsGET /transactionsGET /transactions/{transactionId}
Added
504 Gateway Timeout on Issue Points. Cosmo holds the request for up to 30 seconds while the partner is called, so set your client timeout to 31 seconds or more. A 504, a dropped connection or no response means the outcome is unknown: do not reverse anything, resend the exact same request with the same referenceNumber until you get a definitive answer. A resend never issues points twice.
Changed
503 is a definitive failure, not a timeout: the transaction is recorded as FAILED, no points were issued, and the reference number is consumed. 500 is also definitive, and the reference number may be reused.
Added
Partner rejections on Issue Points. When the partner program refuses the credit (unknown, blocked or closed membership, for example) the 400 carries a second shape: errorCode, message, and data.partnerError with the partner's own error text. The reference number stays used.
Added
409 with errorCodeTRANSACTION_FAILED when a reference number belongs to a failed transaction, alongside the existing CONFLICT for reuse with different transfer details.
Added
status on every transaction read, COMPLETED or FAILED. The transaction list now includes failed transactions, so filter on status rather than assuming every listed transaction succeeded. Point transactions are empty unless the status is COMPLETED.
Changed
On transaction reads, sourceValue is renamed localCurrencyValue, and the nested destination object (name, programId) is replaced by destinationProgramId.
Changed
Point transaction type is now BASE, PARTNER_CAMPAIGN or CLIENT_CAMPAIGN; it was BASE or CAMPAIGN.
Deprecated
partnerTransactionId on Issue Points responses. Reconcile on id and referenceNumber instead.
For partner programs that offer no member-validation API, isValid reports that the submitted details pass the program's format rules, not that the member exists.
POST /programs/{programId}/validate-memberPOST /multibrand/programs/{programId}/validate-member
Changed
isValid is documented per partner: where the program exposes a validation endpoint it confirms membership; where it does not, it confirms only that the details satisfy the program's validation rules and says nothing about eligibility to receive points. The per-program rules are listed on the Partner Validation Support and Rules page.
Campaigns expose who funds the bonus, programs expose four point-based transfer limits, and Issue Points takes basePoints and bonusPoints instead of value and currency.
GET /campaignsGET /programsPOST /transactionsPOST /transactions/preview
Added
fundedBonusPercentage and partnerFundedBonusPercentage on campaigns. The bonus to send is floor(basePoints × fundedBonusPercentage / 100); the total bonus is the sum of the two.
Deprecated
yourCostSharePercentage and extraPointsPercentage on campaigns, replaced by the two fields above.
Added
basePoints and optional bonusPoints on Issue Points. Send either basePoints (with bonusPoints where a campaign applies) or the older value and currency pair.
Deprecated
value and currency on Issue Points. Use basePoints.
Added
minAllowedPoints and maxAllowedPoints (set by you) and partnerMinAllowedPoints and partnerMaxAllowedPoints (set by the partner) on programs, all expressed in destination points. New 400 error codes MIN_SOURCE_NOT_REACHED, MAX_SOURCE_EXCEEDED, MIN_DESTINATION_NOT_REACHED and MAX_DESTINATION_EXCEEDED when a transfer falls outside them.
Deprecated
minAmountOfPoints, maxAmountOfPoints, minValue and maxValue on programs, replaced by the four limits above.
Deprecated
POST /transactions/preview. Compute the points from the program's limits and the campaign's percentages instead.
The new fields first landed on 23 September under interim names (sourceMinAllowedPoints, destinationMinAllowedPoints, yourFundedBonusPercentage) and were renamed the next day. Only the names above are supported.
Both endpoints require a unique referenceNumber, share one namespace, and return the original transaction on a replay.
POST /multibrand/creditPOST /multibrand/debit
Changed
referenceNumber is required and must be unique across your Multibrand transactions. Credit and debit share a single namespace, so a reference number used on one cannot be reused on the other. A reference number is never released.
Added
200 on a replay: the same referenceNumber with identical details returns the original transaction (sourceUserId, sourceProgramId, valueInSourceLocalCurrency, valueInUsd, localCurrency, status, createdAt, executionDate) and the user is not credited or debited again. Status is PENDING, MATURED or EXECUTED.
Added
409 with errorCodeCONFLICT when the reference number was used with different details, or while the original request is still being processed.
referenceNumber is required and unique; a retry with the same details returns the original transaction instead of creating a second one.
POST /transactions
Changed
referenceNumber is required and must be unique across all your transactions. It is the de-duplication key for the endpoint.
Added
200 on a replay: the same referenceNumber with identical transfer details returns the original transaction (id, totalPoints, referenceNumber, date) and the partner is not credited again. A new transaction still returns 201.
Added
409 with errorCodeCONFLICT when the reference number was already used with different transfer details, or while the original transaction is still pending.
Every endpoint documents 403, the lookups document 404, list endpoints validate their query parameters, 400s carry an errorCode, and a new transaction returns 201.
POST /transactionsPOST /oauth2/tokenAll authenticated endpoints
Changed
Issue Points returns 201 Created for a new transaction. It returned 200 before. Clients that check for exactly 200 must accept 201.
Added
403 Forbidden on every authenticated endpoint; 404 on profile, transaction and program-connection lookups; 422 on list endpoints when a query parameter is missing or invalid; 500 and 503 on Issue Points.
Added
errorCode on 400 responses: BLOCKED_USER, DESTINATION_BLOCKED_USER, PARTNERSHIP_NOT_FOUND, INVALID_CURRENCY, PARTNER_CODE_REQUIRED, MIN_POINTS_NOT_REACHED, MAX_POINTS_EXCEEDED, MIN_VALUE_NOT_REACHED, MAX_VALUE_EXCEEDED and BAD_REQUEST.
Changed
Token endpoint errors follow OAuth 2.0: 400 with error invalid_request or unsupported_grant_type, and 401 for invalid client credentials. They were 401 and 422.
Optional destinationUserFirstName and destinationUserLastName, for programs that need the member's name.
POST /transactionsPOST /transactions/previewPOST /programs/{programId}/validate-memberPOST /multibrand/credit
Added
destinationUserFirstName and destinationUserLastName as optional request fields on Issue Points, preview, validate-member and Multibrand credit. Both are echoed in transaction responses.
Nine Multibrand endpoints join the public reference, the connections routes move under program-connections, and the connection object is simplified.
GET /multibrand/programsPOST /multibrand/programs/{programId}/validate-memberGET /multibrand/currenciesPOST /multibrand/creditGET /multibrand/transactions/multibrand/debitGET /multibrand/balanceGET /multibrand/balance/pending-pointsGET /multibrand/statistics/multibrand/program-connections
Added
Public endpoints for Multibrand: programs, member validation, currencies, credit, the transaction list, debit, balance, pending points and monthly statistics.
Changed
/multibrand/multibrand-connections, its history and its delete route are renamed /multibrand/program-connections, /multibrand/program-connections/history and /multibrand/program-connections/{id}.
Changed
The program connection object is flattened: destinationUserId and destinationUserEmail sit at the top level, and connections is a list of percentage and destinationProgramId.
Deprecated
pricePerPoint and currency on programs. Use pricePerPointInUsd, pricePerPointInLocalCurrency and localCurrency. Removed in September 2026.
Changed
startDate and endDate on the campaigns list are optional.