Webhook events
Events
These are the events you can subscribe to for each project, with payload examples.
When using our Node SDK, you can take advantage of the exported types for webhooks, for example:
import type { WebhookProjectKeyAdded } from "@lokalise/node-api";
const event: WebhookProjectKeyAdded = {
// ...
};
project.imported
project.importedFires whenever translation files were uploaded to a project.
// project.imported
{
"event": "project.imported",
"import": {
"filename": "ru.yml",
"format": "yml",
"inserted": 231,
"updated": 0,
"skipped": 0
},
"import_options": {
"replace_line_breaks": false,
"convert_placeholders": true,
"replace_modified": false,
"key_tags": [
"tag1", "tag2"
],
"tag_keys_inserted": true,
"tag_keys_updated": true,
"tag_keys_skipped": false,
"detect_icu_plurals": true,
"fill_empty_with_keys": false,
"hide_from_contributors": false,
"diff_by_file": false,
"use_tm": false,
"cleanup": false
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"language": {
"id": 597,
"iso": "ru",
"name": "Russian"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}Please note that for every translation file uploaded to Lokalise, you will receive a separate event. The number of events received will match the number of files uploaded.
You can also subscribe to the complementary webhook events project.keys.added, project.keys.modified and project.translations.updated to learn what data has been added or modified by the upload, sparing further queries to the Lokalise API. The webhook payload will include an action field with the import.file value, so you can easily identify that this action caused the data changes.
project.exported
project.exportedFires whenever translation files were downloaded from a project.
// project.exported
{
"event": "project.exported",
"export": {
"type": "json",
"filename": "files/export/138c1ffa0ad94848f01f980e7f2f2af19d1bd553/67d1a7ff9cab3a57e32ea71c4561a58d/locales.zip",
"platform": "Web"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.copied
project.copiedFires when a project is copied.
// project.copied
{
"event": "project.copied",
"action": "copy_project",
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project"
},
"new_project": {
"id": "435744046465ddb63bff26.20365706",
"name": "Onboarding copy"
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2023-05-18 10:11:40",
"created_at_timestamp": 1684397500
}project.snapshot
project.snapshotFires when a project snapshot was created.
// project.snapshot
{
"event": "project.snapshot",
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.branch.added
project.branch.addedFires when a new project branch was created.
// project.branch.added
{
"event": "project.branch.added",
"project": {
"id": "123.abc",
"name": "Sample Project"
},
"branch": {
"id": 1234,
"name": "develop"
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.branch.deleted
project.branch.deletedFires when a project branch was deleted.
// project.branch.deleted
{
"event": "project.branch.deleted",
"project": {
"id": "123.abc",
"name": "Sample Project"
},
"branch": {
"id": 1234,
"name": "develop"
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.branch.merged
project.branch.mergedFires when two project branches were merged.
// project.branch.merged
{
"event": "project.branch.merged",
"project": {
"id": "123.abc",
"name": "Sample Project"
},
"branch": {
"id": 1234,
"name": "develop"
},
"target_branch": {
"id": 5678,
"name": "sprint_20210103"
},
"affected_keys": {
"inserted_count": 4,
"updated_count": 10
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.languages.added
project.languages.addedFires when a new language was added to a project.
// project.languages.added
{
"event": "project.languages.added",
"languages": [
{
"id": 734,
"iso": "it",
"name": "Italian"
}
],
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.language.removed
project.language.removedFires when a language was removed from a project.
// project.language.removed
{
"event": "project.language.removed",
"language": {
"id": 734,
"iso": "it",
"name": "Italian"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.language.settings_changed
project.language.settings_changedFires when language settings have been changed.
// project.language.settings_changed
{
"event": "project.language.settings_changed",
"language": {
"id": 734,
"iso": "it",
"name": "Italian"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.key.added
project.key.addedFires when a new translation key has been added to a project.
// project.key.added
{
"event": "project.key.added",
"key": {
"id": 16307699,
"name": "test.title",
"base_value": "Hello, world!",
"tags": [
"home"
],
"filenames": {
"ios": null,
"android": null,
"web": "messages.%LANG_ISO%.xlf",
"other": null
},
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.keys.added
project.keys.addedFires when new translation keys have been added to a project through a bulk action. Each event will include up to a maximum of 300 keys in the payload.
// project.keys.added
{
"event": "project.keys.added",
"action": "lokalise",
"keys": [
{
"id": 28707699,
"name": "test.title",
"base_value": "Hello, world!",
"tags": [
"home_page"
],
"filenames": {
"ios": null,
"android": null,
"web": "messages.%LANG_ISO%.xlf",
"other": null
},
"previous_name": null,
"hidden": false,
"screenshots": [
"4103370"
]
},
{
"id": 28746571,
"name": "test.line1",
"base_value": "How are you?",
"tags": [
"home_page"
]
},
{
"id": 28745716,
"name": "test.line2",
"base_value": "It's good to see you.",
"tags": [
"home_page"
]
}
],
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2023-03-07 12:02:01",
"created_at_timestamp": 1678186921
}project.key.modified
project.key.modifiedFires when a translation key has been modified in a project.
// project.key.modified
{
"event": "project.key.modified",
"key": {
"id": 16307699,
"name": "test.title_modified",
"previous_name": "test.title",
"filenames": {
"ios": "ios_%LANG_ISO%.strings",
"android": null,
"web": "%LANG_ISO%.json",
"other": null
},
"tags": [
"my_tag"
],
"hidden": false,
"screenshots": [
"4103370"
]
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.keys.modified
project.keys.modifiedFires when one or more translation keys have been modified in a project though a replace action, a bulk action, or an API call. For example, this event will trigger when you assign or replace key tags for several keys at once.
// project.keys.modified
{
"event": "project.keys.modified",
"action": "bulk.add_tags",
"keys": [
{
"id": 169532683,
"name": "welcome_header",
"previous_name": "welcome_header",
"filenames": {
"ios": "ios_%LANG_ISO%.strings",
"android": null,
"web": "%LANG_ISO%.json",
"other": null
},
"tags": [
"release_1.1"
],
"hidden": false,
"screenshots": [
"4103370"
]
},
{
"id": 169685853,
"name": "feedback_button",
"previous_name": "feedback_button",
"filenames": {
"ios": "ios_%LANG_ISO%.strings",
"android": null,
"web": "%LANG_ISO%.json",
"other": null
},
"tags": [
"release_1.1"
],
"hidden": false
}
],
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.keys.deleted
project.keys.deletedFires when a translation key has been removed from a project (e.g., deleted individually, through the bulk action, or through the API).
// project.keys.deleted
{
"event": "project.keys.deleted",
"action": "lokalise",
"keys": [
{
"id": 16307699,
"name": "test.title_modified",
"base_value": "Welcome!",
"filenames": {
"ios": "ios_%LANG_ISO%.strings",
"android": null,
"web": "%LANG_ISO%.json",
"other": null
}
}
],
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.key.comment.added
project.key.comment.addedFires when a new comment has been added for a translation key.
// project.key.comment.added
{
"event": "project.key.comment.added",
"comment": {
"value": "My comment to test.title key"
},
"key": {
"id": 16307701,
"name": "test.title",
"filenames": {
"android": "filename1",
"ios": "filename2",
"other": "filename3",
"web": "filename4"
}
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.translation.updated
project.translation.updatedFires when a translation was modified in a project.
// project.translation.updated
{
"event": "project.translation.updated",
"translation": {
"id": 84835169,
"value": "Hello, %s!",
"previous_value": "Hi!",
"segment": 1
},
"language": {
"id": 640,
"iso": "en",
"name": "English"
},
"key": {
"id": 16307701,
"name": "test.title",
"filenames": {
"ios": null,
"android": null,
"web": "%LANG_ISO%.yml",
"other": null
}
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.translations.updated
project.translations.updatedFires when translations were modified in a project through a bulk action (e.g, translation memory was applied). Each event will include up to a maximum of 300 translations in the payload.
// project.translations.updated
{
"event": "project.translations.updated",
"action": "bulk.tm",
"translations": [
{
"id": 84825168,
"value": "Bonjour!",
"previous_value": "",
"language": {
"id": 673,
"iso": "fr",
"name": "French"
},
"key": {
"id": 277,
"name": "test.welcome"
}
},
{
"id": 93825168,
"value": "¡Hola!",
"previous_value": "",
"language": {
"id": 1056,
"iso": "es",
"name": "Spanish"
},
"key": {
"id": 277,
"name": "test.welcome"
}
}
],
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2023-03-27 13:06:09",
"created_at_timestamp": 1679915169
}project.translation.proofread
project.translation.proofreadFires when a translation has been marked or unmarked as reviewed in a project.
// project.translation.proofread
{
"event": "project.translation.proofread",
"translation": {
"id": 84835169,
"value": "Hello, %s!",
"is_proofread": true,
"segment": 1
},
"language": {
"id": 640,
"iso": "en",
"name": "English"
},
"key": {
"id": 16307701,
"name": "test.title",
"filenames": {
"ios": null,
"android": null,
"web": "%LANG_ISO%.yml",
"other": null
}
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.translations.proofread
project.translations.proofreadFires when when multiple translations have been marked or unmarked as reviewed in a project (for example, via an API multicall).
// project.translations.proofread
{
"event": "project.translations.proofread",
"action": "api",
"translations": [
{
"id": 1234,
"value": "Sample text",
"is_proofread": false,
"language": {
"id": 10153,
"iso": "lv",
"name": "Latvian"
},
"key": {
"id": 6789,
"name": "key_1",
"filenames": {
"ios": null,
"android": null,
"web": "%LANG_ISO%.json",
"other": null
}
}
},
{
"id": 4321,
"value": "Sample text 2",
"is_proofread": false,
"language": {
"id": 10153,
"iso": "lv",
"name": "Latvian"
},
"key": {
"id": 9876,
"name": "key_2",
"filenames": {
"ios": null,
"android": null,
"web": "%LANG_ISO%.json",
"other": null
}
}
}
],
"project": {
"id": "123456.abcd",
"name": "Sample project",
"branch": "master"
},
"user": {
"full_name": "User Name",
"email": "[email protected]"
},
"created_at": "2024-04-24 12:00:26",
"created_at_timestamp": 1713952826
}project.contributor.added
project.contributor.addedFires when a new contributor was added to a project by invitation of an admin.
// project.contributor.added
{
"event": "project.contributor.added",
"contributor": {
"email": "[email protected]"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.contributor.added_public
project.contributor.added_publicFires when a new contributor added themselves to a project through the public signup link.
The payload is identical to the project.contributor.added (with the only exception being the event field that has the project.contributor.added_public value.
project.contributor.deleted
project.contributor.deletedFires when a contributor was removed from a project.
// project.contributor.deleted
{
"event": "project.contributor.deleted",
"contributor": {
"email": "[email protected]"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.task.created
project.task.createdFires when a new translation or review task was created in a project.
// project.task.created
{
"event": "project.task.created",
"task": {
"id": 5022,
"type": "translation", // supported types are "translation" and "review"
"title": "Headings translation",
"due_date": "2019-08-01 00:00:00",
"description": "Task description"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.task.queued
project.task.queuedFires when a newly created task has been queued. Please note that a task will be queued when the following conditions are met:
- This is a review task
- It has a parent task or a parent translation order
- Its parent has at least one language that is not yet marked as completed (or a translation order is not marked as completed yet)
The payload is identical to the project.task.created.
project.task.closed
project.task.closedFires when a task has been marked as closed. Tasks can be closed manually by project admins or automatically upon completion.
// project.task.closed
{
"event": "project.task.closed",
"task": {
"id": 5022,
"type": "translation", // supported types are "translation" and "review"
"title": "Headings translation",
"due_date": "2019-08-01 00:00:00",
"description": "Task description"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.task.deleted
project.task.deletedFires when a task has been deleted.
// project.task.deleted
{
"event": "project.task.deleted",
"task": {
"id": 5022,
"type": "translation",
"title": "Headings translation",
"due_date": "2019-08-01 00:00:00",
"description": "Task description"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.task.language.closed
project.task.language.closedFires when a language added to a task has been closed. A language can be closed manually or automatically upon completion.
// project.task.language.closed
{
"event": "project.task.language.closed",
"language": {
"id": 640,
"iso": "en",
"name": "English"
},
"task": {
"id": 5022,
"type": "translation", // supported types are "translation" and "review"
"title": "Headings translation",
"due_date": "2019-08-01 00:00:00",
"description": "Task description"
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}team.order.created
team.order.createdFires when a new translation order has been created.
// team.order.created
{
"event": "team.order.created",
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "develop"
},
"order": {
"id": "20101010D85",
"provider": "lokalise",
"currency": "USD",
"total": 10.00,
"languages": [
{
"id": "1055",
"iso": "us",
"name": "English (United States)"
},
{
"id": "597",
"iso": "ru",
"name": "Russian"
}
]
},
"user": {
"email": "[email protected]",
"full_name": "John Doe"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}team.order.deleted
team.order.deletedFires when a translation order has been deleted.
// team.order.deleted
{
"event": "team.order.deleted",
"project": {
"id": "123.abc",
"name": "Sample project",
"branch": "master"
},
"user": {
"full_name": "John Doe",
"email": "[email protected]"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}team.order.completed
team.order.completedFires when a translation order has been marked as completed.
// team.order.completed
{
"event": "team.order.completed",
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"order": {
"id": "20101010D85",
"provider": "lokalise"
},
"created_at": "2019-07-29 12:18:31",
"created_at_timestamp": 1564395511
}project.task.initial_tm_leverage.calculated
project.task.initial_tm_leverage.calculatedFires when an initial translation memory leverage has been calculated for a task. This calculation is performed automatically.
// project.task.initial_tm_leverage.calculated
{
"event": "project.task.initial_tm_leverage.calculated",
"task": {
"id": 12345,
"title": "New task",
"description": "Please translate as soon as possible",
"initial_tm_leverage": {
"600": {
"0": 154,
"50": 5,
"75": 4,
"85": 11,
"95": 0,
"100%": 6
},
"1056": {
"0": 158,
"50": 17,
"75": 0,
"85": 0,
"95": 2,
"100%": 3
}
}
},
"project": {
"id": "138c1ffa0ad94848f01f980e7f2f2af19d1bd553",
"name": "TheApp Project",
"branch": "master"
},
"created_at": "2021-03-30 16:01:11",
"created_at_timestamp": 1617112871
}Special fields and events
Replace and bulk actions
Replace and bulk actions may involve many keys or translations at once. The webhook event payload will contain data from 1 and up to 300 objects. If more than 300 objects were involved in the action, you will receive multiple events to capture all the data about the added, modified or removed objects.
Moving and copying keys
When you move or copy keys between projects using the bulk actions the following webhook events will be generated:
project.keys.addedevent will be generated on the destination project if it has a webhook handler subscribed to the key added event.- When keys are moved, a
project.keys.deletedevent will be generated on the source project if it has a webhook handler subscribed to the key removed event.
action field
action fieldThe action field allows to distinguish what specific user or automated action resulted in the webhook event. Here are the possible values for this field:
api
automation.ai
automation.clear
automation.copy_source
automation.mt
automation.tm
automation.pseudolocalize
bulk.add_tags
bulk.clear
bulk.copy
bulk.copy_source
bulk.delete
bulk.fill
bulk.linked_screenshots
bulk.move
bulk.pseudolocalize
bulk.remove_tags
bulk.tm
bulk.unlinked_screenshots
import.file
replace.tags
replace.translations
linked_screenshots
unlinked_screenshots
Updated 3 months ago