{"openapi":"3.1.0","info":{"title":"Emerge Tools (BYOK) API","version":"0.1.0","description":"Emerge Tools (BYOK) lets an AI assistant read your own Emerge Tools data through the Emerge Tools API with a key you supply (Emerge Tools API key). Read-only: 6 tools (list_build_history, get_build_details, get_pr_analysis, get_size_comparison_comment, get_performance_test_results, get_snapshot_comparison). The BYOK key travels with each request, is used for that one call only and is never...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-emerge.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-emerge/docs"},"termsOfService":"https://connectorbay.com/byok-emerge/terms"},"servers":[{"url":"https://byok-emerge.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-emerge/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/list_build_history":{"post":{"operationId":"list_build_history","summary":"List up to 10 uploaded builds of an app with version, build number, build type, size in bytes and upload time; page with","description":"List up to 10 uploaded builds of an app with version, build number, build type, size in bytes and upload time; page with offset. Use for \"What are the latest uploaded builds of com.example.app in Emerge\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"app_id":{"description":"Bundle id of the app, for example com.example.app.","maxLength":200,"title":"App Id","type":"string"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of builds to skip, for paging.","title":"Offset"},"build_type":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only builds of this build type, for example 'release'.","title":"Build Type"}},"required":["app_id"],"title":"list_build_historyArguments","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_build_details":{"post":{"operationId":"get_build_details","summary":"Get one build's version, tag, install and download size and its size breakdown by Swift module, framework and Obj-C pref","description":"Get one build's version, tag, install and download size and its size breakdown by Swift module, framework and Obj-C prefix. Without a build id the most recent upload of the app is used. Use for \"Which modules take the most space in the newest com.example.app build\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"app_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Bundle id or package name of the app, for example com.example.app.","title":"App Id"},"build_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Emerge id of the build; if omitted the newest upload of app_id is used.","title":"Build Id"},"platform":{"anyOf":[{"enum":["ios","android"],"type":"string"},{"type":"null"}],"default":null,"description":"Platform of the upload: ios or android.","title":"Platform"}},"title":"get_build_detailsArguments","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_pr_analysis":{"post":{"operationId":"get_pr_analysis","summary":"Get the combined result for a pull request build: app size comparison with its base, performance test results and the PR","description":"Get the combined result for a pull request build: app size comparison with its base, performance test results and the PR comment text. Returns not-ready until processing is done. Use for \"How much did my pull request change the app size in Emerge\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"sha":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Commit SHA of the new PR head.","title":"Sha"},"emerge_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Emerge id of the head build.","title":"Emerge Id"},"base_sha":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Commit SHA of the merge base (default: base given on upload).","title":"Base Sha"},"base_emerge_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Emerge id of the base build.","title":"Base Emerge Id"},"platform":{"anyOf":[{"enum":["ios","android"],"type":"string"},{"type":"null"}],"default":null,"description":"Platform of the upload: ios or android.","title":"Platform"},"app_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Bundle id or package name of the app, for example com.example.app.","title":"App Id"}},"title":"get_pr_analysisArguments","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_size_comparison_comment":{"post":{"operationId":"get_size_comparison_comment","summary":"Get the pull request comment text and size difference between two builds, with the biggest changed files. Fails while th","description":"Get the pull request comment text and size difference between two builds, with the biggest changed files. Fails while the analysis is not ready. Use for \"What does the Emerge size comment say for build abc123 against def456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"build_id":{"description":"Emerge id of the build (the buildId from list_build_history).","maxLength":200,"title":"Build Id","type":"string"},"base_build_id":{"description":"Emerge id (base SHA) of the build to compare with.","maxLength":200,"title":"Base Build Id","type":"string"}},"required":["build_id","base_build_id"],"title":"get_size_comparison_commentArguments","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_performance_test_results":{"post":{"operationId":"get_performance_test_results","summary":"Get performance test results for a test id: status, per-test timing, regression conclusion, percent change and device. U","description":"Get performance test results for a test id: status, per-test timing, regression conclusion, percent change and device. Use for \"Did the Emerge performance test t1 find a regression\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"test_id":{"description":"Performance test id.","maxLength":200,"title":"Test Id","type":"string"}},"required":["test_id"],"title":"get_performance_test_resultsArguments","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_snapshot_comparison":{"post":{"operationId":"get_snapshot_comparison","summary":"Get snapshot test results of a head build compared with a base build: counts and entries that were added, removed, chang","description":"Get snapshot test results of a head build compared with a base build: counts and entries that were added, removed, changed or unchanged; page with page and filter by tab or name. Use for \"Which UI snapshots changed in Emerge build abc123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"head_upload_id":{"description":"Emerge id of the head build.","maxLength":200,"title":"Head Upload Id","type":"string"},"base_upload_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Emerge id of the base build (default: derived from the head build's base SHA).","title":"Base Upload Id"},"tab":{"anyOf":[{"enum":["added","removed","changed","unchanged","errors"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this change type.","title":"Tab"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only snapshots whose name contains this text.","title":"Search"},"page":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Page number, starting at 0.","title":"Page"}},"required":["head_upload_id"],"title":"get_snapshot_comparisonArguments","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}}}}