Slack API Tester

A free online Slack API tester for calling Slack Web API methods straight from your browser. Paste a bot or user token, pick a method such as auth.test, and read the raw JSON that comes back — including the ok: false errors that Slack hides behind an HTTP 200.

Slack Web API methods accept arguments as query parameters on GET, or as a JSON body on POST.

For POST calls that send a JSON body, Slack expects Content-Type: application/json; charset=utf-8.

Sent as Authorization: Bearer <token>.

Base64-encoded and sent as Authorization: Basic.

Choose Bearer token and paste your xoxb- or xoxp- token. It is used only to sign this request — never logged or stored.

Body is ignored for GET and HEAD requests.

No request sent yet.
Send a request and the response will appear here.

Try it: or press Ctrl+Enter to send.

Before you paste a live Slack token

This matters more than anything else on the page, so it is not buried at the bottom. Your token is sent through api-tester.com's server. A browser cannot read a response from slack.com directly — the same-origin policy forbids it — so the request, including the Authorization header carrying your token, is forwarded through our proxy, which is not bound by CORS. That is the only way a browser-based tester can reach the Slack API at all, and it means the token transits infrastructure that is not yours and not Slack's.

We do not log or store tokens. But "we don't log it" is a promise, not a guarantee you can verify, so treat it the way you would treat any third-party tool and reduce your exposure instead of relying on trust alone:

  • Use a scoped test token. Install a development Slack app into a test workspace with only the scopes the call needs, rather than reaching for a token that can post to every channel.
  • Prefer a bot token over a user token. A xoxb- bot token acts as the app; a xoxp- user token acts as you, with your access.
  • Rotate anything you are unsure about. If you paste a production token here or anywhere else and then have second thoughts, revoke it and issue a new one. Rotation is cheap; a leaked workspace token is not.

Slack changes its API over time — methods, scopes and error strings are all subject to change. This page is an independent guide, not documentation. Check the official Slack Web API documentation for authoritative details.

How the Slack Web API is shaped

The Slack Web API does not look like a typical REST API, and that trips people up on their first call. Instead of nouns and HTTP verbs — GET /channels/123 — Slack exposes methods. Every call goes to https://slack.com/api/ followed by a dotted method name: auth.test, conversations.list, chat.postMessage, users.info. The method name carries the meaning; the URL path is not a resource identifier.

Arguments can be supplied as query-string parameters or, for methods that accept it, as a JSON request body. Read-oriented methods are comfortable with a plain GET and query parameters, which is why the Params tab above is a natural home for things like a channel ID or a pagination cursor. Methods that write — posting a message, for example — are normally sent as POST. When you send JSON to Slack, set the content type to application/json; charset=utf-8; Slack is explicit about wanting the charset, and it is a cheap habit to adopt.

Authentication is a plain bearer token: the header is Authorization: Bearer xoxb-your-token. Choose Bearer token in the Auth tab and the tester builds that header for you. If you want to see exactly what is being sent, open the Body tab and press Copy as cURL — the generated command shows the full header set, which is often the fastest way to settle an argument about whether a header is actually present. The HTTP headers reference covers the general rules if you want the background.

Reading a Slack response: ok is the real status

Here is the single most useful thing to know about testing Slack. An HTTP 200 from Slack does not mean your call worked. The Web API reports application-level outcomes inside the JSON body through an ok boolean. A successful call returns "ok": true plus whatever payload the method produces. A failed call very often returns HTTP 200 as well — with "ok": false and an error string explaining what went wrong.

A valid auth.test call comes back with ok: true and identity fields describing the workspace and the identity behind the token. That is the quickest possible confirmation that a token is alive and which workspace it points at. An invalid one comes back with ok: false and an error such as invalid_auth, meaning the token is not accepted, or not_authed, meaning no token reached Slack at all — usually because the Auth tab was left on "No authentication" or the token field was empty.

The other error you will meet constantly is missing_scope. This one is good news in disguise: the token authenticated fine, so your credentials are correct, but the Slack app was never granted the OAuth scope this particular method requires. The fix is always the same shape — add the scope to the app, reinstall it into the workspace so that a fresh token is minted, then retry with the new token. Re-using the old token after adding a scope is a classic wasted afternoon, since scopes are baked into the token at install time.

Because the interesting part of a Slack response is nested JSON, the syntax highlighting above does real work. If you want to pull a response apart further, paste it into the JSON formatter.

Creating a token to test with

Tokens come from a Slack app, not from your account settings. In broad strokes: create an app at Slack's developer site, open its OAuth and permissions configuration, add the scopes the methods you care about require, then install the app into a workspace. Installation is what produces the token — a bot token beginning xoxb- that represents the app itself, and optionally a user token beginning xoxp- that acts on behalf of the installing user.

For testing, install into a workspace you do not mind experimenting in. A scratch workspace costs nothing to create and turns "what happens if I post to the wrong channel" from an incident into a shrug. Grant the narrowest scope set that lets your call succeed; if you find yourself adding scopes one at a time in response to missing_scope errors, that is the process working correctly.

When Slack pushes back: 401, 403 and 429

Even though Slack prefers the ok envelope, real HTTP status codes still appear, and they mean roughly what they mean everywhere else.

A 401 Unauthorized is about identity: the credential is missing, malformed or rejected. In Slack's world you are more likely to see this expressed as ok: false with invalid_auth, but the diagnosis is identical — check that the Authorization header is present, that the scheme is Bearer, and that you have not pasted a token with a stray space or newline attached. Copy-paste whitespace is a genuinely common cause and is invisible in most editors.

A 403 Forbidden is about permission rather than identity: Slack knows who you are and is declining anyway. Scope problems are the usual root cause, as are workspace or enterprise policies that restrict what apps may do.

A 429 Too Many Requests means you are calling faster than the method's rate tier allows. Slack applies rate limits per method and per workspace, and different methods sit in different tiers — a bulk listing method is treated far more conservatively than a trivial one. When you are limited, Slack sends a Retry-After header telling you how many seconds to wait. Respect it rather than retrying immediately; tight retry loops are the fastest route to a longer cool-down. Because rate tiers change, this page deliberately quotes no specific numbers — read the value Slack actually sends back, which the response header panel above will show you.

Beyond the Web API

Not everything Slack does is a Web API method. Incoming webhooks give you a URL that accepts a JSON payload and posts it into a channel, with the destination baked into the URL rather than chosen per request. Slack also calls you: slash commands, interactive components and the Events API all deliver HTTP requests to an endpoint you host. Debugging that inbound direction is a different job, and the webhook tester is the page for it.

If you are working with Slack's OAuth flow and end up holding a token-shaped string you cannot identify, the JWT decoder will tell you whether it is a JSON Web Token with a readable payload or an opaque provider-issued string like Slack's own tokens. For everything else — your own service, a partner API, a staging environment — the general REST API tester is the same console without Slack-specific defaults.

Test another provider's API

Frequently asked questions

How do I check whether a Slack token is still valid?

Call auth.test with the token as a Bearer credential. ok: true with identity fields means it works; ok: false with invalid_auth means it does not.

Why did I get not_authed instead of invalid_auth?

not_authed means Slack saw no credential at all, so check that the Auth tab is set to Bearer token and the field is filled in. invalid_auth means a credential arrived and was rejected.

Can I post a message to a channel from here?

Yes, if your token carries the necessary scope. Switch the method to POST, point the URL at the message-posting method, put your JSON in the Body tab and add Content-Type: application/json; charset=utf-8 in the Headers tab. Test in a workspace and channel you do not mind writing to.

Does the token appear in my browser history?

No. Bearer tokens are sent as a header, not in the URL, and the request history stored in your browser records only the method and URL. Tokens are never written to local storage.

Is this an official Slack tool?

No. api-tester.com is an independent third-party tool and is not affiliated with, endorsed by or sponsored by Slack. It is a general HTTP client with Slack-friendly defaults, and this page is a third-party guide rather than documentation.