Public referral and signup reward terms
const url = 'https://api.harperharbor.com/open/v1/referral/terms';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.harperharbor.com/open/v1/referral/termsReturns 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.
Responses
Section titled “Responses”Reward terms.
Reward rules anyone can read. All rewards are credits usable for agent conversations only.
object
Whether referral rewards are being granted right now. The numbers still describe the configured rules when this is false.
Credits a new user receives when entering a code. Each sign-in identity receives them once, and disposable email addresses receive none.
How many days the welcome credits stay valid; 0 means permanent (the current newcomer welcome gift).
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.
Maximum credits the referrer receives for one first top-up.
Extra percentage the referred user receives on their own first top-up, including one made before binding. 0 when not offered.
Percentage of each later top-up by the referred user credited to the referrer as soon as the payment succeeds.
How many days after binding the referred user’s top-ups keep earning the referrer rewards.
How many days after sign-up a new account can still enter a code.
Credits every new account receives at sign-up, whether or not a referral code is used. 0 when not offered.
How many days the sign-up credits stay valid.
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.
Inclusive start of the inviter promotion, when configured.
Exclusive end of the inviter promotion, when configured.
Validity in days of the separate inviter promotion credit, measured from its issuance; independent of welcomeDays. 0 means permanent credits with no expiry.
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).
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.
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.
object
Error code (snake_case) or, for legacy handlers, a free-text/localized message.
Human-readable sentence. Present only on middleware errors and /me, /me/wallet.
Whether retrying may succeed. Present only on middleware errors, /me, /me/wallet and service/share routes.
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.
The token budget of required_context_tier for the selected model, for display.
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.
Only on insufficient_credits: the credits this turn needs before it can start. Absent when the refusal came without an estimate.
Only on insufficient_credits: the credits the wallet could set aside for it.
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}