Crowdin Query Language (CroQL)

Crowdin Query Language (CroQL) is a tool for Crowdin Editor and Crowdin Enterprise Editor and Crowdin and Crowdin Enterprise API that allows you to retrieve needed localization resources based on specific conditions. Using CroQL, you can filter source strings and their translations for a specific target language, as well as TM segments.

You can use CroQL with the following API methods:

Operators

Main CroQL operators are listed below. Use and combine them to set specific conditions for retrieving the needed content from Crowdin. To form your CroQL query, you can use the elements from the tables below.

Arithmetic Operators

The arithmetic operators are used to perform mathematic operations with any numeric data types.

Name Symbol Example
Addition + 1 + 9
Subtraction - 11 - 1
Division / 20 / 2
Multiplication * 2 * 5
Negation - -10

Comparison Operators

The comparison operators are used to compare values and return true or false.

Name Symbol Aliases Example
Between {{expression}} between {{expression}} and {{expression}} 5 between 1 and 10
Equal = 10 = 10
Not equal != 1 != 10; 1 ≠ 10
Greater > 10 > 1
Greater or equal >= 10 >= 1; 10 ≥ 1
Less < 1 < 10
Less or equal <= 1 <= 10; 1 ≤ 10;
Contains {{string}} contains {{string}} "Hello World" contains "Hello";
"Hello World" contains text;
text contains "Hello World";
context contains text;

Logical Operators

The logical operators are used to combine multiple boolean expressions or values and provide a single boolean output.

Name Symbol Example
And and 1 < 10 and 10 > 1
Or or 1 < 10 or 10 > 1
Xor xor 1 < 10 xor 10 > 1
Not not not 1 < 10

Filtration Operators

The filtration operators are used to filter the objects based on the specified condition.

Name Symbol Example
Filter {{collection}} where {{predicate}} translations where (count of votes > 0)
Match {{object}} with {{predicate}} user with (login = "crowdin")

Conditional (Ternary) Operator

The ternary operator is used to check a condition specified in the first value, and if it’s true it returns the second value, but if it’s false it returns the third value.

Name Symbol Example
Ternary If {{condition}} then {{expression}} else {{expression}} If 1 < 10 then "less" else "greater"

Fetch Operators

The fetch operators are used for retrieving data from the objects.

Name Symbol Example
Mention @user:{{string}}; @language:{{string}} @user:"crowdin"; @language:"en"
Member {{member}} of {{object}} count of translations
Identifier {{identifier}} text; identifier

Scalar Operators

The scalar operators are used to declare values for further processing.

Name Symbol Example
Integer {{integer}} 10
Float {{float}} 10.01
String {{string}} “crowdin"
Datetime {{datetime}} 'today'; '2021-03-16 00:00:00'

Group Operator

The group operator is used to determine the execution order of operators.

Name Symbol Example
Group ( ) 1 < 10 and (20 > 10 or 10 > 5)

Query Examples

To retrieve a list of strings that have no Ukrainian translations with approvals or votes, your query might look like this:

count of translations where ( language = @language:"uk" and ( count of approvals > 0 or count of votes > 0 ) ) = 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have only one translation, your query might look like this:

count of translations = 1

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have translations from only one specific user, your query might look like this:

count of translations > 0 and count of translations = count of translations where (user = @user:"crowdin")

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have at least one translation not from specific users, your query might look like this:

count of translations where (user != @user:"crowdin") > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have all translations not from specific users, your query might look like this:

count of translations > 0 and count of translations = count of translations where (user != @user:"crowdin")

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve translations made by the user with a crowdin username or ones with ≥ 100 upvotes, your query might look like this:

user = @user:"crowdin" or count of votes where ( is up ) >= 100

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/languages/uk/translations?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/languages/uk/translations?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings filtered by identifier and numeric id of a file in your Crowdin project, your query might look like this:

identifier = "key" and id of file = 777

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have unresolved issues filtered by numeric id of a file in your Crowdin project, your query might look like this:

id of file = 777 and count of comments where (has unresolved issue) > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of hidden strings that are not duplicates and have one or more translations, your query might look like this:

is hidden and not is duplicate and count of translations > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have one or more approvals, your query might look like this:

count of languages summary where (approvalsCount >= 1) > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that have comments made by the user with a crowdin username, your query might look like this:

count of comments where (user = @user:"crowdin") > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve a list of strings that contain “ABC” in the source text but don’t contain “ABC” in their translations, your query might look like this:

text contains "ABC" and (count of translations where (text contains "ABC") = 0)

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/projects/{projectId}/strings?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve translation memory segments containing at least one record used one or more times, your query might look like this:

count of records where (usageCount > 0) > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/tms/{tmId}/segments?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/tms/{tmId}/segments?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

To retrieve translation memory segments containing at least one record created by the user with a crowdin username, your query might look like this:

count of records where (createdBy = @user:"crowdin") > 0

Use your query in the following endpoint in Crowdin:

GET https://api.crowdin.com/api/v2/tms/{tmId}/segments?croql={croql}

In Crowdin Enterprise:

GET https://{organization_domain}.api.crowdin.com/api/v2/tms/{tmId}/segments?croql={croql}
Note: Before executing the request, ensure to URL encode your CroQL expression.
{projectId}

Type: integer

Description: Numeric identifier of your Crowdin project.

{croql}

Type: string

Description: CroQL expression.

CroQL Query Examples based on the Editor Advanced Filter Options

Note: To use the following queries in Crowdin APIv2, ensure to specify the needed target language (e.g., count of languages summary where (language = @language:"uk" and is translated) > 0) in your CroQL query.
  • Strings added:
    added between '2023-12-06 13:44:14' and '2023-12-07 13:44:14'
    
  • Strings updated:
    updated between '2023-12-06 13:44:14' and '2023-12-07 13:44:14'
    
  • Translations updated:
    count of languages summary where ( translation updated between '2023-12-06 13:44:14' and '2023-12-07 13:44:14') > 0
    
  • Verbal Expressions: Not available
  • Verbal Expression Scope: Not available
  • Translations:
    • Untranslated:
        count of languages summary = 0
      
    • Partially translated (plurals):
        count of languages summary where (is partially translated) > 0
      
    • Translated:
        count of languages summary where (is translated) > 0
      
    • Same as source string:
        count of languages summary where (has translation as source) > 0
      
    • Modified source String:
        count of languages summary where (is source changed after translation) > 0
      
  • Duplicates:
    • Master strings:
        not is duplicate
      
    • Duplicates only:
        is duplicate
      
    • Duplicates with shared translations:
        is duplicate and count of languages summary where (has shared translation) > 0
      
    • Duplicates with own translations:
        is duplicate and count of languages summary where (not has shared translation and is translated) > 0
      
  • Approvals:
    • Translated, not approved:
        count of languages summary where (is translated and not is approved) > 0
      
    • Partially approved (plurals):
        count of languages summary where (is partially approved) > 0
      
    • Approved:
        count of languages summary where (is approved) > 0
      
    • Has translations after approval:
        count of languages summary where (has translation after approval) > 0
      
  • TM and MT:
    • Translated by MT:
        count of languages summary where (is translated by mt) > 0
      
    • Translated by TM:
        count of languages summary where (is translated by tm) > 0
      
    • Translated by TM or MT:
        count of languages summary where (is auto translated) > 0
      
  • Pre translation:
    • Used: Not available
    • Not used: Not available
  • Comments:
    count of comments > 0
    
  • Screenshots:
    count of screenshots > 0
    
  • QA Issues:
    count of languages summary where (has qa issues) > 0
    
  • String Type:
    type is plain or type is icu
    
  • Votes:
    count of languages summary where (rating > 0) > 0
    
  • Translated by:
    count of translations where (user = @user:"crowdin") > 0
    
  • Not Translated by:
    count of translations where (user != @user:"crowdin") > 0
    
  • Approved by:
    count of translations where (count of approvals where (user = @user:"crowdin") > 0) > 0
    
  • Not Approved by:
    count of translations where (count of approvals where (user != @user:"crowdin") > 0) > 0
    
  • Sort by: Not available

Context

CroQL can be used in the following contexts: source string context, translation context, and translation memory (TM) segment context. Use the following examples as a basis for building your CroQL queries.

Source String Context

{
  "type is plain": true,
  "type is plural": false,
  "type is icu": false,
  "type is asset": false,
  "text": "Quick Start",
  "identifier": "quick_start",
  "context": "quick_start",
  "max length": 0,
  "is visible": true,
  "is hidden": false,
  "is duplicate": false,
  "isPassedWorkflow": true,
  "file": {
    "id": 32,
    "name": "sample.csv",
    "title": "Sample",
    "type": "csv",
    "context": "Some useful context information"
  },
  "comments": [
    {
      "has issue": false,
      "has unresolved issue": false,
      "user": 1
    }
  ],
  "screenshots": [],
  "translations": [
    {
      "text": "Швидкий старт",
      "plural form": "none",
      "is pre translated": true,
      "provider": "tm",
      "language": "uk",
      "user": 1,
      "votes": [
        {
          "is up": true,
          "is down": false,
          "user": 2,
          "added": "2021-04-09 13:44:14"
        }
      ],
      "approvals": [
        {
          "user": 2,
          "added": "2021-04-09 13:44:14"
        }
      ],
      "updated": "2021-04-09 10:23:17"
    }
  ],
  "languages summary": [
    {
      "language": "en",
      "is translated": false,
      "is partially translated": false,
      "is approved": false,
      "is partially approved": false,
      "translation updated": false,
      "is auto translated": false,
      "is translated by tm": false,
      "is translated by mt": false,
      "is source changed after translation": false,
      "has translation as source": false,
      "has translation after approval": false,
      "has shared translation": false,
      "has qa issues": false,
      "has empty translation qa issues": false,
      "has translation length qa issues": false,
      "has tags mismatch qa issues": false,
      "has spaces mismatch qa issues": false,
      "has variables mismatch qa issues": false,
      "has punctuation mismatch qa issues": false,
      "has character case mismatch qa issues": false,
      "has special characters mismatch qa issues": false,
      "has incorrect translation qa issues": false,
      "has spelling qa issues": false,
      "has icu syntax qa issues": false,
      "has terms qa issues": false,
      "has duplicate translation qa issues": false,
      "has ftl syntax qa issues": false,
      "has android syntax qa issues": false,
      "has custom qa issues": false,
      "rating": 1,
      "approvalsCount": 1
    }
  ],
  "labels": [
    {
      "id": 1,
      "title": "label title",
      "is system": false
    }
  ],
  "added": "2021-04-08 12:33:27",
  "updated": "2021-04-08 12:33:27"
}
type is plain

Type: boolean

Description: The source string with plain text.

type is plural

Type: boolean

Description: The source string with plural forms.

type is icu

Type: boolean

Description: The source string with ICU.

type is asset

Type: boolean

Description: The source string is an asset.

text

Type: string

Description: The source string text.

identifier

Type: string

Description: The source string identifier (key).

context

Type: string

Description: The source string context.

max length

Type: integer

Description: The source string max.length.

is visible

Type: boolean

Description: The source string is visible.

is hidden

Type: boolean

Description: The source string is hidden.

is duplicate

Type: boolean

Description: The source string is duplicate.

isPassedWorkflow

Type: boolean

Description: Crowdin Enterprise only. The source string passed through a project workflow.

file

Type: object

Description: The source string file.

comments

Type: array

Description: The source string comments.

has issue

Type: boolean

Description: The source string has an issue.

has unresolved issue

Type: boolean

Description: The source string has an unresolved issue.

user

Type: integer

Description: Numeric identifier of the user who added a comment.

screenshots

Type: array

Description: The source string screenshots.

translations

Type: array

Description: Translations of the source string.

text

Type: string

Description: Translation text.

plural form

Type: string

Description: Translation plural form.

is pre translated

Type: boolean

Description: Translation added via pre-translation.

provider

Type: string

Allowed values: tm, global_tm, google, google_automl, microsoft, crowdin, deepl, modernmt, amazon, watson, custom_mt

Description: Translation provided via translation memory or machine translation engine.

language

Type: string

Description: Language identifier specified as a string. Use the language codes, for example, "uk" for Ukrainian. To specify in queries, use the format: @language:"uk".

user

Type: integer

Description: Numeric identifier of the user who added a translation.

votes

Type: array

Description: Array of the votes added to the translation.

is up

Type: boolean

Description: Upvote.

is down

Type: boolean

Description: Downvote.

user

Type: integer

Description: Numeric identifier of the user who added a vote for translation.

added

Type: datetime

Description: Date when a vote for translation was added.

approvals

Type: array

Description: Array of the added translation approvals.

user

Type: integer

Description: Numeric identifier of the user who approved a translation.

added

Type: datetime

Description: Date when a translation approval was added.

updated

Type: datetime

Description: Date when a translation was updated.

languages summary

Type: array

Description: The source string top translations (the translations with the highest priority).

language

Type: string

Description: Language identifier specified as a string. Use the language codes, for example, "uk" for Ukrainian. To specify in queries, use the format: @language:"uk".

is translated

Type: boolean

Description: The source string is translated.

is partially translated

Type: boolean

Description: The source string is partially translated.

is approved

Type: boolean

Description: The source string is approved.

is partially approved

Type: boolean

Description: The source string is partially approved.

translation updated

Type: boolean

Description: The source string translation is updated.

is auto translated

Type: boolean

Description: The source string is translated by TM or MT.

is translated by tm

Type: boolean

Description: The source string is translated by TM.

is translated by mt

Type: boolean

Description: The source string is translated by MT.

is source changed after translation

Type: boolean

Description: The source string changed after translation.

has translation as source

Type: boolean

Description: The source string has translation equal to source text.

has translation after approval

Type: boolean

Description: The source string has translation after approval.

has shared translation

Type: boolean

Description: The source string duplicate has shared translations from a master string.

has qa issues

Type: boolean

Description: The source string has QA issues.

has empty translation qa issues

Type: boolean

Description: The source string has empty translation QA issues.

has translation length qa issues

Type: boolean

Description: The source string has translation length QA issues.

has tags mismatch qa issues

Type: boolean

Description: The source string has tags mismatch QA issues.

has spaces mismatch qa issues

Type: boolean

Description: The source string has spaces mismatch QA issues.

has variables mismatch qa issues

Type: boolean

Description: The source string has variables mismatch QA issues.

has punctuation mismatch qa issues

Type: boolean

Description: The source string has punctuation mismatch QA issues.

has character case mismatch qa issues

Type: boolean

Description: The source string has character case mismatch QA issues.

has special characters mismatch qa issues

Type: boolean

Description: The source string has special characters mismatch QA issues.

has incorrect translation qa issues

Type: boolean

Description: The source string has incorrect translation QA issues.

has spelling qa issues

Type: boolean

Description: The source string has spelling QA issues.

has icu syntax qa issues

Type: boolean

Description: The source string has ICU syntax QA issues.

has terms qa issues

Type: boolean

Description: The source string has terms QA issues.

has duplicate translation qa issues

Type: boolean

Description: The source string has duplicate translation QA issues.

has ftl syntax qa issues

Type: boolean

Description: The source string has FTL syntax QA issues.

has android syntax qa issues

Type: boolean

Description: The source string has Android syntax QA issues.

has custom qa issues

Type: boolean

Description: The source string has Custom QA issues.

rating

Type: integer

Description: The source string translation rating.

approvalsCount

Type: integer

Description: The number of translation approvals.

labels

Type: array

Description: The source string labels.

id

Type: integer

Description: Numeric identifier of the label.

title

Type: string

Description: Label title.

is system

Type: boolean

Description: System label (label with source file name that is automatically added to strings in string-based projects).

added

Type: datetime

Description: Date when a source string was added.

updated

Type: datetime

Description: Date when a source string was updated.

Translation Context

{
  "text": "Швидкий старт",
  "plural form": "none",
  "is pre translated": true,
  "provider": "tm",
  "user": 1,
  "votes": [
    {
      "is up": true,
      "is down": false,
      "user": 2,
      "added": "2021-04-09 13:44:14"
    }
  ],
  "approvals": [
    {
      "user": 2,
      "added": "2021-04-09 13:44:14"
    }
  ],
  "updated": "2021-04-09 10:23:17"
}
text

Type: boolean

Description: Translation text.

plural form

Type: string

Description: Translation plural form.

is pre translated

Type: boolean

Description: Translation added via pre-translation.

provider

Type: string

Allowed values: tm, global_tm, google, google_automl, microsoft, crowdin, deepl, modernmt, amazon, watson, custom_mt

Description: Translation provided via translation memory or machine translation engine.

user

Type: integer

Description: Numeric identifier of the user who added a translation.

votes

Type: array

Description: Array of the votes added to the translation.

is up

Type: boolean

Description: Upvote.

is down

Type: boolean

Description: Downvote.

user

Type: integer

Description: Numeric identifier of the user who added a vote for translation.

added

Type: datetime

Description: Date when a vote for translation was added.

approvals

Type: array

Description: Array of the added translation approvals.

user

Type: integer

Description: Numeric identifier of the user who approved a translation.

added

Type: datetime

Description: Date when a translation approval was added.

updated

Type: datetime

Description: Date when a translation was updated.

Translation Memory (TM) Segment Context

{
  "records": [
    {
      "id": 1,
      "text": "Перекладений текст",
      "usageCount": 77,
      "createdBy": 1,
      "updatedBy": 1,
      "createdAt": "2027-09-16T13:48:04+00:00",
      "updatedAt": "2027-09-16T13:48:04+00:00"
    }
  ]
}
records

Type: array

Description: Array of translation memory segment records.

id

Type: integer

Description: Numeric identifier of a record.

text

Type: string

Description: Translation text of a record.

usageCount

Type: integer

Description: The number of times a translation memory record has been used.

createdBy

Type: integer

Description: Numeric identifier of the user who created a translation memory record.

updatedBy

Type: integer

Description: Numeric identifier of the user who updated a translation memory record.

createdAt

Type: datetime

Description: Date when a translation memory record was created.

updatedAt

Type: datetime

Description: Date when a translation memory record was updated.

Was this article helpful?