REST API

Project Resources API

The REST API for connecting your app to our developer-first translation management platform.

GET/project_resources/translations/en.json
{ "homepage": { "welcome": "Welcome!", "sign_in": "Sign in" }, "common": { "save": "Save", "cancel": "Cancel" } }
POSTCreate & auto-translate strings
PATCHUpdate keys and values
DELETERemove strings

API, CLI, and MCP

i18nexus gives developers three ways to connect their app and workflow to the same project data. The API, CLI, and MCP all work with i18nexus as the source of truth, but they are built for different jobs.

API

Use the REST API when your application, backend, CI job, or custom integration needs direct programmatic access to project resources.

CLI

Use the CLI for local setup and translation file sync. It is the simplest way to pull generated JSON into your app during development or before deployment.

MCP

Use the MCP when AI coding agents are changing user-facing text. The MCP lets agents add and update source strings in i18nexus instead of editing local translation JSON files.

In practice, many teams use all three: MCP for AI-agent string changes, the dashboard for review, the CLI for local file sync, and the API for custom automation.

Authorization

The Project Resources API is a simple RESTful API for accessing your i18nexus project data. This API is located at the following base URL:

https://api.i18nexus.com/project_resources/

By default, all read-only endpoints can be accessed by including your project API key in the request. For example:

https://api.i18nexus.com/project_resources/translations.json?api_key=:your_api_key

For API endpoints that write project data, a Personal Access Token is required in the header of the request. Write requests must also include the project api_key query parameter:

Authorization: Bearer YOUR_TOKEN

Tokens are created per user with selected write permissions. The token must include the permission required by the endpoint, and the user must have a project role that can write to the project. Tokens are created in a user's account settings in the i18nexus Dashboard:

Personal Access Token dropdown

Get Project Resources

GET Project Metadata

Returns basic project settings that affect how API clients should create and update strings.

Use this endpoint to check the project library, base language, target languages, namespace mode, and whether description is used as AI translation context.

GET /project_resources/project.json
{
    "id": "c3ee93c5-66c8-487d-8cbb-0e6109550f35",
    "title": "My App",
    "library": "i18next",
    "language": "en",
    "languages": ["ar", "es"],
    "use_namespaces": true,
    "use_description_as_ai_context": true,
    "namespaces": ["common", "homepage"]
}

GET Translations: By language

Returns a JSON object of a project’s translations for all namespaces for a single language.

Optionally include param confirmed=true to retrieve only your confirmed translations

GET /project_resources/translations/:language_code.json
{
  "my-first-namespace": {
      "welcome": "Welcome to my app!",
      "goodbye": "Thanks for using my app!"
  },
  "my-second-namespace": {
      "greeting": "How are you?"
  }
}

GET Translations: By language and namespace

Returns a JSON object of a project’s translations for a specified language and namespace.

Optionally include param confirmed=true to retrieve only your confirmed translations

GET /project_resources/translations/:language_code/:namespace.json
{
    "welcome": "Welcome to my app!",
    "goodbye": "Thanks for using my app!"
}

GET Translations: All

Returns a nested JSON object of all project translations for all languages and namespaces.

GET /project_resources/translations.json
{
    "en": {
        "my-first-namespace": {
            "welcome": "Welcome to my app!",
            "goodbye": "Thanks for using my app!"
        },
        "my-second-namespace": {
            "greeting": "How are you?"
        }
    },
    "es-MX": {
        "my-first-namespace": {
            "welcome": "¡Bienvenido a mi aplicación!",
            "goodbye": "¡Gracias por usar mi aplicación!"
        },
        "my-second-namespace": {
            "greeting": "¿Cómo estás?"
        }
    }
}

GET Versions

Returns a collection of a project’s exported versions ordered from newest to oldest.

By default the latest 10 versions will be returned, but this can be adjusted using the optional limit query parameter.

GET /project_resources/versions.json?limit=10
{
    "collection": [
        {
            "created_at": 1631402817503,
            "description": "My version description",
            "download_url": "https://cdn.i18nexus.com/versions/1/translations.zip",
            "id": "c3ee93c5-66c8-487d-8cbb-0e6109550f35",
            "key_separation": true,
            "languages": ["en","es-MX"],
            "namespaces": ["my-first-namespace", "my-second-namespace"],
            "version_number": 1
        }
    ],
    "meta": {
        "limit": 10
    }
}

GET Namespaces

Returns a collection of a project’s namespaces.

GET /project_resources/namespaces.json
{
    "collection": [
        {
            "id": "c3ee93c5-66c8-487d-8cbb-0e6109550f35",
            "title": "common",
            "created_at": 1631402817503
        },
        {
            "id": "77915b03-496d-4c48-83c0-cece670ff5b3",
            "title": "homepage",
            "created_at": 1633402920418
        }
    ]
}

GET Languages

Returns a collection of a project’s languages.

GET /project_resources/languages.json
{
    "collection": [
        {
            "name": "English",
            "full_code": "en",
            "language_code": "en",
            "country_code": null,
            "google_translate_code": "en",
            "base_language": true
        },
        {
            "name": "Spanish",
            "full_code": "es",
            "language_code": "es",
            "country_code": null,
            "google_translate_code": "es",
            "base_language": false
        }
    ]
}

Write Project Resources (Advanced)

Almost all i18nexus users prefer using the following APIs through the i18nexus-cli, where each request is wrapped in a simple command. Direct access to the following APIs is meant for teams who want to integrate i18nexus into their own management systems and workflows.

Reminder: Write APIs are only authorized using Personal Access Tokens.

Create String

Creates a new string in your project’s base language, and automatically AI translates it for each of your project’s target languages. Translations are generated asynchronously, so target-language values may take a few seconds to appear.

Requires the Personal Access Token's create strings permission.

Parameters:

PropertyTypeNoteRequired?
keystring
The key of the string to create
valuestring
The value of the string to create
descriptionstring
Notes or context for the string. If your project uses Description as AI context, this is sent to the AI translator and must be 500 characters or fewer.
ai_instructionsstring
AI translation context for projects that separate Description from AI Notes. Do not send this when the project uses Description as AI context. Must be 500 characters or fewer.
namespacestring
The namespace in which to create the string. Required for namespaced projects unless the project has only one namespace. Omit this when namespaces are not enabled.

Example Request Body:

POST /project_resources/base_strings.json
{
    "key": "welcome_msg",
    "value": "Welcome to my app!",
    "description": "Appears in the home page header.",
    "namespace": "homepage"
}
Rate limit: 20/min; 10/3 sec burst

Create Plural Set

Creates a plural set in your project’s base language and automatically AI translates the correct plural categories for each target language. Use this for count-dependent text instead of creating separate singular and plural strings.

Requires the Personal Access Token's create strings permission. Translation generation is asynchronous.

Parameters:

PropertyTypeNoteRequired?
keystring
The root key for the plural set. Do not include suffixes like _one or _other.
plural_valuesobject
Base-language values keyed by CLDR plural category. Include every category used by the project base language, such as one and other for English.
descriptionstring
Notes or context for the plural set. If your project uses Description as AI context, this is sent to the AI translator and must be 500 characters or fewer.
ai_instructionsstring
AI translation context for projects that separate Description from AI Notes. Do not send this when the project uses Description as AI context. Must be 500 characters or fewer.
namespacestring
The namespace in which to create the plural set. Required for namespaced projects unless the project has only one namespace. Omit this when namespaces are not enabled.

Example Request Body:

POST /project_resources/base_strings/plural_sets.json
{
    "key": "items_in_cart",
    "plural_values": {
        "one": "{{count}} item in your cart",
        "other": "{{count}} items in your cart"
    },
    "description": "Cart item count shown in checkout.",
    "namespace": "common"
}
Rate limit: 10/min; 10/3 sec burst

Bulk Create Strings

Creates up to 500 base-language strings in one request and automatically AI translates them for each target language. Processing runs asynchronously.

Requires the Personal Access Token's create strings permission.

Parameters:

PropertyTypeNoteRequired?
namespacestring
The namespace in which to create the strings. Required for namespaced projects unless the project has only one namespace. Omit this when namespaces are not enabled.
base_stringsarray
Array of strings to create. Each item must include key and value. Maximum 500 items.
descriptionstring
Optional per-string notes or context. Include this inside each base_strings item.
ai_instructionsstring
Optional per-string AI Notes. Include this inside each base_strings item only when your project separates Description from AI Notes.

Example Request Body:

POST /project_resources/base_strings/bulk_create.json
{
    "namespace": "common",
    "base_strings": [
        {
            "key": "welcome_msg",
            "value": "Welcome to my app!",
            "description": "Appears in the home page header."
        },
        {
            "key": "sign_in",
            "value": "Sign in"
        }
    ]
}

Example Response:

{
    "base_strings_invalid_values": []
}
Rate limit: 10/min

Update String

Updates a string’s key, value, description, AI Notes, and/or namespace. Updating a value or AI translation context can trigger asynchronous retranslation.

Requires the Personal Access Token's update strings permission.

Parameters:

PropertyTypeNoteRequired?
idobject
An object containing the key of the string to update. Include namespace for namespaced projects; omit namespace for non-namespaced projects.
keystring
The new key. For plural sets, rename the root key without plural_category.
valuestring
The new value. For plural sets, include plural_category to update one base-language plural form.
descriptionstring
The new notes or context. For plural sets, update this on the root key without plural_category. If this is used as AI context, it must be 500 characters or fewer.
ai_instructionsstring
AI translation context for projects that separate Description from AI Notes. Do not send this when the project uses Description as AI context. Must be 500 characters or fewer.
namespacestring
The namespace in which to move the string. For plural sets, move the root key without plural_category.
plural_categorystring
For plural sets only. Updates the base-language plural form for this category. When provided, only value may be updated in the request.
reset_confirmedboolean
Required if updating a value and the string contains confirmed translations. true resets confirmed translations; false keeps confirmed translations confirmed.

Example Request Body:

In this example we are changing the key and the value of the string with key notifications in namespace common.

PATCH /project_resources/base_strings.json
{
    "id": {
        "key": "notifications",
        "namespace": "common"
    },
    "key": "notifications.alert",
    "value": "You have a new notification!",
    "reset_confirmed": true
}

Plural Set Example:

To update one base-language plural form, identify the root key and include plural_category. In this mode, only value may be changed.

For plural set responses, the root string's value is null; base-language plural values are returned in plural_forms.

PATCH /project_resources/base_strings.json
{
    "id": {
        "key": "items_in_cart",
        "namespace": "common"
    },
    "plural_category": "one",
    "value": "{{count}} item in your cart",
    "reset_confirmed": true
}
Rate limit: 20/min

Delete String

Deletes a string and its associated translations in your project. For plural sets, delete the root key. A successful delete returns 204 No Content.

Requires the Personal Access Token's delete strings permission.

Parameters:

PropertyTypeNoteRequired?
idobject
An object containing the key of the string to delete. Include namespace for namespaced projects; omit namespace for non-namespaced projects.

Example Request Body:

In this example we are deleting the string with key notifications.alert from namespace common.

DELETE /project_resources/base_strings.json
{
    "id": {
        "key": "notifications.alert",
        "namespace": "common"
    }
}
Rate limit: 20/min

Bulk Delete Strings

Deletes up to 50 strings from one namespace. For plural sets, pass the root key. Deleted strings and their translations are permanently removed.

Requires the Personal Access Token's delete strings permission.

Parameters:

PropertyTypeNoteRequired?
namespacestring
The namespace to delete from. Required for namespaced projects unless the project has only one namespace.
keysarray
Array of base string keys to delete. Maximum 50 keys.

Example Request Body:

DELETE /project_resources/base_strings/bulk_delete.json
{
    "namespace": "common",
    "keys": ["welcome_msg", "notifications.alert"]
}

Example Response:

{
    "deleted_keys": ["welcome_msg", "notifications.alert"],
    "missing_keys": []
}
Rate limit: 5/min

Import Strings from JSON

Imports a block of JSON key-value pairs into your project. This is the equivalent of using the Import tool in the Strings Management page. Imports run asynchronously and may take a few seconds or longer depending on their size.

Requires the Personal Access Token's import strings permission.

Parameters:

PropertyTypeNoteRequired?
languagesobject
JSON block of strings with language codes as the keys (see example request body below)
namespacestring
The namespace to import into. Required for namespaced projects unless the project has only one namespace.
confirmboolean
If importing any translation strings (strings for a language that is not the project base language), mark them "confirmed" in i18nexus (default: false)
overwriteboolean
If any keys already exist in the target namespace, overwrite the values with the imported values (default: false)

Example Request Body:

In this example we are importing strings into our project’s common namespace for English (en) and Spanish (es).

You do not have to include all of your projects’ languages in your request, only the ones you wish to update.

POST /project_resources/import.json
{
    "namespace": "common",
    "confirm": true,
    "overwrite": true,
    "languages": {
        "en": {
            "welcome_msg": "Welcome to my app!",
            "sign_in": "Sign In",
            "sign_out": "Sign out",
            "notifications": {
                "alert": "You have a new notification!"
            }
        },
        "es": {
            "welcome_msg": "¡Bienvenido a mi aplicación!",
            "sign_in": "Iniciar sesión",
            "sign_out": "Desconectar",
            "notifications": {
                "alert": "¡Tienes una nueva notificación!"
            }
        }
    }
}
Rate limit: 5/min

Create Namespace

Adds a new namespace to your project. Namespaces affect how i18nexus organizes strings and, depending on the project's library settings, how translation JSON is exported.

This endpoint can only be used when your project is set to use namespaces.

Requires the Personal Access Token's create namespaces permission.

Parameters:

PropertyTypeNoteRequired?
titlestring
The title of the namespace to create

Example Request Body:

POST /project_resources/namespaces.json
{
    "title": "common"
}
Rate limit: 20/min

Update Namespace

Renames an existing namespace in your project.

Requires the Personal Access Token's update namespaces permission.

Parameters:

PropertyTypeNoteRequired?
titlestring
The current title of the namespace
new_titlestring
The new title for the namespace

Example Request Body:

PATCH /project_resources/namespaces.json
{
    "title": "common",
    "new_title": "shared"
}
Rate limit: 20/min

Delete Namespace

Deletes an empty namespace. Namespaces with strings cannot be deleted until their strings are moved or deleted.

Requires the Personal Access Token's delete namespaces permission.

Parameters:

PropertyTypeNoteRequired?
titlestring
The title of the namespace to delete

Example Request Body:

DELETE /project_resources/namespaces.json
{
    "title": "old_namespace"
}
Rate limit: 20/min

Limits

To prevent abuse, the i18nexus API has rate limits in place. The following limits are primarily only of concern to those teams who choose to fetch their translations at runtime in their applications. If you have a high traffic application, we recommend downloading and bundling your translations at build time in order to avoid hitting the following limits.

Request Limits (Gauged by API key)

Translation GET Requests
Free10K/month
Basic100K/month
Standard1M/month
Pro6M/month
Enterprise (Negotiable)Custom/month

Write Rate Limits (Gauged by API key)

Project Resource Write Requests
All Plans60/minute

The write endpoints listed above may also have their own per-endpoint rate limits. Those endpoint-specific limits are shown next to each write endpoint in this documentation and are applied in addition to the shared project resource write limit.

Level up your localization

It only takes a few minutes to streamline your translations forever.

Get started