Skip to content

DLR statuses

The status carried by each entry in a delivery report — inside transactions[] from dlr and dlrByDate, and in the status field of a pushed DLR.

This is a different scale from the request status codes, which say whether the API accepted your call. Here, 0 and 102 both mean delivered; the top-level 0 on the same response only means the report was produced.

Each transaction also carries he_message and en_message — the same status spelled out in Hebrew and English. The English column below is that gloss.

Delivered

Statushe_messageMeaning
0הגיע ליעדDelivered to the handset.
102הגיע ליעדDelivered to the handset. The value most live traffic settles on.

Sent, outcome unknown

Statushe_messageMeaning
-1נשלח - ללא אישור מסירהSent, but the carrier returned no delivery confirmation. Not a failure — simply unconfirmed.
2TimeoutNo confirmation arrived within the carrier's window.

Not delivered

Statushe_messageMeaning
1נכשלFailed.
3נכשלFailed.
4נכשל סלולרFailed at the mobile network.
5נכשלFailed.
6נכשלFailed.
14נכשל סלולר - עבר תהליך של store&forwardFailed at the mobile network after the store-and-forward retry cycle — the network held the message and still could not deliver it.
101לא הגיע ליעדNot delivered.
103פג תוקףExpired before it could be delivered — typically a handset that stayed unreachable.
104נמחקDeleted before delivery.
105לא הגיע ליעדNot delivered.
106לא הגיע ליעדNot delivered.
107לא הגיע ליעדNot delivered.
108נדחהRejected by the network.
109132לא הגיע ליעדNot delivered. A block of carrier-specific failure codes that all mean the same thing to you.
747מנוי נמצא מחוץ לכיסוי רשת מקומיתSubscriber outside local network coverage — roaming or out of range.

Blocked or refused

These are policy outcomes, not network faults. A number that produces them will keep producing them until something changes on the account or the subscriber's side.

Statushe_messageMeaning
15מספר כשרA kosher (filtered) handset, which does not accept regular SMS. Reach these with a voice message instead — tts.type 2 routes SMS to normal handsets and a call to filtered ones automatically.
16אין הרשאת שעת שליחהSending was not permitted at that hour.
17חסום להודעות פירסומיותThe subscriber is blocked for marketing messages.
18הודעה לא חוקיתThe message was judged illegal or non-compliant.
201נחסם לפי בקשהBlocked at the subscriber's own request — an opt-out. See Opt-out & compliance.

Account and system

Statushe_messageMeaning
7אין יתרהNo credit at the moment of sending.
998אין הרשאהNot authorised.
999שגיאה לא ידועהUnknown error.

Reading them in code

Rather than switching on every value, sort them into the four outcomes that actually drive behaviour:

js
const DELIVERED = new Set(['0', '102'])
const PENDING = new Set(['-1', '2'])
const BLOCKED = new Set(['15', '16', '17', '18', '201'])

function outcome(status) {
  const code = String(status)

  if (DELIVERED.has(code)) return 'delivered'
  if (PENDING.has(code)) return 'unconfirmed'
  if (BLOCKED.has(code)) return 'blocked' // do not retry this number
  return 'failed'
}
python
DELIVERED = {"0", "102"}
PENDING = {"-1", "2"}
BLOCKED = {"15", "16", "17", "18", "201"}


def outcome(status):
    code = str(status)

    if code in DELIVERED:
        return "delivered"
    if code in PENDING:
        return "unconfirmed"
    if code in BLOCKED:
        return "blocked"  # do not retry this number
    return "failed"
php
<?php

const TEXTME_DELIVERED = ['0', '102'];
const TEXTME_PENDING = ['-1', '2'];
const TEXTME_BLOCKED = ['15', '16', '17', '18', '201'];

function textme_outcome(string|int $status): string
{
    $code = (string) $status;

    return match (true) {
        in_array($code, TEXTME_DELIVERED, true) => 'delivered',
        in_array($code, TEXTME_PENDING, true) => 'unconfirmed',
        in_array($code, TEXTME_BLOCKED, true) => 'blocked', // do not retry
        default => 'failed',
    };
}

unconfirmed is worth keeping separate from failed. A -1 usually did arrive; treating it as a failure and resending means charging yourself twice to deliver one message.