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

# Get multimodal upload URLs



## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/object/sign
openapi: 3.1.0
info:
  title: EverOS Cloud Memory API
  version: 2.0.0
  license:
    name: Apache-2.0
    identifier: Apache-2.0
  contact:
    name: EverMind AI
    email: service@evermind.ai
    url: https://github.com/EverMind-AI/everos-cloud-sdk-python
  description: >-
    Official Python client for the EverOS Cloud Memory API. Add, search,
    retrieve, and manage long-term memory for your AI applications over a typed
    interface (pydantic v2, with full type hints). Install and usage guides:
    https://github.com/EverMind-AI/everos-cloud-sdk-python
servers:
  - url: https://api.evermind.ai
    description: Production
security:
  - BearerAuth: []
paths:
  /api/v1/object/sign:
    post:
      tags:
        - Storage
      summary: Get multimodal upload URLs
      operationId: signObjects
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignRequest'
      responses:
        '200':
          description: |
            Envelope response (MMS returns HTTP 200 for every business outcome;
            only unmatched routes return 404). `status: 0` means success and
            `result.data` is a SignResponse. Non-zero `status` values seen on
            this endpoint:

            - `20003` — request body bind failure (malformed JSON).
            - `2018`  — parameter validation failed (e.g. missing `objectList`,
              `fileId`, `fileName`, or `fileType`); `result.data` is the
              validator error string.
            - `1012`  — `mms-token` missing, invalid, expired, or revoked
              (emitted by the auth middleware before the handler runs).
            - `1013`  — token lacks the required `object:sign` scope.
            - `1007`  — `objectList` exceeds the per-request limit of 50.
            - `1002`  — `fileType` not one of image/video/file.
            - `1009`  — duplicate `fileId` within the request.
            - `1004`  — S3 operation failed (bucket unavailable).
            - `1005`  — presigned POST generation failed.
            - `2015`  — object metadata persistence failed.
            - `20001` — unhandled internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignEnvelope'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayError'
        '403':
          description: Authenticated but not permitted for this resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayError'
        '429':
          description: Rate limit or quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayError'
components:
  schemas:
    SignRequest:
      type: object
      required:
        - objectList
      properties:
        objectList:
          type: array
          minItems: 1
          maxItems: 50
          description: |
            Objects to sign for upload. At most 50 per request
            (`status: 1007` if exceeded). Each `fileId` must be unique within
            the request (`status: 1009` on duplicates).
          items:
            $ref: '#/components/schemas/SignObjectItem'
      example:
        objectList:
          - fileId: file-1
            fileName: photo.jpg
            fileType: image
    SignEnvelope:
      description: |
        Response envelope for the sign endpoint. The `result.data` shape
        depends on `status`:

        - `status: 0` (success) — `result.data` is a `SignResponse`, as
          modelled below.
        - `status: 2018` (validation failed) — `result.data` is a plain
          string carrying the validator error message, not a `SignResponse`.
        - all other non-zero statuses — `result.data` is `null`.

        Generated clients should treat `result.data` as populated only when
        `status` is 0.
      allOf:
        - $ref: '#/components/schemas/Envelope'
        - type: object
          properties:
            result:
              type: object
              properties:
                data:
                  $ref: '#/components/schemas/SignResponse'
    GatewayError:
      type: object
      additionalProperties: true
      description: >-
        Gateway error body. NOTE: shape is not yet uniform across auth/quota/
        rate-limit paths — treat fields as best-effort. Commonly includes a
        `code`/`message` (flat) or an `error` object/string with a `message`.
      title: GatewayError
    SignObjectItem:
      type: object
      required:
        - fileId
        - fileName
        - fileType
      properties:
        fileId:
          type: string
        fileName:
          type: string
        fileType:
          type: string
          enum:
            - image
            - file
            - video
          description: |
            Media class. Default size limits per type: image=10MB,
            file=100MB, video=500MB. These are defaults and may be overridden
            per token (via the token's `file_limits`); the effective limit is
            enforced by S3 through the presigned POST `content-length-range`
            condition, and surfaced as `objectSignedInfo.maxSize`.
    Envelope:
      type: object
      description: Common response envelope
      properties:
        error:
          type: string
          description: |
            `"OK"` on success, otherwise a human-readable error message
            decoded from the business error.
        request_id:
          type: string
        status:
          type: integer
          description: Business status code; 0 means success
        result:
          type: object
          properties:
            data: true
    SignResponse:
      type: object
      properties:
        objectList:
          type: array
          items:
            $ref: '#/components/schemas/SignResponseItem'
    SignResponseItem:
      type: object
      properties:
        fileId:
          type: string
        fileName:
          type: string
        fileType:
          type: string
        objectKey:
          type: string
        objectUrl:
          type: string
          description: |
            Present in the response struct for parity with the find endpoint,
            but not populated on the sign path (omitted from the JSON).
        objectSignedInfo:
          $ref: '#/components/schemas/SignedInfo'
    SignedInfo:
      type: object
      description: Presigned POST form data for direct-to-S3 upload
      properties:
        url:
          type: string
        fields:
          type: object
          additionalProperties:
            type: string
        maxSize:
          type: integer
          format: int64
          description: Maximum file size in bytes
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'API key issued by EverOS, sent as `Authorization: Bearer <api_key>`.'

````