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

> ## Agent Instructions
> - Base URLs: models `https://api.aisa.one/v1` (Gemini GenerateContent: `https://api.aisa.one/v1beta`); data APIs `https://api.aisa.one/apis/v1`. The `servers` of each operation in https://aisa.one/openapi.yaml is authoritative.
> - Auth: `Authorization: Bearer $AISA_API_KEY`. Never print, log, or commit the key.
> - MCP (preferred for agents): `https://mcp.aisa.one/mcp`, signed in with OAuth, so there is no key to paste.
> - Agent Skill: `npx skills add AIsa-team/agent-skills --skill aisa`. Fallback with the AIsa CLI: `aisa skills install aisa`.
> - Spending: docs, https://aisa.one/models, https://aisa.one/api, `/v1/models`, and MCP `search`, `list_categories`, `get_details`, `batch_quote`, and the `account` operation are free. Quote the exact calls before running them (MCP `batch_quote`, CLI `aisa quote --json`). If the quote reports `auto_execute_eligible: true`, run it unless the user set a tighter limit or asked only for a quote. Otherwise, tell the user in one message the planned calls, the quoted price, and a total USD budget for the task, then wait for approval. Direct HTTP calls follow the stricter rule at https://aisa.one/docs/get-started/cli.md#direct-http-fallback. Do not make paid calls to test availability. Full rule: https://aisa.one/llms.txt

# Update post metadata

> Posts. Acts in public on your connected account; needs social:publish. Audited. Ids are yours: accounts acc_..., profiles prf_..., posts pst_...; every other object id is checked against your accounts before the call.

Updates metadata of a published video on the specified platform without re-uploading. Currently only supported for YouTube. At least one updatable field is required.

### Two modes

1. Post-based (video published through AIsa): pass the AIsa postId in the URL and platform in the body.
2. Direct video ID (video uploaded outside AIsa, e.g. directly to YouTube): use _ as the postId, and pass videoId + accountId + platform in the body. The accountId is the AIsa account ID for the connected YouTube channel.

<!-- aisa-pricing:start -->
A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ.
<!-- aisa-pricing:end -->

## Request contract

* **Method and path:** POST /apis/v1/social/posts/\{postId}/update-metadata
* **Availability:** enabled
* **Request URL template:** `https://api.aisa.one/apis/v1/social/posts/{postId}/update-metadata`
* **postId:** path; required
* **Runtime facts:** 99acb5bddbedc8d3352e7c4fef86c3e6d8852c14772bcd18dbcf415237a642bd

[Complete OpenAPI definition](https://aisa.one/docs/reference-contracts/aisa-social.json)

Effective request and pricing declaration (including authentication and referenced schemas):

```json theme={null}
{
  "operationId": "post_aisa_social_apis_v1_social_posts_postid_upda_cf80eb",
  "method": "POST",
  "path": "/apis/v1/social/posts/{postId}/update-metadata",
  "servers": [
    {
      "url": "https://api.aisa.one"
    }
  ],
  "parameters": [
    {
      "description": "AIsa post ID, or \"_\" when using direct video ID mode",
      "in": "path",
      "name": "postId",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "example": {
          "description": "New SEO-optimized description",
          "platform": "youtube",
          "tags": [
            "seo",
            "marketing",
            "tutorial"
          ],
          "title": "Updated Video Title"
        },
        "schema": {
          "properties": {
            "accountId": {
              "description": "One of your social accounts (acc_...).",
              "pattern": "^acc_[0-9A-Za-z]{22}$",
              "type": "string"
            },
            "categoryId": {
              "description": "YouTube video category ID",
              "type": "string"
            },
            "containsSyntheticMedia": {
              "description": "AI-generated content disclosure. Set true if the video contains synthetic content that could be mistaken for real. YouTube may add a label.",
              "type": "boolean"
            },
            "description": {
              "description": "New video description",
              "type": "string"
            },
            "madeForKids": {
              "description": "COPPA compliance flag. Set true for child-directed content (restricts comments, notifications, ad targeting).",
              "type": "boolean"
            },
            "platform": {
              "description": "The platform to update metadata on",
              "enum": [
                "youtube"
              ],
              "type": "string"
            },
            "playlistId": {
              "description": "YouTube playlist ID to add the video to (e.g. 'PLxxxxxxxxxxxxx'). Use GET /apis/v1/social/accounts/{id}/youtube-playlists to list available playlists. Only playlists owned by the channel are supported.",
              "type": "string"
            },
            "privacyStatus": {
              "description": "Video privacy setting",
              "enum": [
                "public",
                "private",
                "unlisted"
              ],
              "type": "string"
            },
            "tags": {
              "description": "Array of keyword tags (max 500 characters combined for YouTube)",
              "items": {
                "maxLength": 100,
                "type": "string"
              },
              "type": "array"
            },
            "thumbnailUrl": {
              "description": "Public URL of a custom thumbnail image (JPEG, PNG, or GIF, max 50 MB, recommended 1280x720). Works on any video you own, including videos not published through AIsa. The channel must be verified (phone verification) to set custom thumbnails.\n\n**Errors:**\n\n- 400 with the reason, no field updated: YouTube refuses the thumbnail (e.g. channel without the custom-thumbnail permission, video not owned by the connected channel), or the image URL cannot be fetched or has an unsupported format or size.\n- 429: YouTube thumbnail rate limit (uploadRateLimitExceeded). Retry later, not immediately, because retries keep the channel over its limit.\n- 500: any other temporary YouTube or network failure; can be retried.",
              "format": "uri",
              "type": "string"
            },
            "title": {
              "description": "New video title (max 100 characters for YouTube)",
              "maxLength": 100,
              "type": "string"
            },
            "videoId": {
              "description": "YouTube video ID (required for direct mode, ignored for post-based mode)",
              "type": "string"
            }
          },
          "required": [
            "platform"
          ],
          "type": "object"
        }
      }
    },
    "required": true
  },
  "x-aisa-status": "enabled",
  "x-aisa-pricing": {
    "description": "Included with your connected social accounts: AIsa does not charge per call.",
    "kind": "no_customer_charge"
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "scheme": "bearer",
        "type": "http"
      }
    }
  }
}
```

## Cost and request rules

A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ.

Published reference values are not an account-specific quote or a settled charge. For endpoints supporting X-AISA-Cost-Mode: quote, obtain a free quote for your exact request before execution; reconcile the settled cost with response metadata and Usage Logs. USD amounts use 1,000,000 integer micro-USD per dollar.


## OpenAPI

````yaml reference-contracts/aisa-social.json POST /apis/v1/social/posts/{postId}/update-metadata
openapi: 3.1.0
info:
  description: ''
  title: AIsa Social
  version: '1'
  x-aisa-capabilities:
    idempotency: Idempotency-Key
    max_price: X-AISA-Max-Price-USD
    quote:
      header: X-AISA-Cost-Mode
      value: quote
  x-aisa-configured-paths: []
  x-aisa-document:
    facts_hash: 99acb5bddbedc8d3352e7c4fef86c3e6d8852c14772bcd18dbcf415237a642bd
    generator_version: '3'
    protocol_version: '1'
    schema_version: '1'
    composer_version: '27'
    response_pending: []
    document_hash: sha256:7f9742cb1ea233c648dcb290fdfbf24e53a27dcf900ec1386f83a8ef2e6b1bf9
  x-aisa-plans:
    builder: 1
    display_plan: payg
    payg: 1
    similarweb_payg: 1
    team: 1
    version: e70a0959cd1b93b84ae16dffd7a538273ddb9c1d46277b82823c37ff1b6bc0fb
  x-aisa-provider: aisa-social
  x-aisa-catalogs:
    aisa-social:
      title: AIsa Social
      description: ''
      x-aisa-document:
        facts_hash: 99acb5bddbedc8d3352e7c4fef86c3e6d8852c14772bcd18dbcf415237a642bd
        generator_version: '3'
        protocol_version: '1'
        schema_version: '1'
      x-aisa-plans:
        builder: 1
        display_plan: payg
        payg: 1
        similarweb_payg: 1
        team: 1
        version: e70a0959cd1b93b84ae16dffd7a538273ddb9c1d46277b82823c37ff1b6bc0fb
      x-aisa-capabilities:
        idempotency: Idempotency-Key
        max_price: X-AISA-Max-Price-USD
        quote:
          header: X-AISA-Cost-Mode
          value: quote
servers:
  - url: https://api.aisa.one
security:
  - bearerAuth: []
paths:
  /apis/v1/social/posts/{postId}/update-metadata:
    post:
      summary: Update post metadata
      description: >-
        Posts. Acts in public on your connected account; needs social:publish.
        Audited. Ids are yours: accounts acc_..., profiles prf_..., posts
        pst_...; every other object id is checked against your accounts before
        the call.


        Updates metadata of a published video on the specified platform without
        re-uploading. Currently only supported for YouTube. At least one
        updatable field is required.


        ### Two modes


        1. Post-based (video published through AIsa): pass the AIsa postId in
        the URL and platform in the body.

        2. Direct video ID (video uploaded outside AIsa, e.g. directly to
        YouTube): use _ as the postId, and pass videoId + accountId + platform
        in the body. The accountId is the AIsa account ID for the connected
        YouTube channel.


        <!-- aisa-pricing:start -->

        A request reference price is not currently available; use a request
        quote where supported. Account-specific pricing and final settlement may
        differ.

        <!-- aisa-pricing:end -->
      operationId: post_aisa_social_apis_v1_social_posts_postid_upda_cf80eb
      parameters:
        - description: AIsa post ID, or "_" when using direct video ID mode
          in: path
          name: postId
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            example:
              description: New SEO-optimized description
              platform: youtube
              tags:
                - seo
                - marketing
                - tutorial
              title: Updated Video Title
            schema:
              properties:
                accountId:
                  description: One of your social accounts (acc_...).
                  pattern: ^acc_[0-9A-Za-z]{22}$
                  type: string
                categoryId:
                  description: YouTube video category ID
                  type: string
                containsSyntheticMedia:
                  description: >-
                    AI-generated content disclosure. Set true if the video
                    contains synthetic content that could be mistaken for real.
                    YouTube may add a label.
                  type: boolean
                description:
                  description: New video description
                  type: string
                madeForKids:
                  description: >-
                    COPPA compliance flag. Set true for child-directed content
                    (restricts comments, notifications, ad targeting).
                  type: boolean
                platform:
                  description: The platform to update metadata on
                  enum:
                    - youtube
                  type: string
                playlistId:
                  description: >-
                    YouTube playlist ID to add the video to (e.g.
                    'PLxxxxxxxxxxxxx'). Use GET
                    /apis/v1/social/accounts/{id}/youtube-playlists to list
                    available playlists. Only playlists owned by the channel are
                    supported.
                  type: string
                privacyStatus:
                  description: Video privacy setting
                  enum:
                    - public
                    - private
                    - unlisted
                  type: string
                tags:
                  description: >-
                    Array of keyword tags (max 500 characters combined for
                    YouTube)
                  items:
                    maxLength: 100
                    type: string
                  type: array
                thumbnailUrl:
                  description: >-
                    Public URL of a custom thumbnail image (JPEG, PNG, or GIF,
                    max 50 MB, recommended 1280x720). Works on any video you
                    own, including videos not published through AIsa. The
                    channel must be verified (phone verification) to set custom
                    thumbnails.


                    **Errors:**


                    - 400 with the reason, no field updated: YouTube refuses the
                    thumbnail (e.g. channel without the custom-thumbnail
                    permission, video not owned by the connected channel), or
                    the image URL cannot be fetched or has an unsupported format
                    or size.

                    - 429: YouTube thumbnail rate limit
                    (uploadRateLimitExceeded). Retry later, not immediately,
                    because retries keep the channel over its limit.

                    - 500: any other temporary YouTube or network failure; can
                    be retried.
                  format: uri
                  type: string
                title:
                  description: New video title (max 100 characters for YouTube)
                  maxLength: 100
                  type: string
                videoId:
                  description: >-
                    YouTube video ID (required for direct mode, ignored for
                    post-based mode)
                  type: string
              required:
                - platform
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  message:
                    type: string
                  success:
                    type: boolean
                  updatedFields:
                    items:
                      type: string
                    type: array
                  videoId:
                    description: Only present in direct video ID mode
                    type: string
                type: object
          description: Metadata updated successfully
        default:
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type:
                          - string
                          - 'null'
                      details:
                        additionalProperties: {}
                        type:
                          - object
                          - 'null'
                      message:
                        type:
                          - string
                          - 'null'
                      param:
                        type:
                          - string
                          - 'null'
                      retryHint:
                        enum:
                          - never
                          - after_delay
                          - after_reconnect
                          - reconcile_first
                          - null
                        type:
                          - string
                          - 'null'
                      retryable:
                        type:
                          - boolean
                          - 'null'
                      type:
                        type:
                          - string
                          - 'null'
                    type:
                      - object
                      - 'null'
                type: object
          description: Error. The code field is stable; see the error catalog.
components:
  securitySchemes:
    bearerAuth:
      scheme: bearer
      type: http

````

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