<a id="index-0"></a>

<a id="api"></a>

# Weblate’s REST API

The API is accessible on the `/api/` URL and it is based on
[Django REST framework](https://www.django-rest-framework.org/).
You can use it directly or by [Weblate Client](https://docs.weblate.org/en/weblate-2026.10/wlc.md#wlc).

The API is also documented using OpenAPI 3.1 on the `/api/schema/` URL, you
can browse at `/api/docs/`.

<a id="api-generic"></a>

## Authentication and generic parameters

The read-only API is available without authentication unless
[`REQUIRE_LOGIN`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-REQUIRE_LOGIN) is turned on. Unauthenticated requests are heavily
throttled (by default to 100 requests per day), so it is recommended to use
authentication.

The authentication uses a token, which you can get in your profile. Use it in
the `Authorization` header with the `Token` or `Bearer` scheme.
Unsupported schemes, such as `Basic`, return [401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/401), even
for public endpoints or when you are signed in using a browser session.

### ANY /

Generic request behaviour for the API, the headers, status codes and
parameters here apply to all endpoints as well.

* **Query Parameters:**
  * **format** – Response format (overrides [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2)).
    Possible values depend on REST framework setup,
    by default `json`, `csv` and `api` are supported. The
    latter provides a web browser interface for the API.
  * **page** – Returns given page of paginated results (use next and previous fields in response to automate the navigation).
  * **page_size** – Return the given number of items per request.
    The default is 50 and the maximum is 1000.
    For the units endpoints the default is 100 with
    a maximum of 10000. The default value is also
    configurable using the PAGE_SIZE setting.
* **Request Headers:**
  * [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2) – the response content type depends on
    [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2) header
  * [Authorization](https://www.rfc-editor.org/rfc/rfc7235#section-4.2) – optional token to authenticate as
    `Authorization: Token YOUR-TOKEN`
* **Response Headers:**
  * [Content-Type](https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.5) – this depends on [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2)
    header of request
  * [Allow](https://www.rfc-editor.org/rfc/rfc7231#section-7.4.1) – list of allowed HTTP methods on object
* **Response JSON Object:**
  * **detail** (*string*) – verbose description of the result (for HTTP status codes other than [200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200))
  * **count** (*int*) – total item count for object lists
  * **next** (*string*) – next page URL for object lists
  * **previous** (*string*) – previous page URL for object lists
  * **results** (*array*) – results for object lists
  * **url** (*string*) – URL to access this resource using the API
  * **web_url** (*string*) – URL to access this resource using web browser
* **Status Codes:**
  * [200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200) – when request was correctly handled
  * [201 Created](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/201) – when a new object was created successfully
  * [204 No Content](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/204) – when an object was deleted successfully
  * [400 Bad Request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/400) – when form parameters are missing
  * [401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/401) – when authentication credentials are invalid or the authentication scheme is unsupported
  * [403 Forbidden](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403) – when access is denied
  * [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429) – when throttling is in place

<a id="api-tokens"></a>

### Authentication tokens

#### Versionchanged
Changed in version 4.10: Project scoped tokens were introduced in the 4.10 release.

Each user has a personal access token which can be obtained in the user
profile. Newly generated user tokens have the `wlu_` prefix.

It is possible to create project scoped tokens for API access to given project
only. These tokens can be identified by the `wlp_` prefix.

#### SEE ALSO
* [Registration and user profile](https://docs.weblate.org/en/weblate-2026.10/user/profile.md)
* [Per-project access tokens](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#project-api)
* [Project access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#acl)

### Authentication examples

**Example request:**

```http
GET /api/ HTTP/1.1
Host: example.com
Accept: application/json, text/javascript
Authorization: Token YOUR-TOKEN
```

**Example response:**

```http
HTTP/1.0 200 OK
Date: Fri, 25 Mar 2016 09:46:12 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, HEAD, OPTIONS

{
    "projects":"http://example.com/api/projects/",
    "components":"http://example.com/api/components/",
    "translations":"http://example.com/api/translations/",
    "languages":"http://example.com/api/languages/"
}
```

**CURL example:**

```sh
curl \
    -H "Authorization: Token TOKEN" \
    https://example.com/api/
```

### Passing Parameters Examples

For the [POST](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.3) method the parameters can be specified either as
form submission (*application/x-www-form-urlencoded*) or as JSON
(*application/json*).

**Form request example:**

```http
POST /api/projects/hello/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Token TOKEN

operation=pull
```

**JSON request example:**

```http
POST /api/projects/hello/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{"operation":"pull"}
```

**CURL example:**

```sh
curl \
    -d operation=pull \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/components/hello/weblate/repository/
```

**CURL JSON example:**

```sh
curl \
    --data-binary '{"operation":"pull"}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/components/hello/weblate/repository/
```

<a id="api-category"></a>

### Components and categories

To access a component which is nested inside a [Category](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#category), you need to URL
encode the category name into a component name separated with a slash. For
example `usage` placed in a `docs` category needs to be used as
`docs%252Fusage`. Full URL in this case would be for example
`https://example.com/api/components/hello/docs%252Fusage/repository/`.

<a id="api-rate"></a>

### API rate limiting

The API requests are rate limited; the default configuration limits it to 100
requests per day for anonymous users and 5000 requests per hour for authenticated
users.

Configure the default limits in `settings.py` using
[`API_RATELIMIT_ANON`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-API_RATELIMIT_ANON) and [`API_RATELIMIT_USER`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-API_RATELIMIT_USER).

In the Docker container this can be configured using
[`WEBLATE_API_RATELIMIT_ANON`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_ANON) and [`WEBLATE_API_RATELIMIT_USER`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER).

Use [`API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-API_RATELIMIT_USER_OVERRIDES) to give an automation account a
different limit. Use [`API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-API_RATELIMIT_IP_OVERRIDES) for individual IP
addresses or networks, including anonymous CI clients:

```python
API_RATELIMIT_USER_OVERRIDES = {"automation": "20000/hour"}
API_RATELIMIT_IP_OVERRIDES = {
    "192.0.2.42": None,
    "198.51.100.0/24": "10000/hour",
    "2001:db8::/48": "10000/hour",
}
```

An explicit username override takes precedence over IP rules. Otherwise, the
most specific matching network applies; an individual address is equivalent to
a single-address network. A value of `None` exempts matching requests from API
rate limits, including the anonymous limit. Authentication and permissions still
apply: an exemption does not grant access to private projects or write operations.

Limits are counted per authenticated user, or per client IP for anonymous
requests. Clients within a network do not share a single budget. Each override
rule and rate has a separate budget, so changing a rule or rate starts a new
budget. Requests without an override use the default limits.

IP rules use the client address resolved by Weblate. Behind a reverse proxy,
configure [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY), [`IP_PROXY_HEADER`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-IP_PROXY_HEADER), and
[`IP_PROXY_OFFSET`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-IP_PROXY_OFFSET) correctly. The trusted proxy must supply the client
address, and untrusted clients must not be able to bypass it. Exempting a shared
proxy address can exempt all clients using that proxy.

In Docker, configure the equivalent JSON mappings using
[`WEBLATE_API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER_OVERRIDES) and
[`WEBLATE_API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_IP_OVERRIDES). Use JSON `null` for exemptions.

The status of rate limiting is reported in following headers:

| `X-RateLimit-Limit`     | Allowed number of requests to perform                |
|-------------------------|------------------------------------------------------|
| `X-RateLimit-Remaining` | Remaining number of requests to perform              |
| `X-RateLimit-Reset`     | Number of seconds until the rate-limit window resets |

Requests exempt from rate limiting do not include these headers.

#### Versionchanged
Changed in version 4.1: Added ratelimiting status headers.

#### SEE ALSO
* [Rate limiting](https://docs.weblate.org/en/weblate-2026.10/admin/optionals.md#rate-limit)
* [Rate limiting](https://docs.weblate.org/en/weblate-2026.10/user/translating.md#user-rate)
* [`WEBLATE_API_RATELIMIT_ANON`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_ANON)
* [`WEBLATE_API_RATELIMIT_USER`](https://docs.weblate.org/en/weblate-2026.10/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER)

<a id="api-errors"></a>

### Error responses

#### Versionchanged
Changed in version 5.10: Error responses were endpoint specific before this release.

Weblate error responses are formatted based on [Error Response Format](https://drf-standardized-errors.readthedocs.io/en/latest/error_response.html).

## API Entry Point

### GET /api/

The API root entry point.

**Example request:**

```http
GET /api/ HTTP/1.1
Host: example.com
Accept: application/json, text/javascript
Authorization: Token YOUR-TOKEN
```

**Example response:**

```http
HTTP/1.0 200 OK
Date: Fri, 25 Mar 2016 09:46:12 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, HEAD, OPTIONS

{
    "projects":"http://example.com/api/projects/",
    "components":"http://example.com/api/components/",
    "translations":"http://example.com/api/translations/",
    "languages":"http://example.com/api/languages/"
}
```

<a id="api-users"></a>

## Users

#### Versionadded
Added in version 4.0.

### GET /api/users/

Returns no results to unauthenticated users. Authenticated users without the
global `user.view` or `user.edit` permission see only their own basic
details when listing without a username filter. They can search for other
users by supplying a username prefix of at least two characters after
trimming surrounding whitespace; these searches return the user ID,
username, and full name of matching non-bot users. Users with either
permission can list all users and receive detailed information.

* **Query Parameters:**
  * **username** (*string*) – Username prefix to search for. At least two characters after trimming surrounding whitespace are required for users without the global `user.view` or `user.edit` permission.
  * **id** (*int*) – User ID to search for
  * **email** (*string*) – Email to search for (case-insensitive, exact match). Requires `user.view` or `user.edit` permission; the parameter is ignored for unprivileged users.

Username searches by users without the global `user.view` or `user.edit`
permission exclude bot accounts other than the caller’s own account.

#### SEE ALSO
Users object attributes are documented at [`GET /api/users/(str:username)/`](#get--api-users-(str-username)-).

### POST /api/users/

Creates a new user.

Requires the global `user.edit` permission. See
[Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user management permission model.

* **Parameters:**
  * **username** (*string*) – Username
  * **full_name** (*string*) – User full name
  * **email** (*string*) – User email
  * **is_superuser** (*boolean*) – Is user superuser? (optional)
  * **is_active** (*boolean*) – Is user active? (optional)
  * **is_bot** (*boolean*) – Is user bot? (optional) (used for project scoped tokens)

### GET /api/users/(*str:* username)/

Returns information about users.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **username** (*string*) – username of a user
  * **full_name** (*string*) – full name of a user
  * **email** (*string*) – email of a user
  * **is_superuser** (*boolean*) – whether the user is a super user
  * **is_active** (*boolean*) – whether the user is active
  * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens)
  * **date_joined** (*string*) – date the user is created
  * **last_login** (*string*) – date the user last signed in
  * **groups** (*array*) – link to associated groups; see [`GET /api/groups/(int:id)/`](#get--api-groups-(int-id)-)
  * **profile** (*object*) – user profile preferences; see [User profile](#api-user-profile). Returned only with the `user.view` or `user.edit` permission.

**Example JSON data:**

```json
{
    "email": "user@example.com",
    "full_name": "Example User",
    "username": "exampleusername",
    "groups": [
        "http://example.com/api/groups/2/",
        "http://example.com/api/groups/3/"
    ],
    "profile": {
        "language": "en",
        "languages": [
            "http://example.com/api/languages/cs/"
        ],
        "secondary_languages": [],
        "translated": 42,
        "suggested": 3,
        "uploaded": 1,
        "commented": 5,
        "theme": "auto",
        "hide_completed": false,
        "secondary_in_zen": true,
        "hide_source_secondary": false,
        "wide_tables": false,
        "listing_columns": ["untranslated", "untranslated_words", "untranslated_chars", "nottranslated", "checks", "suggestions", "comments"],
        "editor_link": "",
        "translate_mode": 0,
        "zen_mode": 0,
        "special_chars": "",
        "nearby_strings": 10,
        "auto_watch": true,
        "contribute_personal_tm": true,
        "dashboard_view": 1,
        "dashboard_component_list": null,
        "watched": [],
        "website": "https://example.com/",
        "contact": "",
        "liberapay": "",
        "fediverse": "",
        "codesite": "",
        "github": "",
        "twitter": "",
        "linkedin": "",
        "location": "",
        "company": "",
        "public_email": "",
        "commit_email": "",
        "commit_name": 0,
        "last_2fa": ""
    },
    "is_superuser": true,
    "is_active": true,
    "is_bot": false,
    "date_joined": "2020-03-29T18:42:42.617681Z",
    "url": "http://example.com/api/users/exampleusername/",
    "contributions_url": "http://example.com/api/users/exampleusername/contributions/",
    "statistics_url": "http://example.com/api/users/exampleusername/statistics/"
}
```

### PUT /api/users/(*str:* username)/

Changes the user parameters.

Requires the global `user.edit` permission unless a user is updating
their own account or profile fields. See [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user
management permission model.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **username** (*string*) – username of a user
  * **full_name** (*string*) – full name of a user
  * **email** (*string*) – email of a user
  * **is_superuser** (*boolean*) – whether the user is a super user
  * **is_active** (*boolean*) – whether the user is active
  * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens)
  * **date_joined** (*string*) – date the user is created
  * **profile** (*object*) – updated profile preferences when included in the request; see [User profile](#api-user-profile)

### PATCH /api/users/(*str:* username)/

Changes the user parameters.

Requires the global `user.edit` permission unless a user is updating
their own account or profile fields. See [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user
management permission model.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **username** (*string*) – username of a user
  * **full_name** (*string*) – full name of a user
  * **email** (*string*) – email of a user
  * **is_superuser** (*boolean*) – whether the user is a super user
  * **is_active** (*boolean*) – whether the user is active
  * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens)
  * **date_joined** (*string*) – date the user is created
  * **profile** (*object*) – updated profile preferences when included in the request; see [User profile](#api-user-profile)

### DELETE /api/users/(*str:* username)/

Deletes all user information and marks the user inactive.

Requires the global `user.edit` permission. See
[Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user management permission model.

* **Parameters:**
  * **username** (*string*) – User’s username

### POST /api/users/(*str:* username)/groups/

Associate groups with a user.

Requires the global `user.edit` permission. See
[Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user management permission model.
This permission authorizes membership changes for every team, including
project and workspace teams; no separate permission over the target team is
required.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Form Parameters:**
  * **string group_id** – The unique group ID

### DELETE /api/users/(*str:* username)/groups/

#### Versionadded
Added in version 4.13.1.

Remove user from a group.

Requires the global `user.edit` permission. See
[Access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#access-control) for the user management permission model.
This permission authorizes membership changes for every team, including
project and workspace teams; no separate permission over the target team is
required.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Form Parameters:**
  * **string group_id** – The unique group ID

### GET /api/users/(*str:* username)/statistics/

List statistics of a user.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **translated** (*int*) – Number of translations by user
  * **suggested** (*int*) – Number of suggestions by user
  * **uploaded** (*int*) – Number of uploads by user
  * **commented** (*int*) – Number of comments by user
  * **languages** (*int*) – Number of languages user can translate

### GET /api/users/(*str:* username)/contributions/

List translations with contributions from a user.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **translations** (*array*) – link to translations; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/`](#get--api-translations-(string-project)-(string-component)-(string-language)-)

### GET /api/users/(*str:* username)/notifications/

List subscriptions of a user.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Response JSON Object:**
  * **project** (*string*) – Link to the project, or `null` for other scopes
  * **component** (*string*) – Link to the component, or `null` for other scopes

### POST /api/users/(*str:* username)/notifications/

Associate subscriptions with a user.

* **Parameters:**
  * **username** (*string*) – User’s username
* **Request JSON Object:**
  * **notification** (*string*) – Name of notification registered
  * **scope** (*int*) – Scope of notification from the available choices
  * **frequency** (*int*) – Frequency choices for notifications

### GET /api/users/(*str:* username)/notifications/(*int:* subscription_id)/

Get a subscription associated with a user.

* **Parameters:**
  * **username** (*string*) – User’s username
  * **subscription_id** (*int*) – ID of notification registered
* **Response JSON Object:**
  * **project** (*string*) – Link to the project, or `null` for other scopes
  * **component** (*string*) – Link to the component, or `null` for other scopes

### PUT /api/users/(*str:* username)/notifications/(*int:* subscription_id)/

Edit a subscription associated with a user.

* **Parameters:**
  * **username** (*string*) – User’s username
  * **subscription_id** (*int*) – ID of notification registered
* **Request JSON Object:**
  * **notification** (*string*) – Name of notification registered
  * **scope** (*int*) – Scope of notification from the available choices
  * **frequency** (*int*) – Frequency choices for notifications

### PATCH /api/users/(*str:* username)/notifications/(*int:* subscription_id)/

Edit a subscription associated with a user.

* **Parameters:**
  * **username** (*string*) – User’s username
  * **subscription_id** (*int*) – ID of notification registered
* **Request JSON Object:**
  * **notification** (*string*) – Name of notification registered
  * **scope** (*int*) – Scope of notification from the available choices
  * **frequency** (*int*) – Frequency choices for notifications

### DELETE /api/users/(*str:* username)/notifications/(*int:* subscription_id)/

Delete a subscription associated with a user.

* **Parameters:**
  * **username** (*string*) – User’s username
  * **subscription_id** – Name of notification registered
  * **subscription_id** – int

<a id="api-user-profile"></a>

## User profile

#### Versionadded
Added in version 2026.8.

The user API exposes profile preferences in a nested `profile` object. The
object is returned on [`GET /api/users/(str:username)/`](#get--api-users-(str-username)-) only for callers
with the `user.view` or `user.edit` permission. Users without those
permissions can still update their own profile through
[`PATCH /api/users/(str:username)/`](#patch--api-users-(str-username)-); the response then includes the updated
`profile` object.

Profile fields mirror the settings described in [User profile](https://docs.weblate.org/en/weblate-2026.10/user/profile.md#user-profile).

## Groups

#### Versionadded
Added in version 4.0.

Changing a site-wide group’s access scope requires the global `group.edit`
permission. This trusted administrative permission is not limited by the
caller’s project access: project and component association endpoints can grant
team members access to private projects the caller cannot access directly. See
[Site-wide team management](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#site-wide-team-management) for the permission model and narrower
delegation options.

### GET /api/groups/

Returns a list of groups if you have permissions to see manage groups. If not, then you get to see
only the groups the user is a part of.

#### SEE ALSO
Group object attributes are documented at [`GET /api/groups/(int:id)/`](#get--api-groups-(int-id)-).

### POST /api/groups/

Creates a new group.

* **Parameters:**
  * **name** (*string*) – Group name
  * **project_selection** (*int*) – Group of project selection from given options
  * **language_selection** (*int*) – Group of languages selected from given options
  * **defining_project** (*str*) – link to the defining project, used for [Managing per-project access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#manage-acl); see [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-)

### GET /api/groups/(*int:* id)/

Returns information about the group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Response JSON Object:**
  * **name** (*string*) – name of a group
  * **project_selection** (*int*) – integer corresponding to group of projects
  * **language_selection** (*int*) – integer corresponding to group of languages
  * **roles** (*array*) – link to associated roles; see [`GET /api/roles/(int:id)/`](#get--api-roles-(int-id)-)
  * **projects** (*array*) – link to associated projects; see [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-)
  * **components** (*array*) – link to associated components; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)
  * **componentlists** (*array*) – link to associated componentlist; see [`GET /api/component-lists/(str:slug)/`](#get--api-component-lists-(str-slug)-)
  * **defining_project** (*str*) – link to the defining project, used for [Managing per-project access control](https://docs.weblate.org/en/weblate-2026.10/admin/access.md#manage-acl); see [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-)
  * **admins** (*array*) – link to associated administrators; see [`GET /api/users/(str:username)/`](#get--api-users-(str-username)-)

**Example JSON data:**

```json
{
    "name": "Guests",
    "defining_project": null,
    "project_selection": 3,
    "language_selection": 1,
    "url": "http://example.com/api/groups/1/",
    "roles": [
        "http://example.com/api/roles/1/",
        "http://example.com/api/roles/2/"
    ],
    "languages": [
        "http://example.com/api/languages/en/",
        "http://example.com/api/languages/cs/",
    ],
    "projects": [
        "http://example.com/api/projects/demo1/",
        "http://example.com/api/projects/demo/"
    ],
    "componentlist": "http://example.com/api/component-lists/new/",
    "components": [
        "http://example.com/api/components/demo/weblate/"
    ],
    "admins": [
        "http://example.com/api/users/exampleusername/"
    ]
}
```

### PUT /api/groups/(*int:* id)/

Changes the group parameters.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Response JSON Object:**
  * **name** (*string*) – name of a group
  * **project_selection** (*int*) – integer corresponding to group of projects
  * **language_selection** (*int*) – integer corresponding to group of languages

### PATCH /api/groups/(*int:* id)/

Changes the group parameters.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Response JSON Object:**
  * **name** (*string*) – name of a group
  * **project_selection** (*int*) – integer corresponding to group of projects
  * **language_selection** (*int*) – integer corresponding to group of languages

### DELETE /api/groups/(*int:* id)/

Deletes the group.

* **Parameters:**
  * **id** (*int*) – Group’s ID

### POST /api/groups/(*int:* id)/roles/

Associate roles with a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string role_id** – The unique role ID

### DELETE /api/groups/(*int:* id)/roles/(*int:* role_id)

Delete role from a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **role_id** (*int*) – The unique role ID

### POST /api/groups/(*int:* id)/components/

Associate components with a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string component_id** – The unique component ID

### DELETE /api/groups/(*int:* id)/components/(*int:* component_id)

Delete component from a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **component_id** (*int*) – The unique component ID

### POST /api/groups/(*int:* id)/projects/

Associate projects with a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string project_id** – The unique project ID

### DELETE /api/groups/(*int:* id)/projects/(*int:* project_id)

Delete project from a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **project_id** (*int*) – The unique project ID

### POST /api/groups/(*int:* id)/languages/

Associate languages with a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string language_code** – The unique language code

### DELETE /api/groups/(*int:* id)/languages/(*string:* language_code)

Delete language from a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **language_code** (*string*) – The unique language code

### POST /api/groups/(*int:* id)/componentlists/

Associate componentlists with a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string component_list_id** – The unique componentlist ID

### DELETE /api/groups/(*int:* id)/componentlists/(*int:* component_list_id)

Delete componentlist from a group.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **component_list_id** (*int*) – The unique componentlist ID

### POST /api/groups/(*int:* id)/admins/

#### Versionadded
Added in version 5.5.

Add user to team admins.

* **Parameters:**
  * **id** (*int*) – Group’s ID
* **Form Parameters:**
  * **string user_id** – The user’s ID

### DELETE /api/groups/(*int:* id)/admins/(*int:* user_id)

#### Versionadded
Added in version 5.5.

Delete user from team admins.

* **Parameters:**
  * **id** (*int*) – Group’s ID
  * **user_id** (*integer*) – The user’s ID

## Roles

### GET /api/roles/

Returns a list of all roles associated with user. If user is superuser, then list of all
existing roles is returned.

#### SEE ALSO
Roles object attributes are documented at [`GET /api/roles/(int:id)/`](#get--api-roles-(int-id)-).

### POST /api/roles/

Creates a new role.

* **Parameters:**
  * **name** (*string*) – Role name
  * **permissions** (*array*) – List of codenames of permissions

### GET /api/roles/(*int:* id)/

Returns information about the role.

* **Parameters:**
  * **id** (*int*) – Role’s ID
* **Response JSON Object:**
  * **name** (*string*) – Role name
  * **permissions** (*array*) – list of codenames of permissions

**Example JSON data:**

```json
{
    "name": "Access repository",
    "permissions": [
        "vcs.access",
        "vcs.view"
    ],
    "url": "http://example.com/api/roles/1/",
}
```

### PUT /api/roles/(*int:* id)/

Changes the role parameters.

* **Parameters:**
  * **id** (*int*) – Role’s ID
* **Response JSON Object:**
  * **name** (*string*) – Role name
  * **permissions** (*array*) – list of codenames of permissions

### PATCH /api/roles/(*int:* id)/

Changes the role parameters.

* **Parameters:**
  * **id** (*int*) – Role’s ID
* **Response JSON Object:**
  * **name** (*string*) – Role name
  * **permissions** (*array*) – list of codenames of permissions

### DELETE /api/roles/(*int:* id)/

Deletes the role.

* **Parameters:**
  * **id** (*int*) – Role’s ID

## Languages

### GET /api/languages/

Returns a list of all languages.

#### SEE ALSO
Language object attributes are documented at [`GET /api/languages/(string:language)/`](#get--api-languages-(string-language)-).

### POST /api/languages/

Creates a new language.

* **Parameters:**
  * **code** (*string*) – Language name
  * **name** (*string*) – Language name
  * **direction** (*string*) – Text direction
  * **population** (*int*) – Number of speakers
  * **plural** (*object*) – Language plural formula and number

### GET /api/languages/(*string:* language)/

Returns information about the language.

* **Parameters:**
  * **language** (*string*) – Language code
* **Response JSON Object:**
  * **code** (*string*) – Language code
  * **direction** (*string*) – Text direction
  * **plural** (*object*) – Object of language plural information
  * **aliases** (*array*) – Array of aliases for language
* **Request JSON Object:**
  * **population** (*int*) – Number of speakers

**Example JSON data:**

```json
{
    "code": "en",
    "direction": "ltr",
    "name": "English",
    "population": 159034349015,
    "plural": {
        "id": 75,
        "source": 0,
        "number": 2,
        "formula": "n != 1",
        "type": 1
    },
    "aliases": [
        "english",
        "en_en",
        "base",
        "source",
        "eng"
    ],
    "url": "http://example.com/api/languages/en/",
    "web_url": "http://example.com/languages/en/",
    "statistics_url": "http://example.com/api/languages/en/statistics/"
}
```

### PUT /api/languages/(*string:* language)/

Changes the language parameters.

* **Parameters:**
  * **language** (*string*) – Language’s code
* **Request JSON Object:**
  * **name** (*string*) – Language name
  * **direction** (*string*) – Text direction
  * **population** (*int*) – Number of speakers
  * **plural** (*object*) – Language plural details

### PATCH /api/languages/(*string:* language)/

Changes the language parameters.

* **Parameters:**
  * **language** (*string*) – Language’s code
* **Request JSON Object:**
  * **name** (*string*) – Language name
  * **direction** (*string*) – Text direction
  * **population** (*int*) – Number of speakers
  * **plural** (*object*) – Language plural details

### DELETE /api/languages/(*string:* language)/

Deletes the language.

* **Parameters:**
  * **language** (*string*) – Language’s code

### GET /api/languages/(*string:* language)/statistics/

Returns statistics for a language.

* **Parameters:**
  * **language** (*string*) – Language code

#### SEE ALSO
Returned attributes are described in [Statistics](#api-statistics).

## Projects

### GET /api/projects/

Returns a list of all projects.

#### SEE ALSO
Project object attributes are documented at [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-).

### POST /api/projects/

Creates a new project.

* **Parameters:**
  * **name** (*string*) – Project name
  * **slug** (*string*) – Project slug
  * **web** (*string*) – Project website
  * **workspace** (*string*) – Optional workspace UUID. Creating a project in a workspace
    requires Add projects to workspace permission
    for that workspace. When omitted, Weblate can use the
    only eligible workspace. Creating a project without an
    eligible workspace requires the site-wide
    Add new projects permission. See
    [Project creation and moves](https://docs.weblate.org/en/weblate-2026.10/admin/workspaces.md#workspace-project-creation).
  * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-access-control)
  * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-public-sharing)
  * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-shared-tm)
  * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-shared-tm)
  * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-workspace-tm)
  * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-workspace-tm)
  * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-autoclean-tm)

Omit `access_control` to use the configured default. Explicit non-default
access control requires a superuser unless a billing plan determines the
value. On Hosted Weblate, Custom access control is unavailable and each
translation-memory contribution setting is forced to match its
corresponding usage setting.

### GET /api/projects/(*string:* project)/

Returns information about the project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **name** (*string*) – project name
  * **slug** (*string*) – project slug
  * **web** (*string*) – project website
  * **components_list_url** (*string*) – URL to components list; see [`GET /api/projects/(string:project)/components/`](#get--api-projects-(string-project)-components-)
  * **repository_url** (*string*) – URL to repository status; see [`GET /api/projects/(string:project)/repository/`](#get--api-projects-(string-project)-repository-)
  * **changes_list_url** (*string*) – URL to changes list; see [`GET /api/projects/(string:project)/changes/`](#get--api-projects-(string-project)-changes-)
  * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/projects/(string:project)/reports/`](#get--api-projects-(string-project)-reports-)
  * **translation_review** (*boolean*) – [Enable reviews](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-translation-review)
  * **source_review** (*boolean*) – [Enable source reviews](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-source-review)
  * **enable_hooks** (*boolean*) – [Enable hooks](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-enable-hooks)
  * **workspace** (*string*) – workspace UUID, or `null` when the project is not
    assigned to a workspace
  * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-instructions)
  * **language_aliases** (*string*) – [Language aliases](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-language-aliases)
  * **license** (*string*) – [Translation license](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-license)
  * **enforced_checks** (*array*) – Locally configured [enforced checks](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-enforced-checks).
  * **inherit_enforced_checks** (*boolean*) – Whether enforced checks are inherited from the workspace.
  * **effective_enforced_checks** (*array*) – Enforced checks currently applied to the project (read-only).
  * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-access-control)
  * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-public-sharing)
  * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-shared-tm)
  * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-shared-tm)
  * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-workspace-tm)
  * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-workspace-tm)
  * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-autoclean-tm)
  * **announcements_url** (*string*) – URL to announcements; see [`GET /api/projects/(string:project)/announcements/`](#get--api-projects-(string-project)-announcements-)

**Example JSON data:**

```json
{
    "name": "Hello",
    "slug": "hello",
    "url": "http://example.com/api/projects/hello/",
    "web": "https://weblate.org/",
    "web_url": "http://example.com/projects/hello/"
}
```

### GET /api/projects/(*string:* project)/languages/(*string:* language)/workflow/

Return project-language workflow settings. When no project override exists,
return inherited site-wide workflow settings, or defaults when none exist,
without creating an override. Reviews remain disabled when both project
review settings are disabled. The language is identified by its code.
Access to the project is required.

* **Response JSON Object:**
  * **language** (*string*) – Language code (read-only)
  * **source_language** (*string*) – Custom source language code, or null for the component source; see [Custom source language](https://docs.weblate.org/en/weblate-2026.10/workflows.md#workflow-source-language)
  * **translation_review** (*boolean*) – Enable translation review
  * **enable_suggestions** (*boolean*) – Enable suggestions
  * **restrict_direct_editing** (*boolean*) – Require suggestions instead of direct editing
  * **suggestion_voting** (*boolean*) – Enable voting on suggestions
  * **suggestion_autoaccept** (*integer*) – Number of votes required to accept suggestions, or 0 to disable

### PATCH /api/projects/(*string:* project)/languages/(*string:* language)/workflow/

Create or update a project-language workflow override. Requires permission
to edit the project. Accepts the writable fields returned by
[`GET /api/projects/(string:project)/languages/(string:language)/workflow/`](#get--api-projects-(string-project)-languages-(string-language)-workflow-).
Omitted fields retain their values, including inherited workflow settings
when creating an override. Enabling reviews requires source or translation
reviews to be enabled on the project. Set `source_language` to null to use
the component source. Source languages must exist in the project and must
not form a dependency cycle. Changes reconcile affected units before the
request completes.

### DELETE /api/projects/(*string:* project)/languages/(*string:* language)/workflow/

Remove the project-language workflow override, restoring inherited settings.
Requires permission to edit the project. Returns HTTP 204, including when
no override exists.

All three methods return HTTP 409 if legacy data contains multiple workflow
overrides for the same project and language. Resolve the duplicate settings
before using this endpoint; the API does not choose or delete them implicitly.

### PATCH /api/projects/(*string:* project)/

#### Versionadded
Added in version 4.3.

Edit a project by a [PATCH](https://www.rfc-editor.org/rfc/rfc5789#section-2) request.

The `project` value is the project slug. To avoid using a wrong
identifier, use the project `url` returned by [`GET /api/projects/`](#get--api-projects-)
or [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-).

The request body accepts project fields such as `instructions`,
`license`, `access_control`, and translation-memory settings.

**Example JSON data:**

```json
{
    "instructions": "Translate consistently.",
    "license": "MIT",
    "use_shared_tm": true,
    "access_control": 100
}
```

Changing `access_control` or `public_sharing` requires permission to
manage project access.
Making a project publicly accessible can require licenses on its components
when [`LICENSE_REQUIRED`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-LICENSE_REQUIRED) is enabled. On Hosted Weblate, Custom
access control is unavailable and each translation-memory contribution
setting is forced to match its corresponding usage setting.

Changing `workspace` moves the project. Moving a project requires
permission to edit the project and the Edit workspace settings
permission for the source and target workspace. The target workspace also
requires the Add projects to workspace permission. Moving a
project out of a workspace also requires the site-wide Add new
projects permission. See [Project creation and moves](https://docs.weblate.org/en/weblate-2026.10/admin/workspaces.md#workspace-project-creation).

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-instructions)
  * **license** (*string*) – [Translation license](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-license)
  * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-access-control)
  * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-public-sharing)
  * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-shared-tm)
  * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-shared-tm)
  * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-workspace-tm)
  * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-workspace-tm)
  * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-autoclean-tm)
  * **workspace** (*string*) – Optional workspace UUID, or `null` to move the project
    out of a workspace

### PUT /api/projects/(*string:* project)/

#### Versionadded
Added in version 4.3.

Edit a project by a [PUT](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4) request.

Changing `workspace` follows the same permission checks as
[`PATCH /api/projects/(string:project)/`](#patch--api-projects-(string-project)-).

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-instructions)
  * **license** (*string*) – [Translation license](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-license)
  * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-access-control)
  * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-public-sharing)
  * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-shared-tm)
  * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-shared-tm)
  * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-use-workspace-tm)
  * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-contribute-workspace-tm)
  * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#project-autoclean-tm)

### DELETE /api/projects/(*string:* project)/

Deletes a project.

* **Parameters:**
  * **project** (*string*) – Project URL slug

### GET /api/projects/(*string:* project)/changes/

Returns a list of project changes. This is essentially a project scoped
[`GET /api/changes/`](#get--api-changes-) accepting same params.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of component objects; see [`GET /api/changes/(int:id)/`](#get--api-changes-(int-id)-)

### GET /api/projects/(*string:* project)/file/

#### Versionadded
Added in version 5.5.

Downloads all available translations associated with the project as an archive file using the requested format and language. An unfiltered archive requires project-wide download permission. When `language_code` is specified, download permission is evaluated for that language.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Query Parameters:**
  * **format** (*string*) – The archive format to use; If not specified, defaults to `zip`; Supported formats: `zip` and `zip:CONVERSION` where `CONVERSION` is one of converters listed at [Downloading translations](https://docs.weblate.org/en/weblate-2026.10/user/files.md#download).
  * **language_code** (*string*) – The language code to download; If not specified, all languages are included.

### GET /api/projects/(*string:* project)/repository/

Returns information about the VCS repository status. This endpoint contains
only an overall summary for all repositories for the project. To get more detailed
status use [`GET /api/components/(string:project)/(string:component)/repository/`](#get--api-components-(string-project)-(string-component)-repository-).

Repository status includes repositories where the user has a VCS permission
on the component owning that repository. Repositories whose owners do not
grant this permission are omitted and reported separately.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **needs_commit** (*boolean*) – whether there are any pending changes to commit
  * **needs_merge** (*boolean*) – whether there are any upstream changes to merge
  * **needs_push** (*boolean*) – whether there are any local changes to push
  * **included_components** (*array*) – full paths of project components included in the status
  * **skipped_components** (*array*) – full paths of project components omitted from the status
  * **permission_blockers** (*array*) – full paths of components preventing access to omitted repositories

**Example JSON data:**

```json
{
    "included_components": ["hello/app"],
    "needs_commit": true,
    "needs_merge": false,
    "needs_push": true,
    "permission_blockers": ["shared/glossary"],
    "skipped_components": ["hello/glossary"]
}
```

### POST /api/projects/(*string:* project)/repository/

Performs given operation on the VCS repository.

Repository operations process repositories where the user has the requested
VCS permission on the component owning that repository. Repositories
whose owners do not grant this permission are skipped. The request is
denied when no repository is eligible for the operation.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Request JSON Object:**
  * **operation** (*string*) – Operation to perform: one of `push`, `pull`, `commit`, `reset`, `cleanup`, `file-sync`, `file-scan`
  * **background** (*boolean*) – Schedule the operation as a background task instead of waiting for it to finish. Defaults to `false`.
* **Response JSON Object:**
  * **result** (*boolean*) – result of a synchronous operation
  * **included_components** (*array*) – full paths of project components included in the operation
  * **skipped_components** (*array*) – full paths of project components omitted from the operation
  * **permission_blockers** (*array*) – full paths of components preventing access to omitted repositories
  * **detail** (*string*) – Status of a background operation
  * **task_url** (*string*) – URL for tracking a background operation; see [`GET /api/tasks/(str:uuid)/`](#get--api-tasks-(str-uuid)-)

With `background` set to `true`, the endpoint returns `202 Accepted`.
Repeating an identical queued operation returns the existing task URL. A
conflicting operation returns `423 Locked` and the active task URL when
available. Eligible project repositories are processed sequentially in one
task.

**CURL example:**

```sh
curl \
    -d operation=pull \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/projects/hello/repository/
```

**JSON request example:**

```http
POST /api/projects/hello/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{"operation":"pull"}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{
    "included_components": ["hello/app"],
    "permission_blockers": ["shared/glossary"],
    "result": true,
    "skipped_components": ["hello/glossary"]
}
```

**Background JSON request example:**

```http
POST /api/projects/hello/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN

{"operation":"pull","background":true}
```

**Background JSON response example:**

```http
HTTP/1.0 202 Accepted
Content-Type: application/json

{
    "detail": "Repository operation has been queued.",
    "included_components": ["hello/app"],
    "permission_blockers": ["shared/glossary"],
    "skipped_components": ["hello/glossary"],
    "task_url": "https://example.com/api/tasks/01234567-89ab-cdef-0123-456789abcdef/"
}
```

### GET /api/projects/(*string:* project)/components/

Returns a list of translation components in the given project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of component objects; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)

### POST /api/projects/(*string:* project)/components/

#### Versionchanged
Changed in version 4.3: The `zipfile` and `docfile` parameters are now accepted for VCS-less components, see [Local files](https://docs.weblate.org/en/weblate-2026.10/vcs.md#vcs-local).

#### Versionchanged
Changed in version 4.6: The cloned repositories are now automatically shared within a project using [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls). Use `disable_autoshare` to turn off this.

Creates translation components in the given project.

#### HINT
Use [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) when creating multiple components from a single VCS repository.

#### NOTE
Most of the component creation happens in the background. Check the
`task_url` attribute of created component and follow the progress
there.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Form Parameters:**
  * **file zipfile** – ZIP file to upload into Weblate for translations initialization
  * **file docfile** – Document to translate
  * **string from_component** – Optional source component reference used to duplicate the new component. Accepts either a numeric component ID or a full Weblate component path. When provided, the new component inherits the source component configuration and translations into a new local repository. Repository fields such as `repo`, `vcs`, `branch`, `push`, and `push_branch` can not be combined with this option.
  * **boolean disable_autoshare** – Disables automatic repository sharing via [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls).
* **Request JSON Object:**
  * **object** – Component parameters, see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)
* **Response JSON Object:**
  * **result** (*object*) – Created component object; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)

JSON can not be used when uploading the files using the `zipfile` and
`docfile` parameters. The data has to be uploaded as
*multipart/form-data*.

**CURL form request example:**

```sh
curl \
    --form docfile=@strings.html \
    --form name=Weblate \
    --form slug=weblate \
    --form file_format=html \
    --form new_lang=add \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/projects/hello/components/
```

**CURL JSON request example:**

```sh
curl \
    --data-binary '{
        "branch": "main",
        "file_format": "po",
        "file_format_params": {
            "po_line_wrap": 65535,
            "po_no_location": true
        },
        "filemask": "po/*.po",
        "name": "Weblate",
        "slug": "weblate",
        "repo": "https://github.com/WeblateOrg/hello.git",
        "template": "",
        "new_base": "po/hello.pot",
        "vcs": "git"
    }' \
    -H "Content-Type: application/json" \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/projects/hello/components/
```

**JSON request to create a new component from Git:**

```http
POST /api/projects/hello/components/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{
    "branch": "main",
    "file_format": "po",
    "file_format_params": {
        "po_line_wrap": 65535,
        "po_no_location": true
    },
    "filemask": "po/*.po",
    "name": "Weblate",
    "slug": "weblate",
    "repo": "https://github.com/WeblateOrg/hello.git",
    "template": "",
    "new_base": "po/hello.pot",
    "vcs": "git"
}
```

**JSON request to create a new component from another one:**

```http
POST /api/projects/hello/components/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{
    "from_component": "hello/weblate",
    "name": "Weblate",
    "slug": "weblate"
}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{
    "branch": "main",
    "file_format": "po",
    "file_format_params": {
        "po_line_wrap": 65535,
        "po_no_location": true
    },
    "filemask": "po/*.po",
    "git_export": "",
    "license": "",
    "license_url": "",
    "name": "Weblate",
    "slug": "weblate",
    "project": {
        "name": "Hello",
        "slug": "hello",
        "source_language": {
            "code": "en",
            "direction": "ltr",
             "population": 159034349015,
            "name": "English",
            "url": "http://example.com/api/languages/en/",
            "web_url": "http://example.com/languages/en/"
        },
        "url": "http://example.com/api/projects/hello/",
        "web": "https://weblate.org/",
        "web_url": "http://example.com/projects/hello/"
    },
    "repo": "file:///home/nijel/work/weblate-hello",
    "template": "",
    "new_base": "",
    "url": "http://example.com/api/components/hello/weblate/",
    "vcs": "git",
    "web_url": "http://example.com/projects/hello/weblate/"
}
```

### GET /api/projects/(*string:* project)/languages/

Returns paginated statistics for all languages within a project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of translation statistics objects
  * **language** (*string*) – language name
  * **code** (*string*) – language code
  * **total** (*int*) – total number of strings
  * **translated** (*int*) – number of translated strings
  * **translated_percent** (*float*) – percentage of translated strings
  * **total_words** (*int*) – total number of words
  * **translated_words** (*int*) – number of translated words
  * **words_percent** (*float*) – percentage of translated words

### GET /api/projects/(*string:* project)/statistics/

Returns statistics for a project.

* **Parameters:**
  * **project** (*string*) – Project URL slug

#### SEE ALSO
Returned attributes are described in [Statistics](#api-statistics).

### GET /api/projects/(*string:* project)/metrics/

#### Versionadded
Added in version 2026.8.

Returns translation metrics for the project components visible to the
caller. Components are identified by their project-relative path and the
result is grouped by component and language. When multiple components have
the same project-relative path, `@` and the component ID are appended to
each colliding path.

The OpenMetrics representation exposes `weblate_translation_info` and
`weblate_*` gauges compatible with the project translation statistics.
Strings containing suggestions use
`weblate_strings_with_suggestions` to distinguish them from the
server-wide `weblate_suggestions` object count.
The CSV representation contains one row for each component, language, and
numeric metric.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Query Parameters:**
  * **format** (*string*) – Response format; use `openmetrics` or `csv` for
    monitoring and tabular output.

### GET /api/projects/(*string:* project)/categories/

#### Versionadded
Added in version 5.0: Returns categories for a project. See [`GET /api/categories/(int:id)/`](#get--api-categories-(int-id)-) for field definitions.

* **param project:**
  Project URL slug
* **type project:**
  string

### GET /api/projects/(*string:* project)/labels/

#### Versionadded
Added in version 5.3: Returns labels for a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **>json int id:**
  ID of the label
* **>json string name:**
  name of the label
* **>json string color:**
  color of the label

### POST /api/projects/(*string:* project)/labels/

#### Versionadded
Added in version 5.3: Creates a label for a project. The label color is required.

* **param project:**
  Project URL slug
* **type project:**
  string
* **<json string name:**
  name of the label
* **<json string color:**
  color of the label

### DELETE /api/projects/(*string:* project)/labels/(*int:* label_id)/

#### Versionadded
Added in version 5.14: Deletes a label from a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param label_id:**
  ID of the label to delete
* **type label_id:**
  integer

### GET /api/projects/(*string:* project)/reports/

Lists accessible reports generated directly for a project.

### POST /api/projects/(*string:* project)/reports/

Schedules a report using the project as its scope. The request and response
match [`POST /api/reports/`](#post--api-reports-); scope fields must be omitted.

### GET /api/projects/(*string:* project)/machinery_settings/

#### Versionadded
Added in version 5.9.

Returns automatic suggestion settings for a project, consisting of the configurations defined for each translation service installed.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Response JSON Object:**
  * **suggestion_settings** (*object*) – Configuration for all installed services.

### POST /api/projects/(*string:* project)/machinery_settings/

#### Versionadded
Added in version 5.9.

Create or update the service configuration for a project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
* **Form Parameters:**
  * **string service** – Service name
  * **string configuration** – Service configuration in JSON

### GET /api/projects/(*string:* project)/languages/(*string:* language_code)/file/

#### Versionchanged
Changed in version 5.15.1: Added ability to download ZIP file of all components translations in a project for 1 specific language.

Download a ZIP file of all translation files for a specified `language_code` across all components for a given `project` rather than downloading individual translated files and manually zipping them, with the archive named {project-slug}-{language-code}.zip and organized by component paths (e.g., component-slug/po/lang.po). Download permission is evaluated for the requested language.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **language_code** (*string*) – Language code
* **Query Parameters:**
  * **filter** (*string*) – Optional case-insensitive substring to filter components by slug (e.g., `?filter=core` will match components with ‘core’ anywhere in their slug); only components whose slugs contain the substring will be included in the download.
  * **format** (*string*) – The archive format to use; If not specified, defaults to `zip`; Supported formats: `zip` and `zip:CONVERSION` where `CONVERSION` is one of converters listed at [Downloading translations](https://docs.weblate.org/en/weblate-2026.10/user/files.md#download).

#### NOTE
Possible responses:

- `200 OK` with the ZIP file of translations for the specified language across all components in the project. If no components have translations for the specified language, an empty ZIP file will be returned.
- `403 Forbidden` if the user does not have download permission for the requested language.
- `404 Not Found` if the project slug or language code does not exist.

### GET /api/projects/(*string:* project)/languages/(*string:* language_code)/announcements/

#### Versionadded
Added in version 2026.6: Returns announcements for a specified `language_code` in a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param language_code:**
  Language code
* **type language_code:**
  string
* **>json int id:**
  ID of the announcement
* **>json string message:**
  announcement text
* **>json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **>json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **>json bool notify:**
  send notification to subscribed users? (optional)

### POST /api/projects/(*string:* project)/languages/(*string:* language_code)/announcements/

#### Versionadded
Added in version 2026.6: Creates an announcement for a specified `language_code` in a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param language_code:**
  Language code
* **type language_code:**
  string
* **<json string message:**
  announcement text
* **<json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **<json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **<json bool notify:**
  send notification to subscribed users? (optional)

### DELETE /api/projects/(*string:* project)/languages/(*string:* language_code)/announcements/(*int:* announcement_id)/

#### Versionadded
Added in version 2026.6: Deletes an announcement from a specified `language_code` in a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param language_code:**
  Language code
* **type language_code:**
  string
* **param announcement_id:**
  ID of the announcement to delete
* **type announcement_id:**
  integer

### GET /api/projects/(*string:* project)/announcements/

#### Versionadded
Added in version 5.17: Returns announcements for a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **>json int id:**
  ID of the announcement
* **>json string message:**
  announcement text
* **>json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **>json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **>json bool notify:**
  send notification to subscribed users? (optional)

### POST /api/projects/(*string:* project)/announcements/

#### Versionadded
Added in version 5.17: Creates an announcement for a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **<json string message:**
  announcement text
* **<json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **<json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **<json bool notify:**
  send notification to subscribed users? (optional)

### DELETE /api/projects/(*string:* project)/announcements/(*int:* announcement_id)/

#### Versionadded
Added in version 5.17: Deletes an announcement from a project.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param announcement_id:**
  ID of the announcement to delete
* **type announcement_id:**
  integer

### GET /api/projects/(*string:* project)/backups/

#### Versionadded
Added in version 2026.7: Returns a list of [Project level backups](https://docs.weblate.org/en/weblate-2026.10/admin/backup.md#projectbackup) archives. Project backups contain all
project components, including restricted components, and require
Edit project settings.

* **param project:**
  Project URL slug
* **type project:**
  string
* **>json string name:**
  Backup file name, for example `1718803200.zip`
* **>json string timestamp:**
  Backup creation time in ISO 8601 format
* **>json int size:**
  Backup file size in bytes

### POST /api/projects/(*string:* project)/backups/

#### Versionadded
Added in version 2026.7: Schedules creation of a new [Project level backups](https://docs.weblate.org/en/weblate-2026.10/admin/backup.md#projectbackup) archive. Once ready, the backup appears in
[`GET /api/projects/(string:project)/backups/`](#get--api-projects-(string-project)-backups-).

* **param project:**
  Project URL slug
* **type project:**
  string
* **>json string detail:**
  Result message
* **>json string url:**
  URL to list backups

### GET /api/projects/(*string:* project)/backups/(*string:* backup)/

#### Versionadded
Added in version 2026.7: Downloads a [Project level backups](https://docs.weblate.org/en/weblate-2026.10/admin/backup.md#projectbackup) archive containing all project components,
including restricted components. This requires Edit project
settings.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param backup:**
  Backup file name, e.g. `1718803200.zip`
* **type backup:**
  string

## Components

#### HINT
Use [`POST /api/projects/(string:project)/components/`](#post--api-projects-(string-project)-components-) to create new components.

### GET /api/components/

Returns a list of translation components.

#### SEE ALSO
Component object attributes are documented at [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-).

### GET /api/components/(*string:* project)/(*string:* component)/

Returns information about the translation component.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **project** (*object*) – the translation project; see [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-)
  * **name** (*string*) – [Component name](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-name)
  * **slug** (*string*) – [Component slug](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-slug)
  * **vcs** (*string*) – [Version control system](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-vcs)
  * **vcs_params** (*object*) – [Version control parameters](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-vcs-params)
  * **linked_component** (*string*) – component whose repository is linked via [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls)
  * **repo** (*string*) – [Source code repository](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-repo), this is the actual repository URL even when [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) are used, use `linked_component` to detect this situation
  * **git_export** (*string*) – [Exported repository URL](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-git-export)
  * **branch** (*string*) – [Repository branch](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-branch), this is the actual repository branch even when [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) are used
  * **push** (*string*) – [Repository push URL](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-push), this is the actual repository URL even when [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) are used
  * **push_branch** (*string*) – [Push branch](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-push-branch), this is the actual repository branch even when [Weblate internal URLs](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) are used
  * **filemask** (*string*) – [File mask](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-filemask)
  * **template** (*string*) – [Monolingual base language file](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-template)
  * **edit_template** (*string*) – [Edit base file](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-edit-template)
  * **intermediate** (*string*) – [Intermediate language file](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-intermediate)
  * **new_base** (*string*) – [Template for new translations](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-new-base)
  * **file_format** (*string*) – [File format](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-file-format)
  * **file_format_params** (*object*) – [File format parameters](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-file-format-params)
  * **license** (*string*) – [Translation license](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-license)
  * **agreement** (*string*) – [Contributor license agreement](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-agreement)
  * **new_lang** (*string*) – [Adding new translation](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-new-lang)
  * **language_code_style** (*string*) – [Language code style](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-language-code-style)
  * **source_language** (*object*) – source language object; see [`GET /api/languages/(string:language)/`](#get--api-languages-(string-language)-)
  * **check_flags** (*string*) – [Translation flags](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-check-flags)
  * **priority** (*string*) – [Priority](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-priority)
  * **enforced_checks** (*array*) – Locally configured [enforced checks](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-enforced-checks).
  * **inherit_enforced_checks** (*boolean*) – Whether enforced checks are inherited from the category, project, or workspace.
  * **effective_enforced_checks** (*array*) – Enforced checks currently applied to the component (read-only).
  * **restricted** (*string*) – [Restricted access](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-restricted)
  * **repoweb** (*string*) – [Repository browser](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-repoweb)
  * **repoweb_translations** (*string*) – [Repository browser for translations](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-repoweb-translations)
  * **report_source_bugs** (*string*) – [Source string bug reporting address](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-report-source-bugs)
  * **merge_style** (*string*) – [Merge style](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-merge-style)
  * **commit_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-commit-message)
  * **add_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-add-message)
  * **delete_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-delete-message)
  * **merge_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-merge-message)
  * **addon_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-addon-message)
  * **pull_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-pull-message)
  * **allow_translation_propagation** (*string*) – [Allow translation propagation](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-allow-translation-propagation)
  * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-hide-glossary-matches)
  * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-contribute-project-tm)
  * **enable_suggestions** (*string*) – [Enable suggestions](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-enable-suggestions)
  * **suggestion_voting** (*string*) – [Suggestion voting](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-suggestion-voting)
  * **suggestion_autoaccept** (*string*) – [Automatically accept suggestions](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-suggestion-autoaccept)
  * **push_on_commit** (*boolean*) – [Push on commit](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-push-on-commit); linked repositories expose the effective value from the linked component
  * **locked** (*bool*) – Whether component is locked, this field is read-only; see [`GET /api/components/(string:project)/(string:component)/lock/`](#get--api-components-(string-project)-(string-component)-lock-)
  * **commit_pending_age** (*integer*) – [Age of changes to commit](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-commit-pending-age); linked repositories expose the effective value from the linked component
  * **auto_lock_error** (*boolean*) – [Lock on error](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-auto-lock-error); linked repositories expose the effective value from the linked component
  * **language_regex** (*string*) – [Language filter](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-language-regex)
  * **variant_regex** (*string*) – [Variants regular expression](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-variant-regex)
  * **is_glossary** (*bool*) – [Use as a glossary](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-is-glossary)
  * **glossary_color** (*string*) – [Glossary color](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-glossary-color)
  * **repository_url** (*string*) – URL to repository status; see [`GET /api/components/(string:project)/(string:component)/repository/`](#get--api-components-(string-project)-(string-component)-repository-)
  * **translations_url** (*string*) – URL to translations list; see [`GET /api/components/(string:project)/(string:component)/translations/`](#get--api-components-(string-project)-(string-component)-translations-)
  * **lock_url** (*string*) – URL to lock status; see [`GET /api/components/(string:project)/(string:component)/lock/`](#get--api-components-(string-project)-(string-component)-lock-)
  * **changes_list_url** (*string*) – URL to changes list; see [`GET /api/components/(string:project)/(string:component)/changes/`](#get--api-components-(string-project)-(string-component)-changes-)
  * **task_url** (*string*) – URL to a background task (if any); see [`GET /api/tasks/(str:uuid)/`](#get--api-tasks-(str-uuid)-)
  * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/components/(string:project)/(string:component)/reports/`](#get--api-components-(string-project)-(string-component)-reports-)
  * **announcements_url** (*string*) – URL to announcements; see [`GET /api/components/(string:project)/(string:component)/announcements/`](#get--api-components-(string-project)-(string-component)-announcements-)

Repository fields, including `linked_component`, are returned only with
the View upstream repository location permission.

**Example JSON data:**

```json
{
    "branch": "main",
    "file_format": "po",
    "file_format_params": {
        "po_line_wrap": 65535,
        "po_no_location": true
    },
    "filemask": "po/*.po",
    "git_export": "",
    "license": "",
    "license_url": "",
    "name": "Weblate",
    "slug": "weblate",
    "project": {
        "name": "Hello",
        "slug": "hello",
        "source_language": {
            "code": "en",
            "direction": "ltr",
             "population": 159034349015,
            "name": "English",
            "url": "http://example.com/api/languages/en/",
            "web_url": "http://example.com/languages/en/"
        },
        "url": "http://example.com/api/projects/hello/",
        "web": "https://weblate.org/",
        "web_url": "http://example.com/projects/hello/"
    },
    "source_language": {
        "code": "en",
        "direction": "ltr",
        "population": 159034349015,
        "name": "English",
        "url": "http://example.com/api/languages/en/",
        "web_url": "http://example.com/languages/en/"
    },
    "repo": "file:///home/nijel/work/weblate-hello",
    "template": "",
    "new_base": "",
    "url": "http://example.com/api/components/hello/weblate/",
    "vcs": "git",
    "web_url": "http://example.com/projects/hello/weblate/"
}
```

### PATCH /api/components/(*string:* project)/(*string:* component)/

Edit a component by a [PATCH](https://www.rfc-editor.org/rfc/rfc5789#section-2) request.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **source_language** (*string*) – Project source language code (optional)
* **Request JSON Object:**
  * **name** (*string*) – name of component
  * **slug** (*string*) – slug of component
  * **repo** (*string*) – VCS repository URL
  * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-hide-glossary-matches)
  * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-contribute-project-tm)

Linking to another Weblate component using an [internal URL](https://docs.weblate.org/en/weblate-2026.10/vcs.md#internal-urls) requires permission to edit the referenced component.
Changing [Restricted access](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-restricted) follows the same direct
component-access restrictions as the web interface.

**CURL example:**

```sh
curl \
    --data-binary '{"name": "new name"}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Token TOKEN" \
    PATCH http://example.com/api/projects/hello/components/
```

**JSON request example:**

```http
PATCH /api/projects/hello/components/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{
    "name": "new name"
}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{
    "branch": "main",
    "file_format": "po",
    "file_format_params": {
        "po_line_wrap": 65535,
        "po_no_location": true
    },
    "filemask": "po/*.po",
    "git_export": "",
    "license": "",
    "license_url": "",
    "name": "new name",
    "slug": "weblate",
    "project": {
        "name": "Hello",
        "slug": "hello",
        "source_language": {
            "code": "en",
            "direction": "ltr",
            "population": 159034349015,
            "name": "English",
            "url": "http://example.com/api/languages/en/",
            "web_url": "http://example.com/languages/en/"
        },
        "url": "http://example.com/api/projects/hello/",
        "web": "https://weblate.org/",
        "web_url": "http://example.com/projects/hello/"
    },
    "repo": "file:///home/nijel/work/weblate-hello",
    "template": "",
    "new_base": "",
    "url": "http://example.com/api/components/hello/weblate/",
    "vcs": "git",
    "web_url": "http://example.com/projects/hello/weblate/"
}
```

### PUT /api/components/(*string:* project)/(*string:* component)/

Edit a component by a [PUT](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4) request.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Request JSON Object:**
  * **branch** (*string*) – VCS repository branch
  * **file_format** (*string*) – file format of translations
  * **file_format_params** (*object*) – parameters related to the file
  * **filemask** (*string*) – mask of translation files in the repository
  * **name** (*string*) – name of component
  * **slug** (*string*) – slug of component
  * **repo** (*string*) – VCS repository URL
  * **template** (*string*) – base file for monolingual translations
  * **new_base** (*string*) – base file for adding new translations
  * **vcs** (*string*) – version control system
  * **vcs_params** (*object*) – [Version control parameters](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-vcs-params)
  * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-hide-glossary-matches)
  * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-contribute-project-tm)

### DELETE /api/components/(*string:* project)/(*string:* component)/

Deletes a component.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug

### GET /api/components/(*string:* project)/(*string:* component)/changes/

Returns a list of component changes. This is essentially a component scoped
[`GET /api/changes/`](#get--api-changes-) accepting same params.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of component objects; see [`GET /api/changes/(int:id)/`](#get--api-changes-(int-id)-)

### GET /api/components/(*string:* project)/(*string:* component)/file/

#### Versionadded
Added in version 4.9.

Downloads all available translations associated with the component as an archive file using the requested format.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Query Parameters:**
  * **format** (*string*) – The archive format to use; If not specified, defaults to `zip`; Supported formats: `zip` and `zip:CONVERSION` where `CONVERSION` is one of converters listed at [Downloading translations](https://docs.weblate.org/en/weblate-2026.10/user/files.md#download).

### GET /api/components/(*string:* project)/(*string:* component)/screenshots/

Returns a list of component screenshots.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of component screenshots; see [`GET /api/screenshots/(int:id)/`](#get--api-screenshots-(int-id)-)

### GET /api/components/(*string:* project)/(*string:* component)/lock/

Returns component lock status.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **locked** (*boolean*) – whether component is locked for updates

**Example JSON data:**

```json
{
    "locked": false
}
```

### POST /api/components/(*string:* project)/(*string:* component)/lock/

Sets component lock status.

Response is same as [`GET /api/components/(string:project)/(string:component)/lock/`](#get--api-components-(string-project)-(string-component)-lock-).

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Request JSON Object:**
  * **lock** – Boolean whether to lock or not.

**CURL example:**

```sh
curl \
    -d lock=true \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/components/hello/weblate/repository/
```

**JSON request example:**

```http
POST /api/components/hello/weblate/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{"lock": true}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{"locked":true}
```

### GET /api/components/(*string:* project)/(*string:* component)/repository/

Returns information about the VCS repository status.

The response is same as for [`GET /api/projects/(string:project)/repository/`](#get--api-projects-(string-project)-repository-).

Repository status requires component-wide permission on the component that
owns the repository, including when accessing it through a linked component
in another project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **needs_commit** (*boolean*) – whether there are any pending changes to commit
  * **needs_merge** (*boolean*) – whether there are any upstream changes to merge
  * **needs_push** (*boolean*) – whether there are any local changes to push
  * **remote_commit** (*string*) – Remote commit information
  * **status** (*string*) – VCS repository status as reported by VCS
  * **merge_failure** – Text describing merge failure or null if there is none

### POST /api/components/(*string:* project)/(*string:* component)/repository/

Performs the given operation on a VCS repository.

See [`POST /api/projects/(string:project)/repository/`](#post--api-projects-(string-project)-repository-) for documentation.

Repository operations require component-wide permission on the component
that owns the repository, including when accessing it through a linked
component in another project.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Request JSON Object:**
  * **operation** (*string*) – Operation to perform: one of `push`, `pull`, `commit`, `reset`, `cleanup`
* **Response JSON Object:**
  * **result** (*boolean*) – result of the operation

**CURL example:**

```sh
curl \
    -d operation=pull \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/components/hello/weblate/repository/
```

**JSON request example:**

```http
POST /api/components/hello/weblate/repository/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{"operation":"pull"}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{"result":true}
```

### GET /api/components/(*string:* project)/(*string:* component)/monolingual_base/

Downloads base file for monolingual translations.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug

### GET /api/components/(*string:* project)/(*string:* component)/new_template/

Downloads template file for new translations.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug

### GET /api/components/(*string:* project)/(*string:* component)/translations/

Returns a list of translation objects in the given component.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **results** (*array*) – array of translation objects; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/`](#get--api-translations-(string-project)-(string-component)-(string-language)-)

### POST /api/components/(*string:* project)/(*string:* component)/translations/

Creates new translation in the given component.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Request JSON Object:**
  * **language_code** (*string*) – translation language code; see [`GET /api/languages/(string:language)/`](#get--api-languages-(string-language)-)
  * **from_component** (*array*) – optional ordered list of source component references used for automatic translation. Accepts numeric component IDs or full Weblate component paths. For form submissions this field can be provided multiple times.
* **Response JSON Object:**
  * **result** (*object*) – new translation object created

**CURL example:**

```sh
curl \
    -d language_code=cs \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/projects/hello/components/
```

**JSON request example:**

```http
POST /api/projects/hello/components/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{
    "language_code": "cs",
    "from_component": ["hello/weblate", 123]
}
```

**JSON response example:**

```http
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{
    "failing_checks": 0,
    "failing_checks_percent": 0,
    "failing_checks_words": 0,
    "filename": "po/cs.po",
    "fuzzy": 0,
    "fuzzy_percent": 0.0,
    "fuzzy_words": 0,
    "have_comment": 0,
    "have_suggestion": 0,
    "is_template": false,
    "is_source": false,
    "language": {
        "code": "cs",
        "direction": "ltr",
        "population": 1303174280
        "name": "Czech",
        "url": "http://example.com/api/languages/cs/",
        "web_url": "http://example.com/languages/cs/"
    },
    "language_code": "cs",
    "id": 125,
    "last_author": null,
    "last_change": null,
    "share_url": "http://example.com/engage/hello/cs/",
    "total": 4,
    "total_words": 15,
    "translate_url": "http://example.com/translate/hello/weblate/cs/",
    "translated": 0,
    "translated_percent": 0.0,
    "translated_words": 0,
    "url": "http://example.com/api/translations/hello/weblate/cs/",
    "web_url": "http://example.com/projects/hello/weblate/cs/"
}
```

### GET /api/components/(*string:* project)/(*string:* component)/statistics/

Returns paginated statistics for all translations within component.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug

#### SEE ALSO
Returned attributes are described in [Statistics](#api-statistics).

### GET /api/components/(*string:* project)/(*string:* component)/links/

Returns projects linked with a component.

Component managers see every linked project. Other callers see only linked
projects they can access.

#### Versionadded
Added in version 4.5.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Response JSON Object:**
  * **projects** (*array*) – associated projects; see [`GET /api/projects/(string:project)/`](#get--api-projects-(string-project)-)

### POST /api/components/(*string:* project)/(*string:* component)/links/

Associate project with a component.

This requires permission to edit the component and the target project.

#### Versionadded
Added in version 4.5.

#### Versionchanged
Changed in version 5.17.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
* **Form Parameters:**
  * **string project_slug** – Project slug
  * **int category_id** – Category ID in the target project (optional).
    The category must belong to the specified project.

### DELETE /api/components/(*string:* project)/(*string:* component)/links/(*string:* project_slug)/

Remove association of a project with a component.

#### Versionadded
Added in version 4.5.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **project_slug** (*string*) – Slug of the project to remove

### GET /api/components/(*string:* project)/(*string:* component)/reports/

Lists accessible reports generated directly for a component.

### POST /api/components/(*string:* project)/(*string:* component)/reports/

Schedules a report using the component as its scope. The request and response
match [`POST /api/reports/`](#post--api-reports-); scope fields must be omitted.

### GET /api/components/(*string:* project)/(*string:* component)/announcements/

#### Versionadded
Added in version 5.17: Returns announcements for a component.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **>json int id:**
  ID of the announcement
* **>json string message:**
  announcement text
* **>json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **>json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **>json bool notify:**
  send notification to subscribed users? (optional)

### POST /api/components/(*string:* project)/(*string:* component)/announcements/

#### Versionadded
Added in version 5.17: Creates an announcement for a component.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **<json string message:**
  announcement text
* **<json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **<json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **<json bool notify:**
  send notification to subscribed users? (optional)

### DELETE /api/components/(*string:* project)/(*string:* component)/announcements/(*int:* announcement_id)/

#### Versionadded
Added in version 5.17: Deletes an announcement from a component.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **param announcement_id:**
  ID of the announcement to delete
* **type announcement_id:**
  integer

## Translations

### GET /api/translations/

Returns a list of translations.

#### SEE ALSO
Translation object attributes are documented at [`GET /api/translations/(string:project)/(string:component)/(string:language)/`](#get--api-translations-(string-project)-(string-component)-(string-language)-).

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/

Returns information about the translation.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Response JSON Object:**
  * **component** (*object*) – component object; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)
  * **failing_checks** (*int*) – number of strings failing checks
  * **failing_checks_percent** (*float*) – percentage of strings failing checks
  * **failing_checks_words** (*int*) – number of words with failing checks
  * **filename** (*string*) – translation filename
  * **fuzzy** (*int*) – number of fuzzy (marked for edit) strings
  * **fuzzy_percent** (*float*) – percentage of fuzzy (marked for edit) strings
  * **fuzzy_words** (*int*) – number of words in fuzzy (marked for edit) strings
  * **have_comment** (*int*) – number of strings with comment
  * **have_suggestion** (*int*) – number of strings with suggestion
  * **is_template** (*boolean*) – whether the translation has a monolingual base
  * **language** (*object*) – source language object; see [`GET /api/languages/(string:language)/`](#get--api-languages-(string-language)-)
  * **language_code** (*string*) – language code used in the repository; this can be different from language code in the language object
  * **last_author** (*string*) – name of last author
  * **last_change** (*timestamp*) – last change timestamp
  * **revision** (*string*) – revision hash for the file
  * **share_url** (*string*) – URL for sharing leading to engagement page
  * **total** (*int*) – total number of strings
  * **total_words** (*int*) – total number of words
  * **translate_url** (*string*) – URL for translating
  * **translated** (*int*) – number of translated strings
  * **translated_percent** (*float*) – percentage of translated strings
  * **translated_words** (*int*) – number of translated words
  * **repository_url** (*string*) – URL to repository status; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/repository/`](#get--api-translations-(string-project)-(string-component)-(string-language)-repository-)
  * **file_url** (*string*) – URL to file object; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/file/`](#get--api-translations-(string-project)-(string-component)-(string-language)-file-)
  * **changes_list_url** (*string*) – URL to changes list; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/changes/`](#get--api-translations-(string-project)-(string-component)-(string-language)-changes-)
  * **units_list_url** (*string*) – URL to strings list; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/units/`](#get--api-translations-(string-project)-(string-component)-(string-language)-units-)
  * **announcements_url** (*string*) – URL to announcements; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/announcements/`](#get--api-translations-(string-project)-(string-component)-(string-language)-announcements-)

**Example JSON data:**

```json
{
    "component": {
        "branch": "main",
        "file_format": "po",
        "file_format_params": {
            "po_line_wrap": 65535,
            "po_no_location": true
        },
        "filemask": "po/*.po",
        "git_export": "",
        "license": "",
        "license_url": "",
        "name": "Weblate",
        "new_base": "",
        "project": {
            "name": "Hello",
            "slug": "hello",
            "source_language": {
                "code": "en",
                "direction": "ltr",
                "population": 159034349015,
                "name": "English",
                "url": "http://example.com/api/languages/en/",
                "web_url": "http://example.com/languages/en/"
            },
            "url": "http://example.com/api/projects/hello/",
            "web": "https://weblate.org/",
            "web_url": "http://example.com/projects/hello/"
        },
        "repo": "file:///home/nijel/work/weblate-hello",
        "slug": "weblate",
        "template": "",
        "url": "http://example.com/api/components/hello/weblate/",
        "vcs": "git",
        "web_url": "http://example.com/projects/hello/weblate/"
    },
    "failing_checks": 3,
    "failing_checks_percent": 75.0,
    "failing_checks_words": 11,
    "filename": "po/cs.po",
    "fuzzy": 0,
    "fuzzy_percent": 0.0,
    "fuzzy_words": 0,
    "have_comment": 0,
    "have_suggestion": 0,
    "is_template": false,
    "language": {
        "code": "cs",
        "direction": "ltr",
        "population": 1303174280
        "name": "Czech",
        "url": "http://example.com/api/languages/cs/",
        "web_url": "http://example.com/languages/cs/"
    },
    "language_code": "cs",
    "last_author": "Weblate Admin",
    "last_change": "2016-03-07T10:20:05.499",
    "revision": "7ddfafe6daaf57fc8654cc852ea6be212b015792",
    "share_url": "http://example.com/engage/hello/cs/",
    "total": 4,
    "total_words": 15,
    "translate_url": "http://example.com/translate/hello/weblate/cs/",
    "translated": 4,
    "translated_percent": 100.0,
    "translated_words": 15,
    "url": "http://example.com/api/translations/hello/weblate/cs/",
    "web_url": "http://example.com/projects/hello/weblate/cs/"
}
```

### DELETE /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/

Deletes a translation.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/changes/

Returns a list of translation changes. This is essentially a translations-scoped
[`GET /api/changes/`](#get--api-changes-) accepting the same parameters.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Response JSON Object:**
  * **results** (*array*) – array of component objects; see [`GET /api/changes/(int:id)/`](#get--api-changes-(int-id)-)

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/units/

Returns a list of translation units.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
  * **q** (*string*) – Search query string [Searching](https://docs.weblate.org/en/weblate-2026.10/user/search.md) (optional)
* **Response JSON Object:**
  * **results** (*array*) – array of component objects; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/units/

Add new unit.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Request JSON Object:**
  * **key** (*string*) – *Monolingual translations:* Key of translation unit
  * **value** (*array*) – *Monolingual translations:* Source strings (use single string if not creating plural)
  * **context** (*string*) – *Bilingual translations:* Context of a translation unit
  * **source** (*array*) – *Bilingual translations:* Source strings (use single string if not creating plural)
  * **target** (*array*) – *Bilingual translations:* Target strings (use single string if not creating plural)
  * **state** (*int*) – String state; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)
* **Response JSON Object:**
  * **unit** (*object*) – newly created unit; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

Creating a unit in the approved state requires permission to review strings.

#### SEE ALSO
* [Manage strings](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-manage-units)
* [Adding new strings](https://docs.weblate.org/en/weblate-2026.10/devel/integration.md#adding-new-strings)

### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/autotranslate/

#### Versionchanged
Changed in version 5.13: The `filter_type` parameter is no longer supported and filtering is done by the `q` parameter.

#### Versionchanged
Changed in version 2026.10: Added the `background` parameter.

Trigger automatic translation.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Request JSON Object:**
  * **mode** (*string*) – Automatic translation mode; one of `suggest`, `translate`, `fuzzy`, `approved`
  * **q** (*string*) – Automatic translation search string, see [Searching for strings](https://docs.weblate.org/en/weblate-2026.10/user/search.md#search-strings).
  * **auto_source** (*string*) – Automatic translation source - `mt` or `others`
  * **component** (*string*) – Component ID (always accepted); when the project has 30 or more eligible source components, a component slug or `project/component` path is also accepted; leave blank to use all components in the project
  * **engines** (*array*) – Machine translation engines to use when `auto_source` is `mt`
  * **threshold** (*int*) – Score threshold for machine translation (1–100)
  * **background** (*boolean*) – Schedule automatic translation as a background task instead of waiting for it to finish. Defaults to `false`.
* **Response JSON Object:**
  * **details** (*string*) – Human-readable summary of the translation result, or status of a background task
  * **task_url** (*string*) – URL for tracking a background task; see [`GET /api/tasks/(str:uuid)/`](#get--api-tasks-(str-uuid)-)

With `background` set to `true`, the endpoint returns `202 Accepted`
once the task is scheduled. Validation and permission errors are still
reported immediately.

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/file/

Download current translation file as it is stored in the VCS (without the `format`
parameter) or converted to another format (see [Downloading translations](https://docs.weblate.org/en/weblate-2026.10/user/files.md#download)).

#### NOTE
This API endpoint uses different logic for output than rest of API as
it operates on whole file rather than on data. Set of accepted `format`
parameter differs and without such parameter you get translation file
as stored in VCS.

* **Response Headers:**
  * [Last-Modified](https://www.rfc-editor.org/rfc/rfc7232#section-2.2) – Timestamp of last change to this file.
* **Request Headers:**
  * [If-Modified-Since](https://www.rfc-editor.org/rfc/rfc7232#section-3.3) – Skips response if the file has not been modified since that time.
* **Query Parameters:**
  * **format** – File format to use; if not specified no format conversion happens; see [Downloading translations](https://docs.weblate.org/en/weblate-2026.10/user/files.md#download) for supported formats
  * **q** (*string*) – Filter downloaded strings, see [Search Page](https://docs.weblate.org/en/weblate-2026.10/search.md), only applicable when conversion is in place (`format` is specified).
* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code

### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/file/

Upload new file with translations.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Form Parameters:**
  * **boolean ignore_language** – Ignore a mismatch between the declared file language and the translation language (defaults to `false`), see [Language checking](https://docs.weblate.org/en/weblate-2026.10/user/files.md#upload-ignore-language)
  * **string conflicts** – How to deal with conflicts (`ignore`, `replace-translated` or `replace-approved`), see [Conflicts handling](https://docs.weblate.org/en/weblate-2026.10/user/files.md#upload-conflicts)
  * **file file** – Uploaded file or file content sent as a form field without a filename
  * **string author_email** – Author e-mail
  * **string author_name** – Author name
  * **string method** – Upload method (`translate`, `approve`, `suggest`, `fuzzy`, `replace`, `source`, `add`), see [Import methods](https://docs.weblate.org/en/weblate-2026.10/user/files.md#upload-method)
  * **string fuzzy** – Fuzzy (marked for edit) strings processing (*empty*, `process`, `approve`)

**CURL example:**

```sh
curl -X POST \
    -F file=@strings.xml \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/translations/hello/android/cs/file/
```

The `file` field can also be sent as form content without a filename, for
example when piping data from another command:

```sh
curl -X POST \
    -F 'file=<strings.xml' \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/translations/hello/android/cs/file/
```

The content is used as submitted, byte for byte, so any file encoding works.

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/repository/

Returns information about the VCS repository status.

The response is same as for [`GET /api/components/(string:project)/(string:component)/repository/`](#get--api-components-(string-project)-(string-component)-repository-).

Repository status requires component-wide permission on the component that
owns the repository, including when accessing it through a linked component
in another project. A permission limited to the requested language is not
sufficient.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code

### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/repository/

Performs given operation on the VCS repository.

See [`POST /api/projects/(string:project)/repository/`](#post--api-projects-(string-project)-repository-) for documentation.

Repository operations require component-wide permission on the component
that owns the repository, including when accessing it through a linked
component in another project. A permission limited to the requested
language is not sufficient.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code
* **Request JSON Object:**
  * **operation** (*string*) – Operation to perform: one of `push`, `pull`, `commit`, `reset`, `cleanup`
* **Response JSON Object:**
  * **result** (*boolean*) – result of the operation

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/statistics/

Returns detailed translation statistics.

* **Parameters:**
  * **project** (*string*) – Project URL slug
  * **component** (*string*) – Component URL slug
  * **language** (*string*) – Translation language code

#### SEE ALSO
Returned attributes are described in [Statistics](#api-statistics).

### GET /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/announcements/

#### Versionadded
Added in version 5.17: Returns announcements for a translation.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **param language:**
  Translation language code
* **type language:**
  string
* **>json int id:**
  ID of the announcement
* **>json string message:**
  announcement text
* **>json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **>json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **>json bool notify:**
  send notification to subscribed users? (optional)

### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/announcements/

#### Versionadded
Added in version 5.17: Creates an announcement for a translation.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **param language:**
  Translation language code
* **type language:**
  string
* **<json string message:**
  announcement text
* **<json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **<json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **<json bool notify:**
  send notification to subscribed users? (optional)

### DELETE /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/announcements/(*int:* announcement_id)/

#### Versionadded
Added in version 5.17: Deletes an announcement from a translation.

* **param project:**
  Project URL slug
* **type project:**
  string
* **param component:**
  Component URL slug
* **type component:**
  string
* **param language:**
  Translation language code
* **type language:**
  string
* **param announcement_id:**
  ID of the announcement to delete
* **type announcement_id:**
  integer

## Memory

#### Versionadded
Added in version 4.14.

### GET /api/memory/

Returns a list of memory results.

* **Query Parameters:**
  * **source** – Case-insensitive substring filter on source text (optional)
  * **source_language** – Source language code filter (optional)
  * **target_language** – Target language code filter (optional)
  * **project** – Project slug filter (optional)

### POST /api/memory/lookup/

Looks up translation memory matches for the provided source strings.

* **Query Parameters:**
  * **source_language** – Source language code
  * **target_language** – Target language code
  * **project** – Project slug filter (optional)
  * **exact** – Return exact matches only and skip fuzzy matching (optional)
* **Request JSON Object:**
  * **strings** (*array*) – List of source strings to look up
* **Response JSON Object:**
  * **results** (*array*) – Ordered lookup results with the best match for each query or `null` when no match was found

### DELETE /api/memory/(*int:* memory_object_id)/

Deletes a memory object

* **Parameters:**
  * **memory_object_id** – Memory Object ID

## Units

A unit is a single piece of a translation which pairs a source string with a
corresponding translated string and also contains some related metadata. The
term is derived from the [`translate.storage.base.TranslationUnit`](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/api/storage.html#translate.storage.base.TranslationUnit) in Translate Toolkit
and XLIFF.

### GET /api/units/

Returns a list of translation units.

* **Parameters:**
  * **q** (*string*) – Search query string [Searching](https://docs.weblate.org/en/weblate-2026.10/user/search.md) (optional)

#### SEE ALSO
Unit object attributes are documented at [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-).

### GET /api/units/(*int:* id)/

#### Versionchanged
Changed in version 4.3: The `target` and `source` are now arrays to properly handle plural
strings.

#### Versionchanged
Changed in version 5.6: The `last_updated` attribute is now exposed.

#### Versionchanged
Changed in version 2026.10: The `screenshots_url` attribute is now exposed.

Returns information about the translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Response JSON Object:**
  * **translation** (*string*) – URL of a related translation object
  * **source** (*array*) – source string
  * **previous_source** (*string*) – previous source string used for fuzzy matching
  * **target** (*array*) – target string
  * **id_hash** (*string*) – unique identifier of the unit
  * **content_hash** (*string*) – unique identifier of the source string
  * **location** (*string*) – location of the unit in source code
  * **context** (*string*) – translation unit context
  * **note** (*string*) – translation unit note
  * **flags** (*string*) – translation unit flags
  * **labels** (*array*) – translation unit labels, available on source units
  * **state** (*int*) – unit state, 0 - untranslated, 10 - needs editing, 20 - translated, 30 - approved, 100 - read-only
  * **fuzzy** (*boolean*) – whether the unit is fuzzy or marked for review
  * **translated** (*boolean*) – whether the unit is translated
  * **approved** (*boolean*) – whether the translation is approved
  * **position** (*int*) – unit position in translation file
  * **has_suggestion** (*boolean*) – whether the unit has suggestions
  * **has_comment** (*boolean*) – whether the unit has comments
  * **has_failing_check** (*boolean*) – whether the unit has failing checks
  * **num_words** (*int*) – number of source words
  * **priority** (*int*) – translation priority; 100 is default
  * **id** (*int*) – unit identifier
  * **tbx_terms** (*object*) – Read-only TBX metadata with source and target alternative lists. Each record contains text, optional ID, administrative status, and notes with text, origin, category, and scope (concept, language, or term). Empty for other formats.
  * **explanation** (*string*) – String explanation, available on source units, see [Additional info on source strings](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional)
  * **extra_flags** (*string*) – Additional flags for this unit; source flags apply to all languages and translation flags apply only to that language, see [Translation flags](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional-flags)
  * **web_url** (*string*) – URL where the unit can be edited
  * **source_unit** (*string*) – Source unit link; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)
  * **screenshots_url** (*string*) – URL to list and manage associated screenshots; see [`GET /api/units/(int:id)/screenshots/`](#get--api-units-(int-id)-screenshots-)
  * **translation_parent** (*string*) – Read-only link to the configured parent unit, or null when using the component source or the configured parent is missing; see [Custom source language](https://docs.weblate.org/en/weblate-2026.10/workflows.md#workflow-source-language)
  * **effective_source** (*array*) – Read-only source text used for translation, including plural forms. The existing `source` field continues to contain the canonical file source.
  * **effective_previous_source** (*array*) – Read-only previous source text shown before an effective-source change, including plural forms. The existing `previous_source` field retains the canonical file-source value.
  * **effective_source_language** (*string*) – Read-only language code of the effective source, retaining the configured language when its source is missing
  * **pending** (*boolean*) – whether the unit is pending for write
  * **timestamp** (*timestamp*) – string age
  * **last_updated** (*timestamp*) – last string update

### PATCH /api/units/(*int:* id)/

#### Versionadded
Added in version 4.3.

Performs partial update on translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Request JSON Object:**
  * **state** (*int*) – unit state, 0 - untranslated, 10 - needs editing, 20 - translated, 30 - approved (need review workflow enabled, see [Dedicated reviewers](https://docs.weblate.org/en/weblate-2026.10/workflows.md#reviews))
  * **target** (*array*) – target string
  * **explanation** (*string*) – String explanation, available on source units, see [Additional info on source strings](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional)
  * **extra_flags** (*string*) – Additional flags for this unit; source flags apply to all languages and translation flags apply only to that language, see [Translation flags](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional-flags)
  * **labels** (*array*) – labels, available on source units

### PUT /api/units/(*int:* id)/

#### Versionadded
Added in version 4.3.

Performs full update on translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Request JSON Object:**
  * **state** (*int*) – unit state, 0 - untranslated, 10 - needs editing, 20 - translated, 30 - approved (need review workflow enabled, see [Dedicated reviewers](https://docs.weblate.org/en/weblate-2026.10/workflows.md#reviews))
  * **target** (*array*) – target string
  * **explanation** (*string*) – String explanation, available on source units, see [Additional info on source strings](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional)
  * **extra_flags** (*string*) – Additional flags for this unit; source flags apply to all languages and translation flags apply only to that language, see [Translation flags](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#additional-flags)
  * **labels** (*array*) – labels, available on source units

### POST /api/units/(*int:* id)/source/

Edit the source string associated with a unit, updating its existing
translations within the component. Requires source-editing permission and
[Manage strings](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-manage-units). See [Editing source strings and keys](https://docs.weblate.org/en/weblate-2026.10/user/translating.md#edit-source) for format support
and restrictions.

* **Parameters:**
  * **id** (*int*) – unit ID in any language
* **Request JSON Object:**
  * **content_hash** (*integer*) – current content hash of the source unit, required to detect stale edits
  * **source** (*array*) – replacement source forms, preserving the existing number of forms; optional
  * **context** (*string*) – replacement key or context; optional
  * **explanation** (*string*) – source explanation; optional
* **Response JSON Object:**
  * **object** – updated source unit, in the same format as [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)
* **Status Codes:**
  * [200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200) – source updated, or the request made no changes
  * [400 Bad Request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/400) – invalid edit, conflicting key, unsupported operation, or stale content hash
  * [403 Forbidden](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403) – editing is not permitted
  * [423 Locked](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/423) – component is busy; retry later

Omitted fields remain unchanged. Translation text and associated history
are retained. Source-text changes mark translations as needing editing;
key-only changes preserve translation states. Files are updated by the
normal pending-change queue, respecting the project’s commit policy.

### DELETE /api/units/(*int:* id)/

#### Versionadded
Added in version 4.3.

Deletes a translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID

### GET /api/units/(*int:* id)/translations/

#### Versionadded
Added in version 5.11.

Returns a list of all target translation units for the given source translation unit.

### GET /api/units/(*int:* id)/screenshots/

#### Versionadded
Added in version 2026.10.

Returns a paginated list of screenshots associated with the unit.

* **Parameters:**
  * **id** (*int*) – Unit ID

#### SEE ALSO
Screenshot object attributes are documented at [`GET /api/screenshots/(int:id)/`](#get--api-screenshots-(int-id)-).

### POST /api/units/(*int:* id)/screenshots/

#### Versionadded
Added in version 2026.10.

Associate screenshot with unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Form Parameters:**
  * **string screenshot_id** – Screenshot ID; the screenshot must belong to the
    same component and language as the unit

#### SEE ALSO
Returns the associated screenshot; see [`GET /api/screenshots/(int:id)/`](#get--api-screenshots-(int-id)-).

### DELETE /api/units/(*int:* id)/screenshots/(*int:* screenshot_id)

#### Versionadded
Added in version 2026.10.

Remove screenshot association with unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
  * **screenshot_id** (*int*) – Screenshot ID

### POST /api/units/(*int:* id)/comments/

#### Versionadded
Added in version 5.12.

Create a new comment on the given translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Request JSON Object:**
  * **scope** (*string*) – comment scope - global, translation (available on all non-source units), report (need review workflow enabled, see [Dedicated reviewers](https://docs.weblate.org/en/weblate-2026.10/workflows.md#reviews))
  * **comment** (*string*) – content of the new comment, you can use Markdown and mention users by @username.
  * **user_email** (*string*) – commenter’s email, can be set only by project admins and defaults to the authenticated user.
  * **timestamp** (*string*) – creation timestamp of the comment, can be set only by project admins and defaults to now.
* **Response JSON Object:**
  * **id** (*int*) – comment identifier
  * **comment** (*string*) – content of the new comment
  * **user** (*string*) – URL of the commenter’s object
  * **timestamp** (*string*) – creation timestamp of the comment

### GET /api/units/(*int:* id)/comments/

#### Versionadded
Added in version 5.15.

Returns a list of comments on a given translation unit

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Response JSON Object:**
  * **id** (*int*) – comment identifier
  * **comment** (*string*) – content of the comment
  * **timestamp** (*string*) – creation timestamp of the comment
  * **user** (*string*) – URL of the commenter’s object

### POST /api/units/(*int:* id)/suggestions/

#### Versionadded
Added in version 2026.8.

Create a new suggestion on the given translation unit.

Requires authentication and the Add suggestion permission on the
translation. Suggestions must be enabled on the translation, the translation
must not be read-only, and the user must have signed any required contributor
agreement.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Request JSON Object:**
  * **target** (*array*) – suggested translation text as a list of plural forms; use a single-element array for non-plural strings
* **Response JSON Object:**
  * **id** (*int*) – suggestion identifier
  * **target** (*array*) – suggested translation text as a list of plural forms
  * **unit** (*string*) – URL of the related unit object
  * **user** (*string*) – URL of the suggester’s object
  * **timestamp** (*string*) – creation timestamp of the suggestion
  * **votes** (*int*) – net vote count for the suggestion

Users who also have the Vote on suggestion permission
automatically upvote their suggestion when it is created.

When the same suggestion already exists from another user and the caller has
the Vote on suggestion permission, the existing suggestion is
upvoted instead and the response uses the same format as
[`POST /api/suggestions/(int:id)/vote/`](#post--api-suggestions-(int-id)-vote-) (HTTP status 200 instead of 201).

### GET /api/units/(*int:* id)/suggestions/

#### Versionadded
Added in version 2026.8.

Returns a paginated list of suggestions on a given translation unit.

* **Parameters:**
  * **id** (*int*) – Unit ID
* **Response JSON Object:**
  * **results** (*array*) – array of suggestion objects; see [`GET /api/suggestions/(int:id)/`](#get--api-suggestions-(int-id)-)

## Suggestions

### GET /api/suggestions/

#### Versionadded
Added in version 2026.8.

Returns a paginated list of suggestions the user has access to, ordered by
creation time (most recent first).

#### SEE ALSO
Suggestion object attributes are documented at [`GET /api/suggestions/(int:id)/`](#get--api-suggestions-(int-id)-).

* **Response JSON Object:**
  * **results** (*array*) – array of suggestion objects; see [`GET /api/suggestions/(int:id)/`](#get--api-suggestions-(int-id)-)

### GET /api/suggestions/(*int:* id)/

#### Versionadded
Added in version 2026.8.

Returns information about a suggestion.

* **Parameters:**
  * **id** (*int*) – Suggestion ID
* **Response JSON Object:**
  * **id** (*int*) – suggestion identifier
  * **target** (*array*) – suggested translation text as a list of plural forms
  * **unit** (*string*) – URL of the related unit object
  * **user** (*string*) – URL of the suggester’s object, or `null` for anonymous suggestions
  * **timestamp** (*string*) – creation timestamp of the suggestion
  * **votes** (*int*) – net vote count for the suggestion

### DELETE /api/suggestions/(*int:* id)/

#### Versionadded
Added in version 2026.8.

Delete or reject a suggestion.

Requires the Delete suggestion permission on the related
translation, or ownership of the suggestion.

* **Parameters:**
  * **id** (*int*) – Suggestion ID
* **Request JSON Object:**
  * **rejection_reason** (*string*) – optional reason for rejecting the suggestion
  * **is_spam** (*boolean*) – whether to report the suggestion as spam

The request body is optional. When `is_spam` is `true`, the suggestion
content is reported to the antispam service.

### POST /api/suggestions/(*int:* id)/accept/

#### Versionadded
Added in version 2026.8.

Accept a suggestion and apply it to the translation unit.

Requires the Accept suggestion permission on the related
translation unit.

* **Parameters:**
  * **id** (*int*) – Suggestion ID
* **Request JSON Object:**
  * **approve** (*boolean*) – whether to mark the translation as approved after accepting; requires the Review strings permission and review workflow enabled (see [Dedicated reviewers](https://docs.weblate.org/en/weblate-2026.10/workflows.md#reviews))
* **Response JSON Object:**
  * **result** (*string*) – `accepted` when the suggestion was accepted

### POST /api/suggestions/(*int:* id)/vote/

#### Versionadded
Added in version 2026.8.

Vote for or against a suggestion.

Requires the Vote on suggestion permission and voting enabled
on the related translation (see [Suggestion voting](https://docs.weblate.org/en/weblate-2026.10/admin/translating.md#voting)).

* **Parameters:**
  * **id** (*int*) – Suggestion ID
* **Request JSON Object:**
  * **value** (*int*) – `1` to vote for the suggestion or `-1` to vote against it
* **Response JSON Object:**
  * **result** (*string*) – `voted` when the suggestion remains open; `accepted` when auto-accept applied it
  * **suggestion** (*object*) – updated suggestion object when `result` is `voted`; `null` when `result` is `accepted`

## Changes

### GET /api/changes/

#### Versionchanged
Changed in version 4.1: Filtering of changes was introduced in the 4.1 release.

Returns a list of translation changes.

#### SEE ALSO
Change object attributes are documented at [`GET /api/changes/(int:id)/`](#get--api-changes-(int-id)-).

* **Query Parameters:**
  * **user** (*string*) – Username of the user to filter by
  * **action** (*int*) – Action to filter, can be used several times; see
    [Selected change events](https://docs.weblate.org/en/weblate-2026.10/admin/addons.md#change-actions) for available values
  * **timestamp_after** (*timestamp*) – ISO 8601 formatted timestamp to list changes after
  * **timestamp_before** (*timestamp*) – ISO 8601 formatted timestamp to list changes before

### GET /api/changes/(*int:* id)/

Returns information about the translation change.

* **Parameters:**
  * **id** (*int*) – Change ID
* **Response JSON Object:**
  * **unit** (*string*) – URL of a related unit object
  * **translation** (*string*) – URL of a related translation object
  * **component** (*string*) – URL of a related component object
  * **user** (*string*) – URL of a related user object
  * **author** (*string*) – URL of a related author object
  * **timestamp** (*timestamp*) – event timestamp
  * **action** (*int*) – numeric identification of action
  * **action_name** (*string*) – text description of action
  * **target** (*string*) – event changed text
  * **old** (*string*) – previous text
  * **details** (*object*) – additional details about the change
  * **id** (*int*) – change identifier

## Screenshots

### GET /api/screenshots/

Returns a list of screenshots.

#### SEE ALSO
Screenshot object attributes are documented at [`GET /api/screenshots/(int:id)/`](#get--api-screenshots-(int-id)-).

### GET /api/screenshots/(*int:* id)/

Returns information about the screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
* **Response JSON Object:**
  * **name** (*string*) – name of a screenshot
  * **repository_filename** (*string*) – repository path used to match repository-based screenshot updates
  * **translation** (*string*) – URL of a related translation object
  * **file_url** (*string*) – URL to download a file; see [`GET /api/screenshots/(int:id)/file/`](#get--api-screenshots-(int-id)-file-)
  * **units** (*array*) – link to associated source string information; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### GET /api/screenshots/(*int:* id)/file/

Download the screenshot image.

* **Parameters:**
  * **id** (*int*) – Screenshot ID

### POST /api/screenshots/(*int:* id)/file/

Replace screenshot image.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
* **Form Parameters:**
  * **file image** – Uploaded file

**CURL example:**

```sh
curl -X POST \
    -F image=@image.png \
    -H "Authorization: Token TOKEN" \
    http://example.com/api/screenshots/1/file/
```

### POST /api/screenshots/(*int:* id)/units/

Associate source string with screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
* **Form Parameters:**
  * **string unit_id** – Unit ID
* **Response JSON Object:**
  * **name** (*string*) – name of a screenshot
  * **translation** (*string*) – URL of a related translation object
  * **file_url** (*string*) – URL to download a file; see [`GET /api/screenshots/(int:id)/file/`](#get--api-screenshots-(int-id)-file-)
  * **units** (*array*) – link to associated source string information; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### DELETE /api/screenshots/(*int:* id)/units/(*int:* unit_id)

Remove source string association with screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
  * **unit_id** – Source string unit ID

### POST /api/screenshots/

Creates a new screenshot.

* **Form Parameters:**
  * **file image** – Uploaded file
  * **string name** – Screenshot name
  * **string project_slug** – Project slug
  * **string component_slug** – Component slug
  * **string language_code** – Language code
  * **string repository_filename** – Optional repository path used to associate later repository updates
* **Response JSON Object:**
  * **name** (*string*) – name of a screenshot
  * **repository_filename** (*string*) – repository path used to match repository-based screenshot updates
  * **translation** (*string*) – URL of a related translation object
  * **file_url** (*string*) – URL to download a file; see [`GET /api/screenshots/(int:id)/file/`](#get--api-screenshots-(int-id)-file-)
  * **units** (*array*) – link to associated source string information; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### PATCH /api/screenshots/(*int:* id)/

Edit partial information about screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
* **Response JSON Object:**
  * **name** (*string*) – name of a screenshot
  * **repository_filename** (*string*) – repository path used to match repository-based screenshot updates
  * **translation** (*string*) – URL of a related translation object
  * **file_url** (*string*) – URL to download a file; see [`GET /api/screenshots/(int:id)/file/`](#get--api-screenshots-(int-id)-file-)
  * **units** (*array*) – link to associated source string information; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### PUT /api/screenshots/(*int:* id)/

Edit full information about screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID
* **Response JSON Object:**
  * **name** (*string*) – name of a screenshot
  * **repository_filename** (*string*) – repository path used to match repository-based screenshot updates
  * **translation** (*string*) – URL of a related translation object
  * **file_url** (*string*) – URL to download a file; see [`GET /api/screenshots/(int:id)/file/`](#get--api-screenshots-(int-id)-file-)
  * **units** (*array*) – link to associated source string information; see [`GET /api/units/(int:id)/`](#get--api-units-(int-id)-)

### DELETE /api/screenshots/(*int:* id)/

Delete screenshot.

* **Parameters:**
  * **id** (*int*) – Screenshot ID

<a id="kotlin-sdk-build-api"></a>

## Kotlin SDK builds

#### WARNING
The Kotlin SDK API is in beta. No compatibility is guaranteed until the
final Kotlin SDK is released. Endpoints, build metadata, CDN manifests, and
generated resource formats may change without backward compatibility.

The API contract is also documented in the OpenAPI schema at `/api/schema/`.
The registration metadata has a [`JSON Schema`](https://docs.weblate.org/en/weblate-2026.10/_downloads/90da0e6c6626e2b360bb1983d45f373b/weblate-kotlin-sdk-build.schema.json).
See [Kotlin SDK CDN](https://docs.weblate.org/en/weblate-2026.10/admin/addons.md#addon-weblate-cdn-kotlin) for add-on installation, lifecycle settings, and the
CDN manifest contract.

### POST /api/components/(*string:* project)/(*string:* component)/addons/kotlin-sdk/builds/

Register resource IDs for [Kotlin SDK CDN](https://docs.weblate.org/en/weblate-2026.10/admin/addons.md#addon-weblate-cdn-kotlin). Requires the
Kotlin SDK CDN add-on (`weblate.cdn.kotlin`) installed directly
on the component and `component.edit` permission. Send JSON with:

* **Request JSON Object:**
  * **schemaVersion** (*integer*) – Metadata version, currently 1; defaults to 1.
  * **packageName** (*string*) – Android application package name, at most 127 characters.
  * **versionCode** (*integer*) – Android version code between 1 and 2100000000.
  * **strings** (*object*) – String resource names mapped to hexadecimal IDs, such as `0x7f090003`; defaults to an empty object.
  * **plurals** (*object*) – Plural resource names mapped to hexadecimal IDs; defaults to an empty object. Quantities and translated values come from Weblate.

Include at least one resource across the two maps. The request limit is
5 MiB and 100000 combined resources. IDs must belong to application package
`0x7f` and use one distinct type ID per resource kind. Duplicate IDs,
invalid names, unknown fields, and unsupported schema versions are rejected.
The same name can occur in both maps with different IDs.

A new registration returns 202; an identical existing registration returns
200. Conflicting metadata for an existing package/version returns 409.
The response includes `packageName`, `versionCode`, `status`, `error`,
`status_url`, and `manifest_url`. Publication is asynchronous; the manifest
need not exist when registration returns.

### GET /api/components/(*string:* project)/(*string:* component)/addons/kotlin-sdk/builds/(*string:* package)/(*int:* version)/

Return the registration response fields for an existing build. Requires the
Kotlin SDK CDN add-on (`weblate.cdn.kotlin`) installed directly
on the component and `component.edit` permission. Status is `pending`,
`published`, `failed`, or `retired`. A failed replacement may still have
a previous successful manifest. Missing installations or registrations
return 404.

<a id="addons-api"></a>

## Add-ons

#### Versionadded
Added in version 4.4.1.

### GET /api/addons/

Returns a list of add-ons the caller can manage. Site-wide add-on managers
can access site-wide add-ons without gaining access to project or component
add-on configuration.

#### SEE ALSO
Add-on object attributes are documented at [`GET /api/addons/(int:id)/`](#get--api-addons-(int-id)-).

### GET /api/addons/(*int:* id)/

Returns information about add-on information.

* **Parameters:**
  * **id** (*int*) – Add-on ID
* **Response JSON Object:**
  * **name** (*string*) – name of an add-on
  * **component** (*string*) – URL of a related component object
  * **configuration** (*object*) – Optional add-on configuration

#### SEE ALSO
[Add-ons](https://docs.weblate.org/en/weblate-2026.10/admin/addons.md)

### POST /api/components/(*string:* project)/(*string:* component)/addons/

Creates a new add-on.

The xgettext and Meson extraction add-ons accept `data_dirs` in
`configuration` as an ordered list of repository-relative ITS data
directories, for example `{"data_dirs": ["po"]}`. Each directory must
contain an `its/` subdirectory. See
[Update POT file (xgettext)](https://docs.weblate.org/en/weblate-2026.10/admin/addons.md#addon-weblate-gettext-xgettext) for supported formats and validation.

* **Parameters:**
  * **project_slug** (*string*) – Project slug
  * **component_slug** (*string*) – Component slug
* **Request JSON Object:**
  * **name** (*string*) – name of an add-on
  * **configuration** (*object*) – Optional add-on configuration

### PATCH /api/addons/(*int:* id)/

Edit partial information about add-on.

* **Parameters:**
  * **id** (*int*) – Add-on ID
* **Response JSON Object:**
  * **configuration** (*object*) – Optional add-on configuration

### PUT /api/addons/(*int:* id)/

Edit full information about add-on.

* **Parameters:**
  * **id** (*int*) – Add-on ID
* **Response JSON Object:**
  * **configuration** (*object*) – Optional add-on configuration

### DELETE /api/addons/(*int:* id)/

Delete add-on.

* **Parameters:**
  * **id** (*int*) – Add-on ID

### POST /api/addons/(*int:* id)/trigger/

Trigger a manual run of an add-on that supports manual triggering.

#### Versionadded
Added in version 5.17.1.

* **Parameters:**
  * **id** (*int*) – Add-on ID

### POST /api/addons/(*int:* id)/preview/

Preview an [Workflow definition](https://docs.weblate.org/en/weblate-2026.10/admin/automation.md#automation-workflows) definition without executing actions.
Requires the same management permission as configuring the add-on. Other
add-on types reject this operation.

* **Parameters:**
  * **id** – Add-on ID.
* **JSON Parameters:**
  * **workflow** (*object*) – Workflow definition, using the same structure as configuration.
  * **component** (*int*) – Component ID within the installed add-on’s scope.
  * **change** (*int*) – Optional change ID belonging to that component.

Returns `workflow`, execution `context`, a `trace` of evaluated conditions
and planned or conditional actions, and `preview: true`. Configuration and
scope errors return HTTP 400. Preview does not save configuration or create an
activity log.

## Component lists

#### Versionadded
Added in version 4.0.

### GET /api/component-lists/

Returns a list of component lists.

#### SEE ALSO
Component list object attributes are documented at [`GET /api/component-lists/(str:slug)/`](#get--api-component-lists-(str-slug)-).

### GET /api/component-lists/(*str:* slug)/

Returns information about component list.

* **Parameters:**
  * **slug** (*string*) – Component list slug
* **Response JSON Object:**
  * **name** (*string*) – name of a component list
  * **slug** (*string*) – slug of a component list
  * **show_dashboard** (*boolean*) – whether to show it on a dashboard
  * **components** (*array*) – link to associated components; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)
  * **auto_assign** (*array*) – automatic assignment rules

### PUT /api/component-lists/(*str:* slug)/

Changes the component list parameters.

* **Parameters:**
  * **slug** (*string*) – Component list slug
* **Request JSON Object:**
  * **name** (*string*) – name of a component list
  * **slug** (*string*) – slug of a component list
  * **show_dashboard** (*boolean*) – whether to show it on a dashboard

### PATCH /api/component-lists/(*str:* slug)/

Changes the component list parameters.

* **Parameters:**
  * **slug** (*string*) – Component list slug
* **Request JSON Object:**
  * **name** (*string*) – name of a component list
  * **slug** (*string*) – slug of a component list
  * **show_dashboard** (*boolean*) – whether to show it on a dashboard

### DELETE /api/component-lists/(*str:* slug)/

Deletes the component list.

* **Parameters:**
  * **slug** (*string*) – Component list slug

### GET /api/component-lists/(*str:* slug)/components/

#### Versionadded
Added in version 5.0.1: List components in a component list.

* **param slug:**
  Component list slug
* **type slug:**
  string
* **form string component_id:**
  Component ID
* **>json array results:**
  array of component objects; see [`GET /api/components/(string:project)/(string:component)/`](#get--api-components-(string-project)-(string-component)-)

### POST /api/component-lists/(*str:* slug)/components/

Associate component with a component list.

* **Parameters:**
  * **slug** (*string*) – Component list slug
* **Form Parameters:**
  * **string component_id** – Component ID

### DELETE /api/component-lists/(*str:* slug)/components/(*str:* component_slug)

Disassociate a component from the component list.

* **Parameters:**
  * **slug** (*string*) – Component list slug
  * **component_slug** (*string*) – Component slug

## Glossary

#### Versionchanged
Changed in version 4.5: Glossaries are now stored as regular components, translations and strings,
please use respective API instead.

## Reports

### GET /api/reports/

Lists stored reports accessible to the authenticated user. The optional
`kind`, `workspace`, `project`, `category`, and `component` query
parameters filter the result. The Manage reports permission is
authoritative for the selected scope and includes reports containing data
from private projects and restricted components below that scope.

### POST /api/reports/

Schedules report generation and returns `202 Accepted` with a `task_url`.
The task result links to the created report. The `kind` is one of
`credits`, `contributor_stats`, `cost_estimate`, or `translator_work`.
Specify at most one of `workspace`, `project`, `category`, or
`component`; omitting all of them creates a global report. Contribution
reports require `start` and `end` ISO 8601 timestamps. A workspace can
be selected when the user has Manage reports for it, even without
access to the regular workspace page.

### GET /api/reports/(*int:* id)/

Returns report metadata, generation parameters, stored JSON `data`, and
links to the JSON, HTML, and reStructuredText renderings.

### GET /api/reports/(*int:* id)/json/

Downloads only the stored report data without metadata.

### GET /api/reports/(*int:* id)/html/

Downloads an HTML rendering of the stored report.

### GET /api/reports/(*int:* id)/rst/

Downloads a reStructuredText rendering of the stored report.

## Tasks

#### Versionadded
Added in version 4.4.

### GET /api/tasks/

Listing of the tasks is currently not available.

### GET /api/tasks/(*str:* uuid)/

Returns information about a task.

Authentication is required.

* **Parameters:**
  * **uuid** (*string*) – Task UUID
* **Response JSON Object:**
  * **completed** (*boolean*) – Whether the task has completed
  * **progress** (*int*) – Task progress in percent
  * **result** (*object*) – Task result or progress details
  * **log** (*string*) – Task log
  * **cancellable** (*boolean*) – Whether the task can be cancelled

### DELETE /api/tasks/(*str:* uuid)/

Cancels a running task when its `cancellable` property is `true`.
Repository operation tasks cannot be cancelled because interruption can
leave a repository operation incomplete.

<a id="api-statistics"></a>

## Statistics

### GET /api/(*str:* object)/statistics/

There are several statistics endpoints for objects and all of them contain same structure.

* **Parameters:**
  * **object** (*string*) – URL path
* **Response JSON Object:**
  * **total** (*int*) – total number of strings
  * **total_words** (*int*) – total number of words
  * **total_chars** (*int*) – total number of characters
  * **last_change** (*timestamp*) – date of last change
  * **translated** (*int*) – number of translated strings
  * **translated_percent** (*float*) – percentage of translated strings
  * **translated_words** (*int*) – number of translated words
  * **translated_words_percent** (*float*) – percentage of translated words
  * **translated_chars** (*int*) – number of translated characters
  * **translated_chars_percent** (*float*) – percentage of translated characters
  * **fuzzy** (*int*) – number of fuzzy (marked for edit) strings
  * **fuzzy_words** (*int*) – number of fuzzy (marked for edit) words
  * **fuzzy_chars** (*int*) – number of fuzzy (marked for edit) characters
  * **fuzzy_percent** (*float*) – percentage of fuzzy (marked for edit) strings
  * **fuzzy_words_percent** (*float*) – percentage of fuzzy (marked for edit) words
  * **fuzzy_chars_percent** (*float*) – percentage of fuzzy (marked for edit) characters
  * **failing** (*int*) – number of failing checks
  * **failing_percent** (*float*) – percentage of failing checks
  * **approved** (*int*) – number of approved strings
  * **approved_words** (*int*) – number of approved words
  * **approved_chars** (*int*) – number of approved characters
  * **approved_percent** (*float*) – percentage of approved strings
  * **approved_words_percent** (*float*) – percentage of approved words
  * **approved_chars_percent** (*float*) – percentage of approved characters
  * **readonly** (*int*) – number of read-only strings
  * **readonly_words** (*int*) – number of read-only words
  * **readonly** – number of read-only characters
  * **readonly_percent** (*float*) – percentage of read-only strings
  * **readonly_words_percent** (*float*) – percentage of read-only words
  * **readonly_char_percent** (*float*) – percentage of read-only characters
  * **suggestions** (*int*) – number of strings with suggestions
  * **comments** (*int*) – number of strings with comments
  * **name** (*string*) – object name
  * **url** (*string*) – URL to access the object (if applicable)
  * **url_translate** (*string*) – URL to access the translation (if applicable)
  * **code** (*string*) – language code (if applicable)

#### SEE ALSO
* [`GET /api/languages/(string:language)/statistics/`](#get--api-languages-(string-language)-statistics-)
* [`GET /api/projects/(string:project)/statistics/`](#get--api-projects-(string-project)-statistics-)
* [`GET /api/categories/(int:id)/statistics/`](#get--api-categories-(int-id)-statistics-)
* [`GET /api/components/(string:project)/(string:component)/statistics/`](#get--api-components-(string-project)-(string-component)-statistics-)
* [`GET /api/translations/(string:project)/(string:component)/(string:language)/statistics/`](#get--api-translations-(string-project)-(string-component)-(string-language)-statistics-)

## Metrics

### GET /api/metrics/

Returns server metrics.

#### Versionchanged
Changed in version 5.6.1: Metrics can now be exposed in OpenMetrics compatible format with `?format=openmetrics`.

#### Versionchanged
Changed in version 2026.8: OpenMetrics responses now include `HELP` and `TYPE` metadata and use
the versioned OpenMetrics content type.

* **Response JSON Object:**
  * **units** (*int*) – Number of units
  * **units_translated** (*int*) – Number of translated units
  * **users** (*int*) – Number of users
  * **changes** (*int*) – Number of changes
  * **projects** (*int*) – Number of projects
  * **components** (*int*) – Number of components
  * **translations** (*int*) – Number of translations
  * **languages** (*int*) – Number of used languages
  * **checks** (*int*) – Number of triggered quality checks
  * **configuration_errors** (*int*) – Number of configuration errors
  * **suggestions** (*int*) – Number of pending suggestions
  * **celery_queues** (*object*) – Lengths of Celery queues, see [Background tasks using Celery](https://docs.weblate.org/en/weblate-2026.10/admin/install.md#celery)
  * **name** (*string*) – Configured server name
  * **version** (*string*) – Running Weblate version, included when [`VERSION_DISPLAY`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-VERSION_DISPLAY) is `show` or `soft`

In OpenMetrics format, the version is exposed as `weblate_info{version="..."} 1`
when [`VERSION_DISPLAY`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-VERSION_DISPLAY) is `show` or `soft`. All metrics are
exposed as gauges.

Project metrics expose translation statistics for each visible component and
language at [`GET /api/projects/(string:project)/metrics/`](#get--api-projects-(string-project)-metrics-). They include
translated, total, fuzzy, failing-check, and approved string, word, and
character counts; suggestions; comments; and translated and approved
percentages.

## Search

### GET /api/search/

#### Versionadded
Added in version 4.18.

Returns site-wide search results as a list. There is no pagination on the
result set, only first few matches are returned for each category.

The search looks for:

- Projects
- Categories
- Components
- Languages
- Users

* **Parameters:**
  * **q** – Search query string
* **Response JSON Object:**
  * **name** (*str*) – Name of the matched item.
  * **url** (*str*) – Web URL of the matched item.
  * **category** (*str*) – Category of the matched item.

## Categories

### GET /api/categories/

#### Versionadded
Added in version 5.0.

Lists available categories. See [`GET /api/categories/(int:id)/`](#get--api-categories-(int-id)-) for field definitions.

### POST /api/categories/

#### Versionadded
Added in version 5.0.

Creates a new category. See [`GET /api/categories/(int:id)/`](#get--api-categories-(int-id)-) for field definitions.

### GET /api/categories/(*int:* id)/

#### Versionadded
Added in version 5.0.

* **Parameters:**
  * **id** (*int*) – Category ID
* **Response JSON Object:**
  * **name** (*str*) – Name of category.
  * **slug** (*str*) – Slug of category.
  * **project** (*str*) – Link to a project.
  * **category** (*str*) – Link to a parent category.
  * **enforced_checks** (*array*) – Locally configured [enforced checks](https://docs.weblate.org/en/weblate-2026.10/admin/projects.md#component-enforced-checks).
  * **inherit_enforced_checks** (*boolean*) – Whether enforced checks are inherited from the parent category, project, or workspace.
  * **effective_enforced_checks** (*array*) – Enforced checks currently applied to the category (read-only).
  * **announcements_url** (*string*) – URL to announcements; see [`GET /api/categories/(int:id)/announcements/`](#get--api-categories-(int-id)-announcements-)
  * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/categories/(int:id)/reports/`](#get--api-categories-(int-id)-reports-)

### PATCH /api/categories/(*int:* id)/

#### Versionadded
Added in version 5.0: Edit partial information about category.

* **param id:**
  Category ID
* **type id:**
  int
* **>json object configuration:**
  Optional category configuration

### PUT /api/categories/(*int:* id)/

#### Versionadded
Added in version 5.0: Edit full information about category.

* **param id:**
  Category ID
* **type id:**
  int
* **>json object configuration:**
  Optional category configuration

### DELETE /api/categories/(*int:* id)/

#### Versionadded
Added in version 5.0: Delete category.

* **param id:**
  Category ID
* **type id:**
  int

### GET /api/categories/(*int:* id)/statistics/

#### Versionadded
Added in version 5.5.

Returns statistics for a category.

* **Parameters:**
  * **id** (*int*) – Category ID

#### SEE ALSO
Returned attributes are described in [Statistics](#api-statistics).

### GET /api/categories/(*int:* id)/reports/

Lists accessible reports generated directly for a category.

### POST /api/categories/(*int:* id)/reports/

Schedules a report using the category as its scope. The request and response
match [`POST /api/reports/`](#post--api-reports-); scope fields must be omitted.

### GET /api/categories/(*int:* id)/announcements/

#### Versionadded
Added in version 5.17.1: Returns announcements for a category.

* **param id:**
  Category ID
* **type id:**
  int
* **>json int id:**
  ID of the announcement
* **>json string message:**
  announcement text
* **>json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **>json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **>json bool notify:**
  send notification to subscribed users? (optional)

### POST /api/categories/(*int:* id)/announcements/

#### Versionadded
Added in version 5.17.1: Creates an announcement for a category.

* **param id:**
  Category ID
* **type id:**
  int
* **<json string message:**
  announcement text
* **<json string severity:**
  color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green)
* **<json date expiry:**
  hide after this date, ISO 8601 extended format date (optional)
* **<json bool notify:**
  send notification to subscribed users? (optional)

### DELETE /api/categories/(*int:* id)/announcements/(*int:* announcement_id)/

#### Versionadded
Added in version 5.17.1: Deletes an announcement from a category.

* **param id:**
  Category ID
* **type id:**
  int
* **param announcement_id:**
  ID of the announcement to delete
* **type announcement_id:**
  integer

<a id="hooks"></a>

## Notification hooks

Notification hooks allow external applications to notify Weblate that the VCS
repository has been updated. Weblate matches the delivery to components by
repository URL; see [Matching webhook targets](https://docs.weblate.org/en/weblate-2026.10/admin/continuous.md#hooks-target-matching).

The generic hook endpoints return diagnostics intended to help configure
repository notifications. The `match_status` object contains:

`repository_matches`
: Number of components whose repository URL matches the payload.

`branch_matches`
: Number of repository matches whose configured branch matches the payload.
  For events without a branch, every repository match is counted as a branch
  match.

`enabled_hook_matches`
: Number of branch matches whose project has hooks enabled.

A successful update response names the updated project/component slugs in
`message` and returns their absolute API URLs in `updated_components`. These
diagnostics include private projects and restricted components because matching
does not apply user access control. Components managed through an authenticated
integration are excluded from generic matching and diagnostics; currently this
applies to the GitHub (via Weblate GitHub app) VCS backend. When an
update event completes target matching but schedules no update, the response
uses HTTP status code 202 and retains `match_status` so the repository,
branch, and project hook settings can be diagnosed. Ping and ignored events
return HTTP status code 201 without matching diagnostics. These responses can
confirm that a supplied repository URL is registered, but do not grant access
to the linked API objects or expose repository content, translations, or
credentials. See [Matching webhook targets](https://docs.weblate.org/en/weblate-2026.10/admin/continuous.md#hooks-target-matching) for the security and compatibility
implications.

You can use repository endpoints for projects, components and translations to
update individual repositories; see
[`POST /api/projects/(string:project)/repository/`](#post--api-projects-(string-project)-repository-) for documentation.

### GET /hooks/update/(*string:* project)/(*string:* component)/

#### Deprecated
Deprecated since version 2.6: Please use [`POST /api/components/(string:project)/(string:component)/repository/`](#post--api-components-(string-project)-(string-component)-repository-)
instead which works properly with authentication for ACL limited projects.

#### Versionremoved
Removed in version 5.14.

### GET /hooks/update/(*string:* project)/

#### Deprecated
Deprecated since version 2.6: Please use [`POST /api/projects/(string:project)/repository/`](#post--api-projects-(string-project)-repository-)
instead which works properly with authentication for ACL limited projects.

#### Versionremoved
Removed in version 5.14.

### POST /hooks/github/

Special hook for handling GitHub notifications and automatically updating
matching components.

#### NOTE
GitHub includes direct support for notifying Weblate: enable
Weblate service hook in repository settings and set the URL to the URL of your
Weblate installation.

#### SEE ALSO
[GitHub notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-github-notifications)
: For instruction on setting up GitHub integration

[https://docs.github.com/en/get-started/customizing-your-github-workflow/exploring-integrations/about-webhooks](https://docs.github.com/en/get-started/customizing-your-github-workflow/exploring-integrations/about-webhooks)
: Generic information about GitHub Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/gitlab/

Special hook for handling GitLab notifications and automatically updating
matching components.

#### SEE ALSO
[GitLab notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-gitlab-notifications)
: For instruction on setting up GitLab integration

[https://docs.gitlab.com/user/project/integrations/webhooks/](https://docs.gitlab.com/user/project/integrations/webhooks/)
: Generic information about GitLab Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/bitbucket/

Special hook for handling Bitbucket notifications and automatically
updating matching components.

#### SEE ALSO
[Bitbucket notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-bitbucket-notifications)
: For instruction on setting up Bitbucket integration

[https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/)
: Generic information about Bitbucket Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/pagure/

Special hook for handling Pagure notifications and automatically
updating matching components.

#### SEE ALSO
[Pagure notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-pagure-notifications)
: For instruction on setting up Pagure integration

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/azure/

Special hook for handling Azure DevOps notifications and automatically
updating matching components.

#### NOTE
Please ensure that Resource details to send is set to
*All*, otherwise Weblate will not be able to match your Azure repository.

#### SEE ALSO
[Azure Repos notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-azure-repos-notifications)
: For instruction on setting up Azure integration

[https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops](https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops)
: Generic information about Azure DevOps Web Hooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/gitea/

Special hook for handling Gitea Webhook notifications and automatically
updating matching components.

#### SEE ALSO
[Gitea notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-gitea-notifications)
: For instruction on setting up Gitea integration

[https://docs.gitea.com/usage/repository/webhooks](https://docs.gitea.com/usage/repository/webhooks)
: Generic information about Gitea Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/forgejo/

Special hook for handling Forgejo Webhook notifications and automatically
updating matching components.

#### SEE ALSO
[Forgejo notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-forgejo-notifications)
: For instruction on setting up Forgejo integration

[https://forgejo.org/docs/latest/user/webhooks/](https://forgejo.org/docs/latest/user/webhooks/)
: Generic information about Forgejo Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

### POST /hooks/gitee/

Special hook for handling Gitee Webhook notifications and automatically
updating matching components.

#### SEE ALSO
[Gitee notifications](https://docs.weblate.org/en/weblate-2026.10/admin/code-hosting.md#code-hosting-gitee-notifications)
: For instruction on setting up Gitee integration

[https://help.gitee.com/webhook](https://help.gitee.com/webhook)
: Generic information about Gitee Webhooks

[`ENABLE_HOOKS`](https://docs.weblate.org/en/weblate-2026.10/admin/config.md#std-setting-ENABLE_HOOKS)
: For enabling hooks for whole Weblate

<a id="rss"></a>

## RSS feeds

Changes in translations are exported in RSS feeds.

The feeds contain only changes in projects and components the requesting user
can access.

Filtered RSS feeds are available from the changes browser. These accept the same
filters as the changes page, for example `action`, `user`, `exclude_user`,
and `period`.

### GET /changes/rss/

Retrieves RSS feed with recent changes matching changes browsing filters.

### GET /changes/rss/(*string:* project)/(*string:* component)/(*string:* language)/

Retrieves RSS feed with recent changes matching changes browsing filters in a
translation.

### GET /changes/rss/(*string:* project)/(*string:* component)/

Retrieves RSS feed with recent changes matching changes browsing filters in a
component.

### GET /changes/rss/(*string:* project)/-/(*string:* language)/

Retrieves RSS feed with recent changes matching changes browsing filters in a
project language.

### GET /changes/rss/-/-/(*string:* language)/

Retrieves RSS feed with recent changes matching changes browsing filters in a
language.

### GET /exports/rss/(*string:* project)/(*string:* component)/(*string:* language)/

Retrieves RSS feed with recent changes for a translation.

### GET /exports/rss/(*string:* project)/(*string:* component)/

Retrieves RSS feed with recent changes for a component.

### GET /exports/rss/(*string:* project)/

Retrieves RSS feed with recent changes for a project.

### GET /exports/rss/language/(*string:* language)/

Retrieves RSS feed with recent changes for a language.

### GET /exports/rss/

Retrieves RSS feed with recent changes for Weblate instance.

#### SEE ALSO
[RSS on Wikipedia](https://en.wikipedia.org/wiki/RSS)
