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

# Save the keyword field of one localization

> Replaces the keyword field of one App Store localization with the normalized, deduplicated phrases of text, ships the localization when it is not shipped yet, and tracks every phrase in each market of trackIn. trackIn may be empty and must name only markets of the app whose storefront reads the localization. A phrase removed from the field stops being tracked as a keyword field phrase in every market that reads the localization, unless another saved field read there holds it. Answers 400 when the text runs past 100 characters, when trackIn names a country that is not a market of the app or a storefront that does not read the localization, and for a Google Play or competitor app. Answers 403 with quota and writes nothing when the keyword markets would pass the plan limit. Answers 404 for a missing app, and for an empty save of a localization the app does not ship. Saves to one app are written one at a time, so the last save wins.



## OpenAPI

````yaml /api-reference/openapi.json put /apps/{id}/keyword-fields/{localization}
openapi: 3.0.0
info:
  title: asobeast API
  description: >-
    Self hosted ASO toolkit API.


    A metered instance carries RateLimit-Limit, RateLimit-Remaining and
    RateLimit-Reset on every response, for the tightest limit the request
    touched. A self hosted instance has no request rate limits and sends no such
    header. Limits are per workspace, so minting more tokens does not buy more
    capacity, and they are sized per plan across three classes: read for stored
    data, write for configuration changes and store for the endpoints that reach
    the App Store or Google Play.


    A 429 carries Retry-After and a rateLimit object naming the window that
    closed, or an aiAllowance object when the workspace has spent the AI calls
    its plan includes this month. A 403 with a quota object means a plan
    capacity limit such as apps or tracked keyword markets, which is a different
    problem from a rate limit. A 402 with an entitlement object means the
    workspace needs a plan.


    Positions are 1-based and null means checked but not found within the
    captured depth, never zero. Daily granularity uses UTC dates.
  version: 1.9.0
  contact: {}
servers:
  - url: http://localhost:3000/api/backend
    description: Web origin proxy
  - url: http://localhost:4000
    description: Direct API
security:
  - personalApiToken: []
tags: []
paths:
  /apps/{id}/keyword-fields/{localization}:
    put:
      tags:
        - keywords
      summary: Save the keyword field of one localization
      description: >-
        Replaces the keyword field of one App Store localization with the
        normalized, deduplicated phrases of text, ships the localization when it
        is not shipped yet, and tracks every phrase in each market of trackIn.
        trackIn may be empty and must name only markets of the app whose
        storefront reads the localization. A phrase removed from the field stops
        being tracked as a keyword field phrase in every market that reads the
        localization, unless another saved field read there holds it. Answers
        400 when the text runs past 100 characters, when trackIn names a country
        that is not a market of the app or a storefront that does not read the
        localization, and for a Google Play or competitor app. Answers 403 with
        quota and writes nothing when the keyword markets would pass the plan
        limit. Answers 404 for a missing app, and for an empty save of a
        localization the app does not ship. Saves to one app are written one at
        a time, so the last save wins.
      operationId: LocalizationsController_saveKeywordField
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
        - name: localization
          required: true
          in: path
          schema:
            enum:
              - id
              - ru
              - th
              - de
              - fr
              - ar
              - pa
              - sv
              - it
              - pl
              - bn
              - ca
              - zh-Hans
              - zh-Hant
              - hr
              - cs
              - da
              - nl
              - en-AU
              - en-CA
              - en-GB
              - en-US
              - fi
              - fr-CA
              - el
              - gu
              - he
              - hi
              - hu
              - ja
              - kn
              - ko
              - ms
              - ml
              - mr
              - 'no'
              - or
              - pt-BR
              - pt-PT
              - ro
              - sk
              - sl
              - es-MX
              - es-ES
              - ta
              - te
              - tr
              - uk
              - ur
              - vi
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LocalizedKeywordFieldDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
components:
  schemas:
    LocalizedKeywordFieldDto:
      type: object
      properties:
        text:
          type: string
          maxLength: 1000
          example: habit,tracker,streak
        trackIn:
          uniqueItems: true
          example:
            - us
            - mx
          maxItems: 200
          description: >-
            The markets of the app that track the phrases of this field. Every
            one must be a market of the app whose storefront reads the
            localization. An empty list stores the field and tracks nothing.
          type: array
          items:
            type: string
      required:
        - text
        - trackIn
  securitySchemes:
    personalApiToken:
      scheme: bearer
      bearerFormat: asob
      type: http

````

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