# Who am I

`GET https://api-vod-express.syncwords.com/v1/whoami`

Check a token

The account a token belongs to, and whether VOD Express is enabled for it. Answers even when it is not, so a client can tell a disabled account from a bad token.

**Guide:** [Authentication](/vod-express/authentication)

## Responses

### 200

OK

Example:

```json
{
  "data": {
    "organization": {
      "id": 141,
      "name": "Acme Media"
    },
    "user": {
      "id": null,
      "email": null,
      "apiUser": true
    },
    "vodExpress": {
      "enabled": true,
      "defaultBuildVersion": "0.9.0-alpha1-2026-10-20T14-10Z-3f05aa",
      "hasAwsAccess": true,
      "canManageAccount": true
    }
  }
}
```

Schema:

```json
{
  "type": "object",
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/Whoami"
    }
  }
}
```

### 401

No token, or an expired or unknown one: `unauthenticated`.

Example:

```json
{
  "message": "Unauthenticated.",
  "code": "unauthenticated"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

### 429

Rate limited: `too_many_requests`. Wait the seconds `Retry-After` says, then repeat the call.

Example:

```json
{
  "message": [
    "Too Many Attempts."
  ],
  "code": "too_many_requests"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

## Schemas

### Whoami

`#/components/schemas/Whoami`

```json
{
  "type": "object",
  "required": [
    "organization",
    "user",
    "vodExpress"
  ],
  "properties": {
    "organization": {
      "type": "object",
      "description": "The account the token belongs to.",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "user": {
      "type": "object",
      "description": "Null fields for an organization token, which has no user.",
      "required": [
        "id",
        "email",
        "apiUser"
      ],
      "properties": {
        "id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "email": {
          "type": [
            "string",
            "null"
          ]
        },
        "apiUser": {
          "type": "boolean",
          "description": "An organization token (an API key pair)."
        }
      }
    },
    "vodExpress": {
      "type": "object",
      "required": [
        "enabled",
        "defaultBuildVersion",
        "hasAwsAccess",
        "canManageAccount"
      ],
      "properties": {
        "enabled": {
          "type": "boolean",
          "description": "While false, every other call answers 403."
        },
        "defaultBuildVersion": {
          "type": [
            "string",
            "null"
          ],
          "description": "The build a new project gets unless it names one."
        },
        "hasAwsAccess": {
          "type": "boolean",
          "description": "An upload role exists for the account (`PUT /account/aws-access`)."
        },
        "canManageAccount": {
          "type": "boolean",
          "description": "Whether this token may change the account: its upload role, storage connections and settings. True for an organization key and for an administrator’s user token."
        }
      }
    }
  }
}
```

### Error

`#/components/schemas/Error`

```json
{
  "type": "object",
  "required": [
    "message",
    "code"
  ],
  "properties": {
    "message": {
      "description": "For people. A string, or an array of one string on some statuses: read it as `Array.isArray(m) ? m[0] : m`.",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "code": {
      "description": "For programs: stable, one per situation. See the Errors guide.",
      "enum": [
        "bad_request",
        "invalid_output_path",
        "invalid_idempotency_key",
        "unauthenticated",
        "invalid_credentials",
        "forbidden",
        "vod_express_not_enabled",
        "account_restricted",
        "not_found",
        "project_not_found",
        "file_not_found",
        "file_meta_not_found",
        "output_not_found",
        "feed_not_found",
        "upload_not_found",
        "webhook_not_found",
        "webhook_delivery_not_found",
        "aws_access_not_provisioned",
        "storage_connection_not_found",
        "method_not_allowed",
        "conflict",
        "file_exists",
        "project_reads_feed",
        "project_reads_folder",
        "file_processing",
        "project_config_locked",
        "idempotency_in_progress",
        "storage_connection_in_use",
        "payload_too_large",
        "unsupported_media_type",
        "validation_failed",
        "service_start_failed",
        "idempotency_key_reused",
        "webhook_limit_reached",
        "storage_failed",
        "storage_connection_check_failed",
        "storage_connection_folder_only",
        "storage_prefix_taken",
        "build_without_storage_connections",
        "build_has_no_schema",
        "too_many_requests",
        "internal_error",
        "bad_gateway",
        "service_stop_failed",
        "aws_access_failed",
        "platform_unavailable",
        "service_unavailable",
        "build_list_unavailable"
      ]
    },
    "errors": {
      "type": "object",
      "description": "On a 422: each field’s messages, keyed by field name, or by JSON pointer inside `config`.",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    }
  }
}
```
