Journey Docs
Partner API ExplorerLoyaltyPrograms

Create a loyalty program

Required scopepartner:loyalty:programs:write
POST
/v1/partner/loyalty/programs

Creates a program in draft. It earns nothing and shows nowhere until it is activated.

Authorization

headerAuthorizationBearer <token>

WorkOS access token (JWT) for a user who is a member of the partner organization. The organization the request is scoped to is taken from the token, not from a header or query parameter.

Only a JWT is accepted in this header. A Journey jny_ API key sent as a bearer token is rejected with 401 Invalid or expired token; send it in X-API-Key instead.

WorkOS organization API keys are not accepted yet.

Request Body

application/json
  1. body
name*string
Length1 <= length <= 200
organizationId?string

External org ID for global-scope (superadmin) callers creating within a specific org. Partner tokens ignore this — they are scoped to their own org.

ownerExternalId?string

EXTERNAL identifier of the owning brand (document/external id) or venue (property external id). REQUIRED when ownerType is brand or venue; rejected for org, which is always owned by the calling organization.

Never an internal id — the server resolves it and refuses anything the caller's org does not own (non-disclosing 404).

Lengthlength <= 255
ownerType?string

Program SCOPE (OpenSpec add-partner-loyalty-tiers, B1.1). Defaults to org — which is what every pre-tiers program is — so omitting both fields keeps the original create contract byte-for-byte.

Stay-credit attribution is highest-specificity-wins: a stay credits the most specific active program covering the property (venue > brand > org) and no less-specific one, so this is the field that decides which program a stay qualifies toward.

Value in"brand""org""venue"

Response Body

The newly created draft program.

curl -X POST 'https://api-prd.cf.journey.com/v1/partner/loyalty/programs' \  -H 'Content-Type: application/json' \  -d '{  "name": "string"}'
Empty