Free Tool

Bluesky Handle Checker

Find out why your custom domain handle shows as invalid, and get the exact DNS record that fixes it.

Why a Bluesky custom domain handle is invalid

Bluesky cannot match the domain to your account. The fix is one DNS TXT record at _atproto.<your handle> with the value did=<your DID>, or a file at /.well-known/atproto-did. This checker reads the record, compares it with what Bluesky resolves, and shows the exact record to add.

Runs only when you click. It asks Google Public DNS (dns.google), Bluesky's public API and, if ticked, your own domain. Nothing else.

The five mistakes behind most invalid handles

What is in DNSWhat it should be
No TXT record at _atproto.example.comA TXT record at _atproto.example.com
Value did:plc:abc... (no prefix)Value did=did:plc:abc...
Two did= records at the same nameExactly one did= record
Record at _atproto.example.com.example.comHost field _atproto, so the name is _atproto.example.com
A DID copied from another accountThe DID of the account that should own the handle

The HTTPS alternative: serve a file at https://example.com/.well-known/atproto-did that contains only your DID. You need one method, not both.

Schedule from your custom-domain handle

OpenTweet connects to Bluesky over atproto OAuth, with no API key and no App Password. OAuth finds your server from the handle, so custom domains and self-hosted PDSes work once the handle is valid. Post to X, Bluesky and LinkedIn from one draft or one API call.

7-day free trial, then from $11.99/mo. Bluesky and LinkedIn on every plan.

Bluesky Handle FAQ

Why does Bluesky say my custom domain handle is invalid?

Bluesky could not match the domain to your account. The usual causes are no TXT record at _atproto.<your handle>, a value without the did= prefix, more than one did= record at that name, a record added at the wrong host such as _atproto.example.com.example.com, or a record pointing to a different account. This checker tests each one.

What DNS record does a Bluesky custom domain handle need?

A TXT record at _atproto.<your handle> whose value is did=<your DID>. For the handle example.com, most DNS panels want _atproto in the host field and did=did:plc:... as the value. The alternative is an HTTPS file at https://<your handle>/.well-known/atproto-did that contains only the DID.

Where do I find my DID?

The Bluesky app shows it on the change-handle screen when you choose to use your own domain, as part of the record it asks you to add. Paste it into the optional DID field above and the checker compares it with what DNS and Bluesky return.

Can I use a subdomain as my Bluesky handle?

Yes. For alice.example.com the record goes at _atproto.alice.example.com, which most DNS panels for example.com expect as _atproto.alice in the host field. Each handle needs its own record, so a record at _atproto.example.com does not cover alice.example.com.

How long does a new record take to work?

Once Google Public DNS returns the record, which is what this checker asks, other resolvers can see it too. Resolvers cache answers for the record TTL, so a record you changed may keep returning the old value until that runs out. Run the check again after a few minutes.

Why does the HTTPS file check fail in this tool?

Browsers block a page from reading files on another domain unless that domain allows it (CORS), and most sites do not. A failure in that one check does not mean the handle is broken. Bluesky fetches the file from its servers, which are not bound by that browser rule.

Does OpenTweet work with a custom-domain Bluesky handle?

Yes. OpenTweet connects to Bluesky over atproto OAuth, with no API key and no App Password. OAuth resolves your server from the handle, so custom-domain handles and self-hosted PDSes work once the handle is valid. Bluesky is included on every plan, from $11.99/mo with a 7-day trial.