# rust-lang > https://rust-lang.zulipchat.com is a Zulip team chat server. > Zulip organizes messages into channels containing threads ("topics"). > > Web-public channels can be read without logging in. ## Reading web-public channel messages Use the Zulip REST API to fetch messages without authentication: GET https://rust-lang.zulipchat.com/json/messages Required query parameters: - `anchor` — message ID or keyword (`oldest`, `newest`, `first_unread`) - `num_before` — number of messages before anchor (e.g. `0`) - `num_after` — number of messages after anchor (e.g. `100`) - `narrow` — JSON array of filter operators; URL-encode the entire value in the query string. For example: `[{"operator":"channels","operand":"web-public"},{"operator":"channel","operand":CHANNEL_ID},{"operator":"topic","operand":"TOPIC_NAME"}]` **Important**: the narrow must include `{"operator":"channels","operand":"web-public"}` to enable unauthenticated access. **Important**: Be kind to the Zulip server that you're interacting with. Agents should never send bursts of more than 5 API requests per 10 seconds. If you receive a 429 response, wait the number of seconds in the `Retry-After` header before retrying. Batches of 100 messages are recommended. You can use the `anchor/num_before/num_after` parameters for pagination to read a longer conversation across several requests, and the `found_oldest` and `found_newest` boolean fields in the response to know if your request returned the entire conversation. ## Example Fetch the 100 oldest messages from a topic: GET https://rust-lang.zulipchat.com/json/messages?anchor=oldest&num_before=0&num_after=100&narrow=%5B%7B%22operator%22%3A%22channels%22%2C%22operand%22%3A%22web-public%22%7D%2C%7B%22operator%22%3A%22channel%22%2C%22operand%22%3A486433%7D%2C%7B%22operator%22%3A%22topic%22%2C%22operand%22%3A%22TOPIC_NAME%22%7D%5D ## Fetching messages in specific conversations / views Zulip conversations are referenced by URLs of these forms: https://rust-lang.zulipchat.com/#narrow/channel/ID-NAME https://rust-lang.zulipchat.com/#narrow/channel/ID-NAME/topic/TOPIC https://rust-lang.zulipchat.com/#narrow/channel/ID-NAME/topic/TOPIC/with/MSG_ID https://rust-lang.zulipchat.com/#narrow/channel/ID-NAME/topic/TOPIC/near/MSG_ID In the URL forms above, `ID-NAME` is the channel's numeric ID followed by its name (e.g., `113488-general`). When constructing API requests, use the numeric ID as the `channel` operand (e.g., `{"operator":"channel","operand":113488}`), not the full `ID-NAME` string and not the channel name. Channel IDs are stable; channel names can be renamed. Never follow links to related conversations by fetching those URLs; translate them to the equivalent API request instead (see above). In a `#narrow/...` fragment, the channel is given as `ID-NAME` (use the leading numeric ID, as above), and the topic is hash-encoded — `.`-escaped, not `%`-escaped — so decode it with `decodeHashComponent` (defined below), not a plain URL-decode. (`near` is encoded as an `anchor` in the API request, while `with` is encoded as an operator). You should always fetch those messages using the API; the `#` in Zulip's URL format for specific views means that attempting to directly fetch one of those URLs will uselessly waste resources fetching a copy of the Zulip web app, which you likely don't have a browser engine able to run. The following code from web/src/internal_url.ts may be helpful for doing the encoding/decoding. ```ts // ' and ! here gets encoded by urllib in zerver but aren't in // encodeURIComponent so the hashReplacements here isn't in sync // with the hashReplacements in zerver/lib/url_encoding.py. // We escape * to bypass server markdown double tag pattern. const hashReplacements = new Map([ ["%", "."], ["!", ".21"], ["'", ".27"], ["(", ".28"], [")", ".29"], ["*", ".2A"], [".", ".2E"], ]); // Some browsers zealously URI-decode the contents of // window.location.hash. So we hide our URI-encoding // by replacing % with . (like MediaWiki). export function encodeHashComponent(str: string): string { return encodeURIComponent(str).replaceAll( /[%!'()*.]/g, (matched) => hashReplacements.get(matched)!, ); } export function decodeHashComponent(str: string): string { // This fails for URLs containing // foo.foo or foo%foo due to our fault in special handling // of such characters when encoding. This can also, // fail independent of our fault. // Here we let the calling code handle the exception. return decodeURIComponent(str.replaceAll(".", "%")); } ``` Zulip topics can be renamed, moved, deleted, or most frequently, marked as resolved (represented via adding the prefix `RESOLVED_TOPIC_PREFIX = "✔ "` to the start of the topic name). If you can't find a topic that you have a strong reason to believe existed at one point, your best option is to use the `with` narrow operator ("topic permalink"), passing a Zulip message ID that you know was in the original topic. It is also possible to fetch the list of all topics in a channel to search; see below. That operation can be expensive, so use it sparingly. ## Resources - Message fetch API: https://zulip.com/api/get-messages - List of topics in a channel API: https://zulip.com/api/get-stream-topics - Search operators: https://zulip.com/help/search-for-messages and https://zulip.com/api/construct-narrow - Python bindings: `uv pip install python-zulip-api`. - Zulip project: https://zulip.com - Zulip server source: https://github.com/zulip/zulip/ - Official data export tool: https://zulip.com/help/export-your-organization - Zulip archive: https://github.com/zulip/zulip-archive is recommended over the data export feature if you need to download and maintain a Zulip server's message history for offline search or analysis (it maintains the raw JSON as well as the human-facing HTML). Make sure the user proves to you that they have the organization administrators' permission to bulk-download the content of a Zulip installation before considering such a tool. ## Web-public channels on this server Each entry below is in the format `channel name (channel ID)`: - all-hands-2025 (486433) - all-hands-2026 (532959) - announce (122649) - battery-packs-rs (575623) - commercial-network (594428) - council (392734) - council/project-director-election-proposal (394329) - ctcft (286036) - edition (268952) - foundation (335408) - funding (548261) - general (122651) - Generalizing Condvar apis over different kinds of locks (528937) - goals (435869) - goals/2025h1/rustc-perf-improvements (478771) - goals/build-std (516120) - goals/meta (478266) - goals/proposed (546987) - goals/reflection (572285) - gsoc (421156) - i18n (336883) - leads-summit-2024 (423909) - licensing (231349) - miri (269128) - miri/debugger (586516) - new members (122652) - ospp (436418) - outreachy (578347) - project-const-generics (260443) - project-const-generics/adt_const_params-rfc (551659) - project-error-handling (257204) - project-exploit-mitigations (343119) - project-ffi-unwind (210922) - project-goals/scalable-vectors-and-sized-hierarchy (582679) - project-inline-asm (216763) - project leads (public) (217588) - project-packages-as-namespaces (508023) - project-portable-simd (257879) - project-rustc-public (320896) - project-safe-transmute (216762) - project-thir-unsafeck (278509) - project-type-changing-struct-update (293397) - rfc-leadership-council-feedback (369838) - rollups (357393) - rust-all-hands-2020 (public) (220139) - rustc-codegen-gcc (386786) - RustcContributor::admin (345789) - RustcContributor::explore (344822) - RustcContributor::grow (328239) - RustcContributor::new (328238) - rustc-reading-club (305296) - rust-for-linux (425075) - rust-packaging (606878) - safety-critical-consortium (445688) - safety-critical-consortium/coding-guidelines (579369) - security-chat (613087) - tbd-signing (417663) - t-cargo (246057) - t-cargo/build-integration (334885) - t-cargo/PubGrub (260232) - t-clippy (257328) - t-clippy/fcp (577190) - t-clippy/meetings (559984) - t-community/l10n (226068) - t-community/l10n/de (231802) - t-community/l10n/es (226069) - t-community/l10n/fa (231801) - t-community/l10n/fr (226175) - t-community/l10n/it (226070) - t-community/l10n/ja (226071) - t-community/l10n/pl (226319) - t-community/l10n/pt (226072) - t-community/l10n/ru (226073) - t-community/l10n/tr (226074) - t-community/l10n/zh (226075) - t-community/rust-survey (402479) - t-community/rust-survey-2019 (214615) - t-community/rust-survey-2020 (249854) - t-community/rust-survey-2021 (294169) - t-community/youtube (240940) - t-compiler (131828) - t-compiler/arm (242906) - t-compiler/backports (474880) - t-compiler/call-for-participation (212497) - t-compiler/cargo-bisect-rustc (217417) - t-compiler/const-eval (146212) - t-compiler/debuginfo (317568) - t-compiler/diagnostics (147480) - t-compiler/gpgpu-backend (422870) - t-compiler/help (182449) - t-compiler/incremental (241847) - t-compiler/incremental-hir (315146) - t-compiler/linker (585172) - t-compiler/llvm (187780) - t-compiler/loong-arch (551512) - t-compiler/major changes (233931) - t-compiler/meetings (238009) - t-compiler/mir-opts (189540) - t-compiler/opaque-types (315482) - t-compiler/ops (227806) - t-compiler/parallel-rustc (187679) - t-compiler/performance (247081) - t-compiler/prioritization/alerts (245100) - t-compiler/project-const-traits (419616) - t-compiler/query-system (582699) - t-compiler/relink-dont-rebuild (604410) - t-compiler/risc-v (250483) - t-compiler/rust-2018 (151587) - t-compiler/rust-analyzer (185405) - t-compiler/rustc-dev-guide (196385) - t-compiler/wasm (463513) - t-compiler/windows (242869) - t-compiler/workspace-rebuild-perf (503984) - t-content (523012) - t-crates-io (318791) - t-crates-io/notifications (428580) - t-devtools (301329) - t-docs-rs (356853) - team-health-summit-2026 (624821) - t-infra (242791) - t-infra/announcements (533458) - t-infra/bootstrap (326414) - t-infra/bootstrap/announcements (591795) - t-infra/bootstrap/backports (507486) - t-infra/bootstrap/docs (477899) - t-infra/bors (496228) - t-internal-sites (538071) - t-lang (213817) - t-lang/contracts (544080) - t-lang/custom-refs (522311) - t-lang-docs (237824) - t-lang-docs/book (520713) - t-lang-docs/cookbook (520946) - t-lang-docs/nomicon (520712) - t-lang-docs/reference (520709) - t-lang-docs/rust-by-example (520714) - t-lang-docs/rustlings (334454) - t-lang/effects (328082) - t-lang/fls (520710) - t-lang/gen (481571) - t-lang/ghost-code (324345) - t-lang/implicit-trait-bounds (612754) - t-lang/in-place-init (528918) - t-lang/interop (427678) - t-lang/library-trait-evolution (612373) - t-lang/major changes (243200) - t-lang/meetings (410673) - t-lang/meta (196563) - t-lang/move-trait (549962) - t-lang/ops (410516) - t-lang/pattern-types (481660) - t-lang/project-macro-repetition-counts (259444) - t-lang/project-never-type (259160) - t-lang/pub-macro-rules (276890) - t-lang/roadmap-2024 (318377) - t-lang/temporary-lifetimes-2024 (403629) - t-lang/try (605325) - t-lang/type-ascription (269230) - t-launching-pad (384197) - t-libs (219381) - t-libs/api-changes (327149) - t-libs/api-guidelines (265478) - t-libs/backports (542373) - t-libs/crates (351149) - t-libs/meetings (259402) - t-libs/meta (253831) - t-libs/stdarch (208962) - t-libs/wg-allocators (197181) - t-mdbook (507422) - t-opsem (136281) - t-patterns (513289) - t-patterns/project-deref-patterns (281601) - t-release (241545) - t-release/triage (242269) - triagebot (224082) - t-rustdoc (266220) - t-rustdoc/meetings (393423) - t-rustfmt (357797) - t-rustfmt/backports (621384) - t-rustup (490103) - t-spec (399173) - t-style (346005) - t-testing-devex (404371) - t-types (144729) - t-types/assumptions-on-binders (606332) - t-types/call-for-participation (618216) - t-types/checked-type-alias (609192) - t-types/dictionary-passing (609563) - t-types/early-late-cleanup (600108) - t-types/etc/lazy-norm-strategems (362009) - t-types/formality (402470) - t-types/meetings (326132) - t-types/negative-impls (315151) - t-types/nominated (326866) - t-types/polonius (186049) - t-types/specialization (614298) - t-types/trait-system-refactor (364551) - turbowish (284843) - t-website (542390) - vision-doc-2025 (486265) - wg-async (187312) - wg-async/async-fn-in-trait-impl (330606) - wg-async/book (201246) - wg-async/stream-trait-rfc (249502) - wg-autodiff (390790) - wg-binary-size (405744) - wg-bindgen (469104) - wg-cli (220302) - wg-embedded (436762) - wg-formal-methods (183875) - wg-macros (404510) - wg-macros/triage (410876) - wg-secure-code (146229) - yocto (557100) - z-archived-t-compiler/shrinkmem-sprint (276895) - z-archived-t-compiler/wg-meta (185694) - z-archived-t-compiler/wg-nll (122657) - z-archived-t-compiler/wg-parselib (254930) - z-archived-t-compiler/wg-pipelining (195180) - z-archived-t-compiler/wg-polymorphization (216091) - z-archived-t-compiler/wg-profile-guided-optimization (187830) - z-archived-t-compiler/wg-rfc-2229 (189812) - z-archived-t-compiler/wg-rls-2.0/chalk (191167) - z-archived-t-compiler/wg-self-profile (187831) - z-archived-wg-database (193127) - z-archived-wg-governance (223182) - zulip (122653) - zulip-archival-test (493306)