Journey Docs
Partner API

Partner API

API for property staff and hotel management systems to manage loyalty programs, fulfillments and guest intelligence

The Partner API gives property staff, hotel management systems, and partner integrations access to loyalty program configuration, the Action Center, member and reservation lookup, guest intelligence, and partner pages — all scoped to your organization.

Base URL

Every partner route is served under /v1. The version is part of the path, so it is already included in the base URLs below.

EnvironmentBase URL
Productionhttps://api-prd.cf.journey.com/v1
Sandbox (staging)https://api-stg.cf.journey.com/v1

Staging is the partner sandbox and is paired with the WorkOS staging environment, so staging credentials are separate from production credentials.

https://api-prd.cf.journey.com/v1/partner/fulfillments/search

Authentication

Send your partner API key in the X-API-Key header:

X-API-Key: jny_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Earlier versions of this page showed Authorization: Bearer jny_… for API keys. That is not what the server reads today and it returns 401. Use X-API-Key. Accepting the key as a Bearer token is the target behaviour and is tracked on the Partner authentication page.

Operator-driven surfaces (an actual person signed in to HXP) authenticate with that operator's WorkOS access token instead:

Authorization: Bearer <workos-access-token>

Core resolves the organization, permissions and venue reach from the verified token. See Partner authentication for the full model, including what is live today and what is coming soon.

Scopes

Each route requires one permission string. These are the real values the server checks — the earlier FULFILLMENTS.READ style names were internal constant names, not wire values.

AreaScopes
Loyalty programs and tierspartner:loyalty:programs:read, partner:loyalty:programs:write
Benefits and entitlementspartner:loyalty:benefits:read, partner:loyalty:benefits:write
Arrivalspartner:arrivals:read, partner:arrivals:write
Fulfillmentspartner:fulfillments:read, partner:fulfillments:write
Reservationspartner:reservations:read
Guests and memberspartner:guests:read
Guest PII (invites, Windfall)partner:guests:read and partner:guests:pii:read
Teammate venue reachpartner:access:read, partner:access:write
Theme kitspartner:theme-kits:read, partner:theme-kits:manage
Custom domainspartner:custom-domains:read, partner:custom-domains:manage
Partner pagespartner:pages:read, partner:pages:manage
Point multiplierspartner-details:read
Offer code poolsoffers:codes:read, offers:codes:write

The PII-bearing routes (/partner/vguests/guest-invites and /partner/windfall/*) require both partner:guests:read and partner:guests:pii:read. Holding only the PII scope is not enough.

Conventions

Idempotency-Keyheaderstringrequired

Required on every POST, PUT, PATCH and DELETE. Replaying the same key with the same body returns the original response plus X-Idempotent-Replay: true. The same key with a different body returns 409. Keys longer than 255 characters return 400.

X-Emulate-Org-Idheaderstring

Journey staff only. Optionally paired with X-Emulate-Property-Ids. Emulation only ever narrows access; it never grants permissions.

  • IDs are external. Requests and responses use external ids (UUID v7, ULID or HMS external id). The two exceptions are memberId on GET /partner/windfall/members/:memberId and inviteId on the guest-invite routes, which are internal integers.
  • Organization scope comes from your credential. A partner credential ignores ?organizationId=; only Journey staff with global scope may send it.
  • 404 means "not found or not yours". The two cases are deliberately indistinguishable.
  • Responses are additive-only. New fields appear over time; ignore fields you do not recognise.

Errors

Every error uses the same shape:

{
  "type": "validation_error",
  "timestamp": "2026-10-09T18:22:41.218Z",
  "code": "ambiguous_credentials",
  "message": "Conflicting credentials were supplied.",
  "details": {
    "reason": "Authorization and X-API-Key carried different credentials."
  }
}
StatusMeaning
400Validation failed, or conflicting credentials (ambiguous_credentials)
401Missing, invalid, expired or revoked credential
403Authenticated, but missing the required scope or organization
404Not found, or outside your organization and venue reach
409Conflicts with current state, or an idempotency key was reused

Webhooks

There are no outbound partner webhooks today. Poll GET /partner/arrivals and GET /partner/fulfillments/pending for the Action Center feeds. See Partner webhooks for what is planned.

Core features

On this page