From 8fccfe1ffd2c2b5476cd6c9772211bbfcff5ea9f Mon Sep 17 00:00:00 2001 From: Sarah Mischinger Date: Mon, 22 Jan 2024 12:28:29 +0100 Subject: [PATCH 1/7] revised API documentation --- public/v1/components/examples.yaml | 1274 ++++++++----- public/v1/components/headers.yaml | 38 +- public/v1/components/parameters.yaml | 18 +- public/v1/components/responses.yaml | 318 ++-- public/v1/components/schemas.yaml | 2525 +++++++++++++------------- public/v1/spec.yaml | 231 +-- 6 files changed, 2374 insertions(+), 2030 deletions(-) diff --git a/public/v1/components/examples.yaml b/public/v1/components/examples.yaml index 81ea5257..5ef5a440 100644 --- a/public/v1/components/examples.yaml +++ b/public/v1/components/examples.yaml @@ -1,502 +1,772 @@ -components: - examples: - probes: - value: - [ - { - "version": "0.20.0", - "location": { - "continent": "NA", - "region": "Northern America", - "country": "US", - "state": "VA", - "city": "Ashburn", - "asn": 14618, - "network": "Amazon.com, Inc.", - "latitude": 39.0437, - "longitude": -77.4875 - }, - "tags": [ - "aws-us-east-1", - "datacenter-network" - ], - "resolvers": [ - "private" - ] - } - ] - createMeasurementPingLocations: - summary: 'ping: specific locations' - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": [ - { "country": "DE" }, - { "country": "PL" } - ] - } - createMeasurementPingLocationsLimit: - summary: 'ping: specific locations and limit' - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": [ - { "country": "DE", "limit": 4 }, - { "country": "PL", "limit": 2 } - ] - } - createMeasurementPingLocationsMagic: - summary: 'ping: magic location filter' - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": [ - { "magic": "FR" }, - { "magic": "Poland" }, - { "magic": "Berlin+Germany" }, - { "magic": "California" }, - { "magic": "Europe" }, - { "magic": "Western Europe" }, - { "magic": "AS13335" }, - { "magic": "aws-us-east-1" }, - { "magic": "Google" } - ] - } - createMeasurementPingCustom: - summary: 'ping: custom options' - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "measurementOptions": { - "packets": 6 - } - } - createMeasurementPingLocationsMeasurementId: - summary: 'ping: previous measurement id' - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": "1wzMrzLBZfaPoT1c" - } - createMeasurementResponse: - value: - { - "id": "PY5fMsREMmIq45VR", - "probesCount": 1 - } - getPingMeasurementResponse: - summary: 'type: ping' - value: - { - "id": "nzGzfAGL7sZfUs3c", - "type": "ping", - "status": "finished", - "createdAt": "2023-07-14T18:25:52.414Z", - "updatedAt": "2023-07-14T18:25:53.207Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { - "packets": 2 - }, - "results": [ - { - "probe": { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "NZ", - "state": null, - "city": "Auckland", - "asn": 61138, - "longitude": 174.76667, - "latitude": -36.86667, - "network": "Zappie Host LLC", - "tags": [ - "datacenter-network" - ], - "resolvers": [ - "1.1.1.1", - "8.8.8.8" - ] - }, - "result": { - "status": "finished", - "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", - "resolvedAddress": "151.101.129.229", - "resolvedHostname": "151.101.129.229", - "timings": [ { "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 } ], - "stats": { "min": 24.174, "max": 24.193, "avg": 24.183, "total": 2, "loss": 0, "rcv": 2, "drop": 0 } - } - } - ] - } - getTracerouteMeasurementResponse: - summary: 'type: traceroute' - value: - { - "id": "MH97NFzqirjA9NZZ", - "type": "traceroute", - "status": "finished", - "createdAt": "2023-07-14T18:29:19.630Z", - "updatedAt": "2023-07-14T18:29:21.165Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "results": [ - { - "probe": { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 16276, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "OVH SAS", - "tags": [ - "datacenter-network" - ], - "resolvers": [ - "213.186.33.99" - ] - }, - "result": { - "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", - "status": "finished", - "resolvedAddress": "104.16.85.20", - "resolvedHostname": "104.16.85.20", - "hops": [ - { - "resolvedHostname": "172.68.208.3", - "resolvedAddress": "172.68.208.3", - "timings": [ { "rtt": 1.777 }, { "rtt": 1.778 } ] - }, - { - "resolvedHostname": "104.16.85.20", - "resolvedAddress": "104.16.85.20", - "timings": [ { "rtt": 0.826 }, { "rtt": 0.733 } ] - } - ] - } - } - ] - } - getSimpleDnsMeasurementResponse: - summary: 'type: dns' - value: - { - "id": "av5Z6kM6FXLAfKO0", - "type": "dns", - "status": "finished", - "createdAt": "2023-07-14T18:31:01.002Z", - "updatedAt": "2023-07-14T18:31:01.844Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "results": [ - { - "probe": { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 202422, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "G-Core Labs S.A.", - "tags": [ - "datacenter-network" - ], - "resolvers": [ - "8.8.8.8" - ] - }, - "result": { - "status": "finished", - "statusCodeName": "NOERROR", - "statusCode": 0, - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", - "answers": [ - { "name": "cdn.jsdelivr.net.", "type": "CNAME", "ttl": 180, "class": "IN", "value": "jsdelivr.map.fastly.net." }, - { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.1.229" }, - { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.65.229" }, - { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.129.229" }, - { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.193.229" } - ], - "timings": { "total": 99 }, - "resolver": "8.8.8.8" - } - } - ] - } - getTraceDnsMeasurementResponse: - summary: 'type: dns + trace' - value: - { - "id": "xgaym4ha2736BCPe", - "type": "dns", - "status": "finished", - "createdAt": "2023-07-14T18:32:52.259Z", - "updatedAt": "2023-07-14T18:32:54.312Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { - "trace": true - }, - "results": [ - { - "probe": { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Melbourne", - "asn": 20473, - "longitude": 144.96332, - "latitude": -37.814, - "network": "Choopa, LLC", - "tags": [ ], - "resolvers": [ - "108.61.10.10" - ] - }, - "result": { - "status": "finished", - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", - "hops": [ - { - "answers": [ - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "a.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "b.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "i.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "m.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "h.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "c.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "k.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "f.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "g.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "j.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "e.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "l.root-servers.net." }, - { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "d.root-servers.net." }, - { "name": ".", "type": "RRSIG", "ttl": 59490, "class": "IN", "value": "CIqSfQ==" } ], - "timings": { - "total": 1 - }, - "resolver": "108.61.10.10" - }, - { - "answers": [ - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "a.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "b.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "c.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "d.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "e.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "f.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "g.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "h.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "i.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "j.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "k.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "l.gtld-servers.net." }, - { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "m.gtld-servers.net." }, - { "name": "net.", "type": "DS", "ttl": 86400, "class": "IN", "value": "8BD973EE" }, - { "name": "net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "zTB3Jg== " } - ], - "timings": { - "total": 258 - }, - "resolver": "h.root-servers.net" - }, - { - "answers": [ - { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "dns1.p01.nsone.net." }, - { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "ns1.gcorelabs.net." }, - { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "ns2.gcdn.services." }, - { "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", "type": "NSEC3", "ttl": 86400, "class": "IN", "value": "NSEC3PARAM" }, - { "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==" }, - { "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", "type": "NSEC3", "ttl": 86400, "class": "IN", "value": "RRSIG" }, - { "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== " } - ], - "timings": { - "total": 231 - }, - "resolver": "d.gtld-servers.net" - }, - { - "answers": [ - { "name": "cdn.jsdelivr.net.", "type": "CNAME", "ttl": 180, "class": "IN", "value": "jsdelivr.map.fastly.net." } - ], - "timings": { - "total": 0 - }, - "resolver": "ns1.gcorelabs.net" - } - ] - } - } - ] - } - getMtrMeasurementResponse: - summary: 'type: mtr' - value: - { - "id": "1aJyGDZkWVGuXLYL", - "type": "mtr", - "status": "finished", - "createdAt": "2023-07-14T18:33:15.039Z", - "updatedAt": "2023-07-14T18:33:19.886Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { - "packets": 2 - }, - "results": [ - { - "probe": { - "continent": "AF", - "region": "Southern Africa", - "country": "ZA", - "state": null, - "city": "Johannesburg", - "asn": 199524, - "longitude": 28.04355, - "latitude": -26.20225, - "network": "G-Core Labs S.A.", - "tags": [ - "datacenter-network" - ], - "resolvers": [ - "private" - ] - }, - "result": { - "status": "finished", - "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", - "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229", - "hops": [ - { - "stats": { "min": 176.348, "max": 176.416, "avg": 176.4, "total": 2, "loss": 0, "rcv": 2, "drop": 0, "stDev": 0, "jMin": 0.1, "jMax": 0.1, "jAvg": 0.1 }, - "asn": [ 174 ], - "timings": [ - { "rtt": 176.348 }, - { "rtt": 176.416 } - ], - "resolvedAddress": "149.6.2.38", - "resolvedHostname": "149.6.2.38" - }, - { - "stats": { "min": 178.287, "max": 178.403, "avg": 178.3, "total": 2, "loss": 0, "rcv": 2, "drop": 0, "stDev": 0.1, "jMin": 0.1, "jMax": 0.1, "jAvg": 0.1 }, - "asn": [ 54113 ], - "timings": [ - { "rtt": 178.403 }, - { "rtt": 178.287 } - ], - "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229" - } - ] - } - } - ] - } - getHttpMeasurementResponse: - summary: 'type: http' - value: - { - "id": "9J2BCohDSuxoiaOD", - "type": "http", - "status": "finished", - "createdAt": "2023-07-14T18:34:05.161Z", - "updatedAt": "2023-07-14T18:34:06.310Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { - "request": { - "method": "GET", - "path": "/npm/jquery" - } - }, - "results": [ - { - "probe": { - "continent": "AS", - "region": "Eastern Asia", - "country": "KR", - "state": null, - "city": "Seoul", - "asn": 40676, - "longitude": 126.977207, - "latitude": 37.566309, - "network": "Psychz Networks", - "tags": [ - "datacenter-network" - ], - "resolvers": [ - "8.8.8.8", - "8.8.4.4" - ] - }, - "result": { - "status": "finished", - "resolvedAddress": "104.16.88.20", - "headers": { - "date": "Fri, 14 Jul 2023 18:34:05 GMT", - "content-type": "application/javascript; charset=utf-8", - "transfer-encoding": "chunked", - "connection": "close", - "access-control-allow-origin": "*", - "access-control-expose-headers": "*", - "timing-allow-origin": "*", - "cache-control": "public, max-age=604800, s-maxage=43200", - "cross-origin-resource-policy": "cross-origin", - "x-content-type-options": "nosniff", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-jsd-version": "3.7.0", - "x-jsd-version-type": "version", - "etag": "W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"", - "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", - "x-cache": "HIT, MISS", - "vary": "Accept-Encoding", - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "HIT", - "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", - "nel": "{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}", - "server": "cloudflare", - "cf-ray": "7e6bdb9999778a57-NRT", - "content-encoding": "br" - }, - "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", - "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "truncated": true, - "statusCode": 200, - "statusCodeName": "OK", - "timings": { "total": 325, "download": 1, "firstByte": 219, "dns": 37, "tls": 36, "tcp": 32 }, - "tls": { - "authorized": true, - "createdAt": "2023-05-02T00:00:00.000Z", - "expiresAt": "2024-05-01T23:59:59.000Z", - "issuer": { - "C": "US", - "O": "Cloudflare, Inc.", - "CN": "Cloudflare Inc ECC CA-3" - }, - "subject": { - "C": "US", - "ST": "California", - "L": "San Francisco", - "O": "Cloudflare, Inc.", - "CN": "sni.cloudflaressl.com", - "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com" - } - } - } - } - ] - } +components: + examples: + probes: + value: + [ + { + "version": "0.20.0", + "location": + { + "continent": "NA", + "region": "Northern America", + "country": "US", + "state": "VA", + "city": "Ashburn", + "asn": 14618, + "network": "Amazon.com, Inc.", + "latitude": 39.0437, + "longitude": -77.4875, + }, + "tags": ["aws-us-east-1", "datacenter-network"], + "resolvers": ["private"], + }, + ] + createMeasurementPingLocations: + summary: "ping: specific locations" + description: Use the properties inside the `locations` object to define the locations from which the API should select probes. In this example, we're only defining values for `country`, but you can add other properties like `city`, `asn`, etc. to fine-tune the location. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": [{ "country": "DE" }, { "country": "PL" }], + } + createMeasurementPingLocationsLimit: + summary: "ping: specific locations and limit" + description: Use the `limit` property to specify how many probes the API should pick per location. Alternatively, you can use the main object's global `limit` property to have the API determine the number of probes per location. If you don't define a limit value, the global limit value is set to 1. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": + [{ "country": "DE", "limit": 4 }, { "country": "PL", "limit": 2 }], + } + createMeasurementPingLocationsMagic: + summary: "ping: magic location filter" + description: "Instead of configuring the object properties for each location, you can use the `magic` property. For example, rather than explicitly defining a country and a city, we can write `magic: country+city`, which gives the same result. We use the `magic` field for most of our Globalping integrations, as it allows for intuitive and versatile use. [Learn more about the magic field on GitHub](https://github.com/jsdelivr/globalping)." + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": + [ + { "magic": "FR" }, + { "magic": "Poland" }, + { "magic": "Berlin+Germany" }, + { "magic": "California" }, + { "magic": "Europe" }, + { "magic": "Western Europe" }, + { "magic": "AS13335" }, + { "magic": "aws-us-east-1" }, + { "magic": "Google" }, + ], + } + createMeasurementPingCustom: + summary: "ping: custom options" + description: The API takes various options to customize the measurement, which vary depending on the defined `type`. In this example, we set the number of packets to send for our ping tests. You can find all available options in the request body schema `MeasurementRequest`. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "measurementOptions": { "packets": 6 }, + } + createMeasurementPingLocationsMeasurementId: + summary: "ping: previous measurement id" + description: If you want to reuse probes from a previous measurement, provide `locations` with the measurement ID. Note that probes may be offline and unavailable to run your measurement request! + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": "1wzMrzLBZfaPoT1c", + } + createMeasurementResponse: + value: { "id": "PY5fMsREMmIq45VR", "probesCount": 1 } + getPingMeasurementResponse: + summary: "type: ping" + value: + { + "id": "nzGzfAGL7sZfUs3c", + "type": "ping", + "status": "finished", + "createdAt": "2023-07-14T18:25:52.414Z", + "updatedAt": "2023-07-14T18:25:53.207Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "packets": 2 }, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "NZ", + "state": null, + "city": "Auckland", + "asn": 61138, + "longitude": 174.76667, + "latitude": -36.86667, + "network": "Zappie Host LLC", + "tags": ["datacenter-network"], + "resolvers": ["1.1.1.1", "8.8.8.8"], + }, + "result": + { + "status": "finished", + "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", + "resolvedAddress": "151.101.129.229", + "resolvedHostname": "151.101.129.229", + "timings": + [{ "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 }], + "stats": + { + "min": 24.174, + "max": 24.193, + "avg": 24.183, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + }, + }, + }, + ], + } + getTracerouteMeasurementResponse: + summary: "type: traceroute" + value: + { + "id": "MH97NFzqirjA9NZZ", + "type": "traceroute", + "status": "finished", + "createdAt": "2023-07-14T18:29:19.630Z", + "updatedAt": "2023-07-14T18:29:21.165Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 16276, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "OVH SAS", + "tags": ["datacenter-network"], + "resolvers": ["213.186.33.99"], + }, + "result": + { + "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", + "status": "finished", + "resolvedAddress": "104.16.85.20", + "resolvedHostname": "104.16.85.20", + "hops": + [ + { + "resolvedHostname": "172.68.208.3", + "resolvedAddress": "172.68.208.3", + "timings": [{ "rtt": 1.777 }, { "rtt": 1.778 }], + }, + { + "resolvedHostname": "104.16.85.20", + "resolvedAddress": "104.16.85.20", + "timings": [{ "rtt": 0.826 }, { "rtt": 0.733 }], + }, + ], + }, + }, + ], + } + getSimpleDnsMeasurementResponse: + summary: "type: dns" + value: + { + "id": "av5Z6kM6FXLAfKO0", + "type": "dns", + "status": "finished", + "createdAt": "2023-07-14T18:31:01.002Z", + "updatedAt": "2023-07-14T18:31:01.844Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 202422, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "G-Core Labs S.A.", + "tags": ["datacenter-network"], + "resolvers": ["8.8.8.8"], + }, + "result": + { + "status": "finished", + "statusCodeName": "NOERROR", + "statusCode": 0, + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", + "answers": + [ + { + "name": "cdn.jsdelivr.net.", + "type": "CNAME", + "ttl": 180, + "class": "IN", + "value": "jsdelivr.map.fastly.net.", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.1.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.65.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.129.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.193.229", + }, + ], + "timings": { "total": 99 }, + "resolver": "8.8.8.8", + }, + }, + ], + } + getTraceDnsMeasurementResponse: + summary: "type: dns + trace" + value: + { + "id": "xgaym4ha2736BCPe", + "type": "dns", + "status": "finished", + "createdAt": "2023-07-14T18:32:52.259Z", + "updatedAt": "2023-07-14T18:32:54.312Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "trace": true }, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Melbourne", + "asn": 20473, + "longitude": 144.96332, + "latitude": -37.814, + "network": "Choopa, LLC", + "tags": [], + "resolvers": ["108.61.10.10"], + }, + "result": + { + "status": "finished", + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", + "hops": + [ + { + "answers": + [ + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "a.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "b.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "i.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "m.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "h.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "c.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "k.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "f.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "g.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "j.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "e.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "l.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "d.root-servers.net.", + }, + { + "name": ".", + "type": "RRSIG", + "ttl": 59490, + "class": "IN", + "value": "CIqSfQ==", + }, + ], + "timings": { "total": 1 }, + "resolver": "108.61.10.10", + }, + { + "answers": + [ + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "a.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "b.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "c.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "d.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "e.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "f.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "g.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "h.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "i.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "j.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "k.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "l.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "m.gtld-servers.net.", + }, + { + "name": "net.", + "type": "DS", + "ttl": 86400, + "class": "IN", + "value": "8BD973EE", + }, + { + "name": "net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "zTB3Jg== ", + }, + ], + "timings": { "total": 258 }, + "resolver": "h.root-servers.net", + }, + { + "answers": + [ + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "dns1.p01.nsone.net.", + }, + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "ns1.gcorelabs.net.", + }, + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "ns2.gcdn.services.", + }, + { + "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", + "type": "NSEC3", + "ttl": 86400, + "class": "IN", + "value": "NSEC3PARAM", + }, + { + "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==", + }, + { + "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", + "type": "NSEC3", + "ttl": 86400, + "class": "IN", + "value": "RRSIG", + }, + { + "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== ", + }, + ], + "timings": { "total": 231 }, + "resolver": "d.gtld-servers.net", + }, + { + "answers": + [ + { + "name": "cdn.jsdelivr.net.", + "type": "CNAME", + "ttl": 180, + "class": "IN", + "value": "jsdelivr.map.fastly.net.", + }, + ], + "timings": { "total": 0 }, + "resolver": "ns1.gcorelabs.net", + }, + ], + }, + }, + ], + } + getMtrMeasurementResponse: + summary: "type: mtr" + value: + { + "id": "1aJyGDZkWVGuXLYL", + "type": "mtr", + "status": "finished", + "createdAt": "2023-07-14T18:33:15.039Z", + "updatedAt": "2023-07-14T18:33:19.886Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "packets": 2 }, + "results": + [ + { + "probe": + { + "continent": "AF", + "region": "Southern Africa", + "country": "ZA", + "state": null, + "city": "Johannesburg", + "asn": 199524, + "longitude": 28.04355, + "latitude": -26.20225, + "network": "G-Core Labs S.A.", + "tags": ["datacenter-network"], + "resolvers": ["private"], + }, + "result": + { + "status": "finished", + "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", + "resolvedAddress": "151.101.1.229", + "resolvedHostname": "151.101.1.229", + "hops": + [ + { + "stats": + { + "min": 176.348, + "max": 176.416, + "avg": 176.4, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + "stDev": 0, + "jMin": 0.1, + "jMax": 0.1, + "jAvg": 0.1, + }, + "asn": [174], + "timings": [{ "rtt": 176.348 }, { "rtt": 176.416 }], + "resolvedAddress": "149.6.2.38", + "resolvedHostname": "149.6.2.38", + }, + { + "stats": + { + "min": 178.287, + "max": 178.403, + "avg": 178.3, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + "stDev": 0.1, + "jMin": 0.1, + "jMax": 0.1, + "jAvg": 0.1, + }, + "asn": [54113], + "timings": [{ "rtt": 178.403 }, { "rtt": 178.287 }], + "resolvedAddress": "151.101.1.229", + "resolvedHostname": "151.101.1.229", + }, + ], + }, + }, + ], + } + getHttpMeasurementResponse: + summary: "type: http" + value: + { + "id": "9J2BCohDSuxoiaOD", + "type": "http", + "status": "finished", + "createdAt": "2023-07-14T18:34:05.161Z", + "updatedAt": "2023-07-14T18:34:06.310Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": + { "request": { "method": "GET", "path": "/npm/jquery" } }, + "results": + [ + { + "probe": + { + "continent": "AS", + "region": "Eastern Asia", + "country": "KR", + "state": null, + "city": "Seoul", + "asn": 40676, + "longitude": 126.977207, + "latitude": 37.566309, + "network": "Psychz Networks", + "tags": ["datacenter-network"], + "resolvers": ["8.8.8.8", "8.8.4.4"], + }, + "result": + { + "status": "finished", + "resolvedAddress": "104.16.88.20", + "headers": + { + "date": "Fri, 14 Jul 2023 18:34:05 GMT", + "content-type": "application/javascript; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "close", + "access-control-allow-origin": "*", + "access-control-expose-headers": "*", + "timing-allow-origin": "*", + "cache-control": "public, max-age=604800, s-maxage=43200", + "cross-origin-resource-policy": "cross-origin", + "x-content-type-options": "nosniff", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "x-jsd-version": "3.7.0", + "x-jsd-version-type": "version", + "etag": 'W/"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y"', + "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", + "x-cache": "HIT, MISS", + "vary": "Accept-Encoding", + "alt-svc": 'h3=":443"; ma=86400', + "cf-cache-status": "HIT", + "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", + "nel": '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}', + "server": "cloudflare", + "cf-ray": "7e6bdb9999778a57-NRT", + "content-encoding": "br", + }, + "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", + "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "truncated": true, + "statusCode": 200, + "statusCodeName": "OK", + "timings": + { + "total": 325, + "download": 1, + "firstByte": 219, + "dns": 37, + "tls": 36, + "tcp": 32, + }, + "tls": + { + "authorized": true, + "createdAt": "2023-05-02T00:00:00.000Z", + "expiresAt": "2024-05-01T23:59:59.000Z", + "issuer": + { + "C": "US", + "O": "Cloudflare, Inc.", + "CN": "Cloudflare Inc ECC CA-3", + }, + "subject": + { + "C": "US", + "ST": "California", + "L": "San Francisco", + "O": "Cloudflare, Inc.", + "CN": "sni.cloudflaressl.com", + "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com", + }, + }, + }, + }, + ], + } diff --git a/public/v1/components/headers.yaml b/public/v1/components/headers.yaml index fd842b27..8fa1dbdf 100644 --- a/public/v1/components/headers.yaml +++ b/public/v1/components/headers.yaml @@ -1,19 +1,19 @@ -components: - headers: - MeasurementLocation: - description: A link to the newly created measurement. - schema: - type: string - format: uri - RateLimitLimit: - description: The number of requests available in a given time window. - schema: - type: integer - RateLimitRemaining: - description: The number of requests remaining in the current time window. - schema: - type: integer - RateLimitReset: - description: The number of seconds until the limit is reset. - schema: - type: integer +components: + headers: + MeasurementLocation: + description: A link to the newly created measurement. + schema: + type: string + format: uri + RateLimitLimit: + description: The number of requests available in a given time window. + schema: + type: integer + RateLimitRemaining: + description: The number of requests remaining in the current time window. + schema: + type: integer + RateLimitReset: + description: The number of seconds until the limit resets. + schema: + type: integer diff --git a/public/v1/components/parameters.yaml b/public/v1/components/parameters.yaml index 2de3771e..32f8c808 100644 --- a/public/v1/components/parameters.yaml +++ b/public/v1/components/parameters.yaml @@ -1,8 +1,10 @@ -components: - parameters: - measurementId: - in: path - name: id - required: true - schema: - type: string +components: + parameters: + measurementId: + description: The ID of the measurement you want to retrieve. + example: nzGzfAGL7sZfUs3c # can be removed if not wanted + in: path + name: id + required: true + schema: + type: string diff --git a/public/v1/components/responses.yaml b/public/v1/components/responses.yaml index 4429deab..005a348c 100644 --- a/public/v1/components/responses.yaml +++ b/public/v1/components/responses.yaml @@ -1,157 +1,161 @@ -components: - responses: - '400': - description: Bad Request - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - params: - type: object - additionalProperties: - type: string - examples: - json: - value: - error: - type: validation_error - message: Parameter validation failed. - params: - measurement: '\"measurement\" does not match any of the allowed types' - '404': - description: Not Found - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: not_found - message: Couldn't find the requested item. - measurements422: - description: Unprocessable Entity - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: no_probes_found - message: No suitable probes found. - measurements429: - description: Too Many Requests - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: rate_limit_exceeded - message: API rate limit exceeded. - measurements202: - description: Accepted - headers: - Location: - $ref: 'headers.yaml#/components/headers/MeasurementLocation' - X-RateLimit-Limit: - $ref: 'headers.yaml#/components/headers/RateLimitLimit' - X-RateLimit-Remaining: - $ref: 'headers.yaml#/components/headers/RateLimitRemaining' - X-RateLimit-Reset: - $ref: 'headers.yaml#/components/headers/RateLimitReset' - content: - application/json: - schema: - $ref: 'schemas.yaml#/components/schemas/CreateMeasurementResponse' - examples: - '0': - $ref: 'examples.yaml#/components/examples/createMeasurementResponse' - measurement200: - description: Success - content: - application/json: - schema: - allOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementOptionsConditions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementResultsConditions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementResponse' - examples: - pingMeasurement: - $ref: 'examples.yaml#/components/examples/getPingMeasurementResponse' - tracerouteMeasurement: - $ref: 'examples.yaml#/components/examples/getTracerouteMeasurementResponse' - simpleDnsMeasurement: - $ref: 'examples.yaml#/components/examples/getSimpleDnsMeasurementResponse' - traceDnsMeasurement: - $ref: 'examples.yaml#/components/examples/getTraceDnsMeasurementResponse' - mtrMeasurement: - $ref: 'examples.yaml#/components/examples/getMtrMeasurementResponse' - httpMeasurement: - $ref: 'examples.yaml#/components/examples/getHttpMeasurementResponse' - probes200: - description: Success - content: - application/json: - schema: - $ref: 'schemas.yaml#/components/schemas/Probes' - examples: - '0': - $ref: 'examples.yaml#/components/examples/probes' +components: + responses: + "400": + description: If the API can't process the request due to malformed parameters or other client errors, the response returns the HTTP `400 BAD REQUEST` status code and a JSON response body with more information about the error. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + description: Contains information about an error. + required: + - type + - message + properties: + type: + type: string + description: The type of the error provided as one string value. + message: + type: string + description: The human-readable description of the error. + params: + type: object + description: Contains additional information. + additionalProperties: + type: string + examples: + json: + value: + error: + type: validation_error + message: Parameter validation failed. + params: + measurement: '\"measurement\" does not match any of the allowed types' + "404": + description: If the service can't find the requested resource, the response returns the HTTP `400 NOT FOUND` status code and a JSON response body containing more information about the error. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: not_found + message: Couldn't find the requested item. + measurements422: + description: If the API can't find suitable probes for your request, the response returns the HTTP `422 UNPROCESSABLE CONTENT` status code and a JSON response body with more information about the error. Please modify your request before trying again. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: no_probes_found + message: No suitable probes found. + measurements429: + description: If you've exceeded the API's rate limit, the response returns the status code `429 TOO MANY REQUEST` and a JSON response body containing more information about the error. Please review our [API rate limits](https://github.com/jsdelivr/globalping). + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: rate_limit_exceeded + message: API rate limit exceeded. + measurements202: + description: If the API accepts the request for processing, the response returns the status code `202 ACCEPTED` and a JSON response body containing the ID of the newly created measurement. You can use the URL from the `Location` header as a link to view the measurement status. + headers: + Location: + $ref: "headers.yaml#/components/headers/MeasurementLocation" + X-RateLimit-Limit: + $ref: "headers.yaml#/components/headers/RateLimitLimit" + X-RateLimit-Remaining: + $ref: "headers.yaml#/components/headers/RateLimitRemaining" + X-RateLimit-Reset: + $ref: "headers.yaml#/components/headers/RateLimitReset" + content: + application/json: + schema: + $ref: "schemas.yaml#/components/schemas/CreateMeasurementResponse" + examples: + "0": + $ref: "examples.yaml#/components/examples/createMeasurementResponse" + measurement200: + description: A successful request returns the status code `200 OK` and a JSON response body containing the requested measurement results. + content: + application/json: + schema: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" + - $ref: "schemas.yaml#/components/schemas/MeasurementResultsConditions" + - $ref: "schemas.yaml#/components/schemas/MeasurementResponse" + examples: + pingMeasurement: + $ref: "examples.yaml#/components/examples/getPingMeasurementResponse" + tracerouteMeasurement: + $ref: "examples.yaml#/components/examples/getTracerouteMeasurementResponse" + simpleDnsMeasurement: + $ref: "examples.yaml#/components/examples/getSimpleDnsMeasurementResponse" + traceDnsMeasurement: + $ref: "examples.yaml#/components/examples/getTraceDnsMeasurementResponse" + mtrMeasurement: + $ref: "examples.yaml#/components/examples/getMtrMeasurementResponse" + httpMeasurement: + $ref: "examples.yaml#/components/examples/getHttpMeasurementResponse" + probes200: + description: A successful request returns the status code `200 OK` and a JSON response body containing a list of all currently online probes and their metadata. + content: + application/json: + schema: + $ref: "schemas.yaml#/components/schemas/Probes" + examples: + "0": + $ref: "examples.yaml#/components/examples/probes" diff --git a/public/v1/components/schemas.yaml b/public/v1/components/schemas.yaml index 8b3331aa..95a0cbd3 100644 --- a/public/v1/components/schemas.yaml +++ b/public/v1/components/schemas.yaml @@ -1,1232 +1,1293 @@ -components: - schemas: - AsnCode: - type: integer - description: An autonomous system number. - CountryCode: - type: string - description: An ISO 3166-1 alpha-2 country code. - ContinentCode: - type: string - enum: - - AF - - AN - - AS - - EU - - NA - - OC - - SA - CityName: - type: string - description: A city name in English. - CreateMeasurementResponse: - type: object - required: - - id - - probesCount - properties: - id: - type: string - probesCount: - $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' - Latitude: - type: number - Longitude: - type: number - MeasurementLimit: - type: integer - description: | - Specifies the maximum number of probes that run the measurement. - The result count might be lower if there aren't enough probes available in the specified locations. - minimum: 1 - maximum: 500 - default: 1 - MeasurementLocationOption: - type: object - additionalProperties: false - properties: - continent: - $ref: 'schemas.yaml#/components/schemas/ContinentCode' - region: - $ref: 'schemas.yaml#/components/schemas/RegionName' - country: - $ref: 'schemas.yaml#/components/schemas/CountryCode' - state: - $ref: 'schemas.yaml#/components/schemas/StateCode' - city: - $ref: 'schemas.yaml#/components/schemas/CityName' - asn: - $ref: 'schemas.yaml#/components/schemas/AsnCode' - network: - $ref: 'schemas.yaml#/components/schemas/NetworkName' - tags: - $ref: 'schemas.yaml#/components/schemas/Tags' - magic: - type: string - description: | - Fuzzy matching based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. - Includes the full names, ISO codes (where applicable), and common aliases. - Multiple conditions can be combined using the `+` character. - limit: - type: integer - description: | - Mutually exclusive with the global `limit`. - Specifies the maximum number of probes that run the measurement in this location. - minimum: 1 - maximum: 200 - default: 1 - MeasurementLocations: - oneOf: - - type: array - description: | - An array of locations from which to run the measurement. Each object specifies a location using one or multiple keys. - items: - $ref: 'schemas.yaml#/components/schemas/MeasurementLocationOption' - - type: string - description: | - `id` of a previous measurement - its probes are reused for the new measurement and returned in the same order. - Measurement type and options are not reused and need to be specified in the request. - Note that this option only works for the lifetime of the original measurement - and will result in a `422` response for expired or invalid `id` values. - MeasurementOptions: - anyOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementPingOptions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementTracerouteOptions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementDnsOptions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementMtrOptions' - - $ref: 'schemas.yaml#/components/schemas/MeasurementHttpOptions' - MeasurementOptionsConditions: - allOf: - - if: - type: object - properties: - type: - const: ping - then: - type: object - properties: - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementPingOptions' - - if: - type: object - properties: - type: - const: traceroute - then: - type: object - properties: - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementTracerouteOptions' - - if: - type: object - properties: - type: - const: dns - then: - type: object - properties: - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementDnsOptions' - - if: - type: object - properties: - type: - const: mtr - then: - type: object - properties: - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementMtrOptions' - - if: - type: object - properties: - type: - const: http - then: - type: object - properties: - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementHttpOptions' - MeasurementResultsConditions: - allOf: - - if: - type: object - properties: - type: - const: ping - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: 'schemas.yaml#/components/schemas/FinishedPingTestResult' - - if: - type: object - properties: - type: - const: traceroute - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: 'schemas.yaml#/components/schemas/FinishedTracerouteTestResult' - - if: - type: object - properties: - type: - const: dns - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: 'schemas.yaml#/components/schemas/FinishedDnsTestResult' - - if: - type: object - properties: - type: - const: mtr - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: 'schemas.yaml#/components/schemas/FinishedMtrTestResult' - - if: - type: object - properties: - type: - const: http - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: 'schemas.yaml#/components/schemas/FinishedHttpTestResult' - MeasurementPingOptions: - type: object - title: PingOptions - additionalProperties: false - properties: - packets: - type: integer - default: 3 - minimum: 1 - maximum: 16 - MeasurementTracerouteOptions: - type: object - title: TracerouteOptions - additionalProperties: false - properties: - port: - type: integer - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - enum: - - ICMP - - TCP - - UDP - default: ICMP - MeasurementDnsOptions: - type: object - title: DnsOptions - additionalProperties: false - properties: - query: - type: object - description: The DNS query properties. - additionalProperties: false - properties: - type: - type: string - enum: - - A - - AAAA - - ANY - - CNAME - - DNSKEY - - DS - - MX - - NS - - NSEC - - PTR - - RRSIG - - SOA - - TXT - - SRV - default: A - resolver: - $ref: 'schemas.yaml#/components/schemas/MeasurementResolver' - port: - type: integer - minimum: 0 - maximum: 65535 - default: 53 - protocol: - type: string - enum: - - TCP - - UDP - default: UDP - trace: - type: boolean - description: | - Toggles tracing of the delegation path from the root servers down to the target domain name. - default: false - MeasurementMtrOptions: - type: object - title: MtrOptions - additionalProperties: false - properties: - port: - type: integer - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - enum: - - ICMP - - TCP - - UDP - default: ICMP - packets: - type: integer - default: 3 - minimum: 1 - maximum: 16 - MeasurementHttpOptions: - type: object - title: HttpOptions - additionalProperties: false - properties: - request: - type: object - description: The HTTP request properties. - additionalProperties: false - properties: - host: - type: string - description: | - An optional override for the `Host` header. The default value is based on the `target`. - path: - type: string - query: - type: string - method: - type: string - enum: - - HEAD - - GET - default: HEAD - headers: - type: object - description: | - Additional request headers. Note that the `Host` and `User-Agent` are reserved and internally overridden. - additionalProperties: - type: string - resolver: - $ref: 'schemas.yaml#/components/schemas/MeasurementResolver' - port: - type: integer - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - enum: - - HTTP - - HTTPS - - HTTP2 - default: HTTPS - MeasurementProbesCount: - type: integer - description: The number of probes that performed the measurement. Smaller or equal to `limit`. - MeasurementResolver: - description: A DNS resolver to use for the query. Defaults to the probe's system resolver. - anyOf: - - type: string - format: ipv4 - description: An IPv4 address. - - type: string - format: hostname - description: A Fully Qualified Domain Name (FQDN). - MeasurementResultItem: - type: object - required: - - probe - - result - properties: - probe: - allOf: - - $ref: 'schemas.yaml#/components/schemas/ProbeLocation' - - type: object - description: Information about the probe that performed this test. - required: - - tags - - resolvers - properties: - tags: - $ref: 'schemas.yaml#/components/schemas/Tags' - resolvers: - $ref: 'schemas.yaml#/components/schemas/ProbeResolvers' - result: - $ref: 'schemas.yaml#/components/schemas/TestResult' - MeasurementStatus: - type: string - description: The measurement status. Any value other than `in-progress` is final. - enum: - - in-progress - - finished - MeasurementTarget: - type: string - description: | - A public endpoint on which the measurement is executed. - Typically a hostname or an IPv4 address. The exact format depends on the measurement type. - MeasurementType: - type: string - enum: - - ping - - traceroute - - dns - - mtr - - http - MeasurementRequest: - allOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementOptionsConditions' - - type: object - additionalProperties: false - required: - - type - - target - properties: - type: - $ref: 'schemas.yaml#/components/schemas/MeasurementType' - target: - $ref: 'schemas.yaml#/components/schemas/MeasurementTarget' - inProgressUpdates: - type: boolean - description: | - Specifies if the results of the measurement should be updated while being in progress. - If `false`, results are populated to the measurement object only after the test finishes. - If `true`, partial results are returned as soon as they are available and can be presented to the user in real-time. - Note that only the top 5 tests from the results array will update in real-time. - default: false - locations: - $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' - limit: - $ref: 'schemas.yaml#/components/schemas/MeasurementLimit' - measurementOptions: - $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' - MeasurementResponse: - type: object - required: - - id - - type - - status - - createdAt - - updatedAt - - target - - probesCount - - results - properties: - id: - type: string - type: - $ref: 'schemas.yaml#/components/schemas/MeasurementType' - target: - $ref: 'schemas.yaml#/components/schemas/MeasurementTarget' - status: - $ref: 'schemas.yaml#/components/schemas/MeasurementStatus' - createdAt: - type: string - format: date-time - description: Time when the measurement was created. - updatedAt: - type: string - format: date-time - description: Time when the measurement was last updated. - probesCount: - $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' - locations: - allOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' - - description: The locations specified when creating the measurement. - limit: - allOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementLimit' - - description: The limit specified when creating the measurement if different from default. - measurementOptions: - allOf: - - $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' - - description: The options specified when creating the measurement if different from default. - results: - type: array - description: The measurement results. - items: - $ref: 'schemas.yaml#/components/schemas/MeasurementResultItem' - NetworkName: - type: string - description: A network name. - NullableInteger: - type: - - integer - - 'null' - NullableNumber: - type: - - number - - 'null' - Probe: - type: object - required: - - version - - location - - tags - - resolvers - properties: - version: - type: string - description: Probe version. - location: - $ref: 'schemas.yaml#/components/schemas/ProbeLocation' - tags: - $ref: 'schemas.yaml#/components/schemas/Tags' - resolvers: - $ref: 'schemas.yaml#/components/schemas/ProbeResolvers' - ProbeLocation: - type: object - required: - - continent - - region - - country - - state - - city - - asn - - network - - latitude - - longitude - properties: - continent: - $ref: 'schemas.yaml#/components/schemas/ContinentCode' - region: - $ref: 'schemas.yaml#/components/schemas/RegionName' - country: - $ref: 'schemas.yaml#/components/schemas/CountryCode' - state: - $ref: 'schemas.yaml#/components/schemas/StateCode' - city: - $ref: 'schemas.yaml#/components/schemas/CityName' - asn: - $ref: 'schemas.yaml#/components/schemas/AsnCode' - network: - $ref: 'schemas.yaml#/components/schemas/NetworkName' - latitude: - $ref: 'schemas.yaml#/components/schemas/Latitude' - longitude: - $ref: 'schemas.yaml#/components/schemas/Longitude' - ProbeResolver: - anyOf: - - type: string - format: ipv4 - description: An IPv4 address. - - type: string - const: private - description: Indicates the resolver points to a private IP address. - ProbeResolvers: - type: array - description: A list of default DNS resolvers configured on the probe. - items: - $ref: 'schemas.yaml#/components/schemas/ProbeResolver' - Probes: - type: array - items: - $ref: 'schemas.yaml#/components/schemas/Probe' - RegionName: - type: string - description: | - A Geographic Region name based on the - UN [Standard Country or Area Codes for Statistical Use (M49)](https://unstats.un.org/unsd/methodology/m49/). - enum: - - Northern Africa - - Eastern Africa - - Middle Africa - - Southern Africa - - Western Africa - - - Caribbean - - Central America - - South America - - Northern America - - - Central Asia - - Eastern Asia - - South-eastern Asia - - Southern Asia - - Western Asia - - - Eastern Europe - - Northern Europe - - Southern Europe - - Western Europe - - - Australia and New Zealand - - Melanesia - - Micronesia - - Polynesia - ResolvedAddress: - type: string - description: The resolved IP address of the `target`. - ResolvedHostname: - type: - - string - - 'null' - format: hostname - description: The resolved hostname of the `target`. - StateCode: - type: - - string - - 'null' - description: Only for US states. A two-letter state code based on ISO 3166-2. - StatsRttMin: - type: number - description: The lowest `rtt` value. - StatsRttMinNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The lowest `rtt` value. - StatsRttAvg: - type: number - description: The average `rtt` value. - StatsRttAvgNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The average `rtt` value. - StatsRttMax: - type: number - description: The highest `rtt` value. - StatsRttMaxNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The highest `rtt` value. - StatsPacketsTotal: - type: integer - description: The number of sent packets. - StatsPacketsRcv: - type: integer - description: The number of received packets. - StatsPacketsDrop: - type: integer - description: The number of dropped packets (`total` - `rcv`). - StatsPacketsLoss: - type: number - description: The percentage of dropped packets. - StatsJitterMin: - type: number - description: The lowest jitter value. - StatsJitterAvg: - type: number - description: The average jitter value. - StatsJitterMax: - type: number - description: The highest jitter value. - StatsStDev: - type: number - description: The standard deviation of the `rtt` values. - Tags: - type: array - description: | - An array of additional values that can be used to target the probe. - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) - and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code. - Probes are also automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between datacenter and end-user locations. - items: - type: string - TestResult: - anyOf: - - $ref: 'schemas.yaml#/components/schemas/InProgressTestResult' - - $ref: 'schemas.yaml#/components/schemas/FailedTestResult' - - $ref: 'schemas.yaml#/components/schemas/OfflineTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedPingTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedTracerouteTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedDnsTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedMtrTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedHttpTestResult' - BaseFinishedTestResult: - type: object - required: - - status - - rawOutput - properties: - status: - $ref: 'schemas.yaml#/components/schemas/FinishedTestStatus' - rawOutput: - $ref: 'schemas.yaml#/components/schemas/TestRawOutput' - InProgressTestResult: - type: object - title: InProgressTestResult - description: | - Represents an `in-progress` test where most fields are not available. - required: - - status - - rawOutput - properties: - status: - $ref: 'schemas.yaml#/components/schemas/InProgressTestStatus' - rawOutput: - $ref: 'schemas.yaml#/components/schemas/TestRawOutput' - FailedTestResult: - type: object - title: FailedTestResult - description: | - Represents a `failed` test where most fields are not available. - required: - - status - - rawOutput - properties: - status: - $ref: 'schemas.yaml#/components/schemas/FailedTestStatus' - rawOutput: - $ref: 'schemas.yaml#/components/schemas/TestRawOutput' - OfflineTestResult: - type: object - title: OfflineTestResult - description: | - Represents an `offline` test where the requested probe is currently offline and most fields are not available. - Only possible when passing an `id` of a previous measurement to the `locations` field. - required: - - status - - rawOutput - properties: - status: - $ref: 'schemas.yaml#/components/schemas/OfflineTestStatus' - rawOutput: - $ref: 'schemas.yaml#/components/schemas/TestRawOutput' - FinishedPingTestResult: - title: FinishedPingTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - resolvedAddress - - resolvedHostname - - stats - - timings - properties: - resolvedAddress: - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - resolvedHostname: - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - stats: - type: object - description: | - Summary `rtt` and packet loss statistics. - All times are in milliseconds. - required: - - min - - avg - - max - - total - - rcv - - drop - - loss - properties: - min: - $ref: 'schemas.yaml#/components/schemas/StatsRttMinNullable' - avg: - $ref: 'schemas.yaml#/components/schemas/StatsRttAvgNullable' - max: - $ref: 'schemas.yaml#/components/schemas/StatsRttMaxNullable' - total: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsTotal' - rcv: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsRcv' - drop: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsDrop' - loss: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsLoss' - timings: - type: array - description: | - Details for each sent packet. - All times are in milliseconds. - items: - type: object - required: - - rtt - - ttl - properties: - rtt: - $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' - ttl: - $ref: 'schemas.yaml#/components/schemas/TimingPacketTtl' - FinishedTracerouteTestResult: - title: FinishedTracerouteTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - resolvedAddress - - resolvedHostname - - hops - properties: - resolvedAddress: - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - resolvedHostname: - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - hops: - type: array - description: Details for each hop. - items: - type: object - required: - - resolvedAddress - - resolvedHostname - - timings - properties: - resolvedAddress: - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - resolvedHostname: - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - timings: - type: array - description: | - Details for each sent packet. - All times are in milliseconds. - items: - type: object - required: - - rtt - properties: - rtt: - $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' - FinishedDnsTestResult: - title: FinishedDnsTestResult - anyOf: - - $ref: 'schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult' - - $ref: 'schemas.yaml#/components/schemas/FinishedTraceDnsTestResult' - DnsStatusCode: - type: integer - description: The DNS [response code](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). - DnsStatusCodeName: - type: string - description: The DNS [response code name](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). - HttpStatusCode: - type: integer - description: The HTTP response status code. - HttpStatusCodeName: - type: string - description: The HTTP response status code name. - FinishedSimpleDnsTestResult: - title: FinishedSimpleDnsTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - statusCode - - statusCodeName - properties: - statusCode: - $ref: 'schemas.yaml#/components/schemas/DnsStatusCode' - statusCodeName: - $ref: 'schemas.yaml#/components/schemas/DnsStatusCodeName' - - $ref: 'schemas.yaml#/components/schemas/DnsTestHopResult' - FinishedTraceDnsTestResult: - title: FinishedTraceDnsTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - hops - properties: - hops: - type: array - items: - $ref: 'schemas.yaml#/components/schemas/DnsTestHopResult' - DnsTestHopResult: - type: object - required: - - resolver - - answers - - timings - properties: - resolver: - type: string - description: The hostname or IP of the resolver that answered the query. - answers: - type: array - description: The list of received resource records. - items: - $ref: 'schemas.yaml#/components/schemas/DnsTestAnswer' - timings: - type: object - required: - - total - properties: - total: - type: number - description: The total query time in milliseconds. - DnsTestAnswer: - type: object - required: - - name - - type - - ttl - - class - - value - properties: - name: - type: string - description: The record domain name. - type: - type: string - description: The record type. - ttl: - type: integer - description: The record TTL in seconds. - class: - type: string - description: The record class. - value: - type: string - description: The record value. - FinishedMtrTestResult: - title: FinishedMtrTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - resolvedAddress - - resolvedHostname - - hops - properties: - resolvedAddress: - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - resolvedHostname: - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - hops: - type: array - items: - type: object - required: - - resolvedAddress - - resolvedHostname - - asn - - timings - - stats - properties: - resolvedAddress: - allOf: - - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - - description: The resolved IP address of this hop. - resolvedHostname: - allOf: - - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - - description: The resolved hostname of this hop. - asn: - type: array - description: The list of ASNs assigned to this hop. - items: - type: integer - stats: - type: object - description: | - Summary `rtt` and packet loss statistics. - All times are in milliseconds. - required: - - min - - avg - - max - - stDev - - jMin - - jAvg - - jMax - - total - - rcv - - drop - - loss - properties: - min: - $ref: 'schemas.yaml#/components/schemas/StatsRttMin' - avg: - $ref: 'schemas.yaml#/components/schemas/StatsRttAvg' - max: - $ref: 'schemas.yaml#/components/schemas/StatsRttMax' - stDev: - $ref: 'schemas.yaml#/components/schemas/StatsStDev' - jMin: - $ref: 'schemas.yaml#/components/schemas/StatsJitterMin' - jAvg: - $ref: 'schemas.yaml#/components/schemas/StatsJitterAvg' - jMax: - $ref: 'schemas.yaml#/components/schemas/StatsJitterMax' - total: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsTotal' - rcv: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsRcv' - drop: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsDrop' - loss: - $ref: 'schemas.yaml#/components/schemas/StatsPacketsLoss' - timings: - type: array - description: | - Details for each sent packet. - All times are in milliseconds. - items: - type: object - required: - - rtt - properties: - rtt: - $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' - FinishedHttpTestResult: - title: FinishedHttpTestResult - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - - type: object - required: - - rawHeaders - - rawBody - - truncated - - headers - - resolvedAddress - - statusCode - - statusCodeName - - timings - - tls - properties: - rawHeaders: - type: string - description: The raw HTTP response headers. - rawBody: - type: string - description: The raw HTTP response body. Only the first 10 kb are returned. - truncated: - type: boolean - description: | - `true` if `rawBody` was truncated due to being too big, `false` otherwise. - headers: - type: object - description: The HTTP response headers. - additionalProperties: - type: string - statusCode: - $ref: 'schemas.yaml#/components/schemas/HttpStatusCode' - statusCodeName: - $ref: 'schemas.yaml#/components/schemas/HttpStatusCodeName' - resolvedAddress: - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - timings: - type: object - required: - - total - - dns - - tcp - - tls - - firstByte - - download - properties: - total: - $ref: 'schemas.yaml#/components/schemas/TimingHttpTotalNullable' - dns: - $ref: 'schemas.yaml#/components/schemas/TimingHttpDnsNullable' - tcp: - $ref: 'schemas.yaml#/components/schemas/TimingHttpTcpNullable' - tls: - $ref: 'schemas.yaml#/components/schemas/TimingHttpTlsNullable' - firstByte: - $ref: 'schemas.yaml#/components/schemas/TimingHttpFirstByteNullable' - download: - $ref: 'schemas.yaml#/components/schemas/TimingHttpDownloadNullable' - tls: - oneOf: - - $ref: 'schemas.yaml#/components/schemas/TlsCertificate' - - type: 'null' - TestRawOutput: - type: string - description: | - The raw output can be presented to users but is not meant to be parsed clients. - Please use the individual values provided in other fields for automated processing. - BaseTestStatus: - type: string - description: The test status. Any value other than `in-progress` is final. - InProgressTestStatus: - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - - const: in-progress - FinishedTestStatus: - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - - const: finished - FailedTestStatus: - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - - const: failed - OfflineTestStatus: - allOf: - - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - - const: offline - TimingPacketRtt: - type: number - description: The round-trip time for this packet. - TimingPacketTtl: - type: number - description: The packet time-to-live value. - TimingHttpTotalNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The total HTTP request time. - TimingHttpDnsNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The time required to perform the DNS lookup. - TimingHttpTcpNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The time from performing the DNS lookup to establishing the TCP connection. - TimingHttpTlsNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The time from establishing the TCP connection to establishing the TLS session. - TimingHttpFirstByteNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The time from establishing the TCP/TLS connection to the first response byte. - TimingHttpDownloadNullable: - allOf: - - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - - description: The time from the first byte to downloading the whole response. - TlsCertificate: - type: object - description: The TLS session information. - required: - - authorized - - createdAt - - expiresAt - - subject - - issuer - properties: - authorized: - type: boolean - description: | - `true` if the certificate is valid and signed by a trusted authority, `false` otherwise. - error: - type: string - description: | - The reason for rejecting the certificate if `authorized` is `false`. - createdAt: - type: string - format: date-time - expiresAt: - type: string - format: date-time - subject: - $ref: 'schemas.yaml#/components/schemas/TlsCertificateSubject' - issuer: - $ref: 'schemas.yaml#/components/schemas/TlsCertificateIssuer' - TlsCertificateIssuer: - type: object - required: - - C - - O - - CN - properties: - C: - type: string - description: The issuer's country. - O: - type: string - description: The issuer's organization. - CN: - type: string - description: The issuer's common name. - TlsCertificateSubject: - type: object - required: - - CN - - alt - properties: - CN: - type: string - description: The subject's common name. - alt: - type: string - description: The subject's alternative names. +components: + schemas: + AsnCode: + type: integer + description: An autonomous system number (ASN). + CountryCode: + type: string + description: A two-letter country code based on [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Current_codes). + ContinentCode: + type: string + description: A two-letter continent code. + enum: + - AF + - AN + - AS + - EU + - NA + - OC + - SA + CityName: + type: string + description: A city name in English. + CreateMeasurementResponse: + description: Contains information about the newly created measurement request, such as its ID. + type: object + required: + - id + - probesCount + properties: + id: + type: string + description: | + The identifier of the measurement. + > **Tip**: You can use the ID to create a new measurement request, reusing the same probes. + probesCount: + $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + Latitude: + type: number + description: The probe location's latitude. + Longitude: + type: number + description: The probe location's longitude. + MeasurementLimit: + type: integer + description: | + The maximum number of probes that should run the measurement. The actual number of selected probes may vary, depending on their availability. + This property is mutually exclusive with the `locations` object's `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + minimum: 1 + maximum: 500 + default: 1 + MeasurementLocationOption: + type: object + description: Contains location data that tells the API where to select the probes. + additionalProperties: false + properties: + continent: + $ref: "schemas.yaml#/components/schemas/ContinentCode" + region: + $ref: "schemas.yaml#/components/schemas/RegionName" + country: + $ref: "schemas.yaml#/components/schemas/CountryCode" + state: + $ref: "schemas.yaml#/components/schemas/StateCode" + city: + $ref: "schemas.yaml#/components/schemas/CityName" + asn: + $ref: "schemas.yaml#/components/schemas/AsnCode" + network: + $ref: "schemas.yaml#/components/schemas/NetworkName" + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + magic: + type: string + description: | + The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. + You can specify the full names, ISO codes (if applicable), and common aliases. If you want to combine several conditions, use the `+` character. + limit: + type: integer + description: | + The maximum number of probes that should perform the measurement at this location. The actual number of selected probes may vary, depending on their availability. + This property is mutually exclusive with the global `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + minimum: 1 + maximum: 200 + default: 1 + MeasurementLocations: + oneOf: + - type: array + description: | + An array of `location` objects from which to run the tests. Each object specifies a location using one or more properties, such as country, city, ASN, etc. + items: + $ref: "schemas.yaml#/components/schemas/MeasurementLocationOption" + - type: string + description: | + The ID of a previous measurement whose probes you want to reuse in the same order. + You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. + Also note that once the original measurement expires, any subsequent request using the expired ID returns a `422` error. + MeasurementOptions: + description: Contains additional request options that depend on the measurement `type` you want to run. + anyOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + MeasurementOptionsConditions: + allOf: + - if: + type: object + properties: + type: + const: ping + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" + - if: + type: object + properties: + type: + const: traceroute + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" + - if: + type: object + properties: + type: + const: dns + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" + - if: + type: object + properties: + type: + const: mtr + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" + - if: + type: object + properties: + type: + const: http + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + MeasurementResultsConditions: + allOf: + - if: + type: object + properties: + type: + const: ping + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" + - if: + type: object + properties: + type: + const: traceroute + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" + - if: + type: object + properties: + type: + const: dns + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" + - if: + type: object + properties: + type: + const: mtr + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" + - if: + type: object + properties: + type: + const: http + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + MeasurementPingOptions: + type: object + title: PingOptions + description: Contains additional configuration options for ping measurement requests. + additionalProperties: false + properties: + packets: + type: integer + description: The number of packets to send. + default: 3 + minimum: 1 + maximum: 16 + MeasurementTracerouteOptions: + type: object + title: TracerouteOptions + description: Contains additional configuration options for traceroute measurement requests. + additionalProperties: false + properties: + port: + type: integer + description: The destination port for the data packets. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - ICMP + - TCP + - UDP + default: ICMP + MeasurementDnsOptions: + type: object + title: DnsOptions + description: Contains additional configuration options for DNS measurement requests. + additionalProperties: false + properties: + query: + type: object + description: The type of DNS query. + additionalProperties: false + properties: + type: + type: string + enum: + - A + - AAAA + - ANY + - CNAME + - DNSKEY + - DS + - MX + - NS + - NSEC + - PTR + - RRSIG + - SOA + - TXT + - SRV + default: A + resolver: + $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + port: + type: integer + description: The port number to send the query to. + minimum: 0 + maximum: 65535 + default: 53 + protocol: + type: string + description: The protocol to use for the DNS query. + enum: + - TCP + - UDP + default: UDP + trace: + type: boolean + description: Toggle delegation path tracing from the root servers down to the target domain name. + default: false + MeasurementMtrOptions: + type: object + title: MtrOptions + description: Contains additional configuration options for mtr measurement requests. + additionalProperties: false + properties: + port: + type: integer + description: The port number to use. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - ICMP + - TCP + - UDP + default: ICMP + packets: + type: integer + description: The number of packets to send to each hop. + default: 3 + minimum: 1 + maximum: 16 + MeasurementHttpOptions: + type: object + title: HttpOptions + description: Contains additional configuration options for HTTP measurement requests. + additionalProperties: false + properties: + request: + type: object + description: Contains the HTTP request properties to use. + additionalProperties: false + properties: + host: + type: string + description: | + The `Host` header to add to the request. The default value is based on the measurement request's `target`. + path: + type: string + description: The URL pathname. + query: + type: string + description: A query string to add to the request. + method: + type: string + description: The HTTP method to use. + enum: + - HEAD + - GET + default: HEAD + headers: + type: object + description: | + Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. + + > **Note**: Use the `host` property in the same object to define the `Host` header. + additionalProperties: + type: string + resolver: + $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + port: + type: integer + description: The port number to use. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - HTTP + - HTTPS + - HTTP2 + default: HTTPS + MeasurementProbesCount: + type: integer + description: | + The actual number of probes that performed the measurement tests. + The value can be smaller or equal to the `limit` defined in the measurement request, depending on probe availability. + MeasurementResolver: + description: A DNS resolver to use for the measurement. The default value is the probe's system resolver. + anyOf: + - type: string + format: ipv4 + description: The IPv4 address of the resolver. + - type: string + format: hostname + description: The Full Qualified Domain Name (FQDN) of the resolver. + MeasurementResultItem: + type: object + description: Contains information about a probe and its test results. + required: + - probe + - result + properties: + probe: + allOf: + - $ref: "schemas.yaml#/components/schemas/ProbeLocation" + - type: object + description: Contains information about the probe that performed the test, such as its location, tags, and resolvers. + required: + - tags + - resolvers + properties: + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + resolvers: + $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + result: + $ref: "schemas.yaml#/components/schemas/TestResult" + MeasurementStatus: + type: string + description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + enum: + - in-progress + - finished + MeasurementTarget: + type: string + description: | + A publicly reachable target. + This is usually a hostname or an IPv4 address, depending on the defined `type`. + MeasurementType: + type: string + description: The measurement's test type. + enum: + - ping + - traceroute + - dns + - mtr + - http + MeasurementRequest: + description: Contains all the required data to create a measurement request. + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + $ref: "schemas.yaml#/components/schemas/MeasurementType" + target: + $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + inProgressUpdates: + type: boolean + description: | + Indicates whether you want to be able to get partial results while the measurement is still running: + - if `true`, the API returns partial results as soon as they are available. For example, this is handy if you want to present data to the user in real time. Note that you can only get real-time updates for the first five tests in the `results` array. + - if `false`, the API doesn't populate the `results` array in the response until the measurement is complete + default: false + locations: + $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + limit: + $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + MeasurementResponse: + type: object + description: Contains your measurement request's response including probe details and test results. + required: + - id + - type + - status + - createdAt + - updatedAt + - target + - probesCount + - results + properties: + id: + type: string + description: The identifier of the measurement. + type: + $ref: "schemas.yaml#/components/schemas/MeasurementType" + target: + $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + status: + $ref: "schemas.yaml#/components/schemas/MeasurementStatus" + createdAt: + type: string + format: date-time + description: The date and time at which the API created the measurement. + updatedAt: + type: string + format: date-time + description: The date and time at which the AP last updated the measurement. + probesCount: + $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + locations: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + - description: Contains the location data you specified when creating the measurement request. + limit: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + - description: The limit you specified when creating the request, if it differs from the default value. Is not part of the response if you have specified limits per location. + measurementOptions: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + - description: Contains the custom options you provided when creating the measurement request, if they differ from the default configuration. + results: + type: array + description: An array containing the measurement's results. + items: + $ref: "schemas.yaml#/components/schemas/MeasurementResultItem" + NetworkName: + type: string + description: A network name, such as "Google LLC" or "DigitalOcen, LLC". + NullableInteger: + type: + - integer + - "null" + NullableNumber: + type: + - number + - "null" + Probe: + type: object + description: Contains information about a probe. + required: + - version + - location + - tags + - resolvers + properties: + version: + type: string + description: The probe's version. + location: + $ref: "schemas.yaml#/components/schemas/ProbeLocation" + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + resolvers: + $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + ProbeLocation: + type: object + description: Contains a probe's location information. + required: + - continent + - region + - country + - state + - city + - asn + - network + - latitude + - longitude + properties: + continent: + $ref: "schemas.yaml#/components/schemas/ContinentCode" + region: + $ref: "schemas.yaml#/components/schemas/RegionName" + country: + $ref: "schemas.yaml#/components/schemas/CountryCode" + state: + $ref: "schemas.yaml#/components/schemas/StateCode" + city: + $ref: "schemas.yaml#/components/schemas/CityName" + asn: + $ref: "schemas.yaml#/components/schemas/AsnCode" + network: + $ref: "schemas.yaml#/components/schemas/NetworkName" + latitude: + $ref: "schemas.yaml#/components/schemas/Latitude" + longitude: + $ref: "schemas.yaml#/components/schemas/Longitude" + ProbeResolver: + description: A resolver defined in the probe. + anyOf: + - type: string + format: ipv4 + description: The IPv4 address of the resolver. + - type: string + const: private + description: Indicates that the resolver points to a private IP address. + ProbeResolvers: + type: array + description: An array of the default resolvers configured in the probe. + items: + $ref: "schemas.yaml#/components/schemas/ProbeResolver" + Probes: + type: array + description: An array containing information about each probe. + items: + $ref: "schemas.yaml#/components/schemas/Probe" + RegionName: + type: string + description: | + A geographic region name based on the UN standard ["Standard Country or Area Codes for Statistical Use (M49)"](https://unstats.un.org/unsd/methodology/m49/). + enum: + - Northern Africa + - Eastern Africa + - Middle Africa + - Southern Africa + - Western Africa + + - Caribbean + - Central America + - South America + - Northern America + + - Central Asia + - Eastern Asia + - South-eastern Asia + - Southern Asia + - Western Asia + + - Eastern Europe + - Northern Europe + - Southern Europe + - Western Europe + + - Australia and New Zealand + - Melanesia + - Micronesia + - Polynesia + ResolvedAddress: + type: string + description: The resolved IP address of the `target`. + ResolvedHostname: + type: + - string + - "null" + format: hostname + description: The resolved hostname of the `target`. + StateCode: + type: + - string + - "null" + description: A two-letter [US state code](https://www.faa.gov/air_traffic/publications/atpubs/cnt_html/appendix_a.html). + StatsRttMin: + type: number + description: The lowest round-trip time value. + StatsRttMinNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The lowest round-trip time value. + StatsRttAvg: + type: number + description: The average round-trip time value. + StatsRttAvgNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The average round-trip time value. + StatsRttMax: + type: number + description: The highest round-trip time value. + StatsRttMaxNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The highest round-trip time value. + StatsPacketsTotal: + type: integer + description: The number of packets sent. + StatsPacketsRcv: + type: integer + description: The number of received packets. + StatsPacketsDrop: + type: integer + description: The number of dropped packets (`total` - `rcv`). + StatsPacketsLoss: + type: number + description: The percentage of dropped packets. + StatsJitterMin: + type: number + description: The lowest jitter value. + StatsJitterAvg: + type: number + description: The average jitter value. + StatsJitterMax: + type: number + description: The highest jitter value. + StatsStDev: + type: number + description: The standard deviation of the round-trip time values. + Tags: + type: array + description: | + An array of additional values to fine-tune probe selection: + - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` + - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between probes hosted in datacenter and end-user locations. + items: + type: string + TestResult: + description: Contains a test's result data. + anyOf: + - $ref: "schemas.yaml#/components/schemas/InProgressTestResult" + - $ref: "schemas.yaml#/components/schemas/FailedTestResult" + - $ref: "schemas.yaml#/components/schemas/OfflineTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + BaseFinishedTestResult: + type: object + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/FinishedTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + InProgressTestResult: + type: object + title: InProgressTestResult + description: | + Contains information about a test that has the test status `in-progress`. + Note that most of the response fields are not available. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/InProgressTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + FailedTestResult: + type: object + title: FailedTestResult + description: | + Contains information about a test that has the status `failed`. + Note that most of the response fields are not available. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/FailedTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + OfflineTestResult: + type: object + title: OfflineTestResult + description: | + Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. + Note that most of the response fields are not available. + > **Note:** This is only possible if you pass the ID of one of your existing measurements to the `locations` property of a new measurement request. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/OfflineTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + FinishedPingTestResult: + title: FinishedPingTestResult + description: Contains the results for a ping test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - stats + - timings + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + stats: + type: object + description: | + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. + All times are given in milliseconds. + required: + - min + - avg + - max + - total + - rcv + - drop + - loss + properties: + min: + $ref: "schemas.yaml#/components/schemas/StatsRttMinNullable" + avg: + $ref: "schemas.yaml#/components/schemas/StatsRttAvgNullable" + max: + $ref: "schemas.yaml#/components/schemas/StatsRttMaxNullable" + total: + $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + rcv: + $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + drop: + $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + loss: + $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are given in milliseconds. + items: + type: object + required: + - rtt + - ttl + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + ttl: + $ref: "schemas.yaml#/components/schemas/TimingPacketTtl" + FinishedTracerouteTestResult: + title: FinishedTracerouteTestResult + description: Contains the results for a traceroute test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - hops + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + hops: + type: array + description: An array containing details about each hop. + items: + type: object + required: + - resolvedAddress + - resolvedHostname + - timings + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are given in milliseconds. + items: + type: object + required: + - rtt + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + FinishedDnsTestResult: + title: FinishedDnsTestResult + description: Contains the results for a DNS test. + anyOf: + - $ref: "schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedTraceDnsTestResult" + DnsStatusCode: + type: integer + description: The DNS [response code](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). + DnsStatusCodeName: + type: string + description: The DNS [response code name](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). + HttpStatusCode: + type: integer + description: The HTTP response status code. + HttpStatusCodeName: + type: string + description: The HTTP response status code name. + FinishedSimpleDnsTestResult: + title: FinishedSimpleDnsTestResult + description: Contains the results for a DNS test with `trace` disabled. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - statusCode + - statusCodeName + properties: + statusCode: + $ref: "schemas.yaml#/components/schemas/DnsStatusCode" + statusCodeName: + $ref: "schemas.yaml#/components/schemas/DnsStatusCodeName" + - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + FinishedTraceDnsTestResult: + title: FinishedTraceDnsTestResult + description: Contains the results for a DNS test with `trace` enabled. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - hops + properties: + hops: + type: array + description: An array containing details about each hop. + items: + $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + DnsTestHopResult: + type: object + required: + - resolver + - answers + - timings + properties: + resolver: + type: string + description: The hostname or IP of the resolver that answered the query. + answers: + type: array + description: An array of received resource records. + items: + $ref: "schemas.yaml#/components/schemas/DnsTestAnswer" + timings: + type: object + description: | + Contains details about the query times. + Times are given in milliseconds. + required: + - total + properties: + total: + type: number + description: The total query time. + DnsTestAnswer: + type: object + description: Contains the results from the `Answers` section of the DNS response message. + required: + - name + - type + - ttl + - class + - value + properties: + name: + type: string + description: The record's domain name. + type: + type: string + description: The record's type. + ttl: + type: integer + description: The record's time to live value in seconds. + class: + type: string + description: The record's class. + value: + type: string + description: The record's value. + FinishedMtrTestResult: + title: FinishedMtrTestResult + description: Contains the results for a mtr test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - hops + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + hops: + type: array + description: An array containing details about each hop. + items: + type: object + required: + - resolvedAddress + - resolvedHostname + - asn + - timings + - stats + properties: + resolvedAddress: + allOf: + - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + - description: The resolved IP address of this hop. + resolvedHostname: + allOf: + - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + - description: The resolved hostname of this hop. + asn: + type: array + description: An array containing the ASNs assigned to this hop. + items: + type: integer + stats: + type: object + description: | + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. + All times are given in milliseconds. + required: + - min + - avg + - max + - stDev + - jMin + - jAvg + - jMax + - total + - rcv + - drop + - loss + properties: + min: + $ref: "schemas.yaml#/components/schemas/StatsRttMin" + avg: + $ref: "schemas.yaml#/components/schemas/StatsRttAvg" + max: + $ref: "schemas.yaml#/components/schemas/StatsRttMax" + stDev: + $ref: "schemas.yaml#/components/schemas/StatsStDev" + jMin: + $ref: "schemas.yaml#/components/schemas/StatsJitterMin" + jAvg: + $ref: "schemas.yaml#/components/schemas/StatsJitterAvg" + jMax: + $ref: "schemas.yaml#/components/schemas/StatsJitterMax" + total: + $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + rcv: + $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + drop: + $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + loss: + $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are in milliseconds. + items: + type: object + required: + - rtt + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + FinishedHttpTestResult: + title: FinishedHttpTestResult + description: Contains the results for a HTTP test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - rawHeaders + - rawBody + - truncated + - headers + - resolvedAddress + - statusCode + - statusCodeName + - timings + - tls + properties: + rawHeaders: + type: string + description: The raw HTTP response headers. + rawBody: + type: string + description: | + The raw HTTP response body. + Note that the API only returns the first 10kb. + truncated: + type: boolean + description: | + Indicates whether the `rawBody` value was truncated due to being too big. + headers: + type: object + description: Contains the HTTP response headers. + additionalProperties: + type: string + statusCode: + $ref: "schemas.yaml#/components/schemas/HttpStatusCode" + statusCodeName: + $ref: "schemas.yaml#/components/schemas/HttpStatusCodeName" + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + timings: + type: object + description: | + Contains details about the HTTP request times. + Times are given in milliseconds. + required: + - total + - dns + - tcp + - tls + - firstByte + - download + properties: + total: + $ref: "schemas.yaml#/components/schemas/TimingHttpTotalNullable" + dns: + $ref: "schemas.yaml#/components/schemas/TimingHttpDnsNullable" + tcp: + $ref: "schemas.yaml#/components/schemas/TimingHttpTcpNullable" + tls: + $ref: "schemas.yaml#/components/schemas/TimingHttpTlsNullable" + firstByte: + $ref: "schemas.yaml#/components/schemas/TimingHttpFirstByteNullable" + download: + $ref: "schemas.yaml#/components/schemas/TimingHttpDownloadNullable" + tls: + description: Contains information about the TLS certificate. Is `null` if no TLS certificate is available. + oneOf: + - $ref: "schemas.yaml#/components/schemas/TlsCertificate" + - type: "null" + TestRawOutput: + type: string + description: | + The raw output of a measurement's test result. For example, you can use the output to display it to users. + However, don't parse the content of this property and instead use the individual values provided in other properties of the measurement's test result. + BaseTestStatus: + type: string + description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + InProgressTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: in-progress + FinishedTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: finished + FailedTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: failed + OfflineTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: offline + TimingPacketRtt: + type: number + description: The round-trip time for this packet. + TimingPacketTtl: + type: number + description: The time-to-live value of this packet. + TimingHttpTotalNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The total HTTP request time. + TimingHttpDnsNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time required to perform the DNS lookup. + TimingHttpTcpNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from performing the DNS lookup to establishing the TCP connection. + TimingHttpTlsNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from establishing the TCP connection to establishing the TLS session. + TimingHttpFirstByteNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from establishing the TCP/TLS connection to the first response byte. + TimingHttpDownloadNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from the first response byte to downloading the entire response. + TlsCertificate: + type: object + description: Contains information about a TLS certificate. + required: + - authorized + - createdAt + - expiresAt + - subject + - issuer + properties: + authorized: + type: boolean + description: | + Indicates whether a trusted authority signed the certificate. + error: + type: string + description: | + The reason why the certificate was rejected if `authorized` is `false`. + createdAt: + type: string + description: The creation date and time of the certificate. + format: date-time + expiresAt: + type: string + description: The expiration date and time of the certificate. + format: date-time + subject: + $ref: "schemas.yaml#/components/schemas/TlsCertificateSubject" + issuer: + $ref: "schemas.yaml#/components/schemas/TlsCertificateIssuer" + TlsCertificateIssuer: + type: object + description: Contains information about the TLS certificate's issuer. + required: + - C + - O + - CN + properties: + C: + type: string + description: The issuer's country. + O: + type: string + description: The issuer's organization. + CN: + type: string + description: The issuer's common name. + TlsCertificateSubject: + type: object + description: Contains information about the TLS certificate's subject. + required: + - CN + - alt + properties: + CN: + type: string + description: The subject's common name. + alt: + type: string + description: The subject's alternate names. diff --git a/public/v1/spec.yaml b/public/v1/spec.yaml index 83830ce3..6475f346 100644 --- a/public/v1/spec.yaml +++ b/public/v1/spec.yaml @@ -1,112 +1,119 @@ -openapi: 3.1.0 -info: - title: Globalping API - summary: The public Globalping API. - description: | - Monitor, debug, and benchmark your internet infrastructure from a globally distributed network of probes. - - ## Client guidelines - - If you implement an application interacting with the API, please consider the "client guidelines" - section of each endpoint below to provide the best UX and reduce the chance of your application breaking in the future. - - ### General guidelines for non-browser based apps: - - - Set a `User-Agent` header. The recommended format and approach is [as here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). - - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. The compression has a significant impact on the response size. - - When requesting the measurement status, implement ETag-based client-side caching using the `ETag`/`If-None-Match` headers. - - ## Endpoints - - https://api.globalping.io/v1/ - version: 1.0.0 - termsOfService: https://github.com/jsdelivr/globalping - contact: - url: https://github.com/jsdelivr/globalping/issues - email: d@jsdelivr.com - license: - name: Open Software License 3.0 - identifier: OSL-3.0 -servers: - - url: https://api.globalping.io -tags: - - name: Measurements -# description: TODO: some text can be here if needed - - name: Probes -paths: - /v1/measurements: - post: - summary: Create measurement - operationId: createMeasurement - description: | - Creates a new measurement with the configured parameters. - The measurement runs asynchronously and its current state can be retrieved - at the URL returned in the `Location` header. - - ### Client guidelines - - - Set the `inProgressUpdates` option to `true` if the application is running in interactive mode so that the user sees the results right away. - - If the application is interactive by default but also implements a "CI" mode to be used in scripts, do not set the flag in the CI mode. - - To perform multiple measurements from exactly the same probes, create a single measurement first, then pass its `id` in the `locations` option for the other measurements. - requestBody: - content: - application/json: - schema: - $ref: 'components/schemas.yaml#/components/schemas/MeasurementRequest' - examples: - pingLocations: - $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocations' - pingLocationsLimit: - $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit' - pingLocationsMagic: - $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic' - pingCustom: - $ref: 'components/examples.yaml#/components/examples/createMeasurementPingCustom' - pingLocationsMeasurementId: - $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId' - responses: - '202': - $ref: 'components/responses.yaml#/components/responses/measurements202' - '400': - $ref: 'components/responses.yaml#/components/responses/400' - '422': - $ref: 'components/responses.yaml#/components/responses/measurements422' - '429': - $ref: 'components/responses.yaml#/components/responses/measurements429' - tags: - - Measurements - /v1/measurements/{id}: - parameters: - - $ref: 'components/parameters.yaml#/components/parameters/measurementId' - get: - summary: Get measurement - operationId: getMeasurement - description: | - Retrieves data of an existing measurement. - A link to this endpoint is returned in the `Location` response header when creating the measurement. - The measurement is typically available for up to 7 days after creation. - - ### Client guidelines - - - Use the following algorithm for measurement result pooling: - 1. Request the measurement status. - 2. If the status is `in-progress`, wait 500 ms and repeat from step 1. Note that it is important to wait 500 ms *after* receiving the response, instead of simply using an "every 500 ms" interval. For large measurements, the request itself may take a few hundred milliseconds to complete. - 3. If the status is anything else, stop. The measurement is no longer running. Any value other than `in-progress` is final. - responses: - '200': - $ref: 'components/responses.yaml#/components/responses/measurement200' - '404': - $ref: 'components/responses.yaml#/components/responses/404' - tags: - - Measurements - /v1/probes: - get: - summary: List currently connected probes - operationId: listProbes - description: | - Returns a list of all currently connected probes and their metadata. - responses: - '200': - $ref: 'components/responses.yaml#/components/responses/probes200' - tags: - - Probes +openapi: 3.1.0 +info: + title: Globalping API + summary: The public Globalping API. + description: | + The Globalping API allows you to monitor, debug, and benchmark your internet infrastructure using a globally distributed network of probes. + + The API is public, free to use, and doesn't require authentication. + However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. + + Additionally, the API is RESTful, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes to indicate the success and failure of requests. + ## Client guidelines + + If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. + This way, you can provide the best UX and reduce the likelihood of your app breaking in the future. + + ### General guidelines for non-browser-based apps: + + - Set a `User-Agent` header. We recommend that you follow the format and approach [described here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). + - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. Compression has a significant impact on the response size! + - Implement ETag-based client-side caching using the `ETag`/`If-None-Match` headers when requesting the measurement status. + version: 1.0.0 + termsOfService: https://github.com/jsdelivr/globalping + contact: + name: Support + url: https://github.com/jsdelivr/globalping/issues + email: d@jsdelivr.com + license: + name: Open Software License 3.0 + identifier: OSL-3.0 +servers: + - url: https://api.globalping.io +tags: + - name: Measurements + description: Provides measurement-related operations. + - name: Probes + description: Provides probe-related operations. +paths: + /v1/measurements: + post: + summary: Create a measurement. + operationId: createMeasurement + description: | + Create a new measurement by configuring its attributes via the request body. On success, the endpoint returns the ID of the created measurement. + + > **Note**: The measurement runs asynchronously and you can call up the current state under the URL returned in the `Location` header, for example. + + ### Client guidelines + - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. + This feature is useful for apps running in an interactive mode where you want users to see the updates and results in real time. + - If you're building an app or feature for CI purposes where you want to use the finished measurement results in scripts, make sure that you either do not provide the property `inProgressUpdates` (default value is false) or explicitly set it to `false`. + - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. + requestBody: + description: Use the `MeasurementRequest` schema to create a new measurement that meets your requirements. + externalDocs: + description: Read our best practises on GitHub. + url: https://github.com/jsdelivr/globalping + content: + application/json: + schema: + $ref: "components/schemas.yaml#/components/schemas/MeasurementRequest" + examples: + pingLocations: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocations" + pingLocationsLimit: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit" + pingLocationsMagic: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic" + pingCustom: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingCustom" + pingLocationsMeasurementId: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId" + responses: + "202": + $ref: "components/responses.yaml#/components/responses/measurements202" + "400": + $ref: "components/responses.yaml#/components/responses/400" + "422": + $ref: "components/responses.yaml#/components/responses/measurements422" + "429": + $ref: "components/responses.yaml#/components/responses/measurements429" + tags: + - Measurements + /v1/measurements/{id}: + parameters: + - $ref: "components/parameters.yaml#/components/parameters/measurementId" + get: + summary: Get a measurement by ID. + operationId: getMeasurement + description: | + Get an existing measurement's current status and result by providing its ID. Measurements are typically available for up to 7 days after creation. + + > **Tip**: The "Create a measurement" endpoint returns a URL to this endpoint in the `Location` header! + + ### Client guidelines + As it can take a few seconds for a measurement to complete and provide results, you can query the status to determine whether the final results are available. Use the following process: + 1. Request the measurement to retrieve its `status`. + 2. If the `status` is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms _after_ receiving the response rather than using an interval of "every 500ms". This is because, for large measurements, the request can take a few hundred milliseconds to complete, meaning that you won't get any meaningful updates in a shorter query time frame. + 3. If the `status` has a value **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. + responses: + "200": + $ref: "components/responses.yaml#/components/responses/measurement200" + "404": + $ref: "components/responses.yaml#/components/responses/404" + tags: + - Measurements + /v1/probes: + get: + summary: List all probes currently online. + operationId: listProbes + description: | + Get a list of all probes currently online and their metadata, such as location and assigned tags. + + > **Note**: Probes don't expose unique IDs that you can use to explicitly select them. Instead, enter location data or the ID of an existing measurement when you create a new measurement to refine the probe selection. + responses: + "200": + $ref: "components/responses.yaml#/components/responses/probes200" + tags: + - Probes From 204d95616ca2e280fc2c75a0a5bac21ff79fee5b Mon Sep 17 00:00:00 2001 From: Sarah Mischinger Date: Mon, 22 Jan 2024 15:28:36 +0100 Subject: [PATCH 2/7] fix: correct externalDocs annotation --- public/v1/components/schemas.yaml | 5 ++++- public/v1/spec.yaml | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/v1/components/schemas.yaml b/public/v1/components/schemas.yaml index 95a0cbd3..28c6c4a5 100644 --- a/public/v1/components/schemas.yaml +++ b/public/v1/components/schemas.yaml @@ -423,7 +423,7 @@ components: type: object description: | Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. - + > **Note**: Use the `host` property in the same object to define the `Host` header. additionalProperties: type: string @@ -501,6 +501,9 @@ components: - http MeasurementRequest: description: Contains all the required data to create a measurement request. + externalDocs: + description: Read our best practises on GitHub. + url: https://github.com/jsdelivr/globalping allOf: - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" - type: object diff --git a/public/v1/spec.yaml b/public/v1/spec.yaml index 6475f346..27e58df5 100644 --- a/public/v1/spec.yaml +++ b/public/v1/spec.yaml @@ -52,9 +52,6 @@ paths: - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. requestBody: description: Use the `MeasurementRequest` schema to create a new measurement that meets your requirements. - externalDocs: - description: Read our best practises on GitHub. - url: https://github.com/jsdelivr/globalping content: application/json: schema: From ec5e94e2299007ff3132269ebdf8db0ee4408dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Mon, 22 Jan 2024 19:03:14 +0100 Subject: [PATCH 3/7] style: fix line separators --- public/v1/components/examples.yaml | 1544 +++++++-------- public/v1/components/headers.yaml | 38 +- public/v1/components/parameters.yaml | 20 +- public/v1/components/responses.yaml | 322 ++-- public/v1/components/schemas.yaml | 2592 +++++++++++++------------- public/v1/spec.yaml | 232 +-- 6 files changed, 2374 insertions(+), 2374 deletions(-) diff --git a/public/v1/components/examples.yaml b/public/v1/components/examples.yaml index 5ef5a440..1fd12788 100644 --- a/public/v1/components/examples.yaml +++ b/public/v1/components/examples.yaml @@ -1,772 +1,772 @@ -components: - examples: - probes: - value: - [ - { - "version": "0.20.0", - "location": - { - "continent": "NA", - "region": "Northern America", - "country": "US", - "state": "VA", - "city": "Ashburn", - "asn": 14618, - "network": "Amazon.com, Inc.", - "latitude": 39.0437, - "longitude": -77.4875, - }, - "tags": ["aws-us-east-1", "datacenter-network"], - "resolvers": ["private"], - }, - ] - createMeasurementPingLocations: - summary: "ping: specific locations" - description: Use the properties inside the `locations` object to define the locations from which the API should select probes. In this example, we're only defining values for `country`, but you can add other properties like `city`, `asn`, etc. to fine-tune the location. - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": [{ "country": "DE" }, { "country": "PL" }], - } - createMeasurementPingLocationsLimit: - summary: "ping: specific locations and limit" - description: Use the `limit` property to specify how many probes the API should pick per location. Alternatively, you can use the main object's global `limit` property to have the API determine the number of probes per location. If you don't define a limit value, the global limit value is set to 1. - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": - [{ "country": "DE", "limit": 4 }, { "country": "PL", "limit": 2 }], - } - createMeasurementPingLocationsMagic: - summary: "ping: magic location filter" - description: "Instead of configuring the object properties for each location, you can use the `magic` property. For example, rather than explicitly defining a country and a city, we can write `magic: country+city`, which gives the same result. We use the `magic` field for most of our Globalping integrations, as it allows for intuitive and versatile use. [Learn more about the magic field on GitHub](https://github.com/jsdelivr/globalping)." - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": - [ - { "magic": "FR" }, - { "magic": "Poland" }, - { "magic": "Berlin+Germany" }, - { "magic": "California" }, - { "magic": "Europe" }, - { "magic": "Western Europe" }, - { "magic": "AS13335" }, - { "magic": "aws-us-east-1" }, - { "magic": "Google" }, - ], - } - createMeasurementPingCustom: - summary: "ping: custom options" - description: The API takes various options to customize the measurement, which vary depending on the defined `type`. In this example, we set the number of packets to send for our ping tests. You can find all available options in the request body schema `MeasurementRequest`. - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "measurementOptions": { "packets": 6 }, - } - createMeasurementPingLocationsMeasurementId: - summary: "ping: previous measurement id" - description: If you want to reuse probes from a previous measurement, provide `locations` with the measurement ID. Note that probes may be offline and unavailable to run your measurement request! - value: - { - "type": "ping", - "target": "cdn.jsdelivr.net", - "locations": "1wzMrzLBZfaPoT1c", - } - createMeasurementResponse: - value: { "id": "PY5fMsREMmIq45VR", "probesCount": 1 } - getPingMeasurementResponse: - summary: "type: ping" - value: - { - "id": "nzGzfAGL7sZfUs3c", - "type": "ping", - "status": "finished", - "createdAt": "2023-07-14T18:25:52.414Z", - "updatedAt": "2023-07-14T18:25:53.207Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { "packets": 2 }, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "NZ", - "state": null, - "city": "Auckland", - "asn": 61138, - "longitude": 174.76667, - "latitude": -36.86667, - "network": "Zappie Host LLC", - "tags": ["datacenter-network"], - "resolvers": ["1.1.1.1", "8.8.8.8"], - }, - "result": - { - "status": "finished", - "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", - "resolvedAddress": "151.101.129.229", - "resolvedHostname": "151.101.129.229", - "timings": - [{ "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 }], - "stats": - { - "min": 24.174, - "max": 24.193, - "avg": 24.183, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - }, - }, - }, - ], - } - getTracerouteMeasurementResponse: - summary: "type: traceroute" - value: - { - "id": "MH97NFzqirjA9NZZ", - "type": "traceroute", - "status": "finished", - "createdAt": "2023-07-14T18:29:19.630Z", - "updatedAt": "2023-07-14T18:29:21.165Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 16276, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "OVH SAS", - "tags": ["datacenter-network"], - "resolvers": ["213.186.33.99"], - }, - "result": - { - "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", - "status": "finished", - "resolvedAddress": "104.16.85.20", - "resolvedHostname": "104.16.85.20", - "hops": - [ - { - "resolvedHostname": "172.68.208.3", - "resolvedAddress": "172.68.208.3", - "timings": [{ "rtt": 1.777 }, { "rtt": 1.778 }], - }, - { - "resolvedHostname": "104.16.85.20", - "resolvedAddress": "104.16.85.20", - "timings": [{ "rtt": 0.826 }, { "rtt": 0.733 }], - }, - ], - }, - }, - ], - } - getSimpleDnsMeasurementResponse: - summary: "type: dns" - value: - { - "id": "av5Z6kM6FXLAfKO0", - "type": "dns", - "status": "finished", - "createdAt": "2023-07-14T18:31:01.002Z", - "updatedAt": "2023-07-14T18:31:01.844Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 202422, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "G-Core Labs S.A.", - "tags": ["datacenter-network"], - "resolvers": ["8.8.8.8"], - }, - "result": - { - "status": "finished", - "statusCodeName": "NOERROR", - "statusCode": 0, - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", - "answers": - [ - { - "name": "cdn.jsdelivr.net.", - "type": "CNAME", - "ttl": 180, - "class": "IN", - "value": "jsdelivr.map.fastly.net.", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.1.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.65.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.129.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.193.229", - }, - ], - "timings": { "total": 99 }, - "resolver": "8.8.8.8", - }, - }, - ], - } - getTraceDnsMeasurementResponse: - summary: "type: dns + trace" - value: - { - "id": "xgaym4ha2736BCPe", - "type": "dns", - "status": "finished", - "createdAt": "2023-07-14T18:32:52.259Z", - "updatedAt": "2023-07-14T18:32:54.312Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { "trace": true }, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Melbourne", - "asn": 20473, - "longitude": 144.96332, - "latitude": -37.814, - "network": "Choopa, LLC", - "tags": [], - "resolvers": ["108.61.10.10"], - }, - "result": - { - "status": "finished", - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", - "hops": - [ - { - "answers": - [ - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "a.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "b.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "i.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "m.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "h.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "c.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "k.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "f.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "g.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "j.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "e.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "l.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "d.root-servers.net.", - }, - { - "name": ".", - "type": "RRSIG", - "ttl": 59490, - "class": "IN", - "value": "CIqSfQ==", - }, - ], - "timings": { "total": 1 }, - "resolver": "108.61.10.10", - }, - { - "answers": - [ - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "a.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "b.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "c.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "d.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "e.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "f.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "g.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "h.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "i.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "j.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "k.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "l.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "m.gtld-servers.net.", - }, - { - "name": "net.", - "type": "DS", - "ttl": 86400, - "class": "IN", - "value": "8BD973EE", - }, - { - "name": "net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "zTB3Jg== ", - }, - ], - "timings": { "total": 258 }, - "resolver": "h.root-servers.net", - }, - { - "answers": - [ - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "dns1.p01.nsone.net.", - }, - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "ns1.gcorelabs.net.", - }, - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "ns2.gcdn.services.", - }, - { - "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", - "type": "NSEC3", - "ttl": 86400, - "class": "IN", - "value": "NSEC3PARAM", - }, - { - "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==", - }, - { - "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", - "type": "NSEC3", - "ttl": 86400, - "class": "IN", - "value": "RRSIG", - }, - { - "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== ", - }, - ], - "timings": { "total": 231 }, - "resolver": "d.gtld-servers.net", - }, - { - "answers": - [ - { - "name": "cdn.jsdelivr.net.", - "type": "CNAME", - "ttl": 180, - "class": "IN", - "value": "jsdelivr.map.fastly.net.", - }, - ], - "timings": { "total": 0 }, - "resolver": "ns1.gcorelabs.net", - }, - ], - }, - }, - ], - } - getMtrMeasurementResponse: - summary: "type: mtr" - value: - { - "id": "1aJyGDZkWVGuXLYL", - "type": "mtr", - "status": "finished", - "createdAt": "2023-07-14T18:33:15.039Z", - "updatedAt": "2023-07-14T18:33:19.886Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": { "packets": 2 }, - "results": - [ - { - "probe": - { - "continent": "AF", - "region": "Southern Africa", - "country": "ZA", - "state": null, - "city": "Johannesburg", - "asn": 199524, - "longitude": 28.04355, - "latitude": -26.20225, - "network": "G-Core Labs S.A.", - "tags": ["datacenter-network"], - "resolvers": ["private"], - }, - "result": - { - "status": "finished", - "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", - "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229", - "hops": - [ - { - "stats": - { - "min": 176.348, - "max": 176.416, - "avg": 176.4, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - "stDev": 0, - "jMin": 0.1, - "jMax": 0.1, - "jAvg": 0.1, - }, - "asn": [174], - "timings": [{ "rtt": 176.348 }, { "rtt": 176.416 }], - "resolvedAddress": "149.6.2.38", - "resolvedHostname": "149.6.2.38", - }, - { - "stats": - { - "min": 178.287, - "max": 178.403, - "avg": 178.3, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - "stDev": 0.1, - "jMin": 0.1, - "jMax": 0.1, - "jAvg": 0.1, - }, - "asn": [54113], - "timings": [{ "rtt": 178.403 }, { "rtt": 178.287 }], - "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229", - }, - ], - }, - }, - ], - } - getHttpMeasurementResponse: - summary: "type: http" - value: - { - "id": "9J2BCohDSuxoiaOD", - "type": "http", - "status": "finished", - "createdAt": "2023-07-14T18:34:05.161Z", - "updatedAt": "2023-07-14T18:34:06.310Z", - "target": "cdn.jsdelivr.net", - "probesCount": 1, - "measurementOptions": - { "request": { "method": "GET", "path": "/npm/jquery" } }, - "results": - [ - { - "probe": - { - "continent": "AS", - "region": "Eastern Asia", - "country": "KR", - "state": null, - "city": "Seoul", - "asn": 40676, - "longitude": 126.977207, - "latitude": 37.566309, - "network": "Psychz Networks", - "tags": ["datacenter-network"], - "resolvers": ["8.8.8.8", "8.8.4.4"], - }, - "result": - { - "status": "finished", - "resolvedAddress": "104.16.88.20", - "headers": - { - "date": "Fri, 14 Jul 2023 18:34:05 GMT", - "content-type": "application/javascript; charset=utf-8", - "transfer-encoding": "chunked", - "connection": "close", - "access-control-allow-origin": "*", - "access-control-expose-headers": "*", - "timing-allow-origin": "*", - "cache-control": "public, max-age=604800, s-maxage=43200", - "cross-origin-resource-policy": "cross-origin", - "x-content-type-options": "nosniff", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-jsd-version": "3.7.0", - "x-jsd-version-type": "version", - "etag": 'W/"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y"', - "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", - "x-cache": "HIT, MISS", - "vary": "Accept-Encoding", - "alt-svc": 'h3=":443"; ma=86400', - "cf-cache-status": "HIT", - "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", - "nel": '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}', - "server": "cloudflare", - "cf-ray": "7e6bdb9999778a57-NRT", - "content-encoding": "br", - }, - "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", - "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "truncated": true, - "statusCode": 200, - "statusCodeName": "OK", - "timings": - { - "total": 325, - "download": 1, - "firstByte": 219, - "dns": 37, - "tls": 36, - "tcp": 32, - }, - "tls": - { - "authorized": true, - "createdAt": "2023-05-02T00:00:00.000Z", - "expiresAt": "2024-05-01T23:59:59.000Z", - "issuer": - { - "C": "US", - "O": "Cloudflare, Inc.", - "CN": "Cloudflare Inc ECC CA-3", - }, - "subject": - { - "C": "US", - "ST": "California", - "L": "San Francisco", - "O": "Cloudflare, Inc.", - "CN": "sni.cloudflaressl.com", - "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com", - }, - }, - }, - }, - ], - } +components: + examples: + probes: + value: + [ + { + "version": "0.20.0", + "location": + { + "continent": "NA", + "region": "Northern America", + "country": "US", + "state": "VA", + "city": "Ashburn", + "asn": 14618, + "network": "Amazon.com, Inc.", + "latitude": 39.0437, + "longitude": -77.4875, + }, + "tags": ["aws-us-east-1", "datacenter-network"], + "resolvers": ["private"], + }, + ] + createMeasurementPingLocations: + summary: "ping: specific locations" + description: Use the properties inside the `locations` object to define the locations from which the API should select probes. In this example, we're only defining values for `country`, but you can add other properties like `city`, `asn`, etc. to fine-tune the location. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": [{ "country": "DE" }, { "country": "PL" }], + } + createMeasurementPingLocationsLimit: + summary: "ping: specific locations and limit" + description: Use the `limit` property to specify how many probes the API should pick per location. Alternatively, you can use the main object's global `limit` property to have the API determine the number of probes per location. If you don't define a limit value, the global limit value is set to 1. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": + [{ "country": "DE", "limit": 4 }, { "country": "PL", "limit": 2 }], + } + createMeasurementPingLocationsMagic: + summary: "ping: magic location filter" + description: "Instead of configuring the object properties for each location, you can use the `magic` property. For example, rather than explicitly defining a country and a city, we can write `magic: country+city`, which gives the same result. We use the `magic` field for most of our Globalping integrations, as it allows for intuitive and versatile use. [Learn more about the magic field on GitHub](https://github.com/jsdelivr/globalping)." + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": + [ + { "magic": "FR" }, + { "magic": "Poland" }, + { "magic": "Berlin+Germany" }, + { "magic": "California" }, + { "magic": "Europe" }, + { "magic": "Western Europe" }, + { "magic": "AS13335" }, + { "magic": "aws-us-east-1" }, + { "magic": "Google" }, + ], + } + createMeasurementPingCustom: + summary: "ping: custom options" + description: The API takes various options to customize the measurement, which vary depending on the defined `type`. In this example, we set the number of packets to send for our ping tests. You can find all available options in the request body schema `MeasurementRequest`. + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "measurementOptions": { "packets": 6 }, + } + createMeasurementPingLocationsMeasurementId: + summary: "ping: previous measurement id" + description: If you want to reuse probes from a previous measurement, provide `locations` with the measurement ID. Note that probes may be offline and unavailable to run your measurement request! + value: + { + "type": "ping", + "target": "cdn.jsdelivr.net", + "locations": "1wzMrzLBZfaPoT1c", + } + createMeasurementResponse: + value: { "id": "PY5fMsREMmIq45VR", "probesCount": 1 } + getPingMeasurementResponse: + summary: "type: ping" + value: + { + "id": "nzGzfAGL7sZfUs3c", + "type": "ping", + "status": "finished", + "createdAt": "2023-07-14T18:25:52.414Z", + "updatedAt": "2023-07-14T18:25:53.207Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "packets": 2 }, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "NZ", + "state": null, + "city": "Auckland", + "asn": 61138, + "longitude": 174.76667, + "latitude": -36.86667, + "network": "Zappie Host LLC", + "tags": ["datacenter-network"], + "resolvers": ["1.1.1.1", "8.8.8.8"], + }, + "result": + { + "status": "finished", + "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", + "resolvedAddress": "151.101.129.229", + "resolvedHostname": "151.101.129.229", + "timings": + [{ "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 }], + "stats": + { + "min": 24.174, + "max": 24.193, + "avg": 24.183, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + }, + }, + }, + ], + } + getTracerouteMeasurementResponse: + summary: "type: traceroute" + value: + { + "id": "MH97NFzqirjA9NZZ", + "type": "traceroute", + "status": "finished", + "createdAt": "2023-07-14T18:29:19.630Z", + "updatedAt": "2023-07-14T18:29:21.165Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 16276, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "OVH SAS", + "tags": ["datacenter-network"], + "resolvers": ["213.186.33.99"], + }, + "result": + { + "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", + "status": "finished", + "resolvedAddress": "104.16.85.20", + "resolvedHostname": "104.16.85.20", + "hops": + [ + { + "resolvedHostname": "172.68.208.3", + "resolvedAddress": "172.68.208.3", + "timings": [{ "rtt": 1.777 }, { "rtt": 1.778 }], + }, + { + "resolvedHostname": "104.16.85.20", + "resolvedAddress": "104.16.85.20", + "timings": [{ "rtt": 0.826 }, { "rtt": 0.733 }], + }, + ], + }, + }, + ], + } + getSimpleDnsMeasurementResponse: + summary: "type: dns" + value: + { + "id": "av5Z6kM6FXLAfKO0", + "type": "dns", + "status": "finished", + "createdAt": "2023-07-14T18:31:01.002Z", + "updatedAt": "2023-07-14T18:31:01.844Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 202422, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "G-Core Labs S.A.", + "tags": ["datacenter-network"], + "resolvers": ["8.8.8.8"], + }, + "result": + { + "status": "finished", + "statusCodeName": "NOERROR", + "statusCode": 0, + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", + "answers": + [ + { + "name": "cdn.jsdelivr.net.", + "type": "CNAME", + "ttl": 180, + "class": "IN", + "value": "jsdelivr.map.fastly.net.", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.1.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.65.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.129.229", + }, + { + "name": "jsdelivr.map.fastly.net.", + "type": "A", + "ttl": 23, + "class": "IN", + "value": "151.101.193.229", + }, + ], + "timings": { "total": 99 }, + "resolver": "8.8.8.8", + }, + }, + ], + } + getTraceDnsMeasurementResponse: + summary: "type: dns + trace" + value: + { + "id": "xgaym4ha2736BCPe", + "type": "dns", + "status": "finished", + "createdAt": "2023-07-14T18:32:52.259Z", + "updatedAt": "2023-07-14T18:32:54.312Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "trace": true }, + "results": + [ + { + "probe": + { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Melbourne", + "asn": 20473, + "longitude": 144.96332, + "latitude": -37.814, + "network": "Choopa, LLC", + "tags": [], + "resolvers": ["108.61.10.10"], + }, + "result": + { + "status": "finished", + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", + "hops": + [ + { + "answers": + [ + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "a.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "b.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "i.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "m.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "h.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "c.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "k.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "f.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "g.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "j.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "e.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "l.root-servers.net.", + }, + { + "name": ".", + "type": "NS", + "ttl": 59490, + "class": "IN", + "value": "d.root-servers.net.", + }, + { + "name": ".", + "type": "RRSIG", + "ttl": 59490, + "class": "IN", + "value": "CIqSfQ==", + }, + ], + "timings": { "total": 1 }, + "resolver": "108.61.10.10", + }, + { + "answers": + [ + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "a.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "b.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "c.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "d.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "e.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "f.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "g.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "h.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "i.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "j.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "k.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "l.gtld-servers.net.", + }, + { + "name": "net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "m.gtld-servers.net.", + }, + { + "name": "net.", + "type": "DS", + "ttl": 86400, + "class": "IN", + "value": "8BD973EE", + }, + { + "name": "net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "zTB3Jg== ", + }, + ], + "timings": { "total": 258 }, + "resolver": "h.root-servers.net", + }, + { + "answers": + [ + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "dns1.p01.nsone.net.", + }, + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "ns1.gcorelabs.net.", + }, + { + "name": "jsdelivr.net.", + "type": "NS", + "ttl": 172800, + "class": "IN", + "value": "ns2.gcdn.services.", + }, + { + "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", + "type": "NSEC3", + "ttl": 86400, + "class": "IN", + "value": "NSEC3PARAM", + }, + { + "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==", + }, + { + "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", + "type": "NSEC3", + "ttl": 86400, + "class": "IN", + "value": "RRSIG", + }, + { + "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", + "type": "RRSIG", + "ttl": 86400, + "class": "IN", + "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== ", + }, + ], + "timings": { "total": 231 }, + "resolver": "d.gtld-servers.net", + }, + { + "answers": + [ + { + "name": "cdn.jsdelivr.net.", + "type": "CNAME", + "ttl": 180, + "class": "IN", + "value": "jsdelivr.map.fastly.net.", + }, + ], + "timings": { "total": 0 }, + "resolver": "ns1.gcorelabs.net", + }, + ], + }, + }, + ], + } + getMtrMeasurementResponse: + summary: "type: mtr" + value: + { + "id": "1aJyGDZkWVGuXLYL", + "type": "mtr", + "status": "finished", + "createdAt": "2023-07-14T18:33:15.039Z", + "updatedAt": "2023-07-14T18:33:19.886Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": { "packets": 2 }, + "results": + [ + { + "probe": + { + "continent": "AF", + "region": "Southern Africa", + "country": "ZA", + "state": null, + "city": "Johannesburg", + "asn": 199524, + "longitude": 28.04355, + "latitude": -26.20225, + "network": "G-Core Labs S.A.", + "tags": ["datacenter-network"], + "resolvers": ["private"], + }, + "result": + { + "status": "finished", + "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", + "resolvedAddress": "151.101.1.229", + "resolvedHostname": "151.101.1.229", + "hops": + [ + { + "stats": + { + "min": 176.348, + "max": 176.416, + "avg": 176.4, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + "stDev": 0, + "jMin": 0.1, + "jMax": 0.1, + "jAvg": 0.1, + }, + "asn": [174], + "timings": [{ "rtt": 176.348 }, { "rtt": 176.416 }], + "resolvedAddress": "149.6.2.38", + "resolvedHostname": "149.6.2.38", + }, + { + "stats": + { + "min": 178.287, + "max": 178.403, + "avg": 178.3, + "total": 2, + "loss": 0, + "rcv": 2, + "drop": 0, + "stDev": 0.1, + "jMin": 0.1, + "jMax": 0.1, + "jAvg": 0.1, + }, + "asn": [54113], + "timings": [{ "rtt": 178.403 }, { "rtt": 178.287 }], + "resolvedAddress": "151.101.1.229", + "resolvedHostname": "151.101.1.229", + }, + ], + }, + }, + ], + } + getHttpMeasurementResponse: + summary: "type: http" + value: + { + "id": "9J2BCohDSuxoiaOD", + "type": "http", + "status": "finished", + "createdAt": "2023-07-14T18:34:05.161Z", + "updatedAt": "2023-07-14T18:34:06.310Z", + "target": "cdn.jsdelivr.net", + "probesCount": 1, + "measurementOptions": + { "request": { "method": "GET", "path": "/npm/jquery" } }, + "results": + [ + { + "probe": + { + "continent": "AS", + "region": "Eastern Asia", + "country": "KR", + "state": null, + "city": "Seoul", + "asn": 40676, + "longitude": 126.977207, + "latitude": 37.566309, + "network": "Psychz Networks", + "tags": ["datacenter-network"], + "resolvers": ["8.8.8.8", "8.8.4.4"], + }, + "result": + { + "status": "finished", + "resolvedAddress": "104.16.88.20", + "headers": + { + "date": "Fri, 14 Jul 2023 18:34:05 GMT", + "content-type": "application/javascript; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "close", + "access-control-allow-origin": "*", + "access-control-expose-headers": "*", + "timing-allow-origin": "*", + "cache-control": "public, max-age=604800, s-maxage=43200", + "cross-origin-resource-policy": "cross-origin", + "x-content-type-options": "nosniff", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "x-jsd-version": "3.7.0", + "x-jsd-version-type": "version", + "etag": 'W/"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y"', + "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", + "x-cache": "HIT, MISS", + "vary": "Accept-Encoding", + "alt-svc": 'h3=":443"; ma=86400', + "cf-cache-status": "HIT", + "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", + "nel": '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}', + "server": "cloudflare", + "cf-ray": "7e6bdb9999778a57-NRT", + "content-encoding": "br", + }, + "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", + "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "truncated": true, + "statusCode": 200, + "statusCodeName": "OK", + "timings": + { + "total": 325, + "download": 1, + "firstByte": 219, + "dns": 37, + "tls": 36, + "tcp": 32, + }, + "tls": + { + "authorized": true, + "createdAt": "2023-05-02T00:00:00.000Z", + "expiresAt": "2024-05-01T23:59:59.000Z", + "issuer": + { + "C": "US", + "O": "Cloudflare, Inc.", + "CN": "Cloudflare Inc ECC CA-3", + }, + "subject": + { + "C": "US", + "ST": "California", + "L": "San Francisco", + "O": "Cloudflare, Inc.", + "CN": "sni.cloudflaressl.com", + "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com", + }, + }, + }, + }, + ], + } diff --git a/public/v1/components/headers.yaml b/public/v1/components/headers.yaml index 8fa1dbdf..7cf1e5b2 100644 --- a/public/v1/components/headers.yaml +++ b/public/v1/components/headers.yaml @@ -1,19 +1,19 @@ -components: - headers: - MeasurementLocation: - description: A link to the newly created measurement. - schema: - type: string - format: uri - RateLimitLimit: - description: The number of requests available in a given time window. - schema: - type: integer - RateLimitRemaining: - description: The number of requests remaining in the current time window. - schema: - type: integer - RateLimitReset: - description: The number of seconds until the limit resets. - schema: - type: integer +components: + headers: + MeasurementLocation: + description: A link to the newly created measurement. + schema: + type: string + format: uri + RateLimitLimit: + description: The number of requests available in a given time window. + schema: + type: integer + RateLimitRemaining: + description: The number of requests remaining in the current time window. + schema: + type: integer + RateLimitReset: + description: The number of seconds until the limit resets. + schema: + type: integer diff --git a/public/v1/components/parameters.yaml b/public/v1/components/parameters.yaml index 32f8c808..9223048a 100644 --- a/public/v1/components/parameters.yaml +++ b/public/v1/components/parameters.yaml @@ -1,10 +1,10 @@ -components: - parameters: - measurementId: - description: The ID of the measurement you want to retrieve. - example: nzGzfAGL7sZfUs3c # can be removed if not wanted - in: path - name: id - required: true - schema: - type: string +components: + parameters: + measurementId: + description: The ID of the measurement you want to retrieve. + example: nzGzfAGL7sZfUs3c # can be removed if not wanted + in: path + name: id + required: true + schema: + type: string diff --git a/public/v1/components/responses.yaml b/public/v1/components/responses.yaml index 005a348c..e2250d59 100644 --- a/public/v1/components/responses.yaml +++ b/public/v1/components/responses.yaml @@ -1,161 +1,161 @@ -components: - responses: - "400": - description: If the API can't process the request due to malformed parameters or other client errors, the response returns the HTTP `400 BAD REQUEST` status code and a JSON response body with more information about the error. - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - description: Contains information about an error. - required: - - type - - message - properties: - type: - type: string - description: The type of the error provided as one string value. - message: - type: string - description: The human-readable description of the error. - params: - type: object - description: Contains additional information. - additionalProperties: - type: string - examples: - json: - value: - error: - type: validation_error - message: Parameter validation failed. - params: - measurement: '\"measurement\" does not match any of the allowed types' - "404": - description: If the service can't find the requested resource, the response returns the HTTP `400 NOT FOUND` status code and a JSON response body containing more information about the error. - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: not_found - message: Couldn't find the requested item. - measurements422: - description: If the API can't find suitable probes for your request, the response returns the HTTP `422 UNPROCESSABLE CONTENT` status code and a JSON response body with more information about the error. Please modify your request before trying again. - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: no_probes_found - message: No suitable probes found. - measurements429: - description: If you've exceeded the API's rate limit, the response returns the status code `429 TOO MANY REQUEST` and a JSON response body containing more information about the error. Please review our [API rate limits](https://github.com/jsdelivr/globalping). - content: - application/json: - schema: - type: object - required: - - error - properties: - error: - type: object - required: - - type - - message - properties: - type: - type: string - message: - type: string - examples: - json: - value: - error: - type: rate_limit_exceeded - message: API rate limit exceeded. - measurements202: - description: If the API accepts the request for processing, the response returns the status code `202 ACCEPTED` and a JSON response body containing the ID of the newly created measurement. You can use the URL from the `Location` header as a link to view the measurement status. - headers: - Location: - $ref: "headers.yaml#/components/headers/MeasurementLocation" - X-RateLimit-Limit: - $ref: "headers.yaml#/components/headers/RateLimitLimit" - X-RateLimit-Remaining: - $ref: "headers.yaml#/components/headers/RateLimitRemaining" - X-RateLimit-Reset: - $ref: "headers.yaml#/components/headers/RateLimitReset" - content: - application/json: - schema: - $ref: "schemas.yaml#/components/schemas/CreateMeasurementResponse" - examples: - "0": - $ref: "examples.yaml#/components/examples/createMeasurementResponse" - measurement200: - description: A successful request returns the status code `200 OK` and a JSON response body containing the requested measurement results. - content: - application/json: - schema: - allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" - - $ref: "schemas.yaml#/components/schemas/MeasurementResultsConditions" - - $ref: "schemas.yaml#/components/schemas/MeasurementResponse" - examples: - pingMeasurement: - $ref: "examples.yaml#/components/examples/getPingMeasurementResponse" - tracerouteMeasurement: - $ref: "examples.yaml#/components/examples/getTracerouteMeasurementResponse" - simpleDnsMeasurement: - $ref: "examples.yaml#/components/examples/getSimpleDnsMeasurementResponse" - traceDnsMeasurement: - $ref: "examples.yaml#/components/examples/getTraceDnsMeasurementResponse" - mtrMeasurement: - $ref: "examples.yaml#/components/examples/getMtrMeasurementResponse" - httpMeasurement: - $ref: "examples.yaml#/components/examples/getHttpMeasurementResponse" - probes200: - description: A successful request returns the status code `200 OK` and a JSON response body containing a list of all currently online probes and their metadata. - content: - application/json: - schema: - $ref: "schemas.yaml#/components/schemas/Probes" - examples: - "0": - $ref: "examples.yaml#/components/examples/probes" +components: + responses: + "400": + description: If the API can't process the request due to malformed parameters or other client errors, the response returns the HTTP `400 BAD REQUEST` status code and a JSON response body with more information about the error. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + description: Contains information about an error. + required: + - type + - message + properties: + type: + type: string + description: The type of the error provided as one string value. + message: + type: string + description: The human-readable description of the error. + params: + type: object + description: Contains additional information. + additionalProperties: + type: string + examples: + json: + value: + error: + type: validation_error + message: Parameter validation failed. + params: + measurement: '\"measurement\" does not match any of the allowed types' + "404": + description: If the service can't find the requested resource, the response returns the HTTP `400 NOT FOUND` status code and a JSON response body containing more information about the error. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: not_found + message: Couldn't find the requested item. + measurements422: + description: If the API can't find suitable probes for your request, the response returns the HTTP `422 UNPROCESSABLE CONTENT` status code and a JSON response body with more information about the error. Please modify your request before trying again. + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: no_probes_found + message: No suitable probes found. + measurements429: + description: If you've exceeded the API's rate limit, the response returns the status code `429 TOO MANY REQUEST` and a JSON response body containing more information about the error. Please review our [API rate limits](https://github.com/jsdelivr/globalping). + content: + application/json: + schema: + type: object + required: + - error + properties: + error: + type: object + required: + - type + - message + properties: + type: + type: string + message: + type: string + examples: + json: + value: + error: + type: rate_limit_exceeded + message: API rate limit exceeded. + measurements202: + description: If the API accepts the request for processing, the response returns the status code `202 ACCEPTED` and a JSON response body containing the ID of the newly created measurement. You can use the URL from the `Location` header as a link to view the measurement status. + headers: + Location: + $ref: "headers.yaml#/components/headers/MeasurementLocation" + X-RateLimit-Limit: + $ref: "headers.yaml#/components/headers/RateLimitLimit" + X-RateLimit-Remaining: + $ref: "headers.yaml#/components/headers/RateLimitRemaining" + X-RateLimit-Reset: + $ref: "headers.yaml#/components/headers/RateLimitReset" + content: + application/json: + schema: + $ref: "schemas.yaml#/components/schemas/CreateMeasurementResponse" + examples: + "0": + $ref: "examples.yaml#/components/examples/createMeasurementResponse" + measurement200: + description: A successful request returns the status code `200 OK` and a JSON response body containing the requested measurement results. + content: + application/json: + schema: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" + - $ref: "schemas.yaml#/components/schemas/MeasurementResultsConditions" + - $ref: "schemas.yaml#/components/schemas/MeasurementResponse" + examples: + pingMeasurement: + $ref: "examples.yaml#/components/examples/getPingMeasurementResponse" + tracerouteMeasurement: + $ref: "examples.yaml#/components/examples/getTracerouteMeasurementResponse" + simpleDnsMeasurement: + $ref: "examples.yaml#/components/examples/getSimpleDnsMeasurementResponse" + traceDnsMeasurement: + $ref: "examples.yaml#/components/examples/getTraceDnsMeasurementResponse" + mtrMeasurement: + $ref: "examples.yaml#/components/examples/getMtrMeasurementResponse" + httpMeasurement: + $ref: "examples.yaml#/components/examples/getHttpMeasurementResponse" + probes200: + description: A successful request returns the status code `200 OK` and a JSON response body containing a list of all currently online probes and their metadata. + content: + application/json: + schema: + $ref: "schemas.yaml#/components/schemas/Probes" + examples: + "0": + $ref: "examples.yaml#/components/examples/probes" diff --git a/public/v1/components/schemas.yaml b/public/v1/components/schemas.yaml index 28c6c4a5..5524a6d5 100644 --- a/public/v1/components/schemas.yaml +++ b/public/v1/components/schemas.yaml @@ -1,1296 +1,1296 @@ -components: - schemas: - AsnCode: - type: integer - description: An autonomous system number (ASN). - CountryCode: - type: string - description: A two-letter country code based on [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Current_codes). - ContinentCode: - type: string - description: A two-letter continent code. - enum: - - AF - - AN - - AS - - EU - - NA - - OC - - SA - CityName: - type: string - description: A city name in English. - CreateMeasurementResponse: - description: Contains information about the newly created measurement request, such as its ID. - type: object - required: - - id - - probesCount - properties: - id: - type: string - description: | - The identifier of the measurement. - > **Tip**: You can use the ID to create a new measurement request, reusing the same probes. - probesCount: - $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" - Latitude: - type: number - description: The probe location's latitude. - Longitude: - type: number - description: The probe location's longitude. - MeasurementLimit: - type: integer - description: | - The maximum number of probes that should run the measurement. The actual number of selected probes may vary, depending on their availability. - This property is mutually exclusive with the `locations` object's `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. - minimum: 1 - maximum: 500 - default: 1 - MeasurementLocationOption: - type: object - description: Contains location data that tells the API where to select the probes. - additionalProperties: false - properties: - continent: - $ref: "schemas.yaml#/components/schemas/ContinentCode" - region: - $ref: "schemas.yaml#/components/schemas/RegionName" - country: - $ref: "schemas.yaml#/components/schemas/CountryCode" - state: - $ref: "schemas.yaml#/components/schemas/StateCode" - city: - $ref: "schemas.yaml#/components/schemas/CityName" - asn: - $ref: "schemas.yaml#/components/schemas/AsnCode" - network: - $ref: "schemas.yaml#/components/schemas/NetworkName" - tags: - $ref: "schemas.yaml#/components/schemas/Tags" - magic: - type: string - description: | - The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. - You can specify the full names, ISO codes (if applicable), and common aliases. If you want to combine several conditions, use the `+` character. - limit: - type: integer - description: | - The maximum number of probes that should perform the measurement at this location. The actual number of selected probes may vary, depending on their availability. - This property is mutually exclusive with the global `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. - minimum: 1 - maximum: 200 - default: 1 - MeasurementLocations: - oneOf: - - type: array - description: | - An array of `location` objects from which to run the tests. Each object specifies a location using one or more properties, such as country, city, ASN, etc. - items: - $ref: "schemas.yaml#/components/schemas/MeasurementLocationOption" - - type: string - description: | - The ID of a previous measurement whose probes you want to reuse in the same order. - You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. - Also note that once the original measurement expires, any subsequent request using the expired ID returns a `422` error. - MeasurementOptions: - description: Contains additional request options that depend on the measurement `type` you want to run. - anyOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" - MeasurementOptionsConditions: - allOf: - - if: - type: object - properties: - type: - const: ping - then: - type: object - properties: - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" - - if: - type: object - properties: - type: - const: traceroute - then: - type: object - properties: - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" - - if: - type: object - properties: - type: - const: dns - then: - type: object - properties: - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" - - if: - type: object - properties: - type: - const: mtr - then: - type: object - properties: - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" - - if: - type: object - properties: - type: - const: http - then: - type: object - properties: - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" - MeasurementResultsConditions: - allOf: - - if: - type: object - properties: - type: - const: ping - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" - - if: - type: object - properties: - type: - const: traceroute - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" - - if: - type: object - properties: - type: - const: dns - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" - - if: - type: object - properties: - type: - const: mtr - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" - - if: - type: object - properties: - type: - const: http - results: - type: array - items: - type: object - properties: - result: - type: object - properties: - status: - const: finished - - then: - type: object - properties: - results: - type: array - items: - type: object - properties: - result: - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" - MeasurementPingOptions: - type: object - title: PingOptions - description: Contains additional configuration options for ping measurement requests. - additionalProperties: false - properties: - packets: - type: integer - description: The number of packets to send. - default: 3 - minimum: 1 - maximum: 16 - MeasurementTracerouteOptions: - type: object - title: TracerouteOptions - description: Contains additional configuration options for traceroute measurement requests. - additionalProperties: false - properties: - port: - type: integer - description: The destination port for the data packets. - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - description: The transport protocol to use. - enum: - - ICMP - - TCP - - UDP - default: ICMP - MeasurementDnsOptions: - type: object - title: DnsOptions - description: Contains additional configuration options for DNS measurement requests. - additionalProperties: false - properties: - query: - type: object - description: The type of DNS query. - additionalProperties: false - properties: - type: - type: string - enum: - - A - - AAAA - - ANY - - CNAME - - DNSKEY - - DS - - MX - - NS - - NSEC - - PTR - - RRSIG - - SOA - - TXT - - SRV - default: A - resolver: - $ref: "schemas.yaml#/components/schemas/MeasurementResolver" - port: - type: integer - description: The port number to send the query to. - minimum: 0 - maximum: 65535 - default: 53 - protocol: - type: string - description: The protocol to use for the DNS query. - enum: - - TCP - - UDP - default: UDP - trace: - type: boolean - description: Toggle delegation path tracing from the root servers down to the target domain name. - default: false - MeasurementMtrOptions: - type: object - title: MtrOptions - description: Contains additional configuration options for mtr measurement requests. - additionalProperties: false - properties: - port: - type: integer - description: The port number to use. - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - description: The transport protocol to use. - enum: - - ICMP - - TCP - - UDP - default: ICMP - packets: - type: integer - description: The number of packets to send to each hop. - default: 3 - minimum: 1 - maximum: 16 - MeasurementHttpOptions: - type: object - title: HttpOptions - description: Contains additional configuration options for HTTP measurement requests. - additionalProperties: false - properties: - request: - type: object - description: Contains the HTTP request properties to use. - additionalProperties: false - properties: - host: - type: string - description: | - The `Host` header to add to the request. The default value is based on the measurement request's `target`. - path: - type: string - description: The URL pathname. - query: - type: string - description: A query string to add to the request. - method: - type: string - description: The HTTP method to use. - enum: - - HEAD - - GET - default: HEAD - headers: - type: object - description: | - Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. - - > **Note**: Use the `host` property in the same object to define the `Host` header. - additionalProperties: - type: string - resolver: - $ref: "schemas.yaml#/components/schemas/MeasurementResolver" - port: - type: integer - description: The port number to use. - minimum: 0 - maximum: 65535 - default: 80 - protocol: - type: string - description: The transport protocol to use. - enum: - - HTTP - - HTTPS - - HTTP2 - default: HTTPS - MeasurementProbesCount: - type: integer - description: | - The actual number of probes that performed the measurement tests. - The value can be smaller or equal to the `limit` defined in the measurement request, depending on probe availability. - MeasurementResolver: - description: A DNS resolver to use for the measurement. The default value is the probe's system resolver. - anyOf: - - type: string - format: ipv4 - description: The IPv4 address of the resolver. - - type: string - format: hostname - description: The Full Qualified Domain Name (FQDN) of the resolver. - MeasurementResultItem: - type: object - description: Contains information about a probe and its test results. - required: - - probe - - result - properties: - probe: - allOf: - - $ref: "schemas.yaml#/components/schemas/ProbeLocation" - - type: object - description: Contains information about the probe that performed the test, such as its location, tags, and resolvers. - required: - - tags - - resolvers - properties: - tags: - $ref: "schemas.yaml#/components/schemas/Tags" - resolvers: - $ref: "schemas.yaml#/components/schemas/ProbeResolvers" - result: - $ref: "schemas.yaml#/components/schemas/TestResult" - MeasurementStatus: - type: string - description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. - enum: - - in-progress - - finished - MeasurementTarget: - type: string - description: | - A publicly reachable target. - This is usually a hostname or an IPv4 address, depending on the defined `type`. - MeasurementType: - type: string - description: The measurement's test type. - enum: - - ping - - traceroute - - dns - - mtr - - http - MeasurementRequest: - description: Contains all the required data to create a measurement request. - externalDocs: - description: Read our best practises on GitHub. - url: https://github.com/jsdelivr/globalping - allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" - - type: object - additionalProperties: false - required: - - type - - target - properties: - type: - $ref: "schemas.yaml#/components/schemas/MeasurementType" - target: - $ref: "schemas.yaml#/components/schemas/MeasurementTarget" - inProgressUpdates: - type: boolean - description: | - Indicates whether you want to be able to get partial results while the measurement is still running: - - if `true`, the API returns partial results as soon as they are available. For example, this is handy if you want to present data to the user in real time. Note that you can only get real-time updates for the first five tests in the `results` array. - - if `false`, the API doesn't populate the `results` array in the response until the measurement is complete - default: false - locations: - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" - limit: - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" - measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" - MeasurementResponse: - type: object - description: Contains your measurement request's response including probe details and test results. - required: - - id - - type - - status - - createdAt - - updatedAt - - target - - probesCount - - results - properties: - id: - type: string - description: The identifier of the measurement. - type: - $ref: "schemas.yaml#/components/schemas/MeasurementType" - target: - $ref: "schemas.yaml#/components/schemas/MeasurementTarget" - status: - $ref: "schemas.yaml#/components/schemas/MeasurementStatus" - createdAt: - type: string - format: date-time - description: The date and time at which the API created the measurement. - updatedAt: - type: string - format: date-time - description: The date and time at which the AP last updated the measurement. - probesCount: - $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" - locations: - allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" - - description: Contains the location data you specified when creating the measurement request. - limit: - allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" - - description: The limit you specified when creating the request, if it differs from the default value. Is not part of the response if you have specified limits per location. - measurementOptions: - allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" - - description: Contains the custom options you provided when creating the measurement request, if they differ from the default configuration. - results: - type: array - description: An array containing the measurement's results. - items: - $ref: "schemas.yaml#/components/schemas/MeasurementResultItem" - NetworkName: - type: string - description: A network name, such as "Google LLC" or "DigitalOcen, LLC". - NullableInteger: - type: - - integer - - "null" - NullableNumber: - type: - - number - - "null" - Probe: - type: object - description: Contains information about a probe. - required: - - version - - location - - tags - - resolvers - properties: - version: - type: string - description: The probe's version. - location: - $ref: "schemas.yaml#/components/schemas/ProbeLocation" - tags: - $ref: "schemas.yaml#/components/schemas/Tags" - resolvers: - $ref: "schemas.yaml#/components/schemas/ProbeResolvers" - ProbeLocation: - type: object - description: Contains a probe's location information. - required: - - continent - - region - - country - - state - - city - - asn - - network - - latitude - - longitude - properties: - continent: - $ref: "schemas.yaml#/components/schemas/ContinentCode" - region: - $ref: "schemas.yaml#/components/schemas/RegionName" - country: - $ref: "schemas.yaml#/components/schemas/CountryCode" - state: - $ref: "schemas.yaml#/components/schemas/StateCode" - city: - $ref: "schemas.yaml#/components/schemas/CityName" - asn: - $ref: "schemas.yaml#/components/schemas/AsnCode" - network: - $ref: "schemas.yaml#/components/schemas/NetworkName" - latitude: - $ref: "schemas.yaml#/components/schemas/Latitude" - longitude: - $ref: "schemas.yaml#/components/schemas/Longitude" - ProbeResolver: - description: A resolver defined in the probe. - anyOf: - - type: string - format: ipv4 - description: The IPv4 address of the resolver. - - type: string - const: private - description: Indicates that the resolver points to a private IP address. - ProbeResolvers: - type: array - description: An array of the default resolvers configured in the probe. - items: - $ref: "schemas.yaml#/components/schemas/ProbeResolver" - Probes: - type: array - description: An array containing information about each probe. - items: - $ref: "schemas.yaml#/components/schemas/Probe" - RegionName: - type: string - description: | - A geographic region name based on the UN standard ["Standard Country or Area Codes for Statistical Use (M49)"](https://unstats.un.org/unsd/methodology/m49/). - enum: - - Northern Africa - - Eastern Africa - - Middle Africa - - Southern Africa - - Western Africa - - - Caribbean - - Central America - - South America - - Northern America - - - Central Asia - - Eastern Asia - - South-eastern Asia - - Southern Asia - - Western Asia - - - Eastern Europe - - Northern Europe - - Southern Europe - - Western Europe - - - Australia and New Zealand - - Melanesia - - Micronesia - - Polynesia - ResolvedAddress: - type: string - description: The resolved IP address of the `target`. - ResolvedHostname: - type: - - string - - "null" - format: hostname - description: The resolved hostname of the `target`. - StateCode: - type: - - string - - "null" - description: A two-letter [US state code](https://www.faa.gov/air_traffic/publications/atpubs/cnt_html/appendix_a.html). - StatsRttMin: - type: number - description: The lowest round-trip time value. - StatsRttMinNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" - - description: The lowest round-trip time value. - StatsRttAvg: - type: number - description: The average round-trip time value. - StatsRttAvgNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" - - description: The average round-trip time value. - StatsRttMax: - type: number - description: The highest round-trip time value. - StatsRttMaxNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" - - description: The highest round-trip time value. - StatsPacketsTotal: - type: integer - description: The number of packets sent. - StatsPacketsRcv: - type: integer - description: The number of received packets. - StatsPacketsDrop: - type: integer - description: The number of dropped packets (`total` - `rcv`). - StatsPacketsLoss: - type: number - description: The percentage of dropped packets. - StatsJitterMin: - type: number - description: The lowest jitter value. - StatsJitterAvg: - type: number - description: The average jitter value. - StatsJitterMax: - type: number - description: The highest jitter value. - StatsStDev: - type: number - description: The standard deviation of the round-trip time values. - Tags: - type: array - description: | - An array of additional values to fine-tune probe selection: - - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` - - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between probes hosted in datacenter and end-user locations. - items: - type: string - TestResult: - description: Contains a test's result data. - anyOf: - - $ref: "schemas.yaml#/components/schemas/InProgressTestResult" - - $ref: "schemas.yaml#/components/schemas/FailedTestResult" - - $ref: "schemas.yaml#/components/schemas/OfflineTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" - BaseFinishedTestResult: - type: object - required: - - status - - rawOutput - properties: - status: - $ref: "schemas.yaml#/components/schemas/FinishedTestStatus" - rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" - InProgressTestResult: - type: object - title: InProgressTestResult - description: | - Contains information about a test that has the test status `in-progress`. - Note that most of the response fields are not available. - required: - - status - - rawOutput - properties: - status: - $ref: "schemas.yaml#/components/schemas/InProgressTestStatus" - rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" - FailedTestResult: - type: object - title: FailedTestResult - description: | - Contains information about a test that has the status `failed`. - Note that most of the response fields are not available. - required: - - status - - rawOutput - properties: - status: - $ref: "schemas.yaml#/components/schemas/FailedTestStatus" - rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" - OfflineTestResult: - type: object - title: OfflineTestResult - description: | - Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. - Note that most of the response fields are not available. - > **Note:** This is only possible if you pass the ID of one of your existing measurements to the `locations` property of a new measurement request. - required: - - status - - rawOutput - properties: - status: - $ref: "schemas.yaml#/components/schemas/OfflineTestStatus" - rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" - FinishedPingTestResult: - title: FinishedPingTestResult - description: Contains the results for a ping test. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - resolvedAddress - - resolvedHostname - - stats - - timings - properties: - resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" - stats: - type: object - description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. - All times are given in milliseconds. - required: - - min - - avg - - max - - total - - rcv - - drop - - loss - properties: - min: - $ref: "schemas.yaml#/components/schemas/StatsRttMinNullable" - avg: - $ref: "schemas.yaml#/components/schemas/StatsRttAvgNullable" - max: - $ref: "schemas.yaml#/components/schemas/StatsRttMaxNullable" - total: - $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" - rcv: - $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" - drop: - $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" - loss: - $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" - timings: - type: array - description: | - An array containing timing data for each packet the test sent. - All times are given in milliseconds. - items: - type: object - required: - - rtt - - ttl - properties: - rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" - ttl: - $ref: "schemas.yaml#/components/schemas/TimingPacketTtl" - FinishedTracerouteTestResult: - title: FinishedTracerouteTestResult - description: Contains the results for a traceroute test. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - resolvedAddress - - resolvedHostname - - hops - properties: - resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" - hops: - type: array - description: An array containing details about each hop. - items: - type: object - required: - - resolvedAddress - - resolvedHostname - - timings - properties: - resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" - timings: - type: array - description: | - An array containing timing data for each packet the test sent. - All times are given in milliseconds. - items: - type: object - required: - - rtt - properties: - rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" - FinishedDnsTestResult: - title: FinishedDnsTestResult - description: Contains the results for a DNS test. - anyOf: - - $ref: "schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedTraceDnsTestResult" - DnsStatusCode: - type: integer - description: The DNS [response code](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). - DnsStatusCodeName: - type: string - description: The DNS [response code name](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). - HttpStatusCode: - type: integer - description: The HTTP response status code. - HttpStatusCodeName: - type: string - description: The HTTP response status code name. - FinishedSimpleDnsTestResult: - title: FinishedSimpleDnsTestResult - description: Contains the results for a DNS test with `trace` disabled. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - statusCode - - statusCodeName - properties: - statusCode: - $ref: "schemas.yaml#/components/schemas/DnsStatusCode" - statusCodeName: - $ref: "schemas.yaml#/components/schemas/DnsStatusCodeName" - - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" - FinishedTraceDnsTestResult: - title: FinishedTraceDnsTestResult - description: Contains the results for a DNS test with `trace` enabled. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - hops - properties: - hops: - type: array - description: An array containing details about each hop. - items: - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" - DnsTestHopResult: - type: object - required: - - resolver - - answers - - timings - properties: - resolver: - type: string - description: The hostname or IP of the resolver that answered the query. - answers: - type: array - description: An array of received resource records. - items: - $ref: "schemas.yaml#/components/schemas/DnsTestAnswer" - timings: - type: object - description: | - Contains details about the query times. - Times are given in milliseconds. - required: - - total - properties: - total: - type: number - description: The total query time. - DnsTestAnswer: - type: object - description: Contains the results from the `Answers` section of the DNS response message. - required: - - name - - type - - ttl - - class - - value - properties: - name: - type: string - description: The record's domain name. - type: - type: string - description: The record's type. - ttl: - type: integer - description: The record's time to live value in seconds. - class: - type: string - description: The record's class. - value: - type: string - description: The record's value. - FinishedMtrTestResult: - title: FinishedMtrTestResult - description: Contains the results for a mtr test. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - resolvedAddress - - resolvedHostname - - hops - properties: - resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" - hops: - type: array - description: An array containing details about each hop. - items: - type: object - required: - - resolvedAddress - - resolvedHostname - - asn - - timings - - stats - properties: - resolvedAddress: - allOf: - - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - - description: The resolved IP address of this hop. - resolvedHostname: - allOf: - - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" - - description: The resolved hostname of this hop. - asn: - type: array - description: An array containing the ASNs assigned to this hop. - items: - type: integer - stats: - type: object - description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. - All times are given in milliseconds. - required: - - min - - avg - - max - - stDev - - jMin - - jAvg - - jMax - - total - - rcv - - drop - - loss - properties: - min: - $ref: "schemas.yaml#/components/schemas/StatsRttMin" - avg: - $ref: "schemas.yaml#/components/schemas/StatsRttAvg" - max: - $ref: "schemas.yaml#/components/schemas/StatsRttMax" - stDev: - $ref: "schemas.yaml#/components/schemas/StatsStDev" - jMin: - $ref: "schemas.yaml#/components/schemas/StatsJitterMin" - jAvg: - $ref: "schemas.yaml#/components/schemas/StatsJitterAvg" - jMax: - $ref: "schemas.yaml#/components/schemas/StatsJitterMax" - total: - $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" - rcv: - $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" - drop: - $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" - loss: - $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" - timings: - type: array - description: | - An array containing timing data for each packet the test sent. - All times are in milliseconds. - items: - type: object - required: - - rtt - properties: - rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" - FinishedHttpTestResult: - title: FinishedHttpTestResult - description: Contains the results for a HTTP test. - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" - - type: object - required: - - rawHeaders - - rawBody - - truncated - - headers - - resolvedAddress - - statusCode - - statusCodeName - - timings - - tls - properties: - rawHeaders: - type: string - description: The raw HTTP response headers. - rawBody: - type: string - description: | - The raw HTTP response body. - Note that the API only returns the first 10kb. - truncated: - type: boolean - description: | - Indicates whether the `rawBody` value was truncated due to being too big. - headers: - type: object - description: Contains the HTTP response headers. - additionalProperties: - type: string - statusCode: - $ref: "schemas.yaml#/components/schemas/HttpStatusCode" - statusCodeName: - $ref: "schemas.yaml#/components/schemas/HttpStatusCodeName" - resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" - timings: - type: object - description: | - Contains details about the HTTP request times. - Times are given in milliseconds. - required: - - total - - dns - - tcp - - tls - - firstByte - - download - properties: - total: - $ref: "schemas.yaml#/components/schemas/TimingHttpTotalNullable" - dns: - $ref: "schemas.yaml#/components/schemas/TimingHttpDnsNullable" - tcp: - $ref: "schemas.yaml#/components/schemas/TimingHttpTcpNullable" - tls: - $ref: "schemas.yaml#/components/schemas/TimingHttpTlsNullable" - firstByte: - $ref: "schemas.yaml#/components/schemas/TimingHttpFirstByteNullable" - download: - $ref: "schemas.yaml#/components/schemas/TimingHttpDownloadNullable" - tls: - description: Contains information about the TLS certificate. Is `null` if no TLS certificate is available. - oneOf: - - $ref: "schemas.yaml#/components/schemas/TlsCertificate" - - type: "null" - TestRawOutput: - type: string - description: | - The raw output of a measurement's test result. For example, you can use the output to display it to users. - However, don't parse the content of this property and instead use the individual values provided in other properties of the measurement's test result. - BaseTestStatus: - type: string - description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. - InProgressTestStatus: - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" - - const: in-progress - FinishedTestStatus: - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" - - const: finished - FailedTestStatus: - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" - - const: failed - OfflineTestStatus: - allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" - - const: offline - TimingPacketRtt: - type: number - description: The round-trip time for this packet. - TimingPacketTtl: - type: number - description: The time-to-live value of this packet. - TimingHttpTotalNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The total HTTP request time. - TimingHttpDnsNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The time required to perform the DNS lookup. - TimingHttpTcpNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The time from performing the DNS lookup to establishing the TCP connection. - TimingHttpTlsNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The time from establishing the TCP connection to establishing the TLS session. - TimingHttpFirstByteNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The time from establishing the TCP/TLS connection to the first response byte. - TimingHttpDownloadNullable: - allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" - - description: The time from the first response byte to downloading the entire response. - TlsCertificate: - type: object - description: Contains information about a TLS certificate. - required: - - authorized - - createdAt - - expiresAt - - subject - - issuer - properties: - authorized: - type: boolean - description: | - Indicates whether a trusted authority signed the certificate. - error: - type: string - description: | - The reason why the certificate was rejected if `authorized` is `false`. - createdAt: - type: string - description: The creation date and time of the certificate. - format: date-time - expiresAt: - type: string - description: The expiration date and time of the certificate. - format: date-time - subject: - $ref: "schemas.yaml#/components/schemas/TlsCertificateSubject" - issuer: - $ref: "schemas.yaml#/components/schemas/TlsCertificateIssuer" - TlsCertificateIssuer: - type: object - description: Contains information about the TLS certificate's issuer. - required: - - C - - O - - CN - properties: - C: - type: string - description: The issuer's country. - O: - type: string - description: The issuer's organization. - CN: - type: string - description: The issuer's common name. - TlsCertificateSubject: - type: object - description: Contains information about the TLS certificate's subject. - required: - - CN - - alt - properties: - CN: - type: string - description: The subject's common name. - alt: - type: string - description: The subject's alternate names. +components: + schemas: + AsnCode: + type: integer + description: An autonomous system number (ASN). + CountryCode: + type: string + description: A two-letter country code based on [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Current_codes). + ContinentCode: + type: string + description: A two-letter continent code. + enum: + - AF + - AN + - AS + - EU + - NA + - OC + - SA + CityName: + type: string + description: A city name in English. + CreateMeasurementResponse: + description: Contains information about the newly created measurement request, such as its ID. + type: object + required: + - id + - probesCount + properties: + id: + type: string + description: | + The identifier of the measurement. + > **Tip**: You can use the ID to create a new measurement request, reusing the same probes. + probesCount: + $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + Latitude: + type: number + description: The probe location's latitude. + Longitude: + type: number + description: The probe location's longitude. + MeasurementLimit: + type: integer + description: | + The maximum number of probes that should run the measurement. The actual number of selected probes may vary, depending on their availability. + This property is mutually exclusive with the `locations` object's `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + minimum: 1 + maximum: 500 + default: 1 + MeasurementLocationOption: + type: object + description: Contains location data that tells the API where to select the probes. + additionalProperties: false + properties: + continent: + $ref: "schemas.yaml#/components/schemas/ContinentCode" + region: + $ref: "schemas.yaml#/components/schemas/RegionName" + country: + $ref: "schemas.yaml#/components/schemas/CountryCode" + state: + $ref: "schemas.yaml#/components/schemas/StateCode" + city: + $ref: "schemas.yaml#/components/schemas/CityName" + asn: + $ref: "schemas.yaml#/components/schemas/AsnCode" + network: + $ref: "schemas.yaml#/components/schemas/NetworkName" + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + magic: + type: string + description: | + The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. + You can specify the full names, ISO codes (if applicable), and common aliases. If you want to combine several conditions, use the `+` character. + limit: + type: integer + description: | + The maximum number of probes that should perform the measurement at this location. The actual number of selected probes may vary, depending on their availability. + This property is mutually exclusive with the global `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + minimum: 1 + maximum: 200 + default: 1 + MeasurementLocations: + oneOf: + - type: array + description: | + An array of `location` objects from which to run the tests. Each object specifies a location using one or more properties, such as country, city, ASN, etc. + items: + $ref: "schemas.yaml#/components/schemas/MeasurementLocationOption" + - type: string + description: | + The ID of a previous measurement whose probes you want to reuse in the same order. + You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. + Also note that once the original measurement expires, any subsequent request using the expired ID returns a `422` error. + MeasurementOptions: + description: Contains additional request options that depend on the measurement `type` you want to run. + anyOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" + - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + MeasurementOptionsConditions: + allOf: + - if: + type: object + properties: + type: + const: ping + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" + - if: + type: object + properties: + type: + const: traceroute + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" + - if: + type: object + properties: + type: + const: dns + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" + - if: + type: object + properties: + type: + const: mtr + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" + - if: + type: object + properties: + type: + const: http + then: + type: object + properties: + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + MeasurementResultsConditions: + allOf: + - if: + type: object + properties: + type: + const: ping + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" + - if: + type: object + properties: + type: + const: traceroute + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" + - if: + type: object + properties: + type: + const: dns + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" + - if: + type: object + properties: + type: + const: mtr + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" + - if: + type: object + properties: + type: + const: http + results: + type: array + items: + type: object + properties: + result: + type: object + properties: + status: + const: finished + + then: + type: object + properties: + results: + type: array + items: + type: object + properties: + result: + $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + MeasurementPingOptions: + type: object + title: PingOptions + description: Contains additional configuration options for ping measurement requests. + additionalProperties: false + properties: + packets: + type: integer + description: The number of packets to send. + default: 3 + minimum: 1 + maximum: 16 + MeasurementTracerouteOptions: + type: object + title: TracerouteOptions + description: Contains additional configuration options for traceroute measurement requests. + additionalProperties: false + properties: + port: + type: integer + description: The destination port for the data packets. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - ICMP + - TCP + - UDP + default: ICMP + MeasurementDnsOptions: + type: object + title: DnsOptions + description: Contains additional configuration options for DNS measurement requests. + additionalProperties: false + properties: + query: + type: object + description: The type of DNS query. + additionalProperties: false + properties: + type: + type: string + enum: + - A + - AAAA + - ANY + - CNAME + - DNSKEY + - DS + - MX + - NS + - NSEC + - PTR + - RRSIG + - SOA + - TXT + - SRV + default: A + resolver: + $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + port: + type: integer + description: The port number to send the query to. + minimum: 0 + maximum: 65535 + default: 53 + protocol: + type: string + description: The protocol to use for the DNS query. + enum: + - TCP + - UDP + default: UDP + trace: + type: boolean + description: Toggle delegation path tracing from the root servers down to the target domain name. + default: false + MeasurementMtrOptions: + type: object + title: MtrOptions + description: Contains additional configuration options for mtr measurement requests. + additionalProperties: false + properties: + port: + type: integer + description: The port number to use. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - ICMP + - TCP + - UDP + default: ICMP + packets: + type: integer + description: The number of packets to send to each hop. + default: 3 + minimum: 1 + maximum: 16 + MeasurementHttpOptions: + type: object + title: HttpOptions + description: Contains additional configuration options for HTTP measurement requests. + additionalProperties: false + properties: + request: + type: object + description: Contains the HTTP request properties to use. + additionalProperties: false + properties: + host: + type: string + description: | + The `Host` header to add to the request. The default value is based on the measurement request's `target`. + path: + type: string + description: The URL pathname. + query: + type: string + description: A query string to add to the request. + method: + type: string + description: The HTTP method to use. + enum: + - HEAD + - GET + default: HEAD + headers: + type: object + description: | + Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. + + > **Note**: Use the `host` property in the same object to define the `Host` header. + additionalProperties: + type: string + resolver: + $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + port: + type: integer + description: The port number to use. + minimum: 0 + maximum: 65535 + default: 80 + protocol: + type: string + description: The transport protocol to use. + enum: + - HTTP + - HTTPS + - HTTP2 + default: HTTPS + MeasurementProbesCount: + type: integer + description: | + The actual number of probes that performed the measurement tests. + The value can be smaller or equal to the `limit` defined in the measurement request, depending on probe availability. + MeasurementResolver: + description: A DNS resolver to use for the measurement. The default value is the probe's system resolver. + anyOf: + - type: string + format: ipv4 + description: The IPv4 address of the resolver. + - type: string + format: hostname + description: The Full Qualified Domain Name (FQDN) of the resolver. + MeasurementResultItem: + type: object + description: Contains information about a probe and its test results. + required: + - probe + - result + properties: + probe: + allOf: + - $ref: "schemas.yaml#/components/schemas/ProbeLocation" + - type: object + description: Contains information about the probe that performed the test, such as its location, tags, and resolvers. + required: + - tags + - resolvers + properties: + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + resolvers: + $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + result: + $ref: "schemas.yaml#/components/schemas/TestResult" + MeasurementStatus: + type: string + description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + enum: + - in-progress + - finished + MeasurementTarget: + type: string + description: | + A publicly reachable target. + This is usually a hostname or an IPv4 address, depending on the defined `type`. + MeasurementType: + type: string + description: The measurement's test type. + enum: + - ping + - traceroute + - dns + - mtr + - http + MeasurementRequest: + description: Contains all the required data to create a measurement request. + externalDocs: + description: Read our best practises on GitHub. + url: https://github.com/jsdelivr/globalping + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + $ref: "schemas.yaml#/components/schemas/MeasurementType" + target: + $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + inProgressUpdates: + type: boolean + description: | + Indicates whether you want to be able to get partial results while the measurement is still running: + - if `true`, the API returns partial results as soon as they are available. For example, this is handy if you want to present data to the user in real time. Note that you can only get real-time updates for the first five tests in the `results` array. + - if `false`, the API doesn't populate the `results` array in the response until the measurement is complete + default: false + locations: + $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + limit: + $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + measurementOptions: + $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + MeasurementResponse: + type: object + description: Contains your measurement request's response including probe details and test results. + required: + - id + - type + - status + - createdAt + - updatedAt + - target + - probesCount + - results + properties: + id: + type: string + description: The identifier of the measurement. + type: + $ref: "schemas.yaml#/components/schemas/MeasurementType" + target: + $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + status: + $ref: "schemas.yaml#/components/schemas/MeasurementStatus" + createdAt: + type: string + format: date-time + description: The date and time at which the API created the measurement. + updatedAt: + type: string + format: date-time + description: The date and time at which the AP last updated the measurement. + probesCount: + $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + locations: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + - description: Contains the location data you specified when creating the measurement request. + limit: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + - description: The limit you specified when creating the request, if it differs from the default value. Is not part of the response if you have specified limits per location. + measurementOptions: + allOf: + - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + - description: Contains the custom options you provided when creating the measurement request, if they differ from the default configuration. + results: + type: array + description: An array containing the measurement's results. + items: + $ref: "schemas.yaml#/components/schemas/MeasurementResultItem" + NetworkName: + type: string + description: A network name, such as "Google LLC" or "DigitalOcen, LLC". + NullableInteger: + type: + - integer + - "null" + NullableNumber: + type: + - number + - "null" + Probe: + type: object + description: Contains information about a probe. + required: + - version + - location + - tags + - resolvers + properties: + version: + type: string + description: The probe's version. + location: + $ref: "schemas.yaml#/components/schemas/ProbeLocation" + tags: + $ref: "schemas.yaml#/components/schemas/Tags" + resolvers: + $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + ProbeLocation: + type: object + description: Contains a probe's location information. + required: + - continent + - region + - country + - state + - city + - asn + - network + - latitude + - longitude + properties: + continent: + $ref: "schemas.yaml#/components/schemas/ContinentCode" + region: + $ref: "schemas.yaml#/components/schemas/RegionName" + country: + $ref: "schemas.yaml#/components/schemas/CountryCode" + state: + $ref: "schemas.yaml#/components/schemas/StateCode" + city: + $ref: "schemas.yaml#/components/schemas/CityName" + asn: + $ref: "schemas.yaml#/components/schemas/AsnCode" + network: + $ref: "schemas.yaml#/components/schemas/NetworkName" + latitude: + $ref: "schemas.yaml#/components/schemas/Latitude" + longitude: + $ref: "schemas.yaml#/components/schemas/Longitude" + ProbeResolver: + description: A resolver defined in the probe. + anyOf: + - type: string + format: ipv4 + description: The IPv4 address of the resolver. + - type: string + const: private + description: Indicates that the resolver points to a private IP address. + ProbeResolvers: + type: array + description: An array of the default resolvers configured in the probe. + items: + $ref: "schemas.yaml#/components/schemas/ProbeResolver" + Probes: + type: array + description: An array containing information about each probe. + items: + $ref: "schemas.yaml#/components/schemas/Probe" + RegionName: + type: string + description: | + A geographic region name based on the UN standard ["Standard Country or Area Codes for Statistical Use (M49)"](https://unstats.un.org/unsd/methodology/m49/). + enum: + - Northern Africa + - Eastern Africa + - Middle Africa + - Southern Africa + - Western Africa + + - Caribbean + - Central America + - South America + - Northern America + + - Central Asia + - Eastern Asia + - South-eastern Asia + - Southern Asia + - Western Asia + + - Eastern Europe + - Northern Europe + - Southern Europe + - Western Europe + + - Australia and New Zealand + - Melanesia + - Micronesia + - Polynesia + ResolvedAddress: + type: string + description: The resolved IP address of the `target`. + ResolvedHostname: + type: + - string + - "null" + format: hostname + description: The resolved hostname of the `target`. + StateCode: + type: + - string + - "null" + description: A two-letter [US state code](https://www.faa.gov/air_traffic/publications/atpubs/cnt_html/appendix_a.html). + StatsRttMin: + type: number + description: The lowest round-trip time value. + StatsRttMinNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The lowest round-trip time value. + StatsRttAvg: + type: number + description: The average round-trip time value. + StatsRttAvgNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The average round-trip time value. + StatsRttMax: + type: number + description: The highest round-trip time value. + StatsRttMaxNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - description: The highest round-trip time value. + StatsPacketsTotal: + type: integer + description: The number of packets sent. + StatsPacketsRcv: + type: integer + description: The number of received packets. + StatsPacketsDrop: + type: integer + description: The number of dropped packets (`total` - `rcv`). + StatsPacketsLoss: + type: number + description: The percentage of dropped packets. + StatsJitterMin: + type: number + description: The lowest jitter value. + StatsJitterAvg: + type: number + description: The average jitter value. + StatsJitterMax: + type: number + description: The highest jitter value. + StatsStDev: + type: number + description: The standard deviation of the round-trip time values. + Tags: + type: array + description: | + An array of additional values to fine-tune probe selection: + - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` + - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between probes hosted in datacenter and end-user locations. + items: + type: string + TestResult: + description: Contains a test's result data. + anyOf: + - $ref: "schemas.yaml#/components/schemas/InProgressTestResult" + - $ref: "schemas.yaml#/components/schemas/FailedTestResult" + - $ref: "schemas.yaml#/components/schemas/OfflineTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + BaseFinishedTestResult: + type: object + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/FinishedTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + InProgressTestResult: + type: object + title: InProgressTestResult + description: | + Contains information about a test that has the test status `in-progress`. + Note that most of the response fields are not available. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/InProgressTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + FailedTestResult: + type: object + title: FailedTestResult + description: | + Contains information about a test that has the status `failed`. + Note that most of the response fields are not available. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/FailedTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + OfflineTestResult: + type: object + title: OfflineTestResult + description: | + Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. + Note that most of the response fields are not available. + > **Note:** This is only possible if you pass the ID of one of your existing measurements to the `locations` property of a new measurement request. + required: + - status + - rawOutput + properties: + status: + $ref: "schemas.yaml#/components/schemas/OfflineTestStatus" + rawOutput: + $ref: "schemas.yaml#/components/schemas/TestRawOutput" + FinishedPingTestResult: + title: FinishedPingTestResult + description: Contains the results for a ping test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - stats + - timings + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + stats: + type: object + description: | + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. + All times are given in milliseconds. + required: + - min + - avg + - max + - total + - rcv + - drop + - loss + properties: + min: + $ref: "schemas.yaml#/components/schemas/StatsRttMinNullable" + avg: + $ref: "schemas.yaml#/components/schemas/StatsRttAvgNullable" + max: + $ref: "schemas.yaml#/components/schemas/StatsRttMaxNullable" + total: + $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + rcv: + $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + drop: + $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + loss: + $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are given in milliseconds. + items: + type: object + required: + - rtt + - ttl + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + ttl: + $ref: "schemas.yaml#/components/schemas/TimingPacketTtl" + FinishedTracerouteTestResult: + title: FinishedTracerouteTestResult + description: Contains the results for a traceroute test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - hops + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + hops: + type: array + description: An array containing details about each hop. + items: + type: object + required: + - resolvedAddress + - resolvedHostname + - timings + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are given in milliseconds. + items: + type: object + required: + - rtt + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + FinishedDnsTestResult: + title: FinishedDnsTestResult + description: Contains the results for a DNS test. + anyOf: + - $ref: "schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult" + - $ref: "schemas.yaml#/components/schemas/FinishedTraceDnsTestResult" + DnsStatusCode: + type: integer + description: The DNS [response code](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). + DnsStatusCodeName: + type: string + description: The DNS [response code name](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). + HttpStatusCode: + type: integer + description: The HTTP response status code. + HttpStatusCodeName: + type: string + description: The HTTP response status code name. + FinishedSimpleDnsTestResult: + title: FinishedSimpleDnsTestResult + description: Contains the results for a DNS test with `trace` disabled. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - statusCode + - statusCodeName + properties: + statusCode: + $ref: "schemas.yaml#/components/schemas/DnsStatusCode" + statusCodeName: + $ref: "schemas.yaml#/components/schemas/DnsStatusCodeName" + - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + FinishedTraceDnsTestResult: + title: FinishedTraceDnsTestResult + description: Contains the results for a DNS test with `trace` enabled. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - hops + properties: + hops: + type: array + description: An array containing details about each hop. + items: + $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + DnsTestHopResult: + type: object + required: + - resolver + - answers + - timings + properties: + resolver: + type: string + description: The hostname or IP of the resolver that answered the query. + answers: + type: array + description: An array of received resource records. + items: + $ref: "schemas.yaml#/components/schemas/DnsTestAnswer" + timings: + type: object + description: | + Contains details about the query times. + Times are given in milliseconds. + required: + - total + properties: + total: + type: number + description: The total query time. + DnsTestAnswer: + type: object + description: Contains the results from the `Answers` section of the DNS response message. + required: + - name + - type + - ttl + - class + - value + properties: + name: + type: string + description: The record's domain name. + type: + type: string + description: The record's type. + ttl: + type: integer + description: The record's time to live value in seconds. + class: + type: string + description: The record's class. + value: + type: string + description: The record's value. + FinishedMtrTestResult: + title: FinishedMtrTestResult + description: Contains the results for a mtr test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - resolvedAddress + - resolvedHostname + - hops + properties: + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + resolvedHostname: + $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + hops: + type: array + description: An array containing details about each hop. + items: + type: object + required: + - resolvedAddress + - resolvedHostname + - asn + - timings + - stats + properties: + resolvedAddress: + allOf: + - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + - description: The resolved IP address of this hop. + resolvedHostname: + allOf: + - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + - description: The resolved hostname of this hop. + asn: + type: array + description: An array containing the ASNs assigned to this hop. + items: + type: integer + stats: + type: object + description: | + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. + All times are given in milliseconds. + required: + - min + - avg + - max + - stDev + - jMin + - jAvg + - jMax + - total + - rcv + - drop + - loss + properties: + min: + $ref: "schemas.yaml#/components/schemas/StatsRttMin" + avg: + $ref: "schemas.yaml#/components/schemas/StatsRttAvg" + max: + $ref: "schemas.yaml#/components/schemas/StatsRttMax" + stDev: + $ref: "schemas.yaml#/components/schemas/StatsStDev" + jMin: + $ref: "schemas.yaml#/components/schemas/StatsJitterMin" + jAvg: + $ref: "schemas.yaml#/components/schemas/StatsJitterAvg" + jMax: + $ref: "schemas.yaml#/components/schemas/StatsJitterMax" + total: + $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + rcv: + $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + drop: + $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + loss: + $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + timings: + type: array + description: | + An array containing timing data for each packet the test sent. + All times are in milliseconds. + items: + type: object + required: + - rtt + properties: + rtt: + $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + FinishedHttpTestResult: + title: FinishedHttpTestResult + description: Contains the results for a HTTP test. + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - type: object + required: + - rawHeaders + - rawBody + - truncated + - headers + - resolvedAddress + - statusCode + - statusCodeName + - timings + - tls + properties: + rawHeaders: + type: string + description: The raw HTTP response headers. + rawBody: + type: string + description: | + The raw HTTP response body. + Note that the API only returns the first 10kb. + truncated: + type: boolean + description: | + Indicates whether the `rawBody` value was truncated due to being too big. + headers: + type: object + description: Contains the HTTP response headers. + additionalProperties: + type: string + statusCode: + $ref: "schemas.yaml#/components/schemas/HttpStatusCode" + statusCodeName: + $ref: "schemas.yaml#/components/schemas/HttpStatusCodeName" + resolvedAddress: + $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + timings: + type: object + description: | + Contains details about the HTTP request times. + Times are given in milliseconds. + required: + - total + - dns + - tcp + - tls + - firstByte + - download + properties: + total: + $ref: "schemas.yaml#/components/schemas/TimingHttpTotalNullable" + dns: + $ref: "schemas.yaml#/components/schemas/TimingHttpDnsNullable" + tcp: + $ref: "schemas.yaml#/components/schemas/TimingHttpTcpNullable" + tls: + $ref: "schemas.yaml#/components/schemas/TimingHttpTlsNullable" + firstByte: + $ref: "schemas.yaml#/components/schemas/TimingHttpFirstByteNullable" + download: + $ref: "schemas.yaml#/components/schemas/TimingHttpDownloadNullable" + tls: + description: Contains information about the TLS certificate. Is `null` if no TLS certificate is available. + oneOf: + - $ref: "schemas.yaml#/components/schemas/TlsCertificate" + - type: "null" + TestRawOutput: + type: string + description: | + The raw output of a measurement's test result. For example, you can use the output to display it to users. + However, don't parse the content of this property and instead use the individual values provided in other properties of the measurement's test result. + BaseTestStatus: + type: string + description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + InProgressTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: in-progress + FinishedTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: finished + FailedTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: failed + OfflineTestStatus: + allOf: + - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - const: offline + TimingPacketRtt: + type: number + description: The round-trip time for this packet. + TimingPacketTtl: + type: number + description: The time-to-live value of this packet. + TimingHttpTotalNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The total HTTP request time. + TimingHttpDnsNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time required to perform the DNS lookup. + TimingHttpTcpNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from performing the DNS lookup to establishing the TCP connection. + TimingHttpTlsNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from establishing the TCP connection to establishing the TLS session. + TimingHttpFirstByteNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from establishing the TCP/TLS connection to the first response byte. + TimingHttpDownloadNullable: + allOf: + - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - description: The time from the first response byte to downloading the entire response. + TlsCertificate: + type: object + description: Contains information about a TLS certificate. + required: + - authorized + - createdAt + - expiresAt + - subject + - issuer + properties: + authorized: + type: boolean + description: | + Indicates whether a trusted authority signed the certificate. + error: + type: string + description: | + The reason why the certificate was rejected if `authorized` is `false`. + createdAt: + type: string + description: The creation date and time of the certificate. + format: date-time + expiresAt: + type: string + description: The expiration date and time of the certificate. + format: date-time + subject: + $ref: "schemas.yaml#/components/schemas/TlsCertificateSubject" + issuer: + $ref: "schemas.yaml#/components/schemas/TlsCertificateIssuer" + TlsCertificateIssuer: + type: object + description: Contains information about the TLS certificate's issuer. + required: + - C + - O + - CN + properties: + C: + type: string + description: The issuer's country. + O: + type: string + description: The issuer's organization. + CN: + type: string + description: The issuer's common name. + TlsCertificateSubject: + type: object + description: Contains information about the TLS certificate's subject. + required: + - CN + - alt + properties: + CN: + type: string + description: The subject's common name. + alt: + type: string + description: The subject's alternate names. diff --git a/public/v1/spec.yaml b/public/v1/spec.yaml index 27e58df5..da63bc12 100644 --- a/public/v1/spec.yaml +++ b/public/v1/spec.yaml @@ -1,116 +1,116 @@ -openapi: 3.1.0 -info: - title: Globalping API - summary: The public Globalping API. - description: | - The Globalping API allows you to monitor, debug, and benchmark your internet infrastructure using a globally distributed network of probes. - - The API is public, free to use, and doesn't require authentication. - However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. - - Additionally, the API is RESTful, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes to indicate the success and failure of requests. - ## Client guidelines - - If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. - This way, you can provide the best UX and reduce the likelihood of your app breaking in the future. - - ### General guidelines for non-browser-based apps: - - - Set a `User-Agent` header. We recommend that you follow the format and approach [described here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). - - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. Compression has a significant impact on the response size! - - Implement ETag-based client-side caching using the `ETag`/`If-None-Match` headers when requesting the measurement status. - version: 1.0.0 - termsOfService: https://github.com/jsdelivr/globalping - contact: - name: Support - url: https://github.com/jsdelivr/globalping/issues - email: d@jsdelivr.com - license: - name: Open Software License 3.0 - identifier: OSL-3.0 -servers: - - url: https://api.globalping.io -tags: - - name: Measurements - description: Provides measurement-related operations. - - name: Probes - description: Provides probe-related operations. -paths: - /v1/measurements: - post: - summary: Create a measurement. - operationId: createMeasurement - description: | - Create a new measurement by configuring its attributes via the request body. On success, the endpoint returns the ID of the created measurement. - - > **Note**: The measurement runs asynchronously and you can call up the current state under the URL returned in the `Location` header, for example. - - ### Client guidelines - - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. - This feature is useful for apps running in an interactive mode where you want users to see the updates and results in real time. - - If you're building an app or feature for CI purposes where you want to use the finished measurement results in scripts, make sure that you either do not provide the property `inProgressUpdates` (default value is false) or explicitly set it to `false`. - - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. - requestBody: - description: Use the `MeasurementRequest` schema to create a new measurement that meets your requirements. - content: - application/json: - schema: - $ref: "components/schemas.yaml#/components/schemas/MeasurementRequest" - examples: - pingLocations: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocations" - pingLocationsLimit: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit" - pingLocationsMagic: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic" - pingCustom: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingCustom" - pingLocationsMeasurementId: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId" - responses: - "202": - $ref: "components/responses.yaml#/components/responses/measurements202" - "400": - $ref: "components/responses.yaml#/components/responses/400" - "422": - $ref: "components/responses.yaml#/components/responses/measurements422" - "429": - $ref: "components/responses.yaml#/components/responses/measurements429" - tags: - - Measurements - /v1/measurements/{id}: - parameters: - - $ref: "components/parameters.yaml#/components/parameters/measurementId" - get: - summary: Get a measurement by ID. - operationId: getMeasurement - description: | - Get an existing measurement's current status and result by providing its ID. Measurements are typically available for up to 7 days after creation. - - > **Tip**: The "Create a measurement" endpoint returns a URL to this endpoint in the `Location` header! - - ### Client guidelines - As it can take a few seconds for a measurement to complete and provide results, you can query the status to determine whether the final results are available. Use the following process: - 1. Request the measurement to retrieve its `status`. - 2. If the `status` is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms _after_ receiving the response rather than using an interval of "every 500ms". This is because, for large measurements, the request can take a few hundred milliseconds to complete, meaning that you won't get any meaningful updates in a shorter query time frame. - 3. If the `status` has a value **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. - responses: - "200": - $ref: "components/responses.yaml#/components/responses/measurement200" - "404": - $ref: "components/responses.yaml#/components/responses/404" - tags: - - Measurements - /v1/probes: - get: - summary: List all probes currently online. - operationId: listProbes - description: | - Get a list of all probes currently online and their metadata, such as location and assigned tags. - - > **Note**: Probes don't expose unique IDs that you can use to explicitly select them. Instead, enter location data or the ID of an existing measurement when you create a new measurement to refine the probe selection. - responses: - "200": - $ref: "components/responses.yaml#/components/responses/probes200" - tags: - - Probes +openapi: 3.1.0 +info: + title: Globalping API + summary: The public Globalping API. + description: | + The Globalping API allows you to monitor, debug, and benchmark your internet infrastructure using a globally distributed network of probes. + + The API is public, free to use, and doesn't require authentication. + However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. + + Additionally, the API is RESTful, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes to indicate the success and failure of requests. + ## Client guidelines + + If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. + This way, you can provide the best UX and reduce the likelihood of your app breaking in the future. + + ### General guidelines for non-browser-based apps: + + - Set a `User-Agent` header. We recommend that you follow the format and approach [described here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). + - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. Compression has a significant impact on the response size! + - Implement ETag-based client-side caching using the `ETag`/`If-None-Match` headers when requesting the measurement status. + version: 1.0.0 + termsOfService: https://github.com/jsdelivr/globalping + contact: + name: Support + url: https://github.com/jsdelivr/globalping/issues + email: d@jsdelivr.com + license: + name: Open Software License 3.0 + identifier: OSL-3.0 +servers: + - url: https://api.globalping.io +tags: + - name: Measurements + description: Provides measurement-related operations. + - name: Probes + description: Provides probe-related operations. +paths: + /v1/measurements: + post: + summary: Create a measurement. + operationId: createMeasurement + description: | + Create a new measurement by configuring its attributes via the request body. On success, the endpoint returns the ID of the created measurement. + + > **Note**: The measurement runs asynchronously and you can call up the current state under the URL returned in the `Location` header, for example. + + ### Client guidelines + - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. + This feature is useful for apps running in an interactive mode where you want users to see the updates and results in real time. + - If you're building an app or feature for CI purposes where you want to use the finished measurement results in scripts, make sure that you either do not provide the property `inProgressUpdates` (default value is false) or explicitly set it to `false`. + - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. + requestBody: + description: Use the `MeasurementRequest` schema to create a new measurement that meets your requirements. + content: + application/json: + schema: + $ref: "components/schemas.yaml#/components/schemas/MeasurementRequest" + examples: + pingLocations: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocations" + pingLocationsLimit: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit" + pingLocationsMagic: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic" + pingCustom: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingCustom" + pingLocationsMeasurementId: + $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId" + responses: + "202": + $ref: "components/responses.yaml#/components/responses/measurements202" + "400": + $ref: "components/responses.yaml#/components/responses/400" + "422": + $ref: "components/responses.yaml#/components/responses/measurements422" + "429": + $ref: "components/responses.yaml#/components/responses/measurements429" + tags: + - Measurements + /v1/measurements/{id}: + parameters: + - $ref: "components/parameters.yaml#/components/parameters/measurementId" + get: + summary: Get a measurement by ID. + operationId: getMeasurement + description: | + Get an existing measurement's current status and result by providing its ID. Measurements are typically available for up to 7 days after creation. + + > **Tip**: The "Create a measurement" endpoint returns a URL to this endpoint in the `Location` header! + + ### Client guidelines + As it can take a few seconds for a measurement to complete and provide results, you can query the status to determine whether the final results are available. Use the following process: + 1. Request the measurement to retrieve its `status`. + 2. If the `status` is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms _after_ receiving the response rather than using an interval of "every 500ms". This is because, for large measurements, the request can take a few hundred milliseconds to complete, meaning that you won't get any meaningful updates in a shorter query time frame. + 3. If the `status` has a value **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. + responses: + "200": + $ref: "components/responses.yaml#/components/responses/measurement200" + "404": + $ref: "components/responses.yaml#/components/responses/404" + tags: + - Measurements + /v1/probes: + get: + summary: List all probes currently online. + operationId: listProbes + description: | + Get a list of all probes currently online and their metadata, such as location and assigned tags. + + > **Note**: Probes don't expose unique IDs that you can use to explicitly select them. Instead, enter location data or the ID of an existing measurement when you create a new measurement to refine the probe selection. + responses: + "200": + $ref: "components/responses.yaml#/components/responses/probes200" + tags: + - Probes From 53cf4e932ba408f9d8fdfe2dcd66ba362e224ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Mon, 22 Jan 2024 19:12:38 +0100 Subject: [PATCH 4/7] style: fix quotes --- public/v1/components/responses.yaml | 42 ++-- public/v1/components/schemas.yaml | 342 ++++++++++++++-------------- public/v1/spec.yaml | 50 ++-- 3 files changed, 217 insertions(+), 217 deletions(-) diff --git a/public/v1/components/responses.yaml b/public/v1/components/responses.yaml index e2250d59..f0f042c7 100644 --- a/public/v1/components/responses.yaml +++ b/public/v1/components/responses.yaml @@ -1,6 +1,6 @@ components: responses: - "400": + '400': description: If the API can't process the request due to malformed parameters or other client errors, the response returns the HTTP `400 BAD REQUEST` status code and a JSON response body with more information about the error. content: application/json: @@ -35,7 +35,7 @@ components: message: Parameter validation failed. params: measurement: '\"measurement\" does not match any of the allowed types' - "404": + '404': description: If the service can't find the requested resource, the response returns the HTTP `400 NOT FOUND` status code and a JSON response body containing more information about the error. content: application/json: @@ -114,48 +114,48 @@ components: description: If the API accepts the request for processing, the response returns the status code `202 ACCEPTED` and a JSON response body containing the ID of the newly created measurement. You can use the URL from the `Location` header as a link to view the measurement status. headers: Location: - $ref: "headers.yaml#/components/headers/MeasurementLocation" + $ref: 'headers.yaml#/components/headers/MeasurementLocation' X-RateLimit-Limit: - $ref: "headers.yaml#/components/headers/RateLimitLimit" + $ref: 'headers.yaml#/components/headers/RateLimitLimit' X-RateLimit-Remaining: - $ref: "headers.yaml#/components/headers/RateLimitRemaining" + $ref: 'headers.yaml#/components/headers/RateLimitRemaining' X-RateLimit-Reset: - $ref: "headers.yaml#/components/headers/RateLimitReset" + $ref: 'headers.yaml#/components/headers/RateLimitReset' content: application/json: schema: - $ref: "schemas.yaml#/components/schemas/CreateMeasurementResponse" + $ref: 'schemas.yaml#/components/schemas/CreateMeasurementResponse' examples: - "0": - $ref: "examples.yaml#/components/examples/createMeasurementResponse" + '0': + $ref: 'examples.yaml#/components/examples/createMeasurementResponse' measurement200: description: A successful request returns the status code `200 OK` and a JSON response body containing the requested measurement results. content: application/json: schema: allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" - - $ref: "schemas.yaml#/components/schemas/MeasurementResultsConditions" - - $ref: "schemas.yaml#/components/schemas/MeasurementResponse" + - $ref: 'schemas.yaml#/components/schemas/MeasurementOptionsConditions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementResultsConditions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementResponse' examples: pingMeasurement: - $ref: "examples.yaml#/components/examples/getPingMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getPingMeasurementResponse' tracerouteMeasurement: - $ref: "examples.yaml#/components/examples/getTracerouteMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getTracerouteMeasurementResponse' simpleDnsMeasurement: - $ref: "examples.yaml#/components/examples/getSimpleDnsMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getSimpleDnsMeasurementResponse' traceDnsMeasurement: - $ref: "examples.yaml#/components/examples/getTraceDnsMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getTraceDnsMeasurementResponse' mtrMeasurement: - $ref: "examples.yaml#/components/examples/getMtrMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getMtrMeasurementResponse' httpMeasurement: - $ref: "examples.yaml#/components/examples/getHttpMeasurementResponse" + $ref: 'examples.yaml#/components/examples/getHttpMeasurementResponse' probes200: description: A successful request returns the status code `200 OK` and a JSON response body containing a list of all currently online probes and their metadata. content: application/json: schema: - $ref: "schemas.yaml#/components/schemas/Probes" + $ref: 'schemas.yaml#/components/schemas/Probes' examples: - "0": - $ref: "examples.yaml#/components/examples/probes" + '0': + $ref: 'examples.yaml#/components/examples/probes' diff --git a/public/v1/components/schemas.yaml b/public/v1/components/schemas.yaml index 5524a6d5..d777fe63 100644 --- a/public/v1/components/schemas.yaml +++ b/public/v1/components/schemas.yaml @@ -30,10 +30,10 @@ components: id: type: string description: | - The identifier of the measurement. + The identifier of the measurement. > **Tip**: You can use the ID to create a new measurement request, reusing the same probes. probesCount: - $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' Latitude: type: number description: The probe location's latitude. @@ -54,25 +54,25 @@ components: additionalProperties: false properties: continent: - $ref: "schemas.yaml#/components/schemas/ContinentCode" + $ref: 'schemas.yaml#/components/schemas/ContinentCode' region: - $ref: "schemas.yaml#/components/schemas/RegionName" + $ref: 'schemas.yaml#/components/schemas/RegionName' country: - $ref: "schemas.yaml#/components/schemas/CountryCode" + $ref: 'schemas.yaml#/components/schemas/CountryCode' state: - $ref: "schemas.yaml#/components/schemas/StateCode" + $ref: 'schemas.yaml#/components/schemas/StateCode' city: - $ref: "schemas.yaml#/components/schemas/CityName" + $ref: 'schemas.yaml#/components/schemas/CityName' asn: - $ref: "schemas.yaml#/components/schemas/AsnCode" + $ref: 'schemas.yaml#/components/schemas/AsnCode' network: - $ref: "schemas.yaml#/components/schemas/NetworkName" + $ref: 'schemas.yaml#/components/schemas/NetworkName' tags: - $ref: "schemas.yaml#/components/schemas/Tags" + $ref: 'schemas.yaml#/components/schemas/Tags' magic: type: string description: | - The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. + The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. You can specify the full names, ISO codes (if applicable), and common aliases. If you want to combine several conditions, use the `+` character. limit: type: integer @@ -88,20 +88,20 @@ components: description: | An array of `location` objects from which to run the tests. Each object specifies a location using one or more properties, such as country, city, ASN, etc. items: - $ref: "schemas.yaml#/components/schemas/MeasurementLocationOption" + $ref: 'schemas.yaml#/components/schemas/MeasurementLocationOption' - type: string description: | - The ID of a previous measurement whose probes you want to reuse in the same order. - You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. + The ID of a previous measurement whose probes you want to reuse in the same order. + You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. Also note that once the original measurement expires, any subsequent request using the expired ID returns a `422` error. MeasurementOptions: description: Contains additional request options that depend on the measurement `type` you want to run. anyOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" - - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + - $ref: 'schemas.yaml#/components/schemas/MeasurementPingOptions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementTracerouteOptions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementDnsOptions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementMtrOptions' + - $ref: 'schemas.yaml#/components/schemas/MeasurementHttpOptions' MeasurementOptionsConditions: allOf: - if: @@ -113,7 +113,7 @@ components: type: object properties: measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementPingOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementPingOptions' - if: type: object properties: @@ -123,7 +123,7 @@ components: type: object properties: measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementTracerouteOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementTracerouteOptions' - if: type: object properties: @@ -133,7 +133,7 @@ components: type: object properties: measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementDnsOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementDnsOptions' - if: type: object properties: @@ -143,7 +143,7 @@ components: type: object properties: measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementMtrOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementMtrOptions' - if: type: object properties: @@ -153,7 +153,7 @@ components: type: object properties: measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementHttpOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementHttpOptions' MeasurementResultsConditions: allOf: - if: @@ -180,7 +180,7 @@ components: type: object properties: result: - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" + $ref: 'schemas.yaml#/components/schemas/FinishedPingTestResult' - if: type: object properties: @@ -206,7 +206,7 @@ components: type: object properties: result: - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" + $ref: 'schemas.yaml#/components/schemas/FinishedTracerouteTestResult' - if: type: object properties: @@ -232,7 +232,7 @@ components: type: object properties: result: - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" + $ref: 'schemas.yaml#/components/schemas/FinishedDnsTestResult' - if: type: object properties: @@ -258,7 +258,7 @@ components: type: object properties: result: - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" + $ref: 'schemas.yaml#/components/schemas/FinishedMtrTestResult' - if: type: object properties: @@ -284,7 +284,7 @@ components: type: object properties: result: - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + $ref: 'schemas.yaml#/components/schemas/FinishedHttpTestResult' MeasurementPingOptions: type: object title: PingOptions @@ -347,7 +347,7 @@ components: - SRV default: A resolver: - $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + $ref: 'schemas.yaml#/components/schemas/MeasurementResolver' port: type: integer description: The port number to send the query to. @@ -422,13 +422,13 @@ components: headers: type: object description: | - Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. + Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. > **Note**: Use the `host` property in the same object to define the `Host` header. additionalProperties: type: string resolver: - $ref: "schemas.yaml#/components/schemas/MeasurementResolver" + $ref: 'schemas.yaml#/components/schemas/MeasurementResolver' port: type: integer description: The port number to use. @@ -446,7 +446,7 @@ components: MeasurementProbesCount: type: integer description: | - The actual number of probes that performed the measurement tests. + The actual number of probes that performed the measurement tests. The value can be smaller or equal to the `limit` defined in the measurement request, depending on probe availability. MeasurementResolver: description: A DNS resolver to use for the measurement. The default value is the probe's system resolver. @@ -466,7 +466,7 @@ components: properties: probe: allOf: - - $ref: "schemas.yaml#/components/schemas/ProbeLocation" + - $ref: 'schemas.yaml#/components/schemas/ProbeLocation' - type: object description: Contains information about the probe that performed the test, such as its location, tags, and resolvers. required: @@ -474,11 +474,11 @@ components: - resolvers properties: tags: - $ref: "schemas.yaml#/components/schemas/Tags" + $ref: 'schemas.yaml#/components/schemas/Tags' resolvers: - $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + $ref: 'schemas.yaml#/components/schemas/ProbeResolvers' result: - $ref: "schemas.yaml#/components/schemas/TestResult" + $ref: 'schemas.yaml#/components/schemas/TestResult' MeasurementStatus: type: string description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. @@ -488,7 +488,7 @@ components: MeasurementTarget: type: string description: | - A publicly reachable target. + A publicly reachable target. This is usually a hostname or an IPv4 address, depending on the defined `type`. MeasurementType: type: string @@ -505,7 +505,7 @@ components: description: Read our best practises on GitHub. url: https://github.com/jsdelivr/globalping allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptionsConditions" + - $ref: 'schemas.yaml#/components/schemas/MeasurementOptionsConditions' - type: object additionalProperties: false required: @@ -513,9 +513,9 @@ components: - target properties: type: - $ref: "schemas.yaml#/components/schemas/MeasurementType" + $ref: 'schemas.yaml#/components/schemas/MeasurementType' target: - $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + $ref: 'schemas.yaml#/components/schemas/MeasurementTarget' inProgressUpdates: type: boolean description: | @@ -524,11 +524,11 @@ components: - if `false`, the API doesn't populate the `results` array in the response until the measurement is complete default: false locations: - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' limit: - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + $ref: 'schemas.yaml#/components/schemas/MeasurementLimit' measurementOptions: - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' MeasurementResponse: type: object description: Contains your measurement request's response including probe details and test results. @@ -546,11 +546,11 @@ components: type: string description: The identifier of the measurement. type: - $ref: "schemas.yaml#/components/schemas/MeasurementType" + $ref: 'schemas.yaml#/components/schemas/MeasurementType' target: - $ref: "schemas.yaml#/components/schemas/MeasurementTarget" + $ref: 'schemas.yaml#/components/schemas/MeasurementTarget' status: - $ref: "schemas.yaml#/components/schemas/MeasurementStatus" + $ref: 'schemas.yaml#/components/schemas/MeasurementStatus' createdAt: type: string format: date-time @@ -560,35 +560,35 @@ components: format: date-time description: The date and time at which the AP last updated the measurement. probesCount: - $ref: "schemas.yaml#/components/schemas/MeasurementProbesCount" + $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' locations: allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementLocations" + - $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' - description: Contains the location data you specified when creating the measurement request. limit: allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementLimit" + - $ref: 'schemas.yaml#/components/schemas/MeasurementLimit' - description: The limit you specified when creating the request, if it differs from the default value. Is not part of the response if you have specified limits per location. measurementOptions: allOf: - - $ref: "schemas.yaml#/components/schemas/MeasurementOptions" + - $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' - description: Contains the custom options you provided when creating the measurement request, if they differ from the default configuration. results: type: array description: An array containing the measurement's results. items: - $ref: "schemas.yaml#/components/schemas/MeasurementResultItem" + $ref: 'schemas.yaml#/components/schemas/MeasurementResultItem' NetworkName: type: string description: A network name, such as "Google LLC" or "DigitalOcen, LLC". NullableInteger: type: - integer - - "null" + - 'null' NullableNumber: type: - number - - "null" + - 'null' Probe: type: object description: Contains information about a probe. @@ -602,11 +602,11 @@ components: type: string description: The probe's version. location: - $ref: "schemas.yaml#/components/schemas/ProbeLocation" + $ref: 'schemas.yaml#/components/schemas/ProbeLocation' tags: - $ref: "schemas.yaml#/components/schemas/Tags" + $ref: 'schemas.yaml#/components/schemas/Tags' resolvers: - $ref: "schemas.yaml#/components/schemas/ProbeResolvers" + $ref: 'schemas.yaml#/components/schemas/ProbeResolvers' ProbeLocation: type: object description: Contains a probe's location information. @@ -622,23 +622,23 @@ components: - longitude properties: continent: - $ref: "schemas.yaml#/components/schemas/ContinentCode" + $ref: 'schemas.yaml#/components/schemas/ContinentCode' region: - $ref: "schemas.yaml#/components/schemas/RegionName" + $ref: 'schemas.yaml#/components/schemas/RegionName' country: - $ref: "schemas.yaml#/components/schemas/CountryCode" + $ref: 'schemas.yaml#/components/schemas/CountryCode' state: - $ref: "schemas.yaml#/components/schemas/StateCode" + $ref: 'schemas.yaml#/components/schemas/StateCode' city: - $ref: "schemas.yaml#/components/schemas/CityName" + $ref: 'schemas.yaml#/components/schemas/CityName' asn: - $ref: "schemas.yaml#/components/schemas/AsnCode" + $ref: 'schemas.yaml#/components/schemas/AsnCode' network: - $ref: "schemas.yaml#/components/schemas/NetworkName" + $ref: 'schemas.yaml#/components/schemas/NetworkName' latitude: - $ref: "schemas.yaml#/components/schemas/Latitude" + $ref: 'schemas.yaml#/components/schemas/Latitude' longitude: - $ref: "schemas.yaml#/components/schemas/Longitude" + $ref: 'schemas.yaml#/components/schemas/Longitude' ProbeResolver: description: A resolver defined in the probe. anyOf: @@ -652,12 +652,12 @@ components: type: array description: An array of the default resolvers configured in the probe. items: - $ref: "schemas.yaml#/components/schemas/ProbeResolver" + $ref: 'schemas.yaml#/components/schemas/ProbeResolver' Probes: type: array description: An array containing information about each probe. items: - $ref: "schemas.yaml#/components/schemas/Probe" + $ref: 'schemas.yaml#/components/schemas/Probe' RegionName: type: string description: | @@ -695,34 +695,34 @@ components: ResolvedHostname: type: - string - - "null" + - 'null' format: hostname description: The resolved hostname of the `target`. StateCode: type: - string - - "null" + - 'null' description: A two-letter [US state code](https://www.faa.gov/air_traffic/publications/atpubs/cnt_html/appendix_a.html). StatsRttMin: type: number description: The lowest round-trip time value. StatsRttMinNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - description: The lowest round-trip time value. StatsRttAvg: type: number description: The average round-trip time value. StatsRttAvgNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - description: The average round-trip time value. StatsRttMax: type: number description: The highest round-trip time value. StatsRttMaxNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableNumber" + - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - description: The highest round-trip time value. StatsPacketsTotal: type: integer @@ -752,21 +752,21 @@ components: type: array description: | An array of additional values to fine-tune probe selection: - - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` + - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between probes hosted in datacenter and end-user locations. items: type: string TestResult: description: Contains a test's result data. anyOf: - - $ref: "schemas.yaml#/components/schemas/InProgressTestResult" - - $ref: "schemas.yaml#/components/schemas/FailedTestResult" - - $ref: "schemas.yaml#/components/schemas/OfflineTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedPingTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedTracerouteTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedDnsTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedMtrTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedHttpTestResult" + - $ref: 'schemas.yaml#/components/schemas/InProgressTestResult' + - $ref: 'schemas.yaml#/components/schemas/FailedTestResult' + - $ref: 'schemas.yaml#/components/schemas/OfflineTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedPingTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedTracerouteTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedDnsTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedMtrTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedHttpTestResult' BaseFinishedTestResult: type: object required: @@ -774,57 +774,57 @@ components: - rawOutput properties: status: - $ref: "schemas.yaml#/components/schemas/FinishedTestStatus" + $ref: 'schemas.yaml#/components/schemas/FinishedTestStatus' rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" + $ref: 'schemas.yaml#/components/schemas/TestRawOutput' InProgressTestResult: type: object title: InProgressTestResult description: | - Contains information about a test that has the test status `in-progress`. + Contains information about a test that has the test status `in-progress`. Note that most of the response fields are not available. required: - status - rawOutput properties: status: - $ref: "schemas.yaml#/components/schemas/InProgressTestStatus" + $ref: 'schemas.yaml#/components/schemas/InProgressTestStatus' rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" + $ref: 'schemas.yaml#/components/schemas/TestRawOutput' FailedTestResult: type: object title: FailedTestResult description: | - Contains information about a test that has the status `failed`. + Contains information about a test that has the status `failed`. Note that most of the response fields are not available. required: - status - rawOutput properties: status: - $ref: "schemas.yaml#/components/schemas/FailedTestStatus" + $ref: 'schemas.yaml#/components/schemas/FailedTestStatus' rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" + $ref: 'schemas.yaml#/components/schemas/TestRawOutput' OfflineTestResult: type: object title: OfflineTestResult description: | - Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. - Note that most of the response fields are not available. + Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. + Note that most of the response fields are not available. > **Note:** This is only possible if you pass the ID of one of your existing measurements to the `locations` property of a new measurement request. required: - status - rawOutput properties: status: - $ref: "schemas.yaml#/components/schemas/OfflineTestStatus" + $ref: 'schemas.yaml#/components/schemas/OfflineTestStatus' rawOutput: - $ref: "schemas.yaml#/components/schemas/TestRawOutput" + $ref: 'schemas.yaml#/components/schemas/TestRawOutput' FinishedPingTestResult: title: FinishedPingTestResult description: Contains the results for a ping test. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - resolvedAddress @@ -833,13 +833,13 @@ components: - timings properties: resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' stats: type: object description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. All times are given in milliseconds. required: - min @@ -851,23 +851,23 @@ components: - loss properties: min: - $ref: "schemas.yaml#/components/schemas/StatsRttMinNullable" + $ref: 'schemas.yaml#/components/schemas/StatsRttMinNullable' avg: - $ref: "schemas.yaml#/components/schemas/StatsRttAvgNullable" + $ref: 'schemas.yaml#/components/schemas/StatsRttAvgNullable' max: - $ref: "schemas.yaml#/components/schemas/StatsRttMaxNullable" + $ref: 'schemas.yaml#/components/schemas/StatsRttMaxNullable' total: - $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsTotal' rcv: - $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsRcv' drop: - $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsDrop' loss: - $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsLoss' timings: type: array description: | - An array containing timing data for each packet the test sent. + An array containing timing data for each packet the test sent. All times are given in milliseconds. items: type: object @@ -876,14 +876,14 @@ components: - ttl properties: rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' ttl: - $ref: "schemas.yaml#/components/schemas/TimingPacketTtl" + $ref: 'schemas.yaml#/components/schemas/TimingPacketTtl' FinishedTracerouteTestResult: title: FinishedTracerouteTestResult description: Contains the results for a traceroute test. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - resolvedAddress @@ -891,9 +891,9 @@ components: - hops properties: resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' hops: type: array description: An array containing details about each hop. @@ -905,13 +905,13 @@ components: - timings properties: resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' timings: type: array description: | - An array containing timing data for each packet the test sent. + An array containing timing data for each packet the test sent. All times are given in milliseconds. items: type: object @@ -919,13 +919,13 @@ components: - rtt properties: rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' FinishedDnsTestResult: title: FinishedDnsTestResult description: Contains the results for a DNS test. anyOf: - - $ref: "schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult" - - $ref: "schemas.yaml#/components/schemas/FinishedTraceDnsTestResult" + - $ref: 'schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult' + - $ref: 'schemas.yaml#/components/schemas/FinishedTraceDnsTestResult' DnsStatusCode: type: integer description: The DNS [response code](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#table-dns-parameters-6). @@ -942,22 +942,22 @@ components: title: FinishedSimpleDnsTestResult description: Contains the results for a DNS test with `trace` disabled. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - statusCode - statusCodeName properties: statusCode: - $ref: "schemas.yaml#/components/schemas/DnsStatusCode" + $ref: 'schemas.yaml#/components/schemas/DnsStatusCode' statusCodeName: - $ref: "schemas.yaml#/components/schemas/DnsStatusCodeName" - - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + $ref: 'schemas.yaml#/components/schemas/DnsStatusCodeName' + - $ref: 'schemas.yaml#/components/schemas/DnsTestHopResult' FinishedTraceDnsTestResult: title: FinishedTraceDnsTestResult description: Contains the results for a DNS test with `trace` enabled. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - hops @@ -966,7 +966,7 @@ components: type: array description: An array containing details about each hop. items: - $ref: "schemas.yaml#/components/schemas/DnsTestHopResult" + $ref: 'schemas.yaml#/components/schemas/DnsTestHopResult' DnsTestHopResult: type: object required: @@ -981,11 +981,11 @@ components: type: array description: An array of received resource records. items: - $ref: "schemas.yaml#/components/schemas/DnsTestAnswer" + $ref: 'schemas.yaml#/components/schemas/DnsTestAnswer' timings: type: object description: | - Contains details about the query times. + Contains details about the query times. Times are given in milliseconds. required: - total @@ -1022,7 +1022,7 @@ components: title: FinishedMtrTestResult description: Contains the results for a mtr test. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - resolvedAddress @@ -1030,9 +1030,9 @@ components: - hops properties: resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' resolvedHostname: - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' hops: type: array description: An array containing details about each hop. @@ -1047,11 +1047,11 @@ components: properties: resolvedAddress: allOf: - - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + - $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' - description: The resolved IP address of this hop. resolvedHostname: allOf: - - $ref: "schemas.yaml#/components/schemas/ResolvedHostname" + - $ref: 'schemas.yaml#/components/schemas/ResolvedHostname' - description: The resolved hostname of this hop. asn: type: array @@ -1061,7 +1061,7 @@ components: stats: type: object description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. + Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. All times are given in milliseconds. required: - min @@ -1077,31 +1077,31 @@ components: - loss properties: min: - $ref: "schemas.yaml#/components/schemas/StatsRttMin" + $ref: 'schemas.yaml#/components/schemas/StatsRttMin' avg: - $ref: "schemas.yaml#/components/schemas/StatsRttAvg" + $ref: 'schemas.yaml#/components/schemas/StatsRttAvg' max: - $ref: "schemas.yaml#/components/schemas/StatsRttMax" + $ref: 'schemas.yaml#/components/schemas/StatsRttMax' stDev: - $ref: "schemas.yaml#/components/schemas/StatsStDev" + $ref: 'schemas.yaml#/components/schemas/StatsStDev' jMin: - $ref: "schemas.yaml#/components/schemas/StatsJitterMin" + $ref: 'schemas.yaml#/components/schemas/StatsJitterMin' jAvg: - $ref: "schemas.yaml#/components/schemas/StatsJitterAvg" + $ref: 'schemas.yaml#/components/schemas/StatsJitterAvg' jMax: - $ref: "schemas.yaml#/components/schemas/StatsJitterMax" + $ref: 'schemas.yaml#/components/schemas/StatsJitterMax' total: - $ref: "schemas.yaml#/components/schemas/StatsPacketsTotal" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsTotal' rcv: - $ref: "schemas.yaml#/components/schemas/StatsPacketsRcv" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsRcv' drop: - $ref: "schemas.yaml#/components/schemas/StatsPacketsDrop" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsDrop' loss: - $ref: "schemas.yaml#/components/schemas/StatsPacketsLoss" + $ref: 'schemas.yaml#/components/schemas/StatsPacketsLoss' timings: type: array description: | - An array containing timing data for each packet the test sent. + An array containing timing data for each packet the test sent. All times are in milliseconds. items: type: object @@ -1109,12 +1109,12 @@ components: - rtt properties: rtt: - $ref: "schemas.yaml#/components/schemas/TimingPacketRtt" + $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' FinishedHttpTestResult: title: FinishedHttpTestResult description: Contains the results for a HTTP test. allOf: - - $ref: "schemas.yaml#/components/schemas/BaseFinishedTestResult" + - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object required: - rawHeaders @@ -1133,7 +1133,7 @@ components: rawBody: type: string description: | - The raw HTTP response body. + The raw HTTP response body. Note that the API only returns the first 10kb. truncated: type: boolean @@ -1145,15 +1145,15 @@ components: additionalProperties: type: string statusCode: - $ref: "schemas.yaml#/components/schemas/HttpStatusCode" + $ref: 'schemas.yaml#/components/schemas/HttpStatusCode' statusCodeName: - $ref: "schemas.yaml#/components/schemas/HttpStatusCodeName" + $ref: 'schemas.yaml#/components/schemas/HttpStatusCodeName' resolvedAddress: - $ref: "schemas.yaml#/components/schemas/ResolvedAddress" + $ref: 'schemas.yaml#/components/schemas/ResolvedAddress' timings: type: object description: | - Contains details about the HTTP request times. + Contains details about the HTTP request times. Times are given in milliseconds. required: - total @@ -1164,45 +1164,45 @@ components: - download properties: total: - $ref: "schemas.yaml#/components/schemas/TimingHttpTotalNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpTotalNullable' dns: - $ref: "schemas.yaml#/components/schemas/TimingHttpDnsNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpDnsNullable' tcp: - $ref: "schemas.yaml#/components/schemas/TimingHttpTcpNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpTcpNullable' tls: - $ref: "schemas.yaml#/components/schemas/TimingHttpTlsNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpTlsNullable' firstByte: - $ref: "schemas.yaml#/components/schemas/TimingHttpFirstByteNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpFirstByteNullable' download: - $ref: "schemas.yaml#/components/schemas/TimingHttpDownloadNullable" + $ref: 'schemas.yaml#/components/schemas/TimingHttpDownloadNullable' tls: description: Contains information about the TLS certificate. Is `null` if no TLS certificate is available. oneOf: - - $ref: "schemas.yaml#/components/schemas/TlsCertificate" - - type: "null" + - $ref: 'schemas.yaml#/components/schemas/TlsCertificate' + - type: 'null' TestRawOutput: type: string description: | - The raw output of a measurement's test result. For example, you can use the output to display it to users. + The raw output of a measurement's test result. For example, you can use the output to display it to users. However, don't parse the content of this property and instead use the individual values provided in other properties of the measurement's test result. BaseTestStatus: type: string description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. InProgressTestStatus: allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - const: in-progress FinishedTestStatus: allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - const: finished FailedTestStatus: allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - const: failed OfflineTestStatus: allOf: - - $ref: "schemas.yaml#/components/schemas/BaseTestStatus" + - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' - const: offline TimingPacketRtt: type: number @@ -1212,27 +1212,27 @@ components: description: The time-to-live value of this packet. TimingHttpTotalNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The total HTTP request time. TimingHttpDnsNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The time required to perform the DNS lookup. TimingHttpTcpNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The time from performing the DNS lookup to establishing the TCP connection. TimingHttpTlsNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The time from establishing the TCP connection to establishing the TLS session. TimingHttpFirstByteNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The time from establishing the TCP/TLS connection to the first response byte. TimingHttpDownloadNullable: allOf: - - $ref: "schemas.yaml#/components/schemas/NullableInteger" + - $ref: 'schemas.yaml#/components/schemas/NullableInteger' - description: The time from the first response byte to downloading the entire response. TlsCertificate: type: object @@ -1261,9 +1261,9 @@ components: description: The expiration date and time of the certificate. format: date-time subject: - $ref: "schemas.yaml#/components/schemas/TlsCertificateSubject" + $ref: 'schemas.yaml#/components/schemas/TlsCertificateSubject' issuer: - $ref: "schemas.yaml#/components/schemas/TlsCertificateIssuer" + $ref: 'schemas.yaml#/components/schemas/TlsCertificateIssuer' TlsCertificateIssuer: type: object description: Contains information about the TLS certificate's issuer. diff --git a/public/v1/spec.yaml b/public/v1/spec.yaml index da63bc12..932d37dd 100644 --- a/public/v1/spec.yaml +++ b/public/v1/spec.yaml @@ -4,14 +4,14 @@ info: summary: The public Globalping API. description: | The Globalping API allows you to monitor, debug, and benchmark your internet infrastructure using a globally distributed network of probes. - + The API is public, free to use, and doesn't require authentication. However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. Additionally, the API is RESTful, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes to indicate the success and failure of requests. ## Client guidelines - If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. + If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. This way, you can provide the best UX and reduce the likelihood of your app breaking in the future. ### General guidelines for non-browser-based apps: @@ -46,7 +46,7 @@ paths: > **Note**: The measurement runs asynchronously and you can call up the current state under the URL returned in the `Location` header, for example. ### Client guidelines - - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. + - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. This feature is useful for apps running in an interactive mode where you want users to see the updates and results in real time. - If you're building an app or feature for CI purposes where you want to use the finished measurement results in scripts, make sure that you either do not provide the property `inProgressUpdates` (default value is false) or explicitly set it to `false`. - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. @@ -55,39 +55,39 @@ paths: content: application/json: schema: - $ref: "components/schemas.yaml#/components/schemas/MeasurementRequest" + $ref: 'components/schemas.yaml#/components/schemas/MeasurementRequest' examples: pingLocations: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocations" + $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocations' pingLocationsLimit: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit" + $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsLimit' pingLocationsMagic: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic" + $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsMagic' pingCustom: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingCustom" + $ref: 'components/examples.yaml#/components/examples/createMeasurementPingCustom' pingLocationsMeasurementId: - $ref: "components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId" + $ref: 'components/examples.yaml#/components/examples/createMeasurementPingLocationsMeasurementId' responses: - "202": - $ref: "components/responses.yaml#/components/responses/measurements202" - "400": - $ref: "components/responses.yaml#/components/responses/400" - "422": - $ref: "components/responses.yaml#/components/responses/measurements422" - "429": - $ref: "components/responses.yaml#/components/responses/measurements429" + '202': + $ref: 'components/responses.yaml#/components/responses/measurements202' + '400': + $ref: 'components/responses.yaml#/components/responses/400' + '422': + $ref: 'components/responses.yaml#/components/responses/measurements422' + '429': + $ref: 'components/responses.yaml#/components/responses/measurements429' tags: - Measurements /v1/measurements/{id}: parameters: - - $ref: "components/parameters.yaml#/components/parameters/measurementId" + - $ref: 'components/parameters.yaml#/components/parameters/measurementId' get: summary: Get a measurement by ID. operationId: getMeasurement description: | Get an existing measurement's current status and result by providing its ID. Measurements are typically available for up to 7 days after creation. - > **Tip**: The "Create a measurement" endpoint returns a URL to this endpoint in the `Location` header! + > **Tip**: The 'Create a measurement' endpoint returns a URL to this endpoint in the `Location` header! ### Client guidelines As it can take a few seconds for a measurement to complete and provide results, you can query the status to determine whether the final results are available. Use the following process: @@ -95,10 +95,10 @@ paths: 2. If the `status` is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms _after_ receiving the response rather than using an interval of "every 500ms". This is because, for large measurements, the request can take a few hundred milliseconds to complete, meaning that you won't get any meaningful updates in a shorter query time frame. 3. If the `status` has a value **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. responses: - "200": - $ref: "components/responses.yaml#/components/responses/measurement200" - "404": - $ref: "components/responses.yaml#/components/responses/404" + '200': + $ref: 'components/responses.yaml#/components/responses/measurement200' + '404': + $ref: 'components/responses.yaml#/components/responses/404' tags: - Measurements /v1/probes: @@ -110,7 +110,7 @@ paths: > **Note**: Probes don't expose unique IDs that you can use to explicitly select them. Instead, enter location data or the ID of an existing measurement when you create a new measurement to refine the probe selection. responses: - "200": - $ref: "components/responses.yaml#/components/responses/probes200" + '200': + $ref: 'components/responses.yaml#/components/responses/probes200' tags: - Probes From 0e3f466c4d21f1206d388ad367effc3fbfac9546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Mon, 22 Jan 2024 19:16:06 +0100 Subject: [PATCH 5/7] style: revert examples formatting --- public/v1/components/examples.yaml | 1029 +++++++++++----------------- 1 file changed, 382 insertions(+), 647 deletions(-) diff --git a/public/v1/components/examples.yaml b/public/v1/components/examples.yaml index 1fd12788..1952780d 100644 --- a/public/v1/components/examples.yaml +++ b/public/v1/components/examples.yaml @@ -5,83 +5,97 @@ components: [ { "version": "0.20.0", - "location": - { - "continent": "NA", - "region": "Northern America", - "country": "US", - "state": "VA", - "city": "Ashburn", - "asn": 14618, - "network": "Amazon.com, Inc.", - "latitude": 39.0437, - "longitude": -77.4875, - }, - "tags": ["aws-us-east-1", "datacenter-network"], - "resolvers": ["private"], - }, + "location": { + "continent": "NA", + "region": "Northern America", + "country": "US", + "state": "VA", + "city": "Ashburn", + "asn": 14618, + "network": "Amazon.com, Inc.", + "latitude": 39.0437, + "longitude": -77.4875 + }, + "tags": [ + "aws-us-east-1", + "datacenter-network" + ], + "resolvers": [ + "private" + ] + } ] createMeasurementPingLocations: - summary: "ping: specific locations" + summary: 'ping: specific locations' description: Use the properties inside the `locations` object to define the locations from which the API should select probes. In this example, we're only defining values for `country`, but you can add other properties like `city`, `asn`, etc. to fine-tune the location. value: { "type": "ping", "target": "cdn.jsdelivr.net", - "locations": [{ "country": "DE" }, { "country": "PL" }], + "locations": [ + { "country": "DE" }, + { "country": "PL" } + ] } createMeasurementPingLocationsLimit: - summary: "ping: specific locations and limit" + summary: 'ping: specific locations and limit' description: Use the `limit` property to specify how many probes the API should pick per location. Alternatively, you can use the main object's global `limit` property to have the API determine the number of probes per location. If you don't define a limit value, the global limit value is set to 1. value: { "type": "ping", "target": "cdn.jsdelivr.net", - "locations": - [{ "country": "DE", "limit": 4 }, { "country": "PL", "limit": 2 }], + "locations": [ + { "country": "DE", "limit": 4 }, + { "country": "PL", "limit": 2 } + ] } createMeasurementPingLocationsMagic: - summary: "ping: magic location filter" + summary: 'ping: magic location filter' description: "Instead of configuring the object properties for each location, you can use the `magic` property. For example, rather than explicitly defining a country and a city, we can write `magic: country+city`, which gives the same result. We use the `magic` field for most of our Globalping integrations, as it allows for intuitive and versatile use. [Learn more about the magic field on GitHub](https://github.com/jsdelivr/globalping)." value: { "type": "ping", "target": "cdn.jsdelivr.net", - "locations": - [ - { "magic": "FR" }, - { "magic": "Poland" }, - { "magic": "Berlin+Germany" }, - { "magic": "California" }, - { "magic": "Europe" }, - { "magic": "Western Europe" }, - { "magic": "AS13335" }, - { "magic": "aws-us-east-1" }, - { "magic": "Google" }, - ], + "locations": [ + { "magic": "FR" }, + { "magic": "Poland" }, + { "magic": "Berlin+Germany" }, + { "magic": "California" }, + { "magic": "Europe" }, + { "magic": "Western Europe" }, + { "magic": "AS13335" }, + { "magic": "aws-us-east-1" }, + { "magic": "Google" } + ] } createMeasurementPingCustom: - summary: "ping: custom options" + summary: 'ping: custom options' description: The API takes various options to customize the measurement, which vary depending on the defined `type`. In this example, we set the number of packets to send for our ping tests. You can find all available options in the request body schema `MeasurementRequest`. value: { "type": "ping", "target": "cdn.jsdelivr.net", - "measurementOptions": { "packets": 6 }, + "measurementOptions": { + "packets": 6 + } } createMeasurementPingLocationsMeasurementId: - summary: "ping: previous measurement id" + summary: 'ping: previous measurement id' description: If you want to reuse probes from a previous measurement, provide `locations` with the measurement ID. Note that probes may be offline and unavailable to run your measurement request! value: { "type": "ping", "target": "cdn.jsdelivr.net", - "locations": "1wzMrzLBZfaPoT1c", + "locations": "1wzMrzLBZfaPoT1c" } createMeasurementResponse: - value: { "id": "PY5fMsREMmIq45VR", "probesCount": 1 } + value: + { + "id": "PY5fMsREMmIq45VR", + "probesCount": 1 + } getPingMeasurementResponse: - summary: "type: ping" + summary: 'type: ping' value: { "id": "nzGzfAGL7sZfUs3c", @@ -91,48 +105,42 @@ components: "updatedAt": "2023-07-14T18:25:53.207Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "measurementOptions": { "packets": 2 }, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "NZ", - "state": null, - "city": "Auckland", - "asn": 61138, - "longitude": 174.76667, - "latitude": -36.86667, - "network": "Zappie Host LLC", - "tags": ["datacenter-network"], - "resolvers": ["1.1.1.1", "8.8.8.8"], - }, - "result": - { - "status": "finished", - "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", - "resolvedAddress": "151.101.129.229", - "resolvedHostname": "151.101.129.229", - "timings": - [{ "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 }], - "stats": - { - "min": 24.174, - "max": 24.193, - "avg": 24.183, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - }, - }, + "measurementOptions": { + "packets": 2 + }, + "results": [ + { + "probe": { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "NZ", + "state": null, + "city": "Auckland", + "asn": 61138, + "longitude": 174.76667, + "latitude": -36.86667, + "network": "Zappie Host LLC", + "tags": [ + "datacenter-network" + ], + "resolvers": [ + "1.1.1.1", + "8.8.8.8" + ] }, - ], + "result": { + "status": "finished", + "rawOutput": "PING jsdelivr.map.fastly.net (151.101.129.229) 56(84) bytes of data.\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=1 ttl=59 time=24.2 ms\n64 bytes from 151.101.129.229 (151.101.129.229): icmp_seq=2 ttl=59 time=24.2 ms\n\n--- jsdelivr.map.fastly.net ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 201ms\nrtt min/avg/max/mdev = 24.174/24.183/24.193/0.009 ms", + "resolvedAddress": "151.101.129.229", + "resolvedHostname": "151.101.129.229", + "timings": [ { "ttl": 59, "rtt": 24.2 }, { "ttl": 59, "rtt": 24.2 } ], + "stats": { "min": 24.174, "max": 24.193, "avg": 24.183, "total": 2, "loss": 0, "rcv": 2, "drop": 0 } + } + } + ] } getTracerouteMeasurementResponse: - summary: "type: traceroute" + summary: 'type: traceroute' value: { "id": "MH97NFzqirjA9NZZ", @@ -142,48 +150,48 @@ components: "updatedAt": "2023-07-14T18:29:21.165Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "results": - [ - { - "probe": + "results": [ + { + "probe": { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 16276, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "OVH SAS", + "tags": [ + "datacenter-network" + ], + "resolvers": [ + "213.186.33.99" + ] + }, + "result": { + "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", + "status": "finished", + "resolvedAddress": "104.16.85.20", + "resolvedHostname": "104.16.85.20", + "hops": [ { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 16276, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "OVH SAS", - "tags": ["datacenter-network"], - "resolvers": ["213.186.33.99"], + "resolvedHostname": "172.68.208.3", + "resolvedAddress": "172.68.208.3", + "timings": [ { "rtt": 1.777 }, { "rtt": 1.778 } ] }, - "result": { - "rawOutput": "traceroute to cdn.jsdelivr.net (104.16.85.20), 20 hops max, 60 byte packets\n 1 139.99.172.1 (139.99.172.1) 0.315 ms 0.301 ms\n 2 192.168.143.254 (192.168.143.254) 0.295 ms 0.292 ms\n 3 10.29.250.254 (10.29.250.254) 0.289 ms 0.286 ms\n 4 10.29.231.208 (10.29.231.208) 0.338 ms 0.349 ms\n 5 10.133.18.32 (10.133.18.32) 0.502 ms 0.596 ms\n 6 10.75.8.8 (10.75.8.8) 0.322 ms 0.344 ms\n 7 10.75.248.66 (10.75.248.66) 1.101 ms 1.106 ms\n 8 syd-sy2-bb1-a9.au.asia (103.5.14.220) 1.105 ms 1.160 ms\n 9 as13335.nsw.ix.asn.au (218.100.52.11) 1.097 ms 1.097 ms\n10 172.68.208.3 (172.68.208.3) 1.777 ms 1.778 ms\n11 104.16.85.20 (104.16.85.20) 0.826 ms 0.733 ms", - "status": "finished", - "resolvedAddress": "104.16.85.20", "resolvedHostname": "104.16.85.20", - "hops": - [ - { - "resolvedHostname": "172.68.208.3", - "resolvedAddress": "172.68.208.3", - "timings": [{ "rtt": 1.777 }, { "rtt": 1.778 }], - }, - { - "resolvedHostname": "104.16.85.20", - "resolvedAddress": "104.16.85.20", - "timings": [{ "rtt": 0.826 }, { "rtt": 0.733 }], - }, - ], - }, - }, - ], + "resolvedAddress": "104.16.85.20", + "timings": [ { "rtt": 0.826 }, { "rtt": 0.733 } ] + } + ] + } + } + ] } getSimpleDnsMeasurementResponse: - summary: "type: dns" + summary: 'type: dns' value: { "id": "av5Z6kM6FXLAfKO0", @@ -193,75 +201,45 @@ components: "updatedAt": "2023-07-14T18:31:01.844Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "results": - [ - { - "probe": - { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Sydney", - "asn": 202422, - "longitude": 151.207052, - "latitude": -33.86778, - "network": "G-Core Labs S.A.", - "tags": ["datacenter-network"], - "resolvers": ["8.8.8.8"], - }, - "result": - { - "status": "finished", - "statusCodeName": "NOERROR", - "statusCode": 0, - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", - "answers": - [ - { - "name": "cdn.jsdelivr.net.", - "type": "CNAME", - "ttl": 180, - "class": "IN", - "value": "jsdelivr.map.fastly.net.", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.1.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.65.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.129.229", - }, - { - "name": "jsdelivr.map.fastly.net.", - "type": "A", - "ttl": 23, - "class": "IN", - "value": "151.101.193.229", - }, - ], - "timings": { "total": 99 }, - "resolver": "8.8.8.8", - }, + "results": [ + { + "probe": { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Sydney", + "asn": 202422, + "longitude": 151.207052, + "latitude": -33.86778, + "network": "G-Core Labs S.A.", + "tags": [ + "datacenter-network" + ], + "resolvers": [ + "8.8.8.8" + ] }, - ], + "result": { + "status": "finished", + "statusCodeName": "NOERROR", + "statusCode": 0, + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50465\n;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 512\n; NSID: 67 70 64 6e 73 2d 73 79 64 (\"gpdns-syd\")\n;; QUESTION SECTION:\n;cdn.jsdelivr.net.\t\tIN\tA\n\n;; ANSWER SECTION:\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.1.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.65.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.129.229\njsdelivr.map.fastly.net. 23\tIN\tA\t151.101.193.229\n\n;; Query time: 99 msec\n;; SERVER: 8.8.8.8#53(8.8.8.8)\n;; WHEN: Fri Jul 14 18:31:01 UTC 2023\n;; MSG SIZE rcvd: 156\n", + "answers": [ + { "name": "cdn.jsdelivr.net.", "type": "CNAME", "ttl": 180, "class": "IN", "value": "jsdelivr.map.fastly.net." }, + { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.1.229" }, + { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.65.229" }, + { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.129.229" }, + { "name": "jsdelivr.map.fastly.net.", "type": "A", "ttl": 23, "class": "IN", "value": "151.101.193.229" } + ], + "timings": { "total": 99 }, + "resolver": "8.8.8.8" + } + } + ] } getTraceDnsMeasurementResponse: - summary: "type: dns + trace" + summary: 'type: dns + trace' value: { "id": "xgaym4ha2736BCPe", @@ -271,324 +249,105 @@ components: "updatedAt": "2023-07-14T18:32:54.312Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "measurementOptions": { "trace": true }, - "results": - [ - { - "probe": + "measurementOptions": { + "trace": true + }, + "results": [ + { + "probe": { + "continent": "OC", + "region": "Australia and New Zealand", + "country": "AU", + "state": null, + "city": "Melbourne", + "asn": 20473, + "longitude": 144.96332, + "latitude": -37.814, + "network": "Choopa, LLC", + "tags": [ ], + "resolvers": [ + "108.61.10.10" + ] + }, + "result": { + "status": "finished", + "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", + "hops": [ { - "continent": "OC", - "region": "Australia and New Zealand", - "country": "AU", - "state": null, - "city": "Melbourne", - "asn": 20473, - "longitude": 144.96332, - "latitude": -37.814, - "network": "Choopa, LLC", - "tags": [], - "resolvers": ["108.61.10.10"], + "answers": [ + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "a.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "b.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "i.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "m.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "h.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "c.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "k.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "f.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "g.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "j.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "e.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "l.root-servers.net." }, + { "name": ".", "type": "NS", "ttl": 59490, "class": "IN", "value": "d.root-servers.net." }, + { "name": ".", "type": "RRSIG", "ttl": 59490, "class": "IN", "value": "CIqSfQ==" } ], + "timings": { + "total": 1 + }, + "resolver": "108.61.10.10" }, - "result": { - "status": "finished", - "rawOutput": "\n; <<>> DiG 9.16.37-Debian <<>> -t A cdn.jsdelivr.net -p 53 -4 +timeout=3 +tries=2 +nocookie +nsid +trace\n;; global options: +cmd\n.\t\t\t59490\tIN\tNS\ta.root-servers.net.\n.\t\t\t59490\tIN\tNS\tb.root-servers.net.\n.\t\t\t59490\tIN\tNS\ti.root-servers.net.\n.\t\t\t59490\tIN\tNS\tm.root-servers.net.\n.\t\t\t59490\tIN\tNS\th.root-servers.net.\n.\t\t\t59490\tIN\tNS\tc.root-servers.net.\n.\t\t\t59490\tIN\tNS\tk.root-servers.net.\n.\t\t\t59490\tIN\tNS\tf.root-servers.net.\n.\t\t\t59490\tIN\tNS\tg.root-servers.net.\n.\t\t\t59490\tIN\tNS\tj.root-servers.net.\n.\t\t\t59490\tIN\tNS\te.root-servers.net.\n.\t\t\t59490\tIN\tNS\tl.root-servers.net.\n.\t\t\t59490\tIN\tNS\td.root-servers.net.\n.\t\t\t59490\tIN\tRRSIG\tNS 8 0 518400 20230727050000 20230714040000 11019 . pU6YT+mpbxCmYTvPIpmujeuOZGvCxDVtJ/uaHdwosmjsnZWcvZgQvHJl Li0gl3HcpSSYTGAmMsi27yvGYh0Vm+7gtcuZMTTcsCZmZnz6bv+OAapD ZDqhnWfKmp5tj4ew5tibSXVCDFPmjX0Tt01ly4e5Z+xn5K+AyQqtAIHO oB2weZ/K9sqUMqXgYZZVXjjkNkhO7FE8CtUNi3ZDOVkKvSIHeT1LLFOw AvCDCtnL9rqka9xb0ZoKZCf8Q3JicirNnRGNjA/9Rn3XenyYwuI0K8f3 xrIhDg7CdKRvgL8C9oLfCMvtr1HuMfQbNQq4MYrsv17eWfE45ccyLRLY CIqSfQ==\n;; Received 525 bytes from 108.61.10.10#53(108.61.10.10) in 1 ms\n\nnet.\t\t\t172800\tIN\tNS\ta.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tb.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tc.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\td.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\te.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tf.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tg.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\th.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\ti.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tj.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tk.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tl.gtld-servers.net.\nnet.\t\t\t172800\tIN\tNS\tm.gtld-servers.net.\nnet.\t\t\t86400\tIN\tDS\t35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE\nnet.\t\t\t86400\tIN\tRRSIG\tDS 8 1 86400 20230727170000 20230714160000 11019 . vdkTxdYXe7XI50EjlQeDlO0zqKWElUR64o8SHfgB3+Kki58EkAB7heQY PplYxcxZ8U0eVEwVyqAd2Nhph9ra5V/jRWDRSbSwml0D9H2a5oUTfeun HRyy9VhojElZ8HShYZFDtgbzp5X1WbV96CmHP4YqCDnwVpHsvzG15mVM eswavjwHiSyxKpW9plE4qD2Ch4gzX3Ja/SriIWvhNp7ghh+n8uZf7owU BhGWrHDwIydv5tRXtDrJ3ae0fBaMucUIxWqSLAsTx+6aYcjfh+MhMZVg xkvIOCSiTWo/pUrjEx1nd2hXJHZX3jfkrYt5tkOwDT5YL75kHKPsE+V/ zTB3Jg==\n;; Received 1203 bytes from 198.97.190.53#53(h.root-servers.net) in 258 ms\n\njsdelivr.net.\t\t172800\tIN\tNS\tdns1.p01.nsone.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns1.gcorelabs.net.\njsdelivr.net.\t\t172800\tIN\tNS\tns2.gcdn.services.\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RTLNPGULOGN7B9A62SHJE1U3TTP8DR NS SOA RRSIG DNSKEY NSEC3PARAM\nA1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20230721064011 20230714053011 27554 net. sTPenGEoqRbNRlbCqO1wBUuSLViplkAUYileU6k5aqSx5GcWmFcASmwX xxXcU4Ck2el9/p5UTMA/IN8s6FliHkyhHMban0w8yTAgllMB44BJfyKw J7d3gQGMSpEi7dJHYEW9epunLB0qIb3GjFvNANouw4qnnDJMBPo3y8gn U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN NSEC3 1 1 0 - GBMJLF8O7TPSKBNV9CGB4OIIK74L9AVN NS DS RRSIG\nGBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net. 86400 IN RRSIG NSEC3 8 2 86400 20230719063901 20230712052901 27554 net. n1r0f+ShvkocU0OSXs1SO2GOc0X8Li1qwZSApLja76RyS7TkEoPtwmUr cJ/Z3TAqLNuHKUOGBcVHl2XPoWe5f4GO+Dnw59ym2V5lCHUQu6P0V7g2 1+99KT4x879xVbh6K5liRlHNdJyCsQiI17pnmhfSLVEn3vxumA7e68pu o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw==\n;; Received 783 bytes from 192.31.80.30#53(d.gtld-servers.net) in 231 ms\n\ncdn.jsdelivr.net.\t180\tIN\tCNAME\tjsdelivr.map.fastly.net.\n;; Received 130 bytes from 92.223.100.53#53(ns1.gcorelabs.net) in 0 ms\n", - "hops": - [ - { - "answers": - [ - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "a.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "b.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "i.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "m.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "h.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "c.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "k.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "f.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "g.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "j.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "e.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "l.root-servers.net.", - }, - { - "name": ".", - "type": "NS", - "ttl": 59490, - "class": "IN", - "value": "d.root-servers.net.", - }, - { - "name": ".", - "type": "RRSIG", - "ttl": 59490, - "class": "IN", - "value": "CIqSfQ==", - }, - ], - "timings": { "total": 1 }, - "resolver": "108.61.10.10", - }, - { - "answers": - [ - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "a.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "b.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "c.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "d.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "e.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "f.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "g.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "h.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "i.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "j.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "k.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "l.gtld-servers.net.", - }, - { - "name": "net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "m.gtld-servers.net.", - }, - { - "name": "net.", - "type": "DS", - "ttl": 86400, - "class": "IN", - "value": "8BD973EE", - }, - { - "name": "net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "zTB3Jg== ", - }, - ], - "timings": { "total": 258 }, - "resolver": "h.root-servers.net", - }, - { - "answers": - [ - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "dns1.p01.nsone.net.", - }, - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "ns1.gcorelabs.net.", - }, - { - "name": "jsdelivr.net.", - "type": "NS", - "ttl": 172800, - "class": "IN", - "value": "ns2.gcdn.services.", - }, - { - "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", - "type": "NSEC3", - "ttl": 86400, - "class": "IN", - "value": "NSEC3PARAM", - }, - { - "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==", - }, - { - "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", - "type": "NSEC3", - "ttl": 86400, - "class": "IN", - "value": "RRSIG", - }, - { - "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", - "type": "RRSIG", - "ttl": 86400, - "class": "IN", - "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== ", - }, - ], - "timings": { "total": 231 }, - "resolver": "d.gtld-servers.net", - }, - { - "answers": - [ - { - "name": "cdn.jsdelivr.net.", - "type": "CNAME", - "ttl": 180, - "class": "IN", - "value": "jsdelivr.map.fastly.net.", - }, - ], - "timings": { "total": 0 }, - "resolver": "ns1.gcorelabs.net", - }, - ], + "answers": [ + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "a.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "b.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "c.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "d.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "e.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "f.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "g.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "h.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "i.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "j.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "k.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "l.gtld-servers.net." }, + { "name": "net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "m.gtld-servers.net." }, + { "name": "net.", "type": "DS", "ttl": 86400, "class": "IN", "value": "8BD973EE" }, + { "name": "net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "zTB3Jg== " } + ], + "timings": { + "total": 258 + }, + "resolver": "h.root-servers.net" }, - }, - ], + { + "answers": [ + { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "dns1.p01.nsone.net." }, + { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "ns1.gcorelabs.net." }, + { "name": "jsdelivr.net.", "type": "NS", "ttl": 172800, "class": "IN", "value": "ns2.gcdn.services." }, + { "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", "type": "NSEC3", "ttl": 86400, "class": "IN", "value": "NSEC3PARAM" }, + { "name": "A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "U+tr2cLBz5cce4KitJVl+smFdSkIEDTeU1tdHieXAEL3zA==" }, + { "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", "type": "NSEC3", "ttl": 86400, "class": "IN", "value": "RRSIG" }, + { "name": "GBMIV90GKKAHN7P6PL113RFI1O4TFNCK.net.", "type": "RRSIG", "ttl": 86400, "class": "IN", "value": "o12GX4W3XIv3wtcQ7P2I2aYqXbT6sP4AKWV7GlY4qtHMiw== " } + ], + "timings": { + "total": 231 + }, + "resolver": "d.gtld-servers.net" + }, + { + "answers": [ + { "name": "cdn.jsdelivr.net.", "type": "CNAME", "ttl": 180, "class": "IN", "value": "jsdelivr.map.fastly.net." } + ], + "timings": { + "total": 0 + }, + "resolver": "ns1.gcorelabs.net" + } + ] + } + } + ] } getMtrMeasurementResponse: - summary: "type: mtr" + summary: 'type: mtr' value: { "id": "1aJyGDZkWVGuXLYL", @@ -598,79 +357,61 @@ components: "updatedAt": "2023-07-14T18:33:19.886Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "measurementOptions": { "packets": 2 }, - "results": - [ - { - "probe": + "measurementOptions": { + "packets": 2 + }, + "results": [ + { + "probe": { + "continent": "AF", + "region": "Southern Africa", + "country": "ZA", + "state": null, + "city": "Johannesburg", + "asn": 199524, + "longitude": 28.04355, + "latitude": -26.20225, + "network": "G-Core Labs S.A.", + "tags": [ + "datacenter-network" + ], + "resolvers": [ + "private" + ] + }, + "result": { + "status": "finished", + "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", + "resolvedAddress": "151.101.1.229", + "resolvedHostname": "151.101.1.229", + "hops": [ { - "continent": "AF", - "region": "Southern Africa", - "country": "ZA", - "state": null, - "city": "Johannesburg", - "asn": 199524, - "longitude": 28.04355, - "latitude": -26.20225, - "network": "G-Core Labs S.A.", - "tags": ["datacenter-network"], - "resolvers": ["private"], + "stats": { "min": 176.348, "max": 176.416, "avg": 176.4, "total": 2, "loss": 0, "rcv": 2, "drop": 0, "stDev": 0, "jMin": 0.1, "jMax": 0.1, "jAvg": 0.1 }, + "asn": [ 174 ], + "timings": [ + { "rtt": 176.348 }, + { "rtt": 176.416 } + ], + "resolvedAddress": "149.6.2.38", + "resolvedHostname": "149.6.2.38" }, - "result": { - "status": "finished", - "rawOutput": "Host Loss% Drop Rcv Avg StDev Javg \n1. AS199524 _gateway (94.156.93.1) 0.0% 0 2 0.5 0.2 0.4\n2. AS199524 5.188.133.2 (5.188.133.2) 0.0% 0 2 0.3 0.1 0.1\n3. AS??? 10.255.31.184 (10.255.31.184) 0.0% 0 2 0.4 0.1 0.1\n4. AS174 206.249.1.209 (206.249.1.209) 0.0% 0 2 1.1 0.2 0.4\n5. AS174 be2385.ccr21.lon01.atlas.cogentco.com (154.54.40.93) 0.0% 0 2 177.0 0.0 0.0\n6. AS174 149.6.2.38 (149.6.2.38) 0.0% 0 2 176.4 0.0 0.1\n7. AS54113 151.101.1.229 (151.101.1.229) 0.0% 0 2 178.3 0.1 0.1\n", + "stats": { "min": 178.287, "max": 178.403, "avg": 178.3, "total": 2, "loss": 0, "rcv": 2, "drop": 0, "stDev": 0.1, "jMin": 0.1, "jMax": 0.1, "jAvg": 0.1 }, + "asn": [ 54113 ], + "timings": [ + { "rtt": 178.403 }, + { "rtt": 178.287 } + ], "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229", - "hops": - [ - { - "stats": - { - "min": 176.348, - "max": 176.416, - "avg": 176.4, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - "stDev": 0, - "jMin": 0.1, - "jMax": 0.1, - "jAvg": 0.1, - }, - "asn": [174], - "timings": [{ "rtt": 176.348 }, { "rtt": 176.416 }], - "resolvedAddress": "149.6.2.38", - "resolvedHostname": "149.6.2.38", - }, - { - "stats": - { - "min": 178.287, - "max": 178.403, - "avg": 178.3, - "total": 2, - "loss": 0, - "rcv": 2, - "drop": 0, - "stDev": 0.1, - "jMin": 0.1, - "jMax": 0.1, - "jAvg": 0.1, - }, - "asn": [54113], - "timings": [{ "rtt": 178.403 }, { "rtt": 178.287 }], - "resolvedAddress": "151.101.1.229", - "resolvedHostname": "151.101.1.229", - }, - ], - }, - }, - ], + "resolvedHostname": "151.101.1.229" + } + ] + } + } + ] } getHttpMeasurementResponse: - summary: "type: http" + summary: 'type: http' value: { "id": "9J2BCohDSuxoiaOD", @@ -680,93 +421,87 @@ components: "updatedAt": "2023-07-14T18:34:06.310Z", "target": "cdn.jsdelivr.net", "probesCount": 1, - "measurementOptions": - { "request": { "method": "GET", "path": "/npm/jquery" } }, - "results": - [ - { - "probe": - { - "continent": "AS", - "region": "Eastern Asia", - "country": "KR", - "state": null, - "city": "Seoul", - "asn": 40676, - "longitude": 126.977207, - "latitude": 37.566309, - "network": "Psychz Networks", - "tags": ["datacenter-network"], - "resolvers": ["8.8.8.8", "8.8.4.4"], - }, - "result": - { - "status": "finished", - "resolvedAddress": "104.16.88.20", - "headers": - { - "date": "Fri, 14 Jul 2023 18:34:05 GMT", - "content-type": "application/javascript; charset=utf-8", - "transfer-encoding": "chunked", - "connection": "close", - "access-control-allow-origin": "*", - "access-control-expose-headers": "*", - "timing-allow-origin": "*", - "cache-control": "public, max-age=604800, s-maxage=43200", - "cross-origin-resource-policy": "cross-origin", - "x-content-type-options": "nosniff", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-jsd-version": "3.7.0", - "x-jsd-version-type": "version", - "etag": 'W/"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y"', - "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", - "x-cache": "HIT, MISS", - "vary": "Accept-Encoding", - "alt-svc": 'h3=":443"; ma=86400', - "cf-cache-status": "HIT", - "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", - "nel": '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}', - "server": "cloudflare", - "cf-ray": "7e6bdb9999778a57-NRT", - "content-encoding": "br", - }, - "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", - "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", - "truncated": true, - "statusCode": 200, - "statusCodeName": "OK", - "timings": - { - "total": 325, - "download": 1, - "firstByte": 219, - "dns": 37, - "tls": 36, - "tcp": 32, - }, - "tls": - { - "authorized": true, - "createdAt": "2023-05-02T00:00:00.000Z", - "expiresAt": "2024-05-01T23:59:59.000Z", - "issuer": - { - "C": "US", - "O": "Cloudflare, Inc.", - "CN": "Cloudflare Inc ECC CA-3", - }, - "subject": - { - "C": "US", - "ST": "California", - "L": "San Francisco", - "O": "Cloudflare, Inc.", - "CN": "sni.cloudflaressl.com", - "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com", - }, - }, - }, + "measurementOptions": { + "request": { + "method": "GET", + "path": "/npm/jquery" + } + }, + "results": [ + { + "probe": { + "continent": "AS", + "region": "Eastern Asia", + "country": "KR", + "state": null, + "city": "Seoul", + "asn": 40676, + "longitude": 126.977207, + "latitude": 37.566309, + "network": "Psychz Networks", + "tags": [ + "datacenter-network" + ], + "resolvers": [ + "8.8.8.8", + "8.8.4.4" + ] }, - ], + "result": { + "status": "finished", + "resolvedAddress": "104.16.88.20", + "headers": { + "date": "Fri, 14 Jul 2023 18:34:05 GMT", + "content-type": "application/javascript; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "close", + "access-control-allow-origin": "*", + "access-control-expose-headers": "*", + "timing-allow-origin": "*", + "cache-control": "public, max-age=604800, s-maxage=43200", + "cross-origin-resource-policy": "cross-origin", + "x-content-type-options": "nosniff", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "x-jsd-version": "3.7.0", + "x-jsd-version-type": "version", + "etag": "W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"", + "x-served-by": "cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ", + "x-cache": "HIT, MISS", + "vary": "Accept-Encoding", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "HIT", + "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}", + "nel": "{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}", + "server": "cloudflare", + "cf-ray": "7e6bdb9999778a57-NRT", + "content-encoding": "br" + }, + "rawHeaders": "Date: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br", + "rawBody": "/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "rawOutput": "HTTP/1.1 200\nDate: Fri, 14 Jul 2023 18:34:05 GMT\nContent-Type: application/javascript; charset=utf-8\nTransfer-Encoding: chunked\nConnection: close\nAccess-Control-Allow-Origin: *\nAccess-Control-Expose-Headers: *\nTiming-Allow-Origin: *\nCache-Control: public, max-age=604800, s-maxage=43200\nCross-Origin-Resource-Policy: cross-origin\nX-Content-Type-Options: nosniff\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload\nX-JSD-Version: 3.7.0\nX-JSD-Version-Type: version\nETag: W/\"155a6-Wp7qw02G6S5WYOD0+HIE8e0Mj/Y\"\nX-Served-By: cache-fra-eddf8230065-FRA, cache-yyz4549-YYZ\nX-Cache: HIT, MISS\nVary: Accept-Encoding\nalt-svc: h3=\":443\"; ma=86400\nCF-Cache-Status: HIT\nReport-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=jAS6bE6d4YvFOALu6Ejvo6BHcys8BXTVxTfBGQFf%2FvCGLTG7QIUpQUvyIag14NgmMeUcvzfaUJIwQVZ6qL4bl534ErmcTXKm9%2BZG3sRCD1hOLOD5SF4f%2BzD1IEYZze2eSt8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\nNEL: {\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}\nServer: cloudflare\nCF-RAY: 7e6bdb9999778a57-NRT\nContent-Encoding: br\n\n/*! jQuery v3.7.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.0\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&z(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function X(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function U(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function z(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",R),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getEl", + "truncated": true, + "statusCode": 200, + "statusCodeName": "OK", + "timings": { "total": 325, "download": 1, "firstByte": 219, "dns": 37, "tls": 36, "tcp": 32 }, + "tls": { + "authorized": true, + "createdAt": "2023-05-02T00:00:00.000Z", + "expiresAt": "2024-05-01T23:59:59.000Z", + "issuer": { + "C": "US", + "O": "Cloudflare, Inc.", + "CN": "Cloudflare Inc ECC CA-3" + }, + "subject": { + "C": "US", + "ST": "California", + "L": "San Francisco", + "O": "Cloudflare, Inc.", + "CN": "sni.cloudflaressl.com", + "alt": "DNS:cdn.jsdelivr.net, DNS:sni.cloudflaressl.com" + } + } + } + } + ] } From edb8f94fad8c9ca2b90dfc85c51f812900bcdfca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Tue, 30 Jan 2024 17:35:45 +0100 Subject: [PATCH 6/7] Update docs --- public/v1/components/examples.yaml | 20 ++- public/v1/components/parameters.yaml | 1 - public/v1/components/responses.yaml | 34 +++-- public/v1/components/schemas.yaml | 221 +++++++++++++-------------- public/v1/spec.yaml | 59 +++---- 5 files changed, 172 insertions(+), 163 deletions(-) diff --git a/public/v1/components/examples.yaml b/public/v1/components/examples.yaml index 1952780d..7903d738 100644 --- a/public/v1/components/examples.yaml +++ b/public/v1/components/examples.yaml @@ -27,7 +27,9 @@ components: ] createMeasurementPingLocations: summary: 'ping: specific locations' - description: Use the properties inside the `locations` object to define the locations from which the API should select probes. In this example, we're only defining values for `country`, but you can add other properties like `city`, `asn`, etc. to fine-tune the location. + description: | + Use the `locations` object to define locations from which the API should select probes. + In this example, we're selecting probes based on the `country`, but you can use other properties like `city`, `asn`, etc. to fine-tune the selection. value: { "type": "ping", @@ -39,7 +41,10 @@ components: } createMeasurementPingLocationsLimit: summary: 'ping: specific locations and limit' - description: Use the `limit` property to specify how many probes the API should pick per location. Alternatively, you can use the main object's global `limit` property to have the API determine the number of probes per location. If you don't define a limit value, the global limit value is set to 1. + description: | + Use the `limit` property to specify how many probes the API should pick per location. + Alternatively, you can use the measurement's global `limit` property to have the API divide the probes evenly among the locations. + If you don't define a limit value, the global limit value is set to 1. value: { "type": "ping", @@ -51,7 +56,12 @@ components: } createMeasurementPingLocationsMagic: summary: 'ping: magic location filter' - description: "Instead of configuring the object properties for each location, you can use the `magic` property. For example, rather than explicitly defining a country and a city, we can write `magic: country+city`, which gives the same result. We use the `magic` field for most of our Globalping integrations, as it allows for intuitive and versatile use. [Learn more about the magic field on GitHub](https://github.com/jsdelivr/globalping)." + description: | + Instead of defining the individual object properties for each location type, you can ask the API to find the best match across + all location fields. For example, rather than explicitly defining a country and a city, you can write `magic: country+city`. + + We recommend using this field in real time applications that allow free-form user input. On the other hand, defining the + specific location keys may be a better option for scripts, as it makes the selection stricter and therefore more predictable. value: { "type": "ping", @@ -70,7 +80,7 @@ components: } createMeasurementPingCustom: summary: 'ping: custom options' - description: The API takes various options to customize the measurement, which vary depending on the defined `type`. In this example, we set the number of packets to send for our ping tests. You can find all available options in the request body schema `MeasurementRequest`. + description: Depending on the measurement `type`, you may pass additional measurement options. In this example, we set the number of packets to send for our ping test. You can find all available options in the request body schema. value: { "type": "ping", @@ -81,7 +91,7 @@ components: } createMeasurementPingLocationsMeasurementId: summary: 'ping: previous measurement id' - description: If you want to reuse probes from a previous measurement, provide `locations` with the measurement ID. Note that probes may be offline and unavailable to run your measurement request! + description: If you want to reuse probes from a previous measurement, pass its `id` in the `locations` field. Note that some probes may be offline and no longer unavailable - this is indicated in the results. value: { "type": "ping", diff --git a/public/v1/components/parameters.yaml b/public/v1/components/parameters.yaml index 9223048a..5fa66959 100644 --- a/public/v1/components/parameters.yaml +++ b/public/v1/components/parameters.yaml @@ -2,7 +2,6 @@ components: parameters: measurementId: description: The ID of the measurement you want to retrieve. - example: nzGzfAGL7sZfUs3c # can be removed if not wanted in: path name: id required: true diff --git a/public/v1/components/responses.yaml b/public/v1/components/responses.yaml index f0f042c7..3c018848 100644 --- a/public/v1/components/responses.yaml +++ b/public/v1/components/responses.yaml @@ -1,7 +1,9 @@ components: responses: '400': - description: If the API can't process the request due to malformed parameters or other client errors, the response returns the HTTP `400 BAD REQUEST` status code and a JSON response body with more information about the error. + description: | + If the API couldn't process the request due to malformed parameters or other client errors, it returns status `400 Bad Request` + and a body with more information about the error. Please modify your request before trying again. content: application/json: schema: @@ -11,20 +13,20 @@ components: properties: error: type: object - description: Contains information about an error. + description: Information about the error. required: - type - message properties: type: type: string - description: The type of the error provided as one string value. + description: The type of the error. message: type: string - description: The human-readable description of the error. + description: A human-readable description of the error. params: type: object - description: Contains additional information. + description: Additional information that might be present if the error is related to a specific parameter or payload field. additionalProperties: type: string examples: @@ -36,7 +38,9 @@ components: params: measurement: '\"measurement\" does not match any of the allowed types' '404': - description: If the service can't find the requested resource, the response returns the HTTP `400 NOT FOUND` status code and a JSON response body containing more information about the error. + description: | + If the API couldn't find the requested resource, it returns status `400 Not Found` + and a body containing more information about the error. content: application/json: schema: @@ -61,7 +65,9 @@ components: type: not_found message: Couldn't find the requested item. measurements422: - description: If the API can't find suitable probes for your request, the response returns the HTTP `422 UNPROCESSABLE CONTENT` status code and a JSON response body with more information about the error. Please modify your request before trying again. + description: | + If the API couldn't find suitable probes for your request, it returns status `422 Unprocessable Content` and a body with more + information about the error. Please modify your request before trying again. content: application/json: schema: @@ -86,7 +92,9 @@ components: type: no_probes_found message: No suitable probes found. measurements429: - description: If you've exceeded the API's rate limit, the response returns the status code `429 TOO MANY REQUEST` and a JSON response body containing more information about the error. Please review our [API rate limits](https://github.com/jsdelivr/globalping). +# TODO: add Please review our [API rate limits](https://github.com/jsdelivr/globalping). + description: | + If you've exceeded the API rate limit, you'll receive status `429 Too Many Requests` and a body containing more information about the error. content: application/json: schema: @@ -111,7 +119,9 @@ components: type: rate_limit_exceeded message: API rate limit exceeded. measurements202: - description: If the API accepts the request for processing, the response returns the status code `202 ACCEPTED` and a JSON response body containing the ID of the newly created measurement. You can use the URL from the `Location` header as a link to view the measurement status. + description: | + If the API accepted the request for processing, it returns status `202 Accepted` and a body containing the ID of the newly created measurement. + You can use the URL from the `Location` header to retrieve the measurement status. headers: Location: $ref: 'headers.yaml#/components/headers/MeasurementLocation' @@ -129,7 +139,8 @@ components: '0': $ref: 'examples.yaml#/components/examples/createMeasurementResponse' measurement200: - description: A successful request returns the status code `200 OK` and a JSON response body containing the requested measurement results. + description: | + A successful request returns status `200 OK` and a body containing the requested measurement results. content: application/json: schema: @@ -151,7 +162,8 @@ components: httpMeasurement: $ref: 'examples.yaml#/components/examples/getHttpMeasurementResponse' probes200: - description: A successful request returns the status code `200 OK` and a JSON response body containing a list of all currently online probes and their metadata. + description: | + A successful request returns status `200 OK` and a body containing a list of all probes currently online and their metadata. content: application/json: schema: diff --git a/public/v1/components/schemas.yaml b/public/v1/components/schemas.yaml index d777fe63..93a125d0 100644 --- a/public/v1/components/schemas.yaml +++ b/public/v1/components/schemas.yaml @@ -5,7 +5,7 @@ components: description: An autonomous system number (ASN). CountryCode: type: string - description: A two-letter country code based on [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Current_codes). + description: A two-letter country code based on [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements). ContinentCode: type: string description: A two-letter continent code. @@ -21,7 +21,7 @@ components: type: string description: A city name in English. CreateMeasurementResponse: - description: Contains information about the newly created measurement request, such as its ID. + description: Contains information about the newly created measurement. type: object required: - id @@ -30,27 +30,27 @@ components: id: type: string description: | - The identifier of the measurement. + The measurement ID. > **Tip**: You can use the ID to create a new measurement request, reusing the same probes. probesCount: $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' Latitude: type: number - description: The probe location's latitude. + description: The latitude of probe location. Longitude: type: number - description: The probe location's longitude. + description: The longitude of probe location. MeasurementLimit: type: integer description: | - The maximum number of probes that should run the measurement. The actual number of selected probes may vary, depending on their availability. - This property is mutually exclusive with the `locations` object's `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + The maximum number of probes that should run the measurement. + The result count might be lower if there aren't enough probes available in the specified locations. + Mutually exclusive with the `limit` property that can be set for individual locations. minimum: 1 maximum: 500 default: 1 MeasurementLocationOption: type: object - description: Contains location data that tells the API where to select the probes. additionalProperties: false properties: continent: @@ -72,13 +72,16 @@ components: magic: type: string description: | - The probe locations defined in a single string instead of using the respective location properties. The API fuzzy-matches the provided string based on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. - You can specify the full names, ISO codes (if applicable), and common aliases. If you want to combine several conditions, use the `+` character. + Locations defined in a single string instead of the respective location properties. + The API performs fuzzy matching on the `country`, `city`, `state`, `continent`, `region`, `asn` (using `AS` prefix, e.g., `AS123`), `tags`, and `network` values. + Supports full names, ISO codes (where applicable), and common aliases. + Multiple conditions can be combined using the `+` character. limit: type: integer description: | - The maximum number of probes that should perform the measurement at this location. The actual number of selected probes may vary, depending on their availability. - This property is mutually exclusive with the global `limit` property, meaning you can specify either a limit per location or a global limit in the root object of the request but not both. + The maximum number of probes that should run the measurement in this location. + The result count might be lower if there aren't enough probes available in this location. + Mutually exclusive with the global `limit` property. minimum: 1 maximum: 200 default: 1 @@ -86,16 +89,18 @@ components: oneOf: - type: array description: | - An array of `location` objects from which to run the tests. Each object specifies a location using one or more properties, such as country, city, ASN, etc. + An array of locations from which to run the measurement. Each object specifies a location using one or more keys, such as country, city, ASN, etc. items: $ref: 'schemas.yaml#/components/schemas/MeasurementLocationOption' - type: string description: | - The ID of a previous measurement whose probes you want to reuse in the same order. - You need to specify the measurement request's `type` and other properties again, as they're not automatically reused. - Also note that once the original measurement expires, any subsequent request using the expired ID returns a `422` error. + The `id` of a previous measurement whose probes you want to reuse. + The probes are returned in the same order as in the previous measurement. + Measurement type and options are not reused and need to be specified in the request. + Note that this option only works for the lifetime of the original measurement + and will result in a `422` response for expired or invalid `id` values. MeasurementOptions: - description: Contains additional request options that depend on the measurement `type` you want to run. + description: Additional optional fields depending on the measurement `type`. anyOf: - $ref: 'schemas.yaml#/components/schemas/MeasurementPingOptions' - $ref: 'schemas.yaml#/components/schemas/MeasurementTracerouteOptions' @@ -288,7 +293,6 @@ components: MeasurementPingOptions: type: object title: PingOptions - description: Contains additional configuration options for ping measurement requests. additionalProperties: false properties: packets: @@ -300,7 +304,6 @@ components: MeasurementTracerouteOptions: type: object title: TracerouteOptions - description: Contains additional configuration options for traceroute measurement requests. additionalProperties: false properties: port: @@ -320,16 +323,16 @@ components: MeasurementDnsOptions: type: object title: DnsOptions - description: Contains additional configuration options for DNS measurement requests. additionalProperties: false properties: query: type: object - description: The type of DNS query. + description: The DNS query properties. additionalProperties: false properties: type: type: string + description: The type of DNS query. enum: - A - AAAA @@ -363,12 +366,12 @@ components: default: UDP trace: type: boolean - description: Toggle delegation path tracing from the root servers down to the target domain name. + description: | + Toggles tracing of the delegation path from the root servers down to the target domain name. default: false MeasurementMtrOptions: type: object title: MtrOptions - description: Contains additional configuration options for mtr measurement requests. additionalProperties: false properties: port: @@ -394,24 +397,23 @@ components: MeasurementHttpOptions: type: object title: HttpOptions - description: Contains additional configuration options for HTTP measurement requests. additionalProperties: false properties: request: type: object - description: Contains the HTTP request properties to use. + description: The HTTP request properties. additionalProperties: false properties: host: type: string description: | - The `Host` header to add to the request. The default value is based on the measurement request's `target`. + An optional override for the `Host` header. The default value is based on the `target`. path: type: string - description: The URL pathname. + description: The path portion of the URL. query: type: string - description: A query string to add to the request. + description: The query string portion of the URL. method: type: string description: The HTTP method to use. @@ -422,9 +424,7 @@ components: headers: type: object description: | - Additional request headers to add to the request. The API uses the `Host` and `User-Agent` already internally and therefore overwrites them. - - > **Note**: Use the `host` property in the same object to define the `Host` header. + Additional request headers. Note that the `Host` and `User-Agent` are reserved and internally overridden. additionalProperties: type: string resolver: @@ -447,19 +447,18 @@ components: type: integer description: | The actual number of probes that performed the measurement tests. - The value can be smaller or equal to the `limit` defined in the measurement request, depending on probe availability. + Smaller or equal to `limit`, depending on probe availability. MeasurementResolver: - description: A DNS resolver to use for the measurement. The default value is the probe's system resolver. + description: A DNS resolver to use for the query. Defaults to the probe system resolver. anyOf: - type: string format: ipv4 description: The IPv4 address of the resolver. - type: string format: hostname - description: The Full Qualified Domain Name (FQDN) of the resolver. + description: The Fully Qualified Domain Name (FQDN) of the resolver. MeasurementResultItem: type: object - description: Contains information about a probe and its test results. required: - probe - result @@ -468,7 +467,7 @@ components: allOf: - $ref: 'schemas.yaml#/components/schemas/ProbeLocation' - type: object - description: Contains information about the probe that performed the test, such as its location, tags, and resolvers. + description: Information about the probe that performed this test, such as its location, tags, and resolvers. required: - tags - resolvers @@ -481,18 +480,18 @@ components: $ref: 'schemas.yaml#/components/schemas/TestResult' MeasurementStatus: type: string - description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + description: The current measurement status. Any value other than `in-progress` is final. enum: - in-progress - finished MeasurementTarget: type: string description: | - A publicly reachable target. - This is usually a hostname or an IPv4 address, depending on the defined `type`. + A publicly reachable measurement target. + Typically a hostname or an IPv4 address, depending on the measurement `type`. MeasurementType: type: string - description: The measurement's test type. + description: The measurement type. enum: - ping - traceroute @@ -500,10 +499,6 @@ components: - mtr - http MeasurementRequest: - description: Contains all the required data to create a measurement request. - externalDocs: - description: Read our best practises on GitHub. - url: https://github.com/jsdelivr/globalping allOf: - $ref: 'schemas.yaml#/components/schemas/MeasurementOptionsConditions' - type: object @@ -519,9 +514,9 @@ components: inProgressUpdates: type: boolean description: | - Indicates whether you want to be able to get partial results while the measurement is still running: - - if `true`, the API returns partial results as soon as they are available. For example, this is handy if you want to present data to the user in real time. Note that you can only get real-time updates for the first five tests in the `results` array. - - if `false`, the API doesn't populate the `results` array in the response until the measurement is complete + Indicates whether you want to get partial results while the measurement is still running: + - If `true`, partial results are returned as soon as they are available, and you can present them to the user in real time. Note that only the first 5 tests from the `results` array will update in real time. + - If `false`, the result of each test is updated only after the test finishes. default: false locations: $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' @@ -531,7 +526,6 @@ components: $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' MeasurementResponse: type: object - description: Contains your measurement request's response including probe details and test results. required: - id - type @@ -544,7 +538,7 @@ components: properties: id: type: string - description: The identifier of the measurement. + description: The measurement ID. type: $ref: 'schemas.yaml#/components/schemas/MeasurementType' target: @@ -554,33 +548,33 @@ components: createdAt: type: string format: date-time - description: The date and time at which the API created the measurement. + description: The date and time when the measurement was created. updatedAt: type: string format: date-time - description: The date and time at which the AP last updated the measurement. + description: The date and time when the measurement was last updated. probesCount: $ref: 'schemas.yaml#/components/schemas/MeasurementProbesCount' locations: allOf: - $ref: 'schemas.yaml#/components/schemas/MeasurementLocations' - - description: Contains the location data you specified when creating the measurement request. + - description: The locations you specified when creating the measurement. limit: allOf: - $ref: 'schemas.yaml#/components/schemas/MeasurementLimit' - - description: The limit you specified when creating the request, if it differs from the default value. Is not part of the response if you have specified limits per location. + - description: The limit you specified when creating the measurement if different from the default value. measurementOptions: allOf: - $ref: 'schemas.yaml#/components/schemas/MeasurementOptions' - - description: Contains the custom options you provided when creating the measurement request, if they differ from the default configuration. + - description: The options you specified when creating the measurement if different from the default. results: type: array - description: An array containing the measurement's results. + description: An array containing the measurement results. items: $ref: 'schemas.yaml#/components/schemas/MeasurementResultItem' NetworkName: type: string - description: A network name, such as "Google LLC" or "DigitalOcen, LLC". + description: A network name, such as "Google LLC" or "DigitalOcean, LLC". NullableInteger: type: - integer @@ -591,7 +585,6 @@ components: - 'null' Probe: type: object - description: Contains information about a probe. required: - version - location @@ -600,7 +593,7 @@ components: properties: version: type: string - description: The probe's version. + description: The probe version. location: $ref: 'schemas.yaml#/components/schemas/ProbeLocation' tags: @@ -609,7 +602,7 @@ components: $ref: 'schemas.yaml#/components/schemas/ProbeResolvers' ProbeLocation: type: object - description: Contains a probe's location information. + description: The probe location information. required: - continent - region @@ -640,7 +633,6 @@ components: longitude: $ref: 'schemas.yaml#/components/schemas/Longitude' ProbeResolver: - description: A resolver defined in the probe. anyOf: - type: string format: ipv4 @@ -650,18 +642,17 @@ components: description: Indicates that the resolver points to a private IP address. ProbeResolvers: type: array - description: An array of the default resolvers configured in the probe. + description: An array of the default resolvers configured on the probe. items: $ref: 'schemas.yaml#/components/schemas/ProbeResolver' Probes: type: array - description: An array containing information about each probe. items: $ref: 'schemas.yaml#/components/schemas/Probe' RegionName: type: string description: | - A geographic region name based on the UN standard ["Standard Country or Area Codes for Statistical Use (M49)"](https://unstats.un.org/unsd/methodology/m49/). + A geographic region name based on UN [Standard Country or Area Codes for Statistical Use (M49)](https://unstats.un.org/unsd/methodology/m49/). enum: - Northern Africa - Eastern Africa @@ -705,25 +696,25 @@ components: description: A two-letter [US state code](https://www.faa.gov/air_traffic/publications/atpubs/cnt_html/appendix_a.html). StatsRttMin: type: number - description: The lowest round-trip time value. + description: The lowest `rtt` value. StatsRttMinNullable: allOf: - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The lowest round-trip time value. + - description: The lowest `rtt` value. StatsRttAvg: type: number - description: The average round-trip time value. + description: The average `rtt` value. StatsRttAvgNullable: allOf: - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The average round-trip time value. + - description: The average `rtt` value. StatsRttMax: type: number - description: The highest round-trip time value. + description: The highest `rtt` value. StatsRttMaxNullable: allOf: - $ref: 'schemas.yaml#/components/schemas/NullableNumber' - - description: The highest round-trip time value. + - description: The highest `rtt` value. StatsPacketsTotal: type: integer description: The number of packets sent. @@ -747,17 +738,16 @@ components: description: The highest jitter value. StatsStDev: type: number - description: The standard deviation of the round-trip time values. + description: The standard deviation of the `rtt` values. Tags: type: array description: | An array of additional values to fine-tune probe selection: - - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code and are prefixed with their name. For example: `aws-eu-west-1` and `gcp-us-south1` - - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between probes hosted in datacenter and end-user locations. + - Probes hosted in [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) and [Google Cloud](https://cloud.google.com/compute/docs/regions-zones#available) are automatically assigned the service region code. For example: `aws-eu-west-1` and `gcp-us-south1`. + - Probes are automatically assigned `datacenter-network` and `eyeball-network` tags to distinguish between datacenter and end-user locations. items: type: string TestResult: - description: Contains a test's result data. anyOf: - $ref: 'schemas.yaml#/components/schemas/InProgressTestResult' - $ref: 'schemas.yaml#/components/schemas/FailedTestResult' @@ -781,8 +771,7 @@ components: type: object title: InProgressTestResult description: | - Contains information about a test that has the test status `in-progress`. - Note that most of the response fields are not available. + Represents an `in-progress` test where most fields are not yet available. required: - status - rawOutput @@ -795,8 +784,7 @@ components: type: object title: FailedTestResult description: | - Contains information about a test that has the status `failed`. - Note that most of the response fields are not available. + Represents a `failed` test where most fields are not available. required: - status - rawOutput @@ -809,9 +797,8 @@ components: type: object title: OfflineTestResult description: | - Contains information about a test that has the status `offline`, meaning the requested probe is not available to run the test. - Note that most of the response fields are not available. - > **Note:** This is only possible if you pass the ID of one of your existing measurements to the `locations` property of a new measurement request. + Represents an `offline` test where the requested probe was not available to run the test and most fields are not available. + Only possible when you pass the `id` of a previous measurement in the `locations` field. required: - status - rawOutput @@ -822,7 +809,7 @@ components: $ref: 'schemas.yaml#/components/schemas/TestRawOutput' FinishedPingTestResult: title: FinishedPingTestResult - description: Contains the results for a ping test. + description: Represents a `finished` ping test. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -839,8 +826,8 @@ components: stats: type: object description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the test. - All times are given in milliseconds. + Summary `rtt` and packet loss statistics. + All times are in milliseconds. required: - min - avg @@ -867,8 +854,8 @@ components: timings: type: array description: | - An array containing timing data for each packet the test sent. - All times are given in milliseconds. + An array containing details for each packet. + All times are in milliseconds. items: type: object required: @@ -881,7 +868,7 @@ components: $ref: 'schemas.yaml#/components/schemas/TimingPacketTtl' FinishedTracerouteTestResult: title: FinishedTracerouteTestResult - description: Contains the results for a traceroute test. + description: Represents a `finished` traceroute test. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -911,8 +898,8 @@ components: timings: type: array description: | - An array containing timing data for each packet the test sent. - All times are given in milliseconds. + An array containing details for each packet. + All times are in milliseconds. items: type: object required: @@ -922,7 +909,6 @@ components: $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' FinishedDnsTestResult: title: FinishedDnsTestResult - description: Contains the results for a DNS test. anyOf: - $ref: 'schemas.yaml#/components/schemas/FinishedSimpleDnsTestResult' - $ref: 'schemas.yaml#/components/schemas/FinishedTraceDnsTestResult' @@ -940,7 +926,7 @@ components: description: The HTTP response status code name. FinishedSimpleDnsTestResult: title: FinishedSimpleDnsTestResult - description: Contains the results for a DNS test with `trace` disabled. + description: Represents a `finished` DNS test with `trace` disabled. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -955,7 +941,7 @@ components: - $ref: 'schemas.yaml#/components/schemas/DnsTestHopResult' FinishedTraceDnsTestResult: title: FinishedTraceDnsTestResult - description: Contains the results for a DNS test with `trace` enabled. + description: Represents a `finished` DNS test with `trace` enabled. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -979,14 +965,14 @@ components: description: The hostname or IP of the resolver that answered the query. answers: type: array - description: An array of received resource records. + description: An array of the received resource records. items: $ref: 'schemas.yaml#/components/schemas/DnsTestAnswer' timings: type: object description: | - Contains details about the query times. - Times are given in milliseconds. + Details about the query times. + All times are in milliseconds. required: - total properties: @@ -995,7 +981,6 @@ components: description: The total query time. DnsTestAnswer: type: object - description: Contains the results from the `Answers` section of the DNS response message. required: - name - type @@ -1005,22 +990,22 @@ components: properties: name: type: string - description: The record's domain name. + description: The record domain name. type: type: string - description: The record's type. + description: The record type. ttl: type: integer - description: The record's time to live value in seconds. + description: The record time-to-live value in seconds. class: type: string - description: The record's class. + description: The record class. value: type: string - description: The record's value. + description: The record value. FinishedMtrTestResult: title: FinishedMtrTestResult - description: Contains the results for a mtr test. + description: Represents a `finished` MTR test. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -1061,8 +1046,8 @@ components: stats: type: object description: | - Contains the summarized statistics of the round-trip times (RTT) and packet losses of the hop. - All times are given in milliseconds. + Summary `rtt` and packet loss statistics. + All times are in milliseconds. required: - min - avg @@ -1101,7 +1086,7 @@ components: timings: type: array description: | - An array containing timing data for each packet the test sent. + An array containing details for each packet. All times are in milliseconds. items: type: object @@ -1112,7 +1097,7 @@ components: $ref: 'schemas.yaml#/components/schemas/TimingPacketRtt' FinishedHttpTestResult: title: FinishedHttpTestResult - description: Contains the results for a HTTP test. + description: Represents a `finished` HTTP test. allOf: - $ref: 'schemas.yaml#/components/schemas/BaseFinishedTestResult' - type: object @@ -1134,14 +1119,14 @@ components: type: string description: | The raw HTTP response body. - Note that the API only returns the first 10kb. + Note that only the first 10 kb are returned. truncated: type: boolean description: | Indicates whether the `rawBody` value was truncated due to being too big. headers: type: object - description: Contains the HTTP response headers. + description: The HTTP response headers. additionalProperties: type: string statusCode: @@ -1153,8 +1138,8 @@ components: timings: type: object description: | - Contains details about the HTTP request times. - Times are given in milliseconds. + Details about the HTTP request times. + All times are in milliseconds. required: - total - dns @@ -1176,18 +1161,18 @@ components: download: $ref: 'schemas.yaml#/components/schemas/TimingHttpDownloadNullable' tls: - description: Contains information about the TLS certificate. Is `null` if no TLS certificate is available. + description: Information about the TLS certificate or `null` if no TLS certificate is available. oneOf: - $ref: 'schemas.yaml#/components/schemas/TlsCertificate' - type: 'null' TestRawOutput: type: string description: | - The raw output of a measurement's test result. For example, you can use the output to display it to users. - However, don't parse the content of this property and instead use the individual values provided in other properties of the measurement's test result. + The raw output of the test. Can be presented to users but is not meant to be parsed by clients. + Please use the individual values provided in other fields for automated processing. BaseTestStatus: type: string - description: The measurement request's current status. Any value other than `in-progress` is final, meaning the measurement request is no longer running. + description: The current test status. Any value other than `in-progress` is final. InProgressTestStatus: allOf: - $ref: 'schemas.yaml#/components/schemas/BaseTestStatus' @@ -1236,7 +1221,7 @@ components: - description: The time from the first response byte to downloading the entire response. TlsCertificate: type: object - description: Contains information about a TLS certificate. + title: TlsCertificate required: - authorized - createdAt @@ -1251,7 +1236,7 @@ components: error: type: string description: | - The reason why the certificate was rejected if `authorized` is `false`. + The reason for rejecting the certificate if `authorized` is `false`. createdAt: type: string description: The creation date and time of the certificate. @@ -1266,7 +1251,7 @@ components: $ref: 'schemas.yaml#/components/schemas/TlsCertificateIssuer' TlsCertificateIssuer: type: object - description: Contains information about the TLS certificate's issuer. + description: Information about the certificate issuer. required: - C - O @@ -1283,7 +1268,7 @@ components: description: The issuer's common name. TlsCertificateSubject: type: object - description: Contains information about the TLS certificate's subject. + description: Information about the certificate subject. required: - CN - alt @@ -1293,4 +1278,4 @@ components: description: The subject's common name. alt: type: string - description: The subject's alternate names. + description: The subject's alternative names. diff --git a/public/v1/spec.yaml b/public/v1/spec.yaml index a72bf716..972f90a5 100644 --- a/public/v1/spec.yaml +++ b/public/v1/spec.yaml @@ -2,27 +2,29 @@ openapi: 3.1.0 info: title: Globalping API summary: The public Globalping API. + # TODO: update in https://github.com/jsdelivr/globalping/issues/475: However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. description: | The Globalping API allows you to monitor, debug, and benchmark your internet infrastructure using a globally distributed network of probes. The API is public, free to use, and doesn't require authentication. - However, it implements rate limits to ensure fair usage and reliability – see the "Limits" section in our [GitHub Readme](https://github.com/jsdelivr/globalping) to learn more about limits and how to increase them. - Additionally, the API is RESTful, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes to indicate the success and failure of requests. + + Root endpoint: https://api.globalping.io + ## Client guidelines - If you're implementing an application that interacts with the API, please refer to the "Client guidelines" section in the description of each endpoint. - This way, you can provide the best UX and reduce the likelihood of your app breaking in the future. + If you're implementing an application that interacts with the API, please refer to the "Client guidelines" + section in the description of each endpoint. This way, you can provide the best UX and reduce the likelihood + of your app breaking in the future. ### General guidelines for non-browser-based apps: - - Set a `User-Agent` header. We recommend that you follow the format and approach [described here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). - - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. Compression has a significant impact on the response size! + - Set a `User-Agent` header. We recommend that you follow the format and approach [used here](https://github.com/jsdelivr/data.jsdelivr.com/blob/60c5154d26c403ba9dd403a8ddc5e42a31931f0d/config/default.js#L9). + - Set an `Accept-Encoding` header with a value of either `br` (preferred) or `gzip`, depending on what your client can support. Compression has a significant impact on the response size. - Implement ETag-based client-side caching using the `ETag`/`If-None-Match` headers when requesting the measurement status. version: 1.0.0 termsOfService: https://github.com/jsdelivr/globalping contact: - name: Support url: https://github.com/jsdelivr/globalping/issues email: d@jsdelivr.com license: @@ -32,26 +34,24 @@ servers: - url: https://api.globalping.io tags: - name: Measurements - description: Provides measurement-related operations. - name: Probes - description: Provides probe-related operations. paths: /v1/measurements: post: - summary: Create a measurement. + summary: Create a measurement operationId: createMeasurement description: | - Create a new measurement by configuring its attributes via the request body. On success, the endpoint returns the ID of the created measurement. - - > **Note**: The measurement runs asynchronously and you can call up the current state under the URL returned in the `Location` header, for example. + Creates a new measurement with parameters set in the request body. + The measurement runs asynchronously and you can retrieve its current state at the URL returned in the `Location` header. ### Client guidelines - - Set the `inProgressUpdates` option to `true` to have the API return partial results as soon as they are available. - This feature is useful for apps running in an interactive mode where you want users to see the updates and results in real time. - - If you're building an app or feature for CI purposes where you want to use the finished measurement results in scripts, make sure that you either do not provide the property `inProgressUpdates` (default value is false) or explicitly set it to `false`. - - To perform multiple measurements using identical probes, create and get a single measurement first and then pass its `id` to the `locations` property of your next measurement request. + + - If the application is running in interactive mode, set the `inProgressUpdates` option to `true` to have the API + return partial results as soon as they are available. This allows the user to see the measurement progress in real time. + - If the application is interactive by default but also implements a "CI" mode for scripting, do not set the flag in the CI mode. + - To perform multiple measurements using exactly the same probes, create a single measurement first, then pass its `id` in the `locations` field for the other measurements. requestBody: - description: Use the `MeasurementRequest` schema to create a new measurement that meets your requirements. + description: Use the request body to set the measurement parameters. content: application/json: schema: @@ -85,18 +85,20 @@ paths: parameters: - $ref: 'components/parameters.yaml#/components/parameters/measurementId' get: - summary: Get a measurement by ID. + summary: Get a measurement by ID operationId: getMeasurement description: | - Get an existing measurement's current status and result by providing its ID. Measurements are typically available for up to 7 days after creation. + Returns the status and results of an existing measurement. + Measurements are typically available for up to 7 days after creation. - > **Tip**: The 'Create a measurement' endpoint returns a URL to this endpoint in the `Location` header! + > **Tip**: A link to this endpoint is returned in the `Location` response header when creating the measurement. ### Client guidelines - As it can take a few seconds for a measurement to complete and provide results, you can query the status to determine whether the final results are available. Use the following process: - 1. Request the measurement to retrieve its `status`. - 2. If the `status` is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms _after_ receiving the response rather than using an interval of "every 500ms". This is because, for large measurements, the request can take a few hundred milliseconds to complete, meaning that you won't get any meaningful updates in a shorter query time frame. - 3. If the `status` has a value **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. + + As it can take a few seconds for a measurement to complete, you should use the following process for retrieving the results: + 1. Request the measurement to retrieve its status. + 2. If the status is `in-progress`, wait 500 milliseconds and start again at step 1. Note that it's important to wait 500 ms *after* receiving the response rather than using an "every 500ms" interval as for large measurements, the request itself may take a few hundred milliseconds to complete. + 3. If the status is anything **other** than `in-progress`, stop. The measurement is no longer running, and its results are final. responses: '200': $ref: 'components/responses.yaml#/components/responses/measurement200' @@ -106,12 +108,13 @@ paths: - Measurements /v1/probes: get: - summary: List all probes currently online. + summary: List probes currently online operationId: listProbes description: | - Get a list of all probes currently online and their metadata, such as location and assigned tags. + Returns a list of all probes currently online and their metadata, such as location and assigned tags. - > **Note**: Probes don't expose unique IDs that you can use to explicitly select them. Instead, enter location data or the ID of an existing measurement when you create a new measurement to refine the probe selection. + > **Note**: Probes don't expose unique IDs that would allow you to explicitly select them. + Instead, specify the requested location or an ID of an existing measurement when creating new measurements. responses: '200': $ref: 'components/responses.yaml#/components/responses/probes200' From f06011b15aa0dc3ae9398be760b2c38453feb820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Fri, 9 Feb 2024 22:50:43 +0100 Subject: [PATCH 7/7] Update examples.yaml --- public/v1/components/examples.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/v1/components/examples.yaml b/public/v1/components/examples.yaml index 7903d738..db238b25 100644 --- a/public/v1/components/examples.yaml +++ b/public/v1/components/examples.yaml @@ -80,7 +80,7 @@ components: } createMeasurementPingCustom: summary: 'ping: custom options' - description: Depending on the measurement `type`, you may pass additional measurement options. In this example, we set the number of packets to send for our ping test. You can find all available options in the request body schema. + description: Depending on the measurement `type`, you may provide additional measurement options. In this example, we set the number of packets to send for our ping test. You can find all available options in the request body schema. value: { "type": "ping", @@ -91,7 +91,7 @@ components: } createMeasurementPingLocationsMeasurementId: summary: 'ping: previous measurement id' - description: If you want to reuse probes from a previous measurement, pass its `id` in the `locations` field. Note that some probes may be offline and no longer unavailable - this is indicated in the results. + description: If you want to reuse probes from a previous measurement, pass its `id` in the `locations` field. Note that some probes may be offline and no longer unavailable - this will be indicated in the results. value: { "type": "ping",