{"openapi":"3.1.0","info":{"title":"Phrase Strings (BYOK) API","version":"0.1.0","description":"Phrase Strings (BYOK) lets an AI assistant read your own Phrase Strings data through the Phrase Strings API with a key you supply (Phrase Strings access token (EU data center)). Read-only: 11 tools (get_current_user, list_accounts, list_projects, get_project_report, list_locale_reports, list_locales, list_keys, list_translations, list_jobs, list_tags, list_uploads). The BYOK key travels with each...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-phrase.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-phrase/docs"},"termsOfService":"https://connectorbay.com/byok-phrase/terms"},"servers":[{"url":"https://byok-phrase.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-phrase/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_current_user":{"post":{"operationId":"get_current_user","summary":"Show the Phrase user the token belongs to: username, name, position and language (email is not returned). Use for \"Which","description":"Show the Phrase user the token belongs to: username, name, position and language (email is not returned). Use for \"Which Phrase user is my token for\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_current_userArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_accounts":{"post":{"operationId":"list_accounts","summary":"List the Phrase accounts (organizations) the token can see. Use for \"Which Phrase accounts do I belong to\".","description":"List the Phrase accounts (organizations) the token can see. Use for \"Which Phrase accounts do I belong to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_accountsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_projects":{"post":{"operationId":"list_projects","summary":"List projects with main file format, owning account and dates; can be limited to an account or searched by name. Use for","description":"List projects with main file format, owning account and dates; can be limited to an account or searched by name. Use for \"Which Phrase Strings projects do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only projects of this account id.","title":"Account Id"},"q":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Search text in the form name:<text>, for example name:android.","title":"Q"},"sort_by":{"anyOf":[{"enum":["name_asc","name_desc","updated_at_asc","updated_at_desc","space_asc","space_desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order: name_asc, name_desc, updated_at_asc, updated_at_desc, space_asc or space_desc.","title":"Sort By"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_projectsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_project_report":{"post":{"operationId":"get_project_report","summary":"Get a project's totals: locales, keys, translations, untranslated keys, unverified and reviewed translations, managed wo","description":"Get a project's totals: locales, keys, translations, untranslated keys, unverified and reviewed translations, managed words. Use for \"How many keys are untranslated in this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"}},"required":["project_id"],"title":"get_project_reportArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_locale_reports":{"post":{"operationId":"list_locale_reports","summary":"Per-locale completion statistics of a project: translated, unverified and reviewed percentages and word counts. Use for ","description":"Per-locale completion statistics of a project: translated, unverified and reviewed percentages and word counts. Use for \"How complete is each language in this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"locale_codes":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated locale codes to keep, for example 'de,fr'.","title":"Locale Codes"},"tag":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only keys with this tag.","title":"Tag"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_locale_reportsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_locales":{"post":{"operationId":"list_locales","summary":"List the locales of a project with code, default and right-to-left flags and source locale. Use for \"Which languages doe","description":"List the locales of a project with code, default and right-to-left flags and source locale. Use for \"Which languages does this Phrase project have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_localesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_keys":{"post":{"operationId":"list_keys","summary":"List translation keys of a project with tags, description and plural flag; the q parameter accepts Phrase search syntax ","description":"List translation keys of a project with tags, description and plural flag; the q parameter accepts Phrase search syntax such as tags:ios or untranslated:true. Use for \"Find keys in this Phrase project that contain 'checkout'\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"q":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Key search text; supports qualifiers such as tags:ios, translated:true or untranslated:true (with locale_id).","title":"Q"},"locale_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Locale id or code used to judge translated or untranslated state in q.","title":"Locale Id"},"sort":{"anyOf":[{"enum":["name","created_at","updated_at"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, created_at or updated_at.","title":"Sort"},"order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Direction: asc or desc.","title":"Order"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_keysArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_translations":{"post":{"operationId":"list_translations","summary":"List translations of a project (text, locale, key and state), optionally for one locale or key or matching a search text","description":"List translations of a project (text, locale, key and state), optionally for one locale or key or matching a search text. Use for \"Show the German translations of this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"locale_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only translations of this locale (id or code).","title":"Locale Id"},"key_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only translations of this key id.","title":"Key Id"},"q":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search translations by content, wildcards allowed.","title":"Q"},"sort":{"anyOf":[{"enum":["key_name","created_at","updated_at"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by key_name, created_at or updated_at.","title":"Sort"},"order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Direction: asc or desc.","title":"Order"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_translationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_jobs":{"post":{"operationId":"list_jobs","summary":"List translation jobs of a project with state, due date and briefing, optionally by state. Use for \"Which translation jo","description":"List translation jobs of a project with state, due date and briefing, optionally by state. Use for \"Which translation jobs are in progress in this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"state":{"anyOf":[{"enum":["draft","in_progress","completed"],"type":"string"},{"type":"null"}],"default":null,"description":"Job state: draft, in_progress or completed.","title":"State"},"updated_since":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only jobs updated after this date, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_jobsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tags":{"post":{"operationId":"list_tags","summary":"List the tags used in a project with the number of keys each has. Use for \"Which tags are used in this Phrase project\".","description":"List the tags used in a project with the number of keys each has. Use for \"Which tags are used in this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"q":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Filter tags by name.","title":"Q"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_tagsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_uploads":{"post":{"operationId":"list_uploads","summary":"List recent file uploads of a project with file name, format, state and how many keys and translations were created or u","description":"List recent file uploads of a project with file name, format, state and how many keys and translations were created or updated. Use for \"What were the latest file uploads to this Phrase project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Phrase Strings project id (from list_projects), for example '2d2b5f6d3fc1e1a1b0c9d8e7f6a5b4c3'.","maxLength":200,"title":"Project Id","type":"string"},"branch":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Branch name to read instead of the main branch.","title":"Branch"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["project_id"],"title":"list_uploadsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}