> ## Documentation Index
> Fetch the complete documentation index at: https://docs.server.express/llms.txt
> Use this file to discover all available pages before exploring further.

# Add an SSH key

> Parses and validates an OpenSSH public key (ssh-ed25519, sk-ssh-ed25519@openssh.com, ssh-rsa, ecdsa-sha2-nistp256/384/521,
sk-ecdsa-sha2-nistp256@openssh.com; DSA refused). Parse errors come back verbatim as 400. Max 50 keys per account and
no duplicate fingerprints (409). Name defaults to the key comment, then its type. Writes an ADD_SSH_KEY audit entry.



## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/user/ssh-keys
openapi: 3.1.0
info:
  title: Server.Express API
  version: 1.0.0
  description: >-
    The customer-facing Server.Express API: auth, billing, tickets, cloud and
    dedicated servers, hosting, reselling and account management. Every response
    uses the `{ success, data | error }` envelope.
  contact:
    name: Server.Express
    url: https://server.express
servers:
  - url: https://my.server.express/api
    description: Production
security:
  - bearerAuth: []
  - apiToken: []
tags:
  - name: API Tokens
  - name: Account
  - name: Auth
  - name: Cloud
  - name: Coupons
  - name: Credits
  - name: Dashboard
  - name: Dedicated
  - name: Health
  - name: Hosting
  - name: Integrations
  - name: Invoices
  - name: Livechat
  - name: Notifications
  - name: Passkeys
  - name: Payments
  - name: Products
  - name: Public
  - name: Public Invoices
  - name: Public Tools
  - name: Reseller
  - name: SSH Keys
  - name: Services
  - name: Tasks
  - name: Teams
  - name: Tickets
  - name: Web Hosting
  - name: Webhooks
paths:
  /v1/user/ssh-keys:
    post:
      tags:
        - SSH Keys
      summary: Add an SSH key
      description: >-
        Parses and validates an OpenSSH public key (ssh-ed25519,
        sk-ssh-ed25519@openssh.com, ssh-rsa, ecdsa-sha2-nistp256/384/521,

        sk-ecdsa-sha2-nistp256@openssh.com; DSA refused). Parse errors come back
        verbatim as 400. Max 50 keys per account and

        no duplicate fingerprints (409). Name defaults to the key comment, then
        its type. Writes an ADD_SSH_KEY audit entry.
      operationId: publicUserAddSshKey
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - publicKey
              properties:
                publicKey:
                  type: string
                  description: >-
                    One OpenSSH public key line, e.g. "ssh-ed25519 AAAA…
                    user@host".
                name:
                  type: string
                  maxLength: 100
      responses:
        '201':
          description: Key added.
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    $ref: '#/components/schemas/PublicUserSshKey'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/ServerError'
      security:
        - bearerAuth: []
components:
  schemas:
    PublicUserSshKey:
      type: object
      required:
        - id
        - name
        - keyType
        - fingerprint
        - createdAt
        - lastUsedAt
      properties:
        id:
          type: string
        name:
          type: string
        keyType:
          type: string
          examples:
            - ssh-ed25519
        fingerprint:
          type: string
          description: '`SHA256:…`, as `ssh-keygen -lf` prints it.'
        createdAt:
          type: string
          format: date-time
        lastUsedAt:
          type:
            - string
            - 'null'
          format: date-time
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          const: false
        error:
          type: string
          description: Human-readable error message.
      additionalProperties: true
  responses:
    BadRequest:
      description: Validation failed or the request is malformed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Missing, invalid or expired credentials.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: >-
        Authenticated but not allowed (missing scope, not an admin, or not your
        resource).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Conflict:
      description: The request conflicts with the resource's current state.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    ServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Session access token (JWT) from POST /v1/auth/login or /v1/auth/refresh.
        A session satisfies every API scope.
    apiToken:
      type: http
      scheme: bearer
      bearerFormat: se_live_<prefix>_<secret>
      description: >-
        Personal API token created under Settings → API tokens. Only routes
        guarded by verifyApiAuth accept it, and the token must carry the scope
        named in the operation's x-required-scope.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.