Skip to main content

Exit Code, Signal & errno Lookup API

REAL DATA

What does exit code 137, 127 or 1 mean? POSIX signals, errno values, the 128+n shell convention and the container conventions, each with its source.

Authoritative reference data or standards computation

Base URL
/api/exit-codes
Capabilities
2 routes
Last updated
July 29, 2026
Data source

GET /api/exit-codes

Returns every matching row — all 162 with no filter — so nothing is silently hidden; 'count' trims the list if you want less. Filters combine with AND and genuinely filter: zero matches return an empty list plus a warning, never a substituted row.

Live requestRuns against the public API
No key required
GET/api/exit-codes?family=signal

Request parameters

Restrict to one table: signal (POSIX signals with Linux/x86-64 numbers), errno (POSIX <errno.h> with Linux/glibc numbers), shell (process exit statuses) or sysexits (BSD sysexits.h).

Case-insensitive contains-filter over the name and the meaning (not the causes).

Only entries with this numeric value. The same number can appear in several families — that is the point.

Advanced response options6 options

Limit the number of returned records (1–100). Defaults to all matches.

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Response format: json envelope, ndjson (one record per line) or csv.

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/exit-codes?family=signal"
const res = await fetch("https://randomapi.dev/api/exit-codes?family=signal");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/exit-codes?family=signal").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/exit-codes?family=signal"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 3
family enum

Restrict to one table: signal (POSIX signals with Linux/x86-64 numbers), errno (POSIX <errno.h> with Linux/glibc numbers), shell (process exit statuses) or sysexits (BSD sysexits.h).

allowed: signal | errno | shell | sysexits
example: family=signal
search string

Case-insensitive contains-filter over the name and the meaning (not the causes).

allowed: 1 – 64
example: search=permission
code int

Only entries with this numeric value. The same number can appear in several families — that is the point.

allowed: 0 – 255
example: code=137
Universal parameters Shared response and formatting options 6
count int

Limit the number of returned records (1–100). Defaults to all matches.

default: all matches
allowed: 1 – 100
example: count=3
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=code,name
exclude list

Return all fields except these (comma-separated).

example: exclude=caveat
format enum

Response format: json envelope, ndjson (one record per line) or csv.

default: json
allowed: json | ndjson | csv
example: format=csv
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 10
code integer (0-255)

Numeric value: a signal number, an errno number or a process exit status.

example: 137

name string

Symbolic constant (SIGKILL, ENOENT, EX_USAGE) or, for shell statuses that have no constant, a descriptive identifier such as command-not-found.

example: terminated-by-SIGKILL

family string

signal | errno | shell | sysexits.

example: shell

meaning string

What the value means, in one sentence.

example: Terminated by SIGKILL (signal 9); the shell reports 128 + 9.

standard string

Which document this row's name and number are taken from: POSIX.1-2024 | Linux/glibc | sysexits.h | convention. 'convention' means no standard assigns the meaning. Linux/glibc does not imply Linux-only — SIGPROF and SIGIO exist on macOS and the BSDs too, they are simply no longer required by POSIX.

example: convention

defaultAction string nullable

Signal rows only: what the kernel does when no handler is installed — term (terminate), core (terminate and dump core), stop (suspend), ign (ignore) or cont (resume). null on every non-signal row. Only term and core signals can produce a 128+n exit status.

example: term

derivedFrom string nullable

The signal a 128+n status really comes from, set on the terminated-by-* and stopped-by-* rows. null everywhere else — including the 128+n values no signal can produce, such as 145.

example: SIGKILL

commonCauses string[]

Short, factual situations that produce this value.

example: ["The kernel out-of-memory killer terminated the process","Someone ran kill -9"]

reference string (URL)

Primary document this row's name and meaning come from.

example: https://manpages.debian.org/bookworm/bash/bash.1.en.html

caveat string nullable

Portability or scope limit you need before acting on the row — architecture-dependent signal numbers, implementation-defined errno numbers, convention-only statuses. null when there is nothing to warn about.

example: 31 on Linux/x86-64, ARM and PARISC. SIGSYS is 12 on Linux/Alpha, SPARC and MIPS and on macOS and the BSDs.

Documented examples

Build-generated requests and complete responses
4
Every signal with its number and default action
GET /api/exit-codes?family=signal
{
  "data": [
    {
      "code": 1,
      "name": "SIGHUP",
      "family": "signal",
      "meaning": "Hangup: the controlling terminal was closed or the controlling process exited.",
      "standard": "POSIX.1-2024",
      "defaultAction": "term",
      "derivedFrom": null,
      "commonCauses": [
        "The terminal or SSH session that started the process went away",
        "A daemon was sent SIGHUP deliberately to make it re-read its configuration"
      ],
      "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html",
      "caveat": null
    },
    {
      "code": 2,
      "name": "SIGINT",
      "family": "signal",
      "meaning": "Terminal interrupt, normally produced by pressing Ctrl-C.",
      "standard": "POSIX.1-2024",
      "defaultAction": "term",
      "derivedFrom": null,
      "commonCauses": [
        "A user pressed Ctrl-C",
        "A foreground process group was interrupted from the terminal"
      ],
      "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html",
      "caveat": null
    },
    {
      "code": 3,
      "name": "SIGQUIT",
      "family": "signal",
      "meaning": "Terminal quit signal; the default action terminates the process and writes a core dump.",
      "standard": "POSIX.1-2024",
      "defaultAction": "core",
      "derivedFrom": null,
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
What claims the number 137
GET /api/exit-codes?code=137
{
  "data": [
    {
      "code": 137,
      "name": "terminated-by-SIGKILL",
      "family": "shell",
      "meaning": "Terminated by SIGKILL (signal 9); the shell reports 128 + 9.",
      "standard": "convention",
      "defaultAction": null,
      "derivedFrom": "SIGKILL",
      "commonCauses": [
        "The kernel out-of-memory killer terminated the process",
        "A container runtime escalated to SIGKILL after the SIGTERM grace period expired",
        "Someone ran kill -9"
      ],
      "reference": "https://manpages.debian.org/bookworm/bash/bash.1.en.html",
      "caveat": "Kubernetes reports reason=OOMKilled with exitCode 137 for a container the kernel OOM killer terminated, and Docker surfaces the same 137; that is a runtime reporting convention, not a definition of the number. A program that calls exit(137) produces exactly the same status without any signal being involved. POSIX.1-2024 only requires a shell to report a status greater than 128 when a command dies from a signal, and explicitly permits values above 255. The exact 128+n arithmetic is documented by bash, not by POSIX, so this status is evidence of a signal death — not proof of one."
    }
  ],
  "meta": {
    "endpoint": "exit-codes",
    "count": 1,
    "params": {
      "code": 137
    },
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
errno entries about permissions
GET /api/exit-codes?family=errno&search=permission
{
  "data": [
    {
      "code": 13,
      "name": "EACCES",
      "family": "errno",
      "meaning": "Permission denied.",
      "standard": "POSIX.1-2024",
      "defaultAction": null,
      "derivedFrom": null,
      "commonCauses": [
        "The file mode bits deny the requested access",
        "A directory on the path is not searchable (missing execute bit)",
        "A read-only bind mount or SELinux/AppArmor policy blocked the access"
      ],
      "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html",
      "caveat": "POSIX.1-2024 requires the name but not the number: this value is the Linux/glibc one and differs on other platforms."
    }
  ],
  "meta": {
    "endpoint": "exit-codes",
    "count": 1,
    "params": {
      "family": "errno",
      "search": "permission"
    },
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
The whole sysexits.h range as CSV
GET /api/exit-codes?family=sysexits&format=csv
code,name,family,meaning,standard,defaultAction,derivedFrom,commonCauses,reference,caveat
0,EX_OK,sysexits,Successful termination.,sysexits.h,,,"[""The program completed with no error""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
64,EX_USAGE,sysexits,"Command line usage error: the wrong number of arguments, a bad flag, or bad syntax in a parameter.",sysexits.h,,,"[""A CLI was invoked with an unknown option or a missing argument""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
65,EX_DATAERR,sysexits,"The input data was incorrect in some way. Intended for a user's data, not for system files.",sysexits.h,,,"[""A malformed input file the user supplied"",""A record that failed validation""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
66,EX_NOINPUT,sysexits,An input file — not a system file — did not exist or was not readable.,sysexits.h,,,"[""The named input file is missing"",""The input file's permissions deny reading""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
67,EX_NOUSER,sysexits,The specified user does not exist.,sysexits.h,,,"[""An unknown mail recipient"",""A remote login for an account that is not present""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
68,EX_NOHOST,sysexits,The specified host does not exist.,sysexits.h,,,"[""An unresolvable hostname in a mail address or network request""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
69,EX_UNAVAILABLE,sysexits,"A service is unavailable, for example because a support program or file is missing.",sysexits.h,,,"[""A required helper binary is absent"",""A catch-all when no other sysexits code fits""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
70,EX_SOFTWARE,sysexits,"An internal software error, limited to errors that are not operating-system related.",sysexits.h,,,"[""An internal invariant failed"",""An unexpected internal state was reached""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
71,EX_OSERR,sysexits,"An operating system error, such as being unable to fork or to create a pipe.",sysexits.h,,,"[""fork() failed"",""A required system resource could not be obtained""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
72,EX_OSFILE,sysexits,"A system file such as /etc/passwd is missing, cannot be opened, or contains an error.",sysexits.h,,,"[""A system database file is missing or corrupt""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
73,EX_CANTCREAT,sysexits,A user-specified output file cannot be created.,sysexits.h,,,"[""The output directory is missing or not writable""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
74,EX_IOERR,sysexits,An error occurred while doing I/O on some file.,sysexits.h,,,"[""A read or write failed part-way through""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
75,EX_TEMPFAIL,sysexits,A temporary failure that is not really an error; the request should be retried later.,sysexits.h,,,"[""A mailer could not open a connection and the message should be requeued""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
76,EX_PROTOCOL,sysexits,The remote system returned something that was “not possible” during a protocol exchange.,sysexits.h,,,"[""A peer answered with a response the protocol does not allow""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
77,EX_NOPERM,sysexits,"Insufficient permission to perform the operation, not counting filesystem problems.",sysexits.h,,,"[""An operation that requires a privilege the caller does not hold""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"
78,EX_CONFIG,sysexits,Something was unconfigured or misconfigured.,sysexits.h,,,"[""A required configuration key is missing or invalid""]",https://man.openbsd.org/sysexits.3,"sysexits.h is a BSD header, not a standard. Its own manual page opens with “A few programs exit with the following non-portable error codes. Do not use them.”"

GET /api/exit-codes/lookup

Provide exactly one of 'code' or 'name'. A shared number such as 2 returns every matching row with ambiguous: true; 'family' narrows it. Unknown values return 404 with the closest documented entry.

Live requestRuns against the public API
No key required
GET/api/exit-codes/lookup?code=137

Request parameters

Numeric value to look up. Mutually exclusive with 'name'.

Symbolic name to look up, matched case-insensitively (SIGKILL, enoent, EX_USAGE, command-not-found). Mutually exclusive with 'code'.

Disambiguates a value several tables share: signal, errno, shell or sysexits. Optional — omit it to see every match.

Advanced response options4 options

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/exit-codes/lookup?code=137"
const res = await fetch("https://randomapi.dev/api/exit-codes/lookup?code=137");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/exit-codes/lookup?code=137").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/exit-codes/lookup?code=137"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 3
code int

Numeric value to look up. Mutually exclusive with 'name'.

allowed: 0 – 255
example: code=137
name string

Symbolic name to look up, matched case-insensitively (SIGKILL, enoent, EX_USAGE, command-not-found). Mutually exclusive with 'code'.

allowed: 1 – 64
example: name=SIGKILL
family enum

Disambiguates a value several tables share: signal, errno, shell or sysexits. Optional — omit it to see every match.

allowed: signal | errno | shell | sysexits
example: family=signal
Universal parameters Shared response and formatting options 4
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=query,lookupBy
exclude list

Return all fields except these (comma-separated).

example: exclude=matches
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 6
query string

The value that was looked up; for a name, the canonical spelling of the matched entry.

example: 137

lookupBy string

code | name — which key resolved this request.

example: code

family string nullable

The family filter that was applied, or null when the search covered every table.

example: signal

matchCount integer

How many rows matched. Always at least 1 — zero matches are a 404.

example: 1

ambiguous boolean

True when more than one row matched — either because several tables claim the number (2 is ENOENT and SIGINT) or because one table has two names for it (errno 11 is EAGAIN and EWOULDBLOCK).

example: false

matches object[]

Every matching row, each with code, name, family, meaning, standard, defaultAction, derivedFrom, commonCauses, reference and caveat.

example: [{"code":137,"name":"terminated-by-SIGKILL","family":"shell","meaning":"Terminated by SIGKILL (signal 9); the shell reports 128 + 9.","standard":"convention","defaultAction":null,"derivedFrom":"SIGKILL"}]

Documented examples

Build-generated requests and complete responses
4
Exit code 137 in a container
GET /api/exit-codes/lookup?code=137
{
  "data": {
    "query": "137",
    "lookupBy": "code",
    "family": null,
    "matchCount": 1,
    "ambiguous": false,
    "matches": [
      {
        "code": 137,
        "name": "terminated-by-SIGKILL",
        "family": "shell",
        "meaning": "Terminated by SIGKILL (signal 9); the shell reports 128 + 9.",
        "standard": "convention",
        "defaultAction": null,
        "derivedFrom": "SIGKILL",
        "commonCauses": [
          "The kernel out-of-memory killer terminated the process",
          "A container runtime escalated to SIGKILL after the SIGTERM grace period expired",
          "Someone ran kill -9"
        ],
        "reference": "https://manpages.debian.org/bookworm/bash/bash.1.en.html",
        "caveat": "Kubernetes reports reason=OOMKilled with exitCode 137 for a container the kernel OOM killer terminated, and Docker surfaces the same 137; that is a runtime reporting convention, not a definition of the number. A program that calls exit(137) produces exactly the same status without any signal being involved. POSIX.1-2024 only requires a shell to report a status greater than 128 when a command dies from a signal, and explicitly permits values above 255. The exact 128+n arithmetic is documented by bash, not by POSIX, so this status is evidence of a signal death — not proof of one."
      }
    ]
  },
  "meta": {
    "endpoint": "exit-codes",
    "route": "/lookup",
    "params": {
      "code": 137
    },
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
Code 2 is ambiguous: ENOENT and SIGINT
GET /api/exit-codes/lookup?code=2
{
  "data": {
    "query": "2",
    "lookupBy": "code",
    "family": null,
    "matchCount": 2,
    "ambiguous": true,
    "matches": [
      {
        "code": 2,
        "name": "SIGINT",
        "family": "signal",
        "meaning": "Terminal interrupt, normally produced by pressing Ctrl-C.",
        "standard": "POSIX.1-2024",
        "defaultAction": "term",
        "derivedFrom": null,
        "commonCauses": [
          "A user pressed Ctrl-C",
          "A foreground process group was interrupted from the terminal"
        ],
        "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html",
        "caveat": null
      },
      {
        "code": 2,
        "name": "ENOENT",
        "family": "errno",
        "meaning": "No such file or directory.",
        "standard": "POSIX.1-2024",
        "defaultAction": null,
        "derivedFrom": null,
        "commonCauses": [
          "The path does not exist",
          "A symlink points at a missing target",
          "An executable's dynamic loader or shared library is missing"
        ],
        "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html",
        "caveat": "POSIX.1-2024 requires the name but not the number: this value is the Linux/glibc one and differs on other platforms."
      }
    ]
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
Look up SIGKILL by name
GET /api/exit-codes/lookup?name=SIGKILL
{
  "data": {
    "query": "SIGKILL",
    "lookupBy": "name",
    "family": null,
    "matchCount": 1,
    "ambiguous": false,
    "matches": [
      {
        "code": 9,
        "name": "SIGKILL",
        "family": "signal",
        "meaning": "Kill: terminates the process immediately and cannot be caught, blocked or ignored.",
        "standard": "POSIX.1-2024",
        "defaultAction": "term",
        "derivedFrom": null,
        "commonCauses": [
          "kill -9",
          "The kernel out-of-memory killer selected the process",
          "A container runtime's stop grace period expired after SIGTERM"
        ],
        "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html",
        "caveat": null
      }
    ]
  },
  "meta": {
    "endpoint": "exit-codes",
    "route": "/lookup",
    "params": {
      "name": "SIGKILL"
    },
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
Narrow a shared number to one table
GET /api/exit-codes/lookup?code=9&family=signal
{
  "data": {
    "query": "9",
    "lookupBy": "code",
    "family": "signal",
    "matchCount": 1,
    "ambiguous": false,
    "matches": [
      {
        "code": 9,
        "name": "SIGKILL",
        "family": "signal",
        "meaning": "Kill: terminates the process immediately and cannot be caught, blocked or ignored.",
        "standard": "POSIX.1-2024",
        "defaultAction": "term",
        "derivedFrom": null,
        "commonCauses": [
          "kill -9",
          "The kernel out-of-memory killer selected the process",
          "A container runtime's stop grace period expired after SIGTERM"
        ],
        "reference": "https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html",
        "caveat": null
      }
    ]
  },
  "meta": {
    "endpoint": "exit-codes",
    "route": "/lookup",
    "params": {
      "code": 9,
      "family": "signal"
    },
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}

About this API

Coverage & behavior

Four tables in one lookup, and every row says which document it comes from.

  • signal — signals 1–31 with the Linux/x86-64 numbers from the kernel's arch/x86/include/uapi/asm/signal.h, each carrying its POSIX default action (term, core, stop, ign, cont). POSIX.1-2024 requires 27 of these names and not a single number, and the four it does not require (SIGSTKFLT, SIGPROF, SIGIO, SIGPWR) are labelled Linux/glibc — which means "this API takes the number from Linux", not "Linux-only": SIGPROF and SIGIO exist on macOS and the BSDs too. SIGBUS, SIGUSR1, SIGUSR2, SIGSYS and everything from 16 upwards take a different number on at least one of Linux/Alpha, SPARC, MIPS, PARISC, macOS or the BSDs; every affected row spells out the real alternatives in caveat, and so does every 128+n row built from it.
  • errno — the POSIX.1-2024 <errno.h> name set carrying the Linux/glibc numbers. POSIX fixes the names and leaves the numbers implementation-defined, so every errno row says so. The four names POSIX only marks "Reserved" (EDQUOT, EMULTIHOP, ENOLINK, ESTALE) are labelled as reserved with the Linux meaning in brackets. Linux-only values POSIX does not require are deliberately out of scope.
  • shell — process exit statuses. Shell Command Language §2.8.2 pins exactly two failure statuses: 127 (command not found) and 126 (found, but not an executable utility); 0 for successful completion comes from XCU §1.4 "Utility Description Defaults", and that is the section the success row cites. For a command killed by a signal §2.8.2 requires only a status greater than 128, and explicitly permits values above 255 — so the familiar 128+n arithmetic is a shell convention documented by bash, not by POSIX.
  • sysexits — BSD's sysexits.h: EX_OK (0) plus EX_USAGE (64) through EX_CONFIG (78). Its own manual page opens by calling these codes non-portable and advising against them; the rows repeat that instead of hiding it.

Not every 128+n value is a signal death. A signal only produces an exit status if its default action terminates the process, so this API derives terminated-by-… rows for the 23 term/core signals only. SIGSTOP, SIGTSTP, SIGTTIN and SIGTTOU merely suspend a job — a shell with job control does put 128+n in $? (Ctrl-Z gives 148 on Linux/x86-64), so 147–150 ship as stopped-by-… rows that say the process is still alive. SIGCHLD, SIGCONT, SIGURG and SIGWINCH are ignored or continue by default and kill nothing at all: 145, 146, 151 and 156 are unassigned with derivedFrom: null, exactly like 128. Widely copied tables that map all of 129–159 onto signals are wrong here — sh -c 'kill -WINCH $$' exits 0, not 156.

137 is not a definition of "OOMKilled". 137 is 128+9, that is SIGKILL. Kubernetes really does report reason: OOMKilled alongside exitCode: 137 when the kernel out-of-memory killer terminates a container — its memory-limit walkthrough shows exactly that status block, and Docker surfaces the same 137 — but that is a runtime reporting convention. A program that calls exit(137) itself produces an identical status with no signal involved. The same applies to 143 (SIGTERM) and 139 (SIGSEGV).

One number, several meanings. /lookup?code=2 returns both ENOENT and SIGINT with ambiguous: true instead of choosing for you; add family=errno to narrow it. One table can also claim a number twice — ?code=11&family=errno is EAGAIN and EWOULDBLOCK — and that is ambiguous too. Unknown codes and names answer 404 with the closest documented entry — never a substitute row.

Scope limit: this endpoint tells you what a number means and which document says so. It does not inspect your container, read your logs or diagnose why your process died.

Use it for

  • Turn a CI or container exit status such as 137 into “SIGKILL, commonly the OOM killer”
  • Map an errno number from strace or a crash log back to its POSIX name
  • Render human-readable failure reasons in a build dashboard or log viewer
  • Check whether an exit status you plan to return is already claimed by POSIX or sysexits.h

Frequently asked questions

What does exit code 137 mean?

/api/exit-codes/lookup?code=137 returns 137 as 128+9 with derivedFrom: "SIGKILL". Kubernetes and Docker commonly report it for a container the kernel OOM killer terminated, but that is a runtime reporting convention — a program can exit 137 on its own with no signal involved.

Is exit code 126 different from exit code 127?

Yes, and POSIX.1-2024 §2.8.2 defines both: 127 means the command was not found, 126 means the command name was found but is not an executable utility. Both rows are labelled standard: "POSIX.1-2024".

Why does looking up code 2 return more than one row?

Because 2 is ENOENT in <errno.h> and SIGINT in <signal.h>. /lookup?code=2 returns every match with ambiguous: true rather than guessing; add family=errno or family=signal to narrow it.

Are these signal numbers the same on macOS?

No. The numbers are Linux/x86-64. SIGBUS, SIGUSR1, SIGUSR2, SIGSYS and every signal from 16 upwards differ on macOS and the BSDs or on other Linux architectures. Every affected signal row states the real alternative values in its caveat, and so does every 128+n shell row derived from it — /lookup?code=138 says SIGUSR1 is signal 10 here but 30 on macOS, so 138 is not a SIGUSR1 death there.

Does exit code 145 mean the process was killed by SIGCHLD?

No. SIGCHLD is ignored by default, so it never terminates anything and no shell derives 145 from it — sh -c 'kill -CHLD $$' exits 0. This API ships 145, 146 (SIGCONT), 151 (SIGURG) and 156 (SIGWINCH) as unassigned-… rows with derivedFrom: null. POSIX.1-2024 only requires a status greater than 128 for a command that dies from a signal — the exact 128+n arithmetic is bash's convention, which is why the derived rows carry standard: "convention".

What are the sysexits.h codes 64 to 78?

They are BSD's suggested exit statuses, from EX_USAGE (64) to EX_CONFIG (78), plus EX_OK (0) for success. The sysexits(3) manual itself calls them non-portable and advises against using them, so this API labels them standard: "sysexits.h" rather than treating them as a standard.

Standards & references