---
name: set-character-disadvantages
description: Reference for the 144 character disadvantages in the Set World API and the stat penalties each one gives. Use when listing or downloading the disadvantage table with its impacts, reading the schema of a disadvantage row and of the disadvantages on a rolled character, or building a flaw system or challenge modifiers.
license: Free to use when obtained from set.world, commercially too (the API, what it returns, the skills and downloaded models). The source code of Set is © Jimmy Lee under CC BY-NC 4.0 and its commercial use needs a paid waiver.
metadata:
  version: "0.8.9"
  title: Disadvantages
---

# Disadvantages

Set has 144 disadvantages: phrases such as `a mind that teeters on the brink of madness` or `eyes that cannot distinguish the colors of the world`. Each one lowers one or two base stats by a fixed percentage. The table stores only names; the numbers come from a pinned hash of the name ([Calculations](https://set.world/skills/calculations)).

```sh
curl https://set.world/api/disadvantages               # JSON: names only
curl 'https://set.world/api/disadvantages?format=csv'  # the whole table with its impacts
```

## Schema

```ts
type Disadvantage = { id: number; name: string };   // id: the position in the table, from 0
type DisadvantagesResponse = { data: Disadvantage[] };
```

```json
{ "data": [{ "id": 0, "name": "a visage that repulses even the strongest of stomachs" }, { "id": 1, "name": "a mind that teeters on the brink of madness" }] }
```

Two of the 144 rows are shown. The CSV joins each name with its impact:

```csv
id,name,kind,tier,primary,primaryDelta,secondary,secondaryDelta
0,a visage that repulses even the strongest of stomachs,disadvantage,1,luck,-0.08,,
1,a mind that teeters on the brink of madness,disadvantage,1,perception,-0.08,,
2,a body twisted and warped by cruel fate,disadvantage,3,perception,-0.22,luck,-0.15
```

The same impacts as JSON: `/api/traits/impacts?kind=disadvantage`.

## Query the table

```sh
curl 'https://set.world/api/disadvantages?primary=strength'               # disadvantages by the stat and tier of their impact
curl 'https://set.world/api/disadvantages?id=1'                              # one row by id
curl 'https://set.world/api/disadvantages?q=iron&format=csv'                 # text in the name, with impacts as CSV
```

`tier`, `primary` and `secondary` filter by the impact even though the JSON rows carry only `id` and `name`; add `format=csv` to see the impacts. The filters are owned by [API connection](https://set.world/skills/api-connection).

## The impact of a disadvantage

| Tier | Names in the table | Primary stat | Secondary stat |
| --- | ---: | ---: | ---: |
| 1 Minor | 100 | −8% | none |
| 2 Standard | 31 | −15% | −8% |
| 3 Major | 10 | −22% | −15% |
| 4 Crippling | 3 | −35% | −20% |

Disadvantages cut deeper than advantages lift (−8% against +5% at the first tier). `primary` and `secondary` can be any of the nine stats, and the name does not predict them. Read the returned impact, not the phrase.

## On a character

`/api/roll/character` gives 0 to 2 disadvantages, drawn uniformly without repeats. `stats.disadvantages` is the count. `traits.disadvantages` is the list, or `null` when the count is 0. Each entry is the table row plus its `index` and `impact`; the deltas are negative, as in the example in [Rolling a character](https://set.world/skills/rolling-a-character).

A stat never falls below 8. The response already contains the result of every trait as `modifiedStats`. Do not apply it again.

## Your own disadvantages

Any string has an impact, so a game can add its own flaws and get consistent numbers from `/api/traits/impact?name=…&kind=disadvantage`. A renamed disadvantage is a different disadvantage with a different impact, so keep names exactly as returned.

```ts
type Flaw = { name: string; source: 'set' | 'custom'; impact: TraitImpact; reward: number; removable: boolean };
```

Related: [Advantages](https://set.world/skills/character-advantages).
