# today.joblist.job

> A job offer, posted by anyone. When the author's handle equals the company key (its domain), it is the company's own offer. Offers expire; renew to extend. Applications never go through joblist: `apply` says where to send them.

- Kind: record
- Record key: tid
- Authority: joblist.today
- Lexicon: 1
- Published by [joblist.today](https://lexicon.garden/identity/did:plc:jqaucxlucukeif3bltpuc7zx), the NSID's authority

## Links

- [Documentation](https://lexicon.garden/lexicon/did:plc:jqaucxlucukeif3bltpuc7zx/today.joblist.job)
- [Schema JSON](https://lexicon.garden/lexicon/did:plc:jqaucxlucukeif3bltpuc7zx/today.joblist.job/schema.json)
- [Analytics](https://lexicon.garden/lexicon/did:plc:jqaucxlucukeif3bltpuc7zx/today.joblist.job/analytics)

## Record (`today.joblist.job`)

Type: record · key tid

### Properties

- `applicantLocations` (array): Countries applicants can work from (ISO 3166-1 alpha-2 codes, e.g. 'DE'), for remote offers.
  - Constraints: maxLength: 50
  - `items` (string)
    - Constraints: minLength: 2, maxLength: 2
- `apply` (ref)
  - Reference: `#apply`
- `company` (string, required): Company record key: its domain, lowercase, without 'www.' (see today.joblist.company).
  - Constraints: maxLength: 253
- `createdAt` (string · datetime, required)
- `description` (string)
  - Constraints: maxLength: 100000, maxGraphemes: 10000
- `employment` (string)
  - Constraints: knownValues: full-time | part-time | contract | internship | volunteer
- `expiresAt` (string · datetime, required): After this date the offer is no longer shown.
- `langs` (array): Languages the offer is written in (BCP-47 tags).
  - Constraints: maxLength: 3
  - `items` (string · language)
- `locations` (array)
  - Constraints: maxLength: 20
  - `items` (ref)
    - Reference: `today.joblist.company#location`
- `remote` (string)
  - Constraints: knownValues: onsite | hybrid | remote
- `salary` (ref)
  - Reference: `#salary`
- `status` (string): Whether the offer still takes applications. Missing means open; a filled or closed offer is no longer shown.
  - Constraints: maxLength: 32, knownValues: open | filled | closed
- `title` (string, required)
  - Constraints: maxLength: 2000, maxGraphemes: 200
- `updatedAt` (string · datetime): When the poster last edited the offer.
- `url` (string · uri, required): Where to read the offer: its page on the company's site or job board, or its joblist page. May equal the application link.

## #apply (`today.joblist.job#apply`)

Type: object

How to apply. Applications go straight to the poster: joblist never receives them.

### Properties

- `bluesky` (boolean): Apply by sending a direct message to the poster's account on Bluesky.
- `url` (string · uri): An application form (https://…) or an email address (mailto:…).

## #salary (`today.joblist.job#salary`)

Type: object

What the job pays, in whole units of the currency (not cents). At least one of min and max.

### Properties

- `currency` (string, required): ISO 4217 code, e.g. 'EUR'.
  - Constraints: minLength: 3, maxLength: 3
- `max` (integer)
  - Constraints: minimum: 0
- `min` (integer)
  - Constraints: minimum: 0
- `period` (string, required)
  - Constraints: maxLength: 16, knownValues: year | month | week | day | hour

## Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "apply": {
      "description": "How to apply. Applications go straight to the poster: joblist never receives them.",
      "properties": {
        "bluesky": {
          "description": "Apply by sending a direct message to the poster's account on Bluesky.",
          "type": "boolean"
        },
        "url": {
          "description": "An application form (https://…) or an email address (mailto:…).",
          "format": "uri",
          "type": "string"
        }
      },
      "type": "object"
    },
    "main": {
      "key": "tid",
      "record": {
        "properties": {
          "applicantLocations": {
            "description": "Countries applicants can work from (ISO 3166-1 alpha-2 codes, e.g. 'DE'), for remote offers.",
            "items": {
              "maxLength": 2,
              "minLength": 2,
              "type": "string"
            },
            "maxLength": 50,
            "type": "array"
          },
          "apply": {
            "ref": "#apply",
            "type": "ref"
          },
          "company": {
            "description": "Company record key: its domain, lowercase, without 'www.' (see today.joblist.company).",
            "maxLength": 253,
            "type": "string"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "maxGraphemes": 10000,
            "maxLength": 100000,
            "type": "string"
          },
          "employment": {
            "knownValues": [
              "full-time",
              "part-time",
              "contract",
              "internship",
              "volunteer"
            ],
            "type": "string"
          },
          "expiresAt": {
            "description": "After this date the offer is no longer shown.",
            "format": "datetime",
            "type": "string"
          },
          "langs": {
            "description": "Languages the offer is written in (BCP-47 tags).",
            "items": {
              "format": "language",
              "type": "string"
            },
            "maxLength": 3,
            "type": "array"
          },
          "locations": {
            "items": {
              "ref": "today.joblist.company#location",
              "type": "ref"
            },
            "maxLength": 20,
            "type": "array"
          },
          "remote": {
            "knownValues": [
              "onsite",
              "hybrid",
              "remote"
            ],
            "type": "string"
          },
          "salary": {
            "ref": "#salary",
            "type": "ref"
          },
          "status": {
            "description": "Whether the offer still takes applications. Missing means open; a filled or closed offer is no longer shown.",
            "knownValues": [
              "open",
              "filled",
              "closed"
            ],
            "maxLength": 32,
            "type": "string"
          },
          "title": {
            "maxGraphemes": 200,
            "maxLength": 2000,
            "type": "string"
          },
          "updatedAt": {
            "description": "When the poster last edited the offer.",
            "format": "datetime",
            "type": "string"
          },
          "url": {
            "description": "Where to read the offer: its page on the company's site or job board, or its joblist page. May equal the application link.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "title",
          "company",
          "url",
          "createdAt",
          "expiresAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "salary": {
      "description": "What the job pays, in whole units of the currency (not cents). At least one of min and max.",
      "properties": {
        "currency": {
          "description": "ISO 4217 code, e.g. 'EUR'.",
          "maxLength": 3,
          "minLength": 3,
          "type": "string"
        },
        "max": {
          "minimum": 0,
          "type": "integer"
        },
        "min": {
          "minimum": 0,
          "type": "integer"
        },
        "period": {
          "knownValues": [
            "year",
            "month",
            "week",
            "day",
            "hour"
          ],
          "maxLength": 16,
          "type": "string"
        }
      },
      "required": [
        "currency",
        "period"
      ],
      "type": "object"
    }
  },
  "description": "A job offer, posted by anyone. When the author's handle equals the company key (its domain), it is the company's own offer. Offers expire; renew to extend. Applications never go through joblist: `apply` says where to send them.",
  "id": "today.joblist.job",
  "lexicon": 1
}
```
