{"id":15507880,"url":"https://github.com/jamesnetherton/zulip-java-client","last_synced_at":"2025-08-25T06:34:47.968Z","repository":{"id":38241585,"uuid":"298057133","full_name":"jamesnetherton/zulip-java-client","owner":"jamesnetherton","description":"Java client for the Zulip REST API","archived":false,"fork":false,"pushed_at":"2025-08-21T14:42:01.000Z","size":6167,"stargazers_count":11,"open_issues_count":9,"forks_count":11,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-21T14:49:14.805Z","etag":null,"topics":["java","zulip","zulip-api"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jamesnetherton.png","metadata":{"files":{"readme":"README.adoc","changelog":"CHANGELOG.adoc","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-09-23T18:17:20.000Z","updated_at":"2025-08-21T12:45:06.000Z","dependencies_parsed_at":"2022-09-04T22:11:46.195Z","dependency_job_id":"30c8bf68-cb7e-45af-8e22-f121a7ae2d7f","html_url":"https://github.com/jamesnetherton/zulip-java-client","commit_stats":{"total_commits":346,"total_committers":6,"mean_commits":"57.666666666666664","dds":"0.49710982658959535","last_synced_commit":"7075489c8ed8fe6a14c9a7c29ba1461067dd5642"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/jamesnetherton/zulip-java-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesnetherton%2Fzulip-java-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesnetherton%2Fzulip-java-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesnetherton%2Fzulip-java-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesnetherton%2Fzulip-java-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamesnetherton","download_url":"https://codeload.github.com/jamesnetherton/zulip-java-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesnetherton%2Fzulip-java-client/sbom","scorecard":{"id":504094,"data":{"date":"2025-08-11","repo":{"name":"github.com/jamesnetherton/zulip-java-client","commit":"8e44d6fecf4e5daec489059d3ce36efc29129987"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/11 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"13 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: .mvn/wrapper/maven-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yaml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesnetherton/zulip-java-client/build.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yaml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesnetherton/zulip-java-client/build.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yaml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesnetherton/zulip-java-client/build.yaml/main?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T22:50:47.991Z","repository_id":38241585,"created_at":"2025-08-19T22:50:47.991Z","updated_at":"2025-08-19T22:50:47.991Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272013590,"owners_count":24858479,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-25T02:00:12.092Z","response_time":1107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","zulip","zulip-api"],"created_at":"2024-10-02T09:34:00.744Z","updated_at":"2025-08-25T06:34:47.945Z","avatar_url":"https://github.com/jamesnetherton.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"image:https://github.com/jamesnetherton/zulip-java-client/workflows/Zulip%20Java%20Client%20CI/badge.svg[title=\"Zulip Java Client CI\", link=\"https://github.com/jamesnetherton/zulip-java-client/actions?query=workflow%3A%22Zulip+Java+Client+CI%22+branch%3main\"]\nimage:https://img.shields.io/:license-Apache2-blue.svg[title=\"License\", link=\"http://www.apache.org/licenses/LICENSE-2.0\"]\nimage:https://img.shields.io/maven-central/v/com.github.jamesnetherton/zulip-java-client.svg?maxAge=600[title=\"Maven Central\", link=\"http://search.maven.org/#search%7Cga%7C1%7Cg%3Acom.github.jamesnetherton%20a%3Azulip-java-client\"]\nimage:https://img.shields.io/endpoint?url=https%3A%2F%2Fjamesnetherton.github.io%2Fzulip-java-client%2Fversion.json[title=\"JavaDoc\", link=\"https://jamesnetherton.github.io/zulip-java-client/0.8.0/index.html\"]\n\n= Zulip Java Client\n\nJava client for the https://zulip.com[Zulip] chat server https://zulip.com/api/rest[REST API].\n\nRefer to the https://github.com/jamesnetherton/zulip-java-client/blob/master/COMPATIBILITY.adoc[compatibility matrix] to see which version of the Zulip server this library is compatible with.\n\n== Quick start\n\nHere's how to get started with the Zulip Java client and starting making API requests.\n\n=== Dependencies\n\nAdd the `zulip-java-client` dependency to your project.\n\n==== Maven\n\n[source,xml]\n----\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.jamesnetherton\u003c/groupId\u003e\n    \u003cartifactId\u003ezulip-java-client\u003c/artifactId\u003e\n    \u003cversion\u003e0.8.0\u003c/version\u003e\n\u003c/dependency\u003e\n----\n\n==== Gradle\n\n[source,groovy]\n----\ndependencies {\n    compile 'com.github.jamesnetherton:zulip-java-client:0.8.0'\n}\n----\n\n=== Instantiate the Zulip client\n\nCreate a `Zulip` instance by passing the user email address, https://zulip.com/api/api-keys[API key] and the base URL of the Zulip server.\n[source,java]\n----\nZulip zulip = new Zulip(\"youremail@address.com\", \"your-api-key\", \"http://yourdomain.zulip.com\")\n----\n\nNow you can start interacting with the Zulip APIs.\n\n[source,java]\n----\nlong messageId = zulip.messages()\n    .sendStreamMessage(\"Hello World!\", \"Test Stream\", \"Test Topic\")\n    .execute();\n----\n\nWhen you are finished, it's good practice to close the Zulip client.\n\n[source,java]\n----\nzulip.close();\n----\n\n== Advanced configuration\n\nThere are a few ways of customising the Zulip client configuration if you need to configure a proxy server or disable SSL certificate validation.\n\n=== Configuration builder\n[source,java]\n----\nZulip zulip = new Zulip.Builder()\n    .site(...)\n    .email(...)\n    .apiKey(...)\n    .insecure(...)\n    .build();\n----\n\n=== Zuliprc file\nThere is the option to use a `zuliprc` file as the configuration source.\n\nLoad zuliprc from the user home directory.\n[source,java]\n----\nZulipConfiguration configuration = ZulipConfiguration.fromZuliprc();\nZulip zulip = new Zulip(configuration);\n----\n\nLoad zuliprc from a specified file.\n[source,java]\n----\nZulipConfiguration configuration = ZulipConfiguration.fromZuliprc(new File(\"/path/to/zuliprc\"));\nZulip zulip = new Zulip(configuration);\n----\n\nThe zuliprc file has the following format.\n[source,properties]\n----\nkey=API key from the web interface\nemail=your email address\nsite=your Zulip server base URL\ninsecure=whether to disable SSL certificate validation (true or false)\n----\n\n=== Instantiate ZulipConfiguration\nOr instantiate the `ZulipConfiguration` directly.\n[source,java]\n----\nZulipConfiguration configuration = new ZulipConfiguration(\"http://a.site.com\", \"name@email.com\", \"an-api-key\");\nZulip zulip = new Zulip(configuration);\n----\n\n== API Request Builders\n\nEach API has a request builder object which is used to set the various parameter values expected by the API endpoint.\n\nMandatory values will always be part of the API request method signature, while optional values can be provided through the 'with' builder methods.\n\nHere's an example of this with the edit message API.\n\n[source,java]\n----\nzulip.messages().editMessage(1) \u003c1\u003e\n        .withContent(\"edited content\") \u003c2\u003e\n        .withPropagateMode(PropagateMode.CHANGE_ONE)\n        .withSendNotificationToNewThread(true)\n        .withSendNotificationToOldThread(true)\n        .withStreamId(1)\n        .withTopic(\"different topic\")\n        .execute(); \u003c3\u003e\n----\n\u003c1\u003e The zulip client object exposes methods which aggregate the REST APIs together under logical groups such as messages, streams \u0026 users. The `editMessage` API expects one mandatory parameter - the message id.\n\n\u003c2\u003e Then follows a number of optional API parameters.\n\n\u003c3\u003e The request builder is completed and sent to the Zulip server with the `execute()` method. This *MUST* be called in order for the request to be sent.\n\n== Exception handling\n\nZulip API error responses are thrown as `ZulipClientException`. The exception object contains details about the error such as the code and a descriptive message.\n\n[source,java]\n----\ntry {\n    zulip.messages.send(..);\n} catch (ZulipClientException e) {\n    System.out.println(e.getMessage());\n    System.out.println(e.getCode());\n}\n----\n\nIf you exceed the API request rate limit, then the exception cause will be set to `ZulipRateLimitExceeded`. It contains a method which enables you to get the time at which the rate limit is reset. Note that the value is a https://en.wikipedia.org/wiki/Unix_time[Unix epoch] value.\n\n[source,java]\n----\ntry {\n    zulip.messages.send(..);\n} catch (ZulipClientException e) {\n    Throwable cause = e.getCause();\n    if (cause instanceof ZulipRateLimitExceededException) {\n        ZulipRateLimitExceededException rle = (ZulipRateLimitExceededException) cause;\n        System.out.println(rle.getReteLimitReset());\n    }\n}\n----\n\n== Real time events API\n\nThere is some limited and experimental support for the Zulip https://zulip.com/api/real-time-events[real-time events API].\n\nAt present it is only possible to consume events whenever new messages are posted.\n\nTo consume messages posted to all streams.\n\n[source,java]\n----\nEventPoller eventPoller = zulip.events().captureMessageEvents(new MessageEventListener() {\n    @Override\n    public void onEvent(Message event) {\n        System.out.println(event.getContent());\n    }\n});\n\neventPoller.start();\n\n// Do useful app work\n\neventPoller.stop();\n----\n\nTo filter messages you may use one or more https://zulip.com/api/construct-narrow[narrow] expressions.\n\n[source,java]\n----\nEventPoller eventPoller = zulip.events().captureMessageEvents(new MessageEventListener() {\n    @Override\n    public void onEvent(Message event) {\n        System.out.println(event.getContent());\n    }\n}, Narrow.of(\"stream\", \"my-stream-name\"));\n\neventPoller.start();\n\n// Do useful app work\n\neventPoller.stop();\n----\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamesnetherton%2Fzulip-java-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamesnetherton%2Fzulip-java-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamesnetherton%2Fzulip-java-client/lists"}