Splashify RCS

Docs

Open panel
Panel

Daily spend limit

A limit in rupees for one India day. Once today's spend reaches it, new broadcasts are refused until midnight. The account owner reads and sets it from a signed-in panel session.

http
GET /api/v1/rcs/spend-limit
PUT /api/v1/rcs/spend-limit

A day runs midnight to midnight, India time (IST). Today's spend is what was charged today, on prepaid and postpaid accounts alike: the same figure as the spend on your dashboard. Money held for a broadcast that has not sent yet is not spend.

Who can call it

Only the account owner, from a signed-in panel session. Operators and viewers get 403 not_owner. An API key gets 403 api_key_endpoint_not_allowed at any scope, so a leaked key cannot lift the guard on your spending.

Read the limit

GET

/api/v1/rcs/spend-limit

JWTowner
json
{
  "success":     true,
  "daily_limit": 5000,
  "today_spend": 4120.5,
  "spend_known": true,
  "percent":     82.41,
  "state":       "near",
  "day":         "2026-09-27",
  "resets_at":   "2026-09-27T18:30:00Z"
}

With no limit set:

json
{
  "success":     true,
  "daily_limit": null,
  "today_spend": 4120.5,
  "spend_known": true,
  "percent":     null,
  "state":       "none",
  "day":         "2026-09-27",
  "resets_at":   "2026-09-27T18:30:00Z"
}

Set or turn off the limit

PUT

/api/v1/rcs/spend-limit

JWTowner
http
PUT /api/v1/rcs/spend-limit
{ "daily_limit": 5000 }
  • A number from 1 to 10000000 (₹1 to ₹1,00,00,000) sets the limit. It is rounded to 2 decimals.
  • null or 0 turns the limit off.

The change counts at once, and the answer is the same body as the GET. After a change, the owner is told again if the new limit is crossed that day; the email still comes at most once a day. Every change is recorded in the audit log as settings.spend_limit_updated, with the new and the previous limit.

What the limit refuses

Once state is reached, these calls answer HTTP 409 before the broadcast itself is checked. Nothing is saved, started or held.

json
{
  "success":     false,
  "error":       "spend_limit_reached",
  "code":        "spend_limit_reached",
  "message":     "Today's spend limit of ₹5,000 is reached. New broadcasts can start again after midnight, or the account owner can raise the limit in Settings.",
  "daily_limit": 5000,
  "today_spend": 5012.4,
  "resets_at":   "2026-09-27T18:30:00Z"
}

Branch on code. Wait until resets_at, or ask the owner to raise the limit.

While the limit is reached, the send side also acts on its own:

  • A scheduled broadcast that has never sent and falls due does not start. It ends failed with status_reason: "spend_limit_reached" on Get. Nothing is sent, and a prepaid hold is released. Send it again with a new Create.
  • A recurring run that falls due is skipped: no child broadcast, and the schedule carries on at its next time.

Not refused and not stopped:

  • A broadcast that is already running, including one paused overnight by the promotional time window. A day's spend can pass the limit.
  • Single messages from send message, and test sends.
  • Retarget, which only builds a list.
  • Creating, updating, pausing or resuming a recurring broadcast.

It fails open

The limit guards your budget. If the limit or today's spend cannot be read at that moment, the call goes through rather than refusing a send. A charge that is reported very late can also be left out of that day's total, so a day can pass the limit by that amount.

Live event

When today's spend passes 80% or 100% of the limit, the panel's live event stream carries a spend.alert event:

json
{
  "type": "spend.alert",
  "data": {
    "state":       "near",
    "daily_limit": 5000,
    "today_spend": 4120.5,
    "percent":     82.41,
    "day":         "2026-09-27"
  }
}

state is near or reached. Each crossing is sent once a day, and again after the limit is changed. Today's spend is checked every few minutes, so the event can come a few minutes after the line is crossed.