AdGuardHome/openapi/CHANGELOG.md
Dimitry Kolyshev c908eec5de Pull request: home: http dns plain
Merge in DNS/adguard-home from AG-28194-plain-dns to master

Squashed commit of the following:

commit a033982b949217d46a8ea609f63198916f779a61
Merge: 03fc28211 79d7a1ef4
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Tue Dec 12 12:07:39 2023 +0200

    Merge remote-tracking branch 'origin/master' into AG-28194-plain-dns

commit 03fc282119a6372fcb4ce17a5d89779ad84589f5
Merge: e31a65931 34a34dc05
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Tue Dec 12 11:07:46 2023 +0200

    Merge remote-tracking branch 'origin/master' into AG-28194-plain-dns

    # Conflicts:
    #	CHANGELOG.md

commit e31a659312fffe0cd5f57710843c8a6818515502
Merge: 0b735eb42 7b5cce517
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Mon Dec 11 11:09:07 2023 +0200

    Merge remote-tracking branch 'origin/master' into AG-28194-plain-dns

    # Conflicts:
    #	CHANGELOG.md

commit 0b735eb4261883961058aed562c1e72ad1a20915
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 15:22:27 2023 +0200

    Revert "safesearch: imp docs"

    This reverts commit bab6bf3467f8914a34413bbbcdc37e89ff0401a5.

commit bab6bf3467f8914a34413bbbcdc37e89ff0401a5
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 15:21:23 2023 +0200

    safesearch: imp docs

commit aa5e6e30e01bf947d645ac4a9578eeac09c92a19
Merge: 503888447 2b62901fe
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 14:48:13 2023 +0200

    Merge remote-tracking branch 'origin/AG-28194-plain-dns' into AG-28194-plain-dns

commit 503888447aaf30d48c3fb9a414e8a65beb1a4e23
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 14:47:23 2023 +0200

    home: imp code

commit 2b62901feb29c9613ae648fa5e83598157207a17
Author: Ildar Kamalov <ik@adguard.com>
Date:   Fri Dec 8 11:55:25 2023 +0300

    client: add plain dns description

commit 3d51fc8ea1955e599953070a4b330dd4e2fd44bc
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 10:15:53 2023 +0200

    all: changelog

commit 59697b5f1ab049bd2259ffe42cef7223531ef7aa
Merge: 81a15d081 b668c04ea
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 8 10:11:59 2023 +0200

    Merge remote-tracking branch 'origin/master' into AG-28194-plain-dns

commit 81a15d0818b18f99e651311a8502082b4a539e4b
Author: Natalia Sokolova <n.sokolova@adguard.com>
Date:   Thu Dec 7 17:30:05 2023 +0300

    client/src/__locales/en.json edited online with Bitbucket

commit 0cf2f880fbd1592c02e6df42319cba357f0d7bc8
Author: Natalia Sokolova <n.sokolova@adguard.com>
Date:   Thu Dec 7 17:29:51 2023 +0300

    client/src/__locales/en.json edited online with Bitbucket

commit 2f32c59b8b1d764d060a69c35787566cf5210063
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Dec 7 13:14:04 2023 +0200

    home: imp code

commit 01e21a26bdd13c42c55c8ea3b5bbe84933bf0c04
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Dec 7 12:14:02 2023 +0200

    all: imp docs

commit b6beec6df7c2a9077ddce018656c701b7e875b53
Author: Ildar Kamalov <ik@adguard.com>
Date:   Thu Dec 7 12:42:21 2023 +0300

    client: fix reset settings

commit 93448500d56a4652a3a060b274936c40015ac8ec
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Dec 7 10:55:25 2023 +0200

    home: imp code

commit eb32f8268bee097a81463ba29f7ea52be6e7d88b
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Dec 7 10:42:23 2023 +0200

    home: imp code

commit 873d1412cf7c07ed985985a47325779bcfbf650a
Merge: 627659680 214175eb4
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Dec 7 10:22:25 2023 +0200

    Merge remote-tracking branch 'origin/master' into AG-28194-plain-dns

commit 627659680da8e973a3878d1722b276d30c7a27bb
Author: Ildar Kamalov <ik@adguard.com>
Date:   Wed Dec 6 17:39:14 2023 +0300

    client: handle plain dns setting

commit ffdbf05fede721d271a84482a5759284d18eb189
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Dec 1 15:12:50 2023 +0200

    home: http dns plain

... and 1 more commit
2023-12-12 13:16:01 +03:00

28 KiB

AdGuard Home API Change Log

v0.108.0: API changes

v0.107.42: API changes

The new field "serve_plain_dns" in TlsConfig

  • The new field "serve_plain_dns" in POST /control/tls/configure, POST /control/tls/validate and GET /control/tls/status is true if plain DNS is allowed for incoming requests.

The new fields "upstreams_cache_enabled" and "upstreams_cache_size" in Client object

  • The new field "upstreams_cache_enabled" in GET /control/clients, GET /control/clients/find, POST /control/clients/add, and POST /control/clients/update methods shows if client's DNS cache is enabled for the client. If not set AdGuard Home will use default value (false).

  • The new field "upstreams_cache_size" in GET /control/clients, GET /control/clients/find, POST /control/clients/add, and POST /control/clients/update methods is the size of client's DNS cache in bytes.

The new field "ratelimit_subnet_len_ipv4" in DNSConfig object

  • The new field "ratelimit_subnet_len_ipv4" in GET /control/dns_info and POST /control/dns_config is the length of the subnet mask for IPv4 addresses.

The new field "ratelimit_subnet_len_ipv6" in DNSConfig object

  • The new field "ratelimit_subnet_len_ipv6" in GET /control/dns_info and POST /control/dns_config is the length of the subnet mask for IPv6 addresses.

The new field "ratelimit_whitelist" in DNSConfig object

  • The new field "blocked_response_ttl" in GET /control/dns_info and POST /control/dns_config is the list of IP addresses excluded from rate limiting.

v0.107.39: API changes

New HTTP API 'POST /control/dhcp/update_static_lease'

  • The new POST /control/dhcp/update_static_lease HTTP API allows modifying IP address, hostname of the static DHCP lease. IP version must be the same as previous.

The new field "blocked_response_ttl" in DNSConfig object

  • The new field "blocked_response_ttl" in GET /control/dns_info and POST /control/dns_config is the TTL for blocked responses.

v0.107.37: API changes

The new field "fallback_dns" in UpstreamsConfig object

  • The new field "fallback_dns" in POST /control/test_upstream_dns is the list of fallback DNS servers to test.

The new field "fallback_dns" in DNSConfig object

  • The new field "fallback_dns" in GET /control/dns_info and POST /control/dns_config is the list of fallback DNS servers used when upstream DNS servers are not responding.

Deprecated blocked services APIs

  • The GET /control/blocked_services/list HTTP API; use the new GET /control/blocked_services/get API instead.

  • The POST /control/blocked_services/set HTTP API; use the new PUT /control/blocked_services/update API instead.

New blocked services APIs

  • The new GET /control/blocked_services/get HTTP API.

  • The new PUT /control/blocked_services/update HTTP API allows config updates.

These APIs accept and return a JSON object with the following format:

{
  "schedule": {
    "time_zone": "Local",
    "sun": {
      "start": 46800000,
      "end": 82800000
    }
  },
  "ids": [
    "vk"
  ]
}

/control/clients HTTP APIs

The following HTTP APIs have been changed:

  • GET /control/clients;
  • GET /control/clients/find?ip0=...&ip1=...&ip2=...;
  • POST /control/clients/add;
  • POST /control/clients/update;

The new field blocked_services_schedule has been added to JSON objects. It has the following format:

{
  "time_zone": "Local",
  "sun": {
    "start": 0,
    "end": 86400000
  },
  "mon": {
    "start": 60000,
    "end": 82800000
  },
  "thu": {
    "start": 120000,
    "end": 79200000
  },
  "tue": {
    "start": 180000,
    "end": 75600000
  },
  "wed": {
    "start": 240000,
    "end": 72000000
  },
  "fri": {
    "start": 300000,
    "end": 68400000
  },
  "sat": {
    "start": 360000,
    "end": 64800000
  }
}

v0.107.36: API changes

The new fields "top_upstreams_responses" and "top_upstreams_avg_time" in Stats object

  • The new field "top_upstreams_responses" in GET /control/stats method shows the total number of responses from each upstream.

  • The new field "top_upstrems_avg_time" in GET /control/stats method shows the average processing time in seconds of requests from each upstream.

v0.107.30: API changes

POST /control/version.json and GET /control/dhcp/interfaces content type

  • The value of the Content-Type header in the POST /control/version.json and GET /control/dhcp/interfaces HTTP APIs is now correctly set to application/json as opposed to text/plain.

New HTTP API 'PUT /control/rewrite/update'

  • The new PUT /control/rewrite/update HTTP API allows rewrite rule updates. It accepts a JSON object with the following format:
{
  "target": {
    "domain": "example.com",
    "answer": "answer-to-update"
  },
  "update": {
    "domain": "example.com",
    "answer": "new-answer"
  }
}

v0.107.29: API changes

GET /control/clients And GET /control/clients/find

  • The new optional fields "ignore_querylog" and "ignore_statistics" are set if AdGuard Home excludes client activity from query log or statistics.

POST /control/clients/add And POST /control/clients/update

  • The new optional fields "ignore_querylog" and "ignore_statistics" make AdGuard Home exclude client activity from query log or statistics. If not set AdGuard Home will use default value (false). It can be changed in the future versions.

v0.107.27: API changes

The new optional fields "edns_cs_use_custom" and "edns_cs_custom_ip" in DNSConfig

  • The new optional fields "edns_cs_use_custom" and "edns_cs_custom_ip" in POST /control/dns_config method makes AdGuard Home use or not use the custom IP for EDNS Client Subnet.

  • The new optional fields "edns_cs_use_custom" and "edns_cs_custom_ip" in GET /control/dns_info method are set if AdGuard Home uses custom IP for EDNS Client Subnet.

Deprecated statistics APIs

  • The GET /control/stats_info HTTP API; use the new GET /control/stats/config API instead.

    NOTE: If interval was configured by editing configuration file or new HTTP API call PUT /control/stats/config/update and it's not equal to previous allowed enum values then it will be equal to 90 days for compatibility reasons.

  • The POST /control/stats_config HTTP API; use the new PUT /control/stats/config/update API instead.

New statistics APIs

  • The new GET /control/stats/config HTTP API.

  • The new PUT /control/stats/config/update HTTP API allows config updates.

These control/stats/config/update and control/stats/config APIs accept and return a JSON object with the following format:

{
  "enabled": true,
  "interval": 3600,
  "ignored": [
    "example.com"
  ]
}

Deprecated query log APIs

  • The GET /control/querylog_info HTTP API; use the new GET /control/querylog/config API instead.

    NOTE: If interval was configured by editing configuration file or new HTTP API call PUT /control/querylog/config/update and it's not equal to previous allowed enum values then it will be equal to 90 days for compatibility reasons.

  • The POST /control/querylog_config HTTP API; use the new PUT /control/querylog/config/update API instead.

New query log APIs

  • The new GET /control/querylog/config HTTP API.

  • The new PUT /control/querylog/config/update HTTP API allows config updates.

These control/querylog/config/update and control/querylog/config APIs accept and return a JSON object with the following format:

{
  "enabled": true,
  "anonymize_client_ip": false,
  "interval": 3600,
  "ignored": [
    "example.com"
  ]
}

New "protection_disabled_until" field in GET /control/dns_info response

  • The new field "protection_disabled_until" in GET /control/dns_info is the timestamp until when the protection is disabled.

New "protection_disabled_duration" field in GET /control/status response

  • The new field "protection_disabled_duration" is the duration of protection pause in milliseconds.

POST /control/protection

  • The new POST /control/protection HTTP API allows to pause protection for specified duration in milliseconds.

This API accepts a JSON object with the following format:

{
  "enabled": false,
  "duration": 10000
}

Deprecated HTTP APIs

The following HTTP APIs are deprecated:

  • POST /control/safesearch/enable is deprecated. Use the new PUT /control/safesearch/settings.

  • POST /control/safesearch/disable is deprecated. Use the new PUT /control/safesearch/settings.

New HTTP API PUT /control/safesearch/settings

  • The new PUT /control/safesearch/settings HTTP API allows safesearch settings updates. It accepts a JSON object with the following format:
{
  "enabled": true,
  "bing": false,
  "duckduckgo": true,
  "google": false,
  "pixabay": false,
  "yandex": true,
  "youtube": false
}

GET /control/safesearch/status

  • The control/safesearch/status HTTP API has been changed. It now returns a JSON object with the following format:
{
  "enabled": true,
  "bing": false,
  "duckduckgo": true,
  "google": false,
  "pixabay": false,
  "yandex": true,
  "youtube": false
}

/control/clients HTTP APIs

The following HTTP APIs have been changed:

  • GET /control/clients;
  • GET /control/clients/find?ip0=...&ip1=...&ip2=...;
  • POST /control/clients/add;
  • POST /control/clients/update;

The safesearch_enabled field is deprecated. The new field safe_search has been added to JSON objects. It has the following format:

{
  "enabled": true,
  "bing": false,
  "duckduckgo": true,
  "google": false,
  "pixabay": false,
  "yandex": true,
  "youtube": false
}

v0.107.23: API changes

Experimental “beta” APIs removed

The following experimental beta APIs have been removed:

  • GET /control/install/get_addresses_beta;
  • POST /control/install/check_config_beta;
  • POST /control/install/configure_beta.

They never quite worked properly, and the future new version of AdGuard Home API will probably be different.

v0.107.22: API changes

POST /control/i18n/change_language is deprecated

Use PUT /control/profile/update.

GET /control/i18n/current_language is deprecated

Use GET /control/profile.

  • The /control/profile HTTP API has been changed.

  • The new PUT /control/profile/update HTTP API allows user info updates.

These control/profile/update and control/profile APIs accept and return a JSON object with the following format:

{
  "name": "user name",
  "language": "en",
  "theme": "auto"
}

v0.107.20: API Changes

POST /control/cache_clear

  • The new POST /control/cache_clear HTTP API allows clearing the DNS cache.

v0.107.17: API Changes

GET /control/blocked_services/services is deprecated

Use GET /control/blocked_services/all.

GET /control/blocked_services/all

  • The new GET /control/blocked_services/all HTTP API allows inspecting all available services and their data, such as SVG icons and human-readable names.

v0.107.15: POST Requests Without Bodies

As an additional CSRF protection measure, AdGuard Home now ensures that requests that change its state but have no body do not have a Content-Type header set on them.

This concerns the following APIs:

  • POST /control/dhcp/reset_leases;
  • POST /control/dhcp/reset;
  • POST /control/parental/disable;
  • POST /control/parental/enable;
  • POST /control/querylog_clear;
  • POST /control/safebrowsing/disable;
  • POST /control/safebrowsing/enable;
  • POST /control/safesearch/disable;
  • POST /control/safesearch/enable;
  • POST /control/stats_reset;
  • POST /control/update.

v0.107.14: BREAKING API CHANGES

A Cross-Site Request Forgery (CSRF) vulnerability has been discovered. We have implemented several measures to prevent such vulnerabilities in the future, but some of these measures break backwards compatibility for the sake of better protection.

All JSON APIs that expect a body now check if the request actually has Content-Type set to application/json.

All new formats for the request and response bodies are documented in openapi.yaml.

POST /control/filtering/set_rules And Other Plain-Text APIs

The following APIs, which previously accepted or returned text/plain data, now accept or return data as JSON.

POST /control/filtering/set_rules

Previously, the API accepted a raw list of filters as a plain-text file. Now, the filters must be presented in a JSON object with the following format:

{
  "rules": [
    "||example.com^",
    "# comment",
    "@@||www.example.com^"
  ]
}

GET /control/i18n/current_language And POST /control/i18n/change_language

Previously, these APIs accepted and returned the language code in plain text. Now, they accept and return them in a JSON object with the following format:

{
  "language": "en"
}

POST /control/dhcp/find_active_dhcp

Previously, the API accepted the name of the network interface as a plain-text string. Now, it must be contained within a JSON object with the following format:

{
  "interface": "eth0"
}

v0.107.12: API changes

GET /control/blocked_services/services

  • The new GET /control/blocked_services/services HTTP API allows inspecting all available services.

v0.107.7: API changes

The new optional field "ecs" in QueryLogItem

  • The new optional field "ecs" in GET /control/querylog contains the IP network from an EDNS Client-Subnet option from the request message if any.

The new possible status code in /install/configure response.

  • The new status code 422 Unprocessable Entity in the response for POST /install/configure which means that the specified password does not meet the strength requirements.

v0.107.3: API changes

The new field "version" in AddressesInfo

  • The new field "version" in GET /install/get_addresses is the version of the AdGuard Home instance.

v0.107.0: API changes

The new field "cached" in QueryLogItem

  • The new field "cached" in GET /control/querylog is true if the response is served from cache instead of being resolved by an upstream server.

New constant values for filter_list_id field in ResultRule

  • Value of 0 is now used for custom filtering rules list.

  • Value of -1 is now used for rules generated from the operating system hosts files.

  • Value of -2 is now used for blocked services' rules.

  • Value of -3 is now used for rules generated by parental control web service.

  • Value of -4 is now used for rules generated by safe browsing web service.

  • Value of -5 is now used for rules generated by safe search web service.

New possible value of "name" field in QueryLogItemClient

  • The value of "name" field in GET /control/querylog method is never empty: either persistent client's name or runtime client's hostname.

Lists in AccessList

  • Fields "allowed_clients", "disallowed_clients" and "blocked_hosts" in POST /access/set now should contain only unique elements.

  • Fields "allowed_clients" and "disallowed_clients" cannot contain the same elements.

The new field "private_key_saved" in TlsConfig

  • The new field "private_key_saved" in POST /control/tls/configure, POST /control/tls/validate and GET /control/tls/status is true if the private key was previously saved as a string and now the private key omitted from communication between server and client due to security issues.

The new field "cache_optimistic" in DNS configuration

  • The new optional field "cache_optimistic" in POST /control/dns_config method makes AdGuard Home use or not use the optimistic cache mechanism.

  • The new field "cache_optimistic" in GET /control/dns_info method is true if AdGuard Home uses the optimistic cache mechanism.

New possible value of "interval" field in QueryLogConfig

  • The value of "interval" field in POST /control/querylog_config and GET /control/querylog_info methods could now take the value of 0.25. It's equal to 6 hours.

  • All the possible values of "interval" field are enumerated.

  • The type of "interval" field is now number instead of integer.

ClientIDs in Access Settings

  • The POST /control/access/set HTTP API now accepts ClientIDs in "allowed_clients" and "disallowed_clients" fields.

The new field "unicode_name" in DNSQuestion

  • The new optional field "unicode_name" is the Unicode representation of question's domain name. It is only presented if the original question's domain name is an IDN.

Documentation fix of DNSQuestion

  • Previously incorrectly named field "host" in DNSQuestion is now named "name".

Disabling Statistics

  • The POST /control/stats_config HTTP API allows disabling statistics by setting "interval" to 0.

POST /control/dhcp/reset_leases

  • The new POST /control/dhcp/reset_leases HTTP API allows removing all leases from the DHCP server's database without erasing its configuration.

The parameter "host" in GET /apple/*.mobileconfig is now required.

  • The parameter "host" in GET requests for /apple/doh.mobileconfig and /apple/doh.mobileconfig is now required to prevent unexpected server name's value.

The new field "default_local_ptr_upstreams" in GET /control/dns_info

  • The new optional field "default_local_ptr_upstreams" is the list of IP addresses AdGuard Home would use by default to resolve PTR request for addresses from locally-served networks.

The field "use_private_ptr_resolvers" in DNS configuration

  • The new optional field "use_private_ptr_resolvers" of "DNSConfig" specifies if the DNS server should use "local_ptr_upstreams" at all.

v0.106: API changes

The field "supported_tags" in GET /control/clients

  • Previously undocumented field "supported_tags" in the response is now documented.

The field "whois_info" in GET /control/clients

  • Objects in the "auto_clients" array now have the "whois_info" field.

New response code in POST /control/login

  • 429 is returned when user is out of login attempts. It adds the Retry-After header with the number of seconds of block left in it.

New "private_upstream" field in POST /test_upstream_dns

  • The new optional field "private_upstream" of UpstreamConfig contains the upstream servers for resolving locally-served ip addresses to be checked.

New fields "resolve_clients" and "local_ptr_upstreams" in DNS configuration

  • The new optional field "resolve_clients" of DNSConfig is used to turn resolving clients' addresses on and off.

  • The new optional field "local_ptr_upstreams" of "DNSConfig" contains the upstream servers for resolving addresses from locally-served networks. The empty "local_ptr_resolvers" states that AGH should use resolvers provided by the operating system.

New "client_info" field in GET /querylog response

  • The new optional field "client_info" of QueryLogItem objects contains a more full information about the client.

v0.105: API changes

New "client_id" field in GET /querylog response

  • The new field "client_id" of QueryLogItem objects is the ID sent by the client for encrypted requests, if there was any. See the "Identifying clients" section of our wiki.

New "dnscrypt" "client_proto" value in GET /querylog response

  • The field "client_proto" can now have the value "dnscrypt" when the request was sent over a DNSCrypt connection.

New "reason" in GET /filtering/check_host and GET /querylog

  • The new RewriteRule reason is added to GET /filtering/check_host and GET /querylog.

  • Also, the reason which was incorrectly documented as "ReasonRewrite" is now correctly documented as "Rewrite", and the previously undocumented "RewriteEtcHosts" is now documented as well.

Multiple matched rules in GET /filtering/check_host and GET /querylog

  • The properties rule and filter_id are now deprecated. API users should inspect the newly-added rules object array instead. For most rules, it's either empty or contains one object, which contains the same things as the old two properties did, but under more correct names:

    {
      // …
    
      // Deprecated.
      "rule": "||example.com^",
      // Deprecated.
      "filter_id": 42,
      // Newly-added.
      "rules": [{
        "text": "||example.com^",
        "filter_list_id": 42
      }]
    }
    

    For $dnsrewrite rules, they contain all rules that contributed to the result. For example, if you have the following filtering rules:

    ||example.com^$dnsrewrite=127.0.0.1
    ||example.com^$dnsrewrite=127.0.0.2
    

    The "rules" will be something like:

    {
      // …
    
      "rules": [{
        "text": "||example.com^$dnsrewrite=127.0.0.1",
        "filter_list_id": 0
      }, {
        "text": "||example.com^$dnsrewrite=127.0.0.2",
        "filter_list_id": 0
      }]
    }
    

    The old fields will be removed in v0.106.0.

As well as other documentation fixes.

v0.103: API changes

API: replace settings in GET /control/dns_info & POST /control/dns_config

  • added "upstream_mode"

      "upstream_mode": "" | "parallel" | "fastest_addr"
    
  • removed "fastest_addr", "parallel_requests"

API: Get querylog: GET /control/querylog

  • Added optional "offset" and "limit" parameters

We are still using "older_than" approach in AdGuard Home UI, but we realize that it's easier to use offset/limit so here is this option now.

v0.102: API changes

API: Get general status: GET /control/status

  • Removed "upstream_dns", "bootstrap_dns", "all_servers" parameters

API: Get DNS general settings: GET /control/dns_info

  • Added "parallel_requests", "upstream_dns", "bootstrap_dns" parameters

Request:

GET /control/dns_info

Response:

200 OK

{
	"upstream_dns": ["tls://...", ...],
	"bootstrap_dns": ["1.2.3.4", ...],

	"protection_enabled": true | false,
	"ratelimit": 1234,
	"blocking_mode": "default" | "nxdomain" | "null_ip" | "custom_ip",
	"blocking_ipv4": "1.2.3.4",
	"blocking_ipv6": "1:2:3::4",
	"edns_cs_enabled": true | false,
	"dnssec_enabled": true | false
	"disable_ipv6": true | false,
	"fastest_addr": true | false, // use Fastest Address algorithm
	"parallel_requests": true | false, // send DNS requests to all upstream servers at once
}

API: Set DNS general settings: POST /control/dns_config

  • Added "parallel_requests", "upstream_dns", "bootstrap_dns" parameters
  • removed /control/set_upstreams_config method

Request:

POST /control/dns_config

{
	"upstream_dns": ["tls://...", ...],
	"bootstrap_dns": ["1.2.3.4", ...],

	"protection_enabled": true | false,
	"ratelimit": 1234,
	"blocking_mode": "default" | "nxdomain" | "null_ip" | "custom_ip",
	"blocking_ipv4": "1.2.3.4",
	"blocking_ipv6": "1:2:3::4",
	"edns_cs_enabled": true | false,
	"dnssec_enabled": true | false
	"disable_ipv6": true | false,
	"fastest_addr": true | false, // use Fastest Address algorithm
	"parallel_requests": true | false, // send DNS requests to all upstream servers at once
}

Response:

200 OK

v0.101: API changes

API: Refresh filters: POST /control/filtering/refresh

  • Added "whitelist" boolean parameter
  • Response is in JSON format

Request:

POST /control/filtering/refresh

{
	"whitelist": true
}

Response:

200 OK

{
	"updated": 123 // number of filters updated
}

v0.100: API changes

API: Get list of clients: GET /control/clients

  • "ip" and "mac" fields are removed
  • "ids" and "ip_addrs" fields are added

Response:

200 OK

{
clients: [
	{
		name: "client1"
		ids: ["...", ...] // IP or MAC
		ip_addrs: ["...", ...] // all IP addresses (set by user and resolved by MAC)
		use_global_settings: true
		filtering_enabled: false
		parental_enabled: false
		safebrowsing_enabled: false
		safesearch_enabled: false
		use_global_blocked_services: true
		blocked_services: [ "name1", ... ]
		whois_info: {
			key: "value"
			...
		}
	}
]
auto_clients: [
	{
		name: "host"
		ip: "..."
		source: "etc/hosts" || "rDNS"
		whois_info: {
			key: "value"
			...
		}
	}
]
}

API: Add client: POST /control/clients/add

  • "ip" and "mac" fields are removed
  • "ids" field is added

Request:

POST /control/clients/add

{
	name: "client1"
	ids: ["...", ...] // IP or MAC
	use_global_settings: true
	filtering_enabled: false
	parental_enabled: false
	safebrowsing_enabled: false
	safesearch_enabled: false
	use_global_blocked_services: true
	blocked_services: [ "name1", ... ]
}

API: Update client: POST /control/clients/update

  • "ip" and "mac" fields are removed
  • "ids" field is added

Request:

POST /control/clients/update

{
	name: "client1"
	data: {
		name: "client1"
		ids: ["...", ...] // IP or MAC
		use_global_settings: true
		filtering_enabled: false
		parental_enabled: false
		safebrowsing_enabled: false
		safesearch_enabled: false
		use_global_blocked_services: true
		blocked_services: [ "name1", ... ]
	}
}

v0.99.3: API changes

API: Get query log: GET /control/querylog

The response data is now a JSON object, not an array.

Response:

200 OK

{
"oldest":"2006-01-02T15:04:05.999999999Z07:00"
"data":[
{
	"answer":[
		{
		"ttl":10,
		"type":"AAAA",
		"value":"::"
		}
		...
	],
	"client":"127.0.0.1",
	"elapsedMs":"0.098403",
	"filterId":1,
	"question":{
		"class":"IN",
		"host":"doubleclick.net",
		"type":"AAAA"
	},
	"reason":"FilteredBlackList",
	"rule":"||doubleclick.net^",
	"status":"NOERROR",
	"time":"2006-01-02T15:04:05.999999999Z07:00"
}
...
]
}

v0.99.1: API changes

API: Get current user info: GET /control/profile

Request:

GET /control/profile

Response:

200 OK

{
"name":"..."
}

Set DNS general settings: POST /control/dns_config

Replaces these API methods:

POST /control/enable_protection
POST /control/disable_protection

Request:

POST /control/dns_config

{
	"protection_enabled": true | false,
	"ratelimit": 1234,
	"blocking_mode": "nxdomain" | "null_ip" | "custom_ip",
	"blocking_ipv4": "1.2.3.4",
	"blocking_ipv6": "1:2:3::4",
}

Response:

200 OK

v0.99: incompatible API changes

  • A note about web user authentication
  • Set filtering parameters: POST /control/filtering/config
  • Set filter parameters: POST /control/filtering/set_url
  • Set querylog parameters: POST /control/querylog_config
  • Get statistics data: GET /control/stats

A note about web user authentication

If AdGuard Home's web user is password-protected, a web client must use authentication mechanism when sending requests to server. Basic access authentication is the most simple method - a client must pass Authorization HTTP header along with all requests:

Authorization: Basic BASE64_DATA

where BASE64_DATA is base64-encoded data for username:password string.

Set filtering parameters: POST /control/filtering/config

Replaces these API methods:

POST /control/filtering/enable
POST /control/filtering/disable

Request:

POST /control/filtering_config

{
	"enabled": true | false
	"interval": 0 | 1 | 12 | 1*24 | 3*24 | 7*24
}

Response:

200 OK

Set filter parameters: POST /control/filtering/set_url

Replaces these API methods:

POST /control/filtering/enable_url
POST /control/filtering/disable_url

Request:

POST /control/filtering/set_url

{
	"url": "..."
	"enabled": true | false
}

Response:

200 OK

Set querylog parameters: POST /control/querylog_config

Replaces these API methods:

POST /querylog_enable
POST /querylog_disable

Request:

POST /control/querylog_config

{
	"enabled": true | false
	"interval": 1 | 7 | 30 | 90
}

Response:

200 OK

Get statistics data: GET /control/stats

Replaces these API methods:

GET /control/stats_top
GET /control/stats_history

Request:

GET /control/stats

Response:

200 OK

{
	time_units: hours | days

	// total counters:
	num_dns_queries: 123
	num_blocked_filtering: 123
	num_replaced_safebrowsing: 123
	num_replaced_safesearch: 123
	num_replaced_parental: 123
	avg_processing_time: 123.123

	// per time unit counters
	dns_queries: [123, ...]
	blocked_filtering: [123, ...]
	replaced_parental: [123, ...]
	replaced_safebrowsing: [123, ...]

	top_queried_domains: [
		{host: 123},
		...
	]
	top_blocked_domains: [
		{host: 123},
		...
	]
	top_clients: [
		{IP: 123},
		...
	]
}