Skip to content

Set referral reward rules ​

PUT /v1/admin/catalog/referral-rules

  • Operation ID: setCatalogReferralRules
  • Tags: Catalog: referral rules
  • Base URL: http://localhost:8787

Merges referral_reward_credits into the credits settings draft and publishes it immediately, so any other pending draft keys in that section are published too. note becomes the publish note (default referral rules). The database function additionally enforces billing.write and audits.

Workflow: Integration guide.

Authentication: staff Bearer JWT with permission billing.write.

Authentication ​

  • Auth: staff Bearer JWT (Authorization: Bearer <access_token>) with the permissions below.
  • Required permissions: billing.write

Request body ​

Required: yes.

Content type: application/json

Schema: object

FieldTypeRequiredDescription
referral_reward_creditsintegeryesMin: 0. Max: 1000000
notestringnoMax length: 500

Responses ​

200 ​

Published.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object

FieldTypeRequiredDescription
referral_reward_creditsintegeryes-
published_versionintegeryes-

Errors ​

400 ​

Request validation failed.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ValidationErrorBody)

FieldTypeRequiredDescription
successbooleanyesOne of: false
errorobjectyes-
error.namestringyesOne of: "ZodError"
error.issuesobject[]yes-
error.issues[].codestringyes-
error.issues[].path(string | number)[]yes-
error.issues[].messagestringyes-

Request validation

json
{
  "success": false,
  "error": {
    "name": "ZodError",
    "issues": [
      {
        "code": "custom",
        "path": [
          "field"
        ],
        "message": "Invalid value"
      }
    ]
  }
}

401 ​

Missing, malformed, expired or wrong-audience Bearer token (missing_token, invalid_token, invalid_audience).

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody)

FieldTypeRequiredDescription
errorstringyesStable machine-readable error code, e.g. forbidden, not_found.
detailsanynoOptional structured context. For 403 it is { perm }.

Error response

json
{
  "error": "missing_token"
}

403 ​

Authenticated but lacking the required permission. details.perm lists the accepted permission keys.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody), fields as described above.

Error response

json
{
  "error": "forbidden",
  "details": {
    "perm": "billing.write"
  }
}

500 ​

Unexpected server error (internal). No details are returned.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody), fields as described above.

Error response

json
{
  "error": "internal"
}

Examples ​

curl ​

bash
curl -X PUT 'http://localhost:8787/v1/admin/catalog/referral-rules' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"referral_reward_credits":1,"note":"example"}'

TypeScript ​

ts
const accessToken = process.env.ACCESS_TOKEN; // user JWT from your sign-in flow

const response = await fetch("http://localhost:8787/v1/admin/catalog/referral-rules", {
  method: "PUT",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "referral_reward_credits": 1,
    "note": "example"
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = response.status === 204 || response.status === 205
  ? undefined
  : response.headers.get("content-type")?.includes("json")
    ? await response.json()
    : await response.text();

Try this endpoint

Requests go directly from your browser to the API. Send request executes this endpoint against the selected server.

PUT/v1/admin/catalog/referral-rules

Your token stays in this tab's memory and is sent only when you press Send request.

Request body (required)

Built for developers. Ready for agents.