SVCB / HTTPS Record Builder & Decoder
Normalise, encode and check an SVCB or HTTPS record: SvcParams decoded, the wire bytes broken down, and every RFC 9460 rule it breaks named.
Mode: ServiceMode (priority 1) — lower numbers are tried first, and equal numbers may be load-balanced.
No violations found.
Normalised presentation format
1 . alpn="h3,h2" ipv4hint="192.0.2.1" ech="AEX+DQBBzQAgACD4"
Zone file line
example.com. 3600 IN HTTPS 1 . alpn="h3,h2" ipv4hint="192.0.2.1" ech="AEX+DQBBzQAgACD4"
Wire format (hex)
0001000001000602683302683200040004c00002010005000c0045fe0d0041cd00200020f8
The wire form sorts SvcParamKeys ascending and the presentation form does not, so the two orders often differ — that is the specification, not a rewrite.
0001 SvcPriority (2 bytes) 00 TargetName, uncompressed 00010006026833026832 alpn (key 1) 00040004c0000201 ipv4hint (key 4) 0005000c0045fe0d0041cd00200020f8 ech (key 5)
| Key | Name | Value |
|---|---|---|
| 1 | alpn | h3,h2 |
| 4 | ipv4hint | 192.0.2.1 |
| 5 | ech | AEX+DQBBzQAgACD4 |
How to use
- Paste the RDATA — the priority, the target name, then any SvcParams — or paste the wire bytes as hex and the page will decode them back instead. The four example buttons cover a typical HTTPS record with ECH, an AliasMode record, a DoH SVCB record, and one with two deliberate mistakes.
- Set the owner name, the TTL and the record type if you want a line you can paste straight into a zone file. SVCB and HTTPS share a wire format, so switching the type changes only the line, never the bytes.
- Read the violations first. Each names the section of RFC 9460 it comes from, which is the fastest way to settle an argument with a validator that only says "bad record".
- Use the byte breakdown to see where each parameter starts and how long its value is. That is the view you need when a resolver accepts a record that a registrar’s form rejected, or the other way round.
About this tool
ShowHide
SVCB (type 64) and its web-specific twin HTTPS (type 65) are the DNS records that carry what used to need a CNAME plus out-of-band knowledge: which ALPN protocols a service speaks, which port, which address hints, and the encrypted client hello configuration that makes ECH work. They share one wire format, and almost everything that goes wrong with them is a format detail that looks fine until something else parses it. This page normalises a record, encodes it, breaks the bytes down, and names each rule it breaks with the section that says so.
The first thing to get right is the mode. Priority 0 is AliasMode: the target is an alias and not one SvcParam is permitted. Priority 1 or higher is ServiceMode, where lower numbers are tried first and equal numbers may be load-balanced. A record with priority 0 and an alpn on it is not a record with an extra field, it is invalid, and this page says so rather than quietly encoding it.
The second is ordering. On the wire, SvcParamKeys must appear in ascending numeric order and none may repeat; in presentation format the order is free. So 1 . port=443 alpn="h2" and 1 . mandatory=port,alpn alpn="h2" port=443 both encode to bytes with key 0 first, then 1, then 3 — and the normalised text this page prints comes back sorted. If a zone file and a dig answer disagree about the order, neither is wrong.
The third is escaping, and it catches nearly everyone, because comma-separated values pass through two layers. The presentation value is first unescaped as an RFC 1035 character string, where a backslash escapes the next character and a three-digit \DDD is one byte; then the result is split on commas, where a backslash escapes a comma. So alpn="h2\,h3" is two protocols — the first layer eats the backslash, the second sees a plain separator — while alpn="h2\\,h3" is the single protocol named h2,h3. There is no \xNN escape either: alpn="h2\x2ch3" is one protocol called h2x2ch3.
Smaller edges the page handles rather than hides. The target name is never DNS-compressed inside SVCB rdata, so it always appears in full. An unknown key may be written bare or with an empty value, and key65535 and key65535="" are the same four bytes. mandatory must not list itself, must not name a key that is absent, and comes back sorted. no-default-alpn without an alpn is invalid. And an IPv6 hint only prints with a dotted tail when the address really has an embedded IPv4 one — a zero run of exactly six groups, or five followed by ffff — which is why ::0.0.0.1 comes back as ::1 while ::192.0.2.1 keeps its dots.
What the page cannot tell you is whether the record works. Address hints are hints: RFC 9460 keeps A and AAAA records necessary, and a resolver is free to ignore the hint entirely. An ech value is checked as base64 and nothing more — whether the key inside it matches the server is a TLS question, not a DNS one. And a syntactically perfect HTTPS record still does nothing if the name it sits on is not the one clients look up.
Frequently asked questions
What is the difference between SVCB and HTTPS records?
Only the type number and where you put them. SVCB is type 64 and is the general form, used at a prefixed name like _dns.example.com for a specific protocol. HTTPS is type 65, is scoped to HTTP, and sits at the name itself so a browser can query it directly without a prefix. The RDATA format is byte-for-byte identical, which is why this page encodes both the same way and only the zone-file line changes.
Why does my record come back with the parameters in a different order?
Because the wire format requires ascending SvcParamKey order and the presentation format does not. RFC 9460 §2.2 makes the sorted order part of the encoding, so the bytes are the same however you wrote the text, and this page prints the text back in the order the bytes use. A key repeated at all is invalid in both forms.
Why did my ALPN list turn into one protocol, or two?
Because a comma-separated value is unescaped twice. The whole value is read as an RFC 1035 character string first, so one backslash is consumed there; then the result is split on commas, where a backslash escapes a comma. A comma that belongs inside a value therefore needs two backslashes in the zone file. That is why alpn="h2\,h3" is two protocols and alpn="h2\\,h3" is one protocol named h2,h3.
Can I put SvcParams on an AliasMode record?
No. Priority 0 means AliasMode and RFC 9460 §2.4.2 allows no SvcParams on it — the record exists to point at another name, the way a CNAME would, including at a zone apex where a CNAME is not allowed. Some authoritative servers accept the extra parameters and drop them silently, which is worse than an error, so this page reports it as a violation.
Do ipv4hint and ipv6hint replace A and AAAA records?
No, and treating them as a replacement is the commonest deployment mistake. RFC 9460 §7.3 is explicit that the hints are an optimisation to save a round trip, that clients may ignore them, and that the A and AAAA records still have to exist and agree. The hints are also cached with the SVCB record rather than with the addresses, so a record with a long TTL can hold a stale address long after the A record has moved.
Related tools
DNS Message Decoder
Paste a DNS packet as hex or DoH base64url and read it: header flags, opcode and rcode, every record, and the EDNS0 OPT options.
Network
CAA Record Builder (DNS Certificate Authority Authorization)
Generate Certificate Authority Authorization (CAA) DNS records so only the CAs you trust can issue TLS certificates for your domain.
Network
TLSA Record Generator (DANE) & Checker
Turn a certificate into its TLSA records — every selector and matching type — and check an existing record against the certificate you are serving.
Network
TXT Record Splitter (255-Byte Chunks)
Split a long SPF, DKIM or DMARC TXT record into the 255-byte strings DNS requires, in BIND, generic zone-file, Cloudflare or Route 53 syntax.
Network
DKIM Record Builder & Parser
Build or parse a DKIM DNS TXT record — paste your public key, pick selector, key type, hash and flags, and get the record plus its chunked form.
Network
DNS Zone File Validator
Paste a BIND zone file and see what it really says: every name fully qualified, the SOA explained, and the traps a parser alone will not report.
Network