openapi: 3.0.1
info:
  title: Signal Server API
  license:
    name: AGPL-3.0-only
    url: https://www.gnu.org/licenses/agpl-3.0.txt
servers:
- url: https://chat.signal.org
  description: Production service
- url: https://chat.staging.signal.org
  description: Staging service
paths:
  /v1/accounts/account/{identifier}:
    head:
      tags:
      - Account
      summary: Check whether an account exists
      description: |
        Enforced unauthenticated endpoint. Checks whether an account with a given identifier exists.
      operationId: accountExists
      parameters:
      - name: identifier
        in: path
        description: An ACI or PNI account identifier to check
        required: true
        schema:
          $ref: "#/components/schemas/ServiceIdentifier"
      responses:
        "200":
          description: An account with the given identifier was found.
        "400":
          description: Request must not be authenticated.
        "404":
          description: An account was not found for the given identifier.
        "422":
          description: Invalid request format.
        "429":
          description: Rate-limited.
      security:
      - authenticatedAccount: []
      - {}
  /v1/accounts/username_hash/confirm:
    put:
      tags:
      - Account
      summary: Confirm username hash
      description: |
        Authenticated endpoint. For a previously reserved username hash, confirm that this username hash is now taken
        by this account.
      operationId: confirmUsernameHash
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConfirmUsernameHashRequest"
        required: true
      responses:
        "200":
          description: Username hash confirmed successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UsernameHashResponse"
        "401":
          description: Account authentication check failed.
        "409":
          description: Given username hash doesn't match the reserved one or no reservation
            found.
        "410":
          description: Username hash not available (username can't be used).
        "422":
          description: Invalid request format.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
  /v1/accounts/me:
    delete:
      tags:
      - Account
      operationId: deleteAccount
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
  /v1/accounts/apn:
    put:
      tags:
      - Account
      operationId: setApnRegistrationId
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApnRegistrationId"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
    delete:
      tags:
      - Account
      operationId: deleteApnRegistrationId
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
  /v1/accounts/gcm:
    put:
      tags:
      - Account
      operationId: setGcmRegistrationId
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GcmRegistrationId"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
    delete:
      tags:
      - Account
      operationId: deleteGcmRegistrationId
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
  /v1/accounts/username_hash:
    delete:
      tags:
      - Account
      summary: Delete username hash
      description: |
        Authenticated endpoint. Deletes previously stored username for the account.
      operationId: deleteUsernameHash
      responses:
        "204":
          description: Username successfully deleted.
        "401":
          description: Account authentication check failed.
      security:
      - authenticatedAccount: []
  /v1/accounts/username_link:
    put:
      tags:
      - Account
      summary: Set username link
      description: |
        Authenticated endpoint. For the given encrypted username generates a username link handle.
        The username link handle can be used to lookup the encrypted username.
        An account can only have one username link at a time; this endpoint overwrites the previous encrypted username if there was one.
      operationId: updateUsernameLink
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EncryptedUsername"
        required: true
      responses:
        "200":
          description: Username Link updated successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UsernameLinkHandle"
        "401":
          description: Account authentication check failed.
        "409":
          description: Username is not set for the account.
        "422":
          description: Invalid request format.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
    delete:
      tags:
      - Account
      summary: Delete username link
      description: |
        Authenticated endpoint. Deletes username link for the given account: previously store encrypted username is deleted
        and username link handle is deactivated.
      operationId: deleteUsernameLink
      responses:
        "204":
          description: Username Link successfully deleted.
        "401":
          description: Account authentication check failed.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
  /v1/accounts/username_hash/{usernameHash}:
    get:
      tags:
      - Account
      summary: Lookup username hash
      description: |
        Forced unauthenticated endpoint. For the given username hash, look up a user ID.
      operationId: lookupUsernameHash
      parameters:
      - name: usernameHash
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Account found for the given username.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountIdentifierResponse"
        "400":
          description: Request must not be authenticated.
        "404":
          description: Account not found for the given username.
      security:
      - authenticatedAccount: []
      - {}
  /v1/accounts/username_link/{uuid}:
    get:
      tags:
      - Account
      summary: Lookup username link
      description: |
        Enforced unauthenticated endpoint. For the given username link handle, looks up the database for an associated encrypted username.
        If found, encrypted username is returned, otherwise responds with 404 Not Found.
      operationId: lookupUsernameLink
      parameters:
      - name: uuid
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        "200":
          description: Username link with the given handle was found.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EncryptedUsername"
        "400":
          description: Request must not be authenticated.
        "404":
          description: Username link was not found for the given handle.
        "422":
          description: Invalid request format.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
      - {}
  /v1/accounts/registration_lock:
    put:
      tags:
      - Account
      operationId: setRegistrationLock
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/RegistrationLock"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
    delete:
      tags:
      - Account
      operationId: removeRegistrationLock
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
  /v1/accounts/username_hash/reserve:
    put:
      tags:
      - Account
      summary: Reserve username hash
      description: |
        Authenticated endpoint. Takes in a list of hashes of potential username hashes, finds one that is not taken,
        and reserves it for the current account.
      operationId: reserveUsernameHash
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReserveUsernameHashRequest"
        required: true
      responses:
        "200":
          description: Username hash reserved successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReserveUsernameHashResponse"
        "401":
          description: Account authentication check failed.
        "409":
          description: All username hashes from the list are taken.
        "422":
          description: Invalid request format.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
  /v1/accounts/attributes:
    put:
      tags:
      - Account
      operationId: setAccountAttributes
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AccountAttributes"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
  /v1/accounts/name:
    put:
      tags:
      - Account
      summary: Set a device's encrypted name
      description: |
        Sets the encrypted name for the specified device. Primary devices may change the name of any device associated
        with their account, but linked devices may only change their own name. If no device ID is specified, then the
        authenticated device's ID will be used.
      operationId: setName
      parameters:
      - name: deviceId
        in: query
        schema:
          type: string
          description: "The ID of the device for which to set a name; if omitted,\
            \ the authenticated device will be targeted for a name change"
          format: byte
          nullable: true
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/DeviceName"
        required: true
      responses:
        "204":
          description: Device name changed successfully
        "404":
          description: No device found with the given ID
        "403":
          description: Not authorized to change the name of the device with the given
            ID
      security:
      - authenticatedAccount: []
  /v1/accounts/whoami:
    get:
      tags:
      - Account
      operationId: whoAmI
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountIdentityResponse"
      security:
      - authenticatedAccount: []
  /v2/accounts/number:
    put:
      tags:
      - Account
      summary: Change number
      description: Changes a phone number for an existing account.
      operationId: changeNumber
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChangeNumberRequest"
        required: true
      responses:
        "200":
          description: The phone number associated with the authenticated account
            was changed successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountIdentityResponse"
        "401":
          description: Account authentication check failed.
        "403":
          description: Verification failed for the provided Registration Recovery
            Password
        "409":
          description: Mismatched number of devices or device ids in 'devices to notify'
            list
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MismatchedDevicesResponse"
        "410":
          description: Mismatched registration ids in 'devices to notify' list
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StaleDevicesResponse"
        "413":
          description: One or more device messages was too large
        "422":
          description: The request did not pass validation
        "423":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RegistrationLockFailure"
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
  /v2/accounts/data_report:
    get:
      tags:
      - Account
      summary: Produces a report of non-ephemeral account data stored by the service
      operationId: getAccountDataReport
      responses:
        "200":
          description: Response with data report. A plain text representation is a
            field in the response.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountDataReportResponse"
      security:
      - authenticatedAccount: []
  /v2/accounts/phone_number_discoverability:
    put:
      tags:
      - Account
      summary: Sets whether the account should be discoverable by phone number in
        the directory.
      operationId: setPhoneNumberDiscoverability
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PhoneNumberDiscoverabilityRequest"
        required: true
      responses:
        "204":
          description: The setting was successfully updated.
      security:
      - authenticatedAccount: []
  /v1/archives/upload/form:
    get:
      tags:
      - Archive
      summary: Fetch message backup upload form
      description: |
        Retrieve an upload form that can be used to perform a resumable upload of a message backup.

        Uploads with the returned form will be limited to a maximum size of the provided uploadLength.
      operationId: backup
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      - name: uploadLength
        in: query
        description: The size of the message backup to upload in bytes
        schema:
          type: integer
          format: int64
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadDescriptorResponse"
        "429":
          description: Rate limited.
        "413":
          description: The provided uploadLength is larger than the maximum supported
            upload size. The maximum upload size is subject to change.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives:
    get:
      tags:
      - Archive
      summary: Fetch backup info
      description: Retrieve information about the currently stored backup
      operationId: backupInfo
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BackupInfoResponse"
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
    post:
      tags:
      - Archive
      summary: Refresh backup
      description: |
        Indicate that this backup is still active. Clients must periodically upload new backups or perform a refresh
        via a POST request. If a backup is not refreshed, after 30 days it may be deleted.
      operationId: refresh
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      responses:
        "204":
          description: The backup was successfully refreshed
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
    delete:
      tags:
      - Archive
      summary: Delete entire backup
      description: |
        Delete all backup metadata, objects, and stored public key. To use backups again, a public key must be resupplied.
      operationId: deleteBackup
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      responses:
        "204":
          description: The backup has been successfully removed
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/backupid/limits:
    get:
      tags:
      - Archive
      summary: Retrieve limits
      description: |
        Determine whether the backup-id can currently be rotated
      operationId: checkLimits
      responses:
        "200":
          description: Successfully retrieved backup-id rotation limits
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BackupIdLimitResponse"
        "403":
          description: Invalid account authentication
      security:
      - authenticatedAccount: []
  /v1/archives/media/batch:
    put:
      tags:
      - Archive
      summary: Batched backup media
      description: |
        Copy and re-encrypt media from the attachments cdn into the backup cdn.

        The original already encrypted attachment will be encrypted with the provided key material before being copied

        If the batch request is processed at all, a 207 will be returned and the outcome of each constituent copy will
        be provided as a separate entry in the response.
      operationId: copyMedia
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CopyMediaBatchRequest"
        required: true
      responses:
        "207":
          description: |
            The request was processed and each operation's outcome must be inspected individually. This does NOT necessarily
            indicate the operation was a success.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CopyMediaBatchResponse"
        "413":
          description: All media capacity has been consumed. Free some space to continue.
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/media:
    get:
      tags:
      - Archive
      summary: List media objects
      description: |
        Retrieve a list of media objects stored for this backup-id. A client may have previously stored media objects
        that are no longer referenced in their current backup. To reclaim storage space used by these orphaned
        objects, perform a list operation and remove any unreferenced media objects via DELETE /v1/backups/<mediaId>.
      operationId: listMedia
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      - name: cursor
        in: query
        description: A cursor returned by a previous call
        schema:
          type: string
      - name: limit
        in: query
        description: The number of entries to return per call
        schema:
          type: integer
          format: int32
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListResponse"
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
      security:
      - authenticatedAccount: []
      - {}
    put:
      tags:
      - Archive
      summary: Backup media
      description: |
        Copy and re-encrypt media from the attachments cdn into the backup cdn.

        The original, already encrypted, attachment will be encrypted with the provided key material before being copied.

        A particular destination media id should not be reused with a different source media id or different encryption
        parameters.
      operationId: copyMedia_1
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CopyMediaRequest"
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CopyMediaResponse"
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
        "413":
          description: All media capacity has been consumed. Free some space to continue.
        "410":
          description: The source object was not found.
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/media/delete:
    post:
      tags:
      - Archive
      summary: Delete media objects
      description: Delete media objects stored with this backup-id
      operationId: deleteMedia
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/DeleteMedia"
        required: true
      responses:
        "204":
          description: The provided objects were successfully deleted or they do not
            exist
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/auth:
    get:
      tags:
      - Archive
      summary: 'Fetch ZK credentials '
      description: |
        After setting a blinded backup-id with PUT /v1/archives/, this fetches credentials that can be used to perform
        operations against that backup-id. Clients may (and should) request up to 7 days of credentials at a time.

        The redemptionStart and redemptionEnd seconds must be UTC day aligned, and must not span more than 7 days.

        Each credential contains a receipt level which indicates the backup level the credential is good for. If the
        account has paid backup access that expires at some point in the provided redemption window, credentials with
        redemption times after the expiration may be on a lower backup level.

        Clients must validate the receipt level on the credential matches a known receipt level before using it.
      operationId: getBackupZKCredentials
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: redemptionStartSeconds
        in: query
        required: true
        schema:
          type: integer
          format: int64
      - name: redemptionEndSeconds
        in: query
        required: true
        schema:
          type: integer
          format: int64
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BackupAuthCredentialsResponse"
        "400":
          description: The start/end did not meet alignment/duration requirements
        "404":
          description: Could not find an existing blinded backup id
        "429":
          description: Rate limited.
      security:
      - authenticatedAccount: []
  /v1/archives/auth/read:
    get:
      tags:
      - Archive
      summary: Get CDN read credentials
      description: Retrieve credentials used to read objects stored on the backup
        cdn
      operationId: readAuth
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      - name: cdn
        in: query
        description: The number of the CDN to get credentials for
        required: true
        schema:
          type: integer
          format: int32
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReadAuthResponse"
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/redeem-receipt:
    post:
      tags:
      - Archive
      summary: Redeem receipt
      description: |
        Redeem a receipt acquired from /v1/subscription/{subscriberId}/receipt_credentials to mark the account as
        eligible for the paid backup tier.

        After successful redemption, subsequent requests to /v1/archive/auth will return credentials with the level on
        the provided receipt until the expiration time on the receipt.

        Accounts must have an existing backup credential request in order to redeem a receipt. This request will fail
        if the account has not already set a backup credential request via PUT `/v1/archives/backupid`.
      operationId: redeemReceipt
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RedeemBackupReceiptRequest"
        required: true
      responses:
        "204":
          description: The receipt was redeemed
        "400":
          description: The provided presentation or receipt was invalid
        "409":
          description: The target account does not have a backup-id commitment
        "429":
          description: Rate limited.
      security:
      - authenticatedAccount: []
  /v1/archives/backupid:
    put:
      tags:
      - Archive
      summary: Set backup id
      description: |
        Set (blinded) backup-id(s) for the account. Each account may have a single active backup-id for each
        credential type that can be used to store and retrieve backups. Once the backup-id is set,
        BackupAuthCredentials can be generated using /v1/archives/auth.

        The blinded backup-id and the key-pair used to blind it should be derived from a recoverable secret.

        At least one of `messagesBackupAuthCredentialRequest`, `mediaBackupAuthCredentialRequest` must be set.
      operationId: setBackupId
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SetBackupIdRequest"
        required: true
      responses:
        "204":
          description: The backup-id was set
        "400":
          description: The provided backup auth credential request was invalid
        "403":
          description: The device did not have permission to set the backup-id. Only
            the primary device can set the backup-id for an account
        "429":
          description: Rate limited. Too many attempts to change the backup-id have
            been made
      security:
      - authenticatedAccount: []
  /v1/archives/keys:
    put:
      tags:
      - Archive
      summary: Set public key
      description: |
        Permanently set the public key of an ED25519 key-pair for the backup-id. All requests that provide a anonymous
        BackupAuthCredentialPresentation (including this one!) must also sign the presentation with the private key
        corresponding to the provided public key.
      operationId: setPublicKey
      parameters:
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SetPublicKeyRequest"
        required: true
      responses:
        "204":
          description: The public key was set
        "429":
          description: Rate limited.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/auth/svrb:
    get:
      tags:
      - Archive
      summary: Generate credentials for SVRB
      description: |
        Generate SVRB service credentials. Generated credentials have an expiration time of 1 day (subject to change)
      operationId: svrbAuth
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      responses:
        "200":
          description: '`JSON` with generated credentials.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExternalServiceCredentials"
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v1/archives/media/upload/form:
    get:
      tags:
      - Archive
      summary: Fetch media attachment upload form
      description: |
        Retrieve an upload form that can be used to perform a resumable upload of an attachment. After uploading, the
        attachment can be copied into the backup at PUT /archives/media/.

        Like the account authenticated version at /attachments, the uploaded object is only temporary. Uploads with
        the returned form will be limited to a maximum size of the provided uploadLength.
      operationId: uploadTemporaryAttachment
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: X-Signal-ZK-Auth
        in: header
        description: "Presentation of a ZK backup auth credential acquired from /v1/archives/auth,\
          \ encoded in standard padded base64"
        required: true
        schema:
          type: string
      - name: X-Signal-ZK-Auth-Signature
        in: header
        description: "Signature of the ZK auth credential's presentation, encoded\
          \ in standard padded base64"
        required: true
        schema:
          type: string
      - name: uploadLength
        in: query
        description: The size of the temporary attachment to upload in bytes
        schema:
          type: integer
          format: int64
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadDescriptorResponse"
        "429":
          description: Rate limited.
        "413":
          description: The provided uploadLength is larger than the maximum supported
            upload size. The maximum upload size is subject to change and is governed
            by `global.attachments.maxBytes`.
        "403":
          description: Forbidden. The request had insufficient permissions to perform
            the requested action
        "401":
          description: |-
            The provided backup auth credential presentation could not be verified or
            The public key signature was invalid or
            There is no backup associated with the backup-id in the presentation or
            The credential was of the wrong type (messages/media)
        "400":
          description: Bad arguments. The request may have been made on an authenticated
            channel
      security:
      - authenticatedAccount: []
      - {}
  /v4/attachments/form/upload:
    get:
      tags:
      - Attachments
      summary: Get an upload form
      description: |
        Retrieve an upload form that can be used to perform a resumable upload. The response will include a cdn number
        indicating what protocol should be used to perform the upload.

        Uploads with the returned form will be limited to a maximum size of the provided uploadLength.
      operationId: getAttachmentUploadForm
      parameters:
      - name: uploadLength
        in: query
        description: The size of the attachment to upload in bytes
        schema:
          type: integer
          format: int64
      responses:
        "200":
          description: "Success, response body includes upload form"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AttachmentDescriptorV3"
        "400":
          description: The provided uploadLength was not valid
        "413":
          description: The provided uploadLength is larger than the maximum supported
            upload size. The maximum upload size is subject to change and is governed
            by `global.attachments.maxBytes`.
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
  /v1/call-link/create-auth:
    post:
      tags:
      - CallLink
      summary: Generate a credential for creating call links
      description: |
        Generate a credential over a truncated timestamp, room ID, and account UUID. With zero knowledge
        group infrastructure, the server does not know the room ID.
      operationId: getCreateAuth
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/GetCreateCallLinkCredentialsRequest"
        required: true
      responses:
        "200":
          description: '`JSON` with generated credentials.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateCallLinkCredential"
        "400":
          description: Invalid create call link credential request.
        "401":
          description: Account authentication check failed.
        "422":
          description: Invalid request format.
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
  /v1/call_quality_survey:
    put:
      tags:
      - Call quality survey
      summary: Submit survey response
      description: Submits a call quality survey response
      operationId: submitCallQualitySurvey
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        description: A serialized survey response protobuf entity
        content:
          application/octet-stream:
            schema:
              type: string
              format: byte
      responses:
        "204":
          description: The survey response was submitted successfully
        "422":
          description: The survey response could not be parsed
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v2/calling/relays:
    get:
      tags:
      - Calling
      summary: Get 1:1 calling relay options for the client
      description: |
        Get 1:1 relay addresses in IpV4, Ipv6, and URL formats.
      operationId: getCallingRelays
      responses:
        "200":
          description: '`JSON` with call endpoints.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetCallingRelaysResponse"
        "400":
          description: Invalid get call endpoint request.
        "401":
          description: Account authentication check failed.
        "422":
          description: Invalid request format.
        "429":
          description: Rate limited.
      security:
      - authenticatedAccount: []
  /v1/certificate/delivery:
    get:
      tags:
      - Certificate
      operationId: getDeliveryCertificate
      parameters:
      - name: includeE164
        in: query
        schema:
          type: boolean
          default: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeliveryCertificate"
      security:
      - authenticatedAccount: []
  /v1/certificate/auth/group:
    get:
      tags:
      - Certificate
      operationId: getGroupAuthenticationCredentials
      parameters:
      - name: redemptionStartSeconds
        in: query
        schema:
          type: integer
          format: int64
      - name: redemptionEndSeconds
        in: query
        schema:
          type: integer
          format: int64
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GroupCredentials"
      security:
      - authenticatedAccount: []
  /v1/challenge:
    put:
      tags:
      - Challenge
      summary: Submit proof of a challenge completion
      description: |
        Some server endpoints (the "send message" endpoint, for example) may return a 428 response indicating the client must complete a challenge before continuing.
        Clients may use this endpoint to provide proof of a completed challenge. If successful, the client may then
        continue their original operation.
      operationId: handleChallengeResponse
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
              - $ref: "#/components/schemas/AnswerPushChallengeRequest"
              - $ref: "#/components/schemas/AnswerCaptchaChallengeRequest"
      responses:
        "200":
          description: Indicates the challenge proof was accepted
        "400":
          description: The request was invalid
        "428":
          description: Submitted captcha token was not accepted
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
  /v1/challenge/push:
    post:
      tags:
      - Challenge
      summary: Request a push challenge
      description: |
        Clients may proactively request a push challenge by making an empty POST request. Push challenges will only be
        sent to the requesting account’s main device. When the push is received it may be provided as proof of completed
        challenge to /v1/challenge.
        APNs challenge payloads will be formatted as follows:
        ```
        {
            "aps": {
                "sound": "default",
                "alert": {
                    "loc-key": "APN_Message"
                }
            },
            "rateLimitChallenge": "{CHALLENGE_TOKEN}"
        }
        ```
        FCM challenge payloads will be formatted as follows:
        ```
        {"rateLimitChallenge": "{CHALLENGE_TOKEN}"}
        ```

        Clients may retry the PUT in the event of an HTTP/5xx response (except HTTP/508) from the server, but must
        implement an exponential back-off system and limit the total number of retries.
      operationId: requestPushChallenge
      responses:
        "200":
          description: |
            Indicates a payload to the account's primary device has been attempted. When clients receive a challenge push
            notification, they may issue a PUT request to /v1/challenge.
        "404":
          description: |
            The server does not have a push notification token for the authenticated account’s main device; clients may add a push
            token and try again
        "413":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
  /v1/devicecheck/assert:
    get:
      tags:
      - DeviceCheck
      summary: Fetch an assert challenge
      description: |
        Retrieve a challenge to use in an attestation, which must be provided at `POST /v1/devicecheck/assert`. To produce
        the `clientDataHash` for [generateAssertion](https://developer.apple.com/documentation/devicecheck/dcappattestservice/generateassertion(_:clientdatahash:completionhandler:)),
        construct the request you intend to `POST` and include the returned challenge as the "challenge"
        field. Serialize the request as JSON and take the SHA256 of the request, as described [here](https://developer.apple.com/documentation/devicecheck/establishing-your-app-s-integrity#Assert-your-apps-validity-as-necessary).
        Note that the JSON body provided to the PUT must exactly match the input to the `clientDataHash` (field order,
        whitespace, etc matters)

        Repeat calls to retrieve a challenge may return the same challenge until it is used in a `POST`. Callers should
        attempt to only have a single outstanding challenge at any given time.
      operationId: assertChallenge
      parameters:
      - name: action
        in: query
        schema:
          type: string
          description: The type of action you will make an assertion for
          enum:
          - backup
      responses:
        "200":
          description: The response body includes a challenge
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
    post:
      tags:
      - DeviceCheck
      summary: Perform an attested action
      description: |
        Specify some action to take on the account via the request field. The request must exactly match the request you
        provide when [generating the assertion](https://developer.apple.com/documentation/devicecheck/dcappattestservice/generateassertion(_:clientdatahash:completionhandler:)).
        The request must include a challenge previously retrieved from `GET /v1/devicecheck/assert`.

        Each assertion increments the counter associated with the client's device key. This method enforces that no
        assertion with a counter lower than a counter we've already seen is allowed to execute. If a client issues
        multiple requests concurrently, or if they retry a request that had an indeterminate outcome, it's possible that
        the request will not be accepted because the server has already stored the updated counter. In this case the
        request may return 401, and the client should generate a fresh assert for the request.
      operationId: assertion
      parameters:
      - name: keyId
        in: query
        description: "The keyId, encoded with padded url-safe base64"
        required: true
        schema:
          type: string
      - name: request
        in: query
        description: |
          The asserted JSON request data, encoded as a string in padded url-safe base64. This must exactly match the
          request you use when generating the assertion (including field ordering, whitespace, etc).
        required: true
        schema:
          $ref: "#/components/schemas/AssertionRequest"
      requestBody:
        description: "The assertion created by [generateAssertion](https://developer.apple.com/documentation/devicecheck/dcappattestservice/generateassertion(_:clientdatahash:completionhandler:))"
        content:
          application/octet-stream:
            schema:
              type: string
              format: byte
      responses:
        "204":
          description: The assertion was valid and the corresponding action was executed
        "404":
          description: The provided keyId was not found
        "410":
          description: There was no challenge associated with the account. It may
            have expired.
        "401":
          description: The assertion could not be verified
      security:
      - authenticatedAccount: []
  /v1/devicecheck/attest:
    get:
      tags:
      - DeviceCheck
      summary: Fetch an attest challenge
      description: |
        Retrieve a challenge to use in an attestation, which should be provided at `PUT /v1/devicecheck/attest`. To
        produce the clientDataHash for [attestKey](https://developer.apple.com/documentation/devicecheck/dcappattestservice/attestkey(_:clientdatahash:completionhandler:))
        take the SHA256 of the UTF-8 bytes of the returned challenge.

        Repeat calls to retrieve a challenge may return the same challenge until it is used in a `PUT`. Callers should
        have a single outstanding challenge at any given time.
      operationId: attestChallenge
      responses:
        "200":
          description: The response body includes a challenge
        "429":
          description: Ratelimited.
      security:
      - authenticatedAccount: []
    put:
      tags:
      - DeviceCheck
      summary: Register a keyId
      description: |
        Register a keyId with an attestation, which can be used to generate assertions from this account.

        The attestation should use the SHA-256 of a challenge retrieved at `GET /v1/devicecheck/attest` as the
        `clientDataHash`

        Registration is idempotent, and you should retry network errors with the same challenge as suggested by [device
        check](https://developer.apple.com/documentation/devicecheck/dcappattestservice/attestkey(_:clientdatahash:completionhandler:)#discussion),
        as long as your challenge has not expired (410). Even if your challenge is expired, you may continue to retry with
        your original keyId (and a fresh challenge).
      operationId: attest
      parameters:
      - name: keyId
        in: query
        description: "The keyId, encoded with padded url-safe base64"
        required: true
        schema:
          type: string
      requestBody:
        description: "The attestation data, created by [attestKey](https://developer.apple.com/documentation/devicecheck/dcappattestservice/attestkey(_:clientdatahash:completionhandler:))"
        content:
          application/octet-stream:
            schema:
              type: string
              format: byte
      responses:
        "204":
          description: The keyId was successfully added to the account
        "410":
          description: There was no challenge associated with the account. It may
            have expired.
        "401":
          description: The attestation could not be verified
        "413":
          description: There are too many unique keyIds associated with this account.
            This is an unrecoverable error.
        "409":
          description: The provided keyId has already been registered to a different
            account
      security:
      - authenticatedAccount: []
  /v1/devices/provisioning/code:
    get:
      tags:
      - Devices
      summary: Generate a signed device-linking token
      description: |
        Generate a signed device-linking token for transmission to a pending linked device via a provisioning message.
      operationId: createDeviceToken
      responses:
        "200":
          description: Token was generated successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LinkDeviceToken"
        "411":
          description: The authenticated account already has the maximum allowed number
            of linked devices
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
  /v1/devices:
    get:
      tags:
      - Devices
      operationId: getDevices
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeviceInfoList"
      security:
      - authenticatedAccount: []
  /v1/devices/link:
    put:
      tags:
      - Devices
      summary: Link a device to an account
      description: |
        Links a device to an account identified by a given phone number.
      operationId: linkDevice
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          $ref: "#/components/schemas/BasicAuthorizationHeader"
      - name: User-Agent
        in: header
        schema:
          type: string
          nullable: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/LinkDeviceRequest"
        required: true
      responses:
        "200":
          description: The new device was linked to the calling account
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LinkDeviceResponse"
        "403":
          description: The given account was not found or the given verification code
            was incorrect
        "409":
          description: The new device is missing a capability supported by all other
            devices on the account
        "411":
          description: The given account already has its maximum number of linked
            devices
        "422":
          description: The request did not pass validation
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
  /v1/devices/restore_account/{token}:
    get:
      tags:
      - Devices
      summary: Wait for 'restore account' request
      operationId: waitForDeviceTransferRequest
      parameters:
      - name: token
        in: path
        required: true
        schema:
          maximum: 64
          maxLength: 64
          minLength: 0
          type: string
          description: A randomly-generated token identifying the request for device-to-device
            transfer.
      - name: timeout
        in: query
        schema:
          maximum: 3600
          minimum: 1
          type: integer
          description: |2
              The amount of time (in seconds) to wait for a response. If a transfer archive for the authenticated
              device is not available within the given amount of time, this endpoint will return a status of HTTP/204.
          format: int32
          default: 30
      responses:
        "200":
          description: A 'restore account' request was received for the given token
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RestoreAccountRequest"
        "204":
          description: No 'restore account' request for the given token was received
            before the call completed; clients may repeat the call to continue waiting
        "400":
          description: The given token or timeout was invalid
        "429":
          description: Rate-limited; try again after the prescribed delay
    put:
      tags:
      - Devices
      summary: Signals that a new device is requesting restoration of account data
        by some method
      description: |
        Signals that a new device is requesting restoration of account data by some method. Devices waiting via the
        "wait for 'restore account' request" endpoint will be notified that the request has been issued.
      operationId: recordRestoreAccountRequest
      parameters:
      - name: token
        in: path
        required: true
        schema:
          maximum: 64
          maxLength: 64
          minLength: 0
          type: string
          description: A randomly-generated token identifying the request for device-to-device
            transfer.
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RestoreAccountRequest"
      responses:
        "204":
          description: Success
        "422":
          description: The request object could not be parsed or was otherwise invalid
        "429":
          description: Rate-limited; try again after the prescribed delay
  /v1/devices/transfer_archive:
    get:
      tags:
      - Devices
      summary: Wait for a new transfer archive to be uploaded
      description: |
        Waits for a new transfer archive to be uploaded for the authenticated device and returns the location of the
        archive when available.
      operationId: waitForTransferArchive
      parameters:
      - name: timeout
        in: query
        schema:
          maximum: 3600
          minimum: 1
          type: integer
          description: |2
              The amount of time (in seconds) to wait for a response. If a transfer archive for the authenticated
              device is not available within the given amount of time, this endpoint will return a status of HTTP/204.
          format: int32
          default: 30
      - name: User-Agent
        in: header
        schema:
          type: string
          nullable: true
      responses:
        "200":
          description: "Either a new transfer archive was uploaded for the authenticated\
            \ device, or the upload has failed"
          content:
            application/json:
              schema:
                description: |
                  The location of the transfer archive if the archive was successfully uploaded, otherwise a error indicating that
                   the upload has failed and the destination device should stop waiting
                oneOf:
                - $ref: "#/components/schemas/RemoteAttachment"
                - $ref: "#/components/schemas/RemoteAttachmentError"
        "204":
          description: No transfer archive was uploaded before the call completed;
            clients may repeat the call to continue waiting
        "400":
          description: The given timeout was invalid
        "429":
          description: Rate-limited; try again after the prescribed delay
      security:
      - authenticatedAccount: []
    put:
      tags:
      - Devices
      summary: Signals that a transfer archive has been uploaded for a specific linked
        device
      description: |
        Signals that a transfer archive has been uploaded or failed for a specific linked device. Devices waiting via
        the "wait for transfer archive" endpoint will be notified that the new archive is available.

        If the uploader cannot upload the transfer archive, they must signal an error.
      operationId: recordTransferArchiveUploaded
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TransferArchiveUploadedRequest"
        required: true
      responses:
        "204":
          description: Success
        "422":
          description: The request object could not be parsed or was otherwise invalid
        "429":
          description: Rate-limited; try again after the prescribed delay
      security:
      - authenticatedAccount: []
  /v1/devices/{device_id}:
    delete:
      tags:
      - Devices
      operationId: removeDevice
      parameters:
      - name: device_id
        in: path
        required: true
        schema:
          type: string
          format: byte
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
  /v1/devices/capabilities:
    put:
      tags:
      - Devices
      operationId: setCapabilities
      requestBody:
        content:
          '*/*':
            schema:
              type: object
              additionalProperties:
                type: boolean
        required: true
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
  /v1/devices/wait_for_linked_device/{tokenIdentifier}:
    get:
      tags:
      - Devices
      summary: Wait for a new device to be linked to an account
      description: |
        Waits for a new device to be linked to an account and returns basic information about the new device when
        available.
      operationId: waitForLinkedDevice
      parameters:
      - name: tokenIdentifier
        in: path
        required: true
        schema:
          maxLength: 64
          minLength: 32
          type: string
          description: A 'link device' token identifier provided by the 'create link
            device token' endpoint
      - name: timeout
        in: query
        schema:
          maximum: 3600
          minimum: 1
          type: integer
          description: |2
              The amount of time (in seconds) to wait for a response. If the expected device is not linked within the
              given amount of time, this endpoint will return a status of HTTP/204.
          format: int32
          default: 30
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        "200":
          description: A device was linked to an account using the token associated
            with the given token identifier
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeviceInfo"
        "204":
          description: No device was linked to the account before the call completed;
            clients may repeat the call to continue waiting
        "400":
          description: The given token identifier or timeout was invalid
        "429":
          description: Rate-limited; try again after the prescribed delay
      security:
      - authenticatedAccount: []
  /v2/directory/auth:
    get:
      tags:
      - Directory
      summary: Generate credentials for Contact Discovery Service
      description: "Generate Contact Discovery Service credentials. Generated credentials\
        \ have an expiration time of 24 hours \n(however, the TTL is fully controlled\
        \ by the server and may change even for already generated credentials).\n"
      operationId: getAuthToken
      responses:
        "200":
          description: '`JSON` with generated credentials.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExternalServiceCredentials"
      security:
      - authenticatedAccount: []
  /v1/donation/redeem-receipt:
    post:
      tags:
      - Donations
      summary: Redeem receipt
      description: |
        Redeem a receipt acquired from /v1/subscription/{subscriberId}/receipt_credentials to add a badge to the
        account. After successful redemption, profile responses will include the corresponding badge (if configured as
        visible) until the expiration time on the receipt.
      operationId: redeemReceipt_1
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RedeemReceiptRequest"
        required: true
      responses:
        "200":
          description: The receipt was redeemed
        "400":
          description: |
            The provided presentation or receipt was invalid, or the receipt was already redeemed for a different account. A
            specific error message suitable for logging will be included as text/plain body
        "429":
          description: Rate limited.
      security:
      - authenticatedAccount: []
  /v1/keepalive:
    get:
      tags:
      - Keep Alive
      operationId: getKeepAlive
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/WebSocketSessionContext"
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
      - {}
  /v1/keepalive/provisioning:
    get:
      tags:
      - Keep Alive
      operationId: getProvisioningKeepAlive
      responses:
        default:
          description: default response
          content:
            '*/*': {}
  /v1/key-transparency/distinguished:
    get:
      tags:
      - KeyTransparency
      summary: Get the current value of the distinguished key
      description: |
        The response contains the distinguished tree head to prove consistency
        against for future calls to `/search`, `/monitor`, and `/distinguished`.
        Enforced unauthenticated endpoint.
      operationId: getDistinguishedKey
      parameters:
      - name: lastTreeHeadSize
        in: query
        description: The distinguished tree head size returned by a previously verified
          call
        schema:
          type: integer
          format: int64
      responses:
        "200":
          description: The `distinguished` search key exists in the log
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KeyTransparencyDistinguishedKeyResponse"
        "400":
          description: Invalid request. See response for any available details.
        "422":
          description: Invalid request format
        "429":
          description: Rate-limited
      security:
      - authenticatedAccount: []
      - {}
  /v1/key-transparency/monitor:
    post:
      tags:
      - KeyTransparency
      summary: Monitor the given identifiers in the key transparency log
      description: |
        Return proofs proving that the log tree has been constructed correctly in later entries for each of the given
        identifiers. Enforced unauthenticated endpoint.
      operationId: monitor
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/KeyTransparencyMonitorRequest"
        required: true
      responses:
        "200":
          description: All identifiers exist in the log
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KeyTransparencyMonitorResponse"
        "400":
          description: Invalid request. See response for any available details.
        "403":
          description: One or more of the provided commitment indexes did not match
        "404":
          description: At least one identifier was not found
        "429":
          description: Rate-limited
        "422":
          description: Invalid request format
      security:
      - authenticatedAccount: []
      - {}
  /v1/key-transparency/search:
    post:
      tags:
      - KeyTransparency
      summary: Search for the given identifiers in the key transparency log
      description: |
        Returns a response if the ACI exists in the transparency log and its mapped value matches the provided
        ACI identity key.

        The username hash search response field is populated if it is found in the log and its mapped value matches
        the provided ACI. The E164 search response is populated similarly, with some additional requirements:
        - The account associated with the provided ACI must be discoverable by phone number.
        - The provided unidentified access key must match the one on the account.

        Enforced unauthenticated endpoint.
      operationId: search
      requestBody:
        content:
          '*/*':
            schema:
              $ref: "#/components/schemas/KeyTransparencySearchRequest"
        required: true
      responses:
        "200":
          description: The ACI was found and its mapped value matched the provided
            ACI identity key
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KeyTransparencySearchResponse"
        "400":
          description: Invalid request. See response for any available details.
        "403":
          description: |
            The ACI was found but its mapped value did not match the provided ACI identity key
            or the ACI was not found in the log.
        "422":
          description: Invalid request format
        "429":
          description: Rate-limited
      security:
      - authenticatedAccount: []
      - {}
  /v2/keys/check:
    post:
      tags:
      - Keys
      summary: Check keys
      description: |
        Checks that client and server have consistent views of repeated-use keys. For a given identity type, clients
        submit a digest of their repeated-use key material. The digest is calculated as:

        SHA256(identityKeyBytes || signedEcPreKeyId || signedEcPreKeyIdBytes || lastResortKeyId || lastResortKeyBytes)

        …where the elements of the hash are:

        - identityKeyBytes: the serialized form of the client's public identity key as produced by libsignal (i.e. one
          version byte followed by 32 bytes of key material for a total of 33 bytes)
        - signedEcPreKeyId: an 8-byte, big-endian representation of the ID of the client's signed EC pre-key
        - signedEcPreKeyBytes: the serialized form of the client's signed EC pre-key as produced by libsignal (i.e. one
          version byte followed by 32 bytes of key material for a total of 33 bytes)
        - lastResortKeyId: an 8-byte, big-endian representation of the ID of the client's last-resort Kyber key
        - lastResortKeyBytes: the serialized form of the client's last-resort Kyber key as produced by libsignal (i.e. one
          version byte followed by 1568 bytes of key material for a total of 1569 bytes)
      operationId: checkKeys
      responses:
        "200":
          description: Indicates that client and server have consistent views of repeated-use
            keys
        "401":
          description: Account authentication check failed
        "409":
          description: |2
              Indicates that client and server have inconsistent views of repeated-use keys or one or more repeated-use keys could
              not be found
        "422":
          description: Invalid request format
      security:
      - authenticatedAccount: []
  /v2/keys/{identifier}/{device_id}:
    get:
      tags:
      - Keys
      summary: Fetch public keys for another user
      description: Retrieves the public identity key and available device prekeys
        for a specified account or phone-number identity
      operationId: getDeviceKeys
      parameters:
      - name: Unidentified-Access-Key
        in: header
        schema:
          $ref: "#/components/schemas/Anonymous"
      - name: Group-Send-Token
        in: header
        schema:
          $ref: "#/components/schemas/GroupSendTokenHeader"
      - name: identifier
        in: path
        description: the account or phone-number identifier to retrieve keys for
        required: true
        schema:
          $ref: "#/components/schemas/ServiceIdentifier"
      - name: device_id
        in: path
        description: "the device id of a single device to retrieve prekeys for, or\
          \ `*` for all enabled devices"
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        "200":
          description: Indicates at least one prekey was available for at least one
            requested device.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PreKeyResponse"
        "400":
          description: A group send endorsement and other authorization (account authentication
            or unidentified-access key) were both provided.
        "401":
          description: Account authentication check failed and unidentified-access
            key or group send endorsement token was not supplied or invalid.
        "404":
          description: Requested identity or device does not exist or device has no
            available prekeys.
        "429":
          description: Rate limit exceeded.
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v2/keys:
    get:
      tags:
      - Keys
      summary: Get prekey count
      description: Gets the number of one-time prekeys uploaded for this device and
        still available
      operationId: getStatus
      parameters:
      - name: identity
        in: query
        schema:
          type: string
          default: aci
          enum:
          - ACI
          - PNI
      responses:
        "200":
          description: Body contains the number of available one-time prekeys for
            the device.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PreKeyCount"
        "401":
          description: Account authentication check failed.
      security:
      - authenticatedAccount: []
    put:
      tags:
      - Keys
      summary: Upload new prekeys
      description: Upload new pre-keys for this device.
      operationId: setKeys
      parameters:
      - name: identity
        in: query
        allowEmptyValue: true
        schema:
          type: string
          description: whether this operation applies to the account (aci) or phone-number
            (pni) identity
          default: aci
          enum:
          - ACI
          - PNI
          - aci
          - pni
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        "200":
          description: Indicates that new keys were successfully stored.
        "401":
          description: Account authentication check failed.
        "403":
          description: Attempt to change identity key from a non-primary device.
        "422":
          description: Invalid request format.
      security:
      - authenticatedAccount: []
  /v1/messages:
    get:
      tags:
      - Messages
      operationId: getPendingMessages
      parameters:
      - name: X-Signal-Receive-Stories
        in: header
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                type: object
                properties:
                  done:
                    type: boolean
                  cancelled:
                    type: boolean
                  completedExceptionally:
                    type: boolean
                  numberOfDependents:
                    type: integer
                    format: int32
      security:
      - authenticatedAccount: []
  /v1/messages/report/{source}/{messageGuid}:
    post:
      tags:
      - Messages
      operationId: reportSpamMessage
      parameters:
      - name: source
        in: path
        required: true
        schema:
          type: string
      - name: messageGuid
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SpamReport"
      responses:
        default:
          description: default response
          content:
            '*/*': {}
      security:
      - authenticatedAccount: []
  /v1/messages/{destination}:
    put:
      tags:
      - Messages
      summary: Send a message
      description: |
        Deliver a message to a single recipient. May be authenticated or unauthenticated; if unauthenticated,
        an unidentifed-access key or group-send endorsement token must be provided, unless the message is a story.
      operationId: sendMessage
      parameters:
      - name: Unidentified-Access-Key
        in: header
        description: The recipient's unidentified access key
        schema:
          $ref: "#/components/schemas/Anonymous"
      - name: Group-Send-Token
        in: header
        description: A group send endorsement token covering the recipient. Must not
          be combined with `Unidentified-Access-Key` or set on a story message.
        schema:
          $ref: "#/components/schemas/GroupSendTokenHeader"
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: destination
        in: path
        description: The recipient’s account or phone-number identifier
        required: true
        schema:
          $ref: "#/components/schemas/ServiceIdentifier"
      - name: story
        in: query
        description: "If true, the message is a story; access tokens are not checked\
          \ and sending to nonexistent recipients is permitted"
        schema:
          type: boolean
      requestBody:
        description: The encrypted message payloads for each recipient device
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/IncomingMessageList"
        required: true
      responses:
        "200":
          description: Message was successfully sent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendMessageResponse"
        "401":
          description: "The message is not a story and the authorization, unauthorized\
            \ access key, or group send endorsement token is missing or incorrect"
        "404":
          description: The message is not a story and some the recipient service ID
            does not correspond to a registered Signal user
        "409":
          description: Incorrect set of devices supplied for recipient
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MismatchedDevicesResponse"
        "410":
          description: Mismatched registration ids supplied for some recipient devices
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StaleDevicesResponse"
        "428":
          description: The sender should complete a challenge before proceeding
      security:
      - authenticatedAccount: []
      - {}
  /v1/messages/multi_recipient:
    put:
      tags:
      - Messages
      summary: Send multi-recipient sealed-sender message
      description: |
        Deliver a common-payload message to multiple recipients.
        An unidentifed-access key for all recipients must be provided, unless the message is a story.
      operationId: sendMultiRecipientMessage
      parameters:
      - name: Unidentified-Access-Key
        in: header
        description: The bitwise xor of the unidentified access keys for every recipient
          of the message. Will be replaced with group send endorsements
        schema:
          $ref: "#/components/schemas/CombinedUnidentifiedSenderAccessKeys"
      - name: Group-Send-Token
        in: header
        description: A group send endorsement token covering recipients of this message.
          Must not be combined with `Unidentified-Access-Key` or set on a story message.
        schema:
          $ref: "#/components/schemas/GroupSendTokenHeader"
      - name: online
        in: query
        description: "If true, deliver the message only to recipients that are online\
          \ when it is sent"
        schema:
          type: boolean
      - name: ts
        in: query
        description: The sender's timestamp for the envelope
        schema:
          type: integer
          format: int64
      - name: urgent
        in: query
        description: "If true, this message should cause push notifications to be\
          \ sent to recipients"
        schema:
          type: boolean
          default: true
      - name: story
        in: query
        description: "If true, the message is a story; access tokens are not checked\
          \ and sending to nonexistent recipients is permitted"
        schema:
          type: boolean
      requestBody:
        description: The sealed-sender multi-recipient message payload as serialized
          by libsignal
        content:
          application/vnd.signal-messenger.mrm:
            schema:
              $ref: "#/components/schemas/SealedSenderMultiRecipientMessage"
        required: true
      responses:
        "200":
          description: Message was successfully sent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendMultiRecipientMessageResponse"
        "400":
          description: The envelope specified delivery to the same recipient device
            multiple times
        "401":
          description: The message is not a story and the unauthorized access key
            or group send endorsement token is missing or incorrect
        "404":
          description: The message is not a story and some of the recipient service
            IDs do not correspond to registered Signal users
        "409":
          description: Incorrect set of devices supplied for some recipients
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AccountMismatchedDevices"
        "410":
          description: Mismatched registration ids supplied for some recipient devices
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AccountStaleDevices"
  /v1/subscription/boost/paypal/confirm:
    post:
      tags:
      - OneTimeDonations
      operationId: confirmPayPalBoost
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConfirmPayPalBoostRequest"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                type: object
                properties:
                  done:
                    type: boolean
                  cancelled:
                    type: boolean
                  completedExceptionally:
                    type: boolean
                  numberOfDependents:
                    type: integer
                    format: int32
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/boost/create:
    post:
      tags:
      - OneTimeDonations
      summary: Create a Stripe payment intent
      description: |
        Create a Stripe PaymentIntent and return a client secret that can be used to complete the payment.

        Once the payment is complete, the paymentIntentId can be used at /v1/subscriptions/receipt_credentials
      operationId: createBoostPaymentIntent
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateBoostRequest"
        required: true
      responses:
        "200":
          description: Payment Intent created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateBoostResponse"
        "403":
          description: The request was made on an authenticated channel
        "400":
          description: |
            Invalid argument. The response body may include an error code with more specific information. If the error code
            is `amount_below_currency_minimum` the body will also include the `minimum` field indicating the minimum amount
            for the currency. If the error code is `amount_above_sepa_limit` the body will also include the `maximum`
            field indicating the maximum amount for a SEPA transaction.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/boost/receipt_credentials:
    post:
      tags:
      - OneTimeDonations
      operationId: createBoostReceiptCredentials
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateBoostReceiptCredentialsRequest"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                type: object
                properties:
                  done:
                    type: boolean
                  cancelled:
                    type: boolean
                  completedExceptionally:
                    type: boolean
                  numberOfDependents:
                    type: integer
                    format: int32
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/boost/paypal/create:
    post:
      tags:
      - OneTimeDonations
      operationId: createPayPalBoost
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreatePayPalBoostRequest"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                type: object
                properties:
                  done:
                    type: boolean
                  cancelled:
                    type: boolean
                  completedExceptionally:
                    type: boolean
                  numberOfDependents:
                    type: integer
                    format: int32
      security:
      - authenticatedAccount: []
      - {}
  /v1/payments/auth:
    get:
      tags:
      - Payments
      operationId: getAuth
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExternalServiceCredentials"
      security:
      - authenticatedAccount: []
  /v1/payments/conversions:
    get:
      tags:
      - Payments
      operationId: getConversions
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CurrencyConversionEntityList"
      security:
      - authenticatedAccount: []
  /v1/profile/{identifier}/{version}:
    get:
      tags:
      - Profile
      summary: Get versioned profile
      description: Retrieves a specific version of an account's profile. Requires
        either authentication or an unidentified access key.
      operationId: getProfile
      parameters:
      - name: Unidentified-Access-Key
        in: header
        schema:
          $ref: "#/components/schemas/Anonymous"
      - name: identifier
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/AciServiceIdentifier"
      - name: version
        in: path
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        "200":
          description: Profile retrieved successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VersionedProfileResponse"
        "400":
          description: Malformed identifier
        "401":
          description: Not authorized to access this profile.
        "404":
          description: Profile or account not found.
        "429":
          description: Rate limit exceeded.
      security:
      - authenticatedAccount: []
      - {}
  /v1/profile/{identifier}/{version}/{credentialRequest}:
    get:
      tags:
      - Profile
      summary: Get profile with credential
      description: Retrieves a specific version of an account's profile along with
        an expiring profile key credential. Requires either authentication or an unidentified
        access key.
      operationId: getProfile_1
      parameters:
      - name: Unidentified-Access-Key
        in: header
        schema:
          $ref: "#/components/schemas/Anonymous"
      - name: identifier
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/AciServiceIdentifier"
      - name: version
        in: path
        required: true
        schema:
          type: string
      - name: credentialRequest
        in: path
        required: true
        schema:
          type: string
      - name: credentialType
        in: query
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      responses:
        "200":
          description: Account found. Profile information will be limited and credential
            will be null if the version was not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExpiringProfileKeyCredentialProfileResponse"
        "400":
          description: Invalid credential type or credential request.
        "401":
          description: Not authorized to access this profile.
        "404":
          description: Profile or account not found.
        "429":
          description: Rate limit exceeded.
      security:
      - authenticatedAccount: []
      - {}
  /v1/profile/{identifier}:
    get:
      tags:
      - Profile
      summary: Get unversioned profile
      description: "Retrieves basic profile information without a specific version.\
        \ Supports ACI and PNI identifiers. Requires authentication, an unidentified\
        \ access key, or a group send token."
      operationId: getUnversionedProfile
      parameters:
      - name: Unidentified-Access-Key
        in: header
        schema:
          $ref: "#/components/schemas/Anonymous"
      - name: Group-Send-Token
        in: header
        schema:
          $ref: "#/components/schemas/GroupSendTokenHeader"
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: identifier
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/ServiceIdentifier"
      responses:
        "200":
          description: Unversioned profile retrieved successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BaseProfileResponse"
        "400":
          description: "Invalid request (e.g., multiple authorization types provided)."
        "401":
          description: Not authorized to access this profile.
        "404":
          description: Account not found.
        "429":
          description: Rate limit exceeded.
      security:
      - authenticatedAccount: []
      - {}
  /v1/profile/identity_check/batch:
    post:
      tags:
      - Profile
      summary: Batch identity key check
      description: Checks identity key fingerprints for multiple accounts. Returns
        accounts where the fingerprint does not match. Should not be authenticated.
      operationId: runBatchIdentityCheck
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BatchIdentityCheckRequest"
        required: true
      responses:
        "200":
          description: Batch check completed successfully. Response may contain accounts
            with mismatched fingerprints.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BatchIdentityCheckResponse"
        "400":
          description: Invalid request format or validation failed.
        "429":
          description: Rate limit exceeded.
  /v1/profile:
    put:
      tags:
      - Profile
      summary: Update profile
      description: Updates an account’s profile. Must be authenticated.
      operationId: setProfile
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateProfileRequest"
        required: true
      responses:
        "200":
          description: The profile was updated successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProfileAvatarUploadAttributes"
        "400":
          description: Invalid create profile request.
        "401":
          description: Account authentication check failed.
        "403":
          description: "The request contained a payment address, but payments are\
            \ not supported in the region of the account’s phone number."
        "412":
          description: The requesting account has the profiles_v2 capability
        "422":
          description: Invalid request format
      security:
      - authenticatedAccount: []
  /v1/provisioning/{destination}:
    put:
      tags:
      - Provisioning
      summary: Send a provisioning message to a new device
      description: |
        Send a provisioning message from an authenticated device to a device that (presumably) is not yet associated
        with a Signal account.
      operationId: sendProvisioningMessage
      parameters:
      - name: destination
        in: path
        description: The temporary provisioning address to which to send a provisioning
          message
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        description: The provisioning message to send to the given provisioning address
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProvisioningMessage"
        required: true
      responses:
        "204":
          description: The provisioning message was delivered to the given provisioning
            address
        "400":
          description: The provisioning message was too large
        "404":
          description: No device with the given provisioning address was connected
            at the time of the request
      security:
      - authenticatedAccount: []
  /v1/registration:
    post:
      tags:
      - Registration
      summary: Registers an account
      description: "Registers a new account or attempts to “re-register” an existing\
        \ account. It is expected that a well-behaved client\ncould make up to three\
        \ consecutive calls to this API:\n1. gets 423 from existing registration lock\
        \ \n\n2. gets 409 from device available for transfer \n\n3. success \n\n"
      operationId: register
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          $ref: "#/components/schemas/BasicAuthorizationHeader"
      - name: X-Signal-Agent
        in: header
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RegistrationRequest"
        required: true
      responses:
        "200":
          description: Account creation succeeded
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountCreationResponse"
        "401":
          description: The session identified in the request is not verified
        "403":
          description: Verification failed for the provided Registration Recovery
            Password
        "409":
          description: "The caller has not explicitly elected to skip transferring\
            \ data from another device, but a device transfer is technically possible"
        "422":
          description: The request did not pass validation
        "423":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RegistrationLockFailure"
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
        "499":
          description: Client must support post-quantum ratchet
  /v2/config:
    get:
      tags:
      - Remote Config
      summary: Fetch remote configuration
      description: "Remote configuration is a list of namespaced keys that clients\
        \ may use for consistent configuration or behavior. Configuration values change\
        \ over time, and the list should be refreshed periodically, typically at client\
        \ launch and every few hours thereafter. Some values depend on the authenticated\
        \ user, so the list should be refreshed immediately if the user changes."
      operationId: getAll
      parameters:
      - name: User-Agent
        in: header
        description: The user agent in standard form.
        schema:
          type: string
      responses:
        "200":
          description: Remote configuration values for the authenticated user
          headers:
            ETag:
              description: A hash of the configuration content which can be supplied
                in an If-None-Match header on future requests
              style: simple
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RemoteConfigurationResponse"
        "304":
          description: There is no change since the last fetch
        "401":
          description: This request requires authentication
      security:
      - authenticatedAccount: []
  /v1/storage/auth:
    get:
      tags:
      - Secure Storage
      summary: Generate credentials for Storage Service
      description: "Generate Storage Service credentials. Generated credentials have\
        \ an expiration time of 24 hours \n(however, the TTL is fully controlled by\
        \ the server and may change even for already generated credentials).\n"
      operationId: getAuth_1
      responses:
        "200":
          description: '`JSON` with generated credentials.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExternalServiceCredentials"
      security:
      - authenticatedAccount: []
  /v2/{name}/auth/check:
    post:
      tags:
      - Secure Value Recovery
      summary: Check SVR2 credentials
      description: |
        Over time, clients may wind up with multiple sets of SVR2 authentication credentials in cloud storage.
        To determine which set is most current and should be used to communicate with SVR2 to retrieve a master key
        (from which a registration recovery password can be derived), clients should call this endpoint
        with a list of stored credentials. The response will identify which (if any) set of credentials are appropriate for communicating with SVR2.
      operationId: authCheck
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AuthCheckRequest"
        required: true
      responses:
        "200":
          description: '`JSON` with the check results.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuthCheckResponseV2"
        "422":
          description: Provided list of SVR2 credentials could not be parsed
        "400":
          description: '`POST` request body is not a valid `JSON`'
  /v2/{name}/auth:
    get:
      tags:
      - Secure Value Recovery
      summary: Generate credentials for SVR2
      description: |
        Generate SVR2 service credentials. Generated credentials have an expiration time of 30 days
        (however, the TTL is fully controlled by the server side and may change even for already generated credentials).
      operationId: getAuth_2
      responses:
        "200":
          description: '`JSON` with generated credentials.'
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExternalServiceCredentials"
        "401":
          description: Account authentication check failed.
      security:
      - authenticatedAccount: []
  /v1/sticker/pack/form/{count}:
    get:
      tags:
      - Stickers
      operationId: getStickersForm
      parameters:
      - name: count
        in: path
        required: true
        schema:
          maximum: 201
          minimum: 1
          type: integer
          format: int32
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StickerPackFormUploadAttributes"
      security:
      - authenticatedAccount: []
  /v1/subscription/configuration:
    get:
      tags:
      - Subscriptions
      summary: 'Subscription configuration '
      description: |-
        Returns all configuration for badges, donation subscriptions, backup subscriptions, and one-time donation (
        "boost" and "gift") minimum and suggested amounts.
      operationId: getConfiguration_1
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetSubscriptionConfigurationResponse"
  /v1/subscription/{subscriberId}/create_payment_method/paypal:
    post:
      tags:
      - Subscriptions
      operationId: createPayPalPaymentMethod
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
          nullable: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreatePayPalBillingAgreementRequest"
        required: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreatePayPalBillingAgreementResponse"
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/create_payment_method:
    post:
      tags:
      - Subscriptions
      operationId: createPaymentMethod
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: type
        in: query
        schema:
          type: string
          default: CARD
          enum:
          - UNKNOWN
          - CARD
          - PAYPAL
          - SEPA_DEBIT
          - IDEAL
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
      - name: User-Agent
        in: header
        schema:
          type: string
          nullable: true
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreatePaymentMethodResponse"
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/receipt_credentials:
    post:
      tags:
      - Subscriptions
      summary: Create receipt credentials
      description: |
        Create a receipt from a valid payment invoice that can be used to obtain an entitlement

        This request is repeatable so long as the ReceiptCredentialRequest remains the same. Clients should use the same
        ReceiptCredentialRequest value until they attempt to redeem the resulting ReceiptCredentialPresentation. After
        this point, the ReceiptCredentialRequest MUST NOT be reused or you may not be able to redeem a valid payment
        invoice. Clients SHOULD retry requests at this endpoint with the same ReceiptCredentialRequest value until
        receiving a response. After receiving a response, clients should then compute the ReceiptCredentialPresentation
        and redeem it at the receipt redemption endpoint. Once the first attempt is made there, the same
        ReceiptCredentialRequest MUST NOT be used again to request receipt credentials.

        Note that you may in fact redeem TWO or more invoices for the same ReceiptCredentialRequest while retrying this
        operation if a later invoice gets paid while you are retrying. However, the returned receipt is always for the
        latest invoice, so it will have the latest expiration possible and no entitlement time will be lost. The important
        thing is not to reuse ReceiptCredentialRequest after you have started attempting to redeem the associated
        ReceiptCredentialPresentation. Then you may produce a ReceiptCredentialPresentation for a later invoice that
        cannot be redeemed.

        Clients MUST validate that the generated receipt credential's level and expiration matches their expectations.
      operationId: createSubscriptionReceiptCredentials
      parameters:
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetReceiptCredentialsRequest"
        required: true
      responses:
        "200":
          description: Successfully created receipt
        "204":
          description: No invoice has been issued for this subscription OR invoice
            is in 'draft' or 'open' state
        "400":
          description: Bad ReceiptCredentialRequest
        "402":
          description: "Invoice is in any state other than 'draft', 'open', or 'paid'.\
            \ May include chargeFailure details in body."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChargeFailureResponse"
        "403":
          description: subscriberId authentication failure OR account authentication
            is present
        "404":
          description: subscriberId is not found OR malformed OR no subscription setup
            on the subscriber id
        "409":
          description: latest paid receipt on subscription was already redeemed for
            a receipt credential but with a different receipt credential request
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}:
    get:
      tags:
      - Subscriptions
      summary: Subscription information
      description: |
        Returns information about the current subscription associated with the provided subscriberId if one exists.

        Although it uses [Stripe’s values](https://stripe.com/docs/billing/subscriptions/overview#subscription-statuses),
        the status field in the response is generic, with [Braintree-specific values](https://developer.paypal.com/braintree/docs/guides/recurring-billing/overview#subscription-statuses) mapped
        to Stripe's. Since we don’t support trials or unpaid subscriptions, the associated statuses will never be returned
        by the API.
      operationId: getSubscriptionInformation
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: The subscriberId exists
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetSubscriptionInformationResponse"
        "403":
          description: subscriberId authentication failure OR account authentication
            is present
        "404":
          description: No such subscriberId exists or subscriberId is malformed
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
    put:
      tags:
      - Subscriptions
      summary: Create/refresh a subscriber
      description: |
        Creates a subscriber record if it does not exist, otherwise refreshes its last access time.

        Subscribers MUST periodically hit this endpoint to update the access time on the subscription record. Subscribers
        SHOULD attempt to make an update call approximately every 3 days. Not accessing this endpoint for an extended
        period of time will result in the subscription being canceled.
      operationId: updateSubscriber
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: The subscriber was successfully created or refreshed
        "403":
          description: subscriberId authentication failure OR account authentication
            is present
        "404":
          description: subscriberId is malformed
      security:
      - authenticatedAccount: []
      - {}
    delete:
      tags:
      - Subscriptions
      summary: Cancel a subscription
      description: |
        Cancels any current subscription at the end of the current subscription period.

        Note: Apple IAP subscriptions do not support server-side cancellation, so this method should only be called after
        cancelling a subscription from storekit to keep server data up to date.
      operationId: deleteSubscriber
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: All subscriptions cancelled
        "403":
          description: Account authentication is present
        "404":
          description: subscriberId is not found or malformed
        "400":
          description: The associated subscription is not a type that can be cancelled
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/bank_mandate/{bankTransferType}:
    get:
      tags:
      - Subscriptions
      operationId: getBankMandate
      parameters:
      - name: bankTransferType
        in: path
        required: true
        schema:
          type: string
          enum:
          - SEPA_DEBIT
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetBankMandateResponse"
  /v1/subscription/{subscriberId}/appstore/{originalTransactionId}:
    post:
      tags:
      - Subscriptions
      summary: Set app store subscription
      description: |
        Set an originalTransactionId that represents an IAP subscription made with the app store.

        To set up an app store subscription:
        1. Create a subscriber with `PUT subscriptions/{subscriberId}` (you must regularly refresh this subscriber)
        2. [Create a subscription](https://developer.apple.com/documentation/storekit/in-app_purchase/) with the App Store
           directly via StoreKit and obtain a originalTransactionId.
        3. `POST` the purchaseToken here
        4. Obtain a receipt at `POST /v1/subscription/{subscriberId}/receipt_credentials` which can then be used to obtain the
           entitlement
      operationId: setAppStoreSubscription
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: originalTransactionId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: The originalTransactionId was successfully validated
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SetSubscriptionLevelSuccessResponse"
        "402":
          description: The subscription transaction is incomplete or invalid
        "403":
          description: subscriberId authentication failure OR account authentication
            is present
        "404":
          description: No such subscriberId exists or subscriberId is malformed or
            the specified transaction does not exist
        "409":
          description: subscriberId is already linked to a processor that does not
            support appstore payments. Delete this subscriberId and use a new one.
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/default_payment_method_for_ideal/{setupIntentId}:
    post:
      tags:
      - Subscriptions
      operationId: setDefaultPaymentMethodForIdeal
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: setupIntentId
        in: path
        required: true
        schema:
          minLength: 1
          type: string
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/default_payment_method/{processor}/{paymentMethodToken}:
    post:
      tags:
      - Subscriptions
      operationId: setDefaultPaymentMethodWithProcessor
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: processor
        in: path
        required: true
        schema:
          type: string
          enum:
          - STRIPE
          - BRAINTREE
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
      - name: paymentMethodToken
        in: path
        required: true
        schema:
          minLength: 1
          type: string
      responses:
        default:
          description: default response
          content:
            application/json: {}
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/playbilling/{purchaseToken}:
    post:
      tags:
      - Subscriptions
      summary: Set a google play billing purchase token
      description: |
        Set a purchaseToken that represents an IAP subscription made with Google Play Billing.

        To set up a subscription with Google Play Billing:
        1. Create a subscriber with `PUT subscriptions/{subscriberId}` (you must regularly refresh this subscriber)
        2. [Create a subscription](https://developer.android.com/google/play/billing/integrate) with Google Play Billing
           directly and obtain a purchaseToken. Do not [acknowledge](https://developer.android.com/google/play/billing/integrate#subscriptions)
           the purchaseToken.
        3. `POST` the purchaseToken here
        4. Obtain a receipt at `POST /v1/subscription/{subscriberId}/receipt_credentials` which can then be used to obtain the
           entitlement

        After calling this method, the payment is confirmed. Callers must durably store their subscriberId before calling
        this method to ensure their payment is tracked.

        Once a purchaseToken to is posted to a subscriberId, the same subscriberId must not be used with another payment
        method. A different playbilling purchaseToken can be posted to the same subscriberId, in this case the subscription
        associated with the old purchaseToken will be cancelled.
      operationId: setPlayStoreSubscription
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: purchaseToken
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: The purchaseToken was validated and acknowledged
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SetSubscriptionLevelSuccessResponse"
        "402":
          description: The purchaseToken payment is incomplete or invalid
        "403":
          description: subscriberId authentication failure OR account authentication
            is present
        "404":
          description: No such subscriberId exists or subscriberId is malformed or
            the purchaseToken does not exist
        "409":
          description: subscriberId is already linked to a processor that does not
            support Play Billing. Delete this subscriberId and use a new one.
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, a positive integer indicating the number of\
                \ seconds before a subsequent attempt could succeed"
              style: simple
      security:
      - authenticatedAccount: []
      - {}
  /v1/subscription/{subscriberId}/level/{level}/{currency}/{idempotencyKey}:
    put:
      tags:
      - Subscriptions
      operationId: setSubscriptionLevel
      parameters:
      - name: subscriberId
        in: path
        required: true
        schema:
          type: string
      - name: level
        in: path
        required: true
        schema:
          type: integer
          format: int64
      - name: currency
        in: path
        required: true
        schema:
          type: string
      - name: idempotencyKey
        in: path
        required: true
        schema:
          type: string
      responses:
        default:
          description: default response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SetSubscriptionLevelSuccessResponse"
      security:
      - authenticatedAccount: []
      - {}
  /v1/verification/session:
    post:
      tags:
      - Verification
      summary: Creates a new verification session for a specific phone number
      description: |
        Initiates a session to be able to verify the phone number for account registration. Check the response and
        submit requested information at PATCH /session/{sessionId}
      operationId: createSession
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateVerificationSessionRequest"
        required: true
      responses:
        "200":
          description: The verification session was created successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "422":
          description: The request did not pass validation
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
              schema:
                type: integer
                format: int32
  /v1/verification/session/{sessionId}:
    get:
      tags:
      - Verification
      summary: Get a registration verification session
      description: |
        Retrieve metadata of the registration verification session with the specified ID
      operationId: getSession
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Session was retrieved successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "400":
          description: Invalid session ID
        "404":
          description: Session with the specified ID could not be found
        "422":
          description: Malformed session ID encoding
    patch:
      tags:
      - Verification
      summary: Update a registration verification session
      description: |
        Updates the session with requested information like an answer to a push challenge or captcha.
        If `requestedInformation` in the response is empty, and `allowedToRequestCode` is `true`, proceed to call
        `POST /session/{sessionId}/code`. If `requestedInformation` is empty and `allowedToRequestCode` is `false`,
        then the caller must create a new verification session.
      operationId: updateSession
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateVerificationSessionRequest"
        required: true
      responses:
        "200":
          description: Session was updated successfully with the information provided
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "403":
          description: The information provided was not accepted (e.g push challenge
            or captcha verification failed)
        "422":
          description: The request did not pass validation
        "429":
          description: Too many attempts
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
              schema:
                type: integer
                format: int32
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
  /v1/verification/session/{sessionId}/code:
    put:
      tags:
      - Verification
      summary: Submit a verification code
      description: |
        Submits a verification code received via SMS or voice for verification
      operationId: verifyCode
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SubmitVerificationCodeRequest"
        required: true
      responses:
        "200":
          description: |
            The request to check a verification code was processed (though the submitted code may not be the correct code);
            the session metadata will indicate whether the submitted code was correct
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "400":
          description: Invalid session ID or verification  code
        "404":
          description: Session with the specified ID could not be found
        "409":
          description: The session is already verified or no code has been requested
            yet for this session
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "429":
          description: |
            Too many attempts; the caller is not permitted to submit a verification code at this time and may need to wait
            before trying again; if the session metadata does not specify a time at which the caller may try again, then the
            caller has exhausted their permitted attempts and must create a new verification session.
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
              schema:
                type: integer
                format: int32
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
    post:
      tags:
      - Verification
      summary: Request a verification code
      description: |
        Sends a verification code to the phone number associated with the specified session via SMS or phone call.
        This endpoint can only be called when the session metadata includes "allowedToRequestCode = true"
      operationId: requestVerificationCode
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      - name: User-Agent
        in: header
        schema:
          type: string
      - name: Accept-Language
        in: header
        description: Ordered list of languages in which the client prefers to receive
          SMS or voice verification messages
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/VerificationCodeRequest"
        required: true
      responses:
        "200":
          description: Verification code was successfully sent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "400":
          description: Invalid session ID
        "404":
          description: Session with the specified ID could not be found
        "409":
          description: The session is already verified or not in a state to request
            a code because requested information hasn't been provided yet
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "418":
          description: "The request to send a verification code with the given transport\
            \ could not be fulfilled, but may succeed with a different transport"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "422":
          description: Request did not pass validation
        "429":
          description: |
            Too may attempts; the caller is not permitted to send a verification code via the requested channel at this time
            and may need to wait before trying again; if the session metadata does not specify a time at which the caller may
            try again, then the caller has exhausted their permitted attempts and must either try a different transport or
            create a new verification session.
          headers:
            Retry-After:
              description: "If present, an positive integer indicating the number\
                \ of seconds before a subsequent attempt could succeed"
              style: simple
              schema:
                type: integer
                format: int32
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/VerificationSessionResponse"
        "440":
          description: |
            The attempt to send a verification code failed because an external service (e.g. the SMS provider) refused to
            deliver the code. This may be a temporary or permanent failure, as indicated in the response body. If temporary,
            clients may try again after a reasonable delay. If permanent, clients should not retry the request and should
            communicate the permanent failure to the end user. Permanent failures may result in the server disallowing all
            future attempts to request or submit verification codes (since those attempts would be all but guaranteed to fail).
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendVerificationCodeFailureResponse"
components:
  schemas:
    AciServiceIdentifier:
      type: string
      description: An identifier for an account based on the account's ACI
      allOf:
      - $ref: "#/components/schemas/ServiceIdentifier"
    PniServiceIdentifier:
      type: string
      description: An identifier for an account based on the account's phone number
        identifier (PNI)
      allOf:
      - $ref: "#/components/schemas/ServiceIdentifier"
    ServiceIdentifier:
      type: object
      description: A service identifier is a tuple of a UUID and identity type that
        identifies an account and identity within the Signal service.
    UsernameHashResponse:
      type: object
      properties:
        usernameHash:
          type: string
          description: "The hash of the confirmed username, as supplied in the request"
        usernameLinkHandle:
          type: string
          description: A handle that can be included in username links to retrieve
            the stored encrypted username
          nullable: true
    ConfirmUsernameHashRequest:
      required:
      - zkProof
      type: object
      properties:
        usernameHash:
          type: string
          format: byte
        zkProof:
          type: string
          format: byte
        encryptedUsername:
          maxLength: 128
          minLength: 1
          type: string
          description: The url-safe base64-encoded encrypted username to be stored
            for username links
          nullable: true
    AccountIdentifierResponse:
      required:
      - uuid
      type: object
      properties:
        uuid:
          type: string
          description: An identifier for an account based on the account's ACI
    EncryptedUsername:
      required:
      - usernameLinkEncryptedValue
      type: object
      properties:
        usernameLinkEncryptedValue:
          maxLength: 128
          minLength: 1
          type: string
          description: the URL-safe base64 encoding of the encrypted username
        keepLinkHandle:
          type: boolean
          description: "if set and the account already has an encrypted-username link\
            \ handle, reuse the same link handle rather than generating a new one.\
            \ The response will still have the link handle."
    ReserveUsernameHashResponse:
      type: object
      properties:
        usernameHash:
          type: string
          format: byte
    ReserveUsernameHashRequest:
      required:
      - usernameHashes
      type: object
      properties:
        usernameHashes:
          maxItems: 20
          minItems: 1
          type: array
          items:
            type: string
            format: byte
    AccountAttributes:
      type: object
      properties:
        fetchesMessages:
          type: boolean
        registrationId:
          type: integer
          format: int32
        pniRegistrationId:
          type: integer
          format: int32
        name:
          type: string
          format: byte
        capabilities:
          uniqueItems: true
          type: array
          nullable: true
          items:
            type: string
            nullable: true
            enum:
            - STORAGE
            - TRANSFER
            - ATTACHMENT_BACKFILL
            - SPARSE_POST_QUANTUM_RATCHET
        registrationLock:
          type: string
        unidentifiedAccessKey:
          type: string
          format: byte
        unrestrictedUnidentifiedAccess:
          type: boolean
        discoverableByPhoneNumber:
          type: boolean
        recoveryPassword:
          type: string
          format: byte
          nullable: true
        phoneNumberIdentityRegistrationId:
          type: integer
          format: int32
    DeviceAttributes:
      type: object
      properties:
        fetchesMessages:
          type: boolean
        registrationId:
          type: integer
          format: int32
        pniRegistrationId:
          type: integer
          format: int32
        name:
          maxLength: 225
          minLength: 0
          type: string
          format: byte
        capabilities:
          uniqueItems: true
          type: array
          nullable: true
          items:
            type: string
            nullable: true
            enum:
            - STORAGE
            - TRANSFER
            - ATTACHMENT_BACKFILL
            - SPARSE_POST_QUANTUM_RATCHET
    ApnRegistrationId:
      required:
      - apnRegistrationId
      type: object
      properties:
        apnRegistrationId:
          minLength: 1
          type: string
      description: |
        An APNs token set for the account's primary device. If provided, the account's primary
        device will be notified of new messages via push notifications to the given token.
        Callers must provide exactly one of an APNs token set, an FCM token, or an
        `AccountAttributes` entity with `fetchesMessages` set to `true`.
    GcmRegistrationId:
      required:
      - gcmRegistrationId
      type: object
      properties:
        gcmRegistrationId:
          minLength: 1
          type: string
      description: |
        An FCM/GCM token for the account's primary device. If provided, the account's primary
        device will be notified of new messages via push notifications to the given token.
        Callers must provide exactly one of an APNs token set, an FCM token, or an
        `AccountAttributes` entity with `fetchesMessages` set to `true`.
    DeviceName:
      required:
      - deviceName
      type: object
      properties:
        deviceName:
          maxLength: 225
          minLength: 0
          type: string
          format: byte
    RegistrationLock:
      required:
      - registrationLock
      type: object
      properties:
        registrationLock:
          maxLength: 64
          minLength: 64
          type: string
    UsernameLinkHandle:
      required:
      - usernameLinkHandle
      type: object
      properties:
        usernameLinkHandle:
          type: string
          description: A handle that can be included in username links to retrieve
            the stored encrypted username
          format: uuid
    AccountIdentityResponse:
      type: object
      properties:
        uuid:
          type: string
          description: the account identifier for this account
          format: uuid
        number:
          type: string
          description: the phone number associated with this account
        pni:
          type: string
          description: the account identifier for this account's phone-number identity
          format: uuid
        usernameHash:
          type: string
          description: "a hash of this account's username, if set"
          format: byte
          nullable: true
        usernameLinkHandle:
          type: string
          description: "this account's username link handle, if set"
          format: uuid
          nullable: true
        storageCapable:
          type: boolean
          description: whether any of this account's devices support storage
        entitlements:
          $ref: "#/components/schemas/Entitlements"
    BackupEntitlement:
      type: object
      properties:
        backupLevel:
          type: integer
          description: The backup level of the account
          format: int64
        expirationSeconds:
          type: integer
          description: "When the backup entitlement expires, in number of seconds\
            \ since epoch"
          format: int64
      description: "If present, the backup level set via /v1/archives/redeem-receipt"
      nullable: true
    BadgeEntitlement:
      type: object
      properties:
        id:
          type: string
          description: The badge id
        expirationSeconds:
          type: integer
          description: "When the badge expires, in number of seconds since epoch"
          format: int64
        visible:
          type: boolean
          description: Whether the badge is currently configured to be visible
      description: Active badges added via /v1/donation/redeem-receipt
    Entitlements:
      type: object
      properties:
        badges:
          type: array
          description: Active badges added via /v1/donation/redeem-receipt
          items:
            $ref: "#/components/schemas/BadgeEntitlement"
        backup:
          $ref: "#/components/schemas/BackupEntitlement"
      description: entitlements for this account and their current expirations
    MismatchedDevicesResponse:
      type: object
      properties:
        missingDevices:
          uniqueItems: true
          type: array
          description: Devices present on the account but absent in the request
          items:
            type: string
            description: Devices present on the account but absent in the request
            format: byte
        extraDevices:
          uniqueItems: true
          type: array
          description: Devices absent on the request but present in the account
          items:
            type: string
            description: Devices absent on the request but present in the account
            format: byte
    StaleDevicesResponse:
      type: object
      properties:
        staleDevices:
          uniqueItems: true
          type: array
          description: Devices that are no longer active
          items:
            type: string
            description: Devices that are no longer active
            format: byte
    ExternalServiceCredentials:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
    RegistrationLockFailure:
      type: object
      properties:
        timeRemaining:
          type: integer
          description: Time remaining in milliseconds before the existing registration
            lock expires
          format: int64
        svr2Credentials:
          $ref: "#/components/schemas/ExternalServiceCredentials"
      description: |
        Information about the current Registration lock and SVR credentials. With a correct PIN, the credentials can
        be used to recover the secret used to derive the registration lock password.
    ChangeNumberRequest:
      required:
      - deviceMessages
      - devicePniPqLastResortPrekeys
      - devicePniSignedPrekeys
      - number
      - pniIdentityKey
      - pniRegistrationIds
      type: object
      properties:
        sessionId:
          type: string
          description: |-
            A session ID from registration service, if using session id to authenticate this request.
            Must not be combined with `recoveryPassword`.
        recoveryPassword:
          type: string
          description: |-
            The base64-encoded recovery password for the new phone number, if using a recovery password to authenticate this request.
            Must not be combined with `sessionId`.
        number:
          minLength: 1
          type: string
          description: the new phone number for this account
        reglock:
          type: string
          description: "the registration lock password for the new phone number, if\
            \ necessary"
          nullable: true
        pniIdentityKey:
          $ref: "#/components/schemas/IdentityKey"
        deviceMessages:
          type: array
          description: |-
            A list of synchronization messages to send to companion devices to supply the private keysManager
            associated with the new identity key and their new prekeys.
            Exactly one message must be supplied for each device other than the sending (primary) device.
          items:
            $ref: "#/components/schemas/IncomingMessage"
        devicePniSignedPrekeys:
          minProperties: 1
          type: object
          additionalProperties:
            $ref: "#/components/schemas/ECSignedPreKey"
          description: |-
            A new signed elliptic-curve prekey for each device on the account, including this one.
            Each must be accompanied by a valid signature from the new identity key in this request.
        devicePniPqLastResortPrekeys:
          minProperties: 1
          type: object
          additionalProperties:
            $ref: "#/components/schemas/KEMSignedPreKey"
          description: |-
            A new signed post-quantum last-resort prekey for each device on the account, including this one.
            Each must be accompanied by a valid signature from the new identity key in this request.
        pniRegistrationIds:
          minProperties: 1
          type: object
          additionalProperties:
            type: integer
            description: "the new phone-number-identity registration ID for each device\
              \ on the account, including this one"
            format: int32
          description: "the new phone-number-identity registration ID for each device\
            \ on the account, including this one"
    ECPublicKey:
      type: object
      properties:
        type:
          type: integer
          format: int32
        publicKeyBytes:
          type: string
          format: byte
    ECSignedPreKey:
      type: object
      properties:
        keyId:
          maximum: 4294967295
          minimum: 0
          type: integer
          description: |
            An arbitrary ID for this key, which will be provided by peers using this key to encrypt messages so the private key can be looked up.
            Should not be zero. Should be less than 2^24.
          format: int64
        publicKey:
          type: string
          description: |
            The public key, serialized in libsignal's elliptic-curve public key format and then base64-encoded.
        signature:
          type: string
          description: |
            The signature of the serialized `publicKey` with the account (or phone-number identity)'s identity key, base64-encoded.
      description: |
        A signed EC pre-key to be associated with this account's PNI.
    IdentityKey:
      type: object
      properties:
        publicKey:
          $ref: "#/components/schemas/ECPublicKey"
        fingerprint:
          type: string
      description: |
        The PNI-associated identity key for the account, encoded as a base64 string.
    IncomingMessage:
      required:
      - content
      type: object
      properties:
        type:
          type: integer
          format: int32
        destinationDeviceId:
          type: string
          format: byte
        destinationRegistrationId:
          type: integer
          format: int32
        content:
          maxLength: 2147483647
          minLength: 1
          type: string
          format: byte
    KEMSignedPreKey:
      type: object
      properties:
        keyId:
          maximum: 4294967295
          minimum: 0
          type: integer
          description: |
            An arbitrary ID for this key, which will be provided by peers using this key to encrypt messages so the private key can be looked up.
            Should not be zero. Should be less than 2^24. The owner of this key must be able to determine from the key ID whether this represents
            a single-use or last-resort key, but another party should *not* be able to tell.
          format: int64
        publicKey:
          type: string
          description: |
            The public key, serialized in libsignal's Kyber1024 public key format and then base64-encoded.
        signature:
          type: string
          description: |
            The signature of the serialized `publicKey` with the account (or phone-number identity)'s identity key, base64-encoded.
      description: |
        A signed Kyber-1024 "last resort" pre-key to be associated with this account's PNI.
    AccountAndDevicesDataReport:
      type: object
      properties:
        account:
          $ref: "#/components/schemas/AccountDataReport"
        devices:
          type: array
          items:
            $ref: "#/components/schemas/DeviceDataReport"
    AccountDataReport:
      type: object
      properties:
        phoneNumber:
          type: string
        badges:
          type: array
          items:
            $ref: "#/components/schemas/BadgeDataReport"
        allowSealedSenderFromAnyone:
          type: boolean
        findAccountByPhoneNumber:
          type: boolean
    AccountDataReportResponse:
      type: object
      properties:
        reportId:
          type: string
          format: uuid
        reportTimestamp:
          type: string
          format: date-time
        data:
          $ref: "#/components/schemas/AccountAndDevicesDataReport"
        text:
          type: string
          description: A plaintext representation of the data report
    BadgeDataReport:
      type: object
      properties:
        id:
          type: string
        expiration:
          type: string
          format: date-time
        visible:
          type: boolean
    DeviceDataReport:
      type: object
      properties:
        id:
          type: string
          format: byte
        lastSeen:
          type: string
          format: date-time
        created:
          type: string
          format: date-time
        userAgent:
          type: string
          nullable: true
    PhoneNumberDiscoverabilityRequest:
      required:
      - discoverableByPhoneNumber
      type: object
      properties:
        discoverableByPhoneNumber:
          type: boolean
    UploadDescriptorResponse:
      type: object
      properties:
        cdn:
          type: integer
          description: Indicates the CDN type. 3 indicates resumable uploads using
            TUS
          format: int32
        key:
          type: string
          description: The location within the specified cdn where the finished upload
            can be found.
        headers:
          type: object
          additionalProperties:
            type: string
            description: A map of headers to include with all upload requests. Potentially
              contains time-limited upload credentials
          description: A map of headers to include with all upload requests. Potentially
            contains time-limited upload credentials
        signedUploadLocation:
          type: string
          description: The URL to upload to with the appropriate protocol
    BackupInfoResponse:
      type: object
      properties:
        cdn:
          type: integer
          description: The CDN type where the message backup is stored. Media may
            be stored elsewhere.
          format: int32
        backupDir:
          type: string
          description: |
            The base directory of your backup data on the cdn. The message backup can be found in the returned cdn at
            /backupDir/backupName and stored media can be found at /backupDir/mediaDir/mediaId
        mediaDir:
          type: string
          description: |
            The prefix path component for media objects on a cdn. Stored media for mediaId can be found at
            /backupDir/mediaDir/mediaId.
        backupName:
          type: string
          description: The name of the most recent message backup on the cdn. The
            backup is at /backupDir/backupName
        usedSpace:
          type: integer
          description: The amount of space used to store media
          format: int64
    BackupIdLimitResponse:
      type: object
      properties:
        hasPermitsRemaining:
          type: boolean
          description: "If true, a call to PUT /v1/archive/backupid may succeed without\
            \ waiting"
        retryAfterSeconds:
          type: integer
          description: "How long to wait before a permit becomes available, in seconds"
          format: int64
    CopyMediaBatchResponse:
      type: object
      properties:
        responses:
          type: array
          description: Detailed outcome information for each copy request in the batch
          items:
            $ref: "#/components/schemas/Entry"
    Entry:
      required:
      - mediaId
      type: object
      properties:
        status:
          type: integer
          description: |
            The outcome of the copy attempt.
            A 200 indicates the object was successfully copied.
            A 400 indicates an invalid argument in the request
            A 410 indicates that the source object was not found
            A 413 indicates that the media quota was exhausted
          format: int32
        failureReason:
          type: string
          description: "On a copy failure, a detailed failure reason"
        cdn:
          type: integer
          description: The backup cdn where this media object is stored
          format: int32
        mediaId:
          type: string
          description: "The mediaId of the object, encoded in URL-safe padded base64"
      description: Detailed outcome information for each copy request in the batch
    CopyMediaBatchRequest:
      required:
      - items
      type: object
      properties:
        items:
          maxItems: 1000
          minItems: 1
          type: array
          description: A list of media objects to copy from the attachments CDN to
            the backup CDN
          items:
            $ref: "#/components/schemas/CopyMediaRequest"
    CopyMediaRequest:
      required:
      - encryptionKey
      - hmacKey
      - mediaId
      - objectLength
      - sourceAttachment
      type: object
      properties:
        sourceAttachment:
          $ref: "#/components/schemas/RemoteAttachment"
        objectLength:
          type: integer
          description: The length of the source attachment before the encryption applied
            by the copy operation
          format: int32
        mediaId:
          type: string
          description: "mediaId to copy on to the backup CDN, encoded in URL-safe\
            \ padded base64"
        hmacKey:
          type: string
          description: "A 32-byte key for the MAC, encoded in standard padded base64"
        encryptionKey:
          type: string
          description: "A 32-byte encryption key for AES, encoded in standard padded\
            \ base64"
    RemoteAttachment:
      required:
      - cdn
      - key
      type: object
      properties:
        cdn:
          type: integer
          description: The attachment cdn
          format: int32
        key:
          maxLength: 64
          minLength: 0
          type: string
          description: The attachment key
    CopyMediaResponse:
      required:
      - cdn
      type: object
      properties:
        cdn:
          type: integer
          description: The backup cdn where this media object is stored
          format: int32
    DeleteMedia:
      type: object
      properties:
        mediaToDelete:
          maxItems: 1000
          minItems: 1
          type: array
          items:
            $ref: "#/components/schemas/MediaToDelete"
    MediaToDelete:
      required:
      - cdn
      - mediaId
      type: object
      properties:
        cdn:
          type: integer
          description: The backup cdn where this media object is stored
          format: int32
        mediaId:
          type: string
          description: The mediaId of the object in URL-safe base64
    BackupAuthCredential:
      type: object
      properties:
        credential:
          type: string
          description: "A BackupAuthCredential, encoded in standard padded base64"
          format: byte
        redemptionTime:
          type: integer
          description: The day on which this credential is valid. Seconds since epoch
            truncated to day boundary
          format: int64
      description: A map of credential types to lists of BackupAuthCredentials and
        their validity periods
    BackupAuthCredentialsResponse:
      type: object
      properties:
        credentials:
          type: object
          additionalProperties:
            type: array
            description: A map of credential types to lists of BackupAuthCredentials
              and their validity periods
            items:
              $ref: "#/components/schemas/BackupAuthCredential"
          description: A map of credential types to lists of BackupAuthCredentials
            and their validity periods
    ListResponse:
      type: object
      properties:
        storedMediaObjects:
          type: array
          description: A page of media objects stored for this backup ID
          items:
            $ref: "#/components/schemas/StoredMediaObject"
        backupDir:
          type: string
          description: |
            The base directory of your backup data on the cdn. The stored media can be found at /backupDir/mediaDir/mediaId
        mediaDir:
          type: string
          description: |
            The prefix path component for the media objects. The stored media for mediaId can be found at /backupDir/mediaDir/mediaId.
        cursor:
          type: string
          description: "If set, the cursor value to pass to the next list request\
            \ to continue listing. If absent, all objects have been listed"
    StoredMediaObject:
      required:
      - cdn
      - mediaId
      - objectLength
      type: object
      properties:
        cdn:
          type: integer
          description: The backup cdn where this media object is stored
          format: int32
        mediaId:
          type: string
          description: The mediaId of the object in URL-safe base64
        objectLength:
          type: integer
          description: The length of the object in bytes
          format: int64
      description: A page of media objects stored for this backup ID
    ReadAuthResponse:
      type: object
      properties:
        headers:
          type: object
          additionalProperties:
            type: string
            description: Auth headers to include with cdn read requests
          description: Auth headers to include with cdn read requests
    RedeemBackupReceiptRequest:
      required:
      - receiptCredentialPresentation
      type: object
      properties:
        receiptCredentialPresentation:
          type: string
          description: Presentation of a ZK receipt encoded in standard padded base64
    SetBackupIdRequest:
      type: object
      properties:
        messagesBackupAuthCredentialRequest:
          type: string
          description: |
            A BackupAuthCredentialRequest containing a blinded encrypted backup-id, encoded in standard padded base64.
            This backup-id should be used for message backups only, and must have the message backup type set on the
            credential. If absent, the message credential request will not be updated.
        mediaBackupAuthCredentialRequest:
          type: string
          description: |
            A BackupAuthCredentialRequest containing a blinded encrypted backup-id, encoded in standard padded base64.
            This backup-id should be used for media only, and must have the media type set on the credential. If absent,
            only the media credential request will not be updated.
    SetPublicKeyRequest:
      required:
      - backupIdPublicKey
      type: object
      properties:
        backupIdPublicKey:
          type: string
          description: "The public key, serialized in libsignal's elliptic-curve public\
            \ key format, and encoded in standard padded base64."
    AttachmentDescriptorV3:
      type: object
      properties:
        cdn:
          type: integer
          description: |
            Indicates the CDN type. 2 in the v3 API, 2 or 3 in the v4 API.
            2 indicates resumable uploads using GCS,
            3 indicates resumable uploads using TUS
          format: int32
        key:
          type: string
          description: The location within the specified cdn where the finished upload
            can be found
        headers:
          type: object
          additionalProperties:
            type: string
            description: A map of headers to include with all upload requests. Potentially
              contains time-limited upload credentials
          description: A map of headers to include with all upload requests. Potentially
            contains time-limited upload credentials
        signedUploadLocation:
          type: string
          description: The URL to upload to with the appropriate protocol
    CreateCallLinkCredential:
      type: object
      properties:
        credential:
          type: string
          format: byte
        redemptionTime:
          type: integer
          format: int64
    GetCreateCallLinkCredentialsRequest:
      required:
      - createCallLinkCredentialRequest
      type: object
      properties:
        createCallLinkCredentialRequest:
          minLength: 1
          type: string
          format: byte
    GetCallingRelaysResponse:
      type: object
      properties:
        relays:
          type: array
          items:
            $ref: "#/components/schemas/TurnToken"
    TurnToken:
      required:
      - urls
      - urlsWithIps
      type: object
      properties:
        username:
          type: string
        password:
          type: string
        ttl:
          type: integer
          format: int64
        urls:
          type: array
          items:
            type: string
        urlsWithIps:
          type: array
          items:
            type: string
        hostname:
          type: string
          nullable: true
    DeliveryCertificate:
      type: object
      properties:
        certificate:
          type: string
          format: byte
    CallLinkAuthCredential:
      type: object
      properties:
        credential:
          type: string
          format: byte
        redemptionTime:
          type: integer
          format: int64
    GroupCredential:
      type: object
      properties:
        credential:
          type: string
          format: byte
        redemptionTime:
          type: integer
          format: int64
    GroupCredentials:
      type: object
      properties:
        credentials:
          type: array
          items:
            $ref: "#/components/schemas/GroupCredential"
        callLinkAuthCredentials:
          type: array
          items:
            $ref: "#/components/schemas/CallLinkAuthCredential"
        pni:
          type: string
          format: uuid
          nullable: true
    AnswerPushChallengeRequest:
      required:
      - challenge
      type: object
      allOf:
      - $ref: "#/components/schemas/AnswerChallengeRequest"
      - type: object
        properties:
          challenge:
            minLength: 1
            type: string
            description: A token provided to the client via a push payload
    AnswerCaptchaChallengeRequest:
      required:
      - captcha
      - token
      type: object
      allOf:
      - $ref: "#/components/schemas/AnswerChallengeRequest"
      - type: object
        properties:
          token:
            minLength: 1
            type: string
            description: The value of the token field from the server's 428 response
          captcha:
            minLength: 1
            type: string
            description: A string representing a solved captcha
            example: signal-hcaptcha.30b01b46-d8c9-4c30-bbd7-9719acfe0c10.challenge.abcdefg1345
    AnswerChallengeRequest:
      required:
      - type
      type: object
      properties:
        type:
          type: string
      discriminator:
        propertyName: type
    ChallengeResponse:
      type: object
      properties:
        challenge:
          type: string
          description: A challenge to use when generating attestations or assertions
    AssertionRequest:
      type: object
      properties:
        challenge:
          type: string
          description: The challenge retrieved at `GET /v1/devicecheck/assert`
        action:
          type: string
          description: The type of action you'd like to perform with this assert
          enum:
          - backup
    LinkDeviceToken:
      type: object
      properties:
        verificationCode:
          type: string
          description: |
            An opaque token to send to a new linked device that authorizes the new device to link itself to the account that
            requested this token.
        tokenIdentifier:
          type: string
          description: |
            An opaque identifier for the generated token that the caller may use to watch for a new device to complete the
            linking process.
    DeviceInfo:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
          format: byte
        lastSeen:
          type: integer
          format: int64
        registrationId:
          type: integer
          description: The registration ID of the given device.
          format: int32
        createdAtCiphertext:
          type: string
          description: |
            The ciphertext of the time in milliseconds since epoch when the device was attached
            to the parent account, encoded in standard base64 without padding.
          format: byte
    DeviceInfoList:
      type: object
      properties:
        devices:
          type: array
          items:
            $ref: "#/components/schemas/DeviceInfo"
    LinkDeviceResponse:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
        pni:
          type: string
          format: uuid
        deviceId:
          type: string
          format: byte
    BasicAuthorizationHeader:
      type: object
      properties:
        username:
          type: string
        deviceId:
          type: integer
          format: int64
        password:
          type: string
    DeviceActivationRequest:
      required:
      - aciPqLastResortPreKey
      - aciSignedPreKey
      - pniPqLastResortPreKey
      - pniSignedPreKey
      type: object
      properties:
        aciSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        pniSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        aciPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        pniPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        apnToken:
          $ref: "#/components/schemas/ApnRegistrationId"
        gcmToken:
          $ref: "#/components/schemas/GcmRegistrationId"
    LinkDeviceRequest:
      required:
      - accountAttributes
      - aciPqLastResortPreKey
      - aciSignedPreKey
      - pniPqLastResortPreKey
      - pniSignedPreKey
      - verificationCode
      type: object
      properties:
        verificationCode:
          minLength: 1
          type: string
          description: |
            The verification code associated with this device. Must match the verification code
            provided by the server when provisioning this device.
        accountAttributes:
          $ref: "#/components/schemas/DeviceAttributes"
        aciSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        pniSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        aciPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        pniPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        apnToken:
          $ref: "#/components/schemas/ApnRegistrationId"
        gcmToken:
          $ref: "#/components/schemas/GcmRegistrationId"
    RestoreAccountRequest:
      required:
      - method
      type: object
      properties:
        method:
          type: string
          description: The method by which the new device has requested account data
            restoration
          enum:
          - REMOTE_BACKUP
          - LOCAL_BACKUP
          - DEVICE_TRANSFER
          - DECLINE
        deviceTransferBootstrap:
          maxLength: 4096
          minLength: 0
          type: string
          description: "Additional data to use to bootstrap a connection between devices,\
            \ in standard unpadded base64."
          nullable: true
      description: |
        Represents a request from a new device to restore account data by some method.
    RemoteAttachmentError:
      required:
      - error
      type: object
      properties:
        error:
          type: string
          description: The type of error encountered
          enum:
          - RELINK_REQUESTED
          - CONTINUE_WITHOUT_UPLOAD
      description: Indicates an attachment failed to upload
    TransferArchiveResult:
      type: object
      description: |
        The location of the transfer archive if the archive was successfully uploaded, otherwise a error indicating that
         the upload has failed and the destination device should stop waiting
      oneOf:
      - $ref: "#/components/schemas/RemoteAttachment"
      - $ref: "#/components/schemas/RemoteAttachmentError"
    TransferArchiveUploadedRequest:
      required:
      - transferArchive
      type: object
      properties:
        destinationDeviceId:
          type: string
          description: The ID of the device for which the transfer archive has been
            prepared
          format: byte
        destinationDeviceRegistrationId:
          maximum: 16383
          minimum: 0
          type: integer
          description: The registration ID of the destination device
          format: int32
        transferArchive:
          $ref: "#/components/schemas/TransferArchiveResult"
    RedeemReceiptRequest:
      required:
      - receiptCredentialPresentation
      type: object
      properties:
        receiptCredentialPresentation:
          minLength: 1
          type: string
          description: Presentation of a ZK receipt encoded in standard padded base64
        visible:
          type: boolean
          description: "If true, the corresponding badge should be visible on the\
            \ profile"
        primary:
          type: boolean
          description: "if true, and the new badge is visible, it should be the primary\
            \ badge on the profile"
    WebSocketClient:
      type: object
      properties:
        created:
          type: string
          format: date-time
        open:
          type: boolean
        remoteAddress:
          type: object
        userAgent:
          type: string
    WebSocketSessionContext:
      type: object
      properties:
        authenticated:
          type: object
          nullable: true
        client:
          $ref: "#/components/schemas/WebSocketClient"
    KeyTransparencyDistinguishedKeyResponse:
      required:
      - serializedResponse
      type: object
      properties:
        serializedResponse:
          type: string
          description: The serialized `DistinguishedResponse` encoded in standard
            un-padded base64
          format: byte
    KeyTransparencyMonitorResponse:
      required:
      - serializedResponse
      type: object
      properties:
        serializedResponse:
          type: string
          description: The serialized `MonitorResponse` encoded in standard un-padded
            base64
          format: byte
    AciMonitor:
      required:
      - commitmentIndex
      - value
      type: object
      properties:
        value:
          type: string
          description: An identifier for an account based on the account's ACI
        entryPosition:
          type: integer
          description: A log tree position maintained by the client for the aci.
          format: int64
        commitmentIndex:
          type: string
          description: "The commitment index derived from a previous search request,\
            \ encoded in standard unpadded base64"
          format: byte
    E164Monitor:
      required:
      - commitmentIndex
      - value
      type: object
      properties:
        value:
          minLength: 1
          type: string
          description: The e164-formatted phone number to monitor
        entryPosition:
          type: integer
          description: A log tree position maintained by the client for the e164.
          format: int64
        commitmentIndex:
          type: string
          description: "The commitment index derived from a previous search request,\
            \ encoded in standard unpadded base64"
          format: byte
    KeyTransparencyMonitorRequest:
      required:
      - aci
      - e164
      - usernameHash
      type: object
      properties:
        aci:
          $ref: "#/components/schemas/AciMonitor"
        e164:
          $ref: "#/components/schemas/E164Monitor"
        usernameHash:
          $ref: "#/components/schemas/UsernameHashMonitor"
        lastNonDistinguishedTreeHeadSize:
          type: integer
          description: The tree head size to prove consistency against.
          format: int64
        lastDistinguishedTreeHeadSize:
          type: integer
          description: The distinguished tree head size to prove consistency against.
          format: int64
    UsernameHashMonitor:
      required:
      - commitmentIndex
      - value
      type: object
      properties:
        value:
          minLength: 1
          type: string
          description: "The username hash to monitor, encoded in url-safe unpadded\
            \ base64."
          format: byte
        entryPosition:
          type: integer
          description: A log tree position maintained by the client for the username
            hash.
          format: int64
        commitmentIndex:
          type: string
          description: "The commitment index derived from a previous search request,\
            \ encoded in standard unpadded base64"
          format: byte
    KeyTransparencySearchResponse:
      required:
      - serializedResponse
      type: object
      properties:
        serializedResponse:
          type: string
          description: The serialized `SearchResponse` encoded in standard un-padded
            base64.
          format: byte
    KeyTransparencySearchRequest:
      required:
      - aci
      - aciIdentityKey
      type: object
      properties:
        aci:
          type: string
          description: An identifier for an account based on the account's ACI
        e164:
          type: string
          description: The E164-formatted phone number to look up
        usernameHash:
          type: string
          description: "The username hash to look up, encoded in web-safe unpadded\
            \ base64."
          format: byte
        aciIdentityKey:
          $ref: "#/components/schemas/IdentityKey"
        unidentifiedAccessKey:
          type: string
          description: The unidentified access key associated with the account
          format: byte
        lastTreeHeadSize:
          type: integer
          description: The non-distinguished tree head size to prove consistency against.
          format: int64
        distinguishedTreeHeadSize:
          type: integer
          description: The distinguished tree head size to prove consistency against.
          format: int64
    CheckKeysRequest:
      required:
      - digest
      - identityType
      type: object
      properties:
        identityType:
          type: string
          description: |
            The identity type for which to check for a shared view of repeated-use keys
          enum:
          - ACI
          - PNI
        digest:
          type: string
          description: |
            A 32-byte digest of the client's repeated-use keys for the given identity type. The digest is calculated as:

            SHA256(identityKeyBytes || signedEcPreKeyId || signedEcPreKeyIdBytes || lastResortKeyId || lastResortKeyBytes)

            …where the elements of the hash are:

            - identityKeyBytes: the serialized form of the client's public identity key as produced by libsignal (i.e. one
              version byte followed by 32 bytes of key material for a total of 33 bytes)
            - signedEcPreKeyId: an 8-byte, big-endian representation of the ID of the client's signed EC pre-key
            - signedEcPreKeyBytes: the serialized form of the client's signed EC pre-key as produced by libsignal (i.e. one
              version byte followed by 32 bytes of key material for a total of 33 bytes)
            - lastResortKeyId: an 8-byte, big-endian representation of the ID of the client's last-resort Kyber key
            - lastResortKeyBytes: the serialized form of the client's last-resort Kyber key as produced by libsignal (i.e.
              one version byte followed by 1568 bytes of key material for a total of 1569 bytes)
          format: byte
    ECPreKey:
      type: object
      properties:
        keyId:
          maximum: 4294967295
          minimum: 0
          type: integer
          description: |
            An arbitrary ID for this key, which will be provided by peers using this key to encrypt messages so the private key can be looked up.
            Should not be zero. Should be less than 2^24.
          format: int64
        publicKey:
          type: string
          description: |
            The public key, serialized in libsignal's elliptic-curve public key format and then base64-encoded.
      description: |
        A list of unsigned elliptic-curve prekeys to use for this device. If present and not empty, replaces all stored
        unsigned EC prekeys for the device; if absent or empty, any stored unsigned EC prekeys for the device are not
        deleted.
    PreKeyResponse:
      type: object
      properties:
        identityKey:
          $ref: "#/components/schemas/IdentityKey"
        devices:
          type: array
          description: information about each requested device
          items:
            $ref: "#/components/schemas/PreKeyResponseItem"
    PreKeyResponseItem:
      type: object
      properties:
        deviceId:
          type: string
          description: the device ID of the device to which this item pertains
          format: byte
        registrationId:
          type: integer
          description: the registration ID for the device
          format: int32
        signedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        preKey:
          $ref: "#/components/schemas/ECPreKey"
        pqPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
      description: information about each requested device
    Anonymous:
      type: object
      properties:
        accessKey:
          type: string
          format: byte
    GroupSendFullToken:
      type: object
      properties:
        expiration:
          type: string
          format: date-time
        internalContentsForJNI:
          type: string
          format: byte
    GroupSendTokenHeader:
      type: object
      properties:
        token:
          $ref: "#/components/schemas/GroupSendFullToken"
    PreKeyCount:
      type: object
      properties:
        count:
          type: integer
          description: the number of stored unsigned elliptic-curve prekeys for this
            device
          format: int32
        pqCount:
          type: integer
          description: the number of stored one-time post-quantum prekeys for this
            device
          format: int32
    SetKeysRequest:
      required:
      - pqPreKeys
      - preKeys
      type: object
      properties:
        preKeys:
          maxItems: 100
          minItems: 0
          type: array
          description: |
            A list of unsigned elliptic-curve prekeys to use for this device. If present and not empty, replaces all stored
            unsigned EC prekeys for the device; if absent or empty, any stored unsigned EC prekeys for the device are not
            deleted.
          items:
            $ref: "#/components/schemas/ECPreKey"
        signedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        pqPreKeys:
          maxItems: 100
          minItems: 0
          type: array
          description: |
            A list of signed post-quantum one-time prekeys to use for this device. Each key must have a valid signature from
            the identity key in this request. If present and not empty, replaces all stored unsigned PQ prekeys for the
            device; if absent or empty, any stored unsigned PQ prekeys for the device are not deleted.
          items:
            $ref: "#/components/schemas/KEMSignedPreKey"
        pqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
    SpamReport:
      type: object
      properties:
        token:
          type: string
          format: byte
          nullable: true
      nullable: true
    SendMessageResponse:
      type: object
      properties:
        needsSync:
          type: boolean
    IncomingMessageList:
      required:
      - messages
      type: object
      properties:
        messages:
          minItems: 1
          type: array
          items:
            $ref: "#/components/schemas/IncomingMessage"
        online:
          type: boolean
        urgent:
          type: boolean
        timestamp:
          maximum: 8640000000000000
          type: integer
          format: int64
    SendMultiRecipientMessageResponse:
      type: object
      properties:
        uuids404:
          type: array
          description: a list of the service identifiers in the request that do not
            correspond to registered Signal users; will only be present if a group
            send endorsement was supplied for the request
          items:
            type: string
            description: A service identifier is a tuple of a UUID and identity type
              that identifies an account and identity within the Signal service.
    AccountMismatchedDevices:
      type: object
      properties:
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
        devices:
          $ref: "#/components/schemas/MismatchedDevicesResponse"
    AccountStaleDevices:
      type: object
      properties:
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
        devices:
          $ref: "#/components/schemas/StaleDevicesResponse"
    CombinedUnidentifiedSenderAccessKeys:
      type: object
      properties:
        accessKeys:
          type: string
          format: byte
      nullable: true
    Recipient:
      type: object
      properties:
        devices:
          type: string
          format: byte
        devicesAndRegistrationIds:
          type: object
          properties:
            parallel:
              type: boolean
    SealedSenderMultiRecipientMessage:
      type: object
      properties:
        recipients:
          type: object
          additionalProperties:
            $ref: "#/components/schemas/Recipient"
        excludedRecipients:
          type: array
          items:
            $ref: "#/components/schemas/ServiceId"
    ServiceId:
      type: object
      properties:
        kind:
          type: string
          enum:
          - ACI
          - PNI
        rawUUID:
          type: string
          format: uuid
    ConfirmPayPalBoostRequest:
      required:
      - amount
      - currency
      - level
      - payerId
      - paymentId
      - paymentToken
      type: object
      properties:
        currency:
          maxLength: 3
          minLength: 3
          type: string
        amount:
          minimum: 1
          type: integer
          description: "The amount to pay in the [currency's minor unit](https://docs.stripe.com/currencies#minor-units)"
          format: int64
        level:
          minimum: 1
          type: integer
          description: The level for the boost payment
          format: int64
          default: 1
        paymentMethod:
          type: string
          description: The payment method
          default: CARD
          enum:
          - UNKNOWN
          - CARD
          - PAYPAL
          - SEPA_DEBIT
          - IDEAL
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
        payerId:
          minLength: 1
          type: string
        paymentId:
          minLength: 1
          type: string
        paymentToken:
          minLength: 1
          type: string
    CreateBoostResponse:
      type: object
      properties:
        clientSecret:
          type: string
          description: A client secret that can be used to complete a stripe PaymentIntent
    CreateBoostRequest:
      required:
      - amount
      - currency
      - level
      type: object
      properties:
        currency:
          maxLength: 3
          minLength: 3
          type: string
        amount:
          minimum: 1
          type: integer
          description: "The amount to pay in the [currency's minor unit](https://docs.stripe.com/currencies#minor-units)"
          format: int64
        level:
          minimum: 1
          type: integer
          description: The level for the boost payment
          format: int64
          default: 1
        paymentMethod:
          type: string
          description: The payment method
          default: CARD
          enum:
          - UNKNOWN
          - CARD
          - PAYPAL
          - SEPA_DEBIT
          - IDEAL
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
    CreateBoostReceiptCredentialsRequest:
      required:
      - paymentIntentId
      - processor
      - receiptCredentialRequest
      type: object
      properties:
        paymentIntentId:
          type: string
        receiptCredentialRequest:
          type: string
          format: byte
        processor:
          type: string
          enum:
          - STRIPE
          - BRAINTREE
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
    CreatePayPalBoostRequest:
      required:
      - amount
      - cancelUrl
      - currency
      - level
      - returnUrl
      type: object
      properties:
        currency:
          maxLength: 3
          minLength: 3
          type: string
        amount:
          minimum: 1
          type: integer
          description: "The amount to pay in the [currency's minor unit](https://docs.stripe.com/currencies#minor-units)"
          format: int64
        level:
          minimum: 1
          type: integer
          description: The level for the boost payment
          format: int64
          default: 1
        paymentMethod:
          type: string
          description: The payment method
          default: CARD
          enum:
          - UNKNOWN
          - CARD
          - PAYPAL
          - SEPA_DEBIT
          - IDEAL
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
        returnUrl:
          minLength: 1
          type: string
        cancelUrl:
          minLength: 1
          type: string
    CurrencyConversionEntity:
      type: object
      properties:
        base:
          type: string
        conversions:
          type: object
          additionalProperties:
            type: number
    CurrencyConversionEntityList:
      type: object
      properties:
        currencies:
          type: array
          items:
            $ref: "#/components/schemas/CurrencyConversionEntity"
        timestamp:
          type: integer
          format: int64
    Badge:
      type: object
      properties:
        id:
          type: string
        category:
          type: string
        name:
          type: string
        description:
          type: string
        sprites6:
          type: array
          items:
            type: string
        svg:
          type: string
        svgs:
          type: array
          items:
            $ref: "#/components/schemas/BadgeSvg"
        imageUrl:
          type: string
      description: The displayable badge associated with the level
    BadgeSvg:
      required:
      - dark
      - light
      type: object
      properties:
        light:
          minLength: 1
          type: string
        dark:
          minLength: 1
          type: string
    BaseProfileResponse:
      type: object
      properties:
        identityKey:
          $ref: "#/components/schemas/IdentityKey"
        unidentifiedAccess:
          type: string
          description: Checksum for unidentified access authentication (padded base64)
          format: byte
        unrestrictedUnidentifiedAccess:
          type: boolean
          description: Whether unidentified access is unrestricted for this account
        capabilities:
          type: object
          additionalProperties:
            type: boolean
            description: Device capabilities and whether they are enabled
          description: Device capabilities and whether they are enabled
        badges:
          type: array
          description: List of badges displayed on the profile
          items:
            $ref: "#/components/schemas/Badge"
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
      description: Unversioned profile containing basic information
    VersionedProfileResponse:
      type: object
      properties:
        identityKey:
          $ref: "#/components/schemas/IdentityKey"
        unidentifiedAccess:
          type: string
          description: Checksum for unidentified access authentication (padded base64)
          format: byte
        unrestrictedUnidentifiedAccess:
          type: boolean
          description: Whether unidentified access is unrestricted for this account
        capabilities:
          type: object
          additionalProperties:
            type: boolean
            description: Device capabilities and whether they are enabled
          description: Device capabilities and whether they are enabled
        badges:
          type: array
          description: List of badges displayed on the profile
          items:
            $ref: "#/components/schemas/Badge"
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
        name:
          type: string
          description: Encrypted profile name. Padded base64.
          format: byte
        about:
          type: string
          description: Encrypted about text. Padded base64.
          format: byte
        aboutEmoji:
          type: string
          description: Encrypted about emoji. Padded base64.
          format: byte
        avatar:
          type: string
          description: Avatar CDN path
        paymentAddress:
          type: string
          description: Encrypted payment address. Padded base64.
          format: byte
        phoneNumberSharing:
          type: string
          description: Encrypted phone number sharing preference. Padded base64.
          format: byte
      description: Versioned profile containing encrypted fields. Versioned fields
        may be empty if the version was not found.
    ExpiringProfileKeyCredentialProfileResponse:
      type: object
      properties:
        identityKey:
          $ref: "#/components/schemas/IdentityKey"
        unidentifiedAccess:
          type: string
          description: Checksum for unidentified access authentication (padded base64)
          format: byte
        unrestrictedUnidentifiedAccess:
          type: boolean
          description: Whether unidentified access is unrestricted for this account
        capabilities:
          type: object
          additionalProperties:
            type: boolean
            description: Device capabilities and whether they are enabled
          description: Device capabilities and whether they are enabled
        badges:
          type: array
          description: List of badges displayed on the profile
          items:
            $ref: "#/components/schemas/Badge"
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
        name:
          type: string
          description: Encrypted profile name. Padded base64.
          format: byte
        about:
          type: string
          description: Encrypted about text. Padded base64.
          format: byte
        aboutEmoji:
          type: string
          description: Encrypted about emoji. Padded base64.
          format: byte
        avatar:
          type: string
          description: Avatar CDN path
        paymentAddress:
          type: string
          description: Encrypted payment address. Padded base64.
          format: byte
        phoneNumberSharing:
          type: string
          description: Encrypted phone number sharing preference. Padded base64.
          format: byte
        credential:
          $ref: "#/components/schemas/ExpiringProfileKeyCredentialResponse"
      description: Profile response with an expiring profile key credential
    ExpiringProfileKeyCredentialResponse:
      type: object
      properties:
        internalContentsForJNI:
          type: string
          format: byte
      description: Expiring profile key credential response. Null if profile version
        was not found or if the profile version is not current
      nullable: true
    BatchIdentityCheckResponse:
      type: object
      properties:
        elements:
          type: array
          description: List of accounts where fingerprint did not match (empty if
            all matched)
          items:
            $ref: "#/components/schemas/Element"
      description: Response containing accounts with mismatched identity key fingerprints
    Element:
      required:
      - fingerprint
      - uuid
      type: object
      properties:
        uuid:
          type: string
          description: A service identifier is a tuple of a UUID and identity type
            that identifies an account and identity within the Signal service.
        fingerprint:
          type: string
          description: "Expected identity key fingerprint (4 bytes, most significant\
            \ bytes of SHA-256 hash of 33-byte identity key field)"
          format: byte
      description: A service identifier and expected identity key fingerprint
    BatchIdentityCheckRequest:
      required:
      - elements
      type: object
      properties:
        elements:
          maxItems: 1000
          minItems: 0
          type: array
          description: List of accounts to check
          items:
            $ref: "#/components/schemas/Element"
      description: Request to check identity key fingerprints for multiple accounts
    ProfileAvatarUploadAttributes:
      type: object
      properties:
        key:
          type: string
          description: Object key for the avatar
        credential:
          type: string
          description: Credential for the upload
        acl:
          type: string
          description: Access control list setting
        algorithm:
          type: string
          description: Signing algorithm
        date:
          type: string
          description: Date in AWS format
        policy:
          type: string
          description: Base64-encoded upload policy
        signature:
          type: string
          description: Signature calculated over the policy
      description: "Profile avatar upload form (S3 Post Policy, AWS Signature version\
        \ 4)"
    CreateProfileRequest:
      required:
      - commitment
      - version
      type: object
      properties:
        commitment:
          $ref: "#/components/schemas/ProfileKeyCommitment"
        version:
          minLength: 1
          type: string
          description: Profile version identifier (hex-encoding of the public key)
        name:
          type: string
          description: Encrypted profile name. Padded base64.
          format: byte
        aboutEmoji:
          type: string
          description: Encrypted about emoji. Padded base64.
          format: byte
        about:
          type: string
          description: Encrypted about text. Padded base64.
          format: byte
        paymentAddress:
          type: string
          description: Encrypted payment address. Padded base64.
          format: byte
        avatar:
          type: boolean
          description: Whether the profile has an avatar
        sameAvatar:
          type: boolean
          description: Whether the avatar is unchanged from the previous version
        badgeIds:
          type: array
          description: List of badge IDs to display on the profile
          items:
            type: string
            description: List of badge IDs to display on the profile
        phoneNumberSharing:
          type: string
          description: Encrypted phone number sharing preference. Padded base64.
          format: byte
        avatarChange:
          type: string
          enum:
          - UNCHANGED
          - CLEAR
          - UPDATE
      description: Request to create or update a versioned profile
    ProfileKeyCommitment:
      type: object
      properties:
        internalContentsForJNI:
          type: string
          format: byte
      description: Profile key commitment
    ProvisioningMessage:
      required:
      - body
      type: object
      properties:
        body:
          minLength: 1
          type: string
          description: The MIME base64-encoded body of the provisioning message to
            send to the destination device
    AccountCreationResponse:
      type: object
      properties:
        uuid:
          type: string
          description: the account identifier for this account
          format: uuid
        number:
          type: string
          description: the phone number associated with this account
        pni:
          type: string
          description: the account identifier for this account's phone-number identity
          format: uuid
        usernameHash:
          type: string
          description: "a hash of this account's username, if set"
          format: byte
          nullable: true
        usernameLinkHandle:
          type: string
          description: "this account's username link handle, if set"
          format: uuid
          nullable: true
        storageCapable:
          type: boolean
          description: whether any of this account's devices support storage
        entitlements:
          $ref: "#/components/schemas/Entitlements"
        reregistration:
          type: boolean
          description: "If true, there was an existing account registered for this\
            \ number"
    RegistrationRequest:
      required:
      - accountAttributes
      - aciIdentityKey
      - aciPqLastResortPreKey
      - aciSignedPreKey
      - pniIdentityKey
      - pniPqLastResortPreKey
      - pniSignedPreKey
      - skipDeviceTransfer
      type: object
      properties:
        sessionId:
          type: string
          description: |
            The ID of an existing verification session as it appears in a verification session
            metadata object. Must be provided if `recoveryPassword` is not provided; must not be
            provided if `recoveryPassword` is provided.
        recoveryPassword:
          type: string
          description: |
            A base64-encoded registration recovery password. Must be provided if `sessionId` is
            not provided; must not be provided if `sessionId` is provided
          format: byte
        accountAttributes:
          $ref: "#/components/schemas/AccountAttributes"
        skipDeviceTransfer:
          type: boolean
          description: |
            If true, indicates that the end user has elected not to transfer data from another
            device even though a device transfer is technically possible given the capabilities of
            the calling device and the device associated with the existing account (if any). If
            false and if a device transfer is technically possible, the registration request will
            fail with an HTTP/409 response indicating that the client should prompt the user to
            transfer data from an existing device.
        aciIdentityKey:
          $ref: "#/components/schemas/IdentityKey"
        pniIdentityKey:
          $ref: "#/components/schemas/IdentityKey"
        aciSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        pniSignedPreKey:
          $ref: "#/components/schemas/ECSignedPreKey"
        aciPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        pniPqLastResortPreKey:
          $ref: "#/components/schemas/KEMSignedPreKey"
        apnToken:
          $ref: "#/components/schemas/ApnRegistrationId"
        gcmToken:
          $ref: "#/components/schemas/GcmRegistrationId"
    RemoteConfigurationResponse:
      type: object
      properties:
        config:
          type: object
          additionalProperties:
            type: string
            description: Remote configurations applicable to the user and client
          description: Remote configurations applicable to the user and client
    AuthCheckResponseV2:
      required:
      - matches
      type: object
      properties:
        matches:
          type: object
          additionalProperties:
            type: string
            description: "A dictionary with the auth check results: `SVR Credentials\
              \ -> 'match'/'no-match'/'invalid'`"
            enum:
            - match
            - no-match
            - invalid
          description: "A dictionary with the auth check results: `SVR Credentials\
            \ -> 'match'/'no-match'/'invalid'`"
    AuthCheckRequest:
      required:
      - number
      - tokens
      type: object
      properties:
        number:
          type: string
          description: The e164-formatted phone number.
        tokens:
          maxItems: 10
          minItems: 0
          type: array
          description: |-
            A list of SVR tokens, previously retrieved from `backup/auth`. Tokens should be the
            of the form "username:password". May contain at most 10 tokens.
          items:
            type: string
            description: |-
              A list of SVR tokens, previously retrieved from `backup/auth`. Tokens should be the
              of the form "username:password". May contain at most 10 tokens.
    StickerPackFormUploadAttributes:
      type: object
      properties:
        manifest:
          $ref: "#/components/schemas/StickerPackFormUploadItem"
        stickers:
          type: array
          items:
            $ref: "#/components/schemas/StickerPackFormUploadItem"
        packId:
          type: string
    StickerPackFormUploadItem:
      type: object
      properties:
        id:
          type: integer
          format: int32
        key:
          type: string
        credential:
          type: string
        acl:
          type: string
        algorithm:
          type: string
        date:
          type: string
        policy:
          type: string
        signature:
          type: string
    BackupConfiguration:
      type: object
      properties:
        levels:
          type: object
          additionalProperties:
            $ref: "#/components/schemas/BackupLevelConfiguration"
          description: A map of numeric backup level IDs to level-specific backup
            configuration
        freeTierMediaDays:
          type: integer
          description: The number of days of media a free tier backup user gets
          format: int64
      description: Backup specific configuration
    BackupLevelConfiguration:
      type: object
      properties:
        storageAllowanceBytes:
          type: integer
          description: The amount of media storage in bytes that a paying subscriber
            may store
          format: int64
        playProductId:
          type: string
          description: The play billing productID associated with this backup level
        mediaTtlDays:
          type: integer
          description: "The duration, in days, for which your backed up media is retained\
            \ on the server after you stop refreshing with a paid credential"
          format: int64
      description: Configuration for a backup level - use to present appropriate client
        interfaces
    CurrencyConfiguration:
      type: object
      properties:
        minimum:
          type: number
          description: The minimum amount that may be submitted for a one-time donation
            in the currency
        oneTime:
          type: object
          additionalProperties:
            type: array
            description: A map of numeric one-time donation level IDs to the list
              of default amounts to be presented
            items:
              type: number
              description: A map of numeric one-time donation level IDs to the list
                of default amounts to be presented
          description: A map of numeric one-time donation level IDs to the list of
            default amounts to be presented
        subscription:
          type: object
          additionalProperties:
            type: number
            description: A map of numeric subscription level IDs to the amount charged
              for that level
          description: A map of numeric subscription level IDs to the amount charged
            for that level
        backupSubscription:
          type: object
          additionalProperties:
            type: number
            description: A map of numeric backup level IDs to the amount charged for
              that level
          description: A map of numeric backup level IDs to the amount charged for
            that level
        supportedPaymentMethods:
          type: array
          description: The payment methods that support the given currency
          items:
            type: string
            description: The payment methods that support the given currency
      description: Configuration for a currency - use to present appropriate client
        interfaces
    GetSubscriptionConfigurationResponse:
      type: object
      properties:
        currencies:
          type: object
          additionalProperties:
            $ref: "#/components/schemas/CurrencyConfiguration"
          description: A map of lower-cased ISO 3 currency codes to minimums and level-specific
            scalar amounts
        levels:
          type: object
          additionalProperties:
            $ref: "#/components/schemas/LevelConfiguration"
          description: A map of numeric donation level IDs to level-specific badge
            configuration
        backup:
          $ref: "#/components/schemas/BackupConfiguration"
        sepaMaximumEuros:
          type: number
          description: The maximum value of a one-time donation SEPA transaction
      description: |-
        Comprehensive configuration for donation subscriptions, backup subscriptions, gift subscriptions, and one-time
        donations pricing information for all levels are included in currencies. All levels that have an associated
        badge are included in levels.  All levels that correspond to a backup payment tier are included in
        backupLevels.
    LevelConfiguration:
      type: object
      properties:
        name:
          type: string
          description: The localized name for the level
        badge:
          $ref: "#/components/schemas/Badge"
      description: Configuration for a donation level - use to present appropriate
        client interfaces
    CreatePayPalBillingAgreementResponse:
      required:
      - approvalUrl
      - token
      type: object
      properties:
        approvalUrl:
          minLength: 1
          type: string
        token:
          minLength: 1
          type: string
    CreatePayPalBillingAgreementRequest:
      required:
      - cancelUrl
      - returnUrl
      type: object
      properties:
        returnUrl:
          minLength: 1
          type: string
        cancelUrl:
          minLength: 1
          type: string
    CreatePaymentMethodResponse:
      type: object
      properties:
        clientSecret:
          type: string
        processor:
          type: string
          enum:
          - STRIPE
          - BRAINTREE
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
    ChargeFailure:
      type: object
      properties:
        code:
          type: string
          description: |
            See [Stripe failure codes](https://stripe.com/docs/api/charges/object#charge_object-failure_code) or
            [Braintree decline codes](https://developer.paypal.com/braintree/docs/reference/general/processor-responses/authorization-responses#decline-codes)
            depending on which processor was used
        message:
          type: string
          description: |
            See [Stripe failure codes](https://stripe.com/docs/api/charges/object#charge_object-failure_code) or
            [Braintree decline codes](https://developer.paypal.com/braintree/docs/reference/general/processor-responses/authorization-responses#decline-codes)
            depending on which processor was used
        outcomeNetworkStatus:
          type: string
          nullable: true
          externalDocs:
            description: Outcome Network Status
            url: https://stripe.com/docs/api/charges/object#charge_object-outcome-network_status
        outcomeReason:
          type: string
          nullable: true
          externalDocs:
            description: Outcome Reason
            url: https://stripe.com/docs/api/charges/object#charge_object-outcome-reason
        outcomeType:
          type: string
          nullable: true
          externalDocs:
            description: Outcome Type
            url: https://stripe.com/docs/api/charges/object#charge_object-outcome-type
      description: |2
          Meaningfully interpreting chargeFailure response fields requires inspecting the processor field first.

          For Stripe, code will be one of the [codes defined here](https://stripe.com/docs/api/charges/object#charge_object-failure_code),
          while message [may contain a further textual description](https://stripe.com/docs/api/charges/object#charge_object-failure_message).
          The outcome fields are nullable, but present values will directly map to Stripe [response properties](https://stripe.com/docs/api/charges/object#charge_object-outcome-network_status)

          For Braintree, the outcome fields will be null. The code and message will contain one of
            - a processor decline code (as a string) in code, and associated text in message, as defined this [table](https://developer.paypal.com/braintree/docs/reference/general/processor-responses/authorization-responses)
            - `gateway` in code, with a [reason](https://developer.paypal.com/braintree/articles/control-panel/transactions/gateway-rejections) in message
            - `code` = "unknown", message = "unknown"

          IAP payment processors will never include charge failure information, and detailed order information should be
          retrieved from the payment processor directly
    ChargeFailureResponse:
      type: object
      properties:
        processor:
          type: string
        chargeFailure:
          $ref: "#/components/schemas/ChargeFailure"
    GetReceiptCredentialsRequest:
      required:
      - receiptCredentialRequest
      type: object
      properties:
        receiptCredentialRequest:
          minLength: 1
          type: string
          description: A ReceiptCredentialRequest encoded in standard base64 with
            padding
          format: byte
    GetBankMandateResponse:
      type: object
      properties:
        mandate:
          type: string
    GetSubscriptionInformationResponse:
      type: object
      properties:
        subscription:
          $ref: "#/components/schemas/Subscription"
        chargeFailure:
          $ref: "#/components/schemas/ChargeFailure"
    Subscription:
      type: object
      properties:
        level:
          type: integer
          description: The subscription level
          format: int64
        billingCycleAnchor:
          type: string
          description: "If present, UNIX Epoch Timestamp in seconds, can be used to\
            \ calculate next billing date."
          format: date-time
          externalDocs:
            description: Calculate next billing date
            url: https://stripe.com/docs/billing/subscriptions/billing-cycle
        endOfCurrentPeriod:
          type: string
          description: "UNIX Epoch Timestamp in seconds, when the current subscription\
            \ period ends"
          format: date-time
        active:
          type: boolean
          description: Whether there is a currently active subscription
        cancelAtPeriodEnd:
          type: boolean
          description: "If true, an active subscription will not auto-renew at the\
            \ end of the current period"
        currency:
          type: string
          description: A three-letter ISO 4217 currency code for currency used in
            the subscription
        amount:
          type: number
          description: The amount paid for the subscription in the currency's smallest
            unit
          externalDocs:
            description: Stripe Currencies
            url: https://docs.stripe.com/currencies
        status:
          type: string
          description: "The subscription's status, mapped to Stripe's statuses. trialing\
            \ will never be returned"
          externalDocs:
            description: Stripe subscription statuses
            url: https://docs.stripe.com/billing/subscriptions/overview#subscription-statuses
        processor:
          type: string
          description: The payment provider associated with the subscription
          enum:
          - STRIPE
          - BRAINTREE
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
        paymentMethod:
          type: string
          description: The payment method associated with the subscription
          enum:
          - UNKNOWN
          - CARD
          - PAYPAL
          - SEPA_DEBIT
          - IDEAL
          - GOOGLE_PLAY_BILLING
          - APPLE_APP_STORE
        paymentProcessing:
          type: boolean
          description: Whether the latest invoice for the subscription is in a non-terminal
            state
      description: "Information about the subscription, or null if no subscription\
        \ is present"
    SetSubscriptionLevelSuccessResponse:
      type: object
      properties:
        level:
          type: integer
          format: int64
    VerificationSessionResponse:
      required:
      - allowedToRequestCode
      - id
      - verified
      type: object
      properties:
        id:
          type: string
          description: A URL-safe ID for the session
        nextSms:
          type: integer
          description: Duration in seconds after which next SMS can be requested for
            this session
          format: int64
          nullable: true
        nextCall:
          type: integer
          description: Duration in seconds after which next voice call can be requested
            for this session
          format: int64
          nullable: true
        nextVerificationAttempt:
          type: integer
          description: Duration in seconds after which the client can submit a verification
            code for this session
          format: int64
          nullable: true
        allowedToRequestCode:
          type: boolean
          description: Whether it is allowed to request a verification code for this
            session
        requestedInformation:
          type: array
          description: A list of requested information that the client needs to submit
            before requesting code delivery
          items:
            type: string
            description: A list of requested information that the client needs to
              submit before requesting code delivery
            enum:
            - pushChallenge
            - captcha
        verified:
          type: boolean
          description: Whether this session is verified
    CreateVerificationSessionRequest:
      required:
      - number
      type: object
      properties:
        number:
          minLength: 1
          type: string
          description: The e164-formatted phone number to be verified
        pushToken:
          type: string
          description: The APNs or FCM device token to which a push challenge can
            be sent
          nullable: true
        pushTokenType:
          type: string
          description: The type of push token
          nullable: true
          enum:
          - apn
          - fcm
        pushChallenge:
          type: string
          description: Value received by the device in the push challenge
          nullable: true
        captcha:
          type: string
          description: Captcha token returned after solving a captcha challenge
          nullable: true
        mcc:
          type: string
          description: Mobile country code of the phone subscriber
          nullable: true
        mnc:
          type: string
          description: Mobile network code of the phone subscriber
          nullable: true
    UpdateVerificationSessionRequest:
      type: object
      properties:
        pushToken:
          type: string
          description: The APNs or FCM device token to which a push challenge can
            be sent
          nullable: true
        pushTokenType:
          type: string
          description: The type of push token
          nullable: true
          enum:
          - apn
          - fcm
        pushChallenge:
          type: string
          description: Value received by the device in the push challenge
          nullable: true
        captcha:
          type: string
          description: Captcha token returned after solving a captcha challenge
          nullable: true
        mcc:
          type: string
          description: Mobile country code of the phone subscriber
          nullable: true
        mnc:
          type: string
          description: Mobile network code of the phone subscriber
          nullable: true
    SendVerificationCodeFailureResponse:
      type: object
      properties:
        reason:
          type: string
          enum:
          - providerUnavailable
          - providerRejected
          - illegalArgument
        permanentFailure:
          type: boolean
    VerificationCodeRequest:
      required:
      - client
      - transport
      type: object
      properties:
        transport:
          type: string
          description: Transport via which to send the verification code
          enum:
          - sms
          - voice
        client:
          type: string
          description: Client type to facilitate platform-specific SMS verification
    SubmitVerificationCodeRequest:
      required:
      - code
      type: object
      properties:
        code:
          minLength: 1
          type: string
  securitySchemes:
    authenticatedAccount:
      type: http
      description: "Account authentication is based on Basic authentication schema,\
        \ \nwhere `username` has a format of `<user_id>[.<device_id>]`. If `device_id`\
        \ is not specified,\nuser's `main` device is assumed.\n"
      scheme: basic
