Skip to content

Update channels, rules and quiet hours

PUT
/notifications/settings
curl --request PUT \
--url https://api.flotera.com/api/v1/notifications/settings \
--header 'Content-Type: application/json' \
--cookie __Host-erm_session=<__Host-erm_session> \
--data '{ "rules": { "additionalProperty": { "telegram": true, "email": true } }, "quiet_hours": { "enabled": true, "from": "example", "to": "example" }, "channels": { "telegram": { "status": "connected" }, "email": { "status": "connected", "address": "hello@example.com" } } }'

Partial update semantics: only provided rules/channels/quiet-hours fields change. Email rules are accepted only for events listed in crit_event_keys (422 otherwise). Setting a channel status to connected resumes a paused-but-linked channel; the first connection goes through the dedicated link/verification flow.

Idempotency-Key
string
>= 1 characters <= 128 characters /^[\x21-\x7E]{1,128}$/

Idempotency key, 1–128 ASCII, unique per (tenant_id, operation, key) for at least 24 hours. Retrying with the same body replays the stored response; a different body returns 409 idempotency_conflict.

If-Match
string
<= 256 characters

Optimistic concurrency guard on the resource version; mismatched tag returns 412.

Media typeapplication/json
object
>= 1 properties
rules
object
key
additional properties
object
telegram
boolean
email
boolean
quiet_hours
object
enabled
boolean
from
string
/^([01][0-9]|2[0-3]):[0-5][0-9]$/
to
string
/^([01][0-9]|2[0-3]):[0-5][0-9]$/
channels
object
telegram
object
status
string
Allowed values: connected paused not_connected
email
object
status
string
Allowed values: connected paused not_connected
address

Becomes connected only after the verification flow completes.

string format: email
<= 254 characters

Updated settings.

Media typeapplication/json
object
channels
required
object
telegram
required
object
kind
required
string
Allowed values: telegram email
status
required
string
Allowed values: connected paused not_connected
destination_masked

Masked recipient (telegram username / partially hidden email); never the raw PII beyond what the owner entered.

string | null
<= 128 characters
verified_at

RFC 3339 UTC with microsecond precision, or null.

string | null format: date-time
disabled_reason
string | null
<= 256 characters
email
required
object
kind
required
string
Allowed values: telegram email
status
required
string
Allowed values: connected paused not_connected
destination_masked

Masked recipient (telegram username / partially hidden email); never the raw PII beyond what the owner entered.

string | null
<= 128 characters
verified_at

RFC 3339 UTC with microsecond precision, or null.

string | null format: date-time
disabled_reason
string | null
<= 256 characters
rules
required

Matrix keyed by event category (rental/temp/error/offline/price/maint/balance/payment/weekly).

object
key
additional properties
object
telegram
required
boolean
email
required
boolean
quiet_hours
required
object
enabled
required
boolean
from
required

Local time HH:MM in the account timezone.

string
/^([01][0-9]|2[0-3]):[0-5][0-9]$/
to
required

Local time HH:MM in the account timezone.

string
/^([01][0-9]|2[0-3]):[0-5][0-9]$/
event_keys
required
Array<string>
<= 32 items
crit_event_keys
required

Email is allowed only for these categories; critical deliveries ignore quiet hours.

Array<string>
<= 32 items
version
required

Monotonic resource version used for ETag/If-Match.

integer
Example
{
"channels": {
"telegram": {
"kind": "telegram",
"status": "connected"
},
"email": {
"kind": "telegram",
"status": "connected"
}
}
}

Missing/invalid credentials (code=unauthorized).

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

Authenticated but not permitted. code=forbidden — role/scope mismatch; code=feature_not_entitled — the plan does not include the capability; code=account_frozen — the account is frozen and this operation is declared x-ermeon-frozen: deny. The three are deliberately distinct: only the last one is fixed by a top-up (13 §5.6).

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

State conflict (code=conflict, idempotency_conflict, offline_queue_full or online_queue_full).

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

If-Match entity tag does not match the current version.

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

Request failed validation (code=validation_failed), with per-field errors.

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}