Skip to content

Public referral and signup reward terms

GET
/open/v1/referral/terms
curl --request GET \
--url https://api.harperharbor.com/open/v1/referral/terms

Returns the current referral and signup reward rules for pages that signed-out visitors can see. No sign-in needed, and any Authorization header is ignored. Show these values instead of hard-coding reward numbers: they can change. The response holds no account data and may be cached for 5 minutes.

Reward terms.

Media typeapplication/json

Reward rules anyone can read. All rewards are credits usable for agent conversations only.

object
enabled
required

Whether referral rewards are being granted right now. The numbers still describe the configured rules when this is false.

boolean
welcomeCredits
required

Credits a new user receives when entering a code. Each sign-in identity receives them once, and disposable email addresses receive none.

integer
welcomeDays
required

How many days the welcome credits stay valid; 0 means permanent (the current newcomer welcome gift).

integer
firstPercent
required

Percentage of the referred user’s first top-up credited to the referrer once the payment has succeeded and the referral is bound. A top-up made before binding still counts as the first.

number
firstCap
required

Maximum credits the referrer receives for one first top-up.

integer
inviteePercent
required

Extra percentage the referred user receives on their own first top-up, including one made before binding. 0 when not offered.

number
rebatePercent
required

Percentage of each later top-up by the referred user credited to the referrer as soon as the payment succeeds.

number
rebateDays
required

How many days after binding the referred user’s top-ups keep earning the referrer rewards.

integer
bindDays
required

How many days after sign-up a new account can still enter a code.

integer
signupWelcomeCredits
required

Credits every new account receives at sign-up, whether or not a referral code is used. 0 when not offered.

integer
signupWelcomeDays
required

How many days the sign-up credits stay valid.

integer
inviterCredits

Platform-funded credits for the original referrer of each eligible new-user binding during the inviter promotion; 0 outside the promotion. Independent of the ongoing newcomer welcome gift and the application campaign pool. Valid for inviterDays days (0 means permanent); replaying or switching the binding does not issue another gift.

integer
inviterStartAt

Inclusive start of the inviter promotion, when configured.

string format: date-time
inviterEndAt

Exclusive end of the inviter promotion, when configured.

string format: date-time
inviterDays

Validity in days of the separate inviter promotion credit, measured from its issuance; independent of welcomeDays. 0 means permanent credits with no expiry.

integer
firstChatCredits
required

Credits the original referrer receives when the referred friend completes their first successful, charged conversation within firstChatDays of binding. 0 outside the inviter promotion or when this reward is disabled. Eligibility uses the binding time within inviterStartAt (inclusive) and inviterEndAt (exclusive).

integer
firstChatDays
required

Days after binding in which the friend must complete their first successful, charged conversation. Returned even when firstChatCredits is 0. Eligible transition bindings use the new-rules launch plus this window; use each invite firstChatBy rather than calculating a deadline.

integer
Examplegenerated
{
"enabled": true,
"welcomeCredits": 1,
"welcomeDays": 1,
"firstPercent": 1,
"firstCap": 1,
"inviteePercent": 1,
"rebatePercent": 1,
"rebateDays": 1,
"bindDays": 1,
"signupWelcomeCredits": 1,
"signupWelcomeDays": 1,
"inviterCredits": 1,
"inviterStartAt": "2026-04-15T12:00:00Z",
"inviterEndAt": "2026-04-15T12:00:00Z",
"inviterDays": 1,
"firstChatCredits": 1,
"firstChatDays": 1
}

referral_disabled — reward terms are not available right now.

Media typeapplication/json
object
error
required

Error code (snake_case) or, for legacy handlers, a free-text/localized message.

string
message

Human-readable sentence. Present only on middleware errors and /me, /me/wallet.

string
retryable

Whether retrying may succeed. Present only on middleware errors, /me, /me/wallet and service/share routes.

boolean
required_context_tier

Only on a first-turn context_capacity_exceeded: the smallest context tier that fits the whole card with room to talk. Save it as context in player settings and resend. Absent when no tier fits.

integer
>= 1 <= 5
required_context_tokens

The token budget of required_context_tier for the selected model, for display.

integer
constant_lore_trim_fits

Only on a first-turn context_capacity_exceeded: whether saving trimConstantLore=true lets the card play at the current tier. Absent on mid-conversation capacity errors.

boolean
credits_needed

Only on insufficient_credits: the credits this turn needs before it can start. Absent when the refusal came without an estimate.

integer
credits_available

Only on insufficient_credits: the credits the wallet could set aside for it.

integer
Examplegenerated
{
"error": "example",
"message": "example",
"retryable": true,
"required_context_tier": 1,
"required_context_tokens": 1,
"constant_lore_trim_fits": true,
"credits_needed": 1,
"credits_available": 1
}